Comunicação entre processos Freqüentemente, processos precisam se comunicar com outros processos. Por exemplo, em um pipeline do interpretador de comandos, a saída do primeiro processo deve ser passado para o segundo processo, e isso prossegue até o fim da linha de comandos. Assim, há uma necessidade de comunicação entre processos que deve ocorrer, de preferência, de uma maneira muito estruturada. Em relação a esta comunicação, há três tópicos de devem ser levados em consideração: Como um processo passa informações para outro processo; Como garantir que dois ou mais processos não invadam uns aos outros, quando envolvidos em regiões críticas. Por exemplo, suponha que dois processos tentem, cada um, acessar uma determinada região de memória. O relacionamento, ou seqüência adequada, quando existir dependência entre processos. Se o processo A produz dados e o processo B os imprime, B deve esperara até que A produza alguns dados para serem impressos. Prof. Dr. Márcio Andrey Teixeira Condições de Disputa Processos que trabalham em conjunto podem compartilhar armazenamento em comum, do qual cada um pode ler e escrever. algum Exemplo de compartilhamento: Dados, arquivos etc. Podem estar na memória principal como também em um arquivo compartilhado. Exemplo: Um spool de impressão. Quando quer imprimir um arquivo, o processo entre com o nome do arquivo que será impresso no diretório de spool. Um outro processo, um deamon de impressão, verifica periodicamente se há algum arquivo para ser impresso e, se houver, os imprime e então remove os nomes do diretório de spool Imagine a seguinte seguinte situação: O nosso spool de impressão contém um grande número de vagas numeradas de 1, 2, 3 ...., cada vaga pode conter um nome de um arquivo para ser impresso. Imagine também que há duas variáveis compartilhadas: Prof. Dr. Márcio Andrey Teixeira Condições de Disputa out: que aponta para o próximo arquivo a ser impresso; in: que aponta para a próxima vaga no diretório; 4 Processso A . . . 5 6 in = 7 7 Processso B . . . Em um dado instante, as vagas 0 a 3 estão vazias; Prof. Dr. Márcio Andrey Teixeira out = 4 Condições de Disputa out: que aponta para o próximo arquivo a ser impresso; in: que aponta para a próxima vaga no diretório; 4 Processso A . . . 5 6 in = 7 7 Processso B . . . Em um dado instante, as vagas 0 a 3 estão vazias; As vagas de 4 a 6 estão preenchidas; Prof. Dr. Márcio Andrey Teixeira out = 4 Processso A Processso B 4 5 6 7 . . . out = 4 in = 7 . . . Mais ou menos ao mesmo tempo, os processos A e B decidem colocar um arquivo na fila de impressão; O processo A lê in, e armazena o valor 7 na variável local chamada proxima_vaga_livre; Ocorre uma interrupção O processo B também lê in e obtem igualmento o número 7; Neste momento, ambos os processos pensam que a próxima vaga liver é a 7; O processo B segue sua execução e atualiza a variável in com o número 8; Prof. Dr. Márcio Andrey Teixeira Processso A Processso B 4 5 6 7 . . . out = 4 in = 7 . . . Ao final, o processo A executa novamente a partir de onde parou. Verifica que a próxima vaga é 7, e sobrescreve o nome o arquivo que o processo 8 mandou imprimir. Feito isto, o processo A calcula a nova vaga, e altera o valor de in para 8. Neste instante, o diretório de spool está inconsistente internamente. O processo B não conseguirá imprimir os seus dados Prof. Dr. Márcio Andrey Teixeira Regiões Críticas O que fazer para evitar condições de disputa? A resposta para esta pergunta é impedir que dois ou mais pocessos leiam ou escrevam em uma região de memória compartilhada, ou outro recurso compartilhado. Em outras palavras, é necessário exlcusão mútua (mutual exclusion). Isto é, algum modo de assegurar que outros processos sejam impedidos de usar uma variável ou um outro recurso compartilhado que já estiver em uso por outro processo. A escolha de operações primitivas para evitar este problema é muito importante no desenvolvimento de sistemas operacionais. Prof. Dr. Márcio Andrey Teixeira Regiões Críticas Para conseguir chegar em uma boa solução para este problema, quatro condições devem ser satisfeita: 1. Nunca dois ou mais processos podem estar simultaneamente em suas regiões críticas; 2. Nada pode ser afirmado sobre o número e a velocidade de CPUs; 3. Nenhum processo executando em uma região crítica pode bloquear outros processos; 4. Nenhum processo pode esperar eternamente para entrar em sua região critica; Em um sentido abstrato, a figura abaixo mostra o comportamento ideal; A entra na região crítica A sai na região crítica Processo A B tenta entrar na região crítica B entra na região crítica B deixa a região crítica Processo b T1 Prof. Dr. Márcio Andrey Teixeira T2 B bloquado T3 T4