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.