Eventos. Rotinas Assíncronas

Documentos relacionados
Sistemas Operacionais Aula 4

Processos, tarefas e núcleo

Comunicação entre Processos 9/21/17 1

Linguagem de Programação I

Programação de Sistemas

Trabalhando com Processos e Threads em Ambiente LINUX

Threads em Ambiente LINUX. Estudo e testes com a biblioteca pthreads

5. Comunicação entre processos - Sinais

Função Fundamental do SO

Arquitetura de Sistemas Operativos

Processos. Processo (1) Processo (2) Processo (3) Conceitos Básicos

Processos. Conceitos Básicos

Processos. Programas e Processos. Aula 1 - Chamadas ao sistema. José Pedro Oliveira fork exit getpid, getppid wait, waitpid

Pthreads. O que são threads? Mario João Junior. Uma thread é um fluxo de execução de instruções que pode ser escalonado pelo sistema operacional.

Sistemas Operativos: Processos

Processos O conceito de processos é fundamental para a implementação de um sistema multiprogramável. De uma maneira geral, um processo pode ser entend

Processos. Sistemas Operativos 2015 / Multiprogramação. Execução, em paralelo, de múltiplos programas na mesma máquina

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Programação Concorrente. Prof. Hugo Vieira Neto

Espaço de Endereçamento

Processos. Volnys Borges Bernal. Edson Toshimi Midorikawa

Programação: Vetores

Gestão de Memória. Espaço de Endereçamento

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Sistemas Operacionais Prof. Fabrício Sérgio de Paula

Gestão de Memória. Espaço de Endereçamento

Sistemas de Informação. Sistemas Operacionais

SISTEMAS EMBARCADOS. Programação Concorrente e CMSIS RTOS. Prof. André Schneider de Oliveira

LEIC/LERC 2008/09. Repescagem do Primeiro Teste de Sistemas Operativos

LABORATÓRIO SISTEMAS OPERACIONAIS

Algoritmos e Estruturas de dados

Redes de Computadores. INF201 - Fundamentos de Sistemas Operacionais - 2º Período

MÓDULO 02 PROCESSOS E THREADS PROCESSOS e THREADS

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

Programação em C Aplicações de Microprocessadores 2006/2007

Sistemas Distribuídos Aula 3

Computadores e Programação (DCC/UFRJ)

Ponteiros e Tabelas. K&R: Capítulo 5

Capítulo 2. Multiprogramação. Conteúdo. Objetivo. Recordando. Recordando. DCA-108 Sistemas Operacionais

Programação. MEAer e LEE. Manipulação de ficheiros de texto. Bertinho Andrade da Costa. Instituto Superior Técnico. 2010/2011 1º Semestre

C Comandos de Controle

Programação concorrente usando threads POSIX e Java

Noções de Processos. Plano da aula. Serviços oferecidos. Definição & Objetivos. Definição & Objetivos. Sistemas Operacionais : introdução

Transcrição:

Eventos Rotinas Assíncronas para Tratamento de acontecimentos assíncronos e excepções Rotinas Assíncronas Certos acontecimentos devem ser tratados pelas aplicações, embora não seja possível prever a sua ocorrência Ex: Ctrl-C Ex: Acção desencadeada por um timeout Como tratá-los na programação sequencial? Page 1 1

Modelo de Eventos Programa Principal Rotina Assíncrona Evento Execução da Rotina Assíncrona return Semelhante a outro conceito... Rotinas Assíncronas RotinaAssincrona (Evento,Procedimento) Tem de existir uma tabela com os eventos que o sistema pode tratar Identificação do procedimento a executar assincronamente quando se manifesta o evento. Page 2 2

