Você está na página 1de 11

Sistema Operativo

Um sistema operativo (SO) é um interface entre o hardware e o


utiliazador. É responsável pela gestão e coordenação de actividades e
partilha dos recursos limitados de um computador. O SO actua como um
hospedeiro para as aplicações que correm na máquina. Como um
hospedeiro, um dos propósitos de um sistema operativo é lidar com
detalhes das operações com o hardware, isto "alivia" as aplicações de
terem que gerir estes detalhes e torna a escrita de aplicações mais fácil.
Assim sendo, pode-se dizer que as principais funções de um SO são a
gestão de processos, a gestão de memória, controlo do sistema de
arquivos, e a gestão de dispositivos (entrada e saida de dados).
Um SO pode ser classificado de duas formas: quando à sua estrutura; e
quanto à forma de processamento. Relativamente à estrutura, podemos
distinguir 4 tipos: Monolitico; MicroKernel; CLiente-Servidor e "Layered
OS" (sistema em camadas - as funções do kernel são executadas em
camadas distintas, de acordo com o nível de privilégio). Por outro lado, no
que diz respeito à capacidade podemos também distinguir 3 tipos:
Monotarefa (apenas se pode executar um processo de cada vez),
Multitarefa e Multiprocessamento.

Estrutura do Windows
Baseada no conceito de microkernel, a estrutura do windows pode ser
dividida em duas partes distintas: o bloco Kernel Mode e o bloco User
Mode.
Relativamente ao bloco User Mode, este congrega vários módulos
distintos e independentes mas que podem interagir entre si; todavia não
contactam directamente com a camada do núcleo (kernel) e só podem
aceder à sua área de endereçamento de memória. Esta filosofia, apesar
de menos eficiente (pois sempre que alguma aplicação, serviço ou
processo necessita de aceder ao kernel tem de comutar de contexto), é
muito mais segura, pois se alguma aplicação, serviço ou processo falhar,
não é necessário reiniciar todo o sistema, mas apenas a que originou o
erro. Assim, é aqui que podemos encontrar a correr muitos dos processos
do Sistema (Winlogon, Sesion manager,...), os vários serviços que são
lançados automaticamente no arranque do windows (Services.exe,
svchost.exe), as aplicações do utilizador, as “Subsystem DLLs” e ainda os
“Environment Subsystems” (ambientes que suportam a compatibilidade
com outros sistemas - OS/2? e POSIX.
Por seu lado, o bloco Kernel Mode executa num modo privilegiado, no
qual o código tem acesso directo ao hardware e à memória do sistema,
incluindo todos os endereços destinados ao User Mode. Este bloco está
organizado em camadas. A primeira camada, e mais profunda é a HAL
(Hardware Abstraction Layer), e é sobre esta que todas as outras
assentam. Consiste num conjunto de sub-rotinas que permite generalizar
o hardware, para que possa ser reconhecido e tratado todo da mesma
forma, independentemente das especificidades - no fundo, implementa
uma Máquina Virtual?. Sobre a HAL assenta o kernel (com as funções
mais básicas do SO, como o thread scheduling e as rotinas de
antendimento a interrupções), os Device Drivers? (componentes de
software que controlam o acesso ao hardware) e os Graphic Drivers? - é
de notar que apesar de ser uma decisão perigosa (pois entregar o
desenvolvimento de Graphic Drivers a empresas que desenvolvem esse
tipo de hardware, para operar nesta zona crítica do SO é sempre um
risco), a microsoft decidiu que os Graphic Drivers deveriam operar na
zona do kernel, para ter o máximo de desempenho possível. Por isso é
que, ao contrário dos sistemas UNIX, o Windows é particularmente
dotado para correr jogos com a máxima performance. Para finalizar, por
cima da camada do Kernel assenta ainda a camada Executive?(dividida
em vários módulos), sendo aqui que se encontram as funções mais
importantes do SO, nomeadamente os módulos de I/O, segurança,
gestão de processos, gestão de memória virtual, etc.
Em suma, convém dizer que com a implementação da estrutura do
Windows NT, a Microsoft conseguiu, face aos seus antecessores, um
sistema operativo muito mais estável e confiável.

Evolução do Windows
O Microsoft Windows é uma série de interfaces gráficos e sistema
operativos desenvolvidos pela Microsoft desde 1985. 1985 - Windows
1.01 1987 - Windows 2.03 1989 - Windows 2.11 1990 - Windows 3.0 1992
- Windows 3.1x 1992 - Windows For Workgroups 3.1 1993 - Windows NT
3.1 1993 - Windows For Workgroups 3.11 1994 - Windows 3.2 1994 -
Windows NT 3.5 1995 - Windows NT 3.51 1995 - Windows 95 1996 -
Windows NT 4.0 1998 - Windows 98 1999 - Windows 98 SE 2000 -
Windows 2000 2000 - Windows Me 2001 - Windows XP 2003 - Windows
XP 64-bit Edition 2003 2003 - Windows Server 2003 2005 - Windows XP
Professional x64 Edition 2006 - Windows Fundamentals for Legacy PCs
2007 - Windows Vista 2007 - Windows Home Server 2008 - Windows
Server 2008

Completamente Reentrante
Hoje em dia todos os Sistemas Operativos são completamente
reentrantes, em consequência de serem multitarefa. Nesta perspectiva,
dizer que o SO é completamente reentrante significa dizer que possui a
capacidade de estar a executar uma determinada tarefa A, interromper
essa mesma tarefa para executar uma outra B, mesmo que esteja a
executar código ao nível do Kernel e, quando voltar a executar a tarefa A,
saber o estado em que se encontrava, sem assim perder a coerência.
Kernel
O kernel é a mais fundamental unidade de código presente no Sistema
Operativo (S.O.).
É responsável por lidar com os recursos críticos do sistema, criando
assim uma camada de abstracção,
que isola e liberta as aplicações da necessidade de lidar com a memória
num
contexto ligado ao hardware da máquina.

Existem 2 tipos fundamentais de Kernel:


=> o kernel monolitico (de maior dimensão e melhor desempenho
temporal)
=> o microkernel (mais básico, seguro e fiável)

Ambos partilham a mesma filosofia básica de fornecer às aplicações


serviços, através de chamadas de funções, e tendo em comum, pelo
menos:
1) gestor de memoria?
2) gestor de processos?
3) Device Drivers?

Nota: No Windows, o kernel está contido no ficheiro "NtosKrnl?.exe" (o


nome sofre ligeiras alterações consoante o tipo de Kernel).

Microkernel
Um MicroKernel, é, ao estilo dos Kernel actuais (que são os núcleos de
gestão dos recursos dos S.O.), um tipo de kernel muito mais compacto,
que apenas implementa as funções fundamentais de um kernel,
associadas aos recursos críticos, nomeadamente:
- Gestor de processos?;
- Gestor da memória virtual;
- Rotinas de atendimento das interrupções?
- Gestor de I/O? (Device Drivers?);

Um SO baseado num MicroKernel evidencia algumas desvantagens


relativamente ao desempenho, uma vez que obriga à existência de mais
chamadas ao sistema, com as necessárias mudanças de contexto, que
geram bastante overhead.

Por outro lado, evidencia vantagens significativas no que respeita à


estabilidade e fiabilidade do SO, uma vez que um MicroKernel tem menos
funções a executar em kernel Mode.
Processo
Nos primeiros sistemas de computação apenas podia ser executado um
programa de cada vez, com acesso e pleno controlo do sistema e dos
seus recursos. A Multitarefa exige maior controlo dos programas em
execução. Daqui resultou o conceito de processo, que é a unidade de
trabalho de SOs modernos, que suportam Multitarefa. Um sistema é uma
colecção de processos: os do SO e os do(s) utilizadore(s).

Um processo é criado quando um programa ou aplicação for executado


(a). É formado por três partes: contexto de hardware, contexto de
software e espaço de endereçamento. Um programa é uma entidade
passiva, enquanto um processo é uma entidade activa. Dois processos
podem ser associados ao mesmo programa.

O contexto de hardware refere-se ao conteúdo dos registos da CPU,


incluíndo os registos especiais, como o Program Counter (PC), o Stack
Pointer (SP) e o registo de estado (SR). Uma das tarefas cruciais da
mudança de contexto é guradar o contexto de hardware do processo
isuspenso e carregar os registos com o contexto de hardware do
processo seleccionado para execução.

O contexto de software diz respeito aos recursos do SO que podem ser


alocados ao processo. De uma forma resumida incui três conjuntos de
informações: identificação (Process Identification?, User Identification?,
etc), quotas (número máximo de arquivos abertos, tamanho máximo da
memória principal e secundária, número máximo de operações pendentes
de E/S, tamanho máximo de buffer?, número máximo de threads?) e
privilégios (direitos).

O espaço de endereçamento é a área de memória alocada ao processo,


para instruções e dados.

Thread
Hoje em dia é comum conseguir identificar diversos fluxos de execução
em programas de software, podendo esses fluxos executar em
simultâneo, conduzindo a elevados desempenhos. Cada fluxo é
denominado por thread. O SO encarrega-se de comutar a execução entre
as diversas threads em causa, dando a noção de que todas elas se
encontram a executar simultaneamente.

Como exemplo da importância deste tipo de multitarefa, refira-se a a


experiência agradável do utilizador que navega na internet, por o browser
conseguir carregar em simultâneo (aparentemente) todos os elementos
da página, criando threads para o efeito. Se assim não fosse, os
elementos seriam carregados em sequência, demorando muito mais
tempo.

Outro exemplo ilustrativo é a leitura de dados de um ficheiro e o


respectivo processamento, o que é comum na maioria das aplicações.
Como o acesso ao disco é uma operação algo lenta será obviamente
vantajoso não obrigar o processador a ficar à espera que os dados sejam
lidos, sem fazer nada, e só depois ser feito o seu processamento. Se for
utilizada uma thread para leitura e outra para processamento dos dados,
as duas executarão concorrentemente, podendo obter-se um aumento de
desempenho considerável porque a thread que faz a leitura de ficheiro
não precisa praticamente de utilizar o processador.

É importante denotar que as threads não estão realmente a executar


simultaneamente, à semelhança do que acontece com os processos.
Aliás, convém mesmo reflectir sobre a diferença entre processo e thread.
Ao contrário dos processos, que não partilham a memória nem recursos
do SO entre si, as threads partilham a mesma memória de dados e os
recursos estendendo-se essa partilha ao processo que cria as threads. E
é exactamente essa partilha que confere às threads a sua vantagem no
desempenho, pois precisam de muito menos tempo para alterar o
contexto, que basicamente se restringe ao contexto de hardware (ver a
descrição de processo).

serviço
Serviços são aplicações que podem ser iniciadas automaticamente no
arranque do SO, ou iniciadas "manualmente" quando forem necessárias,
que executam tarefas especificas em background, sem necessitar à
partida de assistência por parte do utilizador.
Um processo pode recorrer a serviços. Um exemplo é o serviço
"configuração zero sem fios" do windows, que está relacionado
com a configuração de adaptadores wireless do tipo 802.11, o qual é, por
exemplo, utilizado pelo programa de configuração da rede wireless do
windows.

A lista de serviços do windows encontra-se em:


painel de controlo -> ferramentas administrativas -> gestão de
computadores -> serviços e aplicações -> serviços;
ou iniciar -> executar -> "compmgmt.msc /s" -> serviços e aplicações ->
serviços;

Device Driver
Um device driver é um programa especial que permite que os outros
programas de computador de interajam com um dispositivo de hardware.
Um device driver, normalmente, comunica com o dispositivo através dos
barramentos do computador ou subsistemas de comunicação, aos quais
o hardware está ligado. Quando um programa invoca uma rotina do
device driver, este envia as "ordens" necessárias ao dispositivo. Assim
que o dispositivo envie os dados respectivos de volta para o device driver,
este irá assinalar o facto ao programa que o chamou. Os device drivers
dependem do hardware e são específicos para cada sistema operativo.
Normalmente são os drivers que lidam com as interrupções requeridas
para qualquer interface do hardware assíncrono e dependente do tempo.

