Programação de Sistemas

Documentos relacionados
Programando com Threads em C

OO Engenharia Eletrônica

Programando com Threads em C

Computação 2. Aula Profª. Fabiany Listas Duplamente Encadeadas

Eventos. Rotinas Assíncronas

Algoritmos e Estruturas de dados

Pthreads API. Criação de Threads: usando Pthreads

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

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.

Linguagem de Programação I

Sistemas Operacionais

Curso de Programação C em Ambientes Linux Aula 05

Listas ligadas/listas encadeadas

Trabalhando com Processos e Threads em Ambiente LINUX

Programação Sistemas

Programação de Sistemas

SISTEMAS OPERACIONAIS. 2ª. Lista de Exercícios

Deadlock, Starvation, Posix Semaphores

Sincronização, Deadlock, Starvation Mutex Locks e Semaphores (Posix)

Programação com Posix Threads

Exclusão Mútua (mutex)

SISTEMAS OPERACIONAIS. 2ª. Lista de Exercícios

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

A regra de acesso aos dados de uma fila é a seguinte: O primeiro elemento que entra (na fila) é o primeiro que sai (FIFO first in, first out).

1 Exercícios com ponteiros

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

Computação I - C Prova /10/ Profs. Adriano Cruz e Valeria Bastos

Memória compartilhada

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Introdução à Ciência da Computação I. Alocação Dinâmica. Prof. Claudio Fabiano Motta Toledo

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Sistemas Operativos: Concorrência (Parte 2)

Introdução aos Sistemas Operacionais. Threads

Sincronização e Comunicação entre Processos. Sincronização e Comunicação Volnys Bernal 1. Agenda

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

Aula 17: Ponteiros e Alocação Dinâmica em C

Grupo I [7 Val] 1. Considere os seguintes 3 algoritmos de escalonamento num sistema operativo de tempo virtual:

Programação Estruturada I

TAD: Tipo Abstrato de Dados (parte 2)

Transcrição:

Programação de Sistemas Pai Natal Programação de Sistemas Pai Natal : 1/16 Problema (1) Considere o Pai Natal ( Santa Claus ) se encontra a dormir na sua loja em Rovaniemi-Lapónia finlandesa, sendo acordado apenas se 1. uma rena ( reindeer ), em número indicado na linha de comandos, regressa das suas férias nas Caraíbas, ou 2. um duende ( elf em número definido por uma constante) detecta problemas no fabrico de brinquedos. As renas partem para férias indicando no terminal o seu número de lançamento. Em média, as férias duram entre 16 e 24 segundos. A cada duende ocorre um erro no fabrico de brinquedos em intervalos entre 4 a 6 segundos. Programação de Sistemas Pai Natal : 2/16

