Buscar

01 - Concorrencia, processos e threads

Prévia do material em texto

Concorrência
Nos sistemas Monoprogramáveis somente um programa pode estar em execução por vez,
permanecendo o processador dedicado a esta única tarefa. Os recursos como memória,
processador e dispositivos de ES eram utilizados com pouca eficiência. Os sistemas
multiprogramáveis surgiram para melhorar questões sobre essas limitações;
A figura abaixo ilustra o desperdício do processador, porque enquanto uma operação de ES é
executada, o processador aguarda ocioso.
Nos sistemas multiprogramáveis, vários programas podem estar residentes em memória,
concorrendo pela utilização do processador. Dessa forma, quando um programa solicita uma
operação de ES, outro programa pode fazer o uso do processador.
Quando um programa perde o uso do computador e o retoma depois de alguma operação,
seu estado deve ser idêntico ao momento em que foi interrompido.
Interrupções e exceções
Durante a execução de um programa podem ocorrer alguns eventos inesperados,
ocasionando um desvio forçado no fluxo de execuções. Estes tipos de eventos são
conhecidos como interrupções ou exceções e podem ser consequência da sinalização de
algum dispositivo de hardware externo ao processador ou da execução de instruções do
próprio programa.
Uma interrupção é sempre gerada por algum evento externo ao programa e, nesse caso,
independe da instrução que está sendo executada. Exemplo: um dispositivo avisa ao
processador que alguma operação de ES está concluída, e nesse caso o processador deve
interromper o programa para tratar o término da operação.
Fluxo na interrupção: execução do programa A, interrupção ou exceção, salvar o conteúdo
dos registradores, identificar a origem do evento, obter o endereço da rotina de tratamento,
executar a rotina de tratamento, restaurar o conteúdo dos registradores, continuar a execução
do programa A.
Processos
O conceito de processos é fundamental para a implementação de um sistema
multiprogramável. De uma maneira geral, um processo pode ser entendido como um
programa em execução e todos os programas em execução estão associados a processos.
Na visão da camada de hardware, o processador executa instruções sem distinguir quais
programas estão em execução. É de responsabilidade do SO implementar a concorrência
entre programas gerenciando a alternância de execução de instruções na CPU de maneira
controlada e segura.
Na concorrência entre processos, quando o SO decide interromper um processo X, ele salva
o conteúdo dos registradores no processo X, executa as instruções de outro processo Y, até
uma nova interrupção que salva o conteúdo dos registradores no processo Y, carrega nos
registradores o conteúdo que foi adicionado ao processo X e continua a execução das
instruções conforme o ponto em que o processo foi interrompido.
Um processo pode ser melhor definido como o ambiente em que um programa é executado.
Este ambiente possui também a quantidade de recursos do sistema que cada programa pode
utilizar, como o espaço de endereçamento da memória principal, tempo do processador e
área em disco.
Há quatro eventos que fazem com que processos sejam criados:
1. início do sistema;
2. execução de uma chamada de sistema de criação de processo por um processo em
execução;
3. uma requisição do usuário para criar um novo processo (clicando em ícones, por
exemplo);
4. início de uma tarefa em lote (batch job).
Muitas vezes um processo fará chamadas de sistemas para criar um ou mais processos para
ajudar em seu trabalho, mas interagindo de maneira diferente. Exemplo: grande quantidade
de dados de entrada pela rede pode ser resolvida com a criação de dois processos, um para
buscar e armazenar e outro para remover e processar.
As seguintes condições podem ser razões para o término de um processo:
1. saída normal;
2. por erro (na compilação, p.e.);
3. erro fatal (referência a memória inválida, divisão por zero, p.e.) ;
4. cancelamento por outro processo.
Na maioria das vezes os processos terminam porque terminaram seu trabalho. Ao fechar um
programa pelo ícone, o usuário está terminando um processo por saída normal.
Hierarquia de processos: Um processo pode criar outros processos (filhos), que por sua vez
também podem criar mais processos.
Estados de processos: Embora muitas vezes os processos são independentes, a entrada de
um processo pode depender da saída de outro. Os três estados possíveis são: execução,
espera e pronto.
Um processo é formado por três partes: contexto de hardware, contexto de software e
espaço de endereçamento.
Contexto de hardware: armazena o conteúdo dos registradores gerais da CPU, além dos
registradores de uso específico, como program counter (PC), stack pointer (SP) e registrador
de status.
Contexto de software: limites e características de recursos que podem ser alocados pelo
processo, como número máx de arquivos abertos simultaneamente, prioridade de execução,
tamanho do buffer.
Espaço de endereçamento: área de memória pertencente ao peocesso onde instruções e
dados do programa são armazenados para execução. Cada processo possui seu próprio.
Um processo é implementado pelo SO através de uma estrutura chamada bloco de controle
de processo (PCB). O PCB de todos os processos ficam na memória principal em uma área
exclusiva do SO.O PCB tem a seguinte estrutura:
Ponteiros, estado do processo, nome do processo, prioridade do processo, registradores,
limites de memória, lista de arquivos abertos.
Threads
A principal razão para existirem threads é que em muitas aplicações ocorrem múltiplas
atividades ao mesmo tempo. O modelo de programação se torna mais simples se
decompomos uma aplicação em múltiplos threads sequenciais que executam quase em
paralelo. É um conceito parecido ao de processos paralelos, porém compartilhando os
mesmos espaços de endereçamento. É essencial em muitas aplicações onde o esquema de
múltiplos processos não funciona.
Um segundo argumento para a existência de threads é que são mais fáceis de criar e destruir
por não ter recursos associados. Em muitos sistemas, criar um thread chega a ser cem vezes
mais rápido do que criar um processo.
Um terceiro ponto é a velocidade e utilização do processador quando o sistema tem mais
operações de ES do que processamento. Dessa forma, os threads permitem que as
atividades se sobreponham acelerando a aplicação.
São muito úteis em sistemas com múltiplos CPUs, para os quais o paralelismo real é possível.
Real porque a execução de vários processos/threads concorrentes fazem gerar esta
impressão, porém não é um paralelismo.
Processos são usados para agrupar conteúdos. Threads são entidades escalonadas para a
execução sobre a CPU, ou seja, permitir que múltiplas execuções ocorram no mesmo
ambiente do processo, com um grande grau de dependência uma da outra.
Quando um processo com múltiplos threads é executado em um sistema com uma única CPU,
os threads esperam a vez pra executar. Ao chavear entre vários processos, o sistema da a
ilusão de processos sequencias distintos executando em paralelo. O multithread funciona do
mesmo modo. A CPU alterna rapidamente entre os threads, dando a impressão que estão
sendo executados em paralelos.
Exemplos multithreads:
 Editor de texto escrito para trabalhar com dois threads pode fazer com que as
