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

Sistemas Operacionais: Conceitos e Mecanismos

III - Mecanismos de Comunicao


Prof. Carlos Alberto Maziero
DAInf UTFPR
http://dainf.ct.utfpr.edu.br/maziero
2 de junho de 2013

Este texto est licenciado sob a Licena Attribution-NonCommercial-ShareAlike 3.0 Unported da Creative
Commons (CC). Em resumo, voc deve creditar a obra da forma especificada pelo autor ou licenciante (mas
no de maneira que sugira que estes concedem qualquer aval a voc ou ao seu uso da obra). Voc no
pode usar esta obra para fins comerciais. Se voc alterar, transformar ou criar com base nesta obra, voc
poder distribuir a obra resultante apenas sob a mesma licena, ou sob uma licena similar presente.
Para ver uma cpia desta licena, visite http://creativecommons.org/licenses/by-nc-sa/3.0/.
Este texto foi produzido usando exclusivamente software livre: Sistema Operacional GNU/Linux (distribuies Fedora e Ubuntu), compilador de texto LATEX 2 , gerenciador de referncias BibTeX, editor grfico
Inkscape, criadores de grficos GNUPlot e GraphViz e processador PS/PDF GhostScript, entre outros.

c Carlos Maziero

: SUMRIO

Sumrio
1

Objetivos

Escopo da comunicao

Caractersticas dos mecanismos de comunicao


3.1 Comunicao direta ou indireta . . . . . . . .
3.2 Sincronismo . . . . . . . . . . . . . . . . . . .
3.3 Formato de envio . . . . . . . . . . . . . . . .
3.4 Capacidade dos canais . . . . . . . . . . . . .
3.5 Confiabilidade dos canais . . . . . . . . . . .
3.6 Nmero de participantes . . . . . . . . . . . .

.
.
.
.
.
.

4
5
5
7
8
9
10

Exemplos de mecanismos de comunicao


4.1 Filas de mensagens UNIX . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Pipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3 Memria compartilhada . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11
11
14
15

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

c Carlos Maziero

: Objetivos

Resumo
Muitas implementaes de sistemas complexos so estruturadas como vrias
tarefas inter-dependentes, que cooperam entre si para atingir os objetivos da
aplicao, como por exemplo em um navegador Web. Para que as vrias tarefas que
compem uma aplicao possam cooperar, elas precisam comunicar informaes
umas s outras e coordenar suas atividades, para garantir que os resultados obtidos
sejam coerentes. Este mdulo apresenta os principais conceitos, problemas e
solues referentes comunicao entre tarefas.

Objetivos

Nem sempre um programa sequencial a melhor soluo para um determinado


problema. Muitas vezes, as implementaes so estruturadas na forma de vrias tarefas
inter-dependentes que cooperam entre si para atingir os objetivos da aplicao, como
por exemplo em um navegador Web. Existem vrias razes para justificar a construo
de sistemas baseados em tarefas cooperantes, entre as quais podem ser citadas:
Atender vrios usurios simultneos : um servidor de banco de dados ou de e-mail
completamente sequencial atenderia um nico cliente por vez, gerando atrasos
intolerveis para os demais clientes. Por isso, servidores de rede so implementados com vrios processos ou threads, para atender simultaneamente todos os
usurios conectados.
Uso de computadores multi-processador : um programa sequencial executa um nico
fluxo de instrues por vez, no importando o nmero de processadores presentes
no hardware. Para aumentar a velocidade de execuo de uma aplicao, esta
deve ser quebrada em vrias tarefas cooperantes, que podero ser escalonadas
simultaneamente nos processadores disponveis.
Modularidade : um sistema muito grande e complexo pode ser melhor organizado
dividindo suas atribuies em mdulos sob a responsabilidade de tarefas interdependentes. Cada mdulo tem suas prprias responsabilidades e coopera com
os demais mdulos quando necessrio. Sistemas de interface grfica, como os
projetos Gnome [Gnome, 2005] e KDE [KDE, 2005], so geralmente construdos
dessa forma.
Construo de aplicaes interativas : navegadores Web, editores de texto e jogos
so exemplos de aplicaes com alta interatividade; nelas, tarefas associadas
interface reagem a comandos do usurio, enquanto outras tarefas comunicam
atravs da rede, fazem a reviso ortogrfica do texto, renderizam imagens na
janela, etc. Construir esse tipo de aplicao de forma totalmente sequencial seria
simplesmente invivel.
Para que as tarefas presentes em um sistema possam cooperar, elas precisam
comunicar, compartilhando as informaes necessrias execuo de cada tarefa, e
coordenar suas atividades, para que os resultados obtidos sejam consistentes (sem erros).
Este mdulo visa estudar os principais conceitos, problemas e solues empregados
para permitir a comunicao entre tarefas executando em um sistema.
3

