O sistema operacional funciona com algumas particularidades quanto a execução das rotinas:

Introdução

Sabemos que o sistema operacional é um conjunto de rotinas que oferece serviços ao usuário e às aplicações mas ocorre que essa é uma forma muito simples de entender um sistema operacional.

Na verdade, o conjunto de rotinas é o que chama-se de núcleo do sistema operacional ou kernel.

Contudo os sistemas operacionais são formados por algo além do núcleo. Os sistemas operacionais possuem também uma linguagem de comandos e diversos utilitários de apoio que são usados para complementar o sistema operacional.

Os usuários e aplicações se comunicam com o núcleo do sistema operacional de maneiras distintas. Em geral, os usuários usam aplicações que invocam as rotinas do sistema operacional, por exemplo, quando gravamos um arquivo. Além disso, os usuários também usam a linguagem de comandos do sistema operacional para executar tarefas no sistema operacional e também usam programas utilitários para tarefas mais complexas como compilação, transmissão de arquivos por exemplo.  O ponto é que cada sistema operacional possui sua própria linguagem de comandos, seus próprios utilitários e demais componentes que formam sua estrutura.

A estrutura de um sistema operacional pode variar conforme o projeto do próprio sistema operacional mas em geral temos os seguintes componentes:

O sistema operacional funciona com algumas particularidades quanto a execução das rotinas:

Funções do Núcleo

Diferente das rotinas de um programa do usuário que são executadas segundo uma determinada ordem definida no programa, as rotinas do sistema operacional são executadas concorrentemente sem uma ordem predefinida. A execução dessas rotinas do sistema operacional ocorre com base em eventos assíncronos. Muitos desses eventos são gerados por hardware e por tarefas internas do sistema operacional.

As principais funções do núcleo do sistema operacional estão listadas abaixo:

  • 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;
  • gerencia de memória;
  • gerencia do sistema de arquivos;
  • gerencia de dispositivos de entrada e saída;
  • suporte a redes locais e distribuídas;
  • segurança e auditoria do sistema;
  • contabilização de uso do sistema;

Em sistemas multi programados é natural que surjam problemas relacionados com segurança do inter-relacionamento dos diversos subsistemas existente e recursos que são compartilhados pelos vários usuários e programas executados de forma concorrente pela UCP. Esta situação requer que o sistema operacional garanta a confiabilidade das tarefas sendo executadas de forma concorrente, dos dados dos usuários destas tarefas e a integridade do próprio sistema operacional.

Outra função do sistema operacional é garantir que nenhum processo monopolize o uso da UCP, permitindo que haja uma alternância dos processos executados concorrentemente.

Outra função do sistema operacional é garantir que cada programa tenha sua área de memória protegida de outros programas para que um programa não acesse nenhum endereço de memória que esteja em uso por outro programa. Caso um programa acesse um endereço de memória em uso por outro programa, deve ser gerado um erro, uma exceção.

Outra função semelhante do sistema operacional é garantir que os dados de cada usuário sejam gravados em disco de forma confiável, considerando que existem vários programas, de vários usuários, gravando dados no disco de forma concorrente. Neste caso é função do sistema operacional garantir a integridade e confiabilidade dos dados armazenados pelos vários programas executados. O sistema operacional deve permitir ainda que mais de um usuário possa ter acesso simultâneo aos dados de uma arquivo.

Todos estes cenários típicos e sistemas multi programados fazem com que o sistema operacional tenha que implementar uma série de controles e proteção para garantir a execução de várias tarefas e o compartilhamento seguro de confiável dos recursos do computador ( disco, memória, impressora, etc. ). Dois desses mecanismos nós vimos na aula passada, são as interrupções e as exceções.

Modo de Acesso

Em todo projeto de sistema operacional os projetistas sempre se preocuparam em garantir a integridade do próprio sistema operacional, protegendo o núcleo e o serviços do sistema operação de acessos indevidos por uma aplicação do usuário. Caso uma aplicação do usuário tenha acesso ao núcleo e realize alguma operação que altere sua integridade então todo o sistema ficará comprometido. Muitos sistemas operacionais utilizam um mecanismo de segurança implementado no hardware do processador e conhecido como modo de acesso.

Este mecanismo de proteção funciona através do conceito de modo usuário ou modo kernel.

Quando o processador trabalha em  modo usuário, uma aplicação tem acesso a apenas algumas instruções  não -privilegiadas. tendo acesso a um número reduzido de instruções. Quando o processador está em modo kernel a aplicação sendo executada tem acesso a todo o conjunto de instruções do processador, tem acesso as instruções privilegiadas. O modo de acesso é determinado por um conjunto de bits no registrador de status. O hardware verifica este registrador para determinar se uma instrução pode ou não ser executada.

