Entendendo a estrutura de um sistema operacional
Tags: sistemasoperacionais, unix, windows, portugues
Published: 2020-10-28 20:55:27

---
title: Entendendo a estrutura de um sistema operacional
published: true
description: Estudando a estrutura de um sistema operacional com os mestres Francis Machado e Luiz Maia
tags: sistemasoperacionais, unix, windows, portugues
cover_image: https://images.unsplash.com/photo-1541728472741-03e45a58cf88?ixlib=rb-1.2.1&auto=format&fit=crop&w=889&q=80
---
Um sistema operacional é **formado por várias rotinas**, que em conjunto são denominadas **núcleo do sistema**, ou *kernel*.

Algumas funções do kernel:

* Tratamento de interrupções e exceções
* Criação e eliminação de processos e threads
* Sincronização e comunicação entre processos e threads
* Escalonamento e controle dos processos e threads
* Gerência de memória
* Gerência do sistema de arquivos
* Gerência de dispositivos de E/S
* Suporte a redes locais e distribuídas
* Contabilização do uso do sistema
* Auditoria e segurança do sistema

## Modos de acesso ao sistema

Para proteger o núcleo do sistema e o acesso ao seus serviço, alguns mecanismos de segurança são implantados como, por exemplo, o **modo de acesso**. Tente imaginar o que pode acontecer caso qualquer aplicação, mesmo as maliciosas, pudessem acessar com facilidade o kernel do computador: todo o sistema poderia ficar comprometido!

No **modo usuário** a aplicação só tem acesso a instruções *não privilegiadas*. No **modo kernel** a aplicação tem acesso a todo conjunto de instruções do processador.

## Rotinas do sistema e *system calls*

As funções do núcleo são implementadas, com instruções privilegiadas, por **rotinas do sistema operacional**. O controle da execução dessas rotinas é realizado por __*system calls*__ (chamadas do sistema).

Quando alguma aplicação deseja chamar uma rotina do sistema, o *system call* é ativado e verifica se a aplicação possui privilégios de administrador do sistema para isso. Trata-se de um mecanismo de proteção por software.

Você a esse ponto provavelmente está pensando em um terminal e nas vezes em que teve que usar o `sudo` para realizar alguma tarefa ou executar alguma aplicação, como o Docker, por exemplo.

Quando damos um comando com uma linguagem de programação para, digamos, leitura de um arquivo, acontece o seguinte:

> (...) o comando da linguagem de alto nível é convertido pelo compilador para uma chamada a uma rotina específica que, quando executada, verifica a ocorrência de erros e retorna os dados ao programa de forma transparente aos usuários.

Essa é uma *chamada explícita* a uma rotina do sistema operacional. Também podemos ter uma *chamada implícita*, que ocorre quando feita por intermédio de um comando da própria linguagem de programação.

## POSIX

POSIX significa *portable  operating system interface for unix*. Caso não se lembre, Unix é o precursor de sistemas operacionais como Linux e MacOS. O POSIX é uma **biblioteca de chamada**, resultado de uma **padronização**, pensada em portabilidade entre sistemas Unix.

Obviamente, cada sistema operacional tem seu conjunto de rotinas, com nomes específicos e parâmetros específicos, então não é possível portar uma aplicação diretamente de um sistema operacional para outro sem fazer ajustes, daí o POSIX.

## Linguagem de comandos (linguagem de controle)

É uma linguagem que **permite a comunicação do usuário com o sistema operacional** para realizar tarefas, como ler arquivos ou consultar pastas (diretórios).

Pense no terminal linux, por exemplo. Usamos, normalmente, o `bash shell`, que significa *bourne again shell*. Um *shell* é um **interpretador de comandos** da linguagem de controle. No Linux falamos em *shell script*, que nos permite automatizar tarefas.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/0bsg3pwzfr77nrugwdsu.jpeg)

## Ativação do sistema

Quando você liga seu computador o sistema operacional ainda não está carregado na memória. O Windows, digamos, está guardado no HD (*hard drive*), ocupando trocentos gigas, ou seja, na memória secundária.

Ao ligar o pc, o sistema operacional precisa ser carregado na memória principal, nos seu 4gb de RAM (*random access memory*), ou seja, na memória principal. Quem faz essa tarefa é o **boot** (**ativação do sistema**), com o programa de *boot loader*.

O processo é o seguinte:

1. Execução do *boot loader*
2. *Boot loader* chama o *power-on self test* para verificar a integridade do hardware
3. Verificação se há um dispositivo de armazenamento com um sistema operacional
4. Se não houver, apresenta mensagem de erro
5. Se houver, carrega-se instruções na memória num bloco chamado *boot sector*
6. Executa-se as instruções
7. Finalmente o sistema operacional é carregado na memória principal
8. Execução de arquivos de inicialização e customização (no meu caso, por exemplo, meu Linux carrega um `Remap27.sh`, porque remapeei uma tecla)

## Arquiteturas do núcleo (kernel)

Existem diversos tipos de arquiteturas do kernel:

* Arquitetura monolítica
* Arquitetura de camadas
* Arquitetura de máquina virtual
* Arquitetura microkernel

A **arquitetura monolítica** possui vários módulos compilados separadamente, que depois são linkados para formar um único programa executável. Aqui, pense no MS-DOS da da Microsoft.

A **arquitetura em camadas**  consiste em níveis sobrepostos, onde cada camada tem um conjunto de funções que podem ser utilizadas pelas camadas superiores. Aqui podemos pensar na maioria das versões do Linux, ou o Windows.

Na **arquitetura de máquina virtual** cria-se um nível intermediário entre hardware e sistema operacional, que cria diversas máquina virtuais independentes com uma cópia virtual do hardware. Isso é útil para

* Portabilidade de código
* Consolidação de servidores (executar diversas aplicações em uma única máquina ao invés de diversos servidores separados)
* Aumento da disponibilidade (qualquer problema com uma VM basta restaurar a cópia da VM em outro servidor)
* Facilidade de escalabilidade e balanceamento de carga (se o sistema ficar sobrecarregado a VM pode ser migrada para outro ambiente com facilidade)
* Facilidade no desenvolvimento de software (mais fácil de testar software em dois sistemas operacionais diferentes)

A **arquitetura de microkernel** é pensada para tornar o sistema operacional menor e mais simples. Para isso, os serviços do sistema são disponibilizados por processos,e cada um é responsável por fornecer um conjunto específico de funções.

Nessa arquitetura chamamos de *cliente* a aplicação que solicita um serviço, e *servidor* o processo que responde essa solicitação. O núcleo aqui é focado em realizar essa comunicação entre cliente e servidor.

Para ir mais a fundo no assunto dá uma lida no livro [Arquitetura de Sistemas Operacionais](https://www.amazon.com.br/Arquitetura-Sistemas-Operacionais-Francis-Machado-ebook/dp/B073DPFGTM/ref=sr_1_1?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=301MSUYCRF4K3&dchild=1&keywords=arquitetura+de+sistemas+operacionais&qid=1599166644&sprefix=arquitetura+de+sis%2Caps%2C249&sr=8-1) dos mestres Francis Machado e Luiz Maia.

---
_Fontes:_
MACHADO, Francis Berenger; MAIA, Luiz Paulo. __Arquitetura de Sistemas Operacionais: Incluindo Exercícios com o Simulador SOSIM e Questões do ENADE__. Rio de Janeiro: LTC, 2013.

---
_Esse texto não tem intenção de esgotar o tema. Acrescente nos comentários, e também aponte erros quando os identificar._