c Carlos Maziero

: Escopo da comunicao

Escopo da comunicao

Tarefas cooperantes precisam trocar informaes entre si. Por exemplo, a tarefa
que gerencia os botes e menus de um navegador Web precisa informar rapidamente
as demais tarefas caso o usurio clique nos botes stop ou reload. Outra situao de
comunicao frequente ocorre quando o usurio seleciona um texto em uma pgina da
Internet e o arrasta para um editor de textos. Em ambos os casos ocorre a transferncia
de informao entre duas tarefas distintas.
Implementar a comunicao entre tarefas pode ser simples ou complexo, dependendo
da situao. Se as tarefas esto no mesmo processo, elas compartilham a mesma rea de
memria e a comunicao pode ento ser implementada facilmente, usando variveis
globais comuns. Entretanto, caso as tarefas pertenam a processos distintos, no existem
variveis compartilhadas; neste caso, a comunicao tem de ser feita por intermdio do
ncleo do sistema operacional, usando chamadas de sistema. Caso as tarefas estejam
em computadores distintos, o ncleo deve implementar mecanismos de comunicao
especficos, fazendo uso do suporte de rede disponvel. A Figura 1 ilustra essas trs
situaes.
Computador 1

Computador 2

Processo pa
tarefa i

Processo pb

tarefa j

send

Processo pc

tarefa k

tarefa l

recv

rea
comum

send

send recv

recv
rea no ncleo

ncleo

ncleo

rea no ncleo
rede

Figura 1: Comunicao intra-processo (ti t j ), inter-processos (t j tk ) e inter-sistemas


(tk tl ).
Apesar da comunicao poder ocorrer entre threads, processos locais ou computadores
distintos, com ou sem o envolvimento do ncleo do sistema, os mecanismos de
comunicao so habitualmente denominados de forma genrica como mecanismos
de IPC (Inter-Process Communication mechanisms).

Caractersticas dos mecanismos de comunicao

A implementao da comunicao entre tarefas pode ocorrer de vrias formas. Ao


definir os mecanismos de comunicao oferecidos por um sistema operacional, seus
projetistas devem considerar muitos aspectos, como o formato dos dados a transferir,
4

c Carlos Maziero

: Comunicao direta ou indireta

o sincronismo exigido nas comunicaes, a necessidade de buffers e o nmero de


emissores/receptores envolvidos em cada ao de comunicao. As prximas sees
analisam alguns dos principais aspectos que caracterizam e distinguem entre si os vrios
mecanismos de comunicao.

3.1

Comunicao direta ou indireta

De forma mais abstrata, a comunicao entre tarefas pode ser implementada por
duas primitivas bsicas: enviar (dados, destino), que envia os dados relacionados ao
destino indicado, e receber (dados, origem), que recebe os dados previamente enviados
pela origem indicada. Essa abordagem, na qual o emissor identifica claramente o
receptor e vice-versa, denominada comunicao direta.
Poucos sistemas empregam a comunicao direta; na prtica so utilizados mecanismos de comunicao indireta, por serem mais flexveis. Na comunicao indireta,
emissor e receptor no precisam se conhecer, pois no interagem diretamente entre
si. Eles se relacionam atravs de um canal de comunicao, que criado pelo sistema
operacional, geralmente a pedido de uma das partes. Neste caso, as primitivas de
comunicao no designam diretamente tarefas, mas canais de comunicao aos quais
as tarefas esto associadas: enviar (dados, canal) e receber (dados, canal). A Figura 2 ilustra
essas duas formas de comunicao.
receptor

