SISTEMAS OPERACIONAIS


1. Introdução
Definição de Sistema Operacional:
Um sistema operacional é um conjunto de rotinas executadas pelo processador, com a função de controlar o funcionamento do computador, sendo o gerente dos vários recursos disponíveis no sistema.


Funções do Sistema Operacional:
1. Facilitar o acesso aos recursos do sistema
Um sistema de computação possui normalmente diversos componentes tais como:
terminais, impressoras, discos etc.. Quando utilizamos um destes dispositivos, não nos preocupamos com a maneira como é realizada esta comunicação e os inúmeros detalhes envolvidos. Uma operação cotidiana para a maioria de nós, como por exemplo uma leitura de um disquete, pode parecer simples. Na realidade, existe um conjunto de rotinas específicas, controladas pelo SO, responsável por acionar a cabeça de leitura e gravação da unidade de disco, posicionar na trilha e setor onde estão os dados, transferir os dados do disco para a memória e, finalmente, informar ao programa a chegada dos dados. O SO, então, serve de interface entre o usuário e os recursos disponíveis no sistema, tornando esta comunicação transparente e permitindo ao usuário um trabalho mais eficiente e com menores chances de erros. Este conceito de ambiente simulado, criado pelo SO, é denominado máquina virtual (virtual machine) e está presente, de alguma forma, na maioria dos sistemas atuais.

2. Compartilhamento de recursos de forma organizada e protegida
Quando pensamos em sistemas multiusuàrios, onde vários usuários podem estar compartilhando os mesmos recursos, como, por exemplo, memória e discos, é necessário que todos tenham chance de ter acesso a esses recursos, de forma que um usuário não interfira no trabalho do outro. Por exemplo, se imaginarmos que uma impressora possa ser utilizada por vários usuários do sistema, deverá existir algum controle para impedir que a impressão de um usuário não interrompa a impressão de outro. Novamente, o SO é responsável por permitir o acesso concorrente a esse e a outros recursos, de forma organizada e protegida, dando ao usuário a impressão de ser o único a utilizá-los. O compartilhamento de recursos permite, também, a diminuição de custos, na medida em que mais de um usuário possa utilizar as mesmas facilidades concorrentemente.

2. Máquina Virtual
Nos primeiros computadores, a programação era realizada em painéis, através de fios, exigindo um grande conhecimento do hardware e de sua linguagem de máquina. Isso era uma grande dificuldade para os programadores da época. A solução para esse problema foi o surgimento do SO, que tornou a interação entre usuário e computador mais simples, confiável e eficiente. A partir desse acontecimento, não existia mais necessidade de o programador se envolver com a complexidade do hardware para poder trabalhar; ou seja, a parte física do computador tomou-se transparente para o usuário. Partindo desse princípio, podemos encarar o computador como uma máquina de
níveis ou camadas, onde inicialmente existem dois níveis: o nível 0 (hardware) e o
nível 1 (sistema operacional). Desta forma, o usuário pode enxergar a máquina como
sendo apenas o sistema operacional, ou seja, como se o hardware não existisse. Esta
visão modular e abstrata é chamada máquina virtual.
Na realidade, um computador não possui apenas dois níveis, e sim tantos níveis
quantos forem necessários para adequar o usuário às suas diversas aplicações. Quando
o usuário está trabalhando em um desses níveis, não necessita saber da existência das
outras camadas, acima ou abaixo de sua máquina virtual.
3. Hardware
Todos os componentes de um computador são agrupados em três subsistemas básicos:
unidade central de processamento, memória principal e dispositivos de entrada e
saída. Estes subsistemas, também chamados unidades funcionais, estão presentes em
todo computador digital, apesar de suas implementações variarem em função da
arquitetura de cada fabricante.
4. Unidade Central de Processamento
A unidade central de processamento (UCP), ou processador, tem como função
principal unificar todo o sistema, controlando as funções realizadas por cada unidade
funcional. A UCP também é responsável pela execução de todos os programas do
sistema, que obrigatoriamente deverão estar amazenados na memória principal.
Um programa é composto por uma série de instruções que são executadas
seqüencialmente pela UCP, através de operações básicas como somar, subtrair,
comparar e movimentar dados. Desta forma, a UCP busca cada instrução na memória
principal e a interpreta para sua execução.
Introdução 3
___________________________________________________________________________________________________________________________
5. Clock
É um dispositivo, localizado na UCP, que gera pulsos elétricos constantes (síncronos)
em um mesmo intervalo de tempo (sinal de clock). Este intervalo de tempo determina
qual a freqüência da geração dos pulsos, e, por conseguinte, qual o seu período. A
cada período do sinal de clock dá-se o nome de estado.
O sinal de clock é utilizado pela unidade de controle para a execução das instruções.
A execução de uma instrução demora vários estados, ou seja, em um estado, parte da
instrução é executada. Para sabermos quanto tempo gasta uma instrução para ser
executada, devemos saber quantos estados ela possui e qual o tempo de duração do
estado.
6. Registradores
São dispositivos de alta velocidade, localizados fisicamente na UCP, para
armazenamento temporário de dados. O número de registradores varia em função da
arquitetura de cada processador. Algum registradores são de uso específico e têm
propósitos especiais, enquanto outros são ditos de uso geral.
Dentre os registradores de uso específico, alguns merecem destaque: o contador de
instruções (CI) ou program counter (PC) , o apontador da pilha (AP) ou stackpointer
(SP), o registrador de estado, também chamado em alguns equipamentos de program
status word (PSW).
7. Memória Principal
A memória principal, também conhecida como memória primária ou real, é a parte do
computador onde são armazenadas instruções e dados. Ela é composta por unidades
de acesso chamadas células, sendo cada célula composta por um determinado número
de bits (bynary digit). O bit é a unidade básica de memória, podendo assumir o valor 0
ou 1. Muitos computadores utilizam o byte (8 bits) como tamanho de célula, porém
encontramos computadores com células de 16, 32 e até mesmo 60 bits. Podemos
concluir, então, que a memória é formada por um conjunto de células, onde cada
célula possui um determinado número de bits.
O acesso ao conteúdo de uma célula é realizado através da especificação de um
número chamado endereço. O endereço é uma referência única, que podemos fazer a
uma célula da memória. Quando um programa deseja ler ou escrever um dado em uma
célula, deve primeiro especificar qual o endereço de memória desejado, para depois
realizar a operação.
A memória principal pode ser classificada em função de sua volatilidade, que é a
capacidade de a memória preservar o seu conteúdo mesmo sem uma fonte de
alimentação. As memórias chamadas voláteis se caracterizam por poderem ser lidas
ou gravadas, como o tipo RAM (random access memory), que constitui quase que a
Introdução 4
___________________________________________________________________________________________________________________________
totalidade da memória principal de um computador. O outro tipo, chamado de não
volátil, não permite alterar ou apagar seu conteúdo. Este tipo de memória, conhecido
Como read-only memory (ROM), já vem pré-gravado do fabricante, geralmente com
algum programa, e seu conteúdo é preservado mesmo quando a alimentação é
desligada. Uma variação da ROM é a erasable programmable ROM (EPROM), onde
podemos gravar e regravar a memória através da exposição de luz ultravioleta por um
dispositivo especial.
8. Memória Cache
É uma memória de alta velocidade. O tempo de acesso a um dado nela contido é
muito menor que se o mesmo estivesse na memória principal.
Toda vez que o processador faz referência a um dado armazenado na memória
principal, ele "olha" antes na memória cache. Se o processador encontrar o dado na
cache, não há necessidade do acesso à memória principal; do contrário, o acesso é
obrigatório. Neste último caso, o processador transfere um bloco de dados, a partir do
dado referenciado, para a cache. O tempo de transferencia entre as memórias é
pequeno, se comparado com o aumento da performance obtido com a utilização desse
tipo de memória.
Apesar de ser uma memória de acesso rápido, seu uso é limitado em função do seu
alto custo.
9. Memória Secundária
É um meio permanente (não volátil) de armazenamento de programas e dados.
Enquanto a memória principal precisa estar sempre energizada para manter suas
informações, a memória secundária não precisa de alimentação. O acesso a esse tipo
de memória é lento, se comparado com o acesso à memória cache ou à principal,
porém, seu custo é baixo e sua capacidade de armazenamento é bem superior à da
memória principal.
10. Dispositivos de Entrada e Saída
São dispositivos utilizados para permitir a comunicação entre o computador e o
mundo externo. Através desses dispositivos, a UCP e a memória principal podem se
comunicar, tanto com usuários quanto com memórias secundárias, a fim de realizar
qualquer tipo de processamento.
11. Barramento
A UCP, a memória principal e os dispositivos de E/S são interligados através de
linhas de comunicação denominadas barramentos. Um barramento (bus), também
Introdução 5
___________________________________________________________________________________________________________________________
chamado via, é um conjunto de fios paralelos (linhas de transmissão), onde trafegam
informações, como dados, endereços ou sinais de controle.
Os barramentos podem ser classificados como unidirecionais (transmissão em um só
sentido) ou bidirecionais (transmissão em ambos os sentidos). Na ligação entre UCP e
memória principal, podemos observar que três barramentos são necessários para que a
comunicação seja realizada. O barramento de dados, do tipo bidirecional, transmite
informações entre a memória principal e a UCP. O barramento de endereços, do tipo
unidirecional, é utilizado pela UCP para especificar o endereço da célula de memória
que será acessada. Finalmente, o barramento de controle, do tipo unidirecional, é por
onde a UCP envia os pulsos de controle relativos às operações de leitura e gravação.
12. Inicialização do Sistema (Boot)
O sistema operacional é essencial para o funcionamento de um computador. Sem ele,
grande parte dos recursos do sistema não estaria disponível, ou se apresentaria de uma
forma complexa para utilização pelos usuários.
Toda vez que um computador é ligado, é necessário que o sistema operacional seja
carregado da memória secundária para a memória principal. Este processo é
denominado inicialização do sistema (boot) e é realizado por um programa localizado
em uma posição específica do disco (boot block), geralmente o primeiro bloco.
13. Software
O hardware, por si só, não tem a menor utilidade. Para torná-lo útil, existe um
conjunto de programas, utilizado como interface entre as necessidades do usuário e a
capacidade do hardware. A utilização de softwares adequados às diversas tarefas e
aplicações (conceito de camadas) toma o trabalho dos usuários muito mais simples e
eficiente.
14. Tradutor
Nos sistemas operacionais antigos, o ato de programar era bastante complicado, já que
o programador deveria possuir conhecimento do hardware e programar em painéis
através de fios. Esses programas eram desenvolvidos em linguagem de máquina e
carregados diretamente na memória principal para execução.
Com o surgimento das primeiras linguagens de montagem (assembly languages) e das
linguagens de alto nível, o programador deixou de se preocupar com muitos aspectos
pertinentes ao hardware, como em qual região da memória o programa deveria ser
carregado ou quais endereços de memória seriam reservados para as variáveis. A
utilização dessas linguagens facilitou a construção de programas em muitos aspectos.
Desse modo, um programa poderia, então, ser escrito de uma forma bem documentada
e com facilidades para realizar alterações.
Introdução 6
___________________________________________________________________________________________________________________________
Apesar das inúmeras vantagens proporcionadas pelas linguagens de montagem e alto
nível, os programas escritos nessas linguagens (programas-fonte) não estão prontos
para ser diretamente executados pela UCP. Para isso, eles têm de passar por uma etapa
de conversão, onde toda representação simbólica dos programas é traduzida para
código de máquina. Esta conversão é realizada por um software denominado tradutor.
O módulo gerado pelo tradutor é denominado módulo-objeto, que, apesar de estar em
código de máquina, na maioria das vezes não pode ser ainda executado. Isso ocorre
em função de um programa poder chamar sub-rotinas externas, e, neste caso, o
tradutor não tem como associar o programa principal às sub-rotinas chamadas. Esta
função é realizada por um utilitário denominado linker e será visto adiante.
15. Montador
O montador (assembler) é o utilitário responsável por gerar, a partir de um programa
escrito em linguagem de montagem, um programa em linguagem de máquina não
executável (módulo-objeto).
A linguagem de montagem é um conjunto de símbolos (mnemônicos) associado às
instruções da linguagem de máquina do processador. Apesar das facilidades, como
instruções simbólicas e possibilidade de documentação, a programação em linguagem
de montagem está diretamente ligada às características da arquitetura do processador.
Em função disto, este tipo de linguagem é diferente para cada computador, pois a
linguagem de máquina e, conseqüentemente, a linguagem de montagem são
características específicas do processador.
16. Compilador
O compilador é o utilitário responsável por gerar, a partir de um programa escrito em
uma linguagem de alto nível, um programa em linguagem de máquina não executável
(módulo-objeto).
As linguagens de alto nível, como Pascal, Fortran, Cobol, não têm nenhuma relação
direta com a máquina, ficando essa preocupação exclusivamente com o compilador.
Os programadores de alto nível têm, apenas, que se preocupar com o desenvolvimento
de suas aplicações, não tendo que se envolver com detalhes sobre a arquitetura do
processador. Assim, os programas-fonte podem ser transportados entre computadores
de diversos fabricantes, desde que existam regras de definição para a linguagem. Isso
permite o desenvolvimento de aplicações independentes do equipamento.
Um compilador é um utilitário que opera de modo integrado aos componentes do
sistema de programação disponíveis, sob a supervisão do sistema operacional.
Podemos visualizar, então, o compilador como uma interface entre o sistema
operacional e o usuário, de maneira que seja possível acessar diversos serviços do
Introdução 7
___________________________________________________________________________________________________________________________
sistema sem a necessidade da utilização de linguagem de controle ou de outros
utilitários.
17. Interpretador
O interpretador é considerado um tradutor que não gera código-objeto. A partir de um
programa-fonte, escrito em linguagem de alto nível, o interpretador, no momento da
execução do programa, traduz cada instrução e a executa em seguida.
A maior desvantagem da utilização de interpretadores é o tempo gasto na tradução das
instruções de um programa toda vez que este for executado, já que não existe a
geração de um código executável. A vantagem é permitir a implementação de tipos de
dados dinâmicos, ou seja, que podem mudar de tipo durante a execução do programa,
aumentando, assim, sua flexibilidade.
Algumas linguagens tipicamente interpretadas são o Basic, dBase e APL.
18. Linker
O linker (ligador), também chamado de linkage editor (editor de ligação), é o utilitário
responsável por gerar, a partir de um ou mais módulos-objeto, um único programa
executável. Suas funções básicas são resolver todas as referências simbólicas
existentes entre os módulos e reservar memória para a execução do programa.
Para resolver todas as referências a símbolos, o linker também pode pesquisar em
bibliotecas do sistema ou do próprio usuário. Bibliotecas são arquivos que contêm
diversos módulos-objeto e/ou definições de símbolos.
Outra função importante do linker é determinar uma região de memória na qual o
programa será carregado para ser executado. Esta operação é denominada relocação.
Se o código executado for do tipo absoluto, o loader só necessita conhecer o endereço
de memória inicial e o tamanho do módulo para realizar o carregamento. Então, o
loader transfere o programa da memória secundária para a memória principal e inicia
sua execução (loader absoluto).
Em sistemas multiprogramáveis esse tipo de relocação é inviável, já que a memória é
compartilhada entre diversos programas, e é pouco provável que, no momento em que
o sistema carrega um programa, sua área de memória prefixada esteja disponível. A
solução para este problema é permitir que o programa seja carregado em regiões
diferentes toda vez que for trazido para a memória (código relocável). Este tipo de
relocação não é realizado pelo linker, mas, sim, através de outro utilitário denominado
loader, responsável por carregar os programas na memória,
Introdução 8
___________________________________________________________________________________________________________________________
19. Loader
O loader, também chamado carregador, é o utilitário responsável por colocar
fisicamente na memória um programa para execução. O procedimento de carga varia
com o código gerado pelo linker e, em função deste, o loader é c1assificado como
sendo do tipo absoluto ou relocável.
No caso do código relocável, o programa pode ser carregado em qualquer posição de
memória, e o loader é responsável pela relocação no momento do carregamento
(loader relocável).
20. Depurador
O desenvolvimento de programas está sujeito a erros de lógica, independentemente de
metodologias utilizadas pelo programador. A depuração é um dos estágios desse
desenvolvimento, e a utilização de ferramentas adequadas é essencial para acelerar o
processo de correção dos programas.
O depurador (debugger) é o utilitário que permite ao usuário controlar toda a execução
de um programa a fim de detectar erros na sua estrutura. Este utilitário oferece ao
usuário recursos como:
• acompanhar a execução de um programa instrução por instrução;
• possibilitar a alteração e visualização do conteúdo de variáveis;
• implementar pontos de parada dentro do programa (breakpoint), de forma
que, durante a execução, o programa pare nesses pontos;
• especificar que, toda vez que o conteúdo de uma variável for modificado,
o programa envie uma mensagem (watchpoint).
21. Linguagem de Controle
A linguagem de controle, também denominada linguagem de comando, é a forma
mais direta de um usuário se comunicar com o sistema operacional. Esta linguagem é
oferecida por cada sistema operacional pare que, através de comandos simples, o
usuário possa ter acesso a rotinas específicas do sistema.
Esses comandos, quando digitados pelos usuários, são interpretados por um programa
denominado interpretador de comandos, ou shell. O interpretador reconhece a linha de
comando, verifica sua sintaxe, envia mensagens de erro e faz chamadas a rotinas do
sistema. Dessa forma, o usuário dispõe de uma interface interativa com o sistema
operacional, para realizar tarefas como acessar um arquivo em disco ou consultar um
diretório.
Introdução 9
___________________________________________________________________________________________________________________________
Algumas linguagens de controle são poderosas a ponto de oferecerem a possibilidade
de se criar programas com estruturas de decisão e iteração. Esses programas nada mais
são do que uma seqüência de comandos em um arquivo (arquivo de comandos), que
podem ser executados sempre que necessário. As linguagens de controle evoluem no
sentido de permitirem a interação mais amigável com os usuários, utilizando
interfaces gráficas, como windows e ícones.
22. Monoprogramação
Os sistemas monoprogramáveis ou monotarefa se caracterizam por permitir que o
processador, a memória e os periféricos fiquem dedicados a um único usuário.
Nesses sistemas, enquanto o programa aguarda por um evento, como a digitação de
um dado, o processador fica ocioso sem realizar qualquer tarefa. A memória é
subutilizada caso o programa não a preencha totalmente, e os periféricos, como discos
e impressoras, estão dedicados a um único usuário, nem sempre utilizados de forma
integral.
23. Multiprogramação
Os sistemas muÍtiprogramáveis ou multitarefa são muito mais complexos e eficientes
do que os sistemas monoprogramáveis. Enquanto em sistemas monoprogramáveis
existe apenas um usuário utilizando seus diversos recursos, nos multiprogramáveis,
vários usuários dividem esses mesmos recursos. Dessa forma é possível aumentar a
produtividade dos usuários e reduzir os custos de utilização do sistema.
Por exemplo, enquanto um programa espera por uma operação de leitura ou gravação
em disco, outros programas podem estar sendo processados no mesmo intervalo de
tempo. Neste caso, podemos observar o compartilhamento de memória e processador.
Com o surgimento das estações de trabalho (workstation ), tomou-se possível um
sistema multiprogramável estar dedicado a um único usuário. Nesse ambiente, o
usuário pode estar executando várias tarefas concorrentemente em um único terminal.
A comunicação com as diversas tarefas é feita através de softwares que criam
ambientes diferenciados para cada tarefa.
24. Sistemas Batch
Os sistemas batch (lote) caracterizam-se por terem seus programas, quando
submetidos, armazenados em disco ou fita, onde esperam para ser executados
seqüencialmente.
Esses sistemas, quando bem projetados, podem ser bastante eficientes, devido à
melhor utilização do processador. Entretanto, podem oferecer tempos de resposta
Introdução 10
___________________________________________________________________________________________________________________________
longas, em face do processamento puramente seqüencial e com uma variação alta dos
seus tempos de execução.
25. Sistemas de Tempo Compartilhado
Os sistemas de tempo compartilhado (time-sharing) permitem a interação dos usuários
com o sistema, basicamente através de terminais de vídeo e teclado (interação online).
Dessa forma, o usuário pode interagir em cada fase do desenvolvimento de suas
aplicações e, se preciso, modificá-las imediatamente.
Para cada usuário, o sistema operacional aloca uma fatia de tempo (time-slice) do
processador. Caso o programa do usuário não esteja concluído nesse intervalo de
tempo, ele é substituido por um de outro usuário, e fica esperando por uma nova fatia
de tempo.
Não só o processador é compartilhado nesse sistema, mas também a memória e os
periféricos, como discos e impressoras. O sistema cria para o usuário um ambiente de
trabalho próprio, dando a impressão de que todo o sistema está dedicado,
exclusivamente, a ele.
26. Sistemas de Tempo Real
Os sistemas de tempo real (real-time) são bem semelhantes em implementação aos
sistemas de tempo compartilhado. A maior diferença é o tempo de resposta exigido na
execução das tarefas.
Enquanto em sistemas de tempo compartilhado o tempo de resposta pode variar sem
comprometer as aplicações em execução, nos sistemas de tempo real os tempos de
resposta devem estar dentro de limites rígidos, que devem ser obedecidos. Caso
contrário, poderão ocorrer problemas irreparáveis.
Nos sistemas de tempo real não existe a idéia de fatia de tempo, utilizada pelos
sistemas de tempo compartilhado. Um programa executa o tempo que for necessário,
ou até que apareça outro mais prioritário em função de sua importância no sistema.
Esta importância ou prioridade de execução é controlada pela própria aplicação e não
pelo sistema operacional, como nos sistemas de tempo compartilhado.
Esses sistemas, normalmente, estão presentes em controle de processos, como no
monitoramento de refinarias de petróleo, controle de tráfego aéreo, de usinas
termoelétricas e nucleares, ou em qualquer aplicação ande a segurança é fator
fundamental.
2 comentários

Postagens mais visitadas deste blog

MANUAL DE REDAÇÃO DA PRESIDÊNCIA DA REPÚBLICA

Plural de substantivos compostos

Atualidades - 15 de agosto de 2016