Rotinas do Sistema Operacional e System Calls

As rotinas do sistema operacional compõem o núcleo do sistema e possuem em seu código instruções privilegiadas. Portanto, estas rotinas somente podem ser executadas quando o processador está em modo kernel. Assim, as rotinas do sistema operacional não estão disponíveis para aplicações do usuário e deve ser implementado mecanismo de proteção a tais rotinas.

O mecanismo usa o controle de execução das rotinas do sistema operacional é conhecido como system call. Assim, toda a vez que uma aplicação do usuário chamar uma rotina do sistema operacional o mecanismo de system call é ativado e ele verifica se a aplicação do usuário possui os privilégios necessários para executar a rotina desejada.

Em caso negativo, o sistema operacional impede a execução da rotina e sinaliza que a execução não é possível.

Em caso positivo, o sistema operacional salva o estado dos registradores, troca o modo de acesso para kernel e realiza a execução da rotina do sistema operacional, alterando o registrador PC com o endereço da rotina chamada. Ao termino da execução da rotina, o modo de acesso é alterado para modo usuário.

Chamadas a rotinas do Sistema Operacional

As rotinas do sistema operacional e as system calls dão acesso as instruções privilegiadas e ao núcleo do sistema. Sempre que uma aplicação do usuário desejar executar uma rotina do sistema operacional deve invocar a system call que irá executar as rotinas do sistema operacional e retornar um status para a aplicação do usuário.

O sistema operacional funciona com algumas particularidades quanto a execução das rotinas:

As rotinas do sistema operacional podem ser divididas em grupos:

  • Gerencia de processos e threads    - Criação e alteração de processos e threads

                                                                            Sincronização e comunicação de processos e threads

                                                                            Obtenção de informações sobre processos e threads

  • Gerencia de memoria                        - Alocação e deslocação de memória
  • Gerencia do sistema de arquivos    - Abrir e fechar arquivos, leitura e gravação de arquivos e diretórios,     obteção de informações de arquivos e diretórios, alteração de informações de arquivos e diretórios.
  • Gerencia de dispositivos                    - Alocação/deslocação de dispositivos

                                                                            Operações de entrada/saída de dispositivos

                                                                            Obtenção de informações sobre dispositivos

O termo system calls é comum em sistemas UNIX. Em outros sistemas existem termos como system services.

Linguagem de Comandos

A linguagem de comandos permite que os usuário se comuniquem com o sistema operacional de forma simples através de uma interface de comandos que são interpretados pelo interpretador de comandos da linguagem de comandos. A linguagem de comandos pode usar uma interface de linha de comandos ou uma interface gráfica. Para cada comando executado pelo usuário o interpretador de comandos verifica o comando, analisa a sintaxe do comado e verifica permissões para a execução do comando. Cada sistema operacional possui sua linguagem de comandos específica. Os comandos da linguagem de comandos podem ser gravados em arquivos de script para serem executados como se fossem programas. Esta forma de uso da linguagem de comandos é muito usada para a automação de tarefas rotineiras, como backup, carga de dados, etc.

A linguagem de comandos não faz parte do núcleo do sistema. Ela é um componente da arquitetura do sistema operacional e pode variar mesmo em versões do mesmo sistema operacional.

Ativação/Desativação do Sistema

Inicialmente quando o computador é ligado não existe sistema operacional carregado na memória da máquina. O sistema operacional é carregado através de um processo gravado na memória ROM da máquina chamado ativação do sistema ou boot.

O processo de ativação do sistema é iniciado automaticamente quandos o computador é ligado e inicialmente executa um programa chamado boot loader que é executado a partir da memória ROM.

O boot loader executa um outro programa chamado POST ( Power On Self Test ) que faz uma verificação do hardware da máquina para identificar posíveis problemas de hardware.

O boot loader busca no computador algum dispositivo de armazenamento que tenha um sistema operacional instalado. Caso nenhum dispositivo de armazenamento tenha um sistema operacional disponível é exibida uma mensagem de erro e o processo finaliza.

O boot loader busca no dispositivo de armazenamento o setor de boot onde carrega um conjunto de instruções para inicialização do sistema operacional.

O conjunto de instruções carregado em memória inicia a ativação do sistema operacional o que inclui também a execução de arquivos de inicialização para configuração do hardware e de parâmetros do próprio sistema operacional de acordo com as necessidades do usuário.

O processo de desativação do sistema operacional também conhecido como shutdown é um processo que é executado a partir de comandos do sistema operacional e permite que os componentes do sistema operacional e programas do usuário sejam encerrados de forma a garantir a integridade do sistema.

Arquiteturas do Núcleo

O projeto de um sistema operacional é realizado de forma a atender a requisitos operacionais de desempenho, portabilidade, confiabilidade, facilidade de uso, segurança. 