emissor

receptor

emissor

canal
dados

enviar

dados

enviar

receber

dados

Figura 2: Comunicao direta (esquerda) e indireta (direita).

3.2

Sincronismo

Em relao aos aspectos de sincronismo do canal de comunicao, a comunicao


entre tarefas pode ser:
Sncrona : quando as operaes de envio e recepo de dados bloqueiam (suspendem)
as tarefas envolvidas at a concluso da comunicao: o emissor ser bloqueado
at que a informao seja recebida pelo receptor, e vice-versa. Esta modalidade
de interao tambm conhecida como comunicao bloqueante. A Figura 3
apresenta os diagramas de tempo de duas situaes frequentes em sistemas com
comunicao sncrona.

c Carlos Maziero

: Sincronismo
receptor

emissor

receptor

emissor

enviar

receber

espera

espera

dados

dados

enviar

receber

Figura 3: Comunicao sncrona.


Assncrona : em um sistema com comunicao assncrona, as primitivas de envio e
recepo no so bloqueantes: caso a comunicao no seja possvel no momento
em que cada operao invocada, esta retorna imediatamente com uma indicao
de erro. Deve-se observar que, caso o emissor e o receptor operem ambos de forma
assncrona, torna-se necessrio criar um canal ou buffer para armazenar os dados
da comunicao entre eles. Sem esse canal, a comunicao se tornar invivel,
pois raramente ambos estaro prontos para comunicar ao mesmo tempo. Esta
forma de comunicao, tambm conhecida como comunicao no-bloqueante,
est representada no diagrama de tempo da Figura 4.
receptor

emissor

enviar
erro !
(ningum para receber)

receber
erro !
(nada a receber)
dados

enviar

receber

Figura 4: Comunicao assncrona.


Semi-sncrona : primitivas de comunicao semi-sncronas (ou semi-bloqueantes) tm
um comportamento sncrono (bloqueante) durante um prazo pr-definido. Caso
esse prazo se esgote sem que a comunicao tenha ocorrido, a primitiva se encerra
6

c Carlos Maziero

: Formato de envio

com uma indicao de erro. Para refletir esse comportamento, as primitivas de


comunicao recebem um parmetro adicional: enviar (dados, destino, prazo) e
receber (dados, origem, prazo). A Figura 5 ilustra duas situaes em que ocorre esse
comportamento.
receptor

emissor

receptor

emissor

enviar

receber

prazo

prazo

erro !
(ningum para receber)

erro !
(nada a receber)

enviar

receber
dados

dados

enviar

receber

Figura 5: Comunicao semi-sncrona.

3.3

Formato de envio

A informao enviada pelo emissor ao receptor pode ser vista basicamente de


duas formas: como uma sequncia de mensagens independentes, cada uma com seu
prprio contedo, ou como um fluxo sequencial e contnuo de dados, imitando o
comportamento de um arquivo com acesso sequencial.
Na abordagem baseada em mensagens, cada mensagem consiste de um pacote de
dados que pode ser tipado ou no. Esse pacote recebido ou descartado pelo receptor
em sua ntegra; no existe a possibilidade de receber meia mensagem (Figura 6).
Exemplos de sistema de comunicao orientados a mensagens incluem as message queues
do UNIX e os protocolos de rede IP e UDP, apresentados na Seo 4.
Caso a comunicao seja definida como um fluxo contnuo de dados, o canal de
comunicao visto como o equivalente a um arquivo: o emissor escreve dados nesse
canal, que sero lidos pelo receptor respeitando a ordem de envio dos dados. No h
separao lgica entre os dados enviados em operaes separadas: eles podem ser lidos
byte a byte ou em grandes blocos a cada operao de recepo, a critrio do receptor. A
Figura 7 apresenta o comportamento dessa forma de comunicao.
Exemplos de sistemas de comunicao orientados a fluxo de dados incluem os
pipes do UNIX e o protocolo de rede TCP/IP (este ltimo normalmente classificado
como orientado a conexo, com o mesmo significado). Nestes dois exemplos a analogia
com o conceito de arquivos to forte que os canais de comunicao so identificados
por descritores de arquivos e as chamadas de sistema read e write (normalmente
usadas com arquivos) so usadas para enviar e receber os dados. Esses exemplos so
apresentados em detalhes na Seo 4.
7

