UERJ – Universidade do Estado do Rio de Janeiro
FEN – Faculdade de Engenharia
PEL – Programa de Pós-Graduação em Engenharia Eletrônica
Prof. Alexandre Sztajnberg
2008/1
Projeto de Programação 1 - Renata
•
•
•
•
•
•
•
•
•
Elaborar um programa onde o processo pai cria uma área de memória compartilhada
(shmem) e 3 processos filhos (através da system call fork()) e em seguida aguarda
o término de cada um dos filhos (wait ()).
A área de memória compartilhada deve ser suficiente para conter duas variáveis do
tipo integer. A primeira das variáveis será iniciada com o valor 300 (trezentos) e
outra com 0 (zero).
Cada um dos 3 processos filho executa um loop de 100 iterações com a seguinte
rotina: (a) lê o valor da 1ª variável na área de memória compartilhada e armazena o
mesmo em uma variável local, (b) decrementa o valor lido desta variável local, (c)
armazena o valor decrementado na 1ª variável da memória compartilhada, (d)
incrementa o valor da 2ª variável (observe que esta 2ª variável não é copiada para a
memória local do processo filho) e (e) exibe no terminal padrão um string contendo
o seu PID, o PPID, um número de série seqüencial iniciado em 1, e outras
informações que o programador achar relevante – por exemplo o valor das variáveis
compartilhadas.
Depois de cada passo da rotina o processo "dorme" um tempo aleatório (variando
entre 20 e 200 ms). A cada dormida o tempo esperado aleatório em milisegundos
deve ser apresentado na tela.
Quando a contagem terminar, cada filho/thread “avisa” ao processo "pai" que já
terminou. O pai deve avisar que esta ciente de que o filho X terminou. No caso dos
processos criados através de fork () vamos utilizar os sinais (signal) como
mecanismo do Unix de comunicação entre processos filhos com o pai. Ou seja, o
processo filho vai enviar um signal para o processo pai - o processo pai já deve estar
“aguardando” (bloqueado) este evento através de um wait().
Quando todos os processos filhos terminarem o processo "pai de todos" identifica
isso com uma mensagem na tela, exibindo o valor das duas variáveis da memória
compartilhada e também termina.
Observe que a memória compartilhada precisa ser liberada apos o seu uso.
Os filhos devem ser programados de forma que se imponha o intercalamento
aleatório dos mesmos (caso contrário eles podem executar em seqüência). Ou seja, o
"dormir" de cada processo que fica em loop deve ser aleatório (usar o ramdom e
randomize corretamente).
Cronometrar o tempo gasto na execução do fork() no processo pai e em cada
processo filho (a idéia é termos um sentimento de quanto tempo leva para o sistema
criar um processo).
Projeto de Programação 1 – André e Leila
Variações do trabalho proposto para a Renata
Uso do dlsym ()
•
•
•
•
Cada processo filho vai executar um procedimento (ou seja, o loop está dentro de
um procedimento). A versão da Renata também pode ser assim, mas para vocês é
obrigatório.
Este procedimento deve ser programado e compilado como um shared object (*.so).
Pesquisar como isso é feito.
Cada processo filho executará uma versão diferente desta função, carregada
dinamicamente.
O processo pai vai responder a um signal() customizado. Quando o signal() for
ativado, um novo filho será criado (com uma nova versão da função filho).
Uso de execve()
•
A ser definido.
Download

• Elaborar um programa onde o processo pai cria uma área de