Escolar Documentos
Profissional Documentos
Cultura Documentos
Arquitetura S.O 3
Arquitetura S.O 3
Arquitetura S.O 3
Prof. Carlos Alberto Maziero PPGIA CCET PUCPR http://www.ppgia.pucpr.br/maziero 30 de julho de 2008
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.
Copyright (c) 2006 Carlos Alberto Maziero. garantida a permisso para copiar, distribuir e/ou modicar este documento sob os termos da Licena de Documentao Livre GNU (GNU Free Documentation License), Verso 1.2 ou qualquer verso posterior publicada pela Free Software Foundation. A licena est disponvel em http://www.gnu.org/licenses/gfdl.txt. Este texto foi produzido usando exclusivamente software livre: Sistema Operacional Linux (distriA buies Fedora e Ubuntu), compilador de texto L TEX 2 , gerenciador de referncias BibTeX, editor grco Inkscape, criador de grcos GNUPlot e processador PS/PDF GhostScript, entre outros.
SUMRIO 2
Sumrio
1 2 3 Objetivos Escopo da comunicao Formas de comunicao 3.1 Comunicao direta ou indireta 3.2 Sincronismo . . . . . . . . . . . 3.3 Formato de envio . . . . . . . . 3.4 Capacidade dos canais . . . . . 3.5 Nmero de participantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 5 5 6 8 9 10 11 13 14
Exemplos de mecanismos de comunicao 4.1 UNIX Message queues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Pipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Memria compartilhada . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Objetivos 3
1 Objetivos
Nem sempre um programa seqencial 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 justicar 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 seqencial 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 seqencial executa um nico uxo 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 grca, 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 ortogrca do texto, renderizam imagens na janela, etc. Construir esse tipo de aplicao de forma totalmente seqencial 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.
2 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
Formas de comunicao 4
as demais tarefas caso o usurio clique nos botes stop ou reload. Outra situao de comunicao freqente 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 especcos, fazendo uso do suporte de rede disponvel. A gura 1 ilustra essas trs situaes.
3 Formas de comunicao
A implementao da comunicao entre tarefas pode ocorrer de vrias formas. Ao denir os mecanismos de comunicao oferecidos por um sistema operacional, seus projetistas devem considerar muitos aspectos, como o formato dos dados a transferir, o sincronismo exigido nas comunicaes, a necessidade de buers e o nmero de emissores/receptores envolvidos em cada ao de comunicao. Um termo muito empregado para designar genericamente os mecanismos de comunicao IPC - Inter-Process Communication.
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. A gura 2 apresenta os diagramas de tempo de duas situaes freqentes em sistemas com comunicao sncrona.
Figura 2: 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
Formato de envio 6
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 buer para armazenar os dados da comunicao entre eles. Sem esse buer, a comunicao se tornar invivel, pois raramente ambos estaro prontos para comunicar ao mesmo tempo. Esta forma de comunicao esta representada no diagrama de tempo da gura 3.
Figura 3: Comunicao assncrona. Semi-sncrona : primitivas de comunicao semi-sncronas tm um comportamento sncrono (bloqueante) durante um prazo pr-denido. Caso o prazo se esgote sem que a comunicao tenha ocorrido, a primitiva retorna com uma indicao de erro. Para reetir esse comportamento, as primitivas de comunicao recebem um parmetro adicional : enviar (dados, destino, prazo) e receber (dados, origem, prazo). A gura 4 ilustra duas situaes em que ocorre esse comportamento.
Formato de envio 7
Figura 5: Comunicao baseada em mensagens. 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 gura 6 apresenta o comportamento dessa forma de comunicao. Exemplos de sistemas de comunicao orientados a uxo de dados incluem os pipes do UNIX e o protocolo de rede TCP/IP (este ltimo normalmente classicado como orientado a conexo, com o mesmo signicado). Nestes dois exemplos a analogia com o conceito de arquivos to forte que os canais de comunicao so identicados 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 detalhe na seo 4.
Nmero de participantes 9
espao no buer 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 nita. Para exemplicar esse conceito, a gura 7 apresenta o comportamento de duas tarefas trocando dados atravs de um canal de comunicao com capacidade para duas mensagens e comportamento sncrono (bloqueante).
atravs de um canal compartilhado. Essa abordagem conhecida como mailbox (gura 8), sendo implementada nas message queues UNIX e nos sockets do protocolo UDP. Na prtica, o mailbox funciona como um buer 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 (gura 9), sendo implementada por exemplo no protocolo UDP.
#define QUEUE "/my_queue" 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
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
// 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 ;
umask (0) ;
// caso a fila exista, remove-a para destruir seu conteudo antigo mq_unlink (QUEUE) ; // abre ou cria a fila com permissoes 0666 if ( (queue = mq_open (QUEUE, O_RDWR|O_CREAT, 0666, &attr)) == -1) { perror ("mq_open"); exit (1); } // recebe cada mensagem e imprime seu conteudo while (1) { if ( (mq_receive (queue, (void*) &msg, sizeof(msg), 0)) == -1) { perror("mq_receive:") ; exit (1) ; } printf ("Received msg value %d\n", msg); }
}
A listagem a seguir implementa o programa produtor das mensagens consumidas pelo programa anterior:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#define QUEUE "/my_queue" int main (int argc, char *argv[]) { mqd_t queue; // descritor da fila int msg; // mensagem a enviar
// abre a fila de mensagens, se existir if( (queue = mq_open (QUEUE, O_RDWR)) == -1) { perror ("mq_open"); exit (1); }
while (1)
Pipes 13
21 22 23 24 25 26 27 28 29 30 31 32 33
// envia a mensagem if ( mq_send (queue, (void*) &msg, sizeof(msg), 0) == -1) { perror ("mq_send"); exit (1); } printf ("Sent message with value %d\n", msg); sleep (1) ;
} }
Deve-se observar que o arquivo /fila referenciado em ambas as listagens serve unicamente como identicador nico para a la de mensagens; nenhum arquivo com esse nome ser criado pelo sistema. As mensagens no transitam por arquivos, apenas pela memria do ncleo. Referncias de recursos na forma de nomes de arquivos so usadas para identicar vrios mecanismos de comunicao e coordenao em UNIX, como las 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 freqentemente usado para conectar a sada padro (stdout) de um comando entrada 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 ltra 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 gura 10 detalha essa seqncia de aes. O pipe um canal de comunicao unidirecional entre dois processos (1:1), com capacidade nita (os pipes do Linux armazenam 4 KBytes por default), visto pelos processos como um arquivo, ou seja, a comunicao que ele oferece baseada em uxo. 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.
Memria compartilhada 14
Figura 10: Comunicao atravs de pipes. 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].
Memria compartilhada 15
3. O processo pb obtm o identicador 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.
Figura 11: Criao e uso de uma rea de memria compartilhada. Deve-se observar que, ao solicitar a criao da rea de memria compartilhada, pa dene 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 denidas por pa . A listagem a seguir exemplica 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 o 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.
Memria compartilhada 16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
int main (int argc, char *argv[]) { int fd, value, *ptr;
// Passos 1/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) ; } // Passos 1/3: ajusta o tamanho da area compartilhada if (ftruncate(fd, sizeof(value)) == -1) { perror ("ftruncate"); exit (1) ; } // Passos 2/4: mapeia a area no espaco 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); }
while (1) { // Passo 5: escreve um valor aleatorio na area compartilhada value = random () % 1000 ; (*ptr) = value ; printf ("Wrote value %i\n", value) ; sleep (1);
// Passo 5: le e imprime o conteudo da area compartilhada value = (*ptr) ; printf("Read value %i\n", value); sleep (1) ;
} }
REFERNCIAS 17
Questes
1. Quais so as vantagens e desvantagens das abordagens a seguir, sob as ticas do sistema operacional e do programador de aplicativos? (a) comunicao bloqueante ou no-bloqueante (b) canais com buering ou sem buering (c) comunicao por mensagens ou por uxo (d) mensagens de tamanho xo ou varivel (e) comunicao 1:1 ou M:N 2. Explique como processos que comunicam por troca de mensagens se comportam em relao capacidade do canal de comunicao, considerando as semnticas de chamada sncrona e assncrona.
Exerccios
1. ...
Projetos
1. ...
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.