Skip to content
Gustavo Oliveira Quinteiro edited this page Jun 8, 2019 · 3 revisions

Sistema Operacional

Um sistema operacional pode ser visto de como:

  • uma abstração do hardware, intermediando os softwares e o hardware, numa visão top-down
  • um gerenciador de recursos (memória, disco, periféricos), controlando os processos e seus recursos, numa visão bottom-up

Sendo projetado para ocultar as particularidades de hardware e, com sua atuação, criar uma máquina abstrata que fornece às aplicações serviços compreensíveis ao usuário, o sistema operacional está presente em todos os dispositivos computacionais:

  • Windows, Linux, MacOS, família BSD: para desktops, servidores ou notebooks
  • Android, iOS: para dispositivos mobile

Processos

Em computação, um processo é uma instância de um programa de computador que está sendo executada. Ele contem o código do programa e sua atividade atual.
Um programa de computador é uma coleção passiva de instruções, enquanto que um processo é a execução real dessas instruções. Vários processos podem ser associados com o mesmo programa. Por exemplo, abrir várias instâncias do mesmo programa geralmente significa que mais de um processo está sendo executado.

Dentre os processos, podemos destacar dois principais tipos que estão relacionados a seu local de execução, no caso CPU e Entrada e Saída de dados.

  • Processos CPU bound (orientados à CPU): são processos que utilizam muito o processador, em que o tempo de execução é definido pelos ciclos de processador.
  • Processos I/O bound (orientados à E/S): são processos que realizam muitas operações de entrada e saída de dados, em que o tempo de execução é definido pela duração destas.

Gerenciamento da CPU

A CPU (Central Processing Unity) de um computador é a peça fundamental para a execução das aplicações solicitadas pelo usuário. Uma peça tão disputada entre os processos das aplicações deve ter um gerenciamento refinado para que todas as requisições sejam atendidas, para isso tem-se o escalonador de processos.

Escalonador de processos

O escalonador de processos enfileira todos os processos que estão aptos a serem executados na CPU, de acordo seu algoritmo de escalonamento.
Alguns dos algoritmos implementados aqui foram:


First Come First Served

É um algoritmo de escalonamento para estruturas de dados do tipo fila. Apresenta o seguinte critério: o primeiro elemento a ser retirado é o primeiro que tiver sido inserido, é um algoritmo de escalonamento não preemptivo que entrega a CPU os processos pela ordem de chegada. Ele executa o processo como um todo do inicio ao fim não interrompendo o processo executado até ser finalizado, então quando um novo processo chega e existe um ainda em execução ele vai para uma fila de espera. Esta fila de espera nada mais é do que uma fila que organiza os processos que chegam até eles serem atendidos pela CPU.
O algoritmo FIFO não garante um tempo de resposta rápido pois é extremamente sensível a ordem de chegada de cada processo e dos antecessores (se existirem) e se processos que tendem a demorar mais tempo chegarem primeiro o tempo médio de espera e o turnaround acabam sendo aumentados.


Shortest Job First

É uma política de escalonamento que seleciona para ser executado o processo com o menor tempo de execução.[1] SJF é um algoritmo não-preemptivo.
O escalonamento SJF é vantajoso por sua simplicidade e também porque minimiza o tempo médio que cada processo leva desde quando ele é criado até o fim de sua execução, incluindo aqui o tempo de espera entre o momento em que ele é criado e o momento em que é selecionado para executar. No entanto, essa estratégia pode levar a inanição de processos com longos tempos de execução caso processos curtos sejam continuamente adicionados ao escalonador.
Uma outra desvantagem do SJF é a necessidade de saber previamente os tempos para execução dos processo.


Round Robin

Round-robin é um dos algoritmos empregados por escalonadores de processo e de rede, em computação. Como o termo é geralmente usado, fatias de tempo (também conhecidas como quanta de tempo) são atribuídas a cada processo em partes iguais e em ordem circular, manipulando todos os processos sem prioridade (também conhecido como executivo cíclico). O escalonamento Round-robin é simples, fácil de implementar e livre de inanição. O escalonamento Round-robin também pode ser aplicado a outros problemas de escalonamento, como o escalonamento de pacotes de dados em redes de computadores.


Earliest Deadline First

Os algoritmos de escalonamento dinâmicos não atribuem prioridades fixas aos processos. As decisões de escalonamento são tomadas em tempo de execução e as prioridades dos processos podem mudar. Os critérios para essas decisões variam de algoritmo para algoritmo. O algoritmo de escalonamento dinâmico mais utilizado é o “prazo mais curto primeiro” (Earliest Deadline First – EDF).

