INTRODUÇÃO AOS SISTEMAS OPERACIONAIS setembro/2013 SEMANA 08 Conceitos sobre processos. Modelos de processos, BCP, contextos, estados de processos. 1 - Introdução O processo computacional, ou simplesmente processo, é uma atividade que ocorre em um meio computacional com objetivo definido, duração finita e fazendo uso de uma quantidade limitada de recursos computacionais. Programa é o código fonte escrito em alguma linguagem de programação [por exemplo, C, Pascal, Fortran], e executável é esse código traduzido para a linguagem de máquina específica da máquina onde ele será executado. O programa é uma entidade passiva. Processo pode ser definido como um fluxo de controle sequencial e seu espaço de endereçamento, ou seja, é a execução de um programa junto com os dados usados por ele. Processo, de forma resumida, é então um programa em execução. Como exemplo, o mesmo programa pode ser executado ao mesmo tempo por dois usuários, gerando dois processos distintos. Além disso, na sua execução, um programa pode originar vários processos. O processo é uma entidade ativa. Um processo computacional é representado por uma estrutura de dados conhecida como Bloco de Controle do Processo [BCP, Process Control Block - BCP], também chamado de descritor do processo. 2 - Conceitos sobre processos Uma das principais tarefa do kernel é permitir a execução de aplicativos. Para isso, ele deve auxiliar a aplicação com recursos como abstrações de hardware e gerenciamento do processo. Para rodar uma aplicação, o kernel inicialmente cria um espaço de endereçamento para essa aplicação, carrega na memória o arquivo contendo as instruções do programa, cria uma pilha para essa aplicação e inicia a sua execução. Um kernel multitarefa é capaz de dar ao usuário a ilusão de que o número de processos que estão rodando simultaneamente é maior do que o número de processos que aquele sistema é fisicamente capaz de rodar. Mas na realidade, usualmente o número de processos que um sistema Introdução aos Sistemas Operacionais - www.jairo.pro.br 1/8 pode rodar simultaneamente é igual o número de processadores (ou de núcleos). A multitarefa pode ser preemptiva [multitarefa real] ou cooperativa. Na multitarefa preemptiva o kernel trabalha com uma fila de processos cedendo a cada um uma parcela de tempo [time slice] de processamento. Desse modo, o processador alterna de processo em processo rapidamente para dar ao usuário a impressão de que todos os processos estão sendo executados simultaneamente. A implementação da multitarefa preemptiva envolve o uso de algoritmos de escalonamento, para que o kernel determine qual processo deve ser executado em que momento e quanto tempo de processamento deve ser concedido. O algoritmo escolhido deve poder permitir que alguns processos tenham uma prioridade de processamento mais alta que os demais. O kernel geralmente também deve prover uma maneira de comunicação entre processos [IPC, Inter Process Communication]. Alguns exemplos de IPC são: • • • memória compartilhada; troca de mensagens; chamadas de procedimento remoto [RPC, Remote Procedure Call]. Praticamente todos os sistemas operacionais modernos implementam multitarefa preemptiva ou real. No passado havia a multitarefa cooperativa, onde cada processo tinha permissão de executar ininterruptamente até fazer uma requisição especial para avisar ao kernel para alternar para o próximo processo da fila. Embora a multitarefa cooperativa seja bem mais simples de implementar que a preemptiva, tem a contrapartida de travar o sistema inteiro com muita frequência, pois qualquer problema que ocorra com o processo que está executando impede a devolução do processador para o sistema operacional. Os antigos Windows 3.0, 3.1 e 3.11 usualmente rodavam sobre o sistema operacional MSDOS, que não implementava multitarefa alguma. Então o Windows, que à época era aplicação que fornecia ambiente gráfico, implementava multitarefa cooperativa para as aplicações para Windows. As versões antigas do Mac [Apple], embora não tivessem nada a ver com o MS-DOS, padeciam do mesmo mal. Para o caso de haver mais de um processador, o kernel deve suportar multiprocessamento simétrico [SMP1] ou acesso não uniforme à memória [NUMA2] para permitir que diferentes processos rodem simultaneamente em diferentes processadores. Para isso, o kernel deve suportar reentrância3 para poder rodar duas ou mais partes do código da aplicação simultaneamente. Isso exige mecanismos de sincronização para assegurar que dois processadores não tentarão modificar os mesmos dados ao mesmo tempo. 1 SMP: Symmetric Multi Processing. 2 NUMA: Non-Uniform Memory Access. 3 Reentrância: em programação, é a qualidade de uma subrotina ser executada concorrentemente de forma segura, isto é, de poder ser invocada enquanto estiver em execução. Introdução aos Sistemas Operacionais - www.jairo.pro.br 2/8 3 - Modelos de processos e estados de processos O modelo de processo serve para descrever o processo ao longo dos seus estados. Por exemplo, um modelo de três estados envolve apresentar o processo nos seguintes estados: rodando • • • pronto [ready]; rodando [running]; bloqueado [blocked]. 1 4 bloqueado A figura 1 mostra um modelo de processo com três estados, onde cada mudança de estado é uma transição que é representada por um número: 2 3 pronto Fig 1 – Modelo de processo com 3 estados 1 - O processo não pode continuar a execução pois espera por algum evento [I/O ou semáforo] para continuar; 2 - Escalonamento: o processo retorna ao processador; 3 - Escalonamento: acabou o tempo [slice] de processamento; 4 - Ocorre o evento esperado que mantinha o processo bloqueado. O processo, quando em execução na CPU, está no estado rodando [running]. Ao terminar sua quota de tempo para execução (slice de tempo), o escalonador o interrompe e o coloca no estado pronto. Ao chegar novamente a sua vez de executar, o escalonador invoca [acorda] esse processo para voltar a rodar, permitindo a sua continuação. Um processo pode ser bloqueado se os dados de entrada ainda não estiverem disponíveis e ele não poder continuar sua execução, e isto pode ocorrer pelo sinal enviado por outro processo ou pela própria decisão do escalonador. O processo é desbloqueado por um evento externo [chegada dos dados, sinalização de outro processo], e então passa ao estado pronto. Um processo pode ser definido como o ambiente onde a aplicação é executada. Este ambiente possui informações sobre essa execução e também o quanto de recursos do sistema cada processo pode utilizar, como o espaço de endereçamento, tempo de processador e área em sistema de arquivo. Um modelo de processo mais realista é apresentado na figura 2, com 5 estados. A expede [dispatch] admite novo pronto rodando timeout ocorre evento e er sp o ap to en v re libera exit [finaliza] bloqueado Fig 2 – Modelo de processo com 5 estados Introdução aos Sistemas Operacionais - www.jairo.pro.br 3/8 diferença entre este e o de 3 estados é incorporar tanto a criação de novos processos quanto finalização de processos. A partir da inicialização do sistema, processos podem ser criados e finalizados a qualquer momento. Os processos podem ser criados pelos usuários, para realizarem as suas tarefas, e também o sistema operacional cria processos em acordo com as suas necessidades. Também podem haver processos de serviço, como é o caso de um serviço de e-mail. Por exemplo, no caso do Unix o init é o primeiro processo do sistema [PID4=1], que ocorre logo após o boot. Todos os demais processos são filhos desse processo. A finalização de um processo tem um término normal [voluntário] quando a execução é finalizada através da chamada exit [Unix] ou ExitProcess [Windows]. Mas também poderia ser forçado o término por causa de algum erro fatal [bug no programa, divisão por zero, execução de instrução ilegal ou referência à memória inexistente], pois nessa situação o processo não tem como ser finalizado voluntariamente. O final também poderia ser causado por outro processo, como chamada kill [Unix] ou TerminateProcess [Windows], que é involuntário. Um processo é formado por três partes: contexto de hardware, contexto de software e espaço de endereçamento. 4 - BCP [PCB, Process Control Block] Um Bloco de Controle do Processo [BCP ou PCB], também chamado de Bloco de Controle de Tarefa, Estrutura da Tarefa ou Descritor de Processo, é uma estrutura de dados na memória primária que contém informação necessária para gerenciar um processo em particular. O BCP permite que o sistema operacional encontre informações chave a respeito do processo, por isso define um processo para o sistema operacional. Cada processo tem o seu BCP. Quando um usuário requisita a execução de alguma aplicação, o sistema operacional constroi o BCP para essa aplicação. A implementação do BCP difere de sistema para sistema. Em geral um BCP inclui, direta ou indiretamente, as seguintes informações: • • • • a identificador do processo (PID); valores de registradores para o processo, incluindo o contador de pograma e valores de stack; o espaço de endereçamento para o processo; prioridade do processo, que é uma parte da informação de escalonamento [por exemplo, no Unix nice ou renice]; 4 PID: Process IDentifier, identificador do processo, é um número inteiro. Introdução aos Sistemas Operacionais - www.jairo.pro.br 4/8 • • • • • • informação de contabilização do processo [process accounting information], por exemplo quando o processo processou pela última vez, quanto tempo de CPU o processo acumulou, etc; ponteiro para o próximo BCP, isto é, ponteiro para o BCB do próximo processo a rodar; informações de I/O, isto é, dispositivos alocados para o processo, lista de arquivos abertos, etc; ponteiro para o processo pai e, caso exista, ponteiro para o processo filho; o status do processo, se está rodando, pronto, bloqueado, etc; em caso de máquina multiprocessada, informação sobre qual processador o processo está rodando. Já que o BCP contém informação crítica sobre o processo, ele precisa ser mantido numa área de memória protegida do acesso de usuários normais. O BCP possui todas as informações do processo, que são contexto de hardware, contexto de software e espaço de endereçamento de cada processo [endereço de memória]. O sistema operacional implementa o conceito de processo através do BCP. 5 - Contextos Contexto de um processo são as informações necessárias para que o processo possa ser restaurado a partir do ponto em que foi interrompida a sua execução. Essa interrupção do processamento normalmente é feita pelo escalonador, e leva o processo para o estado pronto. Contexto é um conjunto de dados necessários para manter a execução do processo ao longo do tempo. A troca de um processo por outro no processador é chamada de troca de contexto [context switch]. Durante a troca de contexto, o processo que está rodando é parado e é passada a execução para outro processo. O kernel precisa parar a execução do processo que está rodando, copiar os valores dos registradores para o BCP do processo que estava rodando e atualizar os registradores com os valores do BCP do processo que vai iniciar a execução. O tempo que é gasto na troca de contexto é desperdiçado, pois nesse momento nenhum processo está rodando. Isso é chamado de overhead. A troca de contexto é dependente de suporte de hardware. Para efetuar o compartilhamento da CPU entre processos, o sistema operacional possui duas filas de controle: a de processos prontos [Ready-List] e a de processos bloqueados [Blocked-List]. A manipulação dessas filas depende da política de escalonamento adotada pelo sistema, que é um critério para determinar, entre os diversos processos no estado pronto, qual o próximo processo a executar. Introdução aos Sistemas Operacionais - www.jairo.pro.br 5/8 interrupção salva status BCP1 restaura status BCP0 pronto overhead restaura status BCP1 overhead pronto salva status BCP0 rodando interrupção processo P1 pronto sistema operacional rodando processo P0 rodando O escalonador de processos, com o auxílio de hardware, é o responsável pela escolha do processo que será executado pelo processador. O escalonador deve se preocupar com a eficiência do processador, pois o chaveamento de processos [switch] é complexo e custoso e afeta o desempenho do sistema. O escalonador de processo é um processo que deve ser executado quando da mudança de contexto, que é a troca de processo a ser processado. Fig 3 – Troca de contexto entre processos P0 e P1 A figura 3 mostra um exemplo de troca de contexto entre os processos P0 e P1. As ações necessárias para a troca de contexto são: • • • • • • • salvar o contexto do processador, incluindo o PC [Contador de Programa] e outros registradores; alterar o BCP do processo que está em execução [running]; mover o processo para a fila apropriada; selecionar outro processo para execução; alterar o BCP do processo selecionado para iniciar a execução; alterar as tabelas de gerência de memória; restaurar o contexto do processo selecionado para iniciar a execução. As condições para a troca de contexto de um processo são: • • • • • interrupção do relógio [clock]: fatia [slice] de tempo de posse do processador expirou; interrupção de I/O: resposta de um dispositivo de I/O; falta de memória: endereço de memória está na memória virtual [swap, disco]; trap [armadilha]: ocorrência de erro, que pode fazer com que o processo seja finalizado; supervisor call (SVC): é uma chamada de sistema que muda o sistema para o modo supervisor, para o sistema operacional poder requisitar serviços como, por exemplo, alocação de memória. O contador de programa [PC, Program Counter] é o registrador que indica o endereço [localização na memória] da próxima instrução a ser executada. Durante a execução de uma Introdução aos Sistemas Operacionais - www.jairo.pro.br 6/8 instrução, esse contador é incrementado com o valor do tamanho da instrução, de modo que ele passe a conter o endereço da instrução seguinte. O tamanho do PC é igual ao número de bits de endereço que o processador pode manipular. Assim, se a máquina trabalha com endereços de 16 bits, o PC terá 16 bits. O contador de programa também é conhecido por IC [Instruction Counter] ou IP [Instruction Pointer]. O contador de programas é o responsável pelo pseudoparalelismo, e garante que a qualquer instante exista somente um programa ativo no processador. Pseudoparalelismo é a sensação de que vários processos são executados simultaneamante num único processador. Um processo é representado por: • espaço de endereçamento, que é uma área de memória pertencente ao processo, onde as instruções e dados da aplicação são armazenados para execução. • contexto de hardware e de software, que são valores em memória do conteúdo dos registradores e características e limites dos recursos que podem ser alocados pelo processo. A figura 4 ilustra o contexto de hardware, contexto de software e espaço de endereçamento de um processo. A troca de contexto se resume em substituir o contexto de hardware de um processo pelo de outro. contexto de software contexto de hardware processo espaço de endereçamento Fig 4 – contexto e espaço de endereçamento do processo Quando um processo está em execução, o seu contexto de hardware está armazenado nos registradores do processador. No momento em que o processo perde a utilização do processador, o sistema salva essas informações no contexto de software do processo. Na troca de contexto de hardware, é necessário armazenar o conteúdo dos registradores gerais do processador e de uso específico, como o contador de programa [PC], o stack pointer5 [SP] e o registrador de status6 [PSW, Processor Status Word]. Na troca de contexto de software, é necessário especificar as características e limites dos recursos que podem ser alocados pelo processo, como prioridade para execução, privilégios, tamanho do buffer para operações de I/O etc. O contexto de software é formado por três grupos de informações: identificação, quotas e privilégios. 5 Registrador Stack Pointer [SP]: registrador “ponteiro da pilha” não existia na máquina de Von Newmann, mas hoje em dia faz parte da CPU de quase todos os computadores. É necessário porque todo programa em execução precisa usar uma pilha para realizar chamadas e retornos de procedimentos. Assim, cada programa possui uma pilha própria e o registrador SP indica o topo da pilha do programa correntemente em execução. Quando a execução passa de um programa para outro, o valor do SP é alterado para que ele passe a apontar para a pilha do novo programa em execução. 6 Registrador Processor Status Word [PSW]: registrador “palavra de estado do processador” ou “registrador de estado” não fazia parte da máquina de Von Newmann [nem existia nos computadores mais antigos], mas é essencial para o funcionamento de um sistema operacional moderno. Atualmente, faz parte de qualquer CPU. O uso desse registrador passou a ser necessário quando os computadores começaram a utilizar sistemas de interrupção. Introdução aos Sistemas Operacionais - www.jairo.pro.br 7/8 • identificação: PID, nome, UID [Identificação do usuário dono do processo, User IDentifier]; • quotas: são os limites de cada recurso do sistema que um processo pode alocar, como número máximo de arquivos abertos simultaneamente, tamanho máximo de memória primária e secundária, número máximo de operações I/O pendentes; • privilégios: definem as ações que um processo pode fazer em relação a ele mesmo, aos demais processos e ao sistema operacional. Privilégios que afetam o próprio processo permitem que suas características possam ser modificadas. Por exemplo: prioridade de execução, limites alocados na memória primária e secundária . O usuário que possui todos os privilégios são o root [Unix] e o Administrador [Windows]. O espaço de endereçamento é a área do processo onde as instruções e os dados do programa são armazenados para execução, onde cada processo possui o seu próprio espaço que não pode ser ocupado por outro processo. É a partir do BCP que o sistema operacional mantém as informações sobre o contexto de hardware, contexto de software e o espaço de endereçamento de cada processo. A tabela de processos é uma estrutura de dados que contém informações fundamentais para que o processo interrompido pelo escalonador possa voltar a executar exatamente a partir do ponto de parada, sem perda de dados ou inconsistências. Cada processo possui uma entrada na tabela de processos com um ponteiro para o bloco de controle de processo [BCP]. Introdução aos Sistemas Operacionais - www.jairo.pro.br tabela de processos BCP – processo 1 BCP – processo 2 BCP – processo 3 ... ... BCP – processo n Fig 5 – tabela de processos e BCP 8/8