Signals Acontecimentos Assíncronos em Unix Signal SIGALRM SIGFPE SIGINT SIGQUIT SIGKILL SIGPIPE SIGSEGV SIGTERM Causa O relógio expirou Divisão por zero Excepção O utilizador carregou na tecla para interromper o processo (normalmente o CNTL-C O utilizador quer terminar o processo e provocar um core dump Signal para terminar o processo. Não pode ser tratado O processo escreveu para um pipe que não tem receptores Acesso a uma posição de memória inválida O utilizador pretende terminar ordeiramente o processo Interacção com o terminal SIGUSR1 SIGUSR1 Definido pelo utilizador Definido pelo utilizador Desencadeado por interrupção HW Definidos em signal.h Ver man signal Explicitamente desencadeado por outro processo Tratamento por omissão Cada signal tem um tratamento por omissão: Terminar o processo Terminar o processo e criar ficheiro core Ignorar signal Suspender o processo Continuar o processo suspenso Page 3 3

Redefinir o tratamento de um Signal Função signal permite mudar o tratamento de um signal: Mudar para outro tratamento pré-definido (slide anterior) Associar uma rotina do programa para tratar o signal Alguns signals como o SIGKILL não podem ser ignorados. Porquê? Chamada Sistema Signal void (*signal (int sig, void (*func)(int))) (int); A função retorna um ponteiro para função anteriormente associada ao signal Identificador do signal para o qual se pretende definir um handler Ponteiro para a função ou macro especificando: SIG_DFL acção por omissão SIG_IGN ignorar o signal Parâmetro para a função de tratamento Page 4 4

Exemplo do tratamento de um Signal #include <stdio.h> #include <signal.h> #include <stdlib.h> void apanhactrlc (int s) { char ch; printf ("Quer de facto terminar a execucao?\n"); ch = getchar(); if (ch == 's') exit(0); else { printf ("Entao vamos continuar\n"); signal (SIGINT, apanhactrlc); int main () { signal (SIGINT, apanhactrlc); printf("associou uma rotina ao signal SIGINT\n"); for (;;) sleep (10); Chamada Sistema Kill Envia um signal ao processo Nome enganador. Porquê? kill (pid, sig); Identificador do processo Se o pid for zero é enviado a todos os processos do grupo Está restrito ao superuser o envio de signals para processos de outro user Identificador do signal Page 5 5

Outras funções associadas aos signals unsigned alarm (unsigned int segundos); o signal SIGALRM é enviado para o processo depois de decorrerem o número de segundos especificados. Se o argumento for zero, o envio é cancelado. pause(); aguarda a chegada de um signal unsigned sleep (unsigned int segundos); A função faz um alarm e bloqueia-se à espera do signal Versões Iniciais - Unix V e Unix BSD System V: A associação de uma rotina a um signal é apenas efectiva para uma activação Depois de receber o signal, o tratamento passa a ser novamente o por omissão (necessário associar de novo) Entre o lançamento de rotina de tratamento e a nova associação tratamento por omissão Solução: restabelecer a associação na primeira linha da rotina de tratamento Pode gerar problemas se houver recepção sucessiva de signals BSD: a recepção de um novo signal é inibida durante a execução da rotina de tratamento Page 6 6

TAREFAS (THREADS) Múltiplos fluxos de execução no mesmo processo Tarefas Mecanismo simples para criar fluxos de execução independentes, partilhando um contexto comum Contexto de um processo Programas e Variáveis Globais Comuns outro processo Fluxos de Actividade Independentes Page 7 7

Razões para optar por programas multi-tarefa Alguns programas são inerentemente compostos por tarefas concorrentes Exemplos? Permite otimizar programas que interagem com periféricos lentos Enquanto periférico demora a responder, processo pode continuar a fazer progresso noutras tarefas Ou seja, programar com múltiplas tarefas faz sentido mesmo em máquinas single-cpu Permite explorar processadores múltiplos Incluindo os dual-cores, quad-cores, etc Tarefas vs. Processos Porque não usar múltiplos processos? Processos obrigam ao isolamento (espaços de endereçamentos disjuntos) dificuldade em partilhar dados mas não impossível exemplos? Eficiência na criação e comutação Page 8 8

O que é partilhado entre tarefas do mesmo processo Programa Amontoado (heap) Variáveis globais Variáveis dinamicamente alocadas Atributos do processo Pid Ficheiros abertos UID, GID Etc. O que não é partilhado entre tarefas do mesmo processo Pilha (stack) Mas atenção: não há isolamento entre pilhas! Bugs podem fazer com que uma tarefa aceda à pilha de outra tarefa Estado dos registos do processador Incluindo instruction pointer Atributos específicos da tarefa Thread id (tid) Prioridade da tarefa Etc. Page 9 9

Modelos Multitarefa no Modelo Computacional Operações sobre as Tarefas IdTarefa = CriarTarefa(procedimento); EliminarTarefa (IdTarefa); EsperaTarefa (IdTarefa) A tarefa começa a executar o procedimento dado como parâmetro e que faz parte do programa previamente carregado em memória Bloqueia a tarefa à espera da terminação de outra tarefa ou da tarefa referenciada no parâmetro Idtarefa Regra de ouro O núcleo oferece a ilusão de uma máquina com número infinito de processadores, sendo que cada tarefa corre no seu processador No entanto, as velocidades de cada processador virtual podem ser diferentes e não podem ser previstas Porquê? Consequências para o programador? Page 10 10

Interface POSIX err = pthread_create (&tid, attr, function, arg) Apontador para o identificador da tarefa Utilizado para definir atributos da tarefa como a prioridade Função a executar Parâmetros para a função pthread_exit(void *value_ptr) int pthread_join(pthread_t thread, void **value_ptr) suspende a tarefa invocadora até pthread_t thread terminar; continua a execução caso pthread_t thread já tenha terminado Exemplo (sequencial) #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h> #define N 5 #define TAMANHO 10 int buffer [N] [TAMANHO]; int nsomas; void *soma_linha (int *linha) { int c, soma=0; int *b = linha; for (c = 0; c < TAMANHO 1; c++) { soma += b[c]; nsomas++; int main (void) { int i,j; inicializamatriz(buffer(n, TAMANHO); for (i=0; i< N; i++) soma_linha(buffer[i]); imprimeresultados(buffer); exit(0); b[c]=soma; /* soma->ult.col.*/ return NULL; Page 11 11

Exemplo (paralelo) #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h> #define N 5 #define TAMANHO 10 int buffer [N] [TAMANHO]; int nsomas; void *soma_linha (int *linha) { int c, soma=0; int *b = linha; for (c = 0; c < TAMANHO 1; c++) { soma += b[c]; nsomas++; b[c]=soma; /* soma->ult.col.*/ return NULL; Exemplo (paralelo) #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h> #define N 5 #define TAMANHO 10 int buffer [N] [TAMANHO]; int nsomas; void *soma_linha (int *linha) { int c, soma=0; int *b = linha; for (c = 0; c < TAMANHO 1; c++) { soma += b[c]; nsomas++; b[c]=soma; /* soma->ult.col.*/ return NULL; int main (void) { int i,j; pthread_t tid[n]; inicializamatriz(buffer(n, TAMANHO); for (i=0; i< N; i++){ if(pthread_create (&tid[i], 0,soma_linha, (void *) buffer[i])== 0) { printf ("Criada a tarefa %d\n", tid[i]); else { printf("erro na criação da tarefa\n"); exit(1); for (i=0; i<n; i++){ pthread_join (tid[i], NULL); printf ("Terminaram todas as threads\n"); imprimeresultados(buffer); exit(0); Page 12 12

Alternativas de Implementação Tarefas-núcleo Tarefas-utilizador (pseudotarefas) Pseudotarefas (Tarefas-Utilizador) As tarefas implementadas numa biblioteca de funções no espaço de endereçamento do utilizador Ideia proveniente das linguagens de programação Processo guarda lista de tarefas, respectivo contexto Núcleo apenas vê um processo Consequências? Page 13 13

Tarefas-Núcleo (ou Tarefas Reais) Implementadas no núcleo do SO Mais comuns Lista de tarefas e respectivo contexto são mantidos pelo núcleo Comparação Tarefas Utilizador e Núcleo Capacidade de utilização em diferentes SOs? Velocidade de criação e comutação? (vs. processos?) Tirar partido de execução paralela em multiprocessadores? Aproveitamento do CPU quando uma tarefa bloqueia (ex: ler do disco)? Hoje em dia, grande maioria dos programas usa tarefas núcleo Page 14 14