Arquitetura de Sistemas Operativos Sistemas Operativos 2011/2012
1 Threads
Conceito Um processo é um programa em execução. A execução de um processo é sequencial: pode-se caracterizar um processo pelo seu trace (instruções executadas).
Conceito Um processo é mais do que um programa, pois inclui: secção de texto (ou programa); o conteúdo do contador de programa (PC, program counter); conteúdo dos registos do processador; a pilha (stack) do processo; secção de dados que contém as variáveis globais.
Conceito Esta noção de processo permite que vários utilizadores estejam a usar várias cópias do mesmo programa, ou que o mesmo utilizador possa abrir várias vezes o mesmo programa. Cada uma destas cópias é um processo separado: apenas as secções de texto são idênticas, as secções de dados, pilha, tabelas de ficheiros abertos, etc., são diferentes.
Representação Lógica de um Processo No sistema operativo, um processo é representado por um bloco de controlo do processo (PCB - Process Control Block).
Representação Lógica de um Processo O bloco de controlo do processo (PCB), às vezes chamado descritor de processo, é a maneira como um SO representa o conceito de um processo. Um PCB tem que conter um identificador único (valor inteiro chamado process ID ), este valor pode-se aceder através de uma chamada ao sistema (getpid em linux e getpid em windows).
Representação Lógica de um Processo Informação associada a cada processo: estado do processo: ver diagrama de estados, mais à frente; contador de programa (PC): indica o endereço da próxima instrução a ser executada; registos da CPU: incluem os acumuladores, registos de indexação, ponteiros de pilha, registos gerais, etc; informação de escalonamento da CPU: inclui prioridade do processo, ponteiros para filas de escalonamento, etc.
Representação Lógica de um Processo Informação associada a cada processo: informação de gestão de memória: inclui valores dos registos de base e de limite, tabelas de paginação (ou tabelas de segmentação); informação de inventário; informação de estado de entrada/saída (E/S ou I/O): inclui lista de dispositivos E/S ligados ao processo, lista de ficheiros abertos, etc.
Estado de um Processo Um processo em execução muda de estado: new: o processo está a ser criado; running: instruções estão a ser executadas; waiting: o processo está à espera que algum evento ocorra (receção de sinal ou o fim de alguma operação de E/S); ready: o processo está à espera que lhe seja atribuído o processador; terminated: o processo acabou de terminar a sua execução.
Diagrama de Estados de um Processo Só um processo pode estar no estado running. Podem haver vários processos no estado ready e no estado waiting.
Comutação e Escalonamento de De forma a maximizar a utilização do CPU, há que ter sempre um processo a correr, i.e., em execução. Além disso, num dado instante, só um processo pode usar um dispositivo de entrada/saída (E/S).
Comutação e Escalonamento de Isto obriga a que haja: comutação de contexto - a troca entre os processos em execução; processo num estado - estados representados por filas de processos; escalonamento - escolha dos processos das filas e movimentação entre as filas.
Comutação de Contexto A partilha do processador requer um mecanismo de comutação de processos, a que se dá o nome de comutação de contexto (context switching, em inglês). Comutação entre dois processos faz-se através da: salvaguarda do estado do processo que perde o CPU; restauro do estado do processo que ganha o CPU. A comutação deve ser frequente, mas não exagerada, tem um custo overhead (sobrecarga em português) para o sistema.
Comutação de Contexto
Filas de Escalonamento de Normalmente, todo o recurso tem associada uma fila de escalonamento. Ready Queue - Esta fila contém os PCB s dos processos residentes em memória que estão no estado ready, i.e., processos que estão prontos e à espera de executar. Waiting Queues - Se um processo espera a conclusão de E/S ou outro dispositivo, é colocado na fila de espera do dispositivo em causa.
Filas de Escalonamento de Um novo processo é inicialmente colocado na ready queue. O processo fica à espera na ready queue até ser selecionado e despachado para o CPU.
Filas de Escalonamento de Durante a sua execução várias coisas podem acontecer: o processo pode emitir um pedido E/S, e consequentemente ser colocado numa I/O device queue; o processo pode criar um novo subprocesso (fork), ficando à espera que ele termine; o processo pode ser removido do CPU em consequência de uma interrupção, o que o faz transitar para a ready queue. entre outras...
Filas de Escalonamento de
Escalonadores Um processo migra entre várias filas de escalonamento durante o seu tempo de vida. O sistema operativo deve selecionar processos destas filas com base em algum método ou algoritmo. Existem vários tipos de escalonadores - vamos caracterizar três tipos: curto prazo; médio prazo; longo prazo.
Escalonamento de curto-prazo Seleciona que processos devem ser executados de seguida e reserva, consequentemente, o CPU. Escalonador de curto-prazo é invocado com bastante frequência (milissegundos) (tem de ser rápido).
Escalonamento de médio-prazo Ideia base: swapping Remover processos da memória (i.e., remover o grau de multiprogramação).
Escalonamento de médio-prazo Mais tarde, estes processos podem ser re-introduzidos na memória e continuar a sua execução onde tinham sido deixados. Pode assim conseguir-se uma melhor mistura de processos, ou então libertar memória principal para outros processos.
Escalonamento de médio-prazo
Escalonamento de longo-prazo Seleciona que processos devem ser levados para a fila ready. Escalonador de longo-prazo é invocado com pouca frequência (segundos, minutos) (pode ser lento). Controla o grau de multiprogramação.
Operações sobre Criação de processos: o processo progenitor (pai) cria processos progénitos (filhos), os quais, por sua vez, criam outros processos, formando uma árvore de processos. Modos de execução: pai e filho(s) executam concorrentemente; pai espera até que o(s) filho(s) terminem.
Operações sobre Ocupação da memória: o filho duplica o espaço do pai; o filho carrega um novo programa. Partilha de recursos: pai e filhos partilham todos os recursos; filhos partilham um subconjunto dos recursos do pai; pai e filhos não partilham quaisquer recursos. Criação de processos em UNIX: a chamada ao sistema fork cria um novo processo; a chamada ao sistema exec depois de um fork é usada para substituir o espaço de memória do processo com um novo programa.
Operações sobre - Modos de terminação Terminação normal: um processo termina quando acaba a execução da sua última instrução, e pede ao sistema operativo para o eliminar através da chamada ao sistema exit. Nesta altura: o processo devolve eventualmente dados ao seu progenitor (via chamada ao sistema wait); recursos do processo progénito são libertados pelo sistema operativo.
Operações sobre - Modos de terminação Terminação abruta: o pai pode terminar a execução dos processos filhos através da chamada ao sistema abort. filho excedeu os recursos que lhe foram reservados; a tarefa atribuída ao filho não é mais necessária; o pai está a terminar, o que obriga os seus filhos a terminar.
Avaliação - Trabalho Teórico-Prático 2 Descreva um dos seguintes conceitos num texto. 1 2 Diagrama de estados de um processo 3 Comutação e escalonamento de processos: 3.1 comutação de contexto 3.2 escalonamento O texto deverá: ser elaborado em grupo; enviado por email ao professor no final da aula; e deverá conter entre 250 a 500 palavras.
Threads Conceito Uma thread é um processo mais leve (lightweight process), tendo múltiplos fluxos de execução no mesmo processo. Um processo tradicional é igual a uma tarefa apenas com uma thread.
Threads Conceito Mecanismo para criar fluxos de execução, partilhando um contexto comum:
Threads Conceito Uma thread partilha com outras threads pares (peers): a secção de código; a secção de dados; os recursos do SO. Coletivamente tudo isto é conhecido como tarefa (task em inglês).
Threads Conceito Numa tarefa com múltiplas threads, enquanto uma thread está bloqueada e à espera, uma segunda thread na mesma tarefa pode executar. Cooperação de múltiplas threads no mesmo job confere maior vazão (throughput) e melhoria no desempenho. Aplicações que requerem partilha de dados beneficiam ao utilizar threads.
Threads Exemplo - Processador de Texto Multithreaded A ideia é usar uma thread por tarefa: uma thread para interagir com o utilizador (teclado e rato); uma thread para formatar o texto (em background); uma thread para guardar o ficheiro periodicamente no disco.
Threads Threads vs. Porque não usar só processos? obrigam ao isolamento: espaços de endereçamento disjuntos; dificuldade em partilhar. Eficiência na criação e comutação.
Threads Partilha de recursos com Threads Threads de um mesmo processo podem partilhar a maior parte dos recursos, com excepção da stack e do estado do processador:
Threads Estado de uma Thread Tal como um processo, uma thread pode estar num de 3 estados:
Threads Estado de uma Thread A informação específica a manter por cada thread é relativamente reduzida: o seu estado (pode estar bloqueado à espera de um evento); o estado do processador (incluindo o SP e PC); a stack.
Threads Uso de Threads Threads de um mesmo processo podem partilhar muitos recursos, incluindo o espaço de endereçamento: são particularmente apropriados para aplicações consistindo em atividades concorrentes.
Threads Uso de Threads Por exemplo um servidor da Web: recebe e processa pedidos de páginas da Web; as páginas da Web são ficheiros guardados em disco; mantém as páginas acedidas mais recentemente em memória, cache; se a página pedida não estiver na cache, o servidor tem que ir ao disco.
Threads Uso de Threads Servidor da Web com uma única thread (ou um processo): se a página pedida não estiver na cache, o servidor tem que ir ao disco, bloqueando; enquanto a página não for posta para memória, o servidor não pode processar outros pedidos; o número de pedidos que este servidor pode processar por unidade de tempo é muito baixo.
Threads Uso de Threads Servidor da Web com múltiplas threads: uma thread, o dispatcher, recebe os pedidos e passa-os a outras threads, os worker; cada worker thread processa um pedido de cada vez: pode usar operações de E/S que bloqueiem.
Threads Implementação Threads podem ser implementadas: diretamente pelo SO: Kernel-level Threads; por código que executa em user-level, i.e., acima do SO: User-level Threads.
Threads Kernel-level Threads O kernel suporta processos com múltiplos threads: as threads são as entidades que disputam o CPU. O SO mantém uma tabela de threads com a informação específica a cada thread. O PCB de um processo aponta para a sua tabela de threads.
Threads Kernel-level Threads Todas as operações de gestão de threads, por exemplo criar uma thread, requerem a execução de chamadas ao sistema.
Threads User-level Threads O kernel não sabe da existência das threads: são implementados inteiramente por uma biblioteca em user-space; podem ser implementados num SO que não suporta threads.
Threads User-level vs. Kernel-level Threads Vantagens: o SO não precisa suportar threads. evita a intervenção do kernel em muitas operações, por exemplo criação/terminação de threads e comutação de threads.
Threads User-level vs. Kernel-level Threads Desvantagens: page-fault por uma thread bloqueia as restantes threads do processo; incapazes de explorar paralelismo em arquiteturas multiprocessador.
Threads Nota Page-fault: é uma interrupção (ou exceção) disparada pelo hardware quando um programa acede a uma página mapeada no espaço de memória, mas que não foi carregada na memória física do computador. Uma página é um bloco de memória de tamanho fixo, utilizada como uma unidade de transferência entre a memória física e um dispositivo de armazenagem externo como, por exemplo, um disco rígido.
Threads Implementação Híbrida A ideia é multiplexar user-level threads sobre kernel-level threads. O kernel não está a par dos user-level threads. A biblioteca de user-level threads atribui estes aos kernel-level threads.
Threads Implementação Híbrida
Threads Avaliação - Trabalho Teórico-Prático 3 Descreva um dos seguintes conceitos num texto. Conceito de thread Threads versus processos Descrever os vários estados de uma thread User-level versus Kernel-level threads O texto deverá: ser elaborado em grupo; enviado por email ao professor no final da aula; e deverá conter entre 250 a 500 palavras.