Sistemas Operacionais
Links Úteis
Classroom link: https://classroom.google.com/c/NDc1OTk4Mjc0MjMx?cjc=sfpovdc
Github: https://github.com/dalcimar/SO25CP---Sistemas-Operacionais
Youtube: https://www.youtube.com/playlist?list=PL9At2PVRU0ZpcExBQ7YAM1JXW-hLUSm7r
Material didático: http://wiki.inf.ufpr.br/maziero/doku.php?id=socm:start
Conteúdo
Aula 1 - Introdução - Conceitos básicos
Aula 2 - Introdução - Estrutura de um SO
Aula 3 - Introdução - Estrutura de um SO
Aula 4 - Gestão de tarefas - O conceito de tarefa
Aula 5 - Gestão de tarefas - Implementação de tarefas (processos)
Aula 6 - Gestão de tarefas - Implementação de tarefas (processos)
Aula 7 - Gestão de tarefas - Implementação de tarefas (threads)
Aula 8 - Gestão de tarefas - escalonamento de tarefas
Trabalho Extra 1 - Jantar de Gauleses - MPI
Implemente o problema do Jantar de Gauleses usando MPI
Utilize o material de MPI disponível no github
Deve, obrigatóriamente ter um executável, código fonte separado para o produtor e outro para o consumidor
Os programas podem ser lançados em background (&) ou u lizando fork/exec
Trabalho Extra 2 - Jantar de Gauleses - Sockets
Implemente o problema do Jantar de Gauleses usando Sockets
Utilize o material de Sockets disponível no github
Deve, obrigatóriamente ter um executável, código fonte separado para o produtor e outro para o consumidor
Os programas podem ser lançados em background (&) ou u lizando fork/exec
Trabalho Extra 3 - Jantar de Gauleses - OpenMP
Implemente o problema do Jantar de Gauleses usando OpenMP
Utilize o material de OpenMP disponível no github
Trabalho 1: Sinais - entrega 05/09
Escreva um programa que realiza tratamento de sinais POSIX. O programa deve:
1 - Capturar os sinais SIGINT, SIGTSTP e SIGPIPE mudando suas operações para
O sinal SIGING deve ser ignorado
Contar quantas vezes o sinal SIGTSTP é gerado pelo usuário
O SIGPIPE deve zera o contador do SIGTSTP
2 - Utilize um for(EVER) para manter o processo vivo enquanto gera sinais
3 - Gerar os seguintes sinais de teste
CTRL+C, no terminal (número indefinido)
SIGPIPE pelo comando kill no terminal
SIGTSTP a cada 10 segundo
4 - Se o contador de SIGTSTP chegar a 12, o processo deve gerar um sinal a ele mesmo cuja ação default seja seu término
Trabalho 2: Fork/wait - entrega 19/09
Faça um programa em que três processos executam paralelamente as seguintes ações:
Pai - Imprime os números de 1 a 50, com um intervalo de 2 segundos entre cada número.
Após imprimir todos os números, imprime a frase “Processo pai vai morrer”.
Filho1 - Imprime os números de 100 a 200, com um intervalo de 1 segundo entre cada número.
Antes de imprimir os números, imprime a frase “Filho 1 foi criado”.
Após imprimir todos os números, imprime a frase “Filho 1 vai morrer”.
Filho 2 - Inicia apeas após o pai morrer, imprime os números de 51 a 99
• Importante, em cada printf os processos devem imprimir o seu pid e o pid do seu pai.
Trabalho 3: Fork/wait/exec - entrega 19/09
Faça um programa em 2 processos são iniciados utilizando fork cada um com as seguintes ações:
Os filho 1 irá executar cálculo 2*3, e retornar ao pai, via exit() o resultado da equação (utilize exec() para fazer isso)
O filho 2 irá entrar em looping infinito
O pai, após receber o resultado do filho 1, irá terminar o looping infinito do filho 2. Para isso o pai deve enviar um sinal ao filho 2, esse deve capturar e mudar o valor de iteração do while() ou for())
Agora com o filho 2 acordado, o pai deve imprimir o resultado
Filho 2 deve virar zoobies
Trabalho 4: Threads - entrega 26/09
Faca um programa que imprima os nros primos existentes entre 0 e 99999.
O programa deve dividir o espaço de cálculo uniformemente entre as N threads da forma que vc achar mais efetivo do ponto de vista computacional.
e.x. 1bilhão de termos com 2 threads = 500milhões de termos em cada thread;
cada thread efetua uma soma parcial de forma autônoma;
para evitar o uso de mecanismos de sincronização, cada thread T[i] deve depositar seu resultado parcial na posição result[i] de um vetor de resultados parciais.
após o término das threads de cálculo, o programa principal soma os números primos encontrados
execute as soluções com N = {1, 2, 4, 8 e 16} threads
Marque o tempo necessário para calcular Pi para cada N e faça um gráfico de linhas (NxTempo) apresentado os resultados.
Os 2 que conseguirem o melhor resultado de tempo ganharão 1 ponto extra na prova 1
Trabalho 5: Jantar de Gauleses - Threads - entrega 21/10
Uma tribo gaulesa janta em comunidade a par r de uma mesa enorme com espaço para M javalis grelhados. Quando um gaulês quer comer, serve-se e re ra um javali da mesa a menos que esta já esteja vazia. Nesse caso o gaulês acorda o cozinheiro e aguarda que este reponha javalis na mesa. O código seguinte representa o código que implementa o gaulês e o cozinheiro.
void Gaules(){
while(true){
Javali j = RetiraJavali();
ComeJavali(j);
}
}
void Cozinheiro(){
while(true){
ColocaJavalis(M);
}
}
Implemente o código das funções RetiraJavali() e ColocaJavalis() incluindo código de sincronização que previna deadlock e acorde o cozinheiro apenas quando a mesa está vazia.
Lembre que existem muitos gauleses e apenas um cozinheiro.
Identifique regiões críticas na vida do gaules e do cozinheiro.
A solução deve aceitar um numero N de gauleses igual ao número de letras de seu primeiro nome e 1 único cozinheiro.
Cada gaules terá um nome, dado pela letra correspondente
– Ex: dalcimar = 8 gauleses
Cada gaules deve imprimir na tela seu nome (dado pela letra) quando come e quando acorda o cozinheiro.
– Ex: Gaules d(0) comendo
– Ex: Gaules a(1) acordou cozinheiro
A quantidade javalis grelhados M deve ser igual ao número dos dois primeiros dígitos de seu RA
A solução não deve ter nenhum comentário
Trabalho 6 - Jantar de Gauleses - Shared Memory - entrega 28/10
Implemente o problema do Jantar de Gauleses usando shared memory
Pode usar funções da shmem (system V) ou mmap (POSIX), escolha livre. Recomendo padrão POSIX
Deve, obrigatóriamente ter um executável, código fonte separado para o produtor e outro para o consumidor
Os programas podem ser lançados em background (&) ou u lizando fork/exec
Trabalho 7 - Jantar de Gauleses - Passagem de mensagem - entrega 04/11
Implemente o problema do Jantar de Gauleses usando MPI (família mpi_send) ou POSIX (família mk_send) escolha livre.
Recomendo padrão POSIX, pois foi a ensinada nos vídeos. Para quem quiser usar MPI tem slides, e vc irá precisar instalar o pacote.
Trabalho 8 - Jantar de Gauleses - Pipes - entrega 04/11
Implemente o problema do Jantar de Gauleses usando pipes
Usar pipes ou named pipes
Deve, obrigatóriamente ter um executável, código fonte separado para o produtor e outro para o consumidor
Os programas podem ser lançados u lizando fork/exec
Controlar o tamanho do buffer usando pipes é problemá co, já que o pipe tem um tamanho fixo dado pelo sistema operacional. Sugestões de solução para ‘emular’ um buffer usando pipes
não fazer nada (terá um pequeno desconto na loja)
descobrir o tamanho do pipe e mandar dados de tamanho correto. Ex, pipe 100kb total, buffer de 5 elementos, cada ‘write’ ou ‘read’ no pipe feito com 20kb (100/5)
utilizar um esquema de passagem de mensagens (consumidor envia 5 mensagens vazias para produtor)
Desenvolva uma estratégia para comunicar 1 produtor (cozinheiro) e N consumidores (gauleses). Sugestão u lizar threads no processo gaules.