c Carlos Maziero

: Capacidade dos canais


emissor

ab

enviar

buer

receptor

ab

1234

enviar

1234

xyz

enviar

xyz 1234

ab
receber

ab

receber

1234

receber

xyz

xyz

Figura 6: Comunicao baseada em mensagens.


emissor

buer

ab

enviar

ab

1234

enviar

ab1234

xyz

enviar

receptor

receber

ab12

receber

34xy

34xyz

receber

Figura 7: Comunicao baseada em fluxo de dados.

3.4

Capacidade dos canais

O comportamento sncrono ou assncrono de um canal de comunicao pode ser


afetado pela presena de buffers que permitam armazenar temporariamente os dados em
trnsito, ou seja, as informaes enviadas pelo emissor e que ainda no foram recebidas
pelo receptor. Em relao capacidade de buffering do canal de comunicao, trs
situaes devem ser analisadas:
Capacidade nula (n = 0) : neste caso, o canal no pode armazenar dados; a comunicao
feita por transferncia direta dos dados do emissor para o receptor, sem cpias
intermedirias. Caso a comunicao seja sncrona, o emissor permanece bloqueado
at que o destinatrio receba os dados, e vice-versa. Essa situao especfica
(comunicao sncrona com canais de capacidade nula) implica em uma forte
sincronizao entre as partes, sendo por isso denominada Rendez-Vous (termo
8

c Carlos Maziero

: Confiabilidade dos canais

francs para encontro). A Figura 3 ilustra dois casos de Rendez-Vous. Por outro
lado, a comunicao assncrona torna-se invivel usando canais de capacidade
nula (conforme discutido na Seo 3.2).
Capacidade infinita (n = ) : o emissor sempre pode enviar dados, que sero armazenados no buffer do canal enquanto o receptor no os consumir. Obviamente essa
situao no existe na prtica, pois todos os sistemas de computao tm capacidade de memria e de armazenamento finitas. No entanto, essa simplificao
til no estudo dos algoritmos de comunicao e sincronizao, pois torna menos
complexas a modelagem e anlise dos mesmos.
Capacidade finita (0 < n < ) : neste caso, uma quantidade finita (n) de dados pode
ser enviada pelo emissor sem que o receptor os consuma. Todavia, ao tentar enviar
dados em um canal j saturado, o emissor poder ficar bloqueado at surgir espao
no buffer do canal e conseguir enviar (comportamento sncrono) ou receber um
retorno indicando o erro (comportamento assncrono). A maioria dos sistemas
reais opera com canais de capacidade finita.
Para exemplificar esse conceito, a Figura 8 apresenta o comportamento de duas
tarefas trocando dados atravs de um canal de comunicao com capacidade para duas
mensagens e comportamento sncrono (bloqueante).
emissor

m1

enviar

m2

enviar

m3

enviar

buer

m1

m2

receptor

m1

m2 m1

no h espao

m2
m3

m1

receber

m1

m3 m2

Figura 8: Comunicao sncrona usando um canal com capacidade 2.

3.5

Confiabilidade dos canais

Quando um canal de comunicao transporta todos os dados enviados atravs dele


para seus receptores, respeitando seus valores e a ordem em que foram enviados, ele
chamado de canal confivel. Caso contrrio, trata-se de um canal no-confivel. H
vrias possibilidades de erros envolvendo o canal de comunicao:

