Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Sistemas Operacionais Processos e Threads Parte I Prof. Esp. Alan Rafael Ferreira dos Santos Universidade Federal do Piauí – UFPI Campus Senador Helvídio Nunes de Barros – Picos –PI Bacharelado em Sistemas de Informação 1 1. Processos Todos os computadores modernos conseguem executar mais de um processo ao mesmo tempo. Em qualquer sistema multiprogramado, a CPU chaveia programa para programa. Um programa é executado em cada segundo, dando a ilusão ao usuário de paralelismo (pseudoparalelismo). O paralelismo de hardware só é constatado nos sistemas multiprocessadores. Desenvolvimento de um modelo de projeto conceitual sobre paralelismo (processo sequencial). 1.1 Modelo de Processos Um processo é apenas um programa organizado de maneira sequencial em execução, acompanhado dos valores atuais do contador de programa (PC), dos registradores e das variáveis. A CPU troca a todo momento de um programa para outro, este mecanismo de troca é chamado de multiprogramação. É preciso distinguir processo de programa, apesar da sutil diferença. O processo constitui uma atividade, se um programa é executado mais de uma vez ele gera mais de um processo. 1.1 Modelo de Processos 1.2 Criação de Processos O S.O. precisa de um mecanismo para criação de processos. De maneira geral, existem quatro eventos principais que compõe um processo: Início do Sistema; Chamada de sistema de criação por um outro processo em execução; Requisição de criação de processo pelo usuário; Início da tarefa (batch job). Criação de processo de primeiro plano (foreground) e segundo plano (background). 1.3 Término de Processos Um processo não é para sempre, cedo ou tarde ele irá finalizar sua execução, geralmente em razão destas condições: Saída normal (voluntário) Saída por erro (voluntário) Erro fatal (involuntário) Cancelamento por outro processo (involuntário) 1.4 Hierarquia de Processos Um processo poderá fazer uma chamadas de sistema (system calls) para criar novos processos. Neste caso há a hierarquia pai e filho. Os processo filhos também podem criar novos processo. No UNIX existe bifurcação de processo para cada terminal, gerando uma árvore ao fim. O WINDOWS não apresenta conceitos de hierarquia de processos, ou seja, todos são iguais, porém ele pode identificá-los por um identificador especial (handle), que pode ser usado para controlar os filho. 1.5 Estados de Processo Cada processo é uma entidade independente, porém o mesmo precisa interagir com outros processos. A execução de processos concorrentes precisam ser controlados por estados: Em execução (usando a CPU) Pronto (executável, parado para dar lugar a outro processo) Bloqueado (incapaz de executar, aguardando ocorrer um evento) 1.5 Estados de Processo 1.5 Estados de Processo Na execução concorrente, seguindo os estados vistos anteriormente, a transição 1 de um processo é feitas pela S.O. quando ele descobre que o mesmo não pode prosseguir. O escalonador (o nível mais baixo do S.O.) causa as transições 2, 3, o mesmo faz decisões de tempo para cada processo (veremos em aulas posteriores ). A transição 4 ocorre quando acontece um evento externo que o evento está aguardando (como esperar a chegada de uma entrada). 1.6 Implementação de Processos O S.O. mantém uma tabela de processo (um arranjo estruturado) ou process control blocks ( bloco de controle de processo), esta estrutura sustenta informações sobre estados de processos. Todas as informações sobre processos que devem ser salvas ficam armazenadas nesta tabela no ato de transição de estados. 1.6 Implementação de Processos 2. Threads Thread é uma forma do processo dividir a si mesmo em duas ou mais tarefas. Thread é um fluxo de controle independente que pode ser executado quase que em paralelo (concorrentemente). Mantém o mesmo espaço de endereçamento. 2. Threads A divisão da complexidade faz com que os threads sejam executados mais rápidos. Mais fáceis de criar e destruir. Em muitos sistemas criar um thread é cem vezes mais rápido do que criar um processo. Um processo pode ser composto por várias threads que partilham o mesmo espaço de endereçamento Processos diferentes possuem recursos diferentes... ... Mas um conjunto de threads dentro do mesmo processo partilha os mesmos recursos 2. Threads Modelo clássico por cada processo existe uma só thread neste caso processo e thread correspondem ao mesmo conceito 15 Processo 1 Processo 2 Processo 3 Thread 1 Thread 2 Thread 3 2. Threads Modelo atual por cada processo podem existir várias threads Cada thread tem registos, program counter, stack e estado próprios 16 Processo 1 Processo 2 Processo 3 Threads 2. Threads Utilização de threads – Exemplos: Processador de texto – podem existir threads para: Ler input do teclado Atualizar uma linha Salvar o documento automaticamente Reformatar o documento, etc. Web Server – dois tipos de threads “dispatcher” – sempre que chega um pedido de página, a thread “dispatcher” lança uma thread “worker” “worker” – procura a página pedida na cache de páginas, caso não a encontre, terá que ir buscá-la ao disco 17 2. Threads Threads de Usuário e Threads de Núcleo - Threads são dividas em Threads de Usuário e de Núcleo; Thread de Usuário: o núcleo não sabe o que é thread. O Sistema Supervisor é quem escalona as threads, no nível do usuário; Thread de Núcleo: o núcleo reconhece threads e pode escaloná-las; 18 18 Um pacote de threads de usuário 19 2.1 Implementação de Threads de Usuário 19 2.1.1 Thread de Usuário Threads ficam no espaço de usuário; Núcleo apenas faz gerenciamento comum de processos monothreads; Vantagem óbvia: threads de usuário podem ser implementadas em um SO que não suporta threads; As threads executam no topo do Sistema Supervisor; 20 20 2.1.1 Thread de Usuário Contém uma coleção de procedimentos: Thread_create; Thread_exit; Thread_wait; Thread_yield; 21 21 2.1.1 Thread de Usuário Sistema Supervisor Há uma tabela de threads por processo; Quando uma thread executa uma instrução que possa bloqueá-lo (read), ele chama um procedimento do sistema supervisor; Caso o procedimento perceba que a chamada da thread vai bloqueá-la, o sistema supervisor coloca uma nova thread para executar (se não, bloquearia todo o processo); 22 22 2.1.1 Thread de Usuário Vantagens de Threads de Usuário Cada processo pode ter um algoritmo de escalonamento personalizado; Já que o espaço da tabela de threads não é colocado no núcleo, escala melhor. Seria um problema caso houvesse muitas threads; 23 23 2.1.1 Thread de Usuário Desvantagens de Threads de Usuário: Se uma thread bloquear, bloqueia todas as outras; Possível solução: usar comando Select (verifica se uma chamada read vai bloquear a thread); A thread inicial precisa ceder a vez de execução para outras threads (thread_yield); 24 24 Um pacote de threads gerenciado pelo núcleo 25 2.2 Implementação de Threads de Núcleo 25 Não há necessidade de sistema supervisor, já que o escalonador do SO já faz esse papel; Há uma única tabela de threads; Criação ou destruição de threads: chama-se o núcleo; O núcleo toma a decisão de qual thread irá executar após o bloqueio de outra (escalonador); O núcleo faz reciclagem de threads, visto que é “caro” criar uma thread de núcleo em comparação com threads de usuário; Não há mais o problema de uma thread bloquear as outras; 26 2.2.1 Threads de Núcleo 26 Multiplexação de threads de usuário sobre threads de núcleo 27 2.3 Implementações Híbridas 27 Criação de um novo thread quando chega uma mensagem (a) antes da mensagem chegar (b) depois da mensagem chegar 28 2.4 Threads Pop-Up 28 Unix: Thread de Usuário; Linux: Thread de Núcleo. É possível usar apenas Thread de Usuário para manter compatibilidade com Unix; Uso da chamada ao sistema Clone; Windows: Thread de Núcleo; 29 2.5 Implementação de Threads 29 3. Comunicação entre Processos Frequentemente processo precisam se comunicar com outros nos estágios do pipelinig, a saída de um processo pode ser a entrada de outro processo. As comunicações devem ser feitas de maneira estruturada e sem interrupuções (IPC – Interprocess Communication). O problema de condições de disputas poderão ser geradas. O programa que estiver utilizando o acesso a memória ou arquivo compartilhado é chamado de região crítica. A região crítica e uma solução para a condição de disputa, porém não é uma solução correta e eficiente usando dados compartilhados. ** veremos mais adiante. 3. Comunicação entre Processos É necessário implementar uma técnica de bloqueio de variáveis ou arquivos compartilhados chamada de exclusão mútua para que nenhum processo acesse o espaço do outro. Quatro condições necessárias para prover exclusão mútua: Nunca dois processos simultaneamente em uma região crítica. Nenhuma afirmação sobre velocidades ou números de CPUs. Nenhum processo executando fora de sua região crítica pode bloquear outros processos. Nenhum processo deve esperar eternamente para entrar em sua região crítica. 3.1 Problemas e Soluções da Região Crítica Variável Trava Chaveamento Obrigatório Solução de Peterson Dormir e Acordar Semáforos Mutexes Monitores Barreiras Atividade Prática Desenvolva um código onde haja uma condição de disputa de varáveis ou recursos e seja necessário criar uma variável auxiliar de trava (Ex.: se lock = 1 então processo trava, lock = 0 processo executa).
Compartilhar