O projeto do sistema operacional também depende da arquitetura de hardware e também do tipo de sistema operacional que se deseja construir: batch, tempo compartilhado, tempo real, multi programado, multi processado, etc.

Os primeiros sistemas operacionais eram escritos em Assembly mas isso garantia performance excepcional nos sistemas operacionais mas causava uma dependencia muito grando do sistema operacional em relação ao hardware da máquina e comprometia seriamente a portabilidade. O sistema operacional tinha que ser reescrito se precisasse ser instalado em uma máquina com arquitetura e hardware diferente.

O sistemas operacionais atuais são escritos em linguagens de alto nível, principalmente C e C++ o que garante portabilidade e independencia de hardware conteudo o desempenho é inferior aos antigos sistemas operacionais. Para minimizar este problema, os projetistas ainda usam Assembly para os componentes críticos do sistema operacional tais como drivers e as rotinas de tratamento de exceção que nós vimos na aula passada.

A forma como os componentes do sistema operacional são organizados pode variar, sendo que existem várias arquiteturas de sistemas operacionais disponíveis.

Arquitetura Monolítica

A arquitetura monolítica foi utilizada nos primeiros sistemas operacionais tais como CP/M, MS-DOS e nas primeiras versões do Linux. Nesta arquitetura os componentes do sistema são compilados em módulos separados e depois linkados em um único programa executável. Os módulos são carregados em memória e interagem entre si. A manutenção deste tipo de sistema é bem difícil.

O sistema operacional funciona com algumas particularidades quanto a execução das rotinas:


Arquitetura em Camadas

A arquitetura em camadas surgiu devido a complexidade dos sistema operacionais na medida em que foram evoluindo. Nesta arquitetura o sistema operacional é formado por níveis ou camadas onde as camadas inferior oferecem serviços às camadas superiores. As camadas inferiores são privilegiadas

O sistema operacional funciona com algumas particularidades quanto a execução das rotinas:


A vantagem deste tipo de arquitetura é o isolamento das camadas e a segurança e proteção às camadas mais internas onde fica o kernel. 

A desvantagem é que o desempenho do sistema é afetado pela troca de modo de acesso. Quando um aplicativo do usuário solicita um serviço da camada kernel é necessário passar por várias outras camadas ( supervisor, executivo ) e realizar várias trocas do modo de acesso. 

A maioria dos sistemas operacionais atuais tais como Linux e Windows utilizam o modelo de arquitetura em camadas sendo que estes sistemas implementam apenas duas camadas ( modo usuário e modo kernel ).

Máquina Virtual

Um sistema operacional é formado por níveis, onde a camada de nível mais baixo é o hardware. Acima dessa camada temos o sistema operacional que oferece serviços para os aplicativos do usuário. 

Na arquitetura de máquina virtual existe uma camada intermediária entre o hardware e o sistema operacional chamada gerencia de máquinas virtuais. 

Esta camada cria diversas máquinas virtuais independentes, onde cada uma oferece uma cópia virtual do hardware, incluindo os modos de acesso, interrupções, memória, dispositivos de entrada e saída, etc.

Como cada máquina virtual é independente das outras, é possível que cada VM tenha seu próprio sistema operacional e que seus usuários executem suas aplicações como se o computador  estivesse dedicado a cada um deles.

Cada máquina virtual é isolada das demais o que proporciona segurança para cada VM. Isto garante também confiabilidade pois uma VM não pode comprometer o estado das outras VMs.

A desvantagem desta arquitetura é a grande complexidade. A camada de gerencia de máquinas virtuais é responsável por compartilhas e gerenciar os recursos do hardware entre as diversas VMS. Esta é uma arquitetura altamente complexa.

Arquitetura MicroKernel

A arquitetura MicroKernel busca tornar o núcleo do sistema, o kernel o menor e mais simples possível. Nesta arquitetura os serviços do sistema operacional são disponibilizados como serviços. Cada serviço oferece um conjunto de funções como gerência de arquivos, gerência de processos, gerência de memória e etc.

Quando uma aplicação do usuário solicita um serviço é feita uma solicitação ao processo responsável pelo serviço. 

A aplicação que solicita o serviço é chamada cliente e o processo que responde à solicitação é chamado de servidor.

O núcleo do sistema se limita a realizar a comunicação entre cliente e servidor. É portanto um núcleo muito mais simples.

Nesta arquitetura, os processos executam suas funções em modo usuário, ou seja, não tem acesso a instruções privilegiadas, não tem acesso aos componentes do sistema. Apenas o núcleo executa em modo kernel. Isto garante que caso haja um erro em um processo o sistema não ficará completamente comprometido. Isso aumenta a disponibilidade do sistema. 

O sistema operacional funciona com algumas particularidades quanto a execução das rotinas: