# Sistemas operacionais/Estruturas dos sistemas operacionais

Um sistema operacional fornecia o ambiente no qual os programas (softwares) são executados. Os SOs variam internamente entre si devido às diversas necessidades e restrições de softwares e hardwares.

## Estruturas de Sistemas Operacionais
### Sistemas monolíticos

Também conhecida como estrutura simples, esta é a estrutura dos primeiros SO’s. Consistida, basicamente, por um programa dividido em sub-rotinas, na estrutura monolítica é permitido a qualquer uma dessas sub-rotinas em qualquer parte do programa chamar outra(s) sub-rotina(s). A construção do programa final é dada com base nos módulos compilados separadamente, unidos através de um linker. A boa definição de parâmetros de ligação entre as diferentes rotinas existentes aumenta e muito o desempenho, porém o sistema pode parar devido a algum erro ocasionado por uma dessas rotinas. A exemplo temos o próprio UNIX, o MS DOS, o FreeBSD, entre outros.

### Sistemas em camadas

Devido ao crescimento das necessidades dos utilizadores e o aperfeiçoamento dos sistemas, foi-se necessário a modularização da organização do sw do SO. Na abordagem em camadas, o SO é particionado em níveis, onde o nível mais “baixo” é o hw, e o nível mais “alto” é a interface com o usuário. A principal vantagem dessa estrutura é justamente a modularização, facilitando sua alteração e depuração de cada camada, além de criar uma hierarquia de níveis de acesso que permite proteger as camadas mais internas.
As camadas são selecionadas de tal modo que cada uma delas opere diretamente com a camada seguinte de nível mais baixo. Foi originado na Holanda por Edsger Dijkstra, que utilizou o algoritmo de busca de menor caminho, também de sua própria autoria, para percorrer dentre as várias camadas, as que atenderão as solicitações de “cima”, de maneira mais eficiente.
Uma desvantagem desta estrutura é o tempo de resposta ao usuário, pois numa requisição sua, uma camada irá se comunicar com a outra diretamente seguinte, e assim por diante, possibilitando a modificação de parâmetros a cada camada, necessidade de dados e ainda o acréscimo de overhead à chamada do sistema, levando, contudo, ao consumo maior de tempo do que nos SO’s não estruturados em camadas.
Por sua vez, tal estrutura tem uma vantagem maior do ponto de vista tanto do projeto quanto da implementação, pois a impossibilidade de comunicação direta das aplicações de cima com as de baixo, leva a um controle maior do SO sobre o hw.
A exemplo temos o Windows NT, o THE e o MULTICS.

### Máquina Virtual

Uma máquina virtual é uma cópia via software que busca simular uma máquina real. Uma máquina virtual (Virtual Machine – VM) pode ser definida como “uma duplicata eficiente e isolada de uma máquina real”. A IBM define uma máquina virtual como uma cópia isolada de um sistema físico, e esta cópia está totalmente protegida.
Ao invés de ser uma máquina real, isto é, um computador real, feito de hardware e executando um sistema operacional específico, uma máquina virtual é um computador fictício criado por um programa de simulação. Sua memória, processador e outros recursos são virtualizados. A virtualização é a interposição do software (máquina virtual) em várias camadas do sistema. É uma forma de dividir os recursos de um computador em múltiplos ambientes de execução.

### Sistemas Cliente-Servidor

Sistemas Cliente-Servidor são modelos de computação que distinguem dois tipos básicos de equipamentos computacionais: servidores e clientes, sendo interligados entre si geralmente utilizando-se uma rede de computadores. Neste modelo, geralmente os servidores agregam as funções mais importantes do sistema, deixando aos clientes apenas o processamento de aplicações mais básicas.
As principais características deste tipo de sistema são:
* Elevar a camada onde são implementadas as funções normalmente efetuadas pelo sistema operacional;
* Reduzir as funções do sistema operacional;
* Tornar menor e de mais fácil a manutenção cada parte do sistema operacional.

## Utilização dos recursos de sistemas
### Monoprogramação ou monotarefa

Em computação, chama-se monotarefa um sistema operacional que permite a realização de apenas uma tarefa (job) de cada vez. O processador, memória e periféricos ficam dedicados a um único usuário, e cada tarefa para ser executada, deve aguardar o encerramento da tarefa atual. Nos sistemas monoprogramados, enquanto uma aplicação aguarda um evento, o processador pode permanecer ocioso, sem realizar qualquer tipo de processamento, a memória pode acabar sendo sub-utilizada quando o programa não a utiliza totalmente e os periféricos são dedicados a um único usuário. Desta forma, os sistemas monoprogramáveis acabam sendo por sua natureza de fácil implementação e com pouca preocupação com proteção.

### Multiprogramação ou multitarefa

Multiprogramação ou Multitarefa é o nome dado à característica de alguns sistemas operacionais de rodar diversas aplicações simultâneas. Na realidade, na execução multitarefa, o tempo do processador é compartilhado entre as aplicações em execução, e a execução das tarefas passa rapidamente de uma para a outra, criando a ilusão de que as aplicações ocorrem de forma conjunta.
Isso é multiprogramação. As tarefas se alternam no consumo do processador de forma tão rápida que a impressão que temos é que estão acontecendo ao mesmo tempo. A esta ilusão, dá-se o nome de pseudo-paralelismo. Para executar ao mesmo tempo é preciso ter multiprocessamento.