No caso do Windows, o conceito de device driver é levado mais longe, ao


incluir nessa classe programas que filtram os dados e que, portanto, não
acedem ao hardware, mas sim aos device drivers que o controlam. Do
ponto de vista das aplicações esta relação é transparente, sendo
chamada apenas uma função de leitura de dados. Mas existe um
diferença fundamental entre aqueles tipos de device drivers: os filtros,
uma vez que não acedem a hardware, podem executar em User Mode;
enquanto que os device drivers que acedem ao hardware tem que
executar em Kernel Mode, contribuindo assim para aumentar a
instabilidade do Windows!

HAL
O HAL (Hardware abstraction Layer) é uma camada de abstracção,
implementada no software, entre o hardware de um computador e o
software de sistema. A sua função é a de "esconder" as diferenças do
hardware para o kernel do SO, de modo a que a maioria do código do
kernel não necessite de ser modificado para correr em sistemas com
hardware diferente. Num PC o HAL pode ser considerado como o driver
da motherboard e permite implementar uma espécie de Máquina Virtual?
idêntica para todos os computadores que executam o SO.

DLLs
Dynamic-link library (Biblioteca de ligação dinâmica) ou DLL, é a
implementação do conceito de bibliotecas partilhadas nos SOs
contemporâneos.
O propósito original das DLLs era economizar espaço em disco e
memória necessária para as aplicações. Com uma biblioteca padrão não-
partilhada, o número de linhas de código que são adicionadas ao
programa que faz a chamada dessa biblioteca é bastante elevado, pois
tudo o que é necessário da biblioteca para essa aplicação é copiado para
lá. Assim, se dois programas usam a mesma sub-rotina, esse código
certamente que vai ser adicionado aos dois. No entanto, para fazer face a
esta situação e sobretudo quando as funções são complexas (como as
funções gráficas), o código comum às várias aplicações pode ser
colocado numa DLL que existe como um único ficheiro que é carregado
apenas uma vez na memória, e descarregada quando terminarem as
aplicações.
No entanto, apesar de todos estes benefícios, surge também um
problema significante, conhecido como "DLL hell" (o inferno das DLLs),
que ocorre quando várias aplicações entram em conflito sobre qual a
versão de uma biblioteca que deve ser utilizada. Porém, estes conflitos
podem ser resolvidos facilmente se forem colocadas as diferentes
versões da DLL em conflito dentro das pastas das aplicações, em vez de
uma pasta para todo o sistema. De notar que essa solução não anula a
total economia conseguida com o uso dessas bibliotecas, mas anula uma
pequena parte.
Mais recentemente, com o framework Microsoft .NET a Microsoft
procurou criar uma solução mais elegante para o problema do DLL hell ao
permitir a coexistência de diferentes versões de uma mesma biblioteca.

Memória
Pode falar-se de memóra em vários contextos.
No contexto de hardware temos as voláteis(armazenam informação só
com alimentação - memória ram) e as não voláteis(armazenam
informação sem necessidade de alimentação - disco rígido)

No contexto das ciencias da computação,podemos falar de memória na


prespectiva do sistema operativo:
--> Memória virtual (processos);
~~> Strorage memory (pen-drives, discos rigidos);
--> Memory Management;
--> Memory Protection Mode
--> Kernel Memory

Memória Virtual
A memória virtual é uma parte comum de muitos sistemas operativos em
computadores pessoais, e que hoje em dia todos a implementam, na
medida em que proporciona aos utilizadores um grande benefício por um
custo muito baixo.

A maioria dos computadores actuais possui 512 megabytes de memória


