Вы находитесь на странице: 1из 3

SISTEMAS OPERACIONAIS 1 - 20 SEM/2014

ESTUDO SOBRE SUBPROCESSOS E THREADS


1.

Objetivo do Trabalho
Desenvolver a capacidade de anlise e estudo de algoritmo no uso das diretivas para criao de subprocessos e threads.

2.

Formao das Equipes


Cada equipe dever ser formada com um mximo de 2 alunos.

3.

Distribuio dos Temas de Estudo


Todos os grupos tero basicamente os mesmos temas para estudo. Caber a cada grupo procurar diferenciar seu
trabalho pela profundidade da anlise, pertinncia das suas concluses e clareza das suas explicaes.
Coloque todos os programas em um mesmo sub-diretrio.

4.

Prazo de Entrega
O deadline para a entrega do relatrio tcnico dever ser at as 23h59 do dia 26/11/2014. Relatrios que forem
entregue aps esta data no sero aceitos. O e-mail dever conter, no subject (assunto), o seguinte texto: so1mat2014
processosThreads. Em caso de dvidas dever ser usado o mesmo e-mail e a mesma palavra de identificao de
assunto. ( mailto: sergio_moraes_2005@yahoo.com )

5.

Temas de Estudo
a.

Estudo de Comandos
a.1 Estude e conceitue os comandos: fork(), exec(), execl(), wait(), exit(), getpid(), getppdi(), waitpid();

b.

Lab1 - Uso dos comandos fork() e exec() no ambiente UNIX ou LINUX


Execute o programa em anexo (Lab1) e responda s perguntas abaixo:
b.1
b.2
b.3
b.4
b.5
b.6
b.7
b.8
b.9
b.10
b.11

c.

Qual a diferena entre o comando fork() e o comando exec()? Qual o retorno esperado de cada um?
A identificao do processo pai sempre maior/menor que a do processo filho? Justifique.
A identificao sempre seqencial ou pode ser aleatria? Justifique.
Em quantos processos resulta a execuo deste programa? Quais so eles? Que parte de cdigo cada
um executa?
No segundo fork(), responda as perguntas de quem sou eu.
Qual a finalidade do comando wait()? Que valores ele pode retornar?
Para que serve a varivel status? Que valores ela pode receber e o que eles significam?
O comando printf() seguinte ao comando execl() geralmente executado ou no? Apresente suas
concluses para tal comportamento.
Substitua o contedo do primeiro campo do comando execl() para /bin/date e explique o que
acontece.
Para estes casos, 7 e 8, como funcionou o comando exit()?
Altere o comando execl() para executar corretamente o comando pwd Discuta o resultado da
execuo.

Lab2 rvore genealgica e escopo das variveis


Execute o programa em anexo (Lab2) e responda s perguntas abaixo:
b.1 Monte a rvore genealgica dos processos.
b.2 Execute o programa por algum nmero de vezes e verifique a ordem em que as coisas acontecem?
Quais suas concluses?
b.3 Aumente para 3 o nmero de subprocs e monte novamente a rvore genealgica da famlia. D uma
justificativa para a estrutura da rvore.

b.4 Mova a instruo j = k para logo aps a instruo for (i=0, ... e veja o que acontece. Justifique o
ocorrido.
b.5 Elimine a instruo j = k e verifique o que acontece. Justifique.
b.6 Substitua a instruo for (i = j; i < maxsubproc; i++) por for (i = 0; i < maxsubproc; i++) e veja o
que acontece. Justifique.
b.7 Verifique o valor das variveis vistas por cada processo e explique como funciona o escopo das
mesmas.
b.8 Mova a declarao da varivel dado2 para dentro da rotina main(). Compare os resultados com os
obtidos em b.6.
d.

Lab3 Processos Cooperativos por Compartilhamento


Estude as formas de compartilhar dados entre os processos pai e filho via mensagens e via pipe. Construa
um programa que calcule o vetor soma de 2 vetores com 5 clulas cada, atravs da ativao de 5 subprocessos, cada uma para calcular o resultado de uma das clulas. O processo pai deve apresentar o resultado
da operao. Implemente uma verso onde os dados so compartilhados via pipe e outro via mensagem.
Inclua o cdigo fonte e o resultado de uma execuo do mesmo no corpo do relatrio, e insira no e-mail os
cdigos fonte e executvel.

e.

Lab4 Threads
Refaa o Lab3 expandindo os vetores para matrizes aleatrias de tamanho 30x5, substituindo os processos por
threads. Avalie as vantagens e desvantagens que encontrou em cada uma das estratgias (processos e threads).
Procure levantar e estudar os comandos:
pthread_create; pthread_exit; pthread_join; pthread_attr_init; pthread_detach.
Lab1.c
#include
#include
#include

<stdio.h>
<wait.h>
<unistd.h>

int main(void)
{
int
status, id;
printf(Pai-id: %d\n, getpid());
if (fork() == 0)
{
printf(Filho-id: %d, vai tentar executar o comando execl\n, getpid());
execl(teste.out, NULL);
printf(Filho id: %d, nao executou o comando\n, getpid());
if (fork == 0)
{
printf(Quem sou eu?\n, getpid());
else
printf(E eu, quem sou?\n, getpid());
exit(1);
}
} else
{
id= wait(&status);
printf(Pai-id: %d, sabe que Filho-id: %d \n, getpid(), id);
if (status == 0)
printf(Terminou OK\n);
else
printf(Nao Terminou OK\n);
}
}

Lab2.c
#include
<stdio.h>
#include
<wait.h>
#include
<sys/types.h>
#define
maxsubprocs
2;
int i, j, k, id, dado1= -10, dado2= 15;
int rc, eu;
pid_t
pid;
int main(void)
{
j = 0;
for (i = 0; i < maxsubprocs; i++)
{
eu= getpid();
if (i == 0)
printf(I am the Grandfather of this group id: %d\n, eu);
else
printf(I am also a father id: %d\n, eu);
pid= fork();
if (pid)
{
if j == 0
printf(I am the Godfather, my id is: %d, my son is: %d\n, getpid(), pid);
else
printf(I am not the Godfather, my id is: %d, my son is: %d\n, getpid(), pid);
end;
dado1= dado1+1;
dado2= dado2+i;
} else
{
k= i + 1;
printf(My id is: %d . I am the son nr. %d of %d\n,getpid, k-j,getppid);
j= k;
dado1= dado1 - 5;
dado2= dado2 - 2*i;
}
}
if (pid != 0)
{
printf(My id: %d, I am waiting for \n, getpid());
for (i = j; i < maxsubproc; i++)
{
id= wait(&rc);
if (rc == 0)
printf(%d, he finished OK\n, id);
else
printf(%d, he DID NOT finish OK\n);
}
}
exit(0);
}

Sorocaba, 22 de outubro de 2014

Вам также может понравиться