c Carlos Maziero

: Nmero de participantes

Perda de dados: nem todos os dados enviados atravs do canal chegam ao seu
destino; podem ocorrer perdas de mensagens (no caso de comunicao orientada
a mensagens) ou de sequncias de bytes, no caso de comunicao orientada a
fluxo de dados.
Perda de integridade: os dados enviados pelo canal chegam ao seu destino, mas
podem ocorrer modificaes em seus valores devido a interferncias externas.
Perda da ordem: todos os dados enviados chegam ntegros ao seu destino, mas o
canal no garante que eles sero entregues na ordem em que foram enviados. Um
canal em que a ordem dos dados garantida denominado canal FIFO ou canal
ordenado.
Os canais de comunicao usados no interior de um sistema operacional para a
comunicao entre processos ou threads locais so geralmente confiveis, ao menos em
relao perda ou corrupo de dados. Isso ocorre porque a comunicao local feita
atravs da cpia de reas de memria, operao em que no h risco de erros. Por
outro lado, os canais de comunicao entre computadores distintos envolvem o uso
de tecnologias de rede, cujos protocolos bsicos de comunicao so no-confiveis
(como os protocolos Ethernet, IP e UDP). Mesmo assim, protocolos de rede de nvel mais
elevado, como o TCP, permitem construir canais de comunicao confiveis.

3.6

Nmero de participantes

Nas situaes de comunicao apresentadas at agora, cada canal de comunicao


envolve apenas um emissor e um receptor. No entanto, existem situaes em que uma
tarefa necessita comunicar com vrias outras, como por exemplo em sistemas de chat
ou mensagens instantneas (IM Instant Messaging). Dessa forma, os mecanismos
de comunicao tambm podem ser classificados de acordo com o nmero de tarefas
participantes:
1:1 : quando exatamente um emissor e um receptor interagem atravs do canal de
comunicao; a situao mais frequente, implementada por exemplo nos pipes e
no protocolo TCP.
M:N : quando um ou mais emissores enviam mensagens para um ou mais receptores.
Duas situaes distintas podem se apresentar neste caso:
Cada mensagem recebida por apenas um receptor (em geral aquele que
pedir primeiro); neste caso a comunicao continua sendo ponto-a-ponto,
atravs de um canal compartilhado. Essa abordagem conhecida como
mailbox (Figura 9), sendo implementada nas message queues UNIX e nos sockets
do protocolo UDP. Na prtica, o mailbox funciona como um buffer de dados,
no qual os emissores depositam mensagens e os receptores as consomem.
Cada mensagem recebida por todos os receptores (cada receptor recebe
uma cpia da mensagem). Essa abordagem conhecida pelos nomes de
difuso (multicast) ou canal de eventos (Figura 10), sendo implementada por
exemplo no protocolo UDP.
10

c Carlos Maziero

: Exemplos de mecanismos de comunicao

r1
m1

e1

m4

m3

m1
m2

mailbox
m4

r2

m2

e2

m3

r3

Figura 9: Comunicao M:N atravs de um mailbox.


canal de
eventos

e1

e2

m3

m3

m2

m1

m3

m2

m1

m3

m2

m1

m1

r1

r2

m2

r3

Figura 10: Difuso atravs de um canal de eventos.

Exemplos de mecanismos de comunicao

Nesta seo sero apresentados alguns mecanismos de comunicao usados com


frequncia em sistemas UNIX. Mais detalhes sobre estes e outros mecanismos podem ser
obtidos em [Stevens, 1998, Robbins and Robbins, 2003]. Mecanismos de comunicao
implementados nos sistemas Windows so apresentados em [Petzold, 1998, Hart, 2004].

4.1

Filas de mensagens UNIX

As filas de mensagens foram definidas inicialmente na implementao UNIX System


V, sendo atualmente suportadas pela maioria dos sistemas. Alm do padro System V, o
padro POSIX tambm define uma interface para manipulao de filas de mensagens.
Esse mecanismo um bom exemplo de implementao do conceito de mailbox (vide Seo
3.6), permitindo o envio e recepo ordenada de mensagens tipadas entre processos
locais. As operaes de envio e recepo podem ser sncronas ou assncronas, a critrio
do programador.
As principais chamadas para uso de filas de mensagens POSIX so:
11

c Carlos Maziero

: Filas de mensagens UNIX

mq_open: abre uma fila j existente ou cria uma nova fila;


mq_setattr e mq_getattr: permitem ajustar ou obter atributos da fila, que
definem seu comportamento, como o tamanho mximo da fila, o tamanho de cada
mensagem, etc.;
mq_send: envia uma mensagem para a fila; caso a fila esteja cheia, o emissor fica
bloqueado at que alguma mensagem seja retirada da fila, abrindo espao para o
envio; a variante mq_timedsend permite definir um prazo mximo de espera: caso
o envio no ocorra nesse prazo, a chamada retorna com erro;
mq_receive: recebe uma mensagem da fila; caso a fila esteja vazia, o receptor bloqueado at que surja uma mensagem para ser recebida; a variante
mq_timedreceive permite definir um prazo mximo de espera;
mq_close: fecha o descritor da fila criado por mq_open;
mq_unlink: remove a fila do sistema, destruindo seu contedo.
A listagem a seguir implementa um consumidor de mensagens, ou seja, um
programa que cria uma fila para receber mensagens. O cdigo apresentado segue
o padro POSIX (exemplos de uso de filas de mensagens no padro System V esto
disponveis em [Robbins and Robbins, 2003]). Para compil-lo em Linux necessrio
efetuar a ligao com a biblioteca de tempo-real POSIX (usando a opo -lrt).

12

c Carlos Maziero

1
2

: Filas de mensagens UNIX

// Arquivo mq-recv.c: recebe mensagens de uma fila de mensagens Posix.


// Em Linux, compile usando: cc -o mq-recv -lrt mq-recv.c

3
4
5
6
7

#include
#include
#include
#include

<stdio.h>
<stdlib.h>
<mqueue.h>
<sys/stat.h>

8
9

#define QUEUE "/my_queue"

10
11
12
13
14
15

int main (int argc, char *argv[])