operações/refatorações do texto sejam feitas por um thread enquanto a interação com o
usuário seja feita por outro. Outros threads podem fazer o salvamento automático do
conteúdo do arquivo. Processos não funcionariam neste caso porque utilizam contextos
e espaços de endereçamento diferentes;
 Planilha eletrônica atualizando as células quando o usuário muda o valor;
 Servidor web recebe requisições e usa threads para buscar o conteúdo na cache da
memória ou em disco, enquanto outros threads buscam outros arquivos e gerenciam
estes (despachante).
Assim como em processos tradicionais, um thread pode estar em um dos váriosprocessos:
execução, bloqueado (espera), pronto ou finalizado.
Arquitetura e implementação de threads
Há três modos para a implementação de threads: espaço do usuário, no núcleo e híbrido.
Threads em modo usuário: são implementadas na aplicação e não no sistema operacional.
Para isso deve existir uma biblioteca de rotinas que possibilite à aplicação realizar tarefas
como criação e eliminação de threads, troca de mensagens entre threads e uma política de
escalonamento. São rápidos e eficientes por dispensarem acesso ao kernel do sistema. Neste
modo, tem que implementar rotinas para executar threads quando o processo inteiro fica em
estado de espera (em SO sem multithread). Não é possível tomar vantagem de múltiplos
processadores.
Threads em modo kernel: implementadas diretamente pelo núcleo do sistema operacional,
através de chamadas de rotinas do sistema que oferecem todas as funções de gerenciamento
e sincronização. O SO sabe da existência de cada thread e escaloná-lo individualmente. Em
múltiplos processadores os threads de um mesmo processo podem ser executadas
simultaneamente. O grande problema é o tempo de operação alto por ter que fazer chamadas
a rotinas do sistema.
Threads em modo híbrido: Combina as vantagens dos dois modos usuário e kernel. O
programador precisa associar as threads em modo usuário com as threads em modo kernel.
O ponto ruim é que ele herda os problemas dois dois modos também.
Referências
MACHADO, Francis B.; MAIA, Luiz P. Arquitetura de Sistemas Operacionais. 4. ed. Editora
LTC, 2011.
TANENBAUM, Andrew Sistemas operacionais modernos. 3. ed. São Paulo: Editora Pearson,
2010.
Questões
1. Explique o que são sistemas monotarefa e multitarefa.
2. Como funciona a interrupção de um processo X para a execução de um processo Y?
3. O que é um processo? Qual sua estrutura?
4. O que é um thread? Quais as semelhanças de processos e threads?
5. Como funciona o multithread com múltiplos processadores (multicore)?
	Concorrência
	Interrupções e exceções
	Processos
	Threads
	Referências
	Questões

Continue navegando