2.1 Processos 2.2 Threads 2.3 Comunicao interprocesso 2.4 Problemas clssicos de IPC 2.5 Escalonamento
1
Processos
O Modelo de Processo
Criao de Processos
Um sistema pode executar uma conjunto muito grande de processos simultneos/ concorrentes. Principais eventos que levam criao de processos: 1. Ao iniciar o sistema operacional 2. Um processo pai cria um novo processo (chamda fork())
3
Usurio executa comando/ inicia programa atravs da shell Incio de um programa e em momento prdeterminado (atravs do cron daemon)
Trmino de Processos
Condies que levam ao trmino de processos:
1. 2. 3. 4. Sada normal (voluntria) Sada por erro (voluntria) Erro fatal (involuntrio) Cancelamento por um outro processo (involuntrio), atravs de um sinal.
Hierarquias de Processos
Processo pai cria um processo filho, processo filho pode criar seu prprio processo, etc. Forma-se uma hierarquia de processos
UNIX chama isso de grupo de processos
Estados de Processos
PCB1 PCB2 PCB3 PCB a representao de um processo no ncleo. Pode ser uma entrada na Tabela de Processos ou um elemento na lista de processos. Para ser capaz de reiniciar um processo interrompido (ou esperando) o estado em que deixou a CPU precisa ser restaurado
10
11
Troca de Contexto
12
Troca de Contexto
Consiste de salvar o estado dos recursos em uso (especialmente CPU) do processo interrompido na tabela de processos, e carregar a CPU com um novo estado (PC, registradores, stack pointer, PSW, etc.) Esta troca precisa ser:
Completa e consistente Eficiente
Tratamento de Interrupes
Para desviar o controle de execuo, o valor do contador de programa (PC) da CPU precisa ser trocado. Isso feito pelo HW ao receber uma interrupo
14
Exceo
Indica a ocorrncia de um erro, de hardware ou causado por uma instruo sendo executada Classificados como faults, traps or aborts
15
Tipos de Interrupes
Tipos de interrupo reconhecidos pela Intel Architecture IA-32:.
Tipo
I/O
Timer
16
Tratamento de Interrupes
First Level Int. Handler (FLIH), em Assembly Dispositivo -> I/O Interrupt Segmentation Fault -> Error System Call -> Trap send message -> Trap Clock Interrupt - desabilita interrupes - salva contexto em tabela de processos/PCB - Cria nova pilha temporria no kernel - carrega no PC o end. do Vetor de Interrupes - habilita interrupes
Tratador de interrupo especfico(): - trata a interrupo (p.ex. Escreve/le dados de buffer do driver) - se algum processo foi desbloqueado ento - retorna Scheduler(): - Dispatcher, em Assembly: - desabilita interrupes - carrega o contexto na CPU & mapeamento de memria do processo a ser executado - - insere o processo desbloqueado na fila de prontos q Escolhe prximo processo retorna 17
- habilita interrupes
Tratamento de Interrupes
Esqueleto do que o nvel mais baixo do SO faz quando ocorre uma interrupo
Vetor de Interrupo: Localizado em endereo baixo de memria (ncleo) Uma entrada para cada tipo de interrupo (trap, clock, E/S) e cada tipo de dispositivo floppy, HD, teclado, mouse, etc.) Cada entrada contm endereo para um procedimento tratador da interrupo (tratamento do servio da interrupo)
18
Processos em Android
Cada aplicativo Android executa em um processo separado, e tem a sua prpria instncia de Dalvik (mquina virtual Java) O Dalvik uma VM otimizada, de forma que muitas instncias de Dalvik podem executar em um smartphone Dalvik acessa os recursos de HW do dispositivo atravs de chamadas ao Linux kernel Os executveis que rodam na VM Dalvik (.dex) usarem pouca memria RAM Processos com baixa prioridade podem ser terminados Aplicativos podem interagir com "Servios" que so processos executando em background
19
Visualizar/Gerenciar Processos
Unix e Android
20
Escalonamento
A cada instante um ou mais processos podem estar no estado pronto, e.g.:
Processos do sistema e de usurios Processos de vrios usurios (sistema time-sharing) Mix de processos interativos e batch (simulao, folha de pagamento)
Escalonador responsvel por gerenciar a fila de prontos, e escolher qual dos processos prontos vai ser o prximo a usar CPU
22
Escalonamento
O algoritmo poder lidar com objetivos conflitantes. Por exemplo:
Garantir justia (fairness): cada processo ganha fatia igual da CPU Aumentar eficincia: manter utilizao de CPU alta (prxima a 100%) Minimizar tempo de resposta (para processos interativos) Minimizar de tempo de retorno (t entre incio-fim de processos batch) Maximizar taxa de sada: nmero de processos processados por unidade de tempo
23
10
Escalonamento
Tipos de sistemas e objetivos do escalonamento
24
A poltica de escalonamento deve ser independente do mecanismo (carregamento da CPU com um contexto) Tm parmetros que precisam ser ajustados para: maximizar a satisfao geral dos usurios e garantir execuo mais eficiente das tarefas essenciais ao sistema
Escalonamento
Principal problema : o comportamento futuro de um processo no previsvel (fases de uso intensivo da CPU, fases de E/S frequente)
25
11
Escalonamento
1. Escalonamento de longo prazo
ao ser criado, processo vai para fila dos prontos Questo: quando isso feito e em qual posio ele entra?
2. dispatching
escalonamento de curto prazo Escolhe um dos processos da/s lista/s de prontos para executar
27
autnomo
Executa como um processo independente Pode estar dedicado a uma CPU em uma arquitetura multicore Em mquinas com 1 processador, executado uma vez a cada quantum de tempo H uma alternncia entre o processo escalonador e os demais processos
28
12
Tipos de Escalonamento
Com relao: ao momento da invocao do escalonador:
preemptivo: processo corrente interrompido (por exemplo, aps ter decorrido quantum de tempo) e escalonador escolhe outro processo para executar no-preemptivo: escalonador s chamado quando processo termina ou bloqueado
30
13
Externos
Prazo para trmino de ao (Deadline) Prioridade do usurio: root vs normal (funo na empresa, valor desembolsado)
32
14
Funo Prioridade
Possveis parmetros:
a = tempo de servio alcanado r = tempo de permanncia no sistema t = tempo total de servio d = Periodicidade (para tempo real) deadline (expltio ou definido pelo perodo) e = prioridade externa Requisitos de memria (p/ processamento em lotes)
r a d
33
tempo
Algortmos de escalonamento
Nome, Modo deciso, Priorid., Desempate FIFO: no-preemptivo P = r randomico SJF: no-preemptivo P = t cron./randomico SRT: preemptivo P = (ta) cron./randomico RR: preemptivo P=0 cclico ML: preemptivo P=e cclico no-preemptivo P = e cronolgico
n nveis de prioridade fixa nvel P atendido quando as filas n a P+1 esto vazias
SJF= Shortest Job First; SRT = Shortest Remaining Time; RR= RoundRobin; ML = Multi-level a = servio alcanado; r = permanncia no sistema, t = tempo total de servio e = prioridade externa
34
15
A 0 8
B C 9 10
B C 0 1 2
A 10
16
Escalonamento com mltiplas filas (ML) Para sistemas com mix de processos interativos e em lote Processos so classificados segundo prioridade, e cada
classe tem sua prpria fila de prontos. Priority 1 Priority 2 Priority 3
Executa todos de prioridade 1, depois 2 Para evitar o problema de inanio (= alguns processos nunca
ganham a vez), pode-se definir perodos de tempo mximos para cada categoria: por exemplo, 70% para 1, 20% para 2
37
...
...
ML Princpio Geral
No ML adaptou-se SJF para processos interativos, considerando o tempo efetivo de CPU entre requisies de E/S
P1 P2
Principal problema: como descobrir qual dos processos prontos requisitar a CPU por menor perodo de tempo. Princpio adotado: Estimar a prxima fatia de tempo necessria, olhando para o passado. Exemplo: Seja T0 a estimativa de tempo de uso de CPU e T1 o tempo de CPU efetivamente utilizado da ltima vez. Ento, a estimativa para a prxima vez, T2, deveria ser ajustada. T2 = *T1 + (1-)*T0. Se > 0.5 d-se mais importncia para o comportamento mais recente, e < 0.5 maior importncia para o comportamento mais no passado
38
17
Algortmos de escalonamento
Multiplos nveis com feedback - MLF (Multilevel with feedback):
Similar ao ML, mas com uma prioridade que muda dinamicamente Todo processo comea no nvel mais alto n Cada nvel P prescreve um tempo mximo tP tP aumenta medida que P diminui geralmente:
tn = t (constante) tP = 2 tP+1
39
Queue Queue
2x t 4x t
...
...
...
18
Algortmos de escalonamento
Rate Monotonic (RM):
Usado para processos peridicos (em sistemas de tempo real) Preemtivo Prioridade maior para menor perodo: P = d
42
Comparao
Sistemas em lote
FIFO, SJF, SRT: FIFO o mais simples SJF/SRT possuem tempos mdios de turnaround (# processos/tempo) menores
Sistemas time-sharing
Tempo de resposta crtico RR puro ou MLF (c/ RR por nvel) so apropriados A escolha do quantum de tempo q determina o overhead
Quando q , RR se aproxima de FIFO Quando q 0, overhead de troca de contexto (TC) 100% Quando q >> overhead de TC, n processos executam desempenho 1/n CPU velocidade
43
19
54
Escalonamento no Minix 3
Algoritmo
de
escalonamento
mul1-nvel
(16
nveis).
Tarefas
so
escalonadas
sem
preempo.
Demais
processos
com
Round-Robin
Adaptado:
se
processo
desbloqueado
ainda
1ver
parte
de
seu
quantum,
posicionado
no
comeo
da
la.
Processos
servidores
tem
quantum
de
tempo
maior.
Nveis
de
prioridade:
Task_Q
1. Tarefas
Sistema
e
Relgio
2. Tarefa
Tty
3. Tarefas
Disco,
log
e
mem
4. Servidores
RS
e
PM
5. Servidor
FS
User_Q
6. Processos
usurio
7.
Idle_Q
16. IDLE
vetores rdy_head[16] e rdy_tail[16], apontam para o comeo e nal de cada la Leitura: seo 2.5.4 no livro do Tanenbaum e Woodhull
20
Threads
Thread = linha de execuo independente dentro de um mesmo processo Multiplas threads so necessrias quando >1 pedidos de E/ S devem ser tratados concorrentemente, e que precisam compartilhar algumas estruturas de dados (e.g. uma cache em um servidor de arquivos ou conexes TCP em um servidor Web;
67
68
21
Principais Caractersticas
Cada thread tem a sua pilha prpria, mas compartinha o mesmo espao de endereamento do processo em que foi criada; Se duas threads executam o mesmo procedimento/mtodo, cada uma ter a sua prpria cpia das variveis locais; As threads podem acessar todas os dados globais do programa, e o heap (memria alocada dinamicamente) Nesse acesso a dados globais (i.e. quando acesso inclui mais do que uma instruo de mquina), ento threads precisam ter acesso em regime de excluso mtua (p.ex. usando locks())
69
22
71
73
23
Gerenciamento de Threads
Ao contrrio de processos, threads compartilham a mesma regio de memria
Cada thread possui sua prpria pilha e contexto de CPU (contedo de PC, SP, registradores, PSW, etc.) Uma tread pode estar nos estados: running, blocked & ready
74
O Descritor de Thread
Para cada thread, o kernel (ou biblioteca de threads) mantm a seguinte informao, que mantida independente dos descritores de processos (PCBs) Contexto: program counter (PC) process status word (PSW) stack pointer (SP) registers state priority host_process thread_Id processID /* prxima instruo */ /* resultado da operao, ex: carry-bit */ /* pilha de execuo do thread */ /* contedo dos registradores da CPU */ /* blocked, running, ready */ /* processo hospedeiro ou kernel */ /* identificador do thread */ /* processo ao qual a thread pertence */
75
24
76
Tipos de Threads
Kernel-level threads (1 para 1): thread a unidade de escalonamento do ncleo A biblioteca de chamadas de sistema inclui operaes para gerenciar threads Algoritmo de escalonamento o implementado pelo ncleo Exemplos: Windows NT/XP/2000 Solaris (anterior vers. 9) Linux: LinuxThreads ou "Native Posix Thread Library (NPTL) Apple: Multiprocessing Services Unix: NetBSD, FreeBSD User-level threads (N para 1): todas as threads no processo so mapeadas em nica unidade escalonvel do ncleo O processo no aproveita o paralelismo de arquiteturas multi-core o desenvolvedor no fica limitado s polticas de escalonamento do ncleo Exemplos:
GNU Portable threads, Thread manager (Apple), Netscape Portable Runtime, State Threads, LWP (SunOS) POSIX P-threads, C-threads
25
Tipos de Threads
Threading hbrido (N para M): N theads de um processo so mapeadas em M threads do ncleo Mais difcil de implementar (pois os escalonadores do modo usurio e do modo kernel precisam se coordenar) troca de contexto pode ser muito eficiente, pois no requer sempre uma chamda de sistema Exemplos:
Microsoft Windows7, IRIX HP-UX Tru64 UNIX Solaris 8
Exemplo de 3 para 2
79
Biblioteca de threads em nvel usurio: Escalonamento das threads de acordo com as necessidades do programa de aplicao. Quando uma thread requisita E/S, bloqueia todo o processo. Exemplos: POSIX P-threads, C-threads
26
Implementaes Hbridas
81
27
void main() { pthread_t tid; void *thread_main( ){ int status; int result; pthread_create(&tid,NULL,thread_main,NULL); .... . Pthread_exit((void*) result); pthread_join(tid, (void*) &status); } printf(Return value is: %d\n, status); }
82
28
Threads em modo usurio: FSU Pthreads (SunOS 4.1.x, Solaris 2.x, SCO UNIX, FreeBSD and Linux) LPW (SunOS 3/4, mips-ultrix, 386BSD, HP-UX and Linux) PCthreads PThreads Mais informaes em: http://www.ibiblio.org/pub/Linux/docs/faqs/Threads-FAQ/html/ThreadLibs.html
84
Prs e contras
Threads implementados pelo ncleo? VANTAGENS: threads nvel usurio no permitem E/S concorrente se uma thread pede E/S, todo o processo bloqueado DESVANTAGENS: Troca de contexto menos eficiente (requer troca entre modos: usurio kernel usurio) Kernel fica mais complexo (precisa implementar tabelas de threads e de processos) Desenvolvedor de aplicao tem menos controle sobre o escalonamento das threads de seu processo
85
29
88
30
Dois ou mais processos precisam ler e escrever no mesmo arquivo; Jobs de impresso de dois processos devem ser processados de forma atmica, para garantir que as sadas (listagem) no saiam misturadas Threads compartilham uma lista (ou vetor) de elementos com escrita: atualizao requer escritas combinadas em vrios endereos de memria
89
recurso compartilhado
Dado compart.
90
31
Dados
thread
thread
data
process
receive(msg)
Na comunicao entre processos (Inter-Process Communication - IPC), o principal problema so as condies de corrida.
91
Dois processos querem acessar memria compartilhada ao mesmo tempo (e de forma concorrente e imprevisvel) Exemplo:
processo A l memria compartilhadain=7, e logo depois interrompido, Processo B faz o mesmo e adiciona um novo arquivo no diretrio de spool de impresso Quando A re-inicia , sobre-escreve o slot 7 com seu arquivo.
92
32
Condio de Corrida
Ocorre sempre que: existem dois ou mais processos concorrentes Cada processo precisa executar um conjunto de aes (a1,..aN) que envolvem mais de um dado/recurso compartilhado, e os dados/recursos precisam manter um estado consistente entre s; antes que complete a execuo de todo o conjunto de aes, um dos processos interrompido pelo outro Processo2: Processo1: r Dado1 w B1 A1 x x B2 A2 Recurso1 B3 A3 w Dado2
93
Condio de Corrida
Anlogo vale para troca de mensagens (entre processos clientes e processos servidores) Exemplos: 1. Para requisitar um servio, cliente precisa enviar duas mensagens (1.consulta ao estado, e 2.confirmar requisio do servio) 2. S faz sentido confirmar a requisio, se outro servio (complementar, ou anterior) j tiver sido completado.
Ready?
client
Confirm req.
server
94
33
Condio de Corrida
exemplo do dia-a-dia: ligao telefnica
95
Condio de Corrida
Problemas associados
1. Ausncia de atomicidade das aes feitas em dados compartilhados (requer excluso mtua ou bloqueio) 2. Processos tentam acessar dados compartilhados que ainda no esto prontos para serem acessados 3. Operaes simultneas (no previstas) se bloqueiam mutuamente Para permitir uma cooperao correta entre processos preciso: Estabelecer um controle na ordem de execuo Garantir que algumas execues ocorram de forma atmica
96
34
Regio Crtica
Memria/Recursos compartilhados deveriam ser acessados em regime de excluso mtua (um processo de cada vez) Regio crtica (ou Sesso crtica) = parte do programa em que esto as aes que manipulam os recursos (dados) compartilhados.
Quatro condies para garantir excluso mtua: 1. Nunca, dois ou mais processos executam simultaneamente em suas sesses crticas 2. No deve haver qualquer suposio sobre velociades e/ou nmero de processos 3. Quando executa cdigo fora de uma sesso crtica, um processo nunca bloqueia outro processo 4. Qualquer processo que entrou em sua sesso crtica, em algum momento deixa a mesma.
97
Regio Crtica
Para implementar uma regio crtica deve haver um mecanismo/protocolo para garantir a entrada e saida segura (sincronizada, coordenada) desta desta parte do cdigo.
Cdigo em um processo: Enter_region; // bloqueia se outro processoe estiver dentro A1; A2; A3; Exit_region; // sai da regio, e libera outros processos esperando
98
35
Regio Crtica
Possibilidades: Desabilitar interrupes: Pode ser usado em modo supervisor, mas no em modo usurio Usar uma flag lock compartilhada: se lock=0, trocar valor para 1 e processo entra RC, seno processo espera Se leitura & atribuio do lock no for atmica, ento problema permanece Alternncia regular de acesso por dois processos (PID= 0; PID= 1) um problema, se os processos alternantes requisitam o recurso com alta frequncia
100
36
Soluo de Peterson: turn e vetor interested[] so variveis compartilhadas Se dois processos PID = {0,1} executam simultaneamente enter_region, o primeiro valor de turn ser sobreescrito (e o processo correspondente vai entrar), mas interested[first] vai manter o registro do intersse do segundo processo 101
102
37
Enter()!
Enter()!
Enter()!
Enter()!
Critical region
Exit()! Exit()!
Critical region
Exit()! Exit()!
kernel
Esp.Oc: para arq. multi-core Bloqu:.o ncleo garante atomicidade
103
A alternativa: Primitivas que bloqueiam o processo e o fazem esperar por um sinal de outro processo: Por exemplo:
sleep :: suspende o processo at que seja acordado wakeup(PID) :: envia sinal para acordar o processo PID
104
38
Produtor
buffer
Consumidor
105
Condio de corrida: consumidor verifica que count=0, mas antes que execute sleep, o produtor escalonado, acrescenta item e executa wakeup. Mas como consumidor ainda no executou sleep, consumidor ficar bloqueado e sistema entrar em um impasse.
106
39
Semforos
Em 1965 E.W. Dijkstra (1965) props o conceito de semforos como mecanismo bsico para sincronizao entre processos. A inspirao: sinais de trens.
107
Semforos
Trata-se de um contador que representa o nmero de processsos que podem entrar em uma Regio Crtica. A cada semforo est associado uma lista de processos bloqueados. Para um semforo s existem duas operaes atmicas (P/V ou Down/Up): Down(&s) :: se s=0 processo invocador bloqueia nesta chamada. Se s 0, decrementa s e continua execuo Up(&s) :: incrementa s, desbloqueia um dos processos bloqueados (se houver) e continua execuo p2
up
down
p1
p4
p3
p7
Processos bloqueados
Operaes Down e Up geralmente so implementadas como chamadas ao sistema operacional, e durante a sua execuo o ncleo desabilita temporariamente as interrupes (para garantir a atomicidade)
108
40
Semforos: implementao
109
110
41
111
Monitor
Idia bsica: Usar o princpio de encapsulamento de dados tambm para a sincronisao: Vrias threads podem estar executando o mesmo monitor; A cada momento, apenas um procedimento do monitor pode estar sendo executado;
113
42
Monitor
Monitor um elemento da linguagem de programao que combina o encapsulamento de dados com o controle para acesso sincronizado Usa-se variveis de condio (com operaes wait e signal), quando o procedimento em execuo no consegue completar e precisa que outro procedimento seja completado; Em Java, tem-se algo similar: classe com mtodos synchronized
wait(c)
signal(c)
114
43
116
Problema: Cada filsofos tenta pegar o garfo esquerdo, e se conseguir, espera pelo garfo direito? E se todos pegarem o esquerdo ao mesmo tempo? Outra abordagem: Tente pegar garfo esquerdo; Se garfo direito estiver disponvel, ok, seno devolve tambm o garfo esquerdo e espera. 117 Qual o problema agora?
44
Soluo (parte 1)
118
119
45
r r w w
db
120
46
122
Sincronizaco de Barreira
Quando todos os processos precisam alcanar um mesmo estado, antes de prosseguir (exemplo: processamento paralelo em rodadas com troca de informaes) Processos progridem a taxas distintas Todos que chegam a barreira, so bloqueados para esperar pelos demais Quando o retardatrio chega, todos so desbloqueados e podem prosseguir
123
47
Sincronizao de Barreira
Processo { bool last = false; Semaphore barrier; Mutex m; Int count = N Init (&barrier, 0) down(&m) count--; if (count == 0) last= true; up(&m) if (NOT last) down (&barrier); else for (i=0; i< N; i++) up (&barrier); }
124
Semforos
Todas bibliotecas de threads (ou system calls) provm operaces para semforos:
sem_t semaphore sem_init(&semaphore, 0, some_value); sem_down(&semaphore); sem_up(&semaphore);
125
48
Envio de Mensagens
uma forma natural de interao entre processos Duas primitivas:
send(dest, &message) tam da mensagem fixo ou varivel receive(fonte, &message) - fonte pode ser ANY
126
Envio de Mensagens
Envio de mensagens um mecanismo de sincronizao mais genrico, porque:
Permite tambem a troca de dados independente se processos compartilham memria ou no. Qualquer soluo baseada em semforos pode ser resolvida por envio de mensagens (considere: Down
receive, Up
send, valor do semforo = nmero de mensagens)
49
Request-Reply sncrono
producer consumer
kernel
kernel
No-bloquenate
producer consumer
Request-Reply, no-bloqueante
producer consumer
kernel kernel
128
Idia: consumidor envia mensagem vazia, e produtor responde com a mensagem preenchida.
129
50
Mecanismos de Comunicao
Sockets Remote Procedure Calls
130
Sockets
Um socket um ponto de comunicao: um objeto asbrato atravs do qual mensagens podem ser enviadas e recebidas. Concatenao de endereo IP address e porta Socket 161.25.19.8:1625 se refere a porta 1625 no host 161.25.19.8 Uma conexo consiste de um par de sockets
132
51
RPC cria uma abstrao de uma chamada de procedimento entre processos em uma rede; Stubs proxy no lado do cliente para o procedimento no lado servidor O stub cliente encontra o servidor, estabelece uma conexo e faz o marshalling dos parmetros Stub do lado servidor (skeleton) recebe a mensagem, desempacota os parmetros, faz a chamada do procedimento, empacota o resultado e envia de volta ao stub cliente.
133
RPC: Exemplo
136
52
Comunicao em Minix
O ncleo implementa os seguintes tipos de comunicao:
send(dest, &message) receive(src, &message) send_rec(src_dst, &message) notify (dest, &message) Observaes: Ncleo copia dados da rea do processo fonte (src) para o processo destinatrio (dest), usando CopyMess. Existem 6 formatos de mensagem (mess_1, mess_2,) para diferentes conjuntos de parmetros (= union com source, type e tipos de dados), definidos em kernel/proc.h Parmetros podem ser ponteiros para estruturas de dados do sistema Chamadas do sistema, interrupes de HW, do relgio, sinais, etc. todos so convertidos para envios de mensagens (p.ex. _syscall traduz cdigo de chamada em mensagem)
138
IPC no Minix
Todos os processos e tarefas de Minix interagem atravs de envio de mensagens Send, receive e send_recv implementam Rendezvous, sempre entre pares de processos Quando remetente e destinatrio executaram essas primitivas, a mensagem copiada da rea do remetente para a rea de memria do destinatrio. Os campos p_caller_q e p_q_link (nas entradas do dest e src, na tabela de processos do ncleo) apontam para a entrada dos processos dos quais se esperando uma mensagem, ou o receive, respectivamente. Notify um envio assncrono e possui prioridade mais alta. Quando o destinatrio no est bloqueado, ncleo guarda informao de pendncia, e quando o mesmo ficar bloqueado, e recria a mensagem original (BuildMess)
139
53
Filas de processos
Todos os processos esperando por enviar uma mensagem so enfileriados. Exemplo: processos 3 e 4 esperando para enviar msg ao processo 0;
P_q_link P_q_link P_q_link
140
54