central? disponível para uso pelo CPU. Frequentemente, esta quantidade
de memória não é suficiente para conter todos os programas que a
maioria dos utilizadores actuais pretendem executar em sumultâneo. Por
exemplo, se carregarmos simultaneamente o Windows (sobretudo no
novo Windows Vista com todos aqueles efeitos gráficos e detalhados
impressionantes), um programa de e-mail (ex: Thunderbird), um browser
(IE, Firefox) e um editor de texto como o Word, uma memória central de
512MB não seria suficiente. Daí que tenha então surgido o conceito de
memória virtual, que corresponde ao máximo espaço de endereçamento
que cada aplicação pode ter. No caso do Windows 32 bits (Win32?), cada
aplicação pode aceder a um espaço de memória virtual de 4 Gbytes.
Este conceito funciona porque o SO divide logicamente os programas em
blocos, chamados páginas? e, em cada instante, coloca na memória
central apenas um subconjunto das páginas de cada uma das aplicações.
Novas páginas, com instruções e/ou dados, são carregadas apenas
quando são necessárias. Claramente isto levanta uma questão: O que
acontece quando a memória central enche?
Nessa altura, o SO procura áreas (do tamanho de páginas) na memória
central que não foram usadas recentemente e copia-as para o disco
rígido, mais concretamente para uma zona chamada Zona de Swap?. Isto
liberta espaço na memória central para que assim possamos carregar as
novas páginas. Ora, como isso é efeito automaticamente pelo SO, o
utilizador não se apercebe e portanto o computador parece ter uma
quantidade de memória central ilimitada, mesmo que apenas estejam
instalados 512MB.

Neste mecanismo é evidente que o SO tem que manter, para cada


processo, uma lista das páginas de cada que estão em memória central e
em que endereços se encontram. A estrutura de dados que serve esse
propósito é chamada Page Table? e é parte intrínseca do processo.

Como o espaço no disco rígido é muito mais barato do que os chips de


memória RAM, a memória virtual proporciona ainda uma boa economia.
Tal como foi dito, o SO guarda páginas da memória central no disco
rígido, gerindo também a sua recuperação, quando necessária. Todavia,
nem tudo é assim tão perfeito: a velocidade de leitura/gravação de um
disco rígido é muito menor que a da memória RAM, e a tecnologia de um
disco rígido não é ajustada para aceder a pequenas quantidades de
dados de cada vez. Assim, se o SO tiver de utilizar muito o mecanismo de
swapping, vai ser então notória uma significativa queda no desempenho.
Para fazer face a esta situação, a ideia é possuir memória RAM suficiente
para manipular quase tudo que se costuma usar ao mesmo tempo. Logo,
o único momento em que "sentiremos" alguma lentidão devida à
utilização da memória virtual é na pequena pausa que acontece quando
se carrega incialmente um programa ou quando há necessidade de
carregar/mover páginas.

Por ultimo, convém ainda referir que como no SO o gestor de memória?


virtual opera ao nível do kernel, qualquer erro nessa área crítica do SO
obriga a reiniciar do sistema. Daí que 99,9% dos chamados “bluescreen?”
que acontecem são originados pela memória virtual.
Multitarefa
Um SO Multitarefa é um Sistema Operativo capaz de executar várias
tarefas em sequência, mas comutando de uma para outra muito
rapidamente e dando a ideia de que as tarefas estão a ser executadas em
simultâneo. A isto se chama pseudo-paralelismo?.
Um dos aspectos mais complexos da implementação deste conceito é a
necessidade de guardar o estado de cada processo. COmo exemplo, se o
SO está a realizar 5 processos "simultâneos" e se a cada um atribui um
período de 10ms, quando interrompe o processo A para executar a B,
então 50ms mais tarde, quando for retomar a execução da tarefa A, o SO
tem que refazer exactamente toda a informação relevante para a
continuação do processo A (em que parte do código se encontrava,
estado das variáveis, etc). Geralmente esta informação é guardada numa
estrutura de dados designada por Process Control Block?.

Multiprocessamento
Multiprocessamento é a capacidade de um SO executar simultaneamente
dois ou mais processos. Pressupõe a existência de dois ou mais
processadores. Difere da [multitarefa], pois esta simula a simultaneidade,
utilizando-se de vários recursos, sendo o principal o compartilhamento de
tempo de uso do processador entre vários processos.