O EDF escolhe na fila de prontos o processo que tenha o prazo de vencimento mais curto. Se chegar na fila um processo que tenha um prazo menor ainda, ocorrerá preempção.


Hierarquia de memória

A maioria dos computadores trabalha com o conceito de hierarquia de memória, possuindo uma pequena quantidade de memória cache, muito rápida, uma quantidade razoável de memória principal (RAM) e uma quantidade muito grande de memória de armazenamento em disco (HD), considerada lenta.

Hierarquia de memória

O problema básico para o gerenciamento de memória é que os programas atuais são muito grandes para rodarem, completamente, na memória cache. O gerenciador de memória deve ser capaz de controlar parte da memória que está em uso (e quais não estão), alocar memória para processos quando eles necessitam e desalocar quando eles terminam e, principalmente, gerenciar a troca entre a memória principal e o disco, quando a memória principal é muito pequena para armazenar todos os processos.


Memória

Existem dois tipos de memória principal: a memória lógica e a memória física.
A memória lógica é aquela manipulada pelos programas, ela é visível para os programas; sempre que um programa necessita alocar um espaço na memória esse espaço é alocado em memória lógica.
A memória física é a memória implementada pelos circuitos integrados é nela que os espaços alocados em memória lógica vão realmente residir, portanto a memória física tem tamanho menor que a memória lógica, geralmente.

Para isso é necessário realizar uma tradução de endereços lógicos para endereços físicos, pois assim um programa que aloca uma memória lógica possa ter de fato uma memória física alocada para si. Esse processo de tradução de endereços lógicos em endereços físicos é realizado por uma unidade de gerência de memória chamada MMU (Memory Management Unit).


Algoritmos de paginação

Os algoritmos de substituição de páginas são políticas definidas para escolher qual(is) página(s) da memória dará lugar a página que foi solicitada e que precisa ser carregada. Isso é necessário quando não há espaço disponível para armazenar a nova página. Devemos ressaltar que se a página a ser removida sofreu alterações enquanto esteve na memória, a cópia virtual existente em disco deverá ser atualizada.

Por outro lado, se a página não foi modificada significa que sua cópia está atualizada e, portanto, não é necessário reescrevê-la. Políticas de substituição de páginas devem ser utilizadas em sistemas que fazem uso de memória virtual paginada com o objetivo de melhorar o desempenho do sistema computacional.


First In First Out

É um algoritmo de substituição de páginas de baixo custo e de fácil implementação que consiste em substituir a página que foi carregada há mais tempo na memória (a primeira página a entrar é a primeira a sair). Esta escolha não leva em consideração se a página está sendo muito utilizada ou não, o que não é muito adequado pois pode prejudicar o desempenho do sistema. Por este motivo, o FIFO apresenta uma deficiência denominada anomalia de Belady: a quantidade de falta de páginas pode aumentar quando o tamanho da memória também aumenta.

Por estas razões, o algoritmo FIFO puro é muito pouco utilizado. Contudo, sua principal vantagem é a facilidade de implementação: uma lista de páginas ordenada pela “idade”. Dessa forma, na ocorrência de uma falta de página a primeira página da lista será substituída e a nova será acrescentada ao final da lista.


Least Recently Used

É um algoritmo de substituição de página que apresenta um bom desempenho substituindo a página menos recentemente usada. Esta política foi definida baseada na seguinte observação: se a página está sendo intensamente referenciada pelas instruções é muito provável que ela seja novamente referenciada pelas instruções seguintes e, de modo oposto, aquelas que não foram acessadas nas últimas instruções também é provável que não sejam acessadas nas próximas. Apesar de o LRU apresentar um bom desempenho ele também possui algumas deficiências quando o padrão de acesso é sequencial (em estruturas de dados do tipo vetor, lista, árvore), dentro de loops, etc.

A implementação do LRU também pode ser feita através de uma lista, mantendo as páginas mais referenciadas no início (cabeça) e a menos referenciadas no final da lista. Portanto, ao substituir retira-se a página que está no final da lista. O maior problema com esta organização é que a lista deve ser atualizada a cada nova referência efetuada sobre as páginas, o que torna alto o custo dessa manutenção.


Sabendo como o sistema operacional gerencia esses recursos, este repositório visa apresentar a visão bottom-up do sistema operacional, em forma de gráficos e tabelas para melhor entendimento dos conceitos apresentados. Funcionamento e entrada do programa leia o README