## Tipos de Sistemas Operacionais
### Sistemas Batch

Os sistemas batch ou sistemas em lote foram os primeiros sistemas multiprogramáveis a serem implementados (primeira fase da computação), caracterizando-se por programas armazenados em disco ou fita, que uma vez iniciados, exigem pouca ou nenhuma interação do usuário, processando de forma sequencial e contínua até o fim do serviço (job), quando então é devolvido o resultado final do processamento. O tempo de execução da tarefa é conhecido como turnaround.

### Sistemas multiprogramados

Nos sistemas monoprogramados o que temos é a existência de um único processo sendo executado de cada vez na memória. Com a multiprogramação existem vários processos na memória aptos à executar e um em execução. Sem dúvida, o conceito de multiprogramação é um dos mais importantes nos sistemas operacionais modernos. Se existirem vários programas carregados na memória ao mesmo tempo, a CPU pode ser compartilhada entre eles, aumentando a eficiência da máquina e produzindo mais resultados em menos tempo. A ideia por detrás da multiprogramação é bastante simples. Quando um programa libera a CPU, seja para realizar alguma operação de E/S ou por outro motivo, ela fica parada. Enquanto espera que o programa volte para executar, a CPU não realiza nenhum trabalho útil. Para acabar com a ociosidade deste tempo vários programas são mantidos ao mesmo tempo na memória e o sistema operacional se encarrega de escolher um deles para executar. Assim, sempre que um programa é interrompido, um outro é escolhido para ser executado em seu lugar. Com isso, a CPU estará durante grande parte do tempo ocupada processando instruções de programas. Os benefícios da multiprogramação são vários: aumento da utilização da CPU e da taxa de saída do sistema computacional, isto é, da quantidade de trabalho realizada dentro de um intervalo de tempo (throughput).

### Sistemas de Tempo Compartilhado (Time Sharing)

São sistemas que compartilham o tempo de uso da CPU entre diversos programas. Também conhecido como time-sharing, consegue executar diversas tarefas simultaneamente, pois existe a divisão do tempo do processador em pequenos intervalos, denominados fatia de tempo. Caso a tarefa não termine durante a fatia a ela determinada, há uma interrupção e ela volta para a fila de escalonamento, aguardando novamente sua vez.
Diferente do sistema batch, esse tipo de sistema operacional permite a interação do usuário. Dessa maneira, os terminais possuem teclado, vídeo e mouse.

### Sistemas de Tempo Real

São sistemas no qual o tempo tem uma função essencial. Em geral, um ou mais dispositivos físicos externos ou computador geram estímulos, e o computador deve reagir apropriadamente a eles dentro de um dado intervalo de tempo.

### Sistemas multiprocessados

Sistemas multiprocessados são sistemas construídos sobre máquinas computacionais que possuem mais de um processador para propósitos gerais. Entre suas vantagens estão:
* Maior produção (throughput)
* Reconfiguração
* Balanceamento
* Simetria

## Acoplamento-Sistemas multiprocessáveis

Modo de comunicação entre os processadores e o grau de compartilhamento de memória e dos dispositivos de entrada/saída.

## Chamadas de Sistema

Conhecidas como system calls, são instruções que um programa utiliza para se comunicar com o Sistema Operacional e acessar seus serviços. O aplicativo "chama" o S.O., requisitando algo.
As chamadas de sistema podem ser agrupadas, grosso modo, em seis categorias principais:
* Controle de processos
** encerrar, abortar
** carregar, executar
** criar processo, encerrar processo
** obter/definir atributos do processo
** esperar hora, esperar evento, sinalizar evento
** alocar e liberar memória
* Gerenciamento de arquivos
** criar arquivo, excluir arquivo
** abrir, fechar
** ler, gravar, reposicionar
** obter/definir atributos do arquivo
* Gerenciamento de dispositivos
** solicitar dispositivo, liberar dispositivo
** ler, gravar, reposicionar
** obter/definir atributos do dispositivo
** conectar ou desconectar dispositivos logicamente
* Manutenção de informações
** obter/definir a hora ou a data
** obter/definir dados do sistema
** obter/definir atributos do processo, arquivo ou dispositivo
* Comunicações
** criar, excluir conexão de comunicações
** enviar, receber mensagens
** transferir informações de status
** conectar ou desconectar dispositivos remotos
* Proteção
** obter/definir permissões de arquivos
* ↑ Silberschat, Abraham; Gagne, Greg; B Galvin, Peter (2015). Fundamentos de Sistemas Operacionais. Rio de Janeiro, RJ: Grupo Gen - LTC. 68 páginas. ISBN 9788521630005. OCLC 972290077.
* ↑ Silberschatz, Abraham; B Galvin, Peter; Gagne, Greg (2018). Operating System Concepts 10th ed. Hoboken, NJ: Wiley. 67 páginas. ISBN 9781119320913. OCLC 1004849022.