{
mqd_t queue;
// descritor da fila de mensagens
struct mq_attr attr;
// atributos da fila de mensagens
int msg ;
// mensagens contendo um inteiro

16

// define os atributos da fila de mensagens


attr.mq_maxmsg = 10 ;
// capacidade para 10 mensagens
attr.mq_msgsize = sizeof(msg) ; // tamanho de cada mensagem
attr.mq_flags = 0 ;

17
18
19
20
21

umask (0) ;

22

// mascara de permissoes (umask)

23

// abre ou cria a fila com permissoes 0666


if ((queue = mq_open (QUEUE, O_RDWR|O_CREAT, 0666, &attr)) < 0)
{
perror ("mq_open");
exit (1);
}

24
25
26
27
28
29
30

// recebe cada mensagem e imprime seu conteudo


for (;;)
{
if ((mq_receive (queue, (void*) &msg, sizeof(msg), 0)) < 0)
{
perror("mq_receive:") ;
exit (1) ;
}
printf ("Received msg value %d\n", msg);
}

31
32
33
34
35
36
37
38
39
40
41

A listagem a seguir implementa o programa produtor das mensagens consumidas


pelo programa anterior:

13

c Carlos Maziero

1
2

: Pipes

// Arquivo mq-send.c: envia mensagens para uma fila de mensagens Posix.


// Em Linux, compile usando: cc -o mq-send -lrt mq-send.c

3
4
5
6
7

#include
#include
#include
#include

<stdio.h>
<stdlib.h>
<mqueue.h>
<unistd.h>

8
9

#define QUEUE "/my_queue"

10
11
12
13
14

int main (int argc, char *argv[])


{
mqd_t queue;
// descritor da fila
int
msg;
// mensagem a enviar

15

// abre a fila de mensagens, se existir


if((queue = mq_open (QUEUE, O_RDWR)) < 0)
{
perror ("mq_open");
exit (1);
}

16
17
18
19
20
21
22

for (;;)
{
msg = random() % 100 ; // valor entre 0 e 99

23
24
25
26

// envia a mensagem
if (mq_send (queue, (void*) &msg, sizeof(msg), 0) < 0)
{
perror ("mq_send");
exit (1);
}
printf ("Sent message with value %d\n", msg);
sleep (1) ;

27
28
29
30
31
32
33
34

35
36

O produtor de mensagens deve ser executado aps o consumidor, pois este


ltimo quem cria a fila de mensagens. Deve-se observar tambm que o arquivo /fila
referenciado em ambas as listagens serve unicamente como identificador comum para a
fila de mensagens; nenhum arquivo de dados com esse nome ser criado pelo sistema.
As mensagens no transitam por arquivos, apenas pela memria do ncleo. Referncias
de recursos atravs de nomes de arquivos so frequentemente usadas para identificar
vrios mecanismos de comunicao e coordenao em UNIX, como filas de mensagens,
semforos e reas de memria compartilhadas (vide Seo 4.3).

4.2

Pipes

Um dos mecanismos de comunicao entre processos mais simples de usar no


ambiente UNIX o pipe, ou tubo. Na interface de linha de comandos, o pipe
frequentemente usado para conectar a sada padro (stdout) de um comando entrada

14

c Carlos Maziero

: Memria compartilhada

padro (stdin) de outro comando, permitindo assim a comunicao entre eles. A linha
de comando a seguir traz um exemplo do uso de pipes:
# who | grep marcos | sort > login-marcos.txt
A sada do comando who uma listagem de usurios conectados ao computador.
Essa sada encaminhada atravs de um pipe (indicado pelo caractere |) ao comando
grep, que a filtra e gera como sada somente as linhas contendo a string marcos. Essa
sada encaminhada atravs de outro pipe ao comando sort, que ordena a listagem
recebida e a deposita no arquivo login-marcos.txt. Deve-se observar que todos os
processos envolvidos so lanados simultaneamente; suas aes so coordenadas pelo
comportamento sncrono dos pipes. A Figura 11 detalha essa sequncia de aes.
who

stdin

stdout

grep

pipe

stdout

stdin

sort

stdout

pipe

ncleo
arquivo

Figura 11: Comunicao atravs de pipes.


O pipe um canal de comunicao unidirecional entre dois processos (1:1), com
capacidade finita (os pipes do Linux armazenam 4 KBytes por default), visto pelos
processos como um arquivo, ou seja, a comunicao que ele oferece baseada em fluxo.
O envio e recepo de dados so feitos pelas chamadas de sistema write e read, que
podem operar em modo sncrono (bloqueante, por default) ou assncrono.
O uso de pipes na linha de comando simples, mas seu uso na construo de
programas pode ser complexo. Vrios exemplos do uso de pipes UNIX na construo
de programas so apresentados em [Robbins and Robbins, 2003].

4.3

Memria compartilhada

A comunicao entre tarefas situadas em processos distintos deve ser feita atravs
do ncleo, usando chamadas de sistema, porque no existe a possibilidade de acesso
a variveis comuns a ambos. No entanto, essa abordagem pode ser ineficiente caso a
comunicao seja muito volumosa e frequente, ou envolva muitos processos. Para essas
situaes, seria conveniente ter uma rea de memria comum que possa ser acessada
direta e rapidamente pelos processos interessados, sem o custo da intermediao pelo
ncleo.
A maioria dos sistemas operacionais atuais oferece mecanismos para o compartilhamento de reas de memria entre processos (shared memory areas). As reas de memria
compartilhadas e os processos que as utilizam so gerenciados pelo ncleo, mas o acesso
ao contedo de cada rea feito diretamente pelos processos, sem intermediao ou
15

c Carlos Maziero

: Memria compartilhada

coordenao do ncleo. Por essa razo, mecanismos de coordenao (apresentados no


Captulo ??) podem ser necessrios para garantir a consistncia dos dados armazenados
nessas reas.
A criao e uso de uma rea de memria compartilhada entre dois processos pa e pb
em um sistema UNIX pode ser resumida na seguinte sequncia de passos, ilustrada na
Figura 12:
1. O processo pa solicita ao ncleo a criao de uma rea de memria compartilhada,
informando o tamanho e as permisses de acesso; o retorno dessa operao um
identificador (id) da rea criada.
2. O processo pa solicita ao ncleo que a rea recm-criada seja anexada ao seu
espao de endereamento; esta operao retorna um ponteiro para a nova rea de
memria, que pode ento ser acessada pelo processo.
3. O processo pb obtm o identificador id da rea de memria criada por pa .
4. O processo pb solicita ao ncleo que a rea de memria seja anexada ao seu espao
de endereamento e recebe um ponteiro para o acesso mesma.
5. Os processos pa e pb acessam a rea de memria compartilhada atravs dos
ponteiros informados pelo ncleo.
Deve-se observar que, ao solicitar a criao da rea de memria compartilhada, pa
define as permisses de acesso mesma; por isso, o pedido de anexao da rea de
memria feito por pb pode ser recusado pelo ncleo, se violar as permisses definidas
por pa . A listagem a seguir exemplifica a criao e uso de uma rea de memria
compartilhada, usando o padro POSIX (exemplos de implementao no padro System
V podem ser encontrados em [Robbins and Robbins, 2003]). Para compil-lo em Linux
necessrio efetuar a ligao com a biblioteca de tempo-real POSIX, usando a opo -lrt.
Para melhor observar seu funcionamento, devem ser lanados dois ou mais processos
executando esse cdigo simultaneamente.

16

c Carlos Maziero

: Memria compartilhada
pa

pb

nova rea de
memria

passo 1)

criar

alocar

id

ncleo

reas alocadas

pa

pb

passos 2 e 3)

anexar

ptr

obter

id

ncleo
pa
passos 4 e 5)

