Buscar

Concorrência e Sincronização de Processos

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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:

Continue navegando