Sistemas Operativos
Por Ivo Correia

Um sistema operativo (SO) é um software que controla a partilha de recursos de um computador. Um sistema operativo processa toda informação redigida pelo próprio computador, para além daquela que é disponibilizada pelo utilizador, arrumando-a ordenadamente e executando todas as actividades internas efectuadas pela máquina, as suas prioridades, os dispositivos internos e externos e ainda facilitando o acesso aos ficheiros guardados na memória. A maior parte dos SO recorrem a uma interface gráfica para tornar mais acessível ao utilizador a sua utilização, sendo actualmente o sistema Windows o mais popular, apesar de o Linux e Macintosh terem vindo a ganhar terreno nos últimos anos.

 

Controlo de processos

 

Qualquer programa que esteja em execução, serviço ou aplicação, é um processo. Apesar de os sistemas operativos mais antigos não permitirem a execução simultânea de mais de um processo, hoje em dia os sistemas operativos apresentam a capacidade de executar múltiplas tarefas ao mesmo tempo (desde os inícios de 1960), mesmo quando o computador contém apenas um CPU.

O controlo de processos é a operação que permite a existência desta capacidade de um sistema operativo. Como grande parte dos computadores contém apenas um processador (ou CPU), esta tarefa é realizada mudando muito rapidamente de um processo para o outro. Naturalmente, quanto mais processos estiverem em execução, mais devagar será esta mesma transição, dependendo da disponibilidade do CPU, entre outros componentes.

Hoje em dia, a maior parte dos SO permitem que os processos tenham localizações diferentes no CPU, de acordo com a sua prioridade, havendo mesmo sistemas, os denominados de interactivos, que disponibilizam um maior grau de prioridade para o processo que está em execução por parte do utilizador.

Muitas vezes, ainda são executados processos de fundo, da responsabilidade do próprio SO e que não podem ser acedidos pelo utilizador, correndo quando nenhum outro processo está em curso.

 

Controlo da memória

 

As actuais arquitecturas computacionais estruturam a memória de uma forma hierárquica, começando pelos mais registadores de dados mais rápidos, seguido da cache do CPU, memória RAM e finalmente a armazenada no disco. O controlador de memória de um SO coordena o uso destes vários tipos de memória, localizando quais estão disponíveis de momento, quais e como podem ser distribuídas ou retiradas e o modo mais eficaz de mover os dados entre as várias memórias. Esta actividade, normalmente referida com o controlo da memória virtual, aumenta a quantidade de memória disponível e a rapidez da execução de processos.

Há uma penalização de velocidade associada ao uso de discos externos (como as pens, CD’s ou DVD’s) ou outros sistemas de armazenamento mais lentos. Isto acontece porque ou um dos processos necessita de mais RAM do que a disponível ou porque dois processos competem entre si para o maior uso possível da memória disponível. Consequentemente, esta disputa conduz a uma constante transferência dos dados de cada processo, atrasando o seu armazenamento. Se a competição entre os processos e discos externos pela memória se tornar demasiado elevada, pode ocorrer o denominado trashing, um bloqueio momentâneo do SO.

Outra parte importante do controlo de memória é a ordenação das moradas virtuais. Se vários processos estão a ser executados na memória ao mesmo tempo, é necessário evitar que interfiram uns com os outros, exceptuando se houver ordens explícitas em contrário, criando para o efeito espaços de moradas separados. Cada processo pode aceder a toda a morada virtual que lhe é disponibilizada, tipicamente variando o espaço entre um valor mínimo nulo e o máximo de memória virtual disponível de o sistema, sendo que este máximo raramente é alcançado. O SO mantém tabelas de paginação que ligam as moradas virtuais às memórias físicas. Esta distribuição de memória é feitas para quando um processo terminar, toda a memória usada por esse processo possa tornar-se disponível para outros processos que ainda estão em curso ou o irão estar futuramente.

O OS pode também escrever a informação em processamento em páginas de memória inactiva para armazenamentos secundários (denominado por pagging ou swapping). Também é comum que o sistema coordene e retenha os pedidos de memória para armazenamento de informação por parte de dispositivos mais lentos de modo melhorar a performance do sistema. Ainda com o melhoramento da performance da máquina em perspectiva, o SO pode carregar a cache antecipadamente com dados que poderão ser usados num futuro próximo pelo utilizador.

