# Sistema operacional monolítico

Sistema operacional monolítico é um termo, oriundo dos estudos referentes a sistemas operacionais, que designa o modelo em que o sistema operacional é codificado por via de uma coleção de procedimentos, onde é permitido a qualquer um deles em qualquer parte do programa interagir livremente com outro procedimento.
A arquitetura monolítica pode ser comparado com uma aplicação que contém vários procedimentos que são compilados separadamente e depois linkados, formando um grande e único programa executável, onde todos os módulos podem interagir livremente.
A arquitetura monolítica é a arquitetura de sistema operacional mais antiga e mais comum conhecida. Ela se caracteriza pelo fato de cada componente do sistema operacional ser contido no núcleo (kernel) e pode comunicar-se diretamente com qualquer outro componente (utilizando chamadas à função), justamente por isso o núcleo normalmente tem acesso irrestrito ao sistema de computador.
No núcleo/kernel monolítico, o sistema operacional é escrito como se fosse um conjunto de rotinas, de forma que cada rotina pode chamar, ou ainda, se comunicar, com outra rotina, sempre que for necessário. Esse sistema possui um núcleo grande e complexo que engloba todos os serviços. Todos os componentes funcionais do kernel têm acesso a todas as suas estruturas de dados e rotinas internas, com isso, um erro em uma rotina pode comprometer todo o núcleo.
Dessa forma, o sistema é estruturado de maneira que seja possível a interação livre entre as rotinas (a comunicação uma com as outras). Para a utilização dessa técnica é necessário que cada uma das rotinas possuam uma interface bem organizada, com parâmetros e resultados bem definidos.
O sistema monolítico é estruturado em um único arquivo binário, em apenas um processo que executa inteiramente em modo protegido.

## Características
### Arquitetura Monolitica

* A construção é baseada em módulos, que são unidos através de Linkers (a partir de vários módulos é gerado um executável).
* Boa definição de parâmetros de ligação entre as diferentes rotinas existentes, aumenta o desempenho, mas o sistema pode parar devido a algum erro ocasionado por uma dessas rotinas.
* Geralmente são feitos à medida, pelo que são eficientes e rápidos na execução e na gestão.
* Não são muito flexíveis a diferentes ambientes para além dos quais foram criados.
* Os primeiros Sistemas Operacionais foram desenvolvidos baseando-se neste modelo, o que tornava seu desenvolvimento e manutenção muito difíceis.

### Núcleo Monolitico

* Núcleos monolíticos normalmente são eficientes pois poucas chamadas precisam ir da área do usuário para a área do núcleo.
* Todos os códigos de sistemas operacionais em núcleos monolíticos operam com acesso irrestrito ao software e hardware do computador, portanto esses sistemas são particularmente suscetíveis a danos provocados por códigos sujeitos a erros.

### Aplicações monolíticas

* Um aplicativo monolítico é um aplicativo de software de camada única no qual a interface do usuário e o código de acesso são dados e combinados em um único programa a partir de uma única plataforma.
* É autônomo e independente de outros aplicativos de computação.
* Um aplicativo monolítico descreve uma aplicação de software que é projetada sem modularidade.
* A modularidade é desejável, em geral, pois suporta a reutilização de partes da lógica da aplicação e também a manutenção por reparo ou substituição de partes da aplicação sem a necessidade de substituição em atacado.

## Vantagens e Desvantagens

Como vantagens, temos:
* A grande vantagem de sistemas operacionais monolíticos é o desempenho, já que a forte integração interna de seus componentes lhe permite que detalhes de baixo nível do hardware sejam efetivamente explorados.
* A arquitetura possui intercomunicação direta e isso favorece no tempo de resposta do sistema operacional.
* A interação direta entre os componentes torna o sistema mais compacto.
* Os componentes do núcleo pode acessar os demais sem qualquer tipo impedimento.
Porém como desvantagens:
* O sistema pode parar em função de um erro;
* As interfaces e os níveis de funcionalidade não são bem separados, nem estão unificados. O excesso de liberdade torna o sistema vulnerável;
* Dificuldade em executar alterações no próprio núcleo, pois as dependências e pontos de interação dos componentes podem não ser evidentes.
* É difícil identificar a origem de um problema ou erro, pois seus componentes estão todos no mesmo lugar.
* Se um componente do núcleo apresentar um erro, esse problema pode se alastrar rapidamente e levar o sistema ao colapso.
* Pequenas alterações na estrutura de dados de um componente, se acessados diretamente, podem ter um impacto inesperado em outros componentes.

## Exemplos

* Os UNIX-likes (como Linux, Solaris, AIX, HP-UX, BSDs e seus derivados);
* Microsoft MS-DOS e Windows 9x;
* Apple Mac OS nas versões abaixo do 8.6.
* Atualmente, apenas sistemas operacionais embutidos usam essa arquitetura, devido às limitações do hardware sobre o qual executam.