pb
usar

usar

ptr

anexar

ncleo

Figura 12: Criao e uso de uma rea de memria compartilhada.


1
2

// Arquivo shmem.c: cria e usa uma rea de memria compartilhada.


// Em Linux, compile usando: cc -o shmem -lrt shmem.c

3
4
5
6
7
8

#include
#include
#include
#include
#include

<stdio.h>
<stdlib.h>
<fcntl.h>
<sys/stat.h>
<sys/mman.h>

9
10
11
12

int main (int argc, char *argv[])


{
int fd, value, *ptr;

13
14
15
16
17
18
19

// Passos 1 a 3: abre/cria uma area de memoria compartilhada


fd = shm_open("/sharedmem", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
if(fd == -1) {
perror ("shm_open");
exit (1) ;
}

20
21
22
23
24
25

// Passos 1 a 3: ajusta o tamanho da area compartilhada


if (ftruncate(fd, sizeof(value)) == -1) {
perror ("ftruncate");
exit (1) ;
}

26
27
28
29
30
31

// Passos 2 a 4: mapeia a area no espaco


17 de enderecamento deste processo
ptr = mmap(NULL, sizeof(value), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if(ptr == MAP_FAILED) {
perror ("mmap");
exit (1);

c Carlos Maziero

: REFERNCIAS

Referncias
[Gnome, 2005] Gnome (2005).
http://www.gnome.org.

Gnome:

the free software desktop project.

[Hart, 2004] Hart, J. (2004). Windows System Programming, 3rd edition. Addison-Wesley
Professional.
[KDE, 2005] KDE (2005). KDE desktop project. http://www.kde.org.
[Petzold, 1998] Petzold, C. (1998). Programming Windows, 5th edition. Microsoft Press.
[Robbins and Robbins, 2003] Robbins, K. and Robbins, S. (2003). UNIX Systems Programming. Prentice-Hall.
[Stevens, 1998] Stevens, R. (1998). UNIX Network Programming. Prentice-Hall.

18

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