Sistemas de discos e ficheiros

        Todos os SO suportam uma grande variedade de sistemas de ficheiros. Os sistemas de ficheiros modernos contêm hierarquias de directorias, que tornam mais fácil o acesso a cada ficheiro dentro do computador. Enquanto a ideia é conceptualmente similar entre os diferentes sistemas, existem diferenças na sua implementação. Dois dos exemplos mais notáveis são os caracteres utilizados para separar as directorias e a existência da case-sensivity (diferenciação entre letras maiúsculas e minúsculas). O Unix separa as componentes das directorias com uma barra (/), uma convenção seguida pelos SO’s que o emulam ou pelo menos recorrem a este conceito de hierarquias das directorias, tal como o Linux, Amigo OS e Mac OS Y. O MS-DOS também emula esta característica, mas como já havia adoptado o suo desta barra para opções de comandos adicionais, utiliza em vez a barra inversa (\) como separador. O SO Microsoft Windows imita esta propriedade, usando no entanto caracteres diferentes nas edições japonesas e coreanas. As versões posteriores ao Mac OS X usam dois pontos e o RISC OS o ponto final.

O Unix e os SO’s derivados permitem a utilização de qualquer carácter (com excepção, claro, da barra separadora), sendo também case-sensitive. Por outro lado, os ficheiros do Windows apresentam uma maior restrição, para além de não apresentarem a propriedade de case-sensitive (ou seja WINDOWS e Windows não são distinguíveis neste SO).

Os sistemas de ficheiros também poderão permitir o journaling, o que salvaguarda os ficheiros em caso de falha do sistema. Um sistema de ficheiros que recorre a esta tarefa escreve a informação duas vezes: primeiro no jornal, o qual é o registo das operações do sistema de ficheiros, e só depois para o seu respectivo lugar no sistema de ficheiros. Em caso de falha, o sistema pode recuperar a correcta configuração copiando, a partir do jornal, a informação em falta ou danificada com a quebra. Em contraste, os sistemas de ficheiros não registados em jornais normalmente precisam de ser totalmente analisados por software utilitário.

Por fim, os diferentes SO suportam diferentes extensões de ficheiros, apesar de também partilharem muitas, especialmente as relativas as imagens.

Trabalho em rede

A maior parte dos SO actuais são capazes de usar os protocolos de trabalho em rede TCP/IP. Estes protocolos são a base da troca de informação, interna ou através da Internet, entre sistemas, ditando como e quando se deve processar a informação e por que códigos se devem reger. Isto significa que um sistema pode aparecer na rede de outro e partilhar as mais diversas fontes, como ficheiros, impressoras, scanners ou mesmo ligações à Internet. Por outro lado, os SO também podem suportar protocolos de trabalho em rede mais restritos, que são criados pelos fabricantes para a interacção entre sistemas iguais ou então da mesma companhia.

Segurança

No entanto, esta partilha de informação requer um elevado nível de segurança, já que o sistema se encontra potencialmente exposto a ataques vindos do exterior. Para além dos conhecidos programas anti-vírus, os próprios SO também incluem algum nível de segurança, embora num grau mais reduzido. Esta segurança é baseada em que:

  • O SO fornece acesso, directa ou indirectamente, a um grande número de fontes, tal como ficheiros num disco local, informação pessoal relativa aos utilizadores e serviços /dados oferecidos pelos programas em execução no sistema; 
  • Apesar disso, um SO é capaz de distinguir entre pedidos vindos destas fontes que são autorizados ou não a executar determinadas tarefas. Enquanto alguns sistemas foram desenhados simplesmente para diferenciar entre fontes com um estatuto de privilegiados ou não privilegiados, outros analisam a identidade do pedido (o exemplo mais conhecido é o nome do utilizador e a respectiva password). Os pedidos dividem-se, por outro lado, em duas categorias:
    • Pedidos internos vindos de um programa já em execução. Em alguns sistemas, um programa já em execução não tem limitações mas normalmente mantém uma identidade, a qual é sempre verificada pelo sistema antes do programa aceder a qualquer fonte. 
    • Pedidos externos vindos de um computador exterior. Para além da recorrente necessidade de um nome de utilizador, pode ser ainda preciso uma palavra-chave ou outro método de validação. Algumas vezes, especialmente em ligações internas entre sistemas, as fontes podem ser acedidas sem qualquer autenticação.

Segurança Interna

