Baixe o app para aproveitar ainda mais
Prévia do material em texto
SISTEMAS OPERACIONAIS Izabelly Soares de Morais Concorrência e sincronização de processos Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Definir aplicações concorrentes. � Discutir a comunicação entre aplicações concorrentes. � Identificar os problemas de compartilhamento de recursos. Introdução Você já se perguntou sobre a composição de um computador? Talvez esse questionamento nunca passou por sua cabeça. Isso pode ser por- que vivemos em um mundo globalizado, onde temos acesso a diversas novidades, hoje, quase todas tecnológicas, e esses questionamentos acabam sendo escassos. Ao falarmos do computador, atualmente, não imaginamos a quanti- dade de componentes que o compõem. Não podemos deixar de lembrar que algum tempo atrás, um componente poderia ocupar um prédio inteiro, ou seja, era impossível deslocá-lo de um local para outro. E com- putadores pessoais nem existiam. A cada lembrança fica mais difícil de imaginar como era nessa época, já que hoje podemos notar a presença de um componente computacional em um smartphone. Neste capítulo, vamos abordar as aplicações concorrentes, bem como a comunicação que ocorre entre elas e os contextos que envolvem a possibilidade da existência de diversos processos sendo executados ao mesmo tempo. Veremos também que, para que isso ocorra de forma satisfatória, algumas etapas devem ser executadas conforme a máquina em si consiga realizar de forma correta as atividades que lhes foram designadas. Aplicações concorrentes Antes de falarmos mais precisamente sobre aplicações concorrentes, vamos ressaltar alguns conceitos que envolvem esse assunto. Primeiro, quando falamos de aplicações, devemos ter em mente que elas se referem aos processos. E o que são processos? Podemos ouvir ou ver essa palavra em diversos contextos. Aqui, os processos remetem a uma ordenação, uma sequência de operações que são executadas pelo processador. De acordo com Stallings (2010, p. 528), um processo é uma instância de um programa executando em um computador. Um processo engloba duas características principais: � Posse do recurso: um processo inclui um espaço de endereço virtual para guardar a imagem do processo; a imagem do processo é coleção de programa, dados, pilhas e atributos que definem o processo. De tempos em tempos, a um processador pode ser dada a posse (ou controle) de recursos, como memória principal, canais de E/S, dispositivos de E/S e arquivos. � Escalonamento/execução: a execução de um processo segue um caminho de execução (rastro) por um ou mais programas. Essa execução pode ser intercalada com a de outros processos. Assim, um processo tem um estado de execução (executando, pronto, etc.) e uma prioridade de despacho e é a entidade que é escalonada e despachada pelo sistema operacional. A troca de processos, de acordo com Stallings (2010) é uma operação que gera a troca em um processador de um processo para outro, salvando todos os dados de controle do processador, registradores e outras informações do primeiro, substituindo com informações de processo do segundo. Conforme Silberschatz, Galvin e Gagne (2015), quando um processo é executado, ele muda de estado. O estado de um processo é definido, em parte, pela atividade corrente do processo. Um processo pode estar em um dos seguintes estados: � Novo: o processo está sendo criado. � Em execução: instruções estão sendo executadas. � Em espera: o processo está esperando que algum evento ocorra (como a conclusão de um I/O ou o recebimento de um sinal). � Pronto: o processo está esperando que seja atribuído a um processador. � Concluído: o processo terminou sua execução. Concorrência e sincronização de processos2 Já para Machado e Maia (2017), um processo pode ser entendido ini- cialmente como um programa em execução, só que seu conceito é mais abrangente. Para que a concorrência entre os programas ocorra sem pro- blemas, é necessário que todas as informações do programa interrompido sejam guardadas para que, quando este voltar a ser executado, não lhe falte nenhuma informação necessária à continuação do processamento. Essas informações são fundamentais para que o sistema operacional possa gerenciar a execução concorrente de programas e é a base de qualquer ambiente multiprogramável. O conceito de processo pode ser definido como o conjunto necessário de informações para que o sistema operacional implemente a concorrência de programas. Sob o ponto de vista do autor, um processo é formado por três partes, conhecidas como contexto de hardware, contexto de software e espaço de endereçamento, que, juntos, mantêm todas as informações necessárias à execução de um programa. Observe a Figura 1 a seguir. Figura 1. Características da estrutura de um processo. Fonte: Machado e Maia (2017, p. 66). 3Concorrência e sincronização de processos Rose Realce É para retirar também? A seguir, podemos observar que alguns componentes fazem parte da composição de um processo em geral, e que outros são itens de uma thread. Observe o Quadro 1, que mostra, na primeira coluna, uma lista com alguns itens compartilhados por todas as threads em um processo; a segunda coluna mostra alguns itens privativos de cada thread. Fonte: Adaptado de Tanembaum e Woodhull (2012, p. 79). Itens por processo Itens por thread � Espaço de endereçamento � Variáveis globais � Arquivos abertos � Processos-filho � Alarmes pendentes � Sinais e rotinas de tratamento de sinal � Informações de contabilização � Contador de programa � Registradores � Pilha � Estado Quadro 1. Itens por processo versus itens por thread Para Machado e Maia. (2017, p. 45), processos independentes, subprocessos e threads são maneiras diferentes de implementar a concorrência dentro de uma aplicação. Os autores definem como: � O uso de processos independentes é a maneira mais simples de imple- mentar a concorrência em sistemas multiprogramáveis. Nesse caso, não existe vínculo do processo criado com o seu criador. A criação de um processo independente exige a alocação de um PCB, tendo contextos de hardware, contextos de software e espaços de endereçamento próprios. � Subprocessos são processos criados dentro de uma estrutura hierárquica. Nesse modo, o processo criador é denominado processo-pai, enquanto o novo processo é chamado de subprocesso ou processo-filho. O subpro- cesso, por sua vez, pode criar outras estruturas de subprocessos. Uma característica dessa implementação é a dependência existente entre o processo criador e o subprocesso. � O conceito de thread foi introduzido na tentativa de reduzir o tempo gasto em criação, eliminação e troca de contexto de processos nas aplicações concorrentes, bem como economizar recursos do sistema como um todo. Concorrência e sincronização de processos4 Nena Realce Rose Realce Idem A seguir, veremos um pouco sobre a comunicação entre as aplicações. No caso das threads, elas podem se diferenciar conforme a quantidade de processos que um programa suporta em seu espaço de endereçamento. Comunicação entre aplicações concorrentes Conforme Silberschatz, Galvin e Gagne (2015), thread é uma unidade básica de utilização da CPU. É composta por um ID de thread, um contador de pro- grama, um conjunto de registradores e uma pilha. Uma thread compartilha, com outros threads pertencentes ao mesmo processo, sua seção de código, a seção de dados e outros recursos do sistema operacional, como arquivos abertos e sinais. Um processo tradicional (ou processo pesado) tem uma única thread de controle. Se um processo tem múltiplas threads de controle, ele pode executar mais de uma tarefa ao mesmo tempo. Dessa forma, podemos afirmar que a comunicação entre as aplicações concorrentes pode ocorrer conforme a necessidade de utilizarmos uma ou mais threads por processo. Podemos denominar de monothread, quando o processo contém apenas uma única thread, e multithread, quando dentro do mesmo processopodemos constar a existência de diversas threads. Veja a Figura 2. Figura 2. Processos com uma única thread e com múltiplas threads. Fonte: Silberschatz, Galvin e Gagne (2015). 5Concorrência e sincronização de processos Monothread Para Machado e Maia (2017), um programa é uma sequência de instruções, composta por desvios, repetições e chamadas a procedimentos e funções. Em um ambiente monothread, um processo suporta apenas um programa no seu espaço de endereçamento. Nesse ambiente, aplicações concorrentes são implementadas apenas com o uso de múltiplos processos independentes ou subprocessos. A utilização de processos independentes e subprocessos permite dividir uma aplicação em partes que podem trabalhar de forma concorrente. Um exemplo do uso de concorrência pode ser encontrado nas aplicações com interface gráfica, como em um software de gerenciamento de e-mails. Nesse ambiente, um usuário pode estar lendo suas mensagens antigas ao mesmo tempo que pode estar enviando e-mails e recebendo novas mensagens. Com o uso de múltiplos processos, cada funcionalidade do software implicaria a criação de um novo processo para atendê-la, aumentando o desempenho da aplicação. O problema nesse tipo de implementação é que o uso de processos no desenvolvimento de aplicações concorrentes demanda consumo de diversos recursos do sistema. Sempre que um novo processo é criado, o sistema deve alocar recursos para cada processo, consumindo tempo de processador nesse trabalho. No caso do término do processo, o sistema dispensa tempo para desalocar recursos previamente alocados (MACHADO; MAIA, 2017). Multithread Conforme Tanembaum e Woodhull (2012), quando múltiplas threads estão presentes no mesmo espaço de endereçamento, alguns pontos fazem com que seja necessária uma tabela de segmentos separada, com uma entrada por thread. Entre os itens por thread estão o contador de programa, os registra- dores e o estado. O contador de programa é necessário porque, assim como os processos, as threads podem ser suspensas e retomadas. Os registradores são necessários porque quando as threads são suspensas, seus registradores devem ser salvos. Finalmente, assim como os processos, as threads podem estar no estado em execução, pronto ou bloqueado. No ambiente multithread, cada processo pode responder a várias solicitações concorrentemente ou mesmo simultaneamente, caso haja mais de um proces- sador. A grande vantagem no uso de threads é a possibilidade de minimizar a alocação de recursos do sistema, além de diminuir o overhead na criação, troca e eliminação de processos. Threads compartilham o processador da mesma maneira que processos e passam pelas mesmas mudanças de estado Concorrência e sincronização de processos6 (execução, espera e pronto). Por exemplo, enquanto uma thread espera por uma operação de E/S, outra thread pode ser executada (MACHADO; MAIA, 2017). A grande diferença entre aplicações monothread e multithread está no uso do espaço de endereçamento. Processos independentes e subprocessos têm espaços de endereçamento individuais e protegidos, enquanto threads compartilham o espaço dentro de um mesmo processo. Essa característica permite que o com- partilhamento de dados entre threads de um mesmo processo seja mais simples e rápido, se comparado a ambientes monothread (MACHADO; MAIA, 2017). Particularidades do compartilhamento de recursos Uma thread tem um contador de programa que controla qual instrução vai ser executada. Ela tem registradores, os quais contêm suas variáveis de trabalho correntes. Tem uma pilha, que contém o histórico de execução, com um bloco para cada função chamada, mas das quais ainda não houve retorno. Embora uma thread deva ser executada em algum processo, a thread e o seu processo são conceitos diferentes e podem ser tratados separadamente. Os processos são usados para agrupar recursos; as threads são as entidades programadas para execução na CPU (TANEMBAUM;WOODHULL, 2012). Porém, o problema desse tipo de implementação, conforme Machado e Maia (2017), é que o uso de processos no desenvolvimento de aplicações concorrentes demanda consumo de diversos recursos do sistema. Sempre que um novo processo é criado, o sistema deve alocar recursos para cada processo, consumindo tempo de processador nesse trabalho. No caso do término do processo, o sistema dispensa tempo para desalocar recursos previamente alocados. Outro problema a ser considerado é quanto ao com- partilhamento do espaço de endereçamento. Como cada processo tem seu próprio espaço de endereçamento, a comunicação entre processos torna-se difícil e lenta, pois utiliza mecanismos como pipes, sinais, semáforos, memó- ria compartilhada ou troca de mensagens. Além disso, o compartilhamento de recursos comuns aos processos concorrentes, como memória e arquivos abertos, não é simples. Silberschatz, Galvin e Gagne (2015) diz que os benefícios da programação com múltiplos threads podem ser divididos em quatro categorias principais: 1. Capacidade de resposta: tornar uma aplicação interativa multithread pode permitir que um programa continue a ser executado, mesmo que 7Concorrência e sincronização de processos parte dele esteja bloqueado ou executando uma operação demorada, o que aumenta a capacidade de resposta para o usuário. 2. Compartilhamento de recursos: os processos só podem compartilhar recursos por meio de técnicas como memória compartilhada e transmis- são de mensagens. Essas técnicas devem ser organizadas explicitamente pelo programador. No entanto, por default, os threads compartilham a memória e os recursos do processo ao qual pertencem. O benefício de compartilhar código e dados é que isso permite que uma aplicação tenha múltiplas threads de atividade diferentes dentro do mesmo espaço de endereçamento. 3. Economia: a alocação de memória e recursos para a criação de pro- cessos é dispendiosa. Já que os threads compartilham os recursos do processo ao qual pertencem, é mais econômico criar threads e permutar seus contextos. 4. Escalabilidade: os benefícios da criação de múltiplas threads podem ser ainda maiores em uma arquitetura multiprocessadora, em que as threads possam ser executadas em paralelo em diferentes núcleos de processa- mento. Um processo com uma única thread só pode ser executado em um processador, independentemente de quantos estiverem disponíveis. MACHADO, F. B.; MAIA, L. P. Arquitetura de sistemas operacionais. 5. ed. Rio de Janeiro: LTC, 2017. SILBERSCHATZ, A.; GALVIN, P. B.; GAGNE, G. Fundamentos de sistemas operacionais. 9. ed. Rio de Janeiro: LTC, 2015. STALLINGS, W. Arquitetura e organização de computadores. 8. ed. São Paulo: Pretice Hall, 2010. TANEMBAUM, A. S.; WOODHULL, A. S. Sistemas operacionais: projeto e implementação. 3. ed. Porto Alegre: Bookman, 2012. Leituras recomendadas DELGADO, J.; RIBEIRO, C. Arquitetura de computadores. 5. ed. Rio de Janeiro: LTC, 2017. PAIXÃO, R. R. Arquitetura de computadores: PCs. São Paulo: Érica, 2014. TANENBAUM, A. S.; AUSTIN, T. Organização estruturada de computadores. São Paulo: Pearson Prentice Hall, 2013. Concorrência e sincronização de processos8 Conteúdo:
Compartilhar