Baixe o app para aproveitar ainda mais
Prévia do material em texto
Concorrência e sincronização de processos Apresentação Um computador executa diversas atividades simultaneamente, processos oriundos das mais diversas funcionalidades que essa máquina tão surpreendente é capaz de desempenhar. O sistema operacional tem a função de realizar a comunicação entre o hardware e as ações que o usuário pode vir a executar em um computador. Nesta Unidade de Aprendizagem, você vai aprender sobre a sincronização de processos, ou seja, aplicações concorrentes. Uma vez que o computador executa diversos processos ao mesmo tempo, é importante saber como ele consegue administrar essas atividades. Você vai estudar também sobre possíveis problemas acerca do compartilhamento de recursos. Bons estudos. Ao final desta Unidade de Aprendizagem, 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.• Desafio Ao acessar páginas Web, você já notou que, ao longo dos anos, elas passaram a trazer muitos contextos diferentes? Antes viam-se apenas textos; hoje, além dos textos, veem-se também diversas imagens, vídeos, gifs, dentre outros elementos. Para solucionar o impasse, você percebe que deve haver a implementação de uma thread para que o desempenho da aplicação atenda às demandas do cliente. Descreva como as várias solicitações da aplicação do cliente serão atendidas pelo seu site. Infográfico Conforme Silberschatz (2015), um thread é uma unidade básica de utilização da CPU. É composto por um ID de thread, um contador de programa, um conjunto de registradores e uma pilha. Um 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. Os threads estão presentes em diversos níveis dentro de um processo. Dessa forma, é importante conhecer alguns conceitos de threads de modo usuário, modo kernel e modo híbrido. Confira no Infográfico a seguir. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. https://statics-marketplace.plataforma.grupoa.education/sagah/fa2286cd-6e01-4008-996a-80e44c446a8f/5f76f14c-691b-485a-b10d-1b9f54fb0266.png Conteúdo do livro Descobrir como um computador opera todas nossas ações diante de suas funcionalidades é genial. É impossível sequer imaginar a quantidade de componentes que fazem parte dessa ferramenta, todos funcionando de maneira simultânea. Na obra Sistemas operacionais, leia o capítulo Concorrência e sincronização de processos, no qual são abordados conceitos acerca dos processos, ou seja, o que compõe um processo. Você vai ver como o computador executa diversas atividades quase que simultaneamente e como se torna capaz de solucionar nossas necessidades diárias. Boa leitura. 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 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 comalguns 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 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 processo podemos 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 esincronizaçã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: Dica do professor A gerência de processos é uma atividade muito importante para o funcionamento computacional. Assim, os sinais são utilizados para notificar processos oriundos do próprio sistema operacional. Confira na Dica do Professor alguns conceitos acerca do tema. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. https://fast.player.liquidplatform.com/pApiv2/embed/cee29914fad5b594d8f5918df1e801fd/43b4556929c18977f5787b251370a9fb Exercícios 1) Ao serem salvos, todos os dados de controle do processador, registradores e outras informações do primeiro são substituídas por informações de processo do segundo. Esses conceitos são referentes a qual tipo de ação? A) Troca de processos. B) Criação de threads. C) Threads. D) Troca de registradores. E) Troca de programas. 2) Um processo é formado por três partes fundamentais, as quais são capazes de, juntas, manter as informações necessárias para a execução de um programa. Assinale a alternativa que apresenta essas três partes. A) Contexto de hardware, tempo de processador e espaço de endereçamento. B) Espaço de endereçamento, contexto de hardware e contexto de software. C) Registrador de PC, registrador de status e tempo de processador. D) Quotas, privilégios e tempo de processador. E) Registradores, contexto de software e registrador de status. 3) Quando um processo tem apenas um programa em seu espaço de endereçamento, estamos nos referindo a qual tipo de ambiente de atuação de uma thread? A) Multithread. B) Troca de processos. C) Monothread. D) Troca de contexto. E) Troca de registradores. 4) Em um processo, podemos localizar diversas informações. Um processo é composto por código, dados e arquivos e, em determinadas situações, haverá momentos em que teremos diversos registradores e pilhas agindo no mesmo processo. Assinale a seguir a alternativa que apresenta o conceito referente a esse contexto. A) Registrador de PC. B) Tempo de processador. C) Contexto de software. D) Monothread. E) Multithread. 5) Assinale a alternativa que apresenta o conceito implantado com o objetivo de reduzir o uso de recursos do sistema e o tempo gasto em criação de contexto de processos nas aplicações. A) Thread. B) Contexto de hardware. C) Contexto de software. D) Espaço de endereçamento. E) Registrador de status. Na prática Mal sabemos que, ao utilizarmos o computador, estamos quase que simultaneamente criando diversas threads e, assim, executando diversos processos. Pois bem, cada atividade desempenhada em um computador requer o processamento de diversas informações e, consequentemente, a organização completa do modo como tudo isso deve acontecer. Confira na prática como threads podem ser criadas por meio da programação dos computadores com a linguagem Java. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. https://statics-marketplace.plataforma.grupoa.education/sagah/9d408302-b356-44a1-a7f5-d20d72aff078/23dae5f1-49ce-42df-995c-bcd672e43feb.jpg Saiba + Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Sincronização e comunicação entre processos Assista ao vídeo para conhecer um pouco sobre a sincronização e a comunicação entre processos. A possibilidade de execução simultânea de mais de um processo faz com que o computador disponibilize diversos comportamentos possíveis diante desse contexto. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. Sincronização de processos Assista ao vídeo para conferir na prática como pode ser programada a sincronização, que corresponde à possibilidade de um processo ser executado quase que simultaneamente a outro, caso em que o computador deve aplicar métodos para permitir e organizar a execução dos processos. Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. Threads e sincronização e comunicação entre processos Assista ao vídeo para compreender mais sobre a thread, que pode ser considerada um programa que permite a divisão de um processo em diversos outros subprocessos, além de permitir aplicações concorrentes e compartilhamento de recursos pelo mesmo processo. https://www.youtube.com/embed/bRAEToyq3mg https://www.youtube.com/embed/txK7TN7d9kI Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar. https://www.youtube.com/embed/NucqOdjrprg
Compartilhar