A segurança interna pode ser vista como uma protecção das fontes do computador contra outros programas em execução simultânea no mesmo sistema. A maior parte dos SO’s abrem programas residentes (programas que são apenas controlados pelo sistema, normalmente inacessíveis ao utilizador), mal são iniciados. O problema surge quando se torna necessário impedir que estes programas realizem tarefas similares às do SO, para além de garantir que não possuam os mesmos privilégios que o SO, pois esta também é, no final de contas, nada mais que um programa. Assim, a maior parte dos processadores usados pelos SO’s tem normalmente um sistema de distinção de privilégios através do hardware. Normalmente, os programas menos privilegiados são automaticamente bloqueados do uso de certas instruções relativas a dispositivos ou aparelhos exteriores (exemplificando, discos ou disquetes), como ler ou escrever na memória destes. Pelo contrário, têm de requerer autorização junto do programa privilegiado (Kernel do SO) realizar estas operações. Desta maneira, o SO tem a oportunidade de verificar a identidade do processo e permitir ou proibir as suas acções. A segurança interna é especialmente relevante para sistemas de multi-utilizadores, os quais permitem que cada utilizador tenha ficheiros privados, inacessíveis aos outros utilizadores do sistema.

A segurança interna é vital na verificação de cada operação, já que todos os programas podem potencialmente “contornar” as limitações impostas pelo SO.

 

Segurança externa

 

Os SO oferecem (ou albergam) vários serviços para outros computadores ou utilizadores presentes na sua rede de comunicação. Estes serviços são muitas vezes fornecidos através de portas ou canais de acesso, numerados no interior da memória do SO. Estes serviços incluem a possibilidade da troca de ficheiros, impressão, envio de e-mails, visualização de sites na Internet e recurso a protocolos de transferência de ficheiros, a maior parte dos quais pode comprometer a segurança do sistema.

Na primeira linha de segurança externa estão as firewalls e os sistemas de detecção e prevenção de entradas indevidas no sistema. Os modernos SO incluem firewalls em software (também existe em hardware), programas que podem ser configurados para permitir ou bloquear tráfico de rede que seja processado para uma aplicação a correr no SO. Desta forma, um utilizador pode instalar programas de troca de informação (como já foi referido, possíveis pontos de entrada de software maligno de origem vindo do exterior) sem que seja constantemente impedido de os utilizar em consequência de medidas defensivas por parte das firewalls.

 

Interfaces Gráficas

 

Hoje em dia, a maior parte dos SO modernos contêm interfaces gráficas inerentes ao sistema, em oposição a sistemas mais antigos que quase não as integravam no seu Kernel. Por exemplo, as primeiras versões do Microsoft Windows e do Mac OS não eram mais que interfaces gráficas do SO propriamente dito, usualmente o MS-DOS, ao contrário do que se passa actualmente, onde estas versões não só se tornaram a interface mas também o próprio sistema.

Os SO mais modernos são modulares, isto é, separam o subsistema gráfico do Kernel, o que implica que este subsistema nem se quer faça parte do sistema. Em resultado, é permitido ao utilizador instalar ou criar novas interfaces, totalmente independentes das originais.

As interfaces evoluíram bastante com o passar do tempo, não só em termos de estilo, mas também de funcionalidade e potencial de aplicação. Por exemplo, a interface do Windows muda constantemente sempre que uma nova versão é lançada, apesar de não sofrer grandes alterações no seu formato base. Por outro lado, a interface dos Mac OS mudou drasticamente com a introdução do Mac OS X, em 2001, aproximando-se mais do estilo lançado pela Microsoft, ou seja, um ambiente de trabalho com ícones e janelas que poderão ser abertas e fechadas conforme a vontade e necessidade do utilizador.

 

Controladores de dispositivos

 

Um controlador de dispositivos é um tipo de software que permite a interacção entre o sistema e os dispositivos de hardware que lhe são ligados. Geralmente, estes controladores usam interfaces gráficas de comunicação para facilitar o seu manuseamento, recorrendo depois ao subsistema de comunicação específico do computador ao qual o hardware está conectado. Deste modo, é possível emitir comandos para receber ou transmitir informação para dispositivo. Ou então, requisitar o software necessário para a execução da interface por parte do SO.

Um controlador ainda pode ser visto como um software especializado e dependente do hardware que assegura que outros programas, muitas vezes uma aplicação do Kernel, possam interagir facilmente com o dispositivo de hardware a serem utilizados pela máquina.

A ideia-chave destes controladores acaba por ser a abstracção na relação entre ele próprio e o sistema. Cada modelo de hardware, mesmo dentro da mesma classe, é diferente de muitos outros e consequentemente, poderão ser controlados de maneira diferente. No entanto, não se espera que os sistemas saibam “lidar” com cada modelo disponível no mercado, que este existe ou seja criado futuramente. Para resolver este problema, os SO ditam como cada tipo de dispositivo deve ser controlado. Depois, o controlador dos dispositivos apenas traduz estas ordens do SO para funções específicas do aparelho. Em teoria, um novo dispositivo controlado de maneira diferente, deve funcionar correctamente, se for instalado o controlador adequado. Este controlador irá garantir que o dispositivo pareça funcionar como todos os outros da sua classe do ponto de vista do SO.