Baixe o app para aproveitar ainda mais
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
Compartilhar