O Multiprocessamento envolve dois ou mais processadores físicos (sejam


processadores separados ou múltiplos núcleos encapsulados no mesmo
chip) ou lógicos (processador(es) com a tecnologia HyperThreading?) e
cada um capaz de executar processos autonomamente. Isto implica que
não haja nenhuma unidade central de controlo. Cada processador contém
sua própria unidade de controlo. Assim, efectivamente, a lógica de
controlo é distribuída pelo sistema.

Na perspectiva do papel das diferentes CPUs utilizadas, o


multiprocessamento pode ser de dois tipos, sendo do SO a
responsabilidade da respectiva implementação:

- Quando todas as CPUs têm um papel semelhante, estamos perante


Multiprocessamento simétrico (SMP)

- Quando as diferentes CPUs assumem papéis diferentes, então


podemos ter diversas variantes, entre as quais:

- Multiprocessamento assimétrico (ASMP), quando a diferentes CPUs são


atribuídos processos dedicados;

- Acesso não uniforme à memória (NUMA): a cada processador é


associado um banco de memória. Nesse caso, o SO trata cada banco
separadamente, pois cada banco tem um custo de acesso diferente,
dependendo de qual o processador a que está associado e onde está
sendo executado o processo que tenta aceder à memória. Neste caso o
SO deve estar preparado para trabalhar com problemas de coerência de
caches? e de contenção nos acessos a eventual memória partilhada.

- Clusters, onde diversas máquinas são interligadas para cooperarem na


resolução de problemas complexos ou que exigem elevadas quantidades
de processamento - neste caso cada máquina executa uma tarefa
independente, existindo apenas cooperação ao nível dos resultados de
cada tarefa.

Preempetive
Um sistema operativo preemptivo é aquele que consegue
temporariamente interromper um processo (ou thread), para executar
outro, sem requerer a sua cooperação e com a intenção de o voltar a
activar mais tarde. Esta mudança é designada por context switch
("mudança de contexto"), sendo normalmente levada a cabo pelo kernel,
mais exactamente pela sua parte chamada preemptive scheduler
("agendador preemptivo"). Apenas como curiosidade, a grande maioria
dos SO que suportam esta funcionalidade, atribuem a cada processo um
tempo (designado por quantum) de 100ms.

Kernel Mode
Por oposição ao User Mode, é um modo de execução desprotegido,
destinado aos módulos do SO que gerem recursos críticos do sistema
(acesso a hardware, rotinas de atendimento de interrupções e acesso a
estruturas de dados críticas). Este modo caracteriza-se por:
- Acesso privilegiado a toda a memória e recursos do sistema.
- Se o CPU permitir vários níveis de privilégio (questões de segurança e
privilégios) o nível do kernel correrá com aceso ao mais elevado, e o nível
do utilizador ao nível 0.
- Melhor desempenho

User Mode
É um modo de execução mais protegido, cujo objectivo é isolar os
diferentes módulos que executam a este nível, não só entre si, mas
também dos que executam em Kernel Mode. Este modo caracteriza-se
por:
- Mais seguro e robusto, pois um eventual erro não obriga a reiniciar o
sistema mas sim a reiniciar o processo (redução dos "blue screen").
- Cada processo te acesso apenas à área de memória que lhe está
atribuída.
- Menor desempenho : sempre que tarefas no User Mode necessitem de
aceder à área do kernel, existem tempos de transiçao de User Mode a
Kernel Mode e vice-versa que aumentam o tempo de execução global.

POSIX
Portable Operating System Interface (POSIX) é uma família de normas
que define um SO standard. Essas normas forma definidas pelo IEEE e
ficaram conhecidas por IEEE 1003, sendo posteriormente reconhecidas
internacionalmente e assumindo a designação ISO/IEC 9945. Na prática,
essas normas especificam um conjunto reduzido de funções que
possibilita e garante que um programa que corre num SO que suporte as
normas POSIX, possa correr, sem alterações, em qualquer outro SO que
suporte essas mesmas. No fundo torna a aplicação mais abrangente pois
a aplicação que seja desenvolvida para POSIX correrá em todas os SOs
que tenham aderido a estas normas.