Guia de Sistemas Operacionais: Processos e Memória
Tipos de Sistemas Operacionais
Monotarefa
O sistema operacional tem capacidade de executar apenas um programa ou tarefa de cada vez.
Exemplo: CP/M, MS-DOS.
Multitarefa
Sistemas operacionais que têm a capacidade de executar mais de uma tarefa ou programa simultaneamente.
Exemplo: Unix, Windows, Linux, OS/400.
Multitarefa Cooperativa e Preemptiva
-- Cooperativa
O S.O. define uma fatia de tempo (time-slice) para cada programa. Ex.: Windows até 3.1.
-- Preemptiva
O S.O. define prioridades conforme a necessidade momentânea de cada programa.
O que é um Processo?
Um processo é um programa em execução; cada processo tem sua própria CPU virtual e passa por diversos tipos de estados:
- Novo: o processo está sendo criado;
- Em execução: as instruções estão sendo executadas;
- Em espera: o processo está esperando a ocorrência de algum evento (ex.: I/O);
- Pronto: temporariamente parado para dar lugar a outro processo;
- Encerrado: o processo terminou sua execução.
Estados de um Processo
Os estados principais são: Novo, Em execução, Em espera, Pronto e Encerrado.
UID (User IDentity): Número de identificação para um determinado usuário.
PID (Process IDentity): Número de identificação para um determinado processo (programa em execução).
Sistemas Batch, Tempo Compartilhado e Tempo Real
Sistemas Batch
Os sistemas batch (lote) caracterizam-se por terem seus programas armazenados em disco ou fita, onde esperam para ser executados sequencialmente. Os programas executados em batch não precisam de interação com o usuário; eles leem e gravam seus dados de discos ou fitas.
Sistemas de Tempo Compartilhado
Os sistemas de tempo compartilhado (time-sharing) permitem a interação dos usuários com o sistema, basicamente através de terminais de vídeo e teclado (interação on-line).
Sistemas de Tempo Real (Real Time)
São semelhantes em implementação aos sistemas de tempo compartilhado. A maior diferença é o tempo de resposta exigido na execução das tarefas. Existe a ideia de time-slice (fatia de tempo).
Estrutura de um Sistema Operacional
- Gerência de processos
- Gerência de memória: responsável pelo controle e alocação de memória aos processos ativos.
- Sistema de arquivo: responsável pelo acesso e integridade dos dados residentes em memória secundária (ex.: disco, fita, etc.).
- Controle de I/O (Entrada/Saída): responsável pelo controle e execução de operações de E/S, bem como da otimização do uso dos periféricos.
Conceitos de Threads
Uma Thread é uma unidade básica de utilização de CPU; compreende um ID de thread, um contador de programa, um conjunto de registradores e uma pilha.
Um processo multithread contém vários fluxos de controle distintos no mesmo espaço de endereçamento.
Exemplo: Um processador de textos pode ter uma thread para ler as entradas de dados do teclado e outra thread para efetuar a correção ortográfica do documento.
Observações sobre Threads
- As threads possuem estados (Novo, Executável, Bloqueado e Terminado).
- O sistema supervisor gerencia a tabela de threads.
Benefícios das Threads
- Capacidade de resposta;
- Compartilhamento de recursos;
- Economia;
- Utilização de arquiteturas multiprocessador.
Conceitos de Escalonamento de CPU
Escalonador de CPU: Sempre que a CPU estiver ociosa, o S.O. deverá escolher um processo para execução da fila de processos prontos.
Timer: Necessário para o escalonamento preemptivo. Controla o tempo que o processo pode ficar em execução (n-1).
Dispatcher (Executor): É um módulo que dá controle da CPU ao processo selecionado. O dispatcher é chamado a cada troca de processo.
O que é e para que serve um PCB?
O PCB (Process Control Block) é uma estrutura de dados que contém informações de um futuro processo, sendo também responsável por definir a utilização de recursos desse processo. Todo processo deve ter um PCB.
Finalidade dos Registradores PC e SP
- PC (Program Counter): Indica o próximo endereço de memória a ser executado.
- SP (Stack Pointer): Topo da pilha de dados. É onde é guardado o valor das variáveis desse programa.
O que é uma Thread?
É uma unidade que permite a execução simultânea de instruções de um processo. A criação de uma thread é mais rápida que a de outros processos, pois ela utiliza a estrutura do seu processo pai.
Necessidade do Escalonamento
O escalonamento de um processador é necessário? Por quê?
Sim, ele otimiza o processador de modo a gerenciar o recurso para que permaneça o maior tempo possível em execução.
Algoritmo SJF (Shortest Job First)
Em um algoritmo de SJF (Job mais curto), se o tempo de dois processos for igual, é dada maior prioridade ao que chegou primeiro.
Algoritmos de Escalonamento
Alg. Escalonamento Não Preemptivo: O algoritmo escolhe o processo para executar e o deixa rodar até que seja bloqueado (para I/O) ou voluntariamente libere a CPU.
Alg. Escalonamento Preemptivo: O algoritmo escolhe um processo e o deixa em execução por um tempo máximo fixado.
Gerenciamento de Memória e Fragmentação
O que é fragmentação interna?
É o espaço que sobra na partição após a carga do processo. Ocorre na alocação particionada estática.
O que é fragmentação externa?
Criada pela alocação particionada dinâmica. Após o término de alguns programas, podem existir espaços que não são sequenciais.
Estratégias de Alocação de Memória
- Best-Fit: Deixa o menor espaço possível sobrando na partição.
- Worst-Fit: O contrário da Best-Fit (escolhe o maior espaço).
- First-Fit: O primeiro espaço que pode comportar o processo é utilizado.
Critérios para Comparar Algoritmos
- Utilização de CPU: A CPU deve ficar o mais ocupada possível.
- Throughput: Quantidade de processos executados por unidade de tempo.
- Tempo de retorno: Intervalo entre a submissão e a conclusão.
- Tempo de espera: Soma dos períodos na fila de processos prontos.
- Tempo de resposta: Tempo para começar a responder ao usuário.
Escalonamento Round-Robin (RR)
Projetado para sistemas de tempo compartilhado. Cada processo recebe uma pequena unidade de tempo de CPU (quantum), usualmente 10-100 milissegundos. Após esse tempo, o processo é preemptado e volta ao fim da fila FIFO de processos prontos.
Alocação com Múltiplas Filas
- A fila de processos prontos é particionada em filas separadas.
- Cada fila tem seu próprio algoritmo de escalonamento.
- O escalonamento deve ser realizado entre as filas.
Perguntas Frequentes sobre Memória
Quais tipos de memórias existem?
Registradores, memória cache, memória principal e secundária.
Funções básicas do gerenciamento de memória:
Responsável por alocar processos conforme necessário e maximizar o compartilhamento da CPU e outros recursos.
Alocação contígua simples:
Utilizada em sistemas monotarefa. O problema é que só roda um processo por vez, resultando em subutilização da memória.
Alocação particionada estática realocável:
Proporcionada pela evolução dos compiladores, Linkers e Loaders. Um programa passa a ser executado em qualquer partição disponível.
Linker e Loader
- Linker: Liga o código objeto gerado pelo compilador com a biblioteca de execução da linguagem.
- Loader: Responsável por pegar o programa no disco e colocá-lo na memória.
Vantagem da memória estática realocável: O programa pode ser executado em qualquer uma das partições disponíveis.
Modelos de Alocação e Swapping
Alocação Contígua Simples: Memória dividida em duas partições: uma para o S.O. e outra para o usuário. Desvantagens: memória limitada e aproveitamento ineficiente.
Alocação Particionada Estática Absoluta: Memória dividida em partições de tamanho fixo na inicialização.
Alocação Particionada Estática Dinâmica: Reduz a fragmentação interna, pois cada programa utiliza o espaço que necessita, criando partições de tamanho variável.
Fragmentação e Soluções
Fragmentação Interna: Desperdício quando o programa é menor que a partição destinada.
Fragmentação Externa: Espaço total existe, mas não é contíguo. Solução: Compactação (deslocar blocos), possível apenas se a relocação for dinâmica.
Swapping: Um processo pode ser transferido temporariamente da memória principal para a secundária (backing store) e depois retornar.