Problema (2) O Pai Natal resolve todos os problemas de fabrico em 1 segundo e depois volta a dormir. Sempre que o Pai Natal é acordado por uma rena que não seja a última, deixa alimento e volta a dormir. Chegada a última rena, o Pai Natal parte de trenó para distribuir as prendas, durando 10 segundos a volta ao mundo. As renas só devem terminar depois de distribuídos os brinquedos. Os duendes terminam depois do Pai Natal iniciar a distribuição de brinquedos. Codifique em C para Linux um simulador que inclua funções para os fios de execução Elf, Reindeer e SantaClaus. Nota: para obter um número aleatório, use a função int rand(). Programação de Sistemas Pai Natal : 3/16 Arquitectura (1) Tarefas Tal como indicado no enunciado, as tarefas são implementadas por fios de execução ( threads ) lançados pelo programa principal. Pai Natal (1), Duendes (em número definido por uma constante), Renas (em número indicado na linha de comandos). Apenas as renas possuem um parâmetro o número de lançamento, entre 0 e reinnumb-1. typedef struct{ int pos; arguments; Programação de Sistemas Pai Natal : 4/16

Arquitectura (2) Variáveis Globais, de interesse a vários fios de execução: unsigned int waiting; número de renas à espera na porta variam entre 0 e total de renas determinam quando o Pai Natal parte para distribuir os presentes. unsigned int leaving; 0 ou 1, identifica se o Pai Natal se encontra dentro (0) ou a distribuir presentes (1). De sincronização: pthread_mutex_t chave; mutex de protecção de acesso à variável waiting. sem_t barn; semáforo, inicializado a 0, Programação de Sistemas Pai Natal : 5/16 Arquitectura (3) Os identificadores dos fios de execução, necessários ao seu lançamento, dependem do número de threads pthread_t santaid; só há um Pai Natal. pthread_t elfid[elf_n]; o número de duendes é determinada por uma constante. pthread_t *reinid; o número de duendes, desconhecido ao compilador, é indicado na linha de comandos (logo, os identificadores têm de ser criados dinamicamente). Programação de Sistemas Pai Natal : 6/16

Arquitectura (4) Comunicação Os fios de execução comunicam entre si através de sinais. Chegada de rena: SIGUSR1 dirigido ao Pai Natal. Duende com problema: SIGUSR2 dirigido ao Pai Natal. Ambos os sinais são tratados ( handled ) pela função void wakeup( int signumb ) Pai Natal termina distribuição dos brinquedos: SIGUSR2 dirigido a cada uma das renas. Sinal tratado ( handled ) pela função void bye( int signumb ) Programação de Sistemas Pai Natal : 7/16 Arquitectura (5) Terminação Os fios de execução terminam na seguinte forma: Duendes, executa pthread_exit() quando verifica que o Pai Natal partiu para distribuir os presentes. Nenhum fio de execução fica à espera, logo deve ser executado o pthread_detach(). Renas, depois de chegar, fazem pause() à espera do sinal enviado pelo Pai Natal e depois executam o pthread_exit(). O Pai Natal fica à espera que as renas terminem. O Pai Natal termina com pthread_exit() e o programa principal fica à espera que o Pai Natal termine. Programação de Sistemas Pai Natal : 8/16

Programa principal (1) #include <stdlib.h> /* malloc */ #include <stdio.h> /* printf */ #include <signal.h> /* sinais */ #include <semaphore.h> /* semáforos */ #include <pthread.h> /* threads e mutexes */ #define ELF_N 2 /* numero de duendes */ typedef struct{ unsigned int pos; arguments; pthread_t santaid; /* identificador do Pai Natal */ pthread_t elfid[elf_n]; /* identificador dos duendes */ pthread_t *reinid; /* identificador das renas */ pthread_mutex_t chave; /* protege acesso a waiting */ sem_t barn; /* espera das renas */ unsigned int waiting, leaving; int reinnumb; /* numero de renas */ Programação de Sistemas Pai Natal : 9/16 Programa principal (2) main(int argc, char *argv[]) { int i; if( argc!=2 ) { printf( "%s elfnumber\n",argv[0] ); exit( 3 ); reinnumb = atoi( argv[1] ); reinid = (pthread_t *)malloc( reinnumb*sizeof(pthread_t) ); srand(time(null)); waiting = 0; /* numero de renas à espera */ leaving = 0; /* estado do Pai Natal */ /* inicializa tranca e semáforo */ pthread_mutex_init( &chave,null ); sem_init( &barn,0,0 ); Programação de Sistemas Pai Natal : 10/16

Programa principal (3) /* Lança Pai Natal */ printf( "Lancado Pai Natal\n" ); if( pthread_create( &santaid,null,santaclaus,null ) ) { printf( "Erro no lancamento do Pai Natal\n" ); exit( 2 ); /* Lança duendes */ for( i=0;i<elf_n;i++ ) { printf( "Duende %i comeca a produzir brinquedos\n",i ); if( pthread_create( &(elfid[i]),null,elf,null ) ) { printf( "Erro no lancamento do duende %d\n",i ); exit( 2 ); pthread_detach( elfid[i] ); Programação de Sistemas Pai Natal : 11/16 Programa principal (4) /* Lança renas */ for( i=0;i<reinnumb;i++ ) { int *pos = (int *)malloc( sizeof(int) ); *pos = i; printf( "Rena %i parte de ferias para as Caraibas\n",i ); if( pthread_create( &(reinid[i]),null,reindeer,(void *)pos ) ) { printf( "Erro no lancamento da rena %d\n",i ); exit( 2 ); /* Elimina tranca e semáforo */ if(!pthread_mutex_destroy( &chave ) ) { printf( "Erro na eliminacao da tranca chave\n" ); exit(4); if ( sem_destroy( &barn )==-1 ) { printf( "Erro na eliminacao do semaforo barn\n" ); exit(4); pthread_join( santaid,null ); Programação de Sistemas Pai Natal : 12/16

Tratamento interrupções void bye( int signumb ) { return; void wakeup( int signumb ) { int i,numb; if( signumb==sigusr1 ) { /* Chamada veio do duende */ printf( "\n" ); sleep( 1 ); if( signumb==sigusr2 ) { /* Chamada veio de uma rena */ pthread_mutex_lock( &chave ); numb = waiting; pthread_mutex_unlock( &chave ); if( numb<reinnumb ) { printf("\n");fflush(null); else { /* Vamos distribuir os presentes! */ leaving = 1; printf( "Ho! Ho! Ho!\n" ); sleep( 10 ); for( i=0;i<reinnumb;i++ ) { pthread_kill( reinid[i],sigusr2 ); pthread_join( reinid[i],null ); printf("uff, este ano tive imenso trabalho a distribuir os brinquedos!\n"); pthread_exit( NULL ); Programação de Sistemas Pai Natal : 13/16 Threads (1) void *santaclaus( void *arg ) { signal( SIGUSR1,wakeUp ); signal( SIGUSR2,wakeUp ); for( ;; ) pause(); void *elf( void *arg ) { for( ;; ) { sleep( 4+rand()%3 ); if ( leaving ) pthread_exit( NULL ); else pthread_kill( santaid,sigusr1 ); Programação de Sistemas Pai Natal : 14/16

Threads (2) void *reindeer( void *arg ) { int i; arguments *argument = (arguments*)arg; sleep(16+ rand()%9); /* tempo de férias nas Caraibas;-) */ printf( "Rena %d chega de ferias e ",*(int *)arg ); pthread_mutex_lock( &chave ); pthread_kill( santaid,sigusr2 ); if ( waiting==(reinnumb-1) ) { printf( "chama as outras renas\n" ); fflush( NULL ); for( i=0;i<reinnumb;i++ ) sem_post( &barn ); waiting++; pthread_mutex_unlock( &chave ); else { printf( "espera fora da porta\n" ); fflush( NULL ); waiting++; pthread_mutex_unlock( &chave ); sem_wait( &barn ); signal( SIGUSR2,bye ); pause(); pthread_exit( NULL ); Programação de Sistemas Pai Natal : 15/16 Exemplo de execução [rgc@asterix PaiNatal]$ Xmas 7 Lancado Pai Natal Duende 0 comeca a produzir brinquedos Duende 1 comeca a produzir brinquedos Rena 0 parte de ferias para as Caraibas Rena 1 parte de ferias para as Caraibas Rena 2 parte de ferias para as Caraibas Rena 3 parte de ferias para as Caraibas Rena 4 parte de ferias para as Caraibas Rena 5 parte de ferias para as Caraibas Rena 6 parte de ferias para as Caraibas Rena 2 chega de ferias e espera fora da porta Rena 5 chega de ferias e espera fora da porta Rena 1 chega de ferias e espera fora da porta Rena 3 chega de ferias e espera fora da porta Rena 0 chega de ferias e espera fora da porta Rena 4 chega de ferias e espera fora da porta Rena 6 chega de ferias e chama as outras renas Ho! Ho! Ho! Uff, este ano tive imenso trabalho a distribuir os brinquedos! [rgc@asterix PaiNatal]$ Programação de Sistemas Pai Natal : 16/16