Sistemas Operacionais 1 - Professor Sérgio Godoy

Propaganda
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Curso Técnico Concomitante ou Sequencial de Manutenção e
Suporte em Informática
Material de Estudo
Disciplina: Sistemas Operacionais 1
Professor: Sérgio Augusto Godoy
Agosto/2009
1
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Índice
Introdução aos Sistemas Operacionais ................................................................................. 7
Conceitos Básicos ................................................................................................................. 8
Máquina de Níveis ............................................................................................................. 8
Histórico ................................................................................................................................ 8
Primeira Fase 1945-1955 .................................................................................................. 8
Segunda Fase 1956-1965 ................................................................................................. 8
Processamento Batch .................................................................................................... 9
Terceira Fase 1966-1980 ................................................................................................... 9
Quarta Fase 1981-1990 ................................................................................................... 10
Quinta Fase 1991-2000 ................................................................................................... 10
Característica de cada fase ............................................................................................. 10
Conceitos de Hardware e Software ..................................................................................... 11
Hardware ......................................................................................................................... 11
Unidade Central de Processamento ............................................................................. 11
Clock ............................................................................................................................ 11
Registradores ............................................................................................................... 11
Memória Principal ............................................................................................................ 11
Memória Cache ............................................................................................................ 12
Memória Secundária .................................................................................................... 12
Dispositivos de Entrada e Saída ...................................................................................... 12
Barramento ...................................................................................................................... 12
Pipelining ......................................................................................................................... 12
Ativação/Desativação do Sistema.................................................................................... 12
Arquiteruras ..................................................................................................................... 13
Software .............................................................................................................................. 13
O que é um Sistema Operacional ?..................................................................................... 13
O Sistema Operacional como uma Máquina Virtual ........................................................ 13
O Sistema Operacional como um Gerenciador de Recursos .......................................... 14
Tradutor ........................................................................................................................... 14
Interpretador .................................................................................................................... 14
Linker ............................................................................................................................... 14
Loader (Carregador) ...................................................................................................... 14
Depurador ........................................................................................................................ 14
Linguagem de Controle .................................................................................................... 14
Linguagem de Máquina ................................................................................................... 15
Microprogramação ........................................................................................................... 15
Evolução Histórica dos Sistemas Operacionais .................................................................. 15
Estrutura do Sistema Operacional ....................................................................................... 15
A História do Sistema Operacional LINUX ....................................................................... 16
Conceito de Linux......................................................................................................... 16
Gerenciamento de Memória ......................................................................................... 16
Escalonamento............................................................................................................. 17
Políticas de Escalonamento ......................................................................................... 17
2
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Sistema de Arquivos Unificado..................................................................................... 18
Conceitos Fundamentais .............................................................................................. 18
Tipos de arquivos ......................................................................................................... 18
Diretórios ...................................................................................................................... 18
Conta ............................................................................................................................ 19
Arquivos Compartilhados ............................................................................................. 19
Sistema de Arquivos no Linux - Descrição ...................................................................... 19
Sistema de Arquivos Linux .............................................................................................. 20
Sistema de Arquivos Second Extended File System (ext2) ......................................... 20
Partição EXT3 (Linux Native) ....................................................................................... 21
I/O no Sistema de Arquivos do Linux ............................................................................... 21
Segurança ....................................................................................................................... 22
SAMBA - Compartilhamento de arquivos ........................................................................ 22
SQUID – Acesso à Internet .............................................................................................. 23
CUIDADOS ESPECIAIS .................................................................................................. 23
Windows 2003 ..................................................................................................................... 23
Gerência de Memória ...................................................................................................... 24
Sistema de Arquivos ........................................................................................................ 25
Windows XP ........................................................................................................................ 26
Mac OS X ............................................................................................................................ 27
Descrição ......................................................................................................................... 28
Versões ............................................................................................................................ 29
Sistema de Arquivos ........................................................................................................ 29
O Sistema Operacional UNIX .............................................................................................. 31
Uma Visão Geral do Sistema Operacional UNIX ............................................................. 31
Sistema de Arquivos ........................................................................................................ 31
CONCLUSÃO ...................................................................................................................... 32
Licenças .............................................................................................................................. 32
GNU General Public License ........................................................................................... 32
Licença Comercial ........................................................................................................... 33
Licença de software livre ................................................................................................. 34
Tipos de Sistemas Operacionais ......................................................................................... 34
Sistemas Monoprogramáveis/Monotarefa ....................................................................... 34
Sistemas Multiprogramáveis/Multitarefa .......................................................................... 34
Sistemas Batch ................................................................................................................ 35
Sistemas de Tempo Compartilhados (Time-Sharing) ................................................... 35
Sistemas Tempo Real...................................................................................................... 35
Sistemas com Múltiplos Processadores .......................................................................... 35
Sistemas Fortemente Acoplados ..................................................................................... 35
Sistemas Assimétricos ................................................................................................. 35
Sistemas Simétricos ..................................................................................................... 35
Multiprocessamento ..................................................................................................... 36
Organização Funcional ................................................................................................ 36
BARRAMENTO COMUM ............................................................................................. 36
3
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
BARRAMENTO CRUZADO ......................................................................................... 37
MEMÓRIA MULTIPORT............................................................................................... 37
Sistemas Fracamente Acoplados .................................................................................... 37
Sistemas Operacionais de Rede (SOR) .......................................................................... 38
SISTEMAS OPERACIONAIS DE REDE ...................................................................... 38
Sistemas Operacionais Distribuídos ............................................................................. 39
CLUSTER..................................................................................................................... 39
Organização Funcional .................................................................................................... 40
ORGANIZAÇÃO BARRAMENTO .................................................................................... 40
ORGANIZAÇÃO DISTRIBUÍDA ................................................................................... 40
Histórico dos Sistemas Operacionais .................................................................................. 41
Tipos de Sistemas Operacionais ......................................................................................... 42
Sistemas Monoprogramáveis/Monotarefa ....................................................................... 42
Sistemas Multiprogramáveis/Multitarefa .......................................................................... 42
Sistemas Multiprogramáveis ............................................................................................ 43
Interrupção e Exceção ................................................................................................. 44
Mecanismo de Interrupção ........................................................................................... 44
Operações de Entrada/Saída........................................................................................... 45
Controlador ou Interface ............................................................................................... 45
CANAL DE E/S............................................................................................................. 46
Buffering .......................................................................................................................... 46
Operações usando o Buffer.......................................................................................... 46
Estágios da técnica de Buffering .................................................................................. 47
Spooling (Simultaneous peripheral operation on-line) .................................................. 47
Reentrância .................................................................................................................. 47
Proteção do Sistema........................................................................................................ 47
Sistema Multiprogramável/Multitarefa ................................................................................. 47
Sistemas BATCH ............................................................................................................. 48
Sistemas de Tempo Compartilhado ................................................................................. 48
Sistemas de Tempo Real ................................................................................................. 48
Sistemas com Múltiplos Processadores .......................................................................... 49
Tipos de Sistemas com Múltiplos Processadores ........................................................ 49
Sistemas Multiprogramáveis ............................................................................................ 50
Interrupção e Exceção ................................................................................................. 51
Buffer............................................................................................................................ 52
SPOOL ......................................................................................................................... 52
Reentrância .................................................................................................................. 52
Segurança e Proteção do Sistema ............................................................................... 53
Operações de Entrada e Saída .................................................................................... 53
Estrutura do Sistema Operacional ....................................................................................... 56
Funções do Sistema ........................................................................................................ 56
System Calls .................................................................................................................... 57
Modos de Acesso ......................................................................................................... 58
Arquiteturas: Sistemas monolíticos, em camadas e microkernel ................................. 58
4
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
PROCESSO ........................................................................................................................ 61
Modelo de Processos ...................................................................................................... 61
Concorrência ................................................................................................................ 62
Regiões Críticas ........................................................................................................... 62
Mútua Exclusão Com Espera Ocupada ....................................................................... 63
Desabilitar Interrupções ............................................................................................... 63
Variáveis LOCK ............................................................................................................ 63
Alternância Estrita ........................................................................................................ 63
Mútua Exclusão com Espera Bloqueada ...................................................................... 63
Sleep e Wakeup ........................................................................................................... 63
Semáforos .................................................................................................................... 64
Contadores de Evento .................................................................................................. 64
Monitores...................................................................................................................... 64
Comunicação Inter-processos ...................................................................................... 64
Passagem de Mensagem ............................................................................................. 65
Compartilhamento de Dados ........................................................................................ 65
Chamada de Procedimentos Remotos ......................................................................... 65
Processos e Threads........................................................................................................... 65
Contexto de um Processo ................................................................................................... 66
Estados de um Processo ..................................................................................................... 66
Estados de Execução de um Processo ............................................................................... 67
Sincronização de Processos ............................................................................................ 67
Problemas de Sincronização ........................................................................................... 67
Deadlock .......................................................................................................................... 68
Escalonamento de Processos ............................................................................................. 68
Escalonamento de Processos ............................................................................................. 69
Algoritmos de Escalonamento ............................................................................................. 69
Escalonamento Round Robin .......................................................................................... 69
Algoritmos com Prioridades ............................................................................................. 69
Múltiplas Filas .................................................................................................................. 70
Tarefas Pequenas Primeiro ............................................................................................. 70
Algoritmo “Policy-Driven” ................................................................................................. 70
Escalonamento em Dois Níveis ....................................................................................... 70
Semáforos ....................................................................................................................... 70
Componentes do processo .............................................................................................. 70
Estados do processo ....................................................................................................... 72
Mudanças de estado do processo................................................................................ 72
Tipos de processos .......................................................................................................... 73
Funções............................................................................................................................... 74
Critérios de escalonamento ............................................................................................. 74
Escalonamentos Não-Preemptivos e Preemptivos .......................................................... 74
GERENCIAMENTO DE MEMÓRIA ..................................................................................... 77
Gerenciamento de Memória Sem Permuta ou Paginação ............................................... 78
Monoprogramação ........................................................................................................... 78
5
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Multiprogramação e Uso da Memória .............................................................................. 78
Modelagem da Multiprogramação.................................................................................... 78
Multiprogramação com Partições Fixas ........................................................................... 78
Swapping (Permuta) ........................................................................................................ 79
Multiprogramação com Partições Variáveis ..................................................................... 79
Gerenciamento de Memória com Mapa de Bits ............................................................... 79
Gerenciamento de Memória com Listas Encadeadas ...................................................... 79
Gerência de Memória / Memória Virtual .............................................................................. 80
Funções ........................................................................................................................... 80
Alocação Contígua Simples ............................................................................................. 81
Segmentação de Programas ........................................................................................... 81
Alocação Particionada Estática........................................................................................ 82
Alocação Particionada Dinâmica ..................................................................................... 84
Estratégias de Alocação de Partição ............................................................................... 84
Swapping ......................................................................................................................... 84
Memória Virtual ................................................................................................................... 85
Paginação ........................................................................................................................ 85
Segmentação ................................................................................................................... 86
Algoritmos de Troca de Página ........................................................................................ 86
Troca Ótima de Página .................................................................................................... 86
Troca da Página Não Recentemente Usada (NRU) ........................................................ 86
Troca da Página FIFO ..................................................................................................... 87
Troca da Página Menos Recentemente Usada (LRU) ..................................................... 87
Algoritmos de substituição de páginas ............................................................................. 87
Gerência de Sistemas de Arquivos ..................................................................................... 88
Estrutura de Diretórios ..................................................................................................... 88
SISTEMA DE ARQUIVOS ............................................................................................... 88
Interface do Sistema de Arquivos ................................................................................. 88
Fundamentos Básicos .................................................................................................. 88
Diretórios ...................................................................................................................... 89
Confiabilidade do Sistema de Arquivos ........................................................................... 90
Blocos Defeituosos....................................................................................................... 90
Consistência do Sistema de Arquivos .......................................................................... 90
Desempenho do Sistema de Arquivos ......................................................................... 91
Sistemas de alocação de arquivos ...................................................................................... 93
ENTRADA/SAÍDA................................................................................................................ 93
Dispositivos de E/S .......................................................................................................... 93
Controladores de Dispositivos ......................................................................................... 94
BIBLIOGRAFIA.................................................................................................................... 96
6
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Introdução aos Sistemas Operacionais
Consiste de um ou um conjunto de programas que compõem o software básico do computador e cuja
finalidade é a de executar os programas aplicativos e de servir de interface entre o computador e seus
usuários. Um sistema operacional deve atender a três objetivos principais:
Conveniência - tornar o uso do computador mais conveniente (fácil).
Eficiência - tornar eficiente (seguro e justo) o uso e o compartilhamento dos recursos existentes
Evolução - possibilitar o constante debug e o desenvolvimento de novas funcionalidades
Numa abordagem macro, o sistema operacional pode ser visto como a primeira camada de software
acima do hardware do computador que, conforme mostra a figura abaixo, se encarrega de suportar e
servir de interface entre este e os demais programas aplicativos e utilitários.
Aplicativos
Utilitários
Sistema Operacional
Hardware
Visão do Sistema por Camadas
Um sistema operacional hoje se constitui de diversos módulos que se encarregam da comunicação,
alocação e gerenciamento de recursos específicos tais como:
· Processo
· Memória
· Arquivos
· Entrada e Saída
· Interconexão
· Alocação da UCP ("Scheduling")
· Segurança e
· Interface com o Usuário
A interface entre os programas aplicativos (processos) e o sistema operacional é realizada através de
comandos (instruções) de chamada do sistema ( as system calls). Estas chamadas estão geralmente
disponíveis ao nível das linguagens assembly e, em geral, são introduzidas nos programas escritos
em linguagens de mais alto nível, pelos respectivos compiladores.
Grande parte dos programadores não tomam conhecimento das system calls, embora seus programas
façam uso intenso delas. O fato é que muitos dos detalhes da interface com os sistemas operacionais
são escondidos do programador pelos compiladores e pelo sistema de suporte a execução dos
processos.
A história mostra que os sistemas operacionais vêm sofrendo constantes modificações com o passar
do tempo. No início eram relativamente simples, do tipo monousuário e praticamente não ofereciam
qualquer mecanismo de proteção aos usuários. Com a evolução do hardware e o surgimento de
7
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
equipamentos cada vez mais velozes, os sistemas operacionais foram se tornando mais complexos,
mais seguros, mais eficientes e mais abrangentes.
Diversos tipos de sistemas operacionais podem ser identificados: monoprogramáveis,
multiprogramáveis, multiprocessáveis, sistemas em rede, sistemas distribuidos, sistemas em lote
("batch"), sistemas de tempo compartilhado ("time sharing") e de tempo real.
Conceitos Básicos
* Sistema Operacional é um conjunto de rotinas executados pelo processador, da mesma forma que
qualquer outro programa.
*Sua Principal função é controlar o funcionamento do Computador.
*Serve de interface entre o usuário e os recursos disponíveis no sistema.
*Nos sistemas multiusuário o S.O. é responsável por permitir o acesso concorrente dos vários
usuários.
*Nos computadores pessoais o S.O. é responsável por controlar a execução concorrente de tarefas.
Máquina de Níveis
*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.
*O surgimento do S.O. tornou a interação entre usuário e o computador mais simples, confiável e
eficiente.
Usuário
Sistema Operacional
Hardware
*Podemos considerar o computador como uma máquina de níveis ou camadas.
nível 0hardware, nível 1S.O. Na realidade o computador possui tantos níveis quanto forem
necessário, desta forma o usuário pode enxergar a máquina como sendo apenas o S.O.
Aplicativos
Utilitários
Sistema Operacional
Linguagem de Máquina
Microprogramação
Dispositivos Físicos
Histórico
Primeira Fase 1945-1955
*Primeiros computadores digitais, formados por milhões de válvulas, ocupavam grandes espaços e
de funcionamento lento e duvidoso.
*A programação era feita em painéis, através de fios, utilizando linguagem de máquina.
*Não existia o conceito de S.O.
Segunda Fase 1956-1965
*Criação do transistor e das memórias magnéticas.
*Primeiras linguagens de programação Assembly e Fortran.
*Primeiros S.O. para tentar automatizar as tarefas manuais.
8
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
*Processamento Batch, quando um lote de programas era submetido ao computador.
Processamento Batch
Cartões Perfurados
Processamento
Fita de
Entrada
Fita de
Saída
Fita de
Entrada
Fita de
Saída
Processamento
Processamento
Relatórios
*Os S.O. passaram a ter seu próprio conj. de rotinas para operações de entrada/saída(Input/Output
Control System-IOCS).
*Conceito de Canal (Linha 7094 da IBM )Transferência de dados entre dispositivos de
entrada/saída e memória principal de forma independente da UCP.
*Sistemas FMS(Fortran Monitor System) e IBSYS
Terceira Fase 1966-1980
*Série 360 da IBM-1964
*S.O. OS/360
*A evolução dos processadores de entrada /saída permitiu que, enquanto um programa esperasse por
uma operação de leitura/gravação, o processador executasse um outro programa. Para tal, a memória
foi dividida em partições, onde cada programa esperava sua vez para ser processado. A essa técnica
de compartilhamento da memória principal e processador deu-se o nome de multiprogramação.
*Spooling Com a substituição das fitas por discos no processo de submissão dos programas, o
processamento Batch tornou-se mais eficiente, pois permitia a alteração na ordem de execução das
tarefas, até então puramente seqüencial.( mais tarde viria a ser utilizado no processo de Impressão.)
* Surgimento de terminais de vídeo e teclado (interação on-line) que permitem interação rápida entre
usuário e computador.
*Multiprogramação evolui preocupada comem oferecer aos usuários tempos de resposta razoáveis e
uma interface cada vez mais amigável. Para tal, cada programa na memória utilizaria o processador
em pequenos intervalos de tempo. A esse sistema de divisão de tempo do processador chamou-se
Time-sharing (tempo compartilhado).
9
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
*Surgimento do S.O. Unix(1969) minicomputador PDP-7, baseado no Sistema MULTICS
(Multiplexed information and Computing Service), foi escrito depois em linguagem C.
*No final dessa fase surgiram os primeiros microcomputadores (8 bits da Apple e o S.O.CP/M
(Control Program Monitor).
Quarta Fase 1981-1990
*LSI (Large Scale Integration) VLSI (Very Large Scale Integration) integração em larga
escalaminuaturização e barateamento dos equipamentos.
*Surgem os PC de 16 bits da IBM
*DOS (Disk Operation System).
*Sistemas multiusuários Unix (Unix-Like) e o VMS (Virtual Memory System) da DEC.
*Estações de trabalho (workstations) que apesar de monousuárias, permitem que se executem
diversas tarefas concorrentes criando o conceito de multitarefa .
*No final dos anos 80 foram adicionados outros processadores. Com o multiprocessamento foi
possível a execução de mais de um programa simultaneamente ou até de um mesmo programa por
mais de um processador.
*As redes distribuídas (Wide Area Network- WANs) se difundiram por todo o mundo permitindo o
acesso a outros sistemas de computação, independentemente de estado, país e fabricante.
*Desenvolvidos inúmeros protocolos de rede. DECnet da DEC , SNA da IBM
TCP/IP de domínio publico e o CCITT X.25
*Surgem as LANs
*S.O. de rede.
Quinta Fase 1991-2000
*Conceito de processamento distribuído será explorado nos sistemas operacionais de forma que suas
funções estejam espalhadas por vários processadores através de redes.
*A arquitetura Cliente-Servidor aplicada basicamente a redes locais passa a ser oferecida em redes
distribuídas, permitindo que qualquer pessoa tenha acesso a todo tipo de informação,
independentemente de onde esteja armazenada. Problemas de segurança, gerência e desempenho
tornam-se fatores importantes relacionados ao S.O. e à rede.
*Consolidação dos S.O. baseados em interfaces gráficas.
*ULSI (Ultra Large Scale Integration)
Característica de cada fase
FASE
COMPUTADOR
ES
HARDWARE
SOFTWARE
Primeira
1945-1955
ENIAC
EDVAC
UNIVAC
Segunda
1956-1965
NCR
IMB 7094
CDC-6600
Válvulas
Tambor
Magnético
Tubos de
raios
catódicos
Ling.
Máquina
Transistor
Memória
magnética
Ling. Alto
Nível
Terceira
1966-1980
IBM 360-370
PDP-11
Cray 1
Cyber-205
Circuito Integrado
Disco magnético
Minicomputador
Microprocessador
Quarta
1981-1990
Cray XMP
IBM 308
VAX-11
IBM-PC
LSI ou VLSI
Disco óptico
Microcomputador
Quinta
1991-2000
IBM 3090
Alpha AXP
Pentium
Sun SPARC
Ultra-LSI
Arquiteturas
paralelas
Circ. Integrado
3-D
Ling. Estruturadas
Multiprogramação
Multiprocessamento
Sist. especialistas
Processamento
distribuído
10
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Ling.
assembly
Telefone
Telecomunicações Teletipo
10 ips
Processame Time -Sharing
nto Batch
Computação
gráfica
Ling. Orientadas a
objetos
Transmição Comunicação via
digital
Satélite
Microondas
Redes distribuídas
(WAN)
Fibra óptica
Redes Locais(LAN)
Internet
200.000 ips
30 Mips
5 Mips
DESEMPENHO
Ling.
concorrentes
Programação
funcional
Ling. Naturais
Redes locais
estendidas(ELA
N)
Redes sem fio
Modelo ClienteServidor
1 Gflops
1 Tflops
Conceitos de Hardware e Software
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/saída. Estes subsistemas,
também chamados Unidades Funcionais.
Unidade Central de Processamento
*Função principal unificar todo o sistema.
*Execução de todos os programas do sistema, que estão obrigatoriamente armazenados na memória
principal.
*Executa seqüencialmente as series de instruções que compõe um programa.
*Composta por 2 componentes básicos:
º Unidade de controle UC controla atividades de todos os componentes do computador.
º Unidade Lógica e Aritmética ULA operações lógicas (teste e comparação) e aritméticas
(somas e subtrações).
Clock
*Localizado na UCP, gera pulsos elétricos síncronos em determinado tempo(sinal de clock)
*Freqüência de clock Vezes que o pulso se repete em um segundo. Hertz (Hz).
*pode ser utilizada como unidade de desempenho.(maior freqüência = maior instruções executadas
pela UCP).
Registradores
*De alta velocidade localizados na UCP para armazenar temporariamente os dados.
*Entre os registradores de uso específico, destacam-se:
º Contador de instruções CI ou Program Counter PC armazenamento da próxima instrução.
º Apontador da pilha AP ou Stack Pointer SP armazenamento de instruções que estavam sendo
usadas e foram interrompidas por algum motivo.
º Registrador de estado ou Program Status Word PSW informação sobre a execução do programa.
Memória Principal
*Onde são armazenados instruções e dados.
*Composta por unidades de acesso - Células de (8bits) Byte.
11
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
*Endereço Especificação de um número de acesso ao conteúdo da célula, antes de um programa
escrever ou ler um dado em uma célula, deve especificar um endereço de memória.
*Registrador de endereço de memória As especificações do endereço é realizado por
MAR (Memory Register Address) . A capacidade da memória é limitada pela MAR.
*Registrador de dados da memória Guarda o Conteúdo de uma ou mais células de memória. MBR
(Memory Buffer Register).
*A memória principal pode ser classificada em função de sua volatividade.
º RAM (Random Access Memory ) volátil.
º ROM ( Read-Only Memory) não volátil.
Memória Cache
*Volátil de alta velocidade
*Alto custo
Memória Secundária
*Não volátil.
*Acesso lento.
*Custo baixo
*Grande capacidade de armazenamento.
Dispositivos de Entrada e Saída
*Comunicação entre o computador e o mundo externo
*Divididos em:
º Utilizados como memória secundária (Disquete).
º Comunicação homem-máquina (Teclado).
Barramento
*Interliga memória principal, UCP e Disp. de entrada/Saída.
*Bus Conj. de fios paralelos (linhas de transmissão) onde trafegam informações (dados, endereços,
sinais de controle).
*Unidirecional  transmição em um só sentido
*Bidirecional  transmição em ambos sentidos
*Barramento de dados Transmite informações entre memória princ.e UCP.
*Barramento de endereços UCP especifica endereço dea célula de memória que será acessada.
*Barramento de controle UCP envia os pulsos de controle relativos às operações de leitura e
gravação.
Pipelining
* Semelhante a uma linha de montagem, onde cada tarefa é divida em seqüencia de subtarefas,
executadas em diferentes estágios.
*Pode ser empregada em sistemas com um ou mais processador em diversos níveis, tem sido a
técnica de paralelismo mais utilizada para maior desempenho dos sistemas de computadores.
Ativação/Desativação do Sistema
*Boot Carrega o S.O. da memória secundária para a principal, realizado por um programa
localizado no Boot block .
*Shutdown  Desativa o S.O. e componentes de forma ordenada.
12
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Arquiteruras
Arquiteturas RISC (Reduced Instrution Set Computer) e CISC (Complex Instrution Set Computer)
*RISC  Poucas instruções de máquina.
Bastante simples executadas diretamente pelo hardware.
Na maioria não acessam a memória principal.
Trabalho com registradores.
Grande número de registradores.
Ex. Sparc(SUN), RS 6000 (IBM), PA-RISC (HP), Alpha AXP (DEC) e Rx000 (MIPS).
*CISC Instruções complexas interpretadas por microprogramas.
Pequeno número de registradores.
Qualquer instrução pode referencia a memória principal.
Dificil a implementação Pepilining .
Ex. VAX (DEC), 80x86 e o Pentium (Intel) e o 68xxx (Motorola).
Software
Programas computacionais (ou software) constituem o elo entre o aparato eletrônico (ou hardware) e
o ser humano. Tal elo se faz necessário dada a discrepância entre o tipo de informação manipulada
pelo homem e pela máquina. A máquina opera com cadeias de códigos binários enquanto o homem
opera com estruturas mais abstratas como conjuntos, arquivos, algoritmos, etc.
Qualquer computador moderno tem uma variedade de programas que fazem diversas tarefas.
Eles podem ser classificados em duas grandes categorias:
1. Software de sistema que incluiu o firmware (O BIOS dos computadores pessoais, por
exemplo), drivers de dispositivos, o sistema operacional e tipicamente uma interface gráfica
que, em conjunto, permitem ao usuário interagir com o computador e seus periféricos.
2. Software aplicativo, que permite ao usuário fazer uma ou mais tarefas específicas.
Aplicativos podem ter uma abrangência de uso de larga escala, muitas vezes em âmbito
mundial; nestes casos, os programas tendem a ser mais robustos e mais padronizados.
Programas escritos para um pequeno mercado têm um nível de padronização menor.
O que é um Sistema Operacional ?
A maioria de usuários de computador têm alguma experiência com sistemas operacionais, mas é
difícil definir precisamente o que é um sistema operacional. Parte do problema decorre do fato do
sistema operacional realizar duas funções básicas que, dependendo do ponto de vista abordado, uma
se destaca sobre a outra. Estas funções são descritas a seguir.
O Sistema Operacional como uma Máquina Virtual
A arquitetura (conjunto de instruções, organização de memória, E/S e estrutura de
barramento) da maioria dos computadores a nível de linguagem de máquina é primitiva e
difícil de programar, especificamente para operações de entrada e saída. É preferível para um
programador trabalhar com abstrações de mais alto nível onde detalhes de implementação das
abstrações não são visíveis. No caso de discos, por exemplo, uma abstração típica é que estes
armazenam uma coleção de arquivos identificados por nomes simbólicos.
O programa que esconde os detalhes de implementação das abstrações é o sistema operacional. A
abstração apresentada ao usuário pelo sistema operacional é simples e mais fácil de usar que o
13
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
hardware original.
Nesta visão, a função do sistema operacional é apresentada a o usuário como uma máquina estendida
ou máquina virtual que é mais fácil de programar que o hardware que a suporta.
O Sistema Operacional como um Gerenciador de Recursos
Um computador moderno é composto de vários subsistemas tais como processadores, memórias,
discos, terminais, fitas magnéticas, interfaces de rede, impressoras, e outros dispositivos de E/S.
Neste ponto de vista, o sistema operacional tem a função de gerenciar de forma adequada estes
recursos de sorte que as tarefas impostas pelos usuários sejam atendidas da forma mais rápida e
confiável possível. Um exemplo típico é o compartilhamento da unidade central de processamento
(CPU) entre as várias tarefas (programas) em sistemas multiprogramados. O sistema operacional é o
responsável pela distribuição de forma otimizada da CPU entre as tarefas em execução.
Tradutor
*Gera o Modulo-Objeto( Cód. de máquina )
*Montador (Assembler) diretamente ligada as características do processador.
*Compilador Pode ser transportados entre computadores de diversos fabricantes, desde que exista
regras para a definição da linguagem.
Interpretador
*Tradutor que não gera código-objeto.
*Gasta mais tempo na tradução das instruções.
Ex. Basic, o dBase eo APL.
Linker
*Gera a partir de um ou mais módulo-objeto um único programa executavel.
*RelocaçãoDeterminar região de memória na qual o programa será carregado.
Código Absoluto... S.O. antigos posição prefixiada na memória.
Código Relocável... S.O. multiprogramaveis  posição variável na memória.
*Bibliotecas são arquivos que contêm diversos módulos-objeto e/ou definições de simbolos.
Loader (Carregador)
* Coloca fisicamente na memória um programa.
*Loader absoluto
*Loader relócavel
Depurador
*Controla a execução de um programa a fim de detectar erros na sua estrutura.
*Acompanha a execução passo a passo.
*Possibilita alterações e visualização do conteudo de variáveis
*Implementa breakpoint pontos de parada dentro do programa.
*Watcpointenvia mensagem toda vez que o conteudo de uma variável for modificado.
Linguagem de Controle
*Forma mais direta de comunicação entre o usuário e o S.O.
*ShellInterpretador da linguagem de comando(Controle).
14
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Linguagem de Máquina
*Linguagem que oprocessador entende.
Microprogramação
*Microprogramas definem a linguagem de máquina de cada computador.
Evolução Histórica dos Sistemas Operacionais
A evolução dos sistemas operacionais foi uma conseqüência dos avanços ocorridos no hardware dos
computadores. Temos três níveis de gerações de sistemas operacionais:
O primeiro nível integrado pelos sistemas operacionais básicos, surgidos nos anos cinqüenta,
limitava-se a auxiliar os programas nas operações de entrada e saída e na tradução nos programas
fonte, escritos em linguagem pouco evoluídas.
O segundo nível esteve disponível na década de 60 e a sua ajuda à programação foi mais decisiva,
proporcionando tradutores simbólicos mais evoluídos, programas de serviços para transferência de
informação entre periféricos e programas de controle de entrada e saída, ou seja, os famosos IOCS(
Input Output Control System).
O terceiro nível de sistemas operacionais surgiu na década de 70. A contribuição destes sistemas à
programação foi tão grande que foram rompidas as normas clássicas do processo informático. Os
tradutores de altíssimo rendimento então incorporados têm permitido hoje em dia a utilização de
linguagem de programação simbólica quase idênticas à linguagem utilizada pelo homem, reduzindo
sensivelmente o tempo gasto na produção bem como o tempo de aprendizagem de novas linguagens.
Estrutura do Sistema Operacional
Pode-se criar um sistema tão grande e complexo como um sistema operacional somente dividindo-o
em pequenas partes. Cada uma dessas partes deve ser uma porção bem delineada do sistema, com
entradas, saídas e funções, cuidadosamente definidas. Logicamente, nem todos os sistemas têm a
mesma estrutura, ou seja, não apresentam a mesma forma de ligação entre as partes. Contudo, os
sistemas operacionais modernos geralmente possuem as seguintes partes:
I. Gerenciamento de processos - criar e eliminar, suspender e retomar, sincronismo e comunicação
entre processos;
II. Gerenciamento da memória principal – manter o controle das partes da memória que estão sendo
usadas e por quem, decidir que processos serão carregados para memória quando houver espaço
disponível, alocar e desalocar espaço de memória quando necessário;
III. Gerenciamento de memória secundária – o SO é responsável pelas atividades de alocação de
espaço livre.
IV. Gerenciamento de Entrada/Saída – manter os device drivers para comunicação com os deferentes
dispositivos, um buffer-caching para o sistema;
V. Gerenciamento de arquivos – criar e eliminar arquivos e diretórios, manter mapeamento dos
arquivos em disco;
VI. Proteção do sistema – se um sistema é multiusuário e permite múltiplos processos concorrentes,
estes processos devem ser protegidos de outras atividades;
VII. Networking – em um sistema distribuído (fracamente acoplado) cada processador tem sua
própria memória e seus processadores que se comunicam através do SO. A comunicação entre eles
deve considerar roteamento e estratégias de conexão;
15
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
VIII. Interpretador de comandos – um dos mais importantes programas do SO é o interpretador de
comandos, que serve de interface entre o usuário e o SO. Alguns SO’s incluem este programa no
próprio núcleo (kernel). Já outros sistemas, como o DOS e o UNIX, tratam o interpretador de
comandos como um programa especial que é executado quando uma sessão é iniciada. Com isso, um
sistema operacional fornece um ambiente para execução, melhor dizendo, fornece serviços para os
programas e também para os usuários desses programas.
A História do Sistema Operacional LINUX
O Sistema Operacional Linux foi originalmente criado por Linus Torvalds na Universidade de
Helsinki na Finlândia. Ele foi desenvolvido com a ajuda de vários programadores através da
Internet. Linus teve seu projeto inspirado pelo seu interesse em Minix, um pequeno sistema Unix
desenvolvido por Andy Tannenbaum. No dia cinco de Outubro de 1991, Linus anunciou a primeira
versão "oficial'' de Linux, versão 0.02. Desde então, vários programadores responderam à sua
chamada, e haviam ajudado a tornar Linux o completo sistema operacional que ele é hoje.
Conceito de Linux
Linux é um sistema operacional Unix independente, largamente distribuído para máquinas x86,
Motorola 68k, Digital Alpha e Motorola PowerPC. Ele é uma implementação da especificação do
POSIX com a qual todas as verdadeiras versões de Unix consentem. O núcleo de Linux não usa
códigos de AT&T ou qualquer outra fonte de proprietário, e muitos dos softwares disponíveis para
Linux são desenvolvidos pelo projeto Free Software Foundation's GNU. Enfim, é uma completa
implementação do sistema operacional Unix. Como Unix, Linux é um multi-tarefa robusto, multiusuário, sistema operacional de rede que ostenta uma longa lista de padrões aceitáveis . Possui
suporte completo para ambas plataformas de 32 e 64-bits, múltiplas CPUs e alta performance para
redes e outros periféricos. Ele suporta uma vasta variedade de softwares, incluindo X Windows,
Emacs e redes TCP/IP (incluindo SLIP/PPP/ISDN). Muitas pessoas já executaram marcas de nível
em sistemas 80486 Linux e acharam elas comparáveis com estações de trabalho médias da Sun e
Digital. O Sistema Operacional Linux está disponível na Internet em diversos sites, e também com
várias versões em disquetes ou CD-ROM. A parte central de Linux é coberta pela GNU Public
License (GPL), e é geralmente "empacotada" com vários binários que consistem em um sistema
operacional trabalhando em Unix. Esses pacotes de softwares são chamados ―distribuições‖ e
chegam em muitos tamanhos e estruturas. Linux está sendo usado hoje por milhões de pessoas em
todo o mundo. Ele é usado para desenvolvimento de software, rede (intra-office e Internet), e como
plataforma para usuário. Linux tornou-se uma alternativa barata para os caros sistemas Unix.
Gerenciamento de Memória
A execução do LMM (Linux Memory Manager) exige uma estratégia de paginação com uma copyon-write (copiado e marcado) confiando nas 386 páginas auxiliares. Um processo alcança suas
tabelas de páginas de seu parent (durante um fork ) com as entradas marcadas como read-only ou
trocado. Então, se o processo tenta escrever para este espaço de memória e a página é uma copy on
write page, isto é copiado e a página marcada read-write. Um exec ( ) resulta na leitura de uma
página ou mais do executável. O processo então erra em qualquer outra página que precisar. Cada
processo tem uma tabela de página que significa que pode acessar 1 Kb de tabela de página
indicando para 1 Kb de 4 Kb, páginas que é 4 Gb de memória. Um diretório de página do processo é
iniciado durante um Fork por copy-page-tables. O processo inativo tem seu diretório de página
inicializado durante a sequência de inicialização. Cada processo usuário tem uma tabela descritória
16
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
local que contém um código de segmento e um segmento de dados. Estes segmentos usuários
extendem de 0 para 3 Gb (0 X c 0000000). Nos espaços usuários, endereços lineares e endereços
lógicos são idênticos. No 80386, endereços lineares vão de 0 Gb para 4 Gb. Um endereço linear
indica uma posição particular de memória dentro deste espaço. Um endereço linear não é um
endereço físico --- isto é um endereço virtual. Um endereço lógico consiste de um seletor e um
offset. O seletor indica para um segmento e o offset diz que distância na seção o endereço é
localizado. O código Kernel e o segmento de dados são seções privilegiados definidos na tabela
descritora global e extende de 3Gb para 4Gb. O Swapper - page - dir é organizado para que estes
endereços lógicos e físicos sejam idênticos no espaço Kernel.
Escalonamento
O escalonador LINUX é baseado em time-sharing, ou seja, atua na divisão do tempo de processador
entre os processos. O Scheduler é o programa encarregado de agendar os processos, isto é, ele deve
escolher o próximo processo que vai rodar, deve decidir quando o tempo de um processo terminou, o
que fazer com um processo quando ele requisita I/O e assim por diante. Ele é chamado de vários
pontos do programa, como após colocar o processo corrente em uma fila de espera, no final de uma
chamada de sistema ou qualquer outro momento em que se faz necessário escalonar os processos. Ao
ser chamado, o scheduler tem uma seqüência de ações que devem ser tomadas para que seu trabalho
possa ser feito. Essas ações se dividem em:
Kernel Work: o scheduler deve realizar uma série de rotinas especificas do kernel, como o bottom
half handlers (que será tratado mais adiante) e deve tratar da gila de esperas de tarefas do scheduler.
Seleção de processo: o scheduler deve escolher o processo que irá rodar. A prioridade é o meio pelo
qual ele escolhe.
Troca de processos: o scheduler salva as condições que o processo atual apresenta (contexto
específico do processo) e carrega o contexto do novo processo que irá rodar.
Em ambientes multiprocesados (SMP - Simultaneous Multi Processing), cada processador tem um
scheduler para tratar separadamente quais processos irão rodar nele. Dessa forma, cada processo
guarda informação sobre o processador atual e o último processador em que rodou. Processos que já
tenham rodado em um processador tem preferência em relação aqueles que não tenham rodado ali
ainda. Essa implementação permite um ligeiro acréscimo de ganho no desempenho do sistema.
Políticas de Escalonamento
Existem critérios para o escalonamento dos processos em Linux:
Policy: Pode haver duas políticas de escalonamento round-robin e first-in-first-out (FIFO).
Priority: A prioridade do processo é dada de acordo com o tempo que ele gastou para executar (em
jiffies). Jiffies é uma variável que indica a quantidade de tempo que um processo pode ser executado,
onde cada valor atribuído depende de cada máquina. Quanto maior o tempo em uma execução
anterior, menor a prioridade do processo.
Real time priority: Esse recurso é usado para processo de tempo real. Através disso, os processos de
tempo real podem ter prioridade relativa dentro desse conjunto. A prioridade pode ser alterada
através de chamadas do sistema.
Counter: É a quantidade de tempo (em jiffies) que os processos têm permissão para rodar. É setada a
prioridade quando o processo é rodado pela primeira vez e decrementada a cada tick do clock.
Sistemas de Arquivos
Visão Geral sobre Sistema de Arquivos
17
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Conceitualmente, arquivos são mecanismos de abstração que fornecem uma forma de armazenar e
recuperar informações em disco. A características mais importante de qualquer mecanismo abstração
é a forma de identificar os objetos como os quais o mecanismo trata. Quando um processo cria um
arquivo, é preciso que tal arquivo receba um nome, normalmente dado pelo processo. Quando tal
processo termina sua execução, o arquivo continua a existir, podendo ser acessado por outros
processos, usando para tanto o nome atribuído ao arquivo. O sistema de arquivos é a parte mais
visível do sistema operacional. A maioria dos programas lêem e escrevem em pelo menos um
arquivo. O sistema de arquivos encara o disco como se este fosse composto simplesmente por uma
seqüência de blocos de tamanho fixo. Cada bloco pode ser composto por 1, 2, 4 ou mais setores
físicos; desta forma, tamanhos possíveis de blocos (ou clusters) são 512 bytes, 1 KB, 2KB e assim
por diante.
Sistema de Arquivos Unificado
O Sistema de Arquivos Unificado está presente em todas as variantes Unix.Ao contrário da grande
maioria dos sistemas operacionais, unidades de armazenamento distintas são enxergadas como parte
de um único e imenso diretório, de forma que quando estamos acessando um arquivo, por exemplo,
no diretório /etc podemos estar acessando uma unidade de disco rígido enquanto o arquivo que
estamos lendo na outra janela pode estar num CD-ROM.
Conceitos Fundamentais
O Linux organiza o seu sistema de arquivos em uma árvore hierarquizada, resultando em uma
estrutura única que agrega todas as informações relativas ao sistema de arquivos. Cada nodo da
árvore pode representar um arquivo, um dispositivo de entrada e saída, ou ainda um diretório. O
Linux faz distinção entre nome maiúsculos e minúsculos. Normalmente um nome de arquivo é
composto de nome e uma extensão, separada por ponto no Linux, o tamanho da extensão, se houver,
fica a critério do usuário, e um arquivo pode até ter duas ou mais extensões.
Ex : prog.c.Z.
Não há limite de números de caracteres utilizados para dar nome a arquivos. O Sistema Operacional
Linux, olha o arquivo como uma sequência de byte, sem nenhuma estrutura, isto dá uma
flexibilidade espantosa ao sistema de arquivo. Os programas de usuários, podem colocar o que
desejarem nos arquivos e identificá-los da forma que lhe for mais conveniente, o Unix não influência
em nada nesta processo de identificação.
Tipos de arquivos
O Linux suporta arquivos regulares, arquivos de diretório, arquivos especiais de caracteres e arquivos
especiais blocados. Os arquivos regulares são aqueles que contém informações de usuários, por
exemplos, tipo ASCII. Arquivos diretórios são arquivos usado na manutenção do sistema de
arquivo. Arquivos especiais de caracteres estão diretamente ligado à entrada/saída e são usados para
dispositivos seriais de entrada/saída, tais como terminais, impressoras e rede. Os arquivos especiais
blocados são usado modelar dispositivos.
Diretórios
Para tratar dos arquivos, o sistema operacional normalmente lança mão do diretórios, no caso do
Linux diretórios hierárquico. Os diretórios são um tipo de arquivo. No Linux todos os arquivos
fazem parte de um diretório, assim eles são mantidos e organizados, os diretórios são meios de
oferecer endereços dos arquivos, de maneira que o SO possa acessá-los rapidamente e facilmente, ao
18
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
entra pela primeira vez em sua conta, o usuário já esta em um subdiretório denominado subdiretório
de entrada.
Conta
É uma senha que é aberta pelo administrador do sistema (denominado de root) onde o usuário
indentifica-se para o computador, que então dá acesso ao seu diretório de entrada, onde você pode
executar os comandos permitidos a sua senha. Nos SO padrão Unix, a conta é obrigatória para todos.
Arquivos Compartilhados
Quando vários usuários estão trabalhando juntos em um projeto, ele comumente precisam
compartilhar arquivos. Em decorrência disto, muitas vezes é conveniente que um arquivo
compartilhado apareça simultaneamente em diretórios diferentes que pertençam a diferentes
usuários. A conecção entre um diretório e um arquivo compartilhado é chamada de ligação (link). O
próprio sistema de arquivo é um gráfico acíclico dirigido , ou DAG, em vez de árvore. No Linux os
blocos do disco não são listados no diretório, mas numa estrutura de dados associada ao próprio
arquivo. Esta estrutura é chamada nó-i, é a forma como o Linux implementa compartilhamento
arquivo.
Sistema de Arquivos no Linux - Descrição
O Sistema de Arquivos do Linux é estrutura de organização de arquivos em formato de árvore, que
permite:
·
hierarquia (de diretórios e arquivos);
·
proteção das informações;
·
compartilhamento dos arquivos.
Todos os arquivos linux estão arranjados em uma única árvore hierárquica. Em linux o usuário não
precisa se preocupar com discos específicos como C:, D:, etc. Na verdade, o usuário não necessita
saber como os arquivos estão arranjados fisicamente em um ou mais discos. O Linux suporta
diversos sistemas de arquivos. Estes não são acessados via identificadores, e sim combinados numa
estrutura hierárquica em árvore, que representa o sistema de arquivos como uma entidade única.
Cada partição do disco pode conter um sistema de arquivos. Dentre esses sistemas destacamos:
Minix: mais antigo e presumivelmente o mais confiável, mas bastante limitado em características
(algumas datas não aparecem , máximo de 30 caracteres para nome de arquivos, etc...) e restrito em
armazenamento (no máximo 64 Mb por sistema de arquivos).
Xia: ma versão modificada do sistema de arquivos minix, o qual aumenta os limite de nomes de
arquivos e de sistemas de arquivos, mas não introduz novas facilidades. Não é muito popular, mas
comenta-se que funcione muito bem.
ext2: mais poderoso e popular sistema de arquivos nativo do Linux. Desenhado para ser facilmente
compatível com os avanços das novas versões, sem a necessidade de criar novamente os sistemas de
arquivos já existentes.
Ext: Uma versão antiga do ext2 que não é mais compatível com versões atuais. É raro vê-la instalada
em sistemas novos e mesmo os mais antigos têm sido convertidos para ext2. Adicionalmente há o
suporte a diversos outros sistemas de arquivos, para simplificar a troca de informações com outros
sistemas operacionais. Estes sistemas de arquivos funcionam como se fossem nativos, exceto pela
perda de algumas facilidades presentes no UNIX, ou apresentam algumas particularidades.
Msdos: Compatibilidade com MS-DOS (e OS/2 e Windows NT) através de sistemas de arquivos
FAT/FAT32.
19
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Umsdos: Sistemas de arquivos MS-DOS estendidos para suportar nomes longos, donos, permissões,
links e arquivos de dispositivos do Linux. Isso permite que um sistema de arquivos msdos possa ser
usado como se fosse um sistema Linux, removendo a necessidade de uma partição distinta para o
Linux.
iso9660: O sistema de arquivos padrão do CD-ROM. A extensão Rock Ridge que permite nomes
longos também é suportada automaticamente.
Nfs: Sistemas de arquivos em redes que permitem o compartilhamento e o fácil acesso aos arquivos
entre diversos computadores da rede.
Hpfs: O sistema de arquivos do OS/2.
Sysv: Sistema de arquivos do System V/386, Coherent e Xenix.
Sistema de Arquivos Linux
É criado durante a ―formatação‖ da partição de disco Após a formatação toda a estrutura para
leitura/gravação de arquivos e diretórios pelo sistema operacional estará pronta para ser usada.
Normalmente este passo é feito durante a instalação de sua distribuição GNU/Linux.
Cada sistema de arquivos tem uma característica em particular mas seu propósito é o mesmo:
Oferecer ao sistema operacional a estrutura necessária para ler/gravar os arquivos/diretórios.
Entre os sistemas de arquivos existentes posso citar:
• Ext2 - Usado em partições Linux Nativas para o armazenamento de arquivos.
• Ext3 - Este sistema de arquivos possui melhorias em relação ao ext2, como destaque o
recurso de jornaling. Ele é totalmente compatível com o ext2 em estrutura. O journal mantém um log
de todas as operações no sistema de arquivos, caso aconteça uma queda de energia elétrica (ou
qualquer outra anormalidade que interrompa o funcionamento do sistema), o fsck verifica o sistema
de arquivos no ponto em que estava quando houve a interrupção, evitando a demora para checar todo
um sistema de arquivos (que pode levar minutos em sistemas de arquivos muito grandes).
• Swap - Usado em partições Linux Swap para oferecer memória virtual ao sistema.
Sistema de Arquivos Second Extended File System (ext2)
Atualmente, o sistema de arquivos mais utilizado pelo Linux é o EXT2 (Second Extended File
System). Nele os arquivos são guardados em blocos de mesmo tamanho, determinado durante a
criação do sistema de arquivos. A partição lógica que ele ocupa é dividida em Block Groups, cada
um contendo informações críticas para a integridade do sistema de arquivos, além de conter arquivos
e diretórios. Cada Block Group contém um superblock, que contém informações sobre o sistema de
arquivos. Normalmente, só o superblock do primeiro Block Group é lido. Os demais são utilizados
caso haja corrupção do sistema de arquivos. Um arquivo qualquer no Linux é composto por uma
quantidade inteira de blocos. Assim, cada arquivo tem seu tamanho arredondado de forma a ocupar
um número inteiro de blocos. Por exemplo, se considerarmos blocos de tamanho de 1024 byes, um
arquivo de 1025 bytes ocupará dois blocos, ou seja, 2048 bytes. Essa política de alocação implica
que se desperdice metade do tamanho de um bloco por arquivo. Esse desperdício é, na verdade,
resultante de um compromisso entre desempenho e economia de espaço em disco.
A organização de blocos da partição em grupos de blocos também está relacionado com um
problema de desempenho, tendo como principal objetivo evitar a disperção de arquivos no disco.
Dessa forma, o núcleo tenta alocar para um arquivo os blocos pentencentes a um mesmo grupo,
reduzindo os movimentos de seek no momento de acess a esse arquivo. Cada grupo é composto por
seis elementos distintos: superbloco, descritor do grupo, bitmap de i-nodos, tabela de i-nodos, e
20
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
bloco de dados. A estrutura básica de construção de arquivos ext2 é o i-nodo: cada arquivo ou
diretório no sistema de arquivo ext2 é descrito por um único i-nodo. Cada grupo de blocos possui um
bitmap de i-nodos e uma tabela que contém ponteiros para i-nodos de cada arquivo, ou diretório,
pertencente ao grupo. Um i-nodo descreve quais blocos compões um arquivo e também armazena
uma série de informações relativas a esse arquivo. Todos os i-nodos de uma partição ext2 têm o
mesmo tamanho (128 bytes).
Modo: esse campo armazena informações relacionadas com os direitos de acesso ao objeto
que o i-nodo referencia.
Informações: fornece os direitos de acesso, leitura e escrita, associando o arquivo a um
usuário e/ou a um grupo de usuários.
Tamanho: o tamanho do arquivo em bytes, ou seja, o tamanho real do arquivo e não a
quantidade de blocos que ele ocupa.
Timestamps: data(hora, dia, mês, ano) em que o i-nodo foi criado ou modificado.
Apontadores para blocos: valores que indicam quais blocos compõem o arquivo. Esses apontadores
são empregados em 4 níveis: apontadores diretos (12), apontador de indireção simples(1), apontador
de dupla indireção(1), e apontador de tripla indireção(1). Nas versões atuais do Linux, o tamanho
máximo de um arquivo é limitado a 2 Gigabytes o que não explora toda a capacidade de
endereçamento fornecida pela tripla indireção.
Partição EXT3 (Linux Native)
O sistema de arquivos ext3 faz parte da nova geração extended file system do Linux, sendo que seu
maior benefício é o suporte a journaling.
O uso deste sistema de arquivos comparado ao ext2, na maioria dos casos, melhora o desempenho do
sistema de arquivos através da gravação seqüencial dos dados na área de metadados e acesso mhash
a sua árvore de diretórios.
A estrutura da partição ext3 é semelhante a ext2, o journaling é feito em um arquivo chamado
.journal que fica oculto pelo código ext3 na partição (desta forma ele não poderá ser apagado,
comprometendo o funcionamento do sistema). A estrutura idêntica da partição ext3 com a ext2 torna
mais fácil a manutenção do sistema, já que todas as ferramentas para recuperação ext2 funcionarão
sem problemas.
I/O no Sistema de Arquivos do Linux
Um dos objetivos de um sistema operacional é ―esconder‖ dos usuários as peculiaridades de um
determinado hardware. A gerência de I/O realiza um papel análogo, ou seja, fornece uma interface
uniforme para acesso a um determinado dispositivo independente de sua tecnologia. Um exemplo
bastante comum são os discos rígidos. Nós encontramos discos IDE, EIDE, SCSI, entre outros, os
quais possuem geometria, funcionalidades e capacidades diferentes. Entretando, eles são ―vistos‖ de
forma genérica como discos rígidos. Esse é o objetivo da gerência da entrada e saída: criar uma
camada de software que esconda, através de uma interface comum, os detalhes específicos de cada
dispositivo. O processador não é o único dispositivo ―inteligente‖ de um hardware. Cada dispositivo
físico de entrada e saída possui um controlador. Um controlador nada mais é que um processador
projetado para realizar uma determinada função específica. Assim, teclado, mouse e portas seriais
são normalmente vinculados a um controlador serial; discos IDE, a um controlador IDE; discos
SCSI, a um controlador SCSI; interface de rede, a controladores de redes; etc. Cada controlador
possui um conjunto próprio de registradores de controle e estado(CSR- Control and Status Registers)
21
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
os quais diferem de controlador para controlador. Os CSR são utilizados para inicializar, encerrar,
diagnosticar e realizar operações em um controlador, ou seja, em um dispositivo. Ao invés de cada
aplicação codificar a seqüência de comandos CSR, esses estão concentrados no núcleo do sistema
operacional já que, por exemplo, ler e escrever são operações comuns a todas as aplicações. O
software que implementa, no núcleo do sistema operacional, essas operações é conhecido como
driver de dispositivos (device drivers).
Segurança
O Sistema Operacional Linux é o segundo sistema operacional mais seguro do mundo. Seu pai, o
Unix, é o único que o supera. Este é um dos motivos mais favoráveis a sua utilização, principalmente
em servidores. Outro fato que comprova esta segurança é que, das invasões realizadas com sucesso,
apenas 1% está relacionado com Linux como alvo. Ainda, esta invasão a ele ocorre por dois motivos:
falha humana (99,5% dos casos) e falha do sistema(0,5% dos casos). Porém segurança não é apenas
relacionada à invasão mas também a vírus, trojans, worms e todos aqueles softwares mal
intencionados. A cada 1000 pragas virtuais lançadas 1 é para Linux. O mais incrível é que qualquer
falha ou praga é eliminada em questão de pouquíssimas horas devido ao grande número de
programadores que o Linux possui. Diferente dos demais sistemas operacionais, o Linux fecha todas
as portas por padrão, ou seja, mantém abertas somente as que realmente precisam estar. São
justamente estas portas abertas que devem ser filtradas (protegidas) sem as fechar utilizando um
Firewall (portão, muro, parede de fogo). Ele tem a função de liberar ou não o acesso as requisições
feitas por endereços da internet (IPs), através de regras definidas pelo administrador do sistema. Não
existe um padrão de regras que venham juntamente com o pacote padrão de instalação, se não for
especificado o Sistema Operacional não vai filtrar. Outro ponto interessante de ressaltar é que todas
configurações de firewall realizadas no Linux ou em qualquer outro sistema operacional devem ser
tanto para meios externos (internet) quanto meios internos (intranet), nem mesmo os usuários
internos estão livres da maldade.
O Linux utiliza como firewall o iptables, que também pode ser chamado de ipchains ou ipfwadm
depende da versão do kernel (núcleo do sistema) como mostra o quadro abaixo:
Versão do Kernel
Sistema Utilizado
2.0.x
Ipfwadm
2.2.x
Ipchains
2.4.x ou superior
Iptables
Segurança interna
SAMBA - Compartilhamento de arquivos
Apesar de praticamente não existir pragas para Linux, eles existem em massa para o sistema
operacional da Microsoft. Isto representa perigo se você estiver em uma rede com estações de
trabalho windows, por conseqüência utiliza-se o samba para liberar acesso a arquivos no servidor
linux. Este compartilhamento criado entre o servidor e estação pode permitir que um vírus ou trojan
apague os arquivos lá encontrados, isto requer que você possua um bom antivírus instalado em cada
estação e mantenha-o bem atualizado. Porém não basta apenas isso, mas deve-se tomar as seguintes
precauções.
. Não utilizar login único para toda a rede (mesmo que seja uma rede pequena).
. Cada login deve ter acesso restrito somente ao que realmente precisa.
. Contas de usuários visitantes devem ser evitadas, e se existirem deve ter o acesso mais
22
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
restrito possível.
. Não permitir que o usuários alterem as permissões de arquivo.
. Não criar a conta root ou administrador.
. Não compartilhar jamais a raiz do sistema (parece obvio mais já algumas pessoas o
fazerem).
SQUID – Acesso à Internet
O squid é proxy(distribuidor) de internet, tem a função de liberar e controlar o acesso a
internet em uma rede. Para que ele seja um aliado e ajudante no dia-a-dia é necessário
bloquear além de sites e portas, as extensões executáveis e de arquivos compactados.
Também devem se restringir o horário de acesso à Internet.
CUIDADOS ESPECIAIS
Senha e usuário root
O ideal é que apenas que uma pessoa saiba esta senha. O usuário root não deve ser usado no
cotidiano, apenas na instalação e manutenção dos serviços e usuários do servidor.
SSH - Acesso remoto
Este serviço permite o acesso à linha de comando do linux de qualquer outro local. Porém ao
habilitar este serviço não deve-se liberar acesso ao usuário root.
Telnet
Protocolo e serviço muito conhecido nos ambientes Windows. Não é recomendado o uso, em
hipótese alguma, no Linux, pois sua segurança já foi posta em cheque inúmeras vezes.
Windows 2003
A arquitetura do Windows 2003 é fortemente inspirada no princípio de micronúcleo, pois cada
funcionalidade do sistema é oferecida e gerenciada por um único componente do sistema
operacional. Todavia, módulos fora do micronúcleo executam operações em modo protegido (modo
kernel), por isso, não é puramente micronúcleo.
O Windows 2003 também segue uma organização em camadas, e explora o modelo orientado a
objetos. Foi projetado de modo a permitir a execução de aplicações escritas para outros sistemas
operacionais.
A estrutura pode ser dividida em duas partes: modo usuário (onde estão localizados os sistemas
protegidos) e o modo kernel (o executivo). O executivo constitui o núcleo do Windows 2003,
exportando funções para serem utilizadas no modo usuário e funções que só são acessíveis por
componentes (módulos) pertencentes ao próprio núcleo. Os principais componentes do executivo
são:
• Gerência de objetos;
• Gerência de processos;
• Gerencia de memória virtual;
• Monitor de segurança;
• Módulo de suporte;
• Gerência de E/S.
O núcleo do Windows 2003 foi projetado de forma a dar suporte ao multiprocessamento simétrico
quando executado em máquinas multiprocessadas. O multiprocessamento assimétrico na presença de
n processadores, um processador é pré-selecionado e dedicado a execução do sistema operacional,
23
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
deixando para os processos de usuários os n-1 processadores restantes. Já o multiprocessamento
simétrico, o sistema operacional pode ser executado em qualquer processador que esteja livre, ou
ainda em todos os processadores simultaneamente, explorando melhor o potencial dos vários
processadores existentes.
Gerência de Memória
O Windows 2003 implementa um sistema de memória virtual baseado em um espaço de
endereçamento linear (plano) de 32 bits, o que oferece até 4 Gbytes de memória virtual. Esse espaço
de endereçamento é normalmente dividido em duas partes de igual tamanho (2 Gbytes): uma
destinada ao processo usuário (parte inferior) e outra destinada ao sistema operacional (parte
superior). Em outros termos, uma aplicação (processo usuário) possui, no máximo, um tamanho de 2
Gbytes. Na realidade, o Windows 2003 oferece a opção de modificar essa alocação inicial de forma a
atribuir 3 Gbytes ao processo usuário e 1 Gbyte ao sistema operacional. Essa possibilidade permite
que certas aplicações, como, por exemplo, banco de dados, armazenem uma grande parcela de dados
dentro do espaço de endereçamento da própria aplicação (processo). O Windows 2003 prevê ainda
uma extensão, denominada de VLM (Very Large Memory) – destinada aos processadores de
arquitetura de 64 bits – que permite a um processo usuário alocar até 28 Gbytes de memória virtual
suplementar.
A alocação de memória por um processo Windows é realizada em duas fases. Inicialmente, o
processo reserva um certo número de páginas da memória virtual sem necessariamente utilizá-la. Em
seguida, à medida que o processo necessita de memória, essas páginas pré-alocadas são mapeadas a
áreas efetivas de armazenamento no disco (área de swap). Essa segunda fase é conhecida, em
terminologia Windows, como commit. Dessa forma, as páginas relativas ao espaço de endereçamento
total de um processo usuário (2 Gbytes) podem estar em um de três estados: livres, reservadas ou
dedicadas (commited). As páginas livres são as páginas do espaço de endereçamento não utilizadas
pelo processo. As páginas reservadas correspondem àquelas pré-alocadas mas ainda não mapeadas a
uma área de armazenamento real. Uma vez esse mapeamento efetuado, as páginas pré-alocadas
tornam-se páginas dedicadas. A distinção entre páginas reservadas e páginas dedicadas é justificada
pela redução do tamanho do arquivo de paginação (swap) necessário a um processo. Apenas as
páginas dedicadas consomem área de armazenamento. Por questões de desempenho, o Windows
2003 permite também que um processo, possuindo os privilégios necessários, bloqueie páginas em
memória, fazendo com que essas páginas nunca sofram procedimento de swapping. Como a
concepção do Windows é toda orientada a objetos, a memória alocada por um processo é
representada através de um objeto memória. Dois processos podem compartilhar um mesmo espaço
de endereçamento referenciando um objeto comum. Para o caso de compartilhamento de apenas uma
região de memória o Windows oferece a abstração de visão (view). Essa abstração consiste em um
processo mapear uma porção de seu espaço de endereçamento a um objeto (section object) o qual é
utilizado por outros processos para acessos compartilhados a essa região. O mecanismo de view é
bastante flexível. Ele permite que, em caso de swapping de uma região compartilhada de memória,
as páginas correspondentes a essa região sejam transferidas ou para a área de swap ou para um
arquivo especial (mapped file). È possível ainda fixar um endereço virtual para essa região
compartilhada, permitindo assim que ela resida sempre em um mesmo endereço (virtual) em todos os
processos que a utiliza. Finalmente, a área de view pode ter diferentes tipos de acesso, como por
exemplo, apenas leitura, leitura e escrita, execução e outros.
24
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Sistema de Arquivos
O Windows 2003 possui um sistema de arquivos próprio, O NTFS (NT File System), projetado de
forma a oferecer segurança de acesso, garantia da consistência de dados em presença de falhas e
suporte a discos de grande capacidade. O Windows oferece ainda suporte a outros sistemas de
arquivos como o FAT (MS-DOS e Windows 3,1), FAT32 (Windows 95, 98, Millenium), o HPFS
(Os/2), além de formatos para cdrom (CDFS) e UDF (Universal Disk Format) para acesso a dados
armazenados em DVDs. O grande diferencial do NTFS em relação aos seus predecessores da linha
Microsoft está em cobrir as necessidades de alguns pontos considerados como críticos para
aplicações em ambientes corporativos, a saber:
- Facilidade de recuperação de dados e tolerância a falhas: para alcançar a confiabilidade,
que e requisito as aplicações corporativas, uma das técnicas utilizada pelo Windows 2003 é o
processamento de transações. Uma transação é definida como uma operação de E/S que altera
os dados do sistema de arquivo, ou a estrutura de diretório do volume, de forma indivisível,
isto é, cada alteração no sistema de arquivo só é considerada efetivada se for completamente
realizada. O NTFS emprega esse modelo de transações para implementar seu recurso de
recuperação do sistema de arquivos permitindo que este seja reconstruído, ou, ao menos,
mantido em um estado consistente, após uma falha no sistema.
- Segurança: O NTFS explora o modelo de objetos para oferecer segurança aos arquivos. Um
arquivo aberto é implementado como um objeto arquivo o qual atua como um descritor,
definindo os diferentes privilégios de acesso e requisitos de segurança a este.
- Suporte a grandes discos e arquivos: o NTFS é projetado para suportar de forma eficiente
acesso, manipulação e armazenamento em discos de grandes capacidades.
- Fluxos de dados múltiplos: um arquivo e seus atributos são vistos como uma seqüência de
bytes, denominada fluxo de dados. Dessa forma, no NTFS, um único arquivo pode ter
associado vários fluxos de dados. Essa organização oferece uma grande flexibilidade pois
permite que o fluxo de dados que compõe o arquivo seja interpretado de acordo com o fluxo
de dados de seu atributo.
- Facilidade de indexação: o NTFS permite que arquivos sejam acessados de forma indexada
através de atributos (chaves de pesquisa) criados para cada arquivo.
- Suporte para sistema POSIX: o NTFS implementa os recursos exigidos pelo POSIX como
diferenciação de maiúsculas para nomes de arquivos e diretórios e atalhos (soft links).
O NTFS é organizado sobre três estruturas básicas: setor, cluster e volume. O setor, normalmente
composto de 512 bytes, é a menor unidade de alocação física do disco. Setores contíguos podem ser
organizados em grupos, formando os clusters. Um cluster constitui então a unidade básica de
alocação do NTFS, isto é, um arquivo ocupa em disco sempre um número de bytes múltiplo do
tamanho do cluster. Um volume corresponde a uma partição lógica do disco. Um volume é composto
por uma série de clusters e possui de forma autocontida informações relacionadas a esse disco lógico,
isto é, estrutura de diretório, cluster livres e ocupados, etc. Atualmente, o número máximo de
clusters permitido a um arquivo no NTFS é 2³², sendo o tamanho máximo de um cluster limitado a
64 Kbytes.
Um volume (disco lógico ou partição) é organizado em 4 regiões. A primeira região de um volume
NTFS corresponde ao setor de boot, que na realidade pode ocupar até 16 setores físico do disco,
apesar do nome ―setor boot‖. O setor de boot possui informações sobre o layout do volume, a
estrutura do sistema de arquivos e o programa de boot do Windows. Essa região é seguida pela
25
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Máster File Table (MTF) a qual contém as informações sobre todos os arquivos e diretórios (folders)
desse volume, assim como sobre o espaço livre. O MTF é organizado na forma de um conjunto de
registros de tamanho variável, em que cada arquivo ou diretório possui um registro associado. Nesses
registros, está incluído o próprio MTF, já que ele também não deixa de ser um tipo de arquivo. Cada
registro do MTF mantém informações relacionadas ao atributo do arquivo (leitura, escrita, etc.),
datas de criação e modificação, nome do arquivo, descritor de segurança. A terceira região é a dos
arquivos de sistema, tipicamente de 1 Mbyte, em que são armazenados: uma cópia parcial da MFT
(informações suficientes para recuperar erros físicos acontecidos na NFT); um arquivo de logs,
referente ao controle de transações do NTFS; um bit map que fornece a ocupação dos clusters do
volume; e uma tabela de atributos que define o tipo de acesso e esse volume (sequencial, indexado,
etc). Finalmente, a quarta e última região corresponde à área disponível para os arquivos.
Como mencionado anteriormente, um dos principais objetivos do NTFS é facilitar a recuperação em
caso de falhas. A capacidade de recuperação do NTFS é essencialmente baseada em logs de
transação. Uma operação que altere o sistema de arquivos é tratada como uma transação, a qual é
gravada na região de logs associada a cada volume. Apenas após a gravação da transação é que a
operação é efetivada. È importante salientar que a capacidade de recuperação do NTFS foi projetada
para garantir a coerência e a recuperação de estruturas e dados do sistema operacional e não dados de
arquivos de usuário. Dessa forma, um usuário jamais perderá o acesso a um volume (partição) em
decorrência de uma falha física, ou do sistema, embora possa perder acesso ao conteúdo de um
arquivo seu. Entretanto, para suprir a necessidade de recuperação total, o Windows disponibiliza uma
série de ferramentas para a tolerância a falhas.
Windows XP
A denominação XP vem da palavra exPerience. O Windows XP foi idealizado com o objetivo de
unificar, em torno de um único produto, seu mercado corporativo com seu mercado de usuários
domésticos. Na realidade, essa unificação é feita através de duas versões do Windows XP: o
Windows XP Personal Edition, destinado ao mercado doméstico, que substitui o Windows 95, 98,
Millenium, NT (versão workstation); e o Windows XP Professional Edition, voltado ao mercado
corporativo que substitui o NT nas suas versões server.
As principais novidades introduzidas pelo Windows XP estão relacionadas com mecanismos de
proteção ao sistema de arquivos e conectividade à Internet. Sob o ponto de vista de proteção do
sistema de arquivo, o Windows XP impede que arquivos antigos substituam versões mais recentes.
No caso de drivers de dispositivos, é possível restaurar a versão anterior na eventualidade da
instalação de um driver mais recente apresentar problemas. O suporte à proteção, na presença de
múltiplos usuários, foi estendida em relação aos mecanismos oferecidos pelo Windows 98 e pelo
Windows Millenium embutidos em seu próprio núcleo. Em relação à conectividade em rede, quando
conectado à Internet, o Windows XP oferece ao usuário algumas funcionalidades típicas de firewall
embutidas em seu próprio núcleo. Além disso, uma série de ferramentas buscando simplificar o uso
do Windows por usuários leigos forma introduzidas, como por exemplo, gravação de cdrom
diretamente a partir do Windows Explorer, emprego de temas para tela de fundo, atualizações
automáticas, mecanismos para publicação de arquivos de imagens e de texto na Internet, entre outros.
Entre as novidades do Windows XP, está ainda um mecanismo de proteção como pirataria
denominada de WPA (Windows Product Activation). Seu funcionamento á baseado na criação de um
código único, válido apenas para o computador no qual o Windows XP é instalado. Esse código é
26
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
criado no momento da instalação e é obtido através de identificadores próprios únicos a cada
computador, tais como número de série da BIOS, do disco rígido, o endereço físico da placa de rede
(endereço MAC), etc. Esse código é então informado à Microsoft, que imediatamente gera e reenvia
um código de liberação para o uso do Windows XP. Ambos os códigos, o gerado na instalação e o
código de instalação, são cadastrados na Microsoft. Sempre que houver uma modificação de
hardware da máquina, ou a tentativa de burlar o sistema de ativação do Windows XP, o usuário
deverá repetir o procedimento de ativação do Windows XP ou seja, recontactar a Microsoft e gerar
uma nova chave de ativação. Esse procedimento criou, na comunidade de usuários, muita
controvérsia devido a rumores de que a Microsoft aproveitava-se dele para obter informações
adicionais sobre a configuração da máquina, como por exemplo, os softwares instalados. Essa
polêmica levou à análise das transações realizadas, pelo mecanismo WPA por consultores
independentes que concluíram que apenas o código de ativação é enviado à Microsoft.
O Windows XP foi desenvolvido com a preocupação de manter a compatibilidade com várias
aplicações já existentes para a família Windows, principalmente jogos e multimídia. A Microsoft
divulgou que todos os aplicativos existentes para Windows 98, Millenium e Windows NT
continuarão a funcionar normalmente no Windows XP. A mesma preocupação de compatibilidade
existe a nível de hardware, assim sendo, o Windows XP dispõe de uma grande gama de drivers para
os mais diversos periféricos. Além disso, é possível instalar em uma máquina Windows XP drivers
existentes para outras versões da família Windows.
As diferenças entre as versões Windows XP Personal Edition e Windows XP Professional Edition
estão relacionados com desempenho e atividades de gerenciamento. A versão Professional explora o
multiprocessamento real oferecido pelas máquinas multiprocessadoras, ao passo que a versão
Personal é otimizada para máquinas monoprocessadoras.
Sob o ponto de vista do Sistema Operacional, o Windows XP é um Sistema Operacional de 32 bits e
herda em muito a arquitetura NT 5.0. As modificações, segundo a Microsoft, estão em otimizações
de algoritmos básicos e nas estruturas de dados internas ao núcleo. Essas melhorias fazem com que o
Windows XP apresente um desempenho melhor que seus antecessores. O Windows XP, assim como
o Windows 2000 (NT 5.0), não fornece a capacidade de realizar boot em modo DOS. A
compatibilidade com aplicativos que rodam sob DOS (como o Clipper) é feita exatamente da mesma
forma que no Windows 2000, ou seja, através de um emulador DOS.
Mac OS X
Mac OS X (lê-se Mac OS dez, e não Mac OS xis) é um sistema operacional proprietário,
desenvolvido, fabricado e vendido pela empresa americana Apple, destinado aos computadores da
linha Macintosh e que combina a experiência adquirida com a tradicional GUI desenvolvida para as
versões anteriores do Mac OS com um estável e comprovado kernel. A última versão do Mac OS X
possui certificação UNIX.
Assim, o Mac OS X, lançado inicialmente pela Apple Computer em 2001, é uma combinação do
Darwin (um kernel derivado do microkernel Mach) com uma renovada GUI chamada Aqua. As
primeiras versões do Mach (não-microkernel) foram derivadas do BSD.
27
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Descrição
O Mac OS X apresenta uma grande mudança em relação aos sistemas operacionais anteriores do
Macintosh e o código que é a base do sistema é completamente diferente do de versões anteriores.
Apesar da maioria das alterações estarem nos "bastidores" do sistema operacional, a interface gráfica
de usuário Aqua é o novo recurso mais visível. O uso de bordas arredondadas, cores translúcidas e
outros adereços trouxe mais cores e texturas às janelas e controles do Desktop do que a interface
Platinum do OS 9. Inicialmente isso gerou bastante controvérsia entre os usuários, com uns alegando
que a interface tinha ficado "como um brinquedo" e com falta de profissionalismo; outros alegando
que era "outra grande inovação da Apple". O visual é instantaneamente reconhecível e antes mesmo
do lançamento da primeira versão do Mac OS X, outros desenvolvedores começaram a produzir
skins para aplicativos personalizáveis como o Winamp para ficarem mais parecidos com o visual
Aqua. A Apple ameaçou processar pessoas que fazem ou distribuem programas que oferecem uma
interface que eles dizem ser derivada de seu design patenteado.
O núcleo do Mac OS X é um sistema operacional certificado Unix, construído em torno de um kernel
XNU com recursos básicos Unix acessáveis através de uma interface de linha de comando. Pouco
antes do lançamento do Mac OS X a Apple lançou esse núcleo como Darwin. Baseando-se nesse
núcleo, a Apple projetou e desenvolveu um número de componentes de código fechado (closed
source) de licença proprietária, incluindo a interface Aqua e o Finder (o sistema de gerenciamento de
arquivos). A combinação da interface amigável e o poder do núcleo open source Darwin/BSD
tornaram o Mac OS X o ambiente Unix mais bem vendido até hoje em número de computadores
vendidos.
28
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Versões
Mac OS X v10.0 "Cheetah"
Mac OS X v10.1 "Puma"
Mac OS X v10.2 "Jaguar"
Mac OS X v10.3 "Panther"
Mac OS X v10.4 "Tiger"
Mac OS X v10.5 "Leopard"
Mac OS X v10.6 "Snow Leopard"
Sistema de Arquivos
O HFS+ também é conhecido como sistema de arquivos Mac OS X Extended, e supera o formato
HFS em vários quesitos: pode trabalhar com endereços de bloco de arquivos de até 32bits, contra
29
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
16bits do sistema anterior; aceita nomes de arquivos com até 255 caracteres, em vez de apenas 31;
tem formato de nome de arquivo Unicode, em vez do já antiquado MacRoman; e entre outros, o que
mais gosto, que é a possibilidade de lidar com arquivos de até 8EB (Exabytes)! Para se ter uma idéia,
um Exabyte dá mil Petabytes, um milhão de Terabytes, ou um bilhão de Gigabytes. Acredito que os
editores de vídeo não teriam problemas para gravar seus clipes com esse formato…
Apesar disso, existe uma pequena diferença entre ―poder‖ e ―ser‖. O formato NTFS que existe nos
Windows NT, XP, 2003 e Vista, por exemplo, alcança o dobro esse valor como máximo tamanho de
um único arquivo. Por outro lado, a implementação real só permite um limite de quase 16TB, ou
aproximadamente 16.000GB. Isso dá um banho de água do Oceano Ártico nos antigos FAT16 e
HFS. O limite de tamanho de arquivos para estes é de 2GB.
Podemos ver em que formato se encontra qualquer disco conectado a um Mac através do atalho de
teclas Command-I sobre o mesmo. No caso do nosso querido sistema X, a opção de formato HFS+ já
existe há algum tempo, então é provável que apareça a designação Mac OS X Extended no local onde
indica o respectivo formato.
Além disso, ainda há outros termos. Por exemplo, quando vamos formatar um disco com o Disk
Utility, vemos as seguintes opções:

Mac OS Extended (Journaled): de acordo com a Apple, o formato journaled foi apresentado
no OS X 10.2.2 Server, e sua função é aumentar a segurança quanto ao armazenamento de dados, no
que diz respeito a evitar falhas de integridade em casos extremos. Um disco com essa característica
mantém registro de todas as suas atividades, e em caso de instabilidade ou travamento do sistema,
esse registro — um journal, que pode ser entendido como ―relatório‖ — é usado para restaurar o
estado do sistema ao que tenha sido gravado, depois do reinicio do sistema. Conceito muito parecido
ao rollback em Banco de Dados.

Mac OS Extended: é possível ter um disco HFS+ sem a opção de journaling. Também se
pode desabilitar essa função, através de comandos via Terminal, para quem precise ganhar
desempenho em computadores mais lentos. O risco de perda de dados aqui é maior que na opção
anterior.

Mac OS Extended (Case-sensitive, Journaled): combinação da primeira opção, respeitando as
diferenças entre maiúsculas e minúsculas. Algo parecido com o que acontece no UNIX.

Mac OS Extended (Case-sensitive): igual ao anterior, só que sem journaling.

MS-DOS (FAT): seria o FAT32, da Microsoft. Formatar um disco com essa especificação
garante compatibilidade integral entre quaisquer sistemas operacionais, porém há a limitação de
tamanho de arquivos a 4GB, o que pode ser um problema para editores de vídeo e outras pessoas que
trabalhem com arquivos de tamanho grande. Também um problema para quem lida com imagens de
DVD-DL, já que o dual-layer consiste exatamente em levar o tamanho de um DVD normal a quase
8,5GB.
Tirando a opção MS-DOS (FAT), todas as outras são algum tipo de HFS+, e ainda havia uma opção
UFS (UNIX File System), para quem quisesse, por alguma razão, usar o formato do sistema UNIX.
O journaling é sempre aconselhado, por aumentar a segurança na manipulação de dados, e diminuir
o risco de perdas em caso de que o computador pare de funcionar, trave ou fique sem energia
elétrica, por falta de luz, por exemplo.
Hoje em dia, para quem precise trabalhar com arquivos muito grandes, eu recomendaria o uso do
formato HFS+ Journaled para qualquer disco, mesmo que ele seja utilizado depois em computadores
com Windows. Existe um programa muito bom da MediaFour, chamado MacDrive, que é pago, mas
30
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
pela função que tem, até sai barato. Permite ver e trabalhar com qualquer disco, dentro do Windows,
com formatos HFS e HFS+, em todas as variações. Isso garante a possibilidade de abrir arquivos
maiores que 4GB de tamanho nos sistemas operacionais da Microsoft e da Apple, sem qualquer
problema.
Há que lembrar sempre que, de modo nativo, o Mac OS X não consegue permitir acesso completo a
arquivos em discos com formato NTFS, usado nos Windows 2000, XP e Vista. Creio que também há
soluções para isso, apesar de que eu não conheço nenhuma de fácil uso e que funcione de modo
parecido ao MacDrive. Talvez algum dia HFS+ e NTFS se comuniquem, como já acontece com o
formato da Apple e o FAT32.
O Sistema Operacional UNIX
Dada sua larga aceitação, o sistema operacional UNIX será utilizado como referência neste curso. O
sistema é dividido em duas partes:
programas e serviços: shell, mail, vi, date, etc;
núcleo(kernel): Provê suporte aos programas e serviços.
Desenvolvido nos Laboratórios da Bell em meados da década de setenta, o sistema UNIX inicialmente atendia as necessidades específicas do grupo de Ciência da Computação da Bell. A razão da
aceitação do UNIX é explicada pelos atributos abaixo:
escrito em linguagem de alto nível, o que facilita seu transporte para diferentes plataformas;
interface simples para com o usuário(shell);
fornece primitivas que permitem o desenvolvimento de programas complexos a partir de programas
mais simples;
estrutura hierárquica de arquivos;
formatação de arquivos baseada no conceito de stream (cadeia) de bytes;
interfaceamento simples e consistente com os dispositivos periféricos;
multiusuário/multiprogramado;
esconde a arquitetura do hardware, permitindo que um programa execute em múltiplas plataformas.
Uma Visão Geral do Sistema Operacional UNIX
Programas interagem com o núcleo através da evocação de um conjunto bem definido de chamadas
de sistema. Muitos destes programas são denominados com andos.
O conjunto de chamadas do sistema e os algoritmos internos que implementam estas chamadas
formam o corpo do núcleo. A organização do ambiente UNIX pode ser vista na forma de camadas
conforme mostrado na figura 1.1.
Sistema de Arquivos
O sistema de arquivos do UNIX é caracterizado por:
estrutura hierárquica;
tratamento consistente dos dados de arquivo;
facilidade na criação/eliminação de arquivos;
crescimento dinâmico de arquivos;
proteção aos dados dos arquivos;
tratamento dos dispositivos periféricos como arquivos de dados.
O sistema de arquivo é organizado na forma de árvore.
Os programas no ambiente UNIX não possuem nenhum conhecimento sobre o formato interno no
31
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
qual o núcleo armazena os dados de arquivo. Os dados são fornecidos pelo UNIX como um stream
(cadeia) de bytes, cabendo aos programas interpretarem o seu conteúdo. Este tratamento estende-se
também aos diretórios, ou seja, estes são vistos como arquivos regulares.
O acesso aos arquivos é controlado pelas permissões de acesso associadas a cada arquivo. No caso,
temos os seguintes tipos de permissões: leitura, escr ita e execução, para os seguintes tipos de
usuários: proprietário do arquivo, grupo de usuários ou qualquer outro usuário.
Uma característica importante do UNIX é o fato de que os programas acessam os dispositivos
periféricos com a mesma sintaxe utilizada para o acesso aos arquivos regulares. Os dispositivos
também são protegidos da mesma forma que os arquivos regulares.
Ambiente de Processamento
Um programa é um arquivo executável, e um processo é uma instância do programa em execução.
No UNIX vários processos podem executar simultaneamente, sendo que várias instâncias de um
mesmo programa podem existir ao mesmo tempo no sistema.
CONCLUSÃO
Através do assunto descrito neste trabalho, pode-se verificar que os sistemas operacionais Linux e
Windows, seja ele da versão 2003 ao XP, são sistemas operacionais que atendem a maioria dos
requisitos fundamentais para suprir as necessidade de diferentes classes de usuários que possuam ou
não um alto grau de conhecimento em informática.
Cada Sistema Operacional estudado possui características um pouco diferentes em relação ao
gerenciamento de memória, escalonamento, sistemas de arquivos e segurança. No Windows
percebemos alguma semelhança entre suas versões, algumas melhoradas ou adaptadas para a
próxima versão que seria lançada, mas em geral, todos os Sistemas Operacionais criados seguiram
uma linha de desenvolvimento que favoreça o usuário, que na verdade é o maior beneficiário dessa
tecnologia.
Licenças
GNU General Public License
A GNU General Public License (Licença Pública Geral), GNU GPL ou simplesmente GPL, é a
designação da licença para software livre idealizada por Richard Stallman no final da década de
1980, no âmbito do projecto GNU da Free Software Foundation (FSF).
A GPL é a licença com maior utilização por parte de projectos de software livre, em grande parte
devido à sua adoção para o Linux. O software utilizado para administrar o conteúdo da Wikipédia é
coberto por esta licença, na sua versão 2.0 ou superiores.
Em termos gerais, a GPL baseia-se em 4 liberdades:
1. A liberdade de executar o programa, para qualquer propósito (liberdade nº 0)
2. A liberdade de estudar como o programa funciona e adaptá-lo para as suas necessidades
(liberdade nº 1). O acesso ao código-fonte é um pré-requisito para esta liberdade.
3. A liberdade de redistribuir cópias de modo que você possa ajudar ao seu próximo (liberdade nº 2).
4. A liberdade de aperfeiçoar o programa, e liberar os seus aperfeiçoamentos, de modo que toda a
comunidade se beneficie deles (liberdade nº 3). O acesso ao código-fonte é um pré-requisito para esta
liberdade.
32
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Com a garantia destas liberdades, a GPL permite que os programas sejam distribuídos e
reaproveitados, mantendo, porém, os direitos do autor por forma a não permitir que essa informação
seja usada de uma maneira que limite as liberdades originais. A licença não permite, por exemplo,
que o código seja apoderado por outra pessoa, ou que sejam impostos sobre ele restrições que
impeçam que seja distribuído da mesma maneira que foi adquirido.
A GPL está redigida em inglês e actualmente nenhuma tradução é aceita como válida pela Free
Software Foundation, com o argumento[1] de que há o risco de introdução de erros de tradução que
poderiam deturpar o sentido da licença. Deste modo, qualquer tradução da GPL é não-oficial e
meramente informativa, mantendo-se a obrigatoriedade de distribuir o texto oficial em inglês com os
programas.
A licença GPL foi originalmente publicada em Janeiro de 1989. No entanto, passado pouco tempo,
ficou claro que o texto da licença comportava vários problemas, pelo que em Junho de 1991 foi
publicada a GPL versão 2, sendo ao mesmo tempo introduzida uma nova licença LGPL. Em 2005,
Stallman anunciou que estava a preparar uma nova versão da licença em conjunto com Eben Moglen.
Essa nova versão, foi chamada de GPLv3 e o primeiro esboço foi publicado em 16 de Janeiro de
2006, sendo a versão final lançada em 29 de Junho de 2007.
Licença Comercial
O termo Licença Comercial é normalmente associado a contratos de licenciamento de uso de
software. Os softwares chamados comerciais são aqueles pelos quais o usuário paga uma taxa de
licenciamento para poder utilizar.
É importante observar que, de acordo com o modelo de licenciamento de software comercial, o que o
usuário adquire quando paga pelo software é o direito de utilizá-lo segundo as regras definidas por
seu contrato de licenciamento de uso. Uma analogia pode ser feita com livros: quando se compra um
livro está se adquirindo a mídia impressa, mas o direito autoral do conteúdo é do autor ou da editora.
As duas restrições mais comuns nas licenças comerciais são:

O direito de redistribuição, por exemplo, realizar uma cópia dele e repassá-la para outro
usuário. A cópia de softwares em desacordo com sua licença comercial é considerada uma cópia
ilegal e esta prática é conhecida pelo termo pirataria.

O direito de alterar o funcionamento do software, adaptando-o para um fim específico.Como
o software comercial raramente é distribuído com seu código fonte, para alterá-lo seria necessário
utilizar a prática da engenharia reversa, o que costuma ser terminantemente proibido por esse tipo de
licença.
A Licença Comercial define também, em muitos casos, os serviços que a empresa que vende o
software disponibiliza para os usuários que adquirem seu direito de uso, tais como suporte, correção
de erros de funcionamento, atualização periódica e acesso a documentação de uso e outros materiais
- normalmente via Internet.
As contrapartidas dos softwares cujo uso é regido por licenças comerciais são os chamados freeware,
cuja licença de utilização é gratuita, e os softwares livres, normalmente distribuídos com código
fonte e que possuem uma licença de uso que permite explicitamente a sua cópia, modificação e
redistribuição.
33
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Licença de software livre
Software Livre é uma expressão formalizada pela primeira vez[1] por Richard Stallman, na sequência
do início do Projecto GNU[2], e seguidamente da Free Software Foundation como braço legal do
Projecto.
Todo e qualquer programa de computador cuja licença de direito de autor conceda ao utilizados as
seguintes 4 liberdades...
1. A liberdade de executar o programa, para qualquer propósito (liberdade no. 0)
2. A liberdade de estudar como o programa funciona, e adaptá-lo para as suas necessidades
(liberdade no. 1). Acesso ao código-fonte é um pré-requisito para esta liberdade.
3. A liberdade de redistribuir cópias de modo que você possa ajudar ao seu próximo (liberdade no.
2).
4. A liberdade de aperfeiçoar o programa, e liberar os seus aperfeiçoamentos, de modo que toda a
comunidade se beneficie (liberdade no. 3). Acesso ao código-fonte é um pré-requisito para esta
liberdade.
... diz-se ser um Software Livre.
A realização de tais ações é reservada, pelo conceito de direito de autor, aos detentores dos direitos,
que necessitam assim de permitir de forma explícita estas liberdades recorrendo a uma Licença de
Software Livre.
As licenças de Software Livre também se popularizaram, por darem a garantia jurídica aos
utilizadores de que não estão cometendo actos de infracção de direito de autor ao copiar ou modificar
o software.
A remoção de qualquer uma destas quatro liberdades descaracterizaria sua condição de Software
Livre.
Há vários tipos de licenças de Software Livre[3], a diferença entre elas está sobretudo na forma,
Copyleft, weak-Copyleft ou non-Copyleft.
As mais populares licenças de Software Livre são a Licença GPL e a Licença BSD, originalmente
criada na Universidade de Berkeley.
Tipos de Sistemas Operacionais
Sistemas Monoprogramáveis/Monotarefa
*Processador, memória e periféricos exclusivamente à execução de um único programa.
*Relacionados ao surgimento dos Mainframes.
*Simples implementação
*Pouca preocupação com proteção.
Sistemas Multiprogramáveis/Multitarefa
*Vieram substituir os monoprogramáveis.
*Mais complexos e eficientes.
*SO gerência acesso concorrente dos recursos(memória, processador e periféricos) enter os diversos
programas.
*Aumento da produtividade
*Redução dos custos.
34
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Sistemas Batch
*Programas armazenados em discos ou fita onde esperam para ser executados seqüencialmente.
*Programas(jobs) não exigem interação com os usuários.
*Ex. Compilações, Linkedições, sorts, backups .
Sistemas de Tempo Compartilhados (Time-Sharing)
*Permitem interação com usuários
*Conhecidos como sistemas on-line.
*Para cada usuário o SO aloca uma fatia de tempo(Time-Slice) do processador.
*Implementação complexa.
*Aumentam a produtividade e reduz custos.
*Preempção Capacidade de um SO tem de interromper um processo em execução.
*PreempçãoQuantum
*PreempçãoPrioridade
Sistemas Tempo Real
*Tempos de resposta dentro de limites rígidos.
*Não existe idéia de fatia de tempo.
*Processador ocupado o tempo que for necessário por um programa até que outro prioritário
apareça.(prioridade controlada pelo programa e não pelo SO.)
*Presentes em monitoramento de refinarias de petróleo, trafego aéreo ,Usinas termoeléctricas e
nucleares tempo de resposta é fundamental.
Sistemas com Múltiplos Processadores
*Duas ou mais UCPs interligadas, trabalhando em conjunto.
*Um fator chave e a forma de compartilhamento da memória e dispositivos I/O e a comunicação
entre as UCPs.
ºSist. fortemente acoplados. Duas ou mais UCPs e um único S.O. voltado para solução de um
único problema.
ºSist. fracamente acoplados.Dopis ou mais sistemas de computação(multicomputadores),
conectados aravés de linhas de comunicação.
*EscalabilidadeCapacidade computacional em menor custo.
*ReconfiguraçãoCapacidade do S.O. cdontinuar o processo mesmo que um dos processadores
falhe ou pare de funcionar.
Sistemas Fortemente Acoplados
*Varios processadores compartilhando uma única memória e gerenciados por apenas um S.O.
*Varios programas ao mesmo tempo ou um programa dividido em subprogramas para execuçaão
simultanea em mais de um processador.
*Usado em : desenvolvimento aeroespacial, prospecção de petroleo, simulações, processamento de
imagens, CAD [ aplicações que façam uso intensivo da UCP.
Sistemas Assimétricos
*Um processador primario que controla os secundarios e pela execução do S.O.
*Se o processador mestre falhar, todo o sistema ficará incapaz de continuar.
Sistemas Simétricos
*Todos os processadores têm as mesmas funções, podendo executar o SO independentemente.
35
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
*Quando um processador falha, o sistema continua funcionando, porém com menor capacidade de
computação.
Multiprocessamento
Processamento Vetorial
*Permite a manipulação de vetores internos.
*só é vantajoso quando as aplicações executadas têm um elevado grau de código vetorizável, como
problemas numéricos, processamento de imagens, estudos meteorológicos e de física nuclear. Que
realizam repetidas operações aritméticas de ponto flutuante em grandes vetores.
Processamento Paralelo
*Por mais de um processador ao mesmo tempo.
*Paralelismo explícito indicado pelo próprio programador através de comando de linguagem
utilizada, onde ele determina as sub-rotinas que podem ser executadas em paralelo.
*paralelismo implícito determinado pelo próprio sistema, provável obter programas mais
eficientes e confiáveis. Pouco utilizada devido à dificuldade de programação.
Organização Funcional
*Interliving Múltiplos acessos simultâneos a memória.
 Barramento comum
*Forma mais simples de comunicação entre múltiplos processadores e outras unidades
funcionais.[comom bus ou time-shared bus].
*O maior problema dessa organização e que somente uma unidade funcional pode estar utilizando o
barramento em um determinado instante. No caso de ocorrer algum problema no barramento, todo
sistema ficará comprometido.
*Arquitetura simples, econômica e flexível limitados a poucos processadores.
BARRAMENTO COMUM
UCP
Memória
Memória
UCP
Processamento
de E/S
Processamento
de E/S
Memória
UCP
Processamento
de E/S
 Barramento cruzado
*Evita o problema de gargalo
*Crossbar-switch matrix.
*Comunicação simultânea entre diferentes unidades funcionais.
*Número de processadores que podem ser adicionados ao sistema e ilimitado.
*O preço de seu alto desempenho está no custo e complexidade do sistema.
36
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
BARRAMENTO CRUZADO
Memória
Memória
Memória
UCP
Processamento
de E/S
UCP
Processamento
de E/S
UCP
Processamento
de E/S
 Memória Multiport
*Acessos simultâneos a um mesmo modulo de memória realizados através de múltiplas portas,
existentes em cada módulo de memória.
MEMÓRIA MULTIPORT
UCP
Memória
Processamento de E/S
UCP
Memória
UCP
Memória
Processamento de E/S
Memória
Processamento de E/S
Sistemas Fracamente Acoplados
*Dois ou mais sistemas de computação interligados, cada sistema com seu próprio SO.
*Rede de computadores existem dois ou mais sistemas independentes, também chamados de nós,
host ou estações, com capacidade de processamento própria e interligados através de linhas de
comunicação.
37
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
SISTEMAS FRACAMENTE ACOPLADO
Rede
Sistemas Operacionais de Rede (SOR)
*Cada Nó possui seu próprio SO
*Permite:
 Cópia remota de arquivos
 Emulação de Terminal
 Impressão remota
 Gerência remota
 Correio eletrônico
*Cada nó é independente do outro, podendo inclusive ter SO diferentes.
*Caso a conexão entre os nós sofra qualquer problema, os sistemas podem continuar operando
normalmente, apesar de alguns recursos se tornarem indisponíveis.
*Melhor exemplo é Local Area Network-LAN.
SISTEMAS OPERACIONAIS DE REDE
38
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Sistemas Operacionais Distribuídos
Rede
usuário
*Relacionamento mais forte entre seus componentes, onde geralmente os SOs são os mesmos.
*Balanceamento de cargas.
*Processador mais livre é escolhido
*Compartilhamento de impressoras, discos e fitas, independentemente do sistema em que a aplicação
estejaCluster.
CLUSTER
Comp. 1
Comp. 2
*Uma grande vantagem e a capacidade de redundância do sistema, caso aconteça algum problema
com um dos componentes , um deles tome o papel do sistema defeituoso.
*Em aplicações de missão critica, como controlo de tráfego aéreo, existem sistemas especialmente
desenvolvidos para essa finalidadeSistemas de tolerância a falhas (Fault tolerance).
*Padrões de alguns fabricantes
Distributed Computing Environment DCE,
Common Object Request Broker Architecture COBRA,
Object Linking and Embedding OLE.
39
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Organização Funcional
ORGANIZAÇÃO BARRAMENTO
*Sistemas conectados a uma única linha de comunicação e todos compartilham o mesmo meio,
geralmente em redes locais, caso haja algum problema com o meio de transmissão, todos os nós da
rede ficarão incomunicáveis.
ORGANIZAÇÃO DE BARRAMENTO
 Organização Distribuída
*Caminhos alternativos entre os diversos nós da rede. Caso apresente problema, linhas alternativas
permitirão que a rede continue funcionando. Redes Distribuídas.
ORGANIZAÇÃO DISTRIBUÍDA
40
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Histórico dos Sistemas Operacionais
Antes da década de 50, os computadores eram muito difíceis de serem programados. Era necessário
conhecer totalmente sua arquitetura, e tal operação era efetuada em painéis com cerca de 6.000
conectores, em linguagem de máquina. Nesta fase os computadores não possuíam ainda dispositivos
para interagir com o usuário, como teclados e monitores.
Na década de 50, já com a utilização de transistores, sucedeu-se um grande avanço tecnológico,
melhorando a velocidade dos processadores e a capacidade dos meios de armazenamento, em
especial a memória e os discos magnéticos.
Por volta de 1953 foi introduzido o primeiro sistema operacional, um programa de controle que
permitia uma interação, mesmo que limitada, entre o operador e a máquina, otimizando a execução
das tarefas. Em 1959 foi criada uma versão de sistema operacional que já implementava conceitos de
memória virtual, conceito este largamente utilizado nos sistemas atuais.
Na década de 60, a partir do surgimento dos circuitos integrados, foi possível difundir u uso de
sistemas computacionais em empresas, com diminuição de custos e tamanho dos equipamentos.
Além disso, esta década presenciou inúmeras inovações na área de sistemas operacionais, presentes
até hoje, como os ambientes de multitarefa, multiprogramação, multiprocessamento e time-sharing,
tendo o desenvolvimento destas técnicas avançado até o meado da década de 70, onde também foram
implementadas as tecnologias baseadas em arquitetura VLSI (chips), as primeiras redes de
computadores, e o desenvolvimento de diversas linguagens de programação de alto nível.
A década de 80 foi marcada pela criação dos microcomputadores, baseados em microprocessadores
de uso pessoal. Liderados pela IBM, diversos fabricantes seguiram por essa linha, porém alguns
deles não abandonando a fabricação dos computadores de grande porte, como foi o caso da própria
IBM.
Nota-se que, a partir do meado da década de 80, acontece uma divisão de águas, com a indústria
passando a produzir equipamentos de grande porte e muitos modelos de microcomputadores, que
também precisavam de sistemas operacionais bastante evoluídos. Foram, então, utilizadas as técnicas
modernas já existentes nos ambientes de grande porte na implementação de sistemas operacionais
para os microcomputadores, com versões diversas, todas inicialmente monousuário/monotarefa
(devido à baixa capacidade de armazenamento dos micros, naquela época). Com o avanço da
tecnologia, os micros ganharam discos rígidos e outros periféricos, possibilitando a criação de
sistemas operacionais mais evoluídos nesta categoria de computadores, quando surgiram os sistemas
monousuário/multitarefa, que executam até hoje.
Cronologia
Grande porte (mainframes)
1990
1950
1960
1º Sistema Operacional
Monoprogramável
Monotarefa
Sistemas
Multitarefa
1970
1980
Sistemas
Multiprogramáveis
Multitarefa
Introduzido o
conceito de
Memória Virtual
41
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Tipos de Sistemas Operacionais
Tipos de
Sistemas Operacionais
Sistemas
Monoprogramáveis/
Monotarefa
Sistemas
Multiprogramáveis/
Multitarefa
Sistemas
Com Múltiplos
Processadores
Sistemas Monoprogramáveis/Monotarefa
Os primeiros sistemas operacionais eram voltados tipicamente para a execução de um único
programa. Qualquer outra aplicação, para ser executada, deveria aguardar o término do programa
corrente. Neste tipo de sistema, o processador, a memória e os periféricos permanecem
exclusivamente dedicados à execução de um único programa.
Os sistemas monoprogramáveis estão diretamente ligados ao surgimento, na década de 50/60, dos
primeiros computadores. Embora os sistemas operacionais já tivessem evoluído com as tecnologias
de multitarefa e multiprogramáveis, os sistemas monoprogramáveis voltaram a ser utilizados na
plataforma de microcomputadores pessoais e estações de trabalho devido à baixa capacidade de
armazenamento destas máquinas, na época.
Era muito clara a desvantagem deste tipo de sistema, no que diz respeito à limitação de tarefas (uma
de cada vez), o que provocava um grande desperdício de recursos de hardware.
_______
_______
_______
_______
_______
CPU
Memória
Principal
Dispositivos E/S
Programa/Tarefa
Comparados a outros sistemas, os monoprogramáveis são de simples implementação, não existindo
muita preocupação com problemas decorrentes do compartilhamento de recursos como memória,
processador e dispositivos de E/S.
Sistemas Multiprogramáveis/Multitarefa
Constituindo-se uma evolução dos sistemas monoprogramáveis, neste tipo de sistema os recursos
computacionais são compartilhados entre os diversos usuários e aplicações: enquanto um programa
42
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
espera por um evento, outros programas podem estar processando neste mesmo intervalo de tempo.
Neste caso, podemos observar o compartilhamento da memória e do processador. O sistema
operacional se incumbe de gerenciar o acesso concorrente aos seus diversos recursos, como
processador, memória e periféricos, de forma ordenada e protegida, entre os diversos programas.
As vantagens do uso deste tipo de sistema são a redução do tempo de resposta das aplicações, além
dos custos reduzidos devido ao compartilhamento dos recursos do sistema entre as diferentes
aplicações. Apesar de mais eficientes que os monoprogramáveis, os sistemas multiprogramáveis são
de implementação muito mais complexa.
_______
_______
_______
_______
_______
_______
_______
_______
_______
_______
CPU
Programa/Tarefa
_______
_______
_______
_______
_______
Programa/Tarefa
Memória
Principal
Programa/Tarefa
Dispositivos E/S
_______
_______
_______
_______
_______
Programa/Tarefa
Sistemas Multiprogramáveis
*SO Conjunto de rotinas que executam concorrentemente de uma forma ordenada.
*SO Multiprogramáveis surgiram para resolver a baixa utilização de recursos do sistema.
*A utilização concorrente da UCP deve ser implementada de maneira que, quando um programa
perde o uso do processador e depois retorna para continuar o processamento, seu estado deve ser
idêntico ao do momento em que foi interrompido.
*A eficiência de um sistema multiprogramável resulta em maior complexidade do SO.
43
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Interrupção e Exceção
*Interrupção e gerada pelo SO ou por algum dispositivo(Hardware).
Mecanismo de Interrupção
Salva os
Registradores
Interrupção
Programa
.
.
.
.
.
.
.
.
Identifica a origem da
interrupção
Obtém o endereço da
rotina de tratamento
Rotina
de
tratamento
Restaura os
registradores
*Vetor de Interrupção Contem a relação de todas as rotinas de tratamento existentes, associadas a
cada tipo de interrupção.
*Interrupção mascaráveis podem ser desabilitada pelo processador.
*Interrupção não mascaráveis não podem ser desabilitadas pelo processador.
*Exceção é resultado direto da execução de uma instrução do próprio programa.
*Controlador de pedidos de interrupção IRQ(Dispositivo dos hardware)Avalia as interrupções
geradas e suas prioridades de atendimento.
*O mecanismo de tratamento de exceções é semelhante ao de interrupções, porém, muitas vezes,
podem ser escritas pelo próprio programador.
*A diferença fundamental entre exceção e interrupção é que a primeira é gerada por evento
síncrono, enquanto a segunda por eventos assíncronos.
*Síncronoé resultado direto da execução do programa corrente, previsíveis, só podem ocorrer um
de cada vez.
*Assíncronoocorre independentemente da execução do programa corrente, imprevisíveis, podem
ocorre múltiplas vezes simultaneamente.
44
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Operações de Entrada/Saída
*Permite que a UCP agir de maneira independente dos dispositivos de E/S.
Controlador ou Interface
UCP
Memória
Principal
Contr
olado
r
*1ª maneira básica de controle do UCP sobre as operações E/SUCP sincroniza com o periférico
para início da transferência de dados, fica testando para saber quando a operação termina E/S
controlada por programa... mantinha a UCP ocupada até o final da operação(Busy wait).
*2ª maneira básica de controle do UCP sobre as operações E/S Após o início da transferência de
dados a UCP fica livre para realizar outras tarefas. Em determinados intervalos de tempo o SO deve
realizar teste para saber do andamento da operação(polling).
*Mecanismo de interrupção no hardware O próprio controlador interrompe a UCP para aviso do
término da operação de E/S (E/S controlada por interrupção).
Controlador
Recebe sinal de leitura
Armazena em memória ou registradores próprios
(através de uma linha de controle)
Sinaliza interrupção ao processador
UCP
Atende a interrupção
(rotina responsável pelo tratamento desse tipo de interrupção)
Transfere os dados para a memória principal.
UCP
Controlador
Retorna a execução do programa
Disponível para outra operação
interrompido.
*DMA (Direct Memory Access)- Técnica de transferência de dados por parte do controlador que
controla momentaneamente o barramentoPermite que um bloco de dados seja transferido entre a
memória e periféricos, sem a intervenção da UCP, exceto no início e final da transferência.
*Bufferárea de memória reservada exclusivamente para este propósito.
*A extensão do conceito do DMA possibilitou o surgimento dos Canais de E/S introduzidos pela
IBM no sistema 7094
45
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
*Canais de E/S Processador capaz de executar programas de E/S, permitindo o controle total sobre
operações de E/S. As instruções de E/S são armazenadas na memória principal pela UCP, pórem o
canal é responsável pala sua execução. Atua como elo entre o UCP eo controlador.
CANAL DE E/S
Memória
Principal
UCP
Canal de
E/S
Controlador
Controlador
*Processador de E/SPossui memória própria, eliminando a necessidade dos programas de E/S
serem carregados para a memória principal, assim usando o minimo de intervenção da UCP.
Buffering
*Utilização de uma área de memória para transferência de dados entre os periféricos e a memória
principal denominada buffer.
*A unidade de transferência é o registro .
Operações usando o Buffer
Memória principal
UCP
Gravação
Buffer
Leitura
Gravação
Controlador
de E/S
Leitura
46
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Estágios da técnica de Buffering
 Dado transferido para o buffer após uma operação de leitura, liberando o dispositivo de entrada
para nova leitura.
 UCP manipula o dado localizado no buffer, enquanto o dispositivo de entrada faz nova leitura.
Spooling (Simultaneous peripheral operation on-line)
*Introduzida no final dos anos 50.
*Foi a base dos sistemas Batch.
*Basicamente utiliza o disco como um grande Buffer, permitindo que dados sejam lidos e gravados
em disco, enquanto outros jobs são processados.
*Exemplo:
Comando de impressão executado por um programa
Informações que serão impressas são gravadas em um arquivo em disco(arquivo spool).
Impressão.
Técnica de Spooling
Programa
Arquivo
de Spool
S.O.
Impressão
Reentrância
*Capacidade de um código de programa(código reentrânte) poder ser compartilhado por vários
usuários, exigindo que apenas uma cópia do programa esteja na memória.
*Não pode ser modificado por nenhum usuário no momento em que esta sendo executado.
*Ex.: editores de texto, compiladores, linkers.
*Grande economia de memória, aumento da performance do sistema.
Proteção do Sistema
*Modos de AcessosMecanismos de proteção.
 Gerência de Memória Erro de violação de acesso programa tenta acessar posição de
memória fora de sua área, e o programa é encerrado.
 Esquema de LockDois usuários acessando mesmo arquivo.
 TimerLoops infinitos.
 Compartilhamento de dispositivos de E/S pelo S. O.Nenhum outro programa deve interferir
quando um programa usa a impressora até que libere.
Sistema Multiprogramável/Multitarefa
Os sistemas multiprogramáveis/multitarefa podem ser classificados de acordo com a forma com que
suas aplicações são gerenciadas, podendo ser divididos em sistemas batch, de tempo compartilhado e
de tempo real, de acordo com a figura abaixo.
47
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Sistemas
Multiprogramáveis/
Multitarefa
Sistemas BATCH
Sistemas de
Tempo Compartilhado
Sistemas de
Tempo Real
Sistemas BATCH
Foram os primeiros sistemas multiprogramáveis a serem implementados na década de 60. Nesta
modalidade, os programas eram submetidos para execução através de cartões perfurados e
armazenados em disco ou fita, para posterior execução. Vem daí o nome batch (lote de cartões). O
processamento em batch tem como característica não exigir interação do usuário com o sistema ou
com a aplicação. Todas as entradas ou saídas são implementadas por meio de algum tipo de memória
secundária, geralmente disco ou fita. Aplicações deste tipo eram utilizadas em cálculo numérico,
compilações, back-ups, etc.
Estes sistemas, se bem projetados, podem ser bastante eficientes devido à melhor utilização do
processador, mas podem oferecer tempos de resposta bastante longos. Atualmente, os sistemas
operacionais simulam este tipo de processamento, não havendo sistemas dedicados a este tipo de
execução.
Sistemas de Tempo Compartilhado
Também chamados sistemas de time-sharing, permitem que diversos programas sejam executados a
partir da divisão de tempo do processador em pequenos intervalos, denominados fatia de tempo (ou
time-slice). Caso a fatia de tempo não seja suficiente para a conclusão do programa, este é
interrompido pelo sistema operacional e substituído no processador por outro, enquanto aguarda
nova fatia de tempo. Neste tipo de processamento, cada usuário tem a impressão de que a máquina
está dedicada ao seu programa, como se ele fosse o único usuário a se utilizar do sistema.
Geralmente permitem interação do usuário com a aplicação através de terminais compostos por
monitor, teclado e mouse. Estes sistemas possuem uma linguagem de controle que permite ao
usuário interagir com o sistema operacional através de comandos. Assim, é possível verificar
arquivos armazenados em disco ou cancelar execução de programas. Normalmente, o sistema
responde em apenas alguns segundos à maioria destes comandos, o que se levou a chamá-los
também de sistemas on-line.
A maioria das aplicações comerciais atualmente é processada em ambiente de tempo compartilhado,
que oferece tempos baixos de respostas a seus usuários e menores custos, em função do alto grau de
compartilhamento dos diversos recursos do sistema.
Sistemas de Tempo Real
Este tipo de sistema é implementado de forma bastante semelhante ao de tempo compartilhado. O
que caracteriza a diferença entre eles é o tempo exigido no processamento das aplicações.
Enquanto nos sistemas de tempo compartilhado o tempo de processamento pode variar sem
comprometer as aplicações em execução, nos sistemas de tempo real os tempos de execução devem
estar dentro de limites rígidos, que devem ser obedecidos, caso contrário poderão ocorrer problemas
irreparáveis.
48
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
No sistema de tempo real não existe a idéia de fatia de tempo como nos sistemas de tempo
compartilhado. Um programa ocupa o processador o tempo que for necessário ou até que apareça um
outro com um nível de prioridade maior. Esta prioridade de execução é definida pela própria
aplicação e não pelo sistema operacional, como nos sistemas de tempo compartilhado.
Estes sistemas são utilizados em aplicações de controle de processos, como monitoramento de
refinarias de petróleo, controle de tráfego aéreo, de usinas, ou em qualquer aplicação onde o tempo
de processamento é fator fundamental.
Sistemas com Múltiplos Processadores
Os sistemas com múltiplos processadores caracterizam-se por possuir duas ou mais CPUs
interligadas e trabalhando em conjunto. A vantagem deste tipo de sistema é permitir que vários
programas sejam executados ao mesmo tempo ou que um mesmo programa seja subdividido em
várias partes para serem executadas simultaneamente em mais de um processador.
Esta técnica permitiu a criação de sistemas computacionais voltados para processamento científico,
prospecção de petróleo, simulações, processamento de imagens e CAD.
Um fator chave no desenvolvimento dos sistemas multiprocessados é a forma de comunicação entre
as CPUs e o grau de compartilhamento da memória e dos dispositivos de E/S. Em função destes
fatores, podemos classificar os sistemas multiprocessados de acordo com a figura a seguir:
Sistemas
com
Múltiplos
Processadores
Sistemas
Fortemente
Acoplados
Simétricos
Sistemas
Fracamente
Acoplados
Assimétricos
Redes
Distribuídos
Tipos de Sistemas com Múltiplos Processadores
Na figura podemos perceber a divisão dos sistemas multiprocessados em duas categorias iniciais:
sistemas fortemente acoplados e fracamente acoplados. A grande diferença entre estas duas
categorias é que nos sistemas fortemente acoplados existe apenas uma memória a ser compartilhada
pelos processadores do conjunto, enquanto que nos fracamente acoplados cada sistema tem sua
própria memória individual. A taxa de transferência entre processadores e memória em sistemas
fortemente acoplados é muito maior que nos fracamente acoplados.
Nos sistemas fortemente acoplados a memória principal e os dispositivos de E/S são gerenciados por
um único sistema operacional. Quando todos os processadores na arquitetura são iguais, diz-se que o
sistema é simétrico. No entanto, quando os processadores são diferentes, dá-se à arquitetura a
denominação assimétrica.
49
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Nos sistemas fracamente acoplados, como os processadores estão em arquiteturas diferentes,
somente interligados por cabos de interconexão, cada CPU constitui uma máquina independente,
com memória própria, dispositivos de E/S e sistemas operacionais independentes.
Nesta subdivisão, temos como exemplo as redes e os sistemas distribuídos.
No ambiente de rede, existem dois ou mais sistemas independentes (hosts), interligados por linhas
telefônicas, que oferecem algum tipo de serviço aos demais, permitindo que um host compartilhe
seus recursos, como impressora e diretórios, com os outros hosts da rede.
Enquanto nos sistemas em rede os usuários têm conhecimento dos hosts e seus serviços, nos sistemas
distribuídos os sistema operacional esconde os detalhes dos hosts individuais e passa a tratá-los como
um conjunto único, como se fosse um sistema só, fortemente acoplado. Os sistemas distribuídos
permitem, por exemplo, que uma aplicação seja dividida em partes e que cada parte seja executada
por hosts diferentes na rede. Para os usuários e suas aplicações é como se não existisse a rede, mas
um único sistema centralizado.
Outros exemplos de sistemas distribuídos são os clusters. Em um cluster podem existir dois ou mais
servidores ligados por algum tipo de conexão de alto desempenho, e o usuário não conhece os nomes
dos membros do cluster e nem quantos são. Quando é necessário algum serviço, basta solicitar ao
cluster para obtê-lo, sem se preocupar com quem vai dispor e oferecer tal serviço. Clusters são muito
utilizados em servidores de bancos de dados e Web.
Sistemas Multiprogramáveis
Um Sistema Operacional pode ser visto como um conjunto de rotinas que executam
concorrentemente de forma ordenada. A possibilidade de um processador executar instruções em
paralelo com operações de entrada e saída permite que diversas tarefas sejam executadas
concorrentemente. É este conceito de concorrência o princípio fundamental para o projeto e
implementação de sistemas multiprogramáveis.
Os sistemas multiprogramáveis surgiram a partir das limitações dos sistemas monoprogramáveis
onde os recursos computacionais como processador, memória e dispositivos de E/S eram utilizados
de maneira muito pouco eficiente, limitando seu desempenho, com muitos destes recursos
permanecendo ociosos por longos períodos de tempo.
Nos sistemas monoprogramáveis somente um programa pode estar em execução de cada vez,
permanecendo o processador dedicado exclusivamente a uma tarefa, ficando ocioso enquanto uma
operação de leitura em disco é realizada. O tempo de espera é relativamente longo, já que as
operações de E/S são muito lentas se comparadas à velocidade de operação do processador.
Outro aspecto a ser considerado é a sub-utilização da memória principal, onde um programa nem
sempre ocupa todo o espaço disponível, ficando o restante inutilizado. Nos sistemas
multiprogramáveis vários programas podem ser alocados na memória, concorrendo pelo uso do
processador. Dessa forma, quando um programa solicita uma operação de E/S, outros programas
poderão utilizar o processador, deixando a CPU menos ociosa e tornando o uso da memória mais
eficiente, pois existem vários residentes e se revezando na utilização do processador.
A utilização concorrente da CPU deve ser feita de maneira que, quando um programa perde o uso do
processador e depois retorna para continuar sua execução, seu estado deve ser idêntico ao do
momento em que foi interrompido. O programa deverá continuar sua execução exatamente na
instrução seguinte àquela onde havia parado, aparentando ao usuário que nada aconteceu. Em
sistemas de tempo compartilhado existe a impressão de que o computador está inteiramente dedicado
ao usuário, ficando esse mecanismo totalmente transparente aos usuários.
50
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Quanto ao uso dos periféricos, é comum nos sistemas monoprogramáveis é comum termos, por
exemplo, impressoras paradas por um grande período de tempo e discos com acesso restrito a um
único usuário. Esses problemas são minimizados nos sistemas multiprogramáveis, onde é possível
compartilhar os dispositivos de E/S, como impressoras e discos, entre diversos usuários e aplicativos.
Interrupção e Exceção
Durante a execução de um programa, alguns eventos inesperados podem ocorrer, ocasionando um
desvio forçado no seu fluxo normal de execução. Esses eventos são conhecidos como interrupção ou
exceção, e podem ser resultado de sinalizações de algum dispositivo de hardware externo ao
ambiente memória/processador. A diferença entre interrupção e exceção é dada pelo tipo de evento
ocorrido, embora alguns autores e fabricantes não façam tal distinção.
A interrupção é o mecanismo que permitiu a implementação da concorrência nos computadores,
sendo o fundamento básico dos sistemas multiprogramáveis/multitarefa.
Uma interrupção é sempre gerada por um evento externo ao programa e, sendo assim, independe da
instrução que está sendo executada. Um exemplo de interrupção é quando um dispositivo avisa ao
processador que alguma operação de E/S está completa. Neste caso, o processador deve interromper
o programa para tratar o término da operação.
Ao término de cada instrução a Unidade de Controle (situada dentro do processador) verifica a
ocorrência de algum tipo de interrupção. Desta forma, o programa em execução é interrompido e seu
controle é desviado para uma rotina do sistema responsável por tratar o evento ocorrido, denominada
rotina de tratamento de interrupção. Para que o programa interrompido possa retornar
posteriormente à sua execução é necessário que, no momento da interrupção, um certo conjunto de
informações sobre sua execução seja preservado.
Essas informações consistem basicamente no conteúdo dos registradores internos da CPU, que
deverão ser restaurados para a continuação do programa.
Programa
Salva
Contexto
Identifica
a origem
Interrupção
Trata a
Interrupção
Rotina
de
Restaura
Contexto
Tratamento
Mecanismo de interrupção/exceção
Para cada tipo de interrupção existe uma rotina de tratamento associada, para onde o fluxo do
programa é desviado. A identificação do tipo de evento ocorrido é fundamental para determinar o
endereço da rotina adequada ao tratamento da interrupção.
As interrupções podem ser geradas:
- Pelo programa do usuário (entrada de dados pela console ou teclado)
- Pelo hardware (operações de E/S)
51
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
- Pelo sistema operacional (ao término da fatia de tempo do processador destinada ao programa)
As interrupções sempre são tratadas pelo Sistema Operacional.
A exceção é um evento semelhante à interrupção, pois também de fato interrompe um programa.
A principal diferença é que a exceção é o resultado da execução de uma instrução dentro do próprio
programa, como a divisão por zero ou a ocorrência de um overflow (estouro de capacidade de um
campo) numa operação aritmética.
Na maioria das vezes, a exceção provoca um erro fatal no sistema, causando o término anormal do
programa. Isto se deve ao fato de que a exceção é melhor tratada dentro do próprio programa, com
instruções escritas pelo programador.
Buffer
A técnica de buffering consiste nua utilização de uma área em memória principal, denominada
buffer, criada e mantida pelo Sistema Operacional, com a finalidade de auxiliar a transferência de
dados entre dispositivos de E/S e a memória. O buffer permite minimizar a disparidade de velocidade
entre o processador e os dispositivos de E/S, e tem como objetivo principal manter tanto os
dispositivos de E/S como o processador ocupados a maior parte do tempo.
A unidade de transferência do mecanismo de buffering é o registro. O buffer deve permitir o
armazenamento de vários registros, de forma que o processador tenha à sua disposição dados
suficientes para processar sem ter que interromper o programa a cada leitura/gravação no dispositivo
de E/S. Enquanto o processador está ocupado processando, os dispositivos de E/S estão efetuando
operações para outros processos.
SPOOL
A técnica de spooling foi criada inicialmente para auxiliar a submissão de processos ao sistema,
sendo os processos gravados em fita para posterior leitura e execução.
Com o aparecimento dos terminais para acesso ao sistema, esta técnica teve sua função adaptada para
armazenar o resultado da impressão dos programas em execução.
Isto é conseguido através da criação e manutenção, pelo Sistema Operacional de uma grande área em
disco, com a finalidade de simular uma impressora. Desta forma, todos os usuários e seus programas
imprimem, na verdade, para este arquivo em disco, liberando a associação dos dispositivos de
impressão diretamente aos programas que estão executando.
O usuário consegue visualizar o resultado de seus programas na tela dos terminais, gerando assim
mais eficiência e economia de papel e fita de impressão. À proporção que vão sendo gerados no
SPOOL, os relatórios vão sendo liberados para impressão pelo operador do sistema, de forma
ordenada e seqüencial. Para cada usuário, é como se ele tivesse uma impressora associada para si.
Reentrância
É comum, em sistemas multiprogramáveis, vários usuários utilizarem os mesmos aplicativos
simultaneamente, como editores de texto, compiladores e outros utilitários. Nesta situação, se cada
usuário que utilizasse um destes aplicativos trouxesse o código executável para a memória, haveria
então diversas cópias de um mesmo programa ocupando espaço na memória, o que causaria um
grande desperdício de espaço.
Reentrância é a capacidade de um código executável (código reentrante) ser compartilhado por
vários usuários, exigindo apenas uma cópia do programa em memória. A reentrância permite que
cada usuário esteja executando um trecho diferente do código reentrante, manipulando dados
próprios, exclusivos de cada usuário.
52
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Normalmente códigos reentrantes são utilizados em utilitários do sistema, como editores,
compiladores e linkers, promovendo um uso mais eficiente da memória e um desempenho maior do
sistema. Alguns sistemas operacionais permitem a possibilidade de se implementar o conceito de
reentrância em aplicações desenvolvidas pelo próprio usuário, mas não é comum.
Segurança e Proteção do Sistema
A eficiência proporcionada por um ambiente multiprogramável implica em maior complexidade do
sistema operacional, já que alguns problemas de proteção surgem como decorrência deste tipo de
implementação.
Considerando-se que diversos usuários estão compartilhando os mesmos recursos, como memória,
processador e dispositivos de E/S, faz-se então necessário existir mecanismos de proteção para
garantir a confiabilidade e a integridade dos dados e programas dos usuários, além do próprio
sistema operacional.
Como vários programas ocupam a memória principal simultaneamente, cada usuário possui uma área
reservada onde seus programas e dados são armazenados durante o processamento. O sistema
operacional deve possuir mecanismos de proteção a essas áreas, de forma a preservar as informações
nela contidas. Caso um programa tente acessar uma posição de memória fora de sua área, um erro
indicando a violação de acesso deve ocorrer, sendo responsabilidade do sistema operacional o
controle eficiente do compartilhamento dos recursos e a sincronização da comunicação, evitando
problemas de consistência.
Semelhante ao compartilhamento da memória, um disco também armazena arquivos de diferentes
usuários. Novamente o sistema operacional deve garantir a integridade e confiabilidade dos dados de
cada usuário.
Todo o controle da segurança do sistema é implementado pelo sistema operacional, a partir de
mecanismos como grupos de usuários, perfis de usuários e direitos de acesso.
A proteção começa geralmente no procedimento de login, quando o usuário faz a conexão inicial ao
sistema, através de nome do usuário e senha. A partir daí, toda uma estrutura de controle é iniciada,
em função da identificação do usuário, no sentido de proteger as áreas alocadas em memória, em
disco, e até mesmo o uso do processador.
A proteção e segurança do sistema pode ser implementada também a nível do programa do usuário,
com a inserção de rotinas específicas dentro do programa para controlar o acesso de usuários ao
aplicativo, além de controlar internamente quais telas e funções tal usuário pode acessar.
Operações de Entrada e Saída
Nos primeiros sistemas computacionais, a comunicação entre o processador e os periféricos era
direta, sendo o processador responsável por efetuar as operações de leitura/gravação nos dispositivos.
O surgimento do controlador de E/S permitiu ao processador agir de maneira independente dos
dispositivos de E/S. Com esse novo elemento, o processador não mais se comunicava diretamente
com os periféricos, mas sim via controlador.
Passou a existir então três maneiras básicas de se implementar operações de E/S:
por programa: o processador sincronizava-se com o periférico e iniciava a transferência
de dados, ficando permanentemente testando o estado do periférico para saber quando a operação
chegaria ao seu final. O processador ficava ocupado até o término da operação de E/S.
por interrupção: evoluindo o processo anterior, após o início da transferência de dados
o processador passou a ficar livre para realizar outras tarefas. Assim, em determinados intervalos de
53
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
tempo o sistema operacional deveria testar o estado dos periféricos para saber se a operação de E/S
tinha terminado. Este tipo de operação permitiu um certo grau de paralelismo, já que um programa
poderia ser processado enquanto uma operação de leitura/gravação em periférico estava sendo
efetuada. Isto permitiu a implementação dos primeiros sistemas multiprogramáveis.
Memória
Principal
CPU
Controlador
Dispositivos de E/S
A necessidade de se transmitir cada vez um volume maior de informações trouxe uma
evolução significativa nas operações de E/S. Em vez de o processador ser interrompido várias vezes
para interrogar os dispositivos para saber do resultado das operações, o que diminuía sua eficiência
devido ao excesso de interrupções, foi criado um dispositivo de transferência de dados chamado de
DMA – Direct Memory Access. Esta técnica permite que um bloco de dados seja transferido entre a
memória e os dispositivos de E/S sem a intervenção do processador, a não ser no início (quando a
operação é solicitada) e no final da transferência (quando o processador é notificado sobre o término
da operação). Na figura a seguir, podemos ver a implementação do canal de E/S gerenciando vários
controladores e, ligados a estes, vários periféricos.
54
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
O canal de E/S funciona então como uma interface entre os controladores e a CPU, como mostra a
figura a seguir:
Memória
Principal
CPU
Canal de E/S
Controlador
Controlador
Dispositivos de E/S
Dispositivos de E/S
55
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Estrutura do Sistema Operacional
Estrutura do Sistema
USUÁRIO
UTILITÁRIOS
NÚCLEO
DO SISTEMA
HARDWARE
O sistema operacional é formado por um conjunto de rotinas que oferecem serviços essenciais aos
usuários, às suas aplicações, e também ao próprio sistema. A esse conjunto de rotinas dá-se o nome
de núcleo do sistema ou kernel.
É fundamental não se confundir o núcleo do sistema com aplicações, utilitários ou o interpretador de
comandos, que acompanham o sistema operacional. As aplicações são utilizadas pelos usuários de
maneira transparente, escondendo todos os detalhes da interação com o sistema. Os utilitários, como
os compiladores, editores de texto e interpretadores de comandos permitem aos usuários,
desenvolvedores e administradores de sistema uma interação amigável com o sistema.
Existe uma grande dificuldade em compreender a estrutura e o funcionamento do sistema
operacional, pois ele não é executado como uma aplicação tipicamente seqüencial, com início, meio
e fim. Os procedimentos do sistema são executados concorrentemente sem uma ordem específica ou
predefinida, com base em eventos dissociados do tempo. Muitos desses eventos estão relacionados
ao hardware e a tarefas internas do próprio sistema operacional.
Funções do Sistema
As principais funções do núcleo encontradas na maioria dos sistemas comerciais são as
seguintes:
Tratamento de interrupções e exceções: já explicados anteriormente, em detalhes;
Criação e eliminação de processos: função responsável por alocar em memória todos os
recursos necessários à execução do processo. É esta função que aloca em memória, além do
executável, o contexto do processo, o buffer de leitura/gravação (se necessário), além de listas e
estruturas de controle utilizadas pelo sistema operacional. Nesta função também são estabelecidos
vínculos físicos a arquivos em disco, fitas e outros periféricos que serão usados no processamento.
Quando do fim da execução do programa, é esta função que desaloca todos os espaços em memória
ocupados pelo processo, liberando-os para futuras alocações a outros processos;
56
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Escalonamento e controle de processos: função responsável por organizar a fila de acesso ao
processador. Utiliza parâmetros do sistema e do perfil do usuário para estabelecer a ordem em que os
processos permanecerão à espera pela liberação da CPU, para então entrarem em execução;
Gerência de memória: função responsável por fornecer à função de criação/eliminação de
processos os endereços em memória disponíveis para alocação;
Gerência de sistemas de arquivos: responsável pelo gerenciamento dos arquivos, bem como
seu compartilhamento pelos diversos usuários, implementando mecanismos de controle da segurança
e direitos de acesso às áreas utilizadas pelos usuários nos diversos dispositivos;
Gerência de dispositivos de E/S: responsável por gerenciar os dispositivos, prestando auxílio
à criação/eliminação de processos e á gerência de sistemas de arquivos no que diz respeito ao
endereçamento e associação de arquivos em periféricos;
Suporte a redes e teleprocessamento: é esta função que executa todos os serviços de rede,
fazendo o empacotamento das mensagens vindas dos terminais para a CPU central e vice-versa, além
de controlar e confirmar o envio e recebimento de todas as mensagens que trafegam pela rede;
Contabilização de uso do sistema: responsável por contabilizar o uso de todos os recursos do
sistema consumidos pelos usuários e suas aplicações. São registrados: tempo de CPU, tempo corrido,
quantidade de área alocada em memória, em disco, linhas impressas, páginas de papel, entre outros.
Isto se faz necessário para servir de subsídio para análise de performance, estatísticas de gastos com
material de consumo e também para definição de custos de processamento.;
Auditoria e segurança do sistema: função extremamente importante, pois detecta e registra
(num arquivo especial de LOG) todas as ocorrências de erro e violação de direitos de acesso ao
sistema, aos arquivos, à memória e a todos os recursos do sistema. O arquivo de LOG é usado pela
gerência de sistemas, com o intuito de verificar e aperfeiçoar os mecanismos de segurança e proteção
ao sistema.
A estrutura do sistema, a maneira como ele é organizado e o inter-relacionamento entre seus diversos
componentes pode variar conforme a concepção do projeto do sistema.
System Calls
Uma grande preocupação no projeto de sistemas operacionais se refere à implementação de
mecanismos de proteção ao núcleo do sistema e também o controle de acesso aos serviços oferecidos
pelo sistema. Caso uma aplicação que tenha acesso ao núcleo realize alguma operação que altere sua
integridade, todo o sistema poderá ficar comprometido e inoperante.
As system calls podem ser entendidas como uma porta de entrada para acesso ao núcleo do sistema e
aos seus serviços. Sempre que um usuário ou uma aplicação necessita de algum serviço do sistema, é
realizada uma chamada a uma de suas rotinas através de uma system call.
Através dos parâmetros fornecidos na system call, a solicitação é processada e uma resposta é
enviada à aplicação juntamente com um estado de conclusão indicando o sucesso ou não da
operação. Para cada serviço disponível existe uma system call associada, e cada sistema operacional
possui seu próprio conjunto de chamadas, com nomes, parâmetros e formas de ativação específicos.
Isto explica por que uma aplicação desenvolvida utilizando serviços de um determinado sistema
operacional não pode ser diretamente portada para um outro sistema.
57
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Aplicação
System Call
Núcleo do
Sistema
Operacional
Biblioteca
Hardware
Modos de Acesso
Existem certas instruções que não podem ser colocadas diretamente à disposição das aplicações,
pois a sua utilização indevida poderia ocasionar sérios problemas à integridade do sistema. Imagine
que uma aplicação atualize um arquivo em disco. O programa, por si só, não pode especificar
diretamente as instruções que acessam seus dados no disco pois, como o disco é um recurso
compartilhado, sua utilização deve ser gerenciada unicamente pelo sistema operacional. Tal
procedimento evita que a aplicação possa ter acesso a qualquer área do disco indiscriminadamente, o
que poderia comprometer a segurança e a integridade do sistema de arquivos.
Assim, fica claro que existem certas instruções que só podem ser executadas pelo sistema
operacional ou sob sua supervisão. As instruções que têm o poder de comprometer o sistema são
chamadas de instruções privilegiadas, enquanto as instruções que não comprometem o
funcionamento do sistema chamam-se instruções não-privilegiadas.
Para que uma aplicação possa executar uma instrução privilegiada, é preciso que haja um mecanismo
de proteção no processador, chamado modos de acesso. Existem basicamente dois modos de acesso
ao processador: modo usuário e modo kernel. Quando o processador trabalha no modo usuário,
somente instruções não-privilegiadas podem ser executadas, tendo assim acesso a um número
limitado de instruções do processador. Já no modo kernel (ou supervisor), a aplicação pode ter acesso
ao conjunto total de instruções do processador.
A melhor maneira de controlar o acesso às instruções privilegiadas é permitir que apenas o sistema
operacional tenha acesso a elas. Sempre que uma aplicação necessita executar uma instrução
privilegiada, a solicitação deve ser feita através de uma system call, que altera o modo de acesso ao
processador do modo usuário para o modo kernel. Ao término da execução da rotina do sistema, o
modo de acesso retorna para o modo usuário.
Arquiteturas: Sistemas monolíticos, em camadas e microkernel
Arquitetura monolítica: é caracterizada por possuir seus módulos compilados separadamente
mas linkados formando um único e enorme programa executável. Onde os módulos podem interagir
livremente. Os primeiros sistemas operacionais foram desenvolvidos com base nesta arquitetura, o
que tornava seu desenvolvimento e, principalmente, sua manutenção muito difíceis. Como
vantagens desta arquitetura podemos citar a rapidez de execução e simplicidade de implementação.
Como desvantagens, a limitação quanto a inovações futuras e a dificuldade de manutenção.
58
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Aplicação
Aplicação
Modo Usuário
Modo Kernel
System call
Núcleo
do
Sistema
Hardware
Arquitetura monolítica
Arquitetura em camadas: com o aumento do tamanho do código dos sistemas operacionais,
técnicas de programação estruturada e modular foram incorporadas em seu projeto.Na arquitetura em
camadas, o sistema é dividido em níveis sobrepostos. Cada camada oferece um conjunto de funções
que podem ser utilizadas somente pelas camadas superiores. Neste tipo de implementação as
camadas mais internas são mais privilegiadas que as camadas mais externas. A vantagem da
estruturação em camadas é o isolamento das funções do sistema, facilitando sua manutenção. Uma
desvantagem é o desempenho, comprometido devido às várias mudanças de estado do processador
provocado pela mudança de camadas.
59
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
A figura a seguir mostra esta arquitetura.
Camada Usuário
Camada Supervisor
Camada Executivo
Kernel
Arquitetura em camadas
Arquitetura microkernel (cliente x servidor): uma tendência nos sistemas operacionais
modernos é tornar o núcleo do sistema o menor e o mais simples possível. Para implementar esta
idéia, os serviços do sistema são disponibilizados através de processos, onde cada um é responsável
por oferecer um conjunto específico de funções, como gerência de arquivos, gerência de processos,
gerência de memória e escalonamento. Sempre que uma aplicação deseja algum serviço, é realizada
uma solicitação ao processo responsável. Neste caso, a aplicação que está solicitando o serviço é
chamada de cliente, enquanto o processo que responde à solicitação é chamado de servidor. Um
cliente, que pode ser uma aplicação do usuário ou um outro componente do sistema operacional,
solicita um serviço enviando uma mensagem para o servidor. O servidor responde ao cliente através
de uma outra mensagem. A principal função do núcleo é realizar a comunicação, ou seja, a troca de
mensagens entre o cliente e o servidor. A utilização deste modelo permite que os servidores operem
em modo usuário, não tendo acesso direto a certos componentes do sistema. Apenas o núcleo do
sistema, responsável pela comunicação entre clientes e servidores, executa em modo kernel. Como
conseqüência, se ocorrer um erro em algum servidor,este poderá parar, mas o sistema não ficará
inteiramente comprometido, aumentando assim a sua disponibilidade. Como os servidores se
comunicam através de trocas de mensagens, não importa se os clientes e servidores processam em
um sistema com um único processador, com vários processadores ou ainda em um ambiente de
sistema distribuído. A arquitetura microkernel permite isolar as funções do sistema operacional por
diversos servidores pequenos e dedicados a serviços específicos, tornando o núcleo menor, mais fácil
de depurar (procurar e solucionar erros) e, com isso, aumentando a sua confiabilidade. Apesar de
todas as vantagens deste modelo, sua implementação é muito difícil. A começar pelo desempenho,
comprometido devido às várias trocas de modo de acesso a cada troca de mensagens entre cliente e
servidor. Outro problema é que certas funções do sistema operacional, como operações de E/S,
60
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
exigem acesso direto ao hardware. Assim, o núcleo do sistema, além de promover a comunicação
entre clientes e servidores, passa a incorpora funções críticas do sistema, como escalonamento,
tratamento de interrupções e gerência de dispositivos.
Servidor
Servidor
Rede
Servidor
Memória
Arquivo
Servidor
Process
o
Servidor
Impressã
o
Modo Usuário
Modo Kernel
Microkernel
Hardware
PROCESSO
O conceito de processo é a base para a implementação de um sistema multiprogramável. O
processador é projetado apenas para executar instruções, não sendo capaz de distinguir qual
programa se encontra em execução.A gerência de um ambiente multiprogramável é função exclusiva
do sistema operacional, que deve controlar a execução dos diversos programas e o uso concorrente
do processador.
A gerência do processador é uma das principais funções de um sistema operacional. Através dos
processos, um programa pode alocar recursos, compartilhar dados e trocar informações.
Modelo de Processos
A maioria dos computadores modernos são capazes de realizar diversas atividades em paralelo.
Enquanto roda um programa do usuário, o computador pode ler um disco ou utilizar a impressora.
Em sistemas multiprogramados, a CPU é comutada de programa aprograma em períodos da ordem
de milisegundos, dando ao usuário a impressão de paralelismo.
O gerenciamento de atividades paralelas é difícil de ser implementado com eficiência. Entretanto,
projetistas de sistemas operacionais ao longo dos anos vêm desenvolvendo modelos objetivando
tornar esta tarefa mais simples.
No modelo mais empregado atualmente, todos os programas executáveis no computador, muitas
vezes incluindo subsistemas do sistema operacional, estão organizados na forma de processos.
Conceitualmente, cada processo tem uma própria CPU virtual (tabela armazenando conteúdo de
61
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
registradores, contador de programa, etc). A posse da CPU real é passada periodicamente de
processo a processo. O sistema pode ser visto como uma coleção de processos sendo executados em
pseudo paralelismo. 1 Conforme definido anteriormente, a habilidade de executar múltiplos
programas numa única CPU denomina-se multiprogramação.
Em sistemas multiprogramados, a velocidade de execução de u m processo é função da quantidade
de processos competindo pela CPU. Isto implica que o tempo de execução de um processo varia a
cada nova execução, dependadendo da ―carga‖ da máquina. Ass im sendo, processos não devem ser
programados com considerações intrínsecas de tempo. Qu ando são requeridas considerações de
tempo real, medidas especiais devem ser tomadas para se assegurar que estas irão ocorrer.
Concorrência
Em muitos sistemas operacionais, processos frequentemente compartilham outros recursos além da
CPU. Por exemplo, durante uma chamada de sistema um processo pode ter acesso a uma tabela
mantida pelo núcleo. Neste caso, o núcleo deve inibir a comutação da CPU para outro processo, até
que todas as operações na tabela forem efetuadas. Caso contr ário, a tabela fatalmente assumiria um
estado inconsistente onde apenas algumas alterações foram processadas.
Em situações como a exemplificada acima, a tabela é definida co mo um recurso compartilhado, e a
parte do código que o manipula como uma região crítica . A execução de uma região crítica deve ser
um procedimento controlado a fim de evitar que os recu rsos compartilhados atinjam estados
inconsistentes.
Regiões Críticas
A chave para prevenir problemas em áreas compatilhadas é proibir que mais de um processo leia ou
escreva dados compartilhados ao mesmo tempo, ou seja, deve-se garantir a mútua exclusão. Se for
garantido que nenhum par de processos esteja executando ao mesmo tempo uma região crítica
delimitando um mesmo recurso compartilhado, inconsistências são evitadas.
Embora este quesito evite inconsistências, o mesmo não garante eficiência na utilização dos recursos compartilhados. Para assegurarmos uma boa solução, é necessário que:
dois processos não estejam simultaneamente dentro de suas regiões críticas referentes ao mesmo
recurso compartilhado (garantia de mútua exclusão);
a garantia de mútua exclusão se dê independente da velocidade relativa dos processos ou número de
CPUs;
nenhum processo executando fora de regiões críticas bloqueie outro processo;
nenhum processo espere um tempo arbitrariamente longo para executar uma região crítica (ou sofra
―estarvação‖).
Vários algoritmos de controle visando garantir as propriedades acima foram propostos. Estes
algoritmos são classificados segundo o modo com que esperam p ela autorização de entrada numa
região crítica: espera ocupada (competindo pela CPU durante a espera) ou bloqueada (não
competindo pela CPU).
Todo algoritmo de mútua exclusão possui, invariavelmente, duas partes (implementadas como
duas funções distintas). A primeira função é evocada quando o processo deseja iniciar a execução de
uma região crítica. Quando esta função retorna, o processo está apto a executar a região crítica. No
final da execução, o processo evoca a segunda função, anunciando que a região crítica já foi
executada.
Esta segunda função, via de regra, provoca o retorno da primeira função em outro processo.
62
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Para permitir que regiões críticas que acessam recursos com partilhados distintos possam ser executadas ao mesmo tempo, cada recurso compartilhado possui um identificador (via de regra um número inteiro). Assim sendo, as duas funções que compõem o alg oritmo de garantia de mútua
exclusão possuem este identificador como parâmetro.
Mútua Exclusão Com Espera Ocupada
Nesta seção analisaremos várias propostas para garantir exclusão mútua nas regiões críticas, não
permitindo que mais de um processo possam manipular um recurso compartilhado ao mesmo tempo.
Em todas, o processo que está tentando acessar uma região crítica em execução por outro processo
permanece em espera ocupada, isto é, competindo pela CPU mas sem avançar no seu processamento.
Por esta razão, os métodos que empregam espera bloqueada são os mais utilizados na prática.
Desabilitar Interrupções
A solução mais simples é o método de desabilitar todas as interrupções quando se está entrando na
região crítica, e reabilitá-las ao sair. Esta proposta não é muito atrativa, pois dá ao processo usuário
poder de desabilitar todas as interrupções, inclusive aquelas que permitem o núcleo reassumir a CPU.
Caso o processo não as reabilite por algum motivo, o sistema operacional jamais reassume o controle
do hardware.
Em outro aspecto, é conveniente para o sistema operacional desabilitar interrupções durante algumas
instruções, enquanto está atualizando variáveis internas. Assim, desabilitar interrupções é uma
solução útil para o sistema operacional, não para processos de aplicação.
Variáveis LOCK
Uma segunda tentativa leva-nos a uma solução por software. Considere uma variável simples e
compartilhada LOCK, inicialmente igual a 0. Quando um processo deseja entrar em sua região
crítica ele primeiro testa o LOCK. Se for 0, o processo altera para 1 e executa a região crítica. Se for
1 ele espera até que seja 0. Embora pareça uma boa solução, o qu e irá ocorrer se ambos testam uma
variável de valor 0 ao mesmo tempo ?
Alternância Estrita
Esta proposta define uma variável TURN, inicialmente 0. Ela indica quem deve esperar e quem pode
entrar na seção crítica. Se TURN for 0, o processo 0 pode e ntrar na região crítica. Ao sair, deve
passar o valor de TURN para 1. Quando TURN é 1 o processo 1 pode entrar na seção crítica. Ao sair
passa o valor de TURN para 0. 4
Este algoritmo garante a mútua exclusão. Entretanto, os processos estritamente se alternam na posse
do recurso compartilhado. Isto faz com que um processo necessite aguardar o acesso a um recurso
compartilhado por todos os demais até que chegue novamente a sua vez. O que ocorre quando o
número de acessos for diferente entre os processos ?
Mútua Exclusão com Espera Bloqueada
Serão apresentados a seguir alguns mecanismos de garantia d e mútua exclusão que bloqueiam os
processos quando tentam executar uma região crítica ―ocupa da‖. São mais eficientes que os
anteriores, posto que processos bloqueados não competem pela CPU.
Sleep e Wakeup
Um dos métodos mais simples constitue-se do par sleep e wakeup. sleep é uma chamada de sistema
que muda o estado de um processo em execução para bloqueado. Um processo bloqueado volta a
tornar-se ativo quando outro o desbloqueia através da chamada wakeup. O método é o mesmo que
63
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
emprega variáveis LOCK operadas por instruções TSL, exceto que quando a variável apresenta valor
1, o processo executa sleep. O processo que altera o valor de LOCK para 0 ao sair da região crítica é
o responsável por ativar um processo bloqueado (via wakeup).
Infelizmente, com o emprego de apenas sleep e wakeup é fácil demonstrar e existência de um estado
onde todos os processos encontram-se bloqueados. Esta situação é denominada deadlock.
Semáforos
São variáveis inteiras que contam o número de vezes que a operação wakeup tenha sido realizada.
Duas operações, DOWN e UP (generalizações de sleep e wakeup) são definidas. A operação DOWN
verifica se o valor do semáforo for maior que 0. Se o for, decrementa o valor e continua. Se o valor é
0, o processo é bloqueado. A operação UP incrementa o valor do semáforo. Se um ou mais processos
estiverem bloqueados sobre aquele semáforo, um deles é escolhido pelo sistema para completar a
operação DOWN (emitindo-lhe um wakeup).
As operações com semáforos são atômicas ou indivisíveis, im plementadas com instruções TSL.
Contadores de Evento
Um outro tipo de variável de sincronização entre processos. Três operações são definidas para um
contador de evento (E):
READ(E) : retorna o valor corrente de E;
ADVANCE(E) : incrementa atomicamente E; AWAIT(E,v) : bloqueia até que E v.
Note que os contadores de eventos nunca decrescem e partem sempre de 0. Contadores de evento são
mais convenientes que semáforos para problemas to tipo produtor-consumidor com buffer limitado.
Monitores
Semáforos e contadores de evento tornam simples a proteção de recursos compartilhados. Entretanto,
uma simples troca na ordem da chamada das primitivas pode gerar uma situação de deadlock. Em
suma, a utilização de semáforos e contadores de eventos deve se processar com extrema cautela.
Monitores são uma proposta de mecanismo de sincronização de alto nível. Um monitor é uma
coleção de procedimentos, variáveis e estruturas de dados agrupados em um bloco. Os processos
podem acessar os procedimentos do monitor mas não suas estruturas internas. Monitores têm uma
característica importante: somente um processo pode estar ativo no monitor em um dado instante
(garantindo portanto a mútua exclusão).
Monitores constituem-se em um conceito de linguagem de programação, ou seja, o compilador
reconhece que os monitores são especiais e pode manusear as c hamadas do monitor diferentemente
de outras chamadas. Esta é uma das desvantagens de monitores: precisam de linguagens de
programação que os incorpore.
A conclusão é que monitores, apesar de elegantes na manutenção de mútua exclusão, é de
aplicação restrita, pois raras são as linguagens de programação
que os incorporam.
Comunicação Inter-processos
Muitos autores consideram os mecanismos de mútua exclusão apresentados acima como
formas de processos se comunicarem. Entretanto, preferimos considerar tais mecanismos como
de sincronização inter-processos, usando o termo comunicação apenas quando ocorrer
intercâmbio de informação entre processos. Sincronização são procedimentos de controle,
normalmente usados para garantir mútua exclusão, e utilizados para geranciar a competição entre os
processos. Comunicação, por sua vez, visa promover a cooperação entre os processos.
64
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Passagem de Mensagem
Este método de comunicação entre processos usa duas chamadas de sistema: send e receive.
Send (destino, mensagem) : envia mensagem a um processo destino.
Receive (fonte, mensagem) : recebe mensagem de um processo fonte.
Destino e fonte de mensagens são buffers alocados pelos processos para fins de envio e recepção de
mensagens. Mensagens são estruturas tipadas ou não cujo conteúdo é interpretado unicamente pelos
processos emissor e receptor da mensagem.
Compartilhamento de Dados
Processos podem se comunicar através do compartilhamento de uma área comum onde dados podem
ser escritos por um e lidos por outro processo. O acesso a esta área comum deve ser disciplinado por
um mecanismo de mútua exclusão (tipicamente semáforos)ou tornando as instruções de leitura
e gravação atômicas. Duas primitivas são necessárias:
STORE(posição, dado) : grava dados numa certa posição; FETCH(posição, dado) : acessa dados de
uma certa posição.
Chamada de Procedimentos Remotos
Chamada de procedimentos remotos (ou RPC) é uma forma mais estruturada de troca de mensagens
entre processos servidores e clientes. Um processo servidor dispõe de um conjunto de serviços que
um processo cliente evoca como se evocasse um procedimento local. O cliente indica o serviço
desejado ao servidor, passando parâmetros para sua execução, se for o caso. Recebida a requisição,
esta é processada pelo servidor6 que retorna os resultados ao cliente. O envio e recepção de
parâmetros e retornos se dá por troca de mensagens. Uma biblioteca de RPC possui duas primitivas
básicas:
REGISTER_RPC(serviço) : utilizada por servidores para anunciar que serviços estão aptos a
processar;
CALL_RPC(serviço, parâmetros, resultados) : utilizada por clientes para evocar serviços.
Processos e Threads
Processo é geralmente entendido como um programa em execução porém, na realidade, trata-se de
uma estrutura mais complexa que contém, além do programa no seu formato executável, todas as
informações necessárias (contexto) à execução e ao controle da execução do mesmo, como por
exemplo: o contador de programa, pilhas, registradores e área de dados.
O programa é uma entidade passiva, que pode ser visto como o conteúdo de um arquivo em disco,
enquanto que o processo é uma entidade ativa, possuindo um contador de programa (PC), que
especifica a próxima instrução a ser executada, e um conjunto de recursos a ele alocados.
Nos sistemas operacionais mais antigos, cada processo possuía um único fluxo de controle, ou seja,
as instruções são executadas seqüencialmente, uma de cada vez. Já nos sistemas mais mo-dernos, um
processo pode, por sua vez, dar início a um ou mais subprocessos, que são executados em paralelo
ou de forma concorrente com o processo pai e, para todos os efeitos, apresentam as mesmas
características e particularidades de um processo qualquer, no tocante a contexto e fluxo de controle.
Threads, por outro lado, representam uma nova concepção na forma de um processo pa-ralelizar a
execução de partes do seu código. Os threads, conceitualmente, se assemelham a sub-processos
porém, diferentemente destes, não possuem identidade própria e, portanto, não são inde-pendentes.
Cada thread possui seu próprio contador de programa, sua pilha e seus registradores porém
65
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
compartilham todos o mesmo espaço de endereçamento, isto é, como se fossem uma única entidade .
Nos sistemas tradicionais, cada processo tem seu próprio contexto e apenas um fluxo de controle são do tipo single thread. Freqüentemente, no entanto, é desejado ter-se múltiplos fluxos de controle
que compartilhem do mesmo espaço de endereçamento e sejam executados de forma paralela (no
caso de multiprocessamento) ou de forma concorrente (no caso de monoprocessa-mento), como se
fossem processos separados.
Threads satisfazem estes requisitos, pois compartilham do mesmo espaço de endereça-mento com o
processo pai e com os demais threads, e podem ser executados de forma concorrente ou paralela (fig.
VIII.1). O esquema de threads, no entanto, só pode ser utilizado quando for espe-cificamente
suportado pelo sistema operacional ou quando da existência de um gerenciador de thre-ads.
Os threads não são tão independentes como os processos e os subprocessos, uma vez que
compartilham de um mesmo espaço de endereçamento e, por conseguinte, compartilham das mesmas variáveis globais, dos mesmos arquivos, das mesmas tabelas, etc. Uma vez que todo thread pode
acessar todo o espaço virtual de endereçamento do processo pai e dos demais threads, ele pode ―ler e
escrever‖ em qualquer local, mesmo na pilha dos outros threads - o que significa que não há qualquer
forma de proteção de acesso entre os threads.
Os threads compartilham a UCP da mesma forma que os processos o fazem, isto é, podem criar
outros threads e podem ficar suspensos aguardando (em block waiting) pelo término de uma
operação qualquer (system call).
Contexto de um Processo
O ambiente necessário a execução de um processo é formado pelos contextos de hardware e de
software.
O contexto de hardware é fundamental para que os processos possam se revezar no controle
(utilização) da UCP, podendo ser interrompidos pelo SO e, posteriormente, reinicializados do ponto
onde haviam parado sem qualquer solução de continuidade, isto é, como se nada tivesse ocorrido.
A operação que possibilita tal revezamento é chamada de troca de contexto (context switch) e
consiste basicamente em salvar o conteúdo dos registradores e carregá-los com os valores referentes
ao processo que esteja ganhando o controle da UCP.
O contexto de software especifica características do processo que influem na execução do mesmo,
tais como: o número máximo de arquivos abertos, o tamanho do buffer para operações de E/S, etc.
O Sistema Operacional cria para cada processo uma estrutura chamada PCB - Process Control Block,
onde ele mantém todas as informações de contexto (hardware e software) do pro-cesso. O conteúdo e
a estrutura do PCB variam de sistema para sistema, sendo que no exemplo mostrado na figura VIII.2
a seguir, ele consiste do estado do processo, da sua identificação, do registrador PC, dos demais
registradores da UCP, de informações de escalonamento, de informações de memória, de
informações de contabilização e de informações de entrada e saída.
Estados de um Processo
O procedimento de execução de um processo tem início com a criação do mesmo, carga do mesmo
em memória, para que de lá possa ser escalado para tomar o controle da UCP e realizar seu
processamento e, finalmente, terminado, quando da sua conclusão. Quando em memória, o proces-so
pode estar num dos três estados seguintes: em execução, em espera pela ocorrência de um evento
66
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
previamente solicitado por ele mesmo ou, no estado de pronto para execução.
Quando um processo em execução solicita um recurso que não está disponível no momento (como
por exemplo a alocação de um arquivo ou de um periférico) ou cuja obtenção seja operacionalizada
fora da UCP (como por exemplo leitura de registros em disco - DMA), ele automática-mente perde o
controle da UCP e passa do estado de execução para o de espera.
O processo estando no estado de espera passa para o estado de pronto para execução as-sim que tiver
sua solicitação de recurso atendida pelo sistema. No estado de pronto ele está em condições de
reiniciar sua execução e fica aguardando apenas chegar sua vez de retomar o controle da UCP.
Nos sistemas preemptivos, isto é, que admitem interromper a execução de um processo toda vez que
seu tempo (quantum) permitido para alocação da UCP expirar, pode ocorrer que um processo saia da
UCP não para o estado de espera mas direto para o estado de pronto. Vê-se assim que um processo
pode mudar de estado face um evento originado por ele próprio (eventos voluntários) ou pelo sistema
(eventos involuntários).
Estados de Execução de um Processo
Dentro do estado de execução, para fins de proteção do sistema como um todo, são adotados níveis
de prioridade que definem o que o processo está ou não autorizado a fazer. É a forma utilizada para
evitar que processos dos usuários venham a danificar áreas do sistema operacional ou mesmo áreas
reservadas a outros processos.
Sincronização de Processos
O compartilhamento de recursos entre processos pode gerar situações indesejáveis de in-consistência
no acesso aos dados e de indisponibilidade no acesso aos recursos, a ponto de comprometer o sistema
como um todo.
A solução para estes casos é garantir a exclusão mútua, isto é, apenas um processo tem autorização
para acessar o recurso de cada vez. O trecho do programa onde é feito o acesso ao recurso
compartilhado é denominado região crítica e os mecanismos que implementam a exclusão mútua
utilizam um protocolo de acesso à região crítica. Toda vez que um processo for executar sua região
crítica, ele é obrigado a passar por um controle de entrada e outro de saída.
Problemas de Sincronização
Surgem a partir das tentativas de implementar a exclusão mútua.
a) velocidade de execução dos processos
A velocidade de execução dos processos pode interferir na operacionalização da exclusão mútua. No
caso de um chaveamento simples entre dois processos, digamos A e B, sendo que o processo A
consome um tempo de processamento bem mais longo que o processo B, pode levar a situação em
que B se veja impossibilitado de entrar em sua região crítica por estar bloqueado pela execução do
processo A fora da sua região crítica.
b) “Starvation”
É a situação onde um processo nunca consegue executar sua região crítica e, em conseqüência, nunca
consegue acessar o recurso compartilhado. Este problema ocorre quando 2 ou mais processos estão
na lista de espera por um recurso compartilhado. No momento em que o recurso é liberado, o sistema
precisa determinar qual dos processos em espera deve ganhar acesso ao recur-so. Esta escolha pode
ser:
aleatória - um processo pode nunca ser escolhido e sofrer starvation;
67
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
por prioridade - um processo pode novamente permanecer indefinidamente na fila de es-pera face a
constante chegada de processos de maior prioridade;
fila tipo FIFO - evita starvation porém pode prejudicar o desempenho de programas com maior
prioridade de execução.
· Sincronização Condicional
É quando um recurso compartilhado não se encontra pronto para ser utilizado e, nesse caso, o
processo precisa ser mantido em estado de espera até o recurso ficar pronto. Este tipo de
sincronização aparece em qualquer operação onde existam processos gerando serviços e processos
consumindo estes mesmos serviços.
Um exemplo clássico deste tipo de sincronização é o da gravação de um buffer por um processo e
leitura por outro. Ambos os processos envolvidos devem ser sincronizados de forma a não tentarem
gravar um buffer cheio ou ler um buffer vazio.
Deadlock
É conseqüência do compartilhamento exclusivo e ocorre sempre que um ou mais processos estiverem
esperando por um evento (recurso) que jamais ocorrerá. Caracteriza-se por uma espera circular onde
dois ou mais processos aguardam pela liberação de recursos para que possam continuar suas tarefas.
Exemplo, o processo "A", da figura VIII.5, detém o recurso X e espera pelo recurso Y, por outro
lado, o processo "B" detém o recurso Y e espera pelo X.
a) condições para ocorrência de deadlock
· cada recurso só pode estar alocado a um único processo em um determinado instante (exclusão
mútua);
· um processo, além dos recursos já alocados, pode ficar na espera por outros;
· um recurso não pode ser retirado de um processo porque outros processos o estão desejando (nãopreempção);
· um processo pode aguardar por um recurso que esteja alocado a outro processo e vice-versa
(espera circular).
Dois procedimentos podem ser implementados para tratamento de deadlocks: previnir sua
ocorrência ou, detetar sua ocorrência.
Escalonamento de Processos
Os principais objetivos do escalonamento (scheduling) de processos são:
· manter a UCP ocupada a maior parte do tempo;
· balancear a utilização do processador pelos processos em execução;
· maximizar o throughput (capacidade de atendimento a processos) do sistema; e
· garantir tempos de resposta razoáveis aos usuários interativos.
Para atender tais objetivos, muitas vezes conflitantes, os SOs precisam levar em consideração:
as características dos processos em execução (batch, interativo, tempo-real, CPU-bounded,
IO_bounded);
· a disponibilidade de recursos;
· as características da instalação.
O escalonamento dos processos é realizado por um módulo do sistema operacional conhe-cido como
dispatcher (scheduler). Existem diversos algoritmos utilizados para tal finalidade e cada um
apresenta características próprias favorecendo um ou outro critério para a escolha do próximo
68
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
processo a receber o controle da UCP. Os critérios geralmente considerados incluem os seguintes
parâmetros ou medidas de eficiência:
· utilização da UCP - o desejado é manter a UCP p mais ocupada possível. O grau de uti-lização da
UCP varia de 0 (idle) a 100%. Geralmente a ocupação da UCP gira no entor-no dos 40% para
sistemas com carga moderada e aproximadamente 90% para os com carga pesada.
· throughput - medida que representa o número de processos concluídos por unidade de tempo (ex.
10 processos/segundo).
· turnaround time - mede o tempo total gasto na execução de um processo, desde o mo-mento em
que ele é submetido até o instante em que é concluído.
· waiting time - mede apenas o tempo em que o processo fica aguardando por execução na fila de
processos prontos (ready queue).
· response time - mede o tempo decorrido entre a submissão do processo e o instante em que o
mesmo gera a primeira resposta ao usuário.
Escalonamento de Processos
Quando mais de um processo está ativo (pronto para executar), cabe ao sistema operacional decidir
qual terá a posse da CPU. A parte do sistema operacional que toma esta decisão é chamada
escalonador e o algoritmo utilizado é o algoritmo de escalonamento.
Vários critérios devem ser observados por um algoritmo de escalonamento:
1.
progresso: garantir que cada processo tenha acesso à CPU;
2.
eficiência: manter a CPU ocupada praticamente 100% do tempo;
3.
tempo de resposta: minimizar o tempo de resposta na execução dos processos, principalmente
os interativos (editores, planilhas, etc);
4.
tempo de espera: minimizar o tempo de espera de serviços não interativos (compilação,
impressão, etc);
5.
vazão : maximizar o número de processos executados por hora.
É importante observar que alguns desses objetivos são contraditórios. Se um algoritmo favorece o
escalonamento de processos interativos certamente estará comprometendo os não interativos.
Vejamos agora alguns algoritmos de escalonamento.
Algoritmos de Escalonamento
Escalonamento Round Robin
Este é o mais antigo e simples algoritmo de escalonamento. Cada processo é executado por um
intervalo de tempo (quantum). Se o processo ainda estiver executando ao final do quantum, ele é
suspenso e a CPU é alocada a outro processo. Se o processo acabar ou for bloqueado antes do final
do quantum, a CPU também é passada a outro processo. A única questão a ser analisada é o tamanho
do quantum. Se for muito pequeno, diminui a eficiência da CPU, pois a alocação da CPU para outro
processo implica num certo overhead. Se for muito grande, degrada a resposta para os processos
interativos.
Algoritmos com Prioridades
O algoritmo Round Robin faz a consideração que todos os processos são de igual importância. Certas
aplicações, como controle de processos industriais, demandam um algoritmo de escalona-mento com
prioridades. A idéia básica é que cada processo tem uma prioridade e processos com prioridades
69
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
superiores devem ser executados primeiro. Para prevenir que processos de alta prioridade executem
indefinidamente, o escalonador, via de regra, diminui a prioridade dos processos com o aumento de
seu respectivo tempo de execução.
Múltiplas Filas
Este é um algoritmo que define classes com prioridades. Processos na classe de menor prioridade são
executados por um quantum. Processos na classe seguinte, por dois quanta. Na próxima classe por 4
quanta, e assim por diante. Quando um processo utiliza todos os quanta a ele alocados, o mesmo é
interrompido e sua classe tem a prioridade diminuída. Este algoritmo diminui o número de
comutações da CPU entre os processos ativos.
Tarefas Pequenas Primeiro
Este algoritmo é designado para aplicações não interativas , onde o tempo médio de execução é
conhecido a priori. O algoritmo define que as tarefas menores devem ser executadas primeiro. Provase que esta política minimiza o tempo médio de espera dos Jobs.
Algoritmo “Policy-Driven”
Este algoritmo particiona a CPU de forma equânime entre os usuários (não entre os processos). O
algoritmo define que se existirem n usuários ligados ao sistema, e cada usuário deverá receber1/n do
poder da CPU. Para isto, o sistema deve manter informações do tempo de CPU que cada usuário já
dispôs desde que entrou no sistema, e do instante de tempo que cada usuário ligou-se ao sistema.
Escalonamento em Dois Níveis
Até agora foi considerado que todos os processos residem em memória primária. Entretanto se esta
memória for insuficiente, processos ativos podem ser armazenados temporariamente em memória
secundária (tipicamente disco). O meio mais prático para controlar a comutação de processos é
definir dois níveis de escalonamento. Um escalonador de baixo nível se restringe a troca de
processos que estão na memória primária no momento. Um escalonador de alto nível decide sobre a
troca dos processos entre as memórias primária e secundária.
Semáforos
Semáforo é um mecanismo de sincronização interprocessos composto das operações DOWN e UP.
Via de regra, define-se um semáforo para cada recurso compartilhado. A execução da parte código
que acessa tais recursos (região crítica) é abraçada pelas operações DOWN e UP.
Processos definem/acessam semáforos com a chamada de sistema semget. Esta chamada requer três
parâmetros: um identificador global para um array de semáforos; o número de semáforos contido no
array; e um flag estipulando ações relativas a permissões e criação.
Operações em semáforos se processam através da chamada de sistema semop. Esta chamada requer
três parâmetros: o identificador local do semáforo (obtido via semget); um array de estruturas
sembuf; e o número de estruturas no array.
Componentes do processo
Um processo pode ser entendido inicialmente como um programa em execução, que tem suas
informações mantidas pelo sistema operacional.
Num sistema multiusuário, cada usuário tem a impressão de possuir o processador e todos os demais
recursos reservados exclusivamente para si, mas isto não é verdade. Todos os recursos estão sendo
compartilhados, inclusive a CPU. Neste caso, o processador executa o processo do usuário por um
70
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
intervalo de tempo e, no instante seguinte, poderá estar processando um outro programa, do mesmo
ou de outro usuário.
Para que a troca de processos possa ser feita sem problemas, é necessário que todas as informações
do programa que está sendo interrompido sejam guardadas, para que ele possa retornar à CPU
exatamente do ponto em que parou, não lhe faltando nenhuma informação vital à sua continuação.
Todas as informações necessárias à execução de um programa fazem parte do processo.
Um processo também pode ser definido como o ambiente onde o programa é executado. Este
ambiente, além das informações sobre a execução, possui também a quantidade de recursos do
sistema que o programa pode utilizar,como espaço de endereçamento, tempo do processador e área
em disco.
Um processo é formado por três partes: contexto de software, contexto de hardware e espaço de
endereçamento, que juntas mantêm todas as informações necessárias à execução de um programa.
Estrutura do processo:
Contexto de
Software
________
________
________
Programa
Contexto de
Hardware
Espaço de
endereçamento

Contexto de Software: neste contexto são especificadas características e limites dos recursos
que podem ser alocados pelo processo, como número máximo de arquivos abertos, prioridade de
execução, número máximo de linhas impressas, etc. Muitas destas características são criadas no
momento da criação do processo, quando da sua alocação.
O sistema operacional obtém, a partir do cadastro de usuários e do cadastro de contas no sistema, as
informações e características que valerão para o processo.
O contexto de software é composto por tr?es grupos de informações:
Identificação: neste grupo são guardadas informações sobre o usuário que criou o
processo, e, em função disso, suas áreas de atuação no sistema.
Quotas: são os limites de recursos do sistema que um processo pode alocar, como área
utilizada em disco, em memória, limite de linhas impressas, número máximo de arquivos abertos,
número máximo de operações de E/S pendentes, tempo limite de CPU, etc.
Privilégios: diz respeito principalmente às prioridades assumidas pelo processo
durante sua execução.

Contexto de Hardware: armazena o conteúdo dos registradores gerais da CPU, além dos
registradores de uso específico. Quando um processo está em execução, o seu contexto de hardware
está armazenado nos registradores da CPU. No momento em que o processo perde a utilização da
CPU, o sistema salva as informações no contexto de hardware do processo.
71
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
A troca de um processo por outro no processador, comandada pelo sistema operacional, é
denominada troca de contexto, que consiste em salvar o conteúdo dos registradores do processo que
está deixando a CPU e carrega-los com os valores referentes ao do novo processo que irá executar.
Essa operação resume-se em substituir o contexto de hardware de um processo pelo de outro.

Espaço de endereçamento: é a área de memória pertencente a um processo onde as instruções
e os dados do programa são armazenados para execução. Cada processo possui seu próprio espaço de
endereçamento, que deve ser devidamente protegido do acesso dos demais processos. Os contextos
de software e de hardware não fazem parte do espaço de endereçamento .

Bloco de controle do processo: é a estrutura de dados que compõe o processo, contendo os
contextos de software e de hardware e o espaço de endereçamento. O BCP reside em memória, numa
área reservada ao sistema operacional.
Estados do processo
Num sistema multiprogramável, um processo não deve alocar a CPU com exclusividade, de forma
que possa existir um compartilhamento no uso do processador. Os processos passam por diferentes
estados ao longo do processamento, em função de eventos gerados pelo sistema operacional, pelo
hardware, ou pelo próprio programa. São estados possíveis de um processo:
Criação: neste estado o processo está sendo alocado na memória, sendo criado no
sistema. Todos os recursos necessários à execução do processo são reservados durante a passagem do
processo por este estado, o que acontece uma única vez. Vários processos podem estar neste estado,
ao mesmo tempo.
Pronto: é o estado onde os processos, depois de criados ou quando retornam do
tratamento de uma interrupção, permanecem aguardando a liberação da CPU para que possam iniciar
ou continuar seu processamento. É como se fosse uma fila, gerenciada pelo sistema operacional, que
se incumbe de organizar os processos de acordo com as informações contidas no contexto de
software (identificação, quotas e privilégios). Vários processos podem estar neste estado, ao mesmo
tempo.
Execução: é onde o processo efetivamente utiliza a CPU. Ele permanece no
processador até que seja interrompido ou termine sua execução. Neste estado, somente um processo
pode permanecer de cada vez, já que existe apenas um processador.
Espera: neste estado estão todos os processos que sofreram algum tipo de interrupção
de E/S, onde permanecem até que a intervenção seja resolvida. Vários processos podem estar neste
estado, ao mesmo tempo.
Saída: é o estado final do processo, quando este termina seu processamento. Vários
processos podem estar neste estado, ao mesmo tempo.
Mudanças de estado do processo
Um processo muda de estado diversas vezes durante sua permanência no sistema, devido aos eventos
ocorridos durante sua execução. São mudanças possíveis:
Criação Pronto: o processo foi criado, tem seus recursos alocados, e está apto a
disputar o uso da CPU.
Pronto  Execução: o processo é o primeiro da fila de pronto e a CPU fica
disponível. Neste momento o processo passa a ocupar a CPU, permanecendo em execução até que
seja interrompido ou termine sua execução.
72
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Execução  Pronto: o processo foi interrompido por fatia de tempo ou por
prioridade. Ainda precisa de mais tempo na CPU para terminar sua execução, não tem nenhuma
intervenção pendente, por isso volta à fila de pronto para disputar novamente o uso da CPU.
Execução  Espera: esta transição acontece quando o processo foi interrompido por
E/S. Significa que deve permanecer no estado de espera até que a interrupção seja tratada pelo
sistema. Neste estado o processo fica impedido de disputar o uso da CPU.
Espera  Pronto: Após o término do tratamento da interrupção, o processo volta à
fila de pronto para disputar novamente o uso da CPU.
Execução  Saída: o processo terminou, e não mais disputará o uso da CPU.
A seguir, a figura mostra as mudanças possíveis de estado de um processo.
Criação
Pronto
Execução
Saída
Mudanças de estado de
um processo
Espera
Tipos de processos
Além dos processos do usuário, a CPU também executa processos do sistema. São aqueles que
oferecem os serviços do sistema operacional aos usuários, como criação/eliminação de processos,
tratamento de interrupção e todos aqueles correspondentes às funções do sistema já estudadas. Estes
executam sempre, com certa prioridade, concorrendo com os processos do usuário.
Os processos em execução, do usuário, podem assumir dois tipos diferentes, de acordo com suas
características de uso de CPU e periféricos:
Processo CPU-bound: é aquele processo que utiliza muito a CPU. Ele ganha uma fatia de
tempo e a utiliza por inteiro, sem desperdiçar nenhum tempo. É o caso de programas científicos, de
cálculo numérico, estatística, matemática, e também na área de simulação. Normalmente fazem
pouca ou nenhuma entrada de dados, e muito processamento.
Processo I/O-bound: é o tipo de processo que utiliza muito mais E/S do que CPU. Aplicações
em Banco de Dados, onde se faz consultas e atualizações constantes em arquivos em disco são um
bom exemplo deste tipo de processo. De acordo com essas características, podemos dizer que este
tipo de processo permanece mais tempo em espera (tratando interrupções) do que propriamente em
execução, ocupando a CPU por períodos mínimos de tempo.
Gerência do Processador
73
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Funções
Com o surgimento dos sistemas multiprogramáveis, onde múltiplos processos poderiam permanecer
na memória e disputar o uso de um único processador, a gerência do processador tornou-se uma das
atividades mais importantes em um sistema operacional.
A partir do momento em que vários processos podem estar no estado de pronto, devem ser
estabelecidos critérios para definir qual processo será escolhido para fazer uso do processador. Tais
critérios compõem a política de escalonamento, que é a base da gerência do processador e da
multiprogramação em um sistema operacional.
Dentre as funções da gerência do processador, podemos citar: manter o processador ocupado a maior
parte do tempo. balancear o uso da CPU entre processos, privilegiar a execução de aplicações
críticas, maximizar o throughput e oferecer tempos de resposta razoáveis aos usuários interativos.
Cada sistema operacional possui sua política de escalonamento adequada ao seu propósito e às suas
características. Sistemas de tempo compartilhado, por exemplo, possuem requisitos de
escalonamento distintos dos sistemas de tempo real.
Critérios de escalonamento
Utilização do processador: corresponde a uma taxa de utilização, que na maioria dos sistemas
varia entre 30 e 90%. Uma utilização abaixo dos 30% indicaria um sistema ocioso, com carga de
processamento baixa, enquanto uma taxa de utilização acima dos 90% pode indicar um sistema
bastante carregado, próximo da sua capacidade máxima (em alguns casos tal situação pode levar a
um crash – travamento do sistema).
Throughput: é o número de processos executados em um determinado intervalo de tempo.
Quanto maior o throughput, maior o número de tarefas executadas em função do tempo. A
maximização do throughput é desejada na maioria dos sistemas.
Tempo de Processador: é o tempo que um processo leva no estado de execução, durante seu
processamento. As políticas de escalonamento não interferem neste parâmetro, sendo este tempo
função apenas do código executável e da entrada/saída de dados.
Tempo de Espera (pela CPU): é todo o tempo que o processo permanece na fila de pronto,
aguardando a liberação da CPU para ser executado. A redução deste tempo de espera é desejada pela
maioria das políticas de escalonamento.
Tempo de Turnaround: é o tempo total que o processo permaneceu no sistema, desde sua
criação até o momento em que é encerrado. São contados os tempos de alocação de memória, espera
na fila de pronto e interrupção (E/S).
Tempo de Resposta: é o tempo decorrido entre uma requisição ao sistema e o instante em que
a resposta começa a ser exibida. Em sistemas interativos, como aplicações on-line ou acesso à Web,
os tempos de resposta devem ser da ordem de apenas poucos segundos.
Escalonamentos Não-Preemptivos e Preemptivos
Escalonamentos do tipo não-preemptivos são aqueles onde o sistema operacional não pode
interromper o processo em execução para retirá-lo da CPU. Assim sendo, se nenhum evento externo
ocorresse durante a execução do processo, este permanecia na CPU até terminar ou então alguma
instrução do próprio programa o desviasse para o estado de espera (operação de E/S).
Já os escalonamentos preemptivos são caracterizados pela possibilidade de o sistema operacional
interromper o processo em execução para retirá-lo da CPU e dar lugar a outro. Neste caso o processo
74
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
retirado da CPU volta ao estado de pronto, onde permanece aguardando nova oportunidade de ocupar
a CPU. Com o uso da preempção, é possível ao sistema priorizar a execução de processos, como no
caso de aplicações em tempo real. Outro benefício é a possibilidade de implementar políticas de
escalonamento que compartilhem o processador de uma maneira mais uniforme, balanceando o uso
da CPU entre os processos.
São escalonamentos não-preemptivos:
FIFO: o processo que chegar primeiro à fila de pronto é selecionado para execução, e
permanece utilizando o processador até terminar sua execução ou ser interrompido por E/S. Neste
caso, o próximo processo da fila de pronto é selecionado para execução. Todo processo que chega à
fila de pronto entra no final desta fila, conservando a ordem de chegada na fila, até ser escalonado
novamente. Apesar de simples, este escalonamento apresenta algumas deficiências, principalmente
no que diz respeito à dificuldade de se prever o início da execução de um processo, já que a ordem de
chegada á fila de pronto deve ser observada à risca. Outro problema é quanto aos tipos de processo,
onde os CPU-bound levam vantagem no uso do processador em relação aos do tipo I/O-bound, pois
o sistema não trata este tipo de diferença. O escalonamento FIFO foi inicialmente implementado em
sistemas monoprogramáveis, sendo ineficiente se aplicado em sistemas interativos de tempo
compartilhado.
Abaixo, um exemplo de escalonamento utilizando o método FIFO: a ordem de chegada dos
processos (A, B, C) na fila de pronto foi obedecida, e, não tendo sido interrompidos por E/S, os
processos executaram inteiramente até terminar, de acordo com seus tempos necessários para
execução.
0
10
18
27
Processo A
Processo B
Processo C
10 u.t.
8 u.t.
9 u.t.
SJF (Shortest Job First): este escalonamento seleciona o processo que tiver o menor tempo
de processador ainda por executar. Desta forma, o processo que estiver na fila de pronto com menor
necessidade de tempo de CPU para terminar o seu processamento será o escolhido para ocupar a
CPU. Funciona com um parâmetro passado ao sistema via contexto de software, onde o tempo
estimado para o processo é informado baseando-se em estatísticas de execuções anteriores.
Como exemplo, vamos utilizar os mesmos processos executados no escalonamento FIFO acima, com
seus respectivos tempos de execução em u.t. (unidades de tempo): processo A com 10 u.t., processo
B com 8 u.t, e o processo C com 9 u.t. Como neste escalonamento o que importa é o tempo de
execução, a nova ordem de escalonamento para utilização da CPU será B, C e A, como segue:
0
8
17
27
Processo B Processo C
Processo A
Cooperativo: este escalonamento busca aumentar o grau de concorrência no processador.
Neste caso, um processo em execução pode voluntariamente liberar o processador retornando à fila
de pronto, possibilitando que um novo processo seja escalonado, permitindo melhor distribuição do
tempo do processador. A liberação da CPU é uma tarefa exclusiva do programa em execução, que de
75
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
maneira cooperativa libera o processador para um outro processo. Neste mecanismo, o processo em
execução verifica periodicamente uma fila de mensagens para saber se existem outros processos na
fila de pronto. Porém, como a interrupção do processo não depende do sistema operacional, situações
indesejáveis podem ocorrer, como por exemplo, se um programa em execução não verificar a fila de
mensagens, os demais programas não terão chance de executar enquanto a CPU não for liberada. As
primeiras versões do Windows chegaram a utilizar este tipo de escalonamento.
São escalonamentos preemptivos:
Circular: é um tipo de escalonamento projetado especialmente para sistemas em tempo
compartilhado. É muito semelhante ao FIFO (obedece a ordem de chegada á fila de PRONTO), mas
quando um processo passa para o estado de execução há um limite de tempo para o uso contínuo do
processador, chamado fatia de tempo (time-slice) ou quantum. Assim, toda vez que um processo é
selecionado para execução uma nova fatia de tempo lhe é concedida. Caso esta fatia de tempo expire,
o sistema operacional interrompe o processo, salva seu contexto e o direciona para a fila de
PRONTO. Este mecanismo é conhecido como preempção por tempo. A principal vantagem deste
escalonamento é não permitir que um processo monopolize a CPU. Outrossim, uma desvantagem é
que os processos CPU-bound são beneficiados no uso do processador em relação aos processos I/Obound, pois tendem a utilizar totalmente a fatia de tempo recebida. A figura a seguir mostra o
escalonamento circular com 3 processos, onde a fatia de tempo é igual a 2 u.t. No exemplo não estão
sendo levados em consideração tempos de troca de contexto entre os processos, nem o tempo perdido
em operações de E/S. Os processos A, B e C, gastam 10 u.t, 6 u.t e 3 u.t., respectivamente.
A
B
C
u.t.
2
4
6
8
10
11
17
Por Prioridades: funciona com base num valor associado a cada processo, denominado
prioridade de execução. O processo com maior prioridade na fila de PRONTO é sempre o escolhido
para ocupar o processador, sendo os processos com prioridades iguais escalonados pelo critério
FIFO. Neste escalonamento o conceito da fatia de tempo não existe. Como conseqüência disto, um
processo em execução não pode sofrer preempção por tempo. Neste escalonamento a perda do uso
do processador somente ocorrerá no caso de uma mudança voluntária para o estado de espera
(interrupção por E/S), ou quando um outro processo de prioridade maior passa (ou chega) para o
estado de pronto. Neste caso o sistema operacional interrompe o processo em execução, salva seu
contexto e o coloca na fila de pronto, dando lugar na CPU ao processo prioritário. Este mecanismo é
chamado de preempção por prioridade. A figura a seguir mostra a execução dos processos A, B e C,
com tempos de execução de 10, 4 e 3 u.t. respectivamente, e valores de prioridades de 2, 1 e 3,
também respectivamente. Na maioria dos sistemas, valores menores correspondem à MAIOR
prioridade. Assim, a ordem de execução será invertida para B, A e C.
76
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
A
B
C
4
14
17
u.t.
A prioridade de execução faz parte do contexto de software do processo, e pode ser estática (quando
não pode ser alterada durante a existência do processo) ou dinâmica (quando pode ser alterada
durante a existência do processo). Este escalonamento é muito usado em sistemas de tempo real, com
aplicações de controle de processos, controle de tráfego (sinais de trânsito, de trens/metrô, aéreo),
robótica, entre outros.
Escalonamento Circular com Prioridades: implementa o conceito de fatia de tempo e de
prioridade de execução associada a cada processo. Neste escalonamento, um processo permanece no
estado de execução até que termine seu processamento, ou voluntariamente passe para o estado de
espera (interrupção por E/S), ou sofra uma preempção por tempo ou prioridade. A principal
vantagem deste escalonamento é permitir um melhor balanceamento no uso do processador, com a
possibilidade de diferenciar o grau de importância dos processos através da prioridade (o Windows
utiliza este escalonamento).
Por Múltiplas Filas: Este escalonamento implementa várias filas de pronto, cada uma com
prioridade específica. Os processos são associados às filas de acordo com características próprias,
como importância da aplicação, tipo de processamento ou área de memória necessária. Assim, não é
o processo que detém a prioridade, mas sim a fila. O processo em execução sofre preempção caso um
outro processo entre em uma fila de maior prioridade. O sistema operacional só pode escalonar
processos de uma fila quando todas as outras filas de maior prioridade estejam vazias. Os processos
sempre voltam para a mesma fila de onde saíram.
Por Múltiplas Filas com Realimentação: semelhante ao anterior, porém permitindo ao
processo voltar para uma outra fila de maior ou menor prioridade, de acordo com seu comportamento
durante o processamento. O sistema operacional identifica dinamicamente o comportamento de cada
processo e o redireciona para a fila mais conveniente ao longo de seu processamento. É um algoritmo
generalista, podendo ser implementado na maioria dos sistemas operacionais.
GERENCIAMENTO DE MEMÓRIA
Memória é um importante recurso que deve ser cuidadosamente gerenciado. Enquanto a capacidade
de armazenamento dos computadores vem crescendo continuamente, a complexidade do software
cresce talvez à taxas maiores. A parte do sistema operacional que gerencia a memória é chamada de
gerenciador de memória.
Dentre outras tarefas, o gerenciador de memória monitora qu ais partes da memória estão em uso e
quais estão disponíveis; aloca e libera memória para os pro cessos; gerencia a permuta de processos
entre memória principal e secundária (quando a memória principal não é capaz de abrigar todos os
processos).
77
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Gerenciamento de Memória Sem Permuta ou Paginação
Sistemas de gerenciamento de memória podem ser divididos em duas classes: aqueles que movem
processos entre a memória principal e secundária (tipicamente disco) durante a execução, e aqueles
que mantêm os processos fixos em memória primária. N aprimeira classe, o gerenciamento é baseado
em técnicas deswapping (permuta) ou de paginação .
Monoprogramação
O esquema mais simples possível de gerenciamento de memória consiste em ter-se somente um
processo na memória durante toda a sua execução. O usuário carrega um programa do disco ou fita
para a memória, podendo este fazer uso de toda a máquina. Se a memória for insuficiente, o
programa simplesmente tem sua execução rejeitada. Embora essa técnica era comum em meados da
década de sessenta, ela não é mais utilizada.
Multiprogramação e Uso da Memória
Embora a monoprogramação seja usada em pequenos computadores, em grandes computadores com
múltiplos usuários ela é proibitiva. Grandes computadores frequentemente provêem serviços
interativos para vários usuários simultaneamente. Para tal habilidade de ter-se mais de um processo
na memória num mesmo instante de tempo é imprescindível por razões de desempenho.
Uma outra razão para ter-se a multiprogramação, é que muitos processos gastam uma substancial
fração do seu tempo para completar E/S em disco. É comum para u m processo permanecer em um
loop lendo um bloco de dados de um arquivo em disco e então realizando alguma computação sobre
o conteúdo dos blocos lidos. Se for gasto 40 mseg para ler um bloco e a computação demanda apenas
10 mseg, sem a multiprogramação a CPU estará desocupada esperando pelo acesso ao disco durante
80% do tempo.
Modelagem da Multiprogramação
Quando a multiprogramção é usada, o percentual de utilização da CPU aumenta. A grosso modo, se a
média dos processos utilizam CPU somente 20% do tempo que permanecem na memória, com 5
processos em memória, a CPU deverá estar ocupada o tempo todo. Este modelo é otimista,
entretanto, pois assume que os 5 processos nunca estejam esperando por E/S ao mesmo tempo.
Multiprogramação com Partições Fixas
Se adotarmos a estratégia de admitir mais de um processo na memória por vez, devemos estabelecer
uma estratégia de organização da memória. A estratégia mais simples consiste em dividir a memória
em (possilvelmente diferentes) n partições. Estas partições podem, por exemplo, ser esta-belecidas na
configuração do sistema operacional.
Quando um processo inicia, este pode ser colocado em uma fila d e entrada para ocupar a menor
partição de tamanho suficiente para acomodá-lo. Desde que as partições são fixas, qualquer
espaço em uma partição não usado pelo processo é perdido.
Este sistema, com partições fixas definidas pelo operador, foi usado pelo sistema operacional OS/360
nos grandes mainframes da IBM por muitos anos. Ele era chamado de MFT (Multiprogra-ming with
a Fixed number of Task). Ele é simples de se entender e igualmente simples de implemen-tar: os
processos que chegam são colocados em uma fila até que u ma partição adequada seja liberada,
quando então são carregados e executados.
78
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Swapping (Permuta)
Num sistema operando em batch, a organização da memória em partições fixas é simples e efetiva.
Quanto mais jobs estiverem na memória, mais a CPU estará ocupada e não há razão para usar algo
mais complicado. Com time-sharing, a situação é diferente: há normalmente mais usuários que
memória para armazenar os seus processos, sendo então necessário mover temporariamente
processos para disco. Obviamente, para continuar sua execução, um processo movido para disco
deve ser trazido novamente para a memória.
Multiprogramação com Partições Variáveis
Em princípio, um sistema que utiliza swapping pode ser baseado em partições fixas. Sempre que um
processo é bloqueado, ele pode ser movido para o disco e um outro processo trazido do disco para a
sua partição em memória. Na prática, partições fixas são pouco atrativas quando a área de memória é
escassa pois muita memória é perdida por programas muito menores que o tamanho da partição.
Assim sendo, um novo sistema de gerenciamento de memória foi desenvolvido, chamado
gerenciamento com partições variáveis.
Gerenciamento de Memória com Mapa de Bits
Com um mapa de bits, a memória é dividida em unidades de alocação, desde um pequeno número de
palavras até muitos kilobytes. Para cada unidade de alocação existe um bit no mapa de bits, que é 0
se a unidade estiver livre e 1 caso esteja ocupada (ou vice-versa). A figura 4.6 mostra parte da
memória e o correspondente mapa de bits.
O tamanho de cada unidade de alocação é uma importante característica de projeto. Para pequenas
unidades de alocação tem-se um mapa de bits maior. Entret anto, mesmo com uma unidade de
alocação tão pequena como com 4 bytes, 32 bits de memória irão requerer somente 1 bit no mapa
(3% da memória). Se a unidade de alocação for escolhida grand e, o mapa de bits será pequeno, mas
memória considerável pode ser desperdiçada se o tamanho do processo não for um múltiplo exato da
unidade de alocação.
Um mapa de bits (ocupando uma porção fixa da memória) provê uma maneira simples de gerenciar
memória, uma vez que o tamanho do mapa de bits depende som ente do tamanho da memória e do
tamanho da unidade de alocação. O problema principal com i sto é que quando se decide trazer um
processo de k unidades de alocação para a memória, o gerenciador de memória deve pesquisar no
mapa de bits uma sequência de consecutivos bits 0 no mapa. Esta operação é lenta, razão pela qual os
mapas de bits são evitados na prática.
Gerenciamento de Memória com Listas Encadeadas
Outra maneira de gerenciar a memória é manter uma lista de alocações e segmentos de memória
livre, onde um segmento é um processo ou um buraco entre dois processos. A memória da figura
4.6(a) é representada na mesma figura (c) como uma lista encadeada de segmentos. Cada entrada da
lista especifica um buraco (B) ou um processo (P), contendo o endereço onde começa, o tamanho, e
um ponteiro para a próxima entrada da lista.
Neste exemplo, a lista de segmentos é mantida ordenada por endereços. A vantagem desse método é
que quando o processo termina ou é movido para o disco, a atualização da lista é direta. Na
finalização de um processo, ao seu lado teremos processos ou buracos. Quatro situações podem
ocorrer.
Quando processos e buracos são mantidos na lista ordenada por endereços, vários algoritmos podem
79
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
ser usados para alocar memória, a fim de criar ou permutar processos.
Gerência de Memória / Memória Virtual
Historicamente, a memória principal sempre foi vista como um recurso escasso e caro. Uma das
maiores preocupações dos projetistas foi desenvolver sistemas operacionais que não ocupassem
muito espaço de memória e, ao mesmo tempo, otimizassem a utilização dos recursos
computacionais. Mesmo atualmente, com a redução do custo e o aumento considerável da
capacidade da memória principal, seu gerenciamento é dos fatores mais importantes no projeto e
implementação dos sistemas operacionais.
Enquanto nos sistemas monoprogramáveis a gerência de memória não é muito complexa, nos
sistemas multiprogramáveis essa gerência se torna crítica, devido à necessidade de se maximizar o
número de usuários e aplicações utilizando eficientemente o espaço da memória principal.
Funções
Geralmente, os programas são armazenados em memórias secundárias, de uso permanente e não
voláteis, como discos ou fitas. Como o processador somente executa o que está na memória
principal, o sistema operacional deve sempre transferir programas da memória secundária para a
principal antes de serem executados.Como o tempo de acesso às memórias secundárias é muito
superior ao tempo de acesso à memória principal, o sistema operacional deve buscar reduzir o
número de operações de E/S (acessos à memória secundária) a fim de não comprometer o
desempenho do sistema.
A gerência de memória deve tentar manter na memória principal o maior número de processos
residentes, permitindo maximizar o compartilhamento do processador e demais recursos
computacionais. Mesmo não havendo espaço livre, o sistema deve permitir que novos processos
sejam aceitos e executados. Outra preocupação na gerência de memória é permitir a execução de
programas maiores do que a memória física disponível.
Em um ambiente de multiprogramação o sistema operacional deve proteger as áreas de memória
ocupadas por cada processo, além da área onde reside o próprio sistema. Caso um programa tente
realizar algum acesso indevido à memória, o sistema deve, de alguma forma, impedir o acesso.
80
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Alocação Contígua Simples
Este tipo de alocação foi implementado nos primeiros sistemas operacionais, embora ainda nos dias
de hoje esteja presente em alguns sistemas monoprogramáveis. Nesse modelo, a memória principal é
dividida em duas partes, uma para o sistema operacional e a outra para o programa do usuário. Dessa
forma, o programador deve desenvolver suas aplicações preocupado apenas em não ultrapassar o
espaço de memória disponível.
Neste esquema o usuário tem total controle sobre toda a memória, exceto naquela área onde reside o
sistema operacional, cujo endereçamento é protegido por um registrador, impedindo acesso indevido
pelo usuário.
Sistema
Operacional
X
registrador
Área
para
programas
Proteção na alocação contígua simples
Apesar de simples implementação e código reduzido, a alocação contígua simples não permite a
utilização eficiente dos recursos do sistema, pois apenas um usuário pode dispor destes recursos. Há
inclusive um desperdício de espaço de memória, caso o programa não venha a ocupar toda a área
reservada para ele.
Sistema
Operacional
Programa do
Usuário
Área livre
Sub-utilização da memória principal
Segmentação de Programas
Na alocação contígua simples todos os programas estão limitados ao tamanho da memória principal
disponível para o usuário. Uma solução encontrada para o problema é dividir o programa em
módulos, de modo que seja possível a execução independente de cada módulo, utilizando a mesma
área de memória. A esta técnica dá-se o nome de segmentação ou overlay.
Consideremos um programa que tenha três módulos: um principal, um de cadastramento e outro de
impressão, sendo os módulos de cadastramento e impressão independentes. A independência
81
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
significa que quando um módulo estiver na memória para execução, o outro não necessariamente
precisa estar presente.O módulo principal é comum aos outros dois, logo, precisa estar na memória
durante todo o tempo da execução do programa.
Na figura a seguir, a memória é insuficiente para armazenar todo o programa, que totaliza 9 KB. A
técnica de overlay utiliza uma área de memória comum para armazenar o módulo principal do
programa e uma outra área na mesma memória, chamada área de overlay, que será compartilhada
entre os módulos de cadastramento e impressão. Assim, sempre que um dos módulos for
referenciado no módulo principal, o sistema o carregará da memória secundária para a área de
overlay, sobrepondo o módulo antigo na memória.
Memória Principal
2 KB
3 KB
4 KB
Sistema
Operacional
Cadastramento
Módulo
Principal
Área de
Overlay
4 KB
Impressão
2 KB
1 KB
Área livre
2 KB
A definição das áreas de overlay é função do programador, através de comandos específicos da
linguagem de programação utilizada.
A grande vantagem da utilização desta técnica consiste em se poder executar programas maiores do
que a memória física disponível.
Alocação Particionada Estática
Os sistemas operacionais evoluíram no sentido de proporcionar melhor aproveitamento dos recursos
disponíveis. Nos sistemas monoprogramáveis o processador permanece grande parte do tempo
ocioso e a memória principal é sub-utilizada. Os sistemas multiprogramáveis já são muito mais
eficientes no uso do processador, necessitando que vários processos estejam na memória principal ao
mesmo tempo e que novas formas de gerência de memória sejam implementadas.
Nos primeiros sistemas multiprogramáveis a memória era dividida em blocos de tamanho fixo,
chamados partições.O tamanho dessas partições, estabelecido em tempo de inicialização do sistema,
era definido em função do tamanho dos programas que executariam no ambiente.Sempre que fosse
necessária a alteração do tamanho de uma partição, o sistema deveria ser inicializado novamente com
uma nova configuração.
Sistema
Operacional
Partição 1
2 KB
82
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Partição 2
5 KB
Partição 3
8 KB
Inicialmente, os programas só podiam ser carregados e executados em apenas uma partição
específica, mesmo que as outras estivessem disponíveis. Esta limitação se devia aos compiladores e
linkeditores, que geravam apenas código absoluto. No código absoluto, todas as referências a
endereços no programa são posições físicas na memória, ou seja, o programa só poderia ser
carregado a partir do endereço de memória especificado no seu próprio código. A esse tipo de
alocação de memória chamou-se alocação particionada estática absoluta.
Coma evolução dos compiladores, linkeditores, montadores e loaders, o código gerado deixou de ser
absoluto e passou a ser relocável . No código relocável, todas as referências a endereços no programa
são relativas ao início do código e não a endereços fixos na memória. Desta forma, os programas
puderam ser alocados em qualquer partição livre, independente do endereço inicial e da partição para
a qual o código foi criado. A esse tipo de alocação deu-se o nome de alocação particionada estática
relocável.
Tanto nos sistemas de alocação absoluta como nos de alocação relocável, os programas,
normalmente, não ocupam totalmente as partições onde são alocados, deixando algum espaço livre
dentro das partições. Este tipo de problema, decorrente do esquema de alocação fixa de partições, é
chamado fragmentação interna.
A figura a seguir mostra um gráfico representando o particionamento estático de uma memória e sua
fragmentação interna.
Memória Principal
Sistema Operacional
Programa C
1 KB
Programa A
3 KB
Fragmentação
interna
Programa E
5 KB
Alocação particionada estática com fragmentação interna
83
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Alocação Particionada Dinâmica
A alocação particionada estática deixou clara a necessidade de uma nova forma de gerência de
memória principal, onde o problema da fragmentação interna fosse reduzido e, conseqüentemente, o
grau de compartilhamento da memória aumentado.
Na alocação particionada dinâmica, foi eliminado o conceito de partições de tamanho fixo. Nesse
esquema, cada programa, ao ser carregado, utilizaria o espaço necessário à sua execução, tornando
esse espaço a sua partição. Assim, como os programas utilizam apenas o espaço de que necessitam,
no esquema de alocação particionada dinâmica o problema da fragmentação interna deixa de existir.
Porém, com o término de alguns programas e o início de outros, passam a existir na memória blocos
cada vez menores na memória, não permitindo o ingresso de novos programas. A este tipo de
problema dá-se o nome de fragmentação externa.
Para resolver o problema da fragmentação externa, os fabricantes tentaram duas soluções:
reunião de todos os blocos livres adjacentes, formando uma grande área livre, que se
transforma em uma nova partição;
realocação de todas as partições ainda ocupadas para a parte inicial da memória,
eliminando os blocos livres entre elas, formando uma grande área livre no final da memória, que
podia ser distribuída entre os processos ainda por executar. A este tipo de compactação de espaços
livres foi dado o nome de alocação particionada dinâmica com realocação.
Estas soluções ajudaram a diminuir os problemas da fragmentação (tanto interna como externa), mas,
devido á complexidade dos algoritmos, nem todos os sistemas operacionais as utilizaram.
Estratégias de Alocação de Partição
Os sistemas operacionais implementam basicamente três estratégias para determinar em qual área
livre um programa será alocado para execução. Essas estratégias tentam evitar ou diminuir o
problema da fragmentação.
A melhor estratégia a ser adotada por um sistema depende de uma série de fatores, sendo o mais
importante o tamanho dos programas executados no ambiente.
Independentemente do algoritmo utilizado, o sistema possui uma lista das áreas livres, com endereço
e tamanho de cada área.
São estratégias de alocação:
Best-fit: é escolhida a melhor partição, ou seja, aquela que deixa o menor espaço sem
utilização. Uma grande desvantagem desta estratégia é que, como são alocados primeiramente as
partições menores, deixando pequenos blocos, a fragmentação aparece mais rapidamente.
Worst-fit: aloca o programa na pior partição, ou seja, aquela que deixa o maior espaço
livre. Esta técnica, apesar de aproveitar primeiro as partições maiores, acaba deixando espaços livres
grandes o suficiente para que outros programas utilizem esses espaços, permitindo que um número
maior de processos se utilizem da memória, diminuindo ou retardando a fragmentação.
First-fit: esta estratégia aloca o programa na primeira partição que o couber, independente
do espaço livre que vai deixar. Das três estratégias, esta é a mais rápida, consumindo menos recursos
do sistema.
Swapping
É uma técnica aplicada à gerência de memória que visa dar maior taxa de utilização à memória
principal, melhorando seu compartilhamento. Visa também resolver o problema da falta de memória
principal num sistema.
84
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
Toda vez que um programa precisa ser alocado para execução e não há espaço na memória principal,
o sistema operacional escolhe entre os processos alocados que não tem previsão de utilizar a CPU
nos próximos instantes (quase sempre entre aqueles que estão em interrupção de E/S ou no final da
fila de pronto), e ―descarrega‖ este processo da memória para uma área especial em disco, chamada
arquivo de swap, onde o processo fica armazenado temporariamente. Durante o tempo em que o
processo fica em swap, o outro que necessitava de memória entra em execução ocupando o espaço
deixado pelo que saiu. Pouco antes de chegar a vez do processo armazenado em swap utilizar a CPU,
o sistema escolhe um outro processo para descarregar para swap e devolve o anterior da área de swap
para a memória principal, para que este possa ser executado novamente. E vai trabalhando assim até
que os processos vão terminando. O problema dessa técnica é que pode provocar um número
excessivo de acesso à memória secundária (disco), levando o sistema a uma queda de desempenho.
Memória Virtual
Desde o início da informática, o tamanho dos programas vem superando a quantidade de memória
disponível para abrigá-los. A solução usualmente adotada era dividir o programa em partes,
chamados overlays. O overlay 0 começa a ser executado primeiro. Quando termina, o overlay
seguinte é executado, e assim por diante. Alguns sistemas com overlay eram relativamente
complexos, permitindo múltiplos overlays na memória por vez. Overlays eram mantidos em disco e
permutados para a memória pelo sistema operacional.
Overlays apresentavam um problema: a partição do programa era deixada a cargo do programa-dor.
Um método que foi desenvolvido para deixar o particionamento do programa a cargo do sistema
operacional veio a ser conhecido como memória virtual. A idéia básica é que a combinação do
tamanho do programa, dados e pilha, pode exceder a quantia de memória física disponível. O sistema
operacional mantém aquelas partes do programa correntemente em uso na memória principal e o resto no disco. Por exemplo, um programa de tamanho 10M bytes pode ser executado em uma máquina
com 1M bytes de memória escolhendo-se cuidadosamente quais dos 1M será mantido na memória a
cada instante, com pedaços do programa sendo permutados ent re disco e memória assim que forem
necessários.
Memória virtual pode também trabalhar em um sistema com multiprogramação. Por exemplo, oito
programas de 1M podem ser alocados em partições de 256K n uma memória de 2M, com cada
programa operando como se tivesse sua própria máquina de 256K. De fato, memória virtual e
multiprogramação estão intimamente relacionadas. Enquanto u m programa está esperando que parte
de seu espaço de endereçamento seja trazido à memória, o programa é bloqueado, aguardando E/S.
Até que a operação de E/S seja completada, a CPU pode ser direcionada para outro processo.
Paginação
A maioria dos sistemas com memória virtual usa uma técnica chamada paginação . Em qualquer
computador existe certo conjunto de endereços de memória que programas podem referenciar.
Quando um programa usa uma instrução como MOVE REG,1000, ele está movendo o conteúdo do
endereço de memória 1000 para o registrador REG (ou vice versa, dependendo do computador).
Endereços podem ser gerados usando indexação, registradores base, registradores de segmento,
dentre outras maneiras.
Estes endereços gerados pelos programas são chamados
endereços virtuais e formam o
espaço virtual de endereçamento do processo. Em computadores sem memória vitual, o endereço
85
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
virtual é colocado diretamente no barramento de memória e causa uma palavra da memória física
com mesmo endereço ser lida ou escrita. Quando memória virtual é usada, os endereços de memória
não vão diretamente para o barramento de memória. Ao invés disso, eles vão à unidade de
gerenciamento de memória (Memory Management Unit, MMU), onde um hardware específico
mapeia os endereços virtuais nos endereços da memória.
Segmentação
Paginação provê uma técnica para implementação de um grande32 espaço endereçável numa32
memória física limitada. Para algumas aplicações, um espaço endereçável bi-dimensional é mais
conveniente. Idealmente, cada programa deve ter um número muito grande de segmentos (i.e. 2 =
4G), cada um consistindo de grande númeto de bytes (i.e. também2 ). Os primeiros 64K de
segmentos podem ser reservados para procedimentos, dados, e pilhas, pertencentes ao programa em
execução. Os segmentos restantes podem conter um arquivo por segmento, tal que processos possam
diretamente endereçar todos seus arquivos, sem ter que abrí-los e usar primitivas especiais de E/S
para lê-los e escrevê-los. Cada arquivo cresce ou reduz-se completamente, independentemente dos
outros nesta
disposição, com cada byte da memória sendo endereçado por um par (segment, offset).
Algoritmos de Troca de Página
Quando uma falta de página ocorre, o sistema operacional tem que escolher uma página para
remover da memória a fim de dar lugar à que será trazida do disco . Se a página a ser removida foi
modificada enquanto estava na memória, ela deve ser reescrita no disco para manter a cópia em disco
atualizada. Se, todavia, a página não tiver sido alterada, a cópia do disco já está atualizada, não sendo
necessária sua reescrita. A página a ser lida é simplesmente superposta à página retirada.
Apesar de ser possível escolher uma página aleatória para dar lugar à página em demanda, o
desempenho do sistema é melhorado se for escolhida uma página pouco usada (referenciada). Se
uma página muito usada é removida, ela provavelmente terá de ser trazida de volta em breve,
resultando um esforço adicional. Algoritmos eficientes de troca de página visam minimizar este
esforço.
Troca Ótima de Página
O melhor algoritmo de troca de páginas é fácil de descrever mas impossível de implementar. O
algoritmo opera da seguinte maneira. No momento que ocorre uma falta de página, um certo
conjunto de páginas está na memória. Uma dessas páginas será referenciada em muitas das próxima
instruções (a página contendo a instrução). Outras páginas não serão referenciadas antes de 10, 100,
ou talvez 1000 instruções. Cada página pode ser rotulada com o número de instruções que serão
executadas antes que a página seja inicialmente referenciada.
O algoritmo da página ótima simplesmente diz que a página com maior rótulo deve ser remo-vida,
adiando-se o máximo possível a próxima falta de página.
Troca da Página Não Recentemente Usada (NRU)
Para permitir que o sistema operacional colete estatísticas sobre quais páginas estão sendo usadas e
quais não estão, muitos computadores com memória virtual têm 2 bits associados à cada página. Um
bit, R ou bit de referência, é ativado pel ohardware em qualquer leitura ou escrita de página. O outro
bit, M ou bit de modificação, é ativado pelo hardware quando uma página é escrita (i.e., um byte é
alterado/adicionado na página). É importante que estes bits sejam atualizados em qualquer referência
86
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
de memória, assim, é essencial que eles sejam ativados pelo hardware. Uma vez que um bit foi
ativado, ele permanece ativado até que o sistema operacional o desative (por software).
Troca da Página FIFO
O algoritmo de paginação First-In-First-Out (FIFO) é similar ao NRU. O sistema operacional
mantém uma lista de todas as páginas correntes na memória, sendo a página da cabeça da lista a mais
velha e a página do fim a instalada mais recentemente. Em uma falta de página, a página da cabeça é
removida e a nova página acrescentada no fim da lista.
Uma simples modificação no FIFO para evitar o problema da retirada de uma página muito usada é
examinar os bits R e M da página mais velha. Se a página pertencer a classe 0 (não referenciada, não
modificada), ela é retirada, senão a próxima página mais v elha é examinada, e assim por diante. Se
páginas da classe 0 não estão presentes na memória, então o algoritmo é repetido procurando por
páginas da classe 1, 2 e 3.
Troca da Página Menos Recentemente Usada (LRU)
Uma boa aproximação para o algoritmo ótimo é baseada em uma observação comum que as páginas
muito usadas nas últimas instruções, provavelmente o serão nas próximas instruções. Da mesma
forma, páginas que não têm sido usadas por um longo tempo provavelmente continuarão sem uso.
Esta observação sugere um algoritmo realizável: quando ocorre uma falta de página, retira-se a
página que não tem sido usada por um tempo longo. Esta estratégia é chamada de Menos
Recentemente Usada (Least Recently Used - LRU).
Algoritmos de substituição de páginas
O maior problema na gerência de memória virtual por paginação não é decidir quais páginas carregar
para a memória real, mas sim quais páginas liberar. Quando há a necessidade de carregar uma
página, o sistema deve selecionar entre as diversas páginas alocadas na memória qual delas deverá
ser liberada pelo processo.
Os algoritmos de substituição de páginas têm o objetivo de selecionar os frames que tenham as
menores chances de serem referenciados num futuro próximo. Caso contrário, o frame poderia
retornar diversas vezes para a memória real, provocando excesso de page faults.
São algoritmos de substituição de páginas:
algoritmo ótimo: impossível de ser implementado, pois o processador não consegue
prever com segurança qual frame não será mais referenciado durante a execução do programa. Tal
fato deve-se à lógica do programa e aos dados que ele manipula, desconhecidos pelo processador.
Algoritmo aleatório: escolhe qualquer página, entre as alocadas na memória, para fazer a
substituição. Em função de sua baixa eficiência, este algoritmo não muito utilizado, embora consuma
poucos recursos do sistema.
Algoritmo FIFO (first in, first out): escolhe a página que está há mais tempo na memória
principal para fazer a troca. É um algoritmo de simples implementação, mas corre o risco de retirar
uma página que, embora tenha sido carregada há mais tempo, esteja sendo muito utilizada. Por essa
razão não é muito usado.
Algoritmo LFU (least frequently used): elege a página menos freqüentemente usada para
efetuar a troca. Através de um contador, armazenado na tabela de endereçamento de páginas, mo
87
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
sistema identifica quantas referências cada página teve e utiliza esta informação para escolher a
página.
Algoritmo LRU (least recently used): elege a página menos recentemente usada para fazer
a troca. O sistema mantém na tabela de endereçamento de páginas um campo onde são armazenadas
a data e a hora da última referência de cada página, e com base nestas informações faz a seleção.
Algoritmo NRU (not recently used): elege a página menos recentemente usada para
efetuar a troca. O sistema exclui da decisão a página mais recente e escolhe entre as outras, pelo
método FIFO, qual página deve sair.
Gerência de Sistemas de Arquivos
Estrutura de Diretórios
É como o Sistema organiza logicamente os arquivos. Contém entradas associadas aos arquivos, com
as informações de localização, nome, organização e outros atributos:

Nível único: é a implementação mais simples de uma estrutura de diretórios, onde existe um
único diretório contendo todos os arquivos do disco. É muito limitado, não permitindo a criação de
arquivos com o mesmo nome.

Diretório pessoal: Evolução do modelo anterior, permite a cada usuário ter ser ―diretório‖
particular, sem a preocupação de conhecer os outros arquivos do disco. Neste modelo há um diretório
―master‖ que indexa todos os diretórios particulares dos usuários, provendo o acesso a cada um.

Múltiplos níveis (ÁRVORE): É o modelo utilizado hoje em dia em quase todos os Sistemas
Operacionais. Nesta modalidade cada usuário pode criar vários níveis de diretórios (ou subdiretórios), sendo que cada diretório pode conter arquivos e sub-diretórios. O número de níveis
possíveis depende do Sistema Operacional.
SISTEMA DE ARQUIVOS
A parte mais visível de um sistema operacional é o seu sistema de arquivos. Programas aplicativos
utilizam o sistema de arquivos (via chamadas de sistema) para criar, ler, gravar e remover arquivos.
Usuários utilizam interativamente o sistema de arquivos (via shell) para listar, alterar propriedades e
remover arquivos. A conveniência e facilidade de uso de um Sistema operacional é fortemente
determinada pela interface, estrutura e confiabilidade de s eu sistema de arquivos.
Interface do Sistema de Arquivos
Do ponto de vista do usuário, o aspecto mais importante do sistema de arquivos é como ele se
apresenta, isto é, o que constitui um arquivo, como os arquivos são identificados e protegidos, que
operações são permitidas sobre os arquivos, e assim por diante.
Fundamentos Básicos
A maior parte dos sistemas operacionais trazem a seguinte proposta para armazenamento de
informação: permitir aos usuários definir objetos chamados arquivos, que podem armazenar
programas, dados, ou qualquer outra informação. Estes arquivos não são parte endereçável de
nenhum processo e o sistema operacional provê operações especiais (i.e., chamadas de sistema) para
criar, destruir, ler, atualizar e proteger arquivos.
Todos os sistemas operacionais visam uma independência dos dispositivos de armazenamento,
permitindo acessar um arquivo sem especificar em qual dispositivo o mesmo se encontra fisicamente
armazenado. Um programa que lê um arquivo de entrada e escreve um arquivo saída deve ser capaz
88
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
de operar com arquivos armazenados em quaisquer dispositivos, sem necessidade de um código
especial para explicitar o tipo de periférico.
Alguns sistemas operacionais provêem maior independência dos dispositivos de armazenamento que
outros. No UNIX, por exemplo, um sistema de arquivos pode ser montado em qualquer dispositivo
de armazenamento, permitindo que qualquer arquivo seja acessado pelo seu nome (path name), sem
considerar o dispositivo físico. No MS-DOS, por outro lado, o usuário deve especificar em qual
dispositivo cada arquivo se encontra (exceto quando um dispositivo é default e for omitido). Assim,
se o dispositivo default for o drive C, para executar um programa localizado no drive A com
arquivos de entrada e saída no drive B, cada um deles deverá ser especificado juntamente com o
nome do aquivo:
 A:programa < B:entrada > B:saida
A maior parte dos sistemas operacionais suportam vários tipos de arquivos. O UNIX, por exemplo,
mantém arquivos regulares, diretórios e arquivos especiais. Arquivos regulares contém dados e
programas do usuário. Diretórios permitem identificar arquivos através de nomes simbólicos (i.e.
sequência de caracteres ASCII). Arquivos especiais são usados para especificar periféricos tais como
terminais, impressoras, unidades de fita, etc. Assim podemos digitar
 cp abc /dev/tty
para copiar um arquivo abc para o terminal (arquivo especial /dev/tty).
Em muitos sistemas, arquivos regulares são subdivididos em diferentes tipos em função de sua
utilização. Os tipos são identificados pelos nomes com que os arquivos regulares terminam. Por
exemplo,
 ARQUIVO.PAS - Programa fonte em Pascal
 ARQUIVO.FTN - Programa fonte em Fortran
 ARQUIVO.BAS - Programa fonte em Basic
 ARQUIVO.OBJ - Arquivo objeto
 ARQUIVO.BIN - Programa binario executável
 ARQUIVO.LIB - Biblioteca dos arquivos .OBJ usados pelo linker
 ARQUIVO.TXT - Texto de entrada para formatação de programa
 ARQUIVO.DAT - Arquivos de dados
Diretórios
Para organizar os arquivos, o sistema de arquivos provê diretórios, os quais em muitos casos são
também arquivos. Um diretório contém tipicamente um número de registros, um por arquivo.
Sistemas primitivos admitiam um único diretório compartilhado por todos os usuários, ou um único
diretório por usuário. Os sistemas operacionais modernos permitem um número arbitrário de
diretórios por usuário (via de regra, formando uma hierarquia). Quando o sistema de arquivos é
organizado como uma árvore de diretórios, algum meio se faz necessário para especificar nomes de
arquivos. Dois métodos são comumente empregados. No primeiro método, cada arquivo é
identificado pela sequência de diretórios desde o diretório raiz até o arquivo (caminho absoluto).
Como um exemplo, o caminho /usr/mfm/mailbox significa que o diretório raiz (/) contém o
subdiretório usr, o qual contém o subdiretório mfm, que por sua vez contém o arquivo mailbox.
Nomes absolutos para caminhos sempre começam na raiz e são únicos.
Uma outra forma de especificar nomes de arquivos é através de seu caminho relativo. É usado em
conjunto com o conceito de diretório de trabalho (ou diretório corrente). Um usuário pode designar
89
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
um diretório como diretório corrente. Neste caso, todos os c aminhos são referenciados a partir do
diretório corrente. Se o diretório corrente for é /usr/mfm, então o arquivo cujo caminho absoluto
é/usr/mfm/mailbox pode ser referenciado simplesmente como mailbox.
Confiabilidade do Sistema de Arquivos
Blocos Defeituosos
Discos frequentemente apresentam blocos defeituosos (bad blocks), isto é, blocos onde a escrita e/ou
leitura é impossibilitada. Duas soluções para o problema de blocos defeituosos são empregadas, uma
em hardware e outra em software. A solução em hardware consiste em dedicar um setor no disco
para a lista de blocos defeituosos. Quando o controlador do disco é iniciado, este lê a lista de blocos
defeituosos e escolhe blocos sobressalentes para substituí-los. São feitas então indireções dos blocos
defeituosos para os blocos sobressalentes. Daí por diante, qualquer operação envolvendo um bloco
defeituoso terá efeito em seu respectivo bloco sobressalente.
A solução em software requer que o usuário informe (ou que o sistema de arquivos detecte)
os blocos defeituosos. Estes blocos são armazenados num arqui vo, acessado quando da construção
da lista de blocos livre. Conhecendo os blocos defeituosos, o sistema operacional não os incorpora na
lista de blocos livre, eliminando assim sua ocorrência futura em arquivos de dados.
Consistência do Sistema de Arquivos
Outro tópico envolvendo confiabilidade é a consistência do sistema de arquivos. Muitos sistemas de
arquivos lêem blocos, modifica-os, e os regrava mais tarde. Se o sistema falha antes que todos os
blocos modificados forem escritos no disco, o sistema de arquivos assume um estado inconsistente.
Este problema é especialmente crítico se alguns dos blocos que não foram escritos, são blocos de
inodes, blocos de diretório, ou blocos contendo a lista de blocos livre.
Para verificar a consistência do sistema de arquivos, muitos sistemas operacionais utilizam
programas utilitários desenvolvidos para este fim. Este programa é executado sempre que o sistema é
iniciado, particularmente depois de um desligamento adrúpto. A seguir é descrito como tal utilitário
opera no UNIX.
O controle de consistência se dá em dois níveis: blocos e arquivos. Para controle de consistência a
nível de bloco, o utilitário constrói uma tabela com dois contadores por bloco, ambos iniciados em 0.
O primeiro contador rastreia quantas vezes o bloco aparece no arquivo; o segundo registra com que
frequência ele aparece na lista de blocos livre.
O utilitário lê todos os inodes. Começando de um inode, é possível construir uma lista de todos os
números de blocos usados no correspondente arquivo. Assim que cada número de bloco é lido, seu
respectivo contador na primeira tabela é incrementado. A seguir, é examinada a lista de blocos livre
rastreando todos os blocos que não estão em uso. Cada ocorrência de um bloco na lista de blocos
livre resulta no incremento do respectivo contador na segunda tabela.
Se o sistema de arquivo for consistente, cada bloco terá o valor 1 na primeira tabela ou na segunda
tabela. Contudo, em caso de falha, pode detectar-se blocos que não ocorrem em nenhuma das tabelas
(blocos perdidos). Embora blocos perdidos não causem um dan o real, eles desperdiçam espaço,
reduzindo assim a capacidade do disco. A solução para blocos perdidos é direta: o
verificador do sistema de arquivos acrescenta-os na lista de blocos livre.
Outra situação possível de ocorrer é a repetição de blocos na lista de blocos livre. A solução neste
caso também é simples: reconstruir a lista de blocos livre, limitando-se as duplicações.
O mais grave é a ocorrência do mesmo bloco de dados em dois ou mais arquivos. Se cada um desses
90
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
arquivos for removido, o bloco duplicado será posto na lista de blocos livre, chegando-se em uma
situação em que o mesmo bloco está, ambiguamente, em uso e livre ao mesmo tempo. Se ambos os
arquivos forem removidos, o bloco será adicionado na lista de blocos livre duas vezes.
A ação apropriada do utilitário é alocar um bloco livre, copiar o conteúdo do bloco duplicado nele, e
inserir a cópia em um dos arquivos. Desde modo, a infor mação dos arquivos não é alterada (embora
certamente incorreta para um dos arquivos), mas a estrutura do sistema de arquivos é, pelo menos,
consistente. O erro será informado para permitir ao usuário examinar a falha.
Ainda para verificar se cada bloco é contado corretamente, o utilitário também examina o sistema de
diretórios (consistência a nível de arquivos). Neste caso, é usada uma tabela de contadores por
arquivos (não por blocos, como anteriormente). A verific ação começa no diretório raiz e,
recursivamente, desce a árvore inspecionando cada diretório no sistema de arquivos. Para cada
arquivo encontrado, incrementa-se o contador para o seu respectivo inode.
Quando toda a árvore de diretórios é percorrida, tem-se uma lista indexada pelo número do inode,
descrevendo quantos diretórios apontam para aquele inode. O utilitário então compara esses valores
com os contadores dos inodes. Em um sistema de arquivos consistente, ambos contadores
coincidirão. Contudo, dois tipos de erros podem ocorrer: o contador do inode pode ser maior ou
menor que o da lista do utilitário.
Se a contagem no inode for maior que o número de registros do diretório, então mesmo se todos os
arquivos forem removidos dos diretórios, o contador aind será diferente de 0 e o inode não será
liberado. Este erro não é catastrófico, mas consome espaço no disco com arquivos que não estão em
nenhum dos diretórios. O contador de conexões do inode deve ser corrigido através da atribuição do
valor obtido pelo utilitário.
Outro erro (potencialmente catastrófico) ocorre quando o contador do inode é menor que o
encontrado pelo utilitário. A medida que os arquivos que apontam para o inode vão sendo removidos,
o contador do inode pode chegar a zero, momento que o inode e seus respectivos blocos são
liberados. Esta ação resultará em um dos diretórios apontando para um inode não mais em uso, cujos
blocos podem rapidamente ser atribuidos a outros arquivos. Novamente, a solução é forçar o
contador do inode para o número real de registros do diretório (obtidas pelo utilitário).
Estas duas operações, verificar blocos e verificar diretório s, são frequentemente integradas por
razães de eficiência (i.e., uma única passagem sobre osinodes é requerida). Outros controles heurísticos são também possíveis. Por exemplo, diretórios têm um formato definido, com um número
inodes e nomes ASCII. Se um númeroinode for maior que o número deinodes no disco, o diretório
encontra-se num estado inconsistente.
Desempenho do Sistema de Arquivos
Um acesso a disco é muito mais lento que um acesso a memória. Ler uma palavra da memória leva
tipicamente algumas centenas de nanosegundos. Ler um bloco do disco requer dezenas de
milisegundos, um fator 100.000 vezes mais lento. Como resultado, muitos sistemas de arquivos têm
sido projetados para reduzir o número necessário de acessos disco.
A técnica mais comum para reduzir o acesso a disco é a block cache ou buffer cache. Neste contexto,
uma cache é uma coleção de blocos que pertencem logicamente ao disco, mas são mantidos na
memória por razões de desempenho.
Vários algoritmos podem ser usados para gerenciar ocache, mas o mais comum é o que verifica todas
as requisições de leitura para ver se o bloco referido e stá nacache. Se estiver, a requisição de leitura
pode ser satisfeita sem acesso a disco. Se o bloco não estiver na cache, ele é inicialmente lido para a
91
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
cache, e então copiado para a área do processo que requisitou o acesso. Requisições subsequentes do
mesmo bloco podem ser satisfeitas através da cache.
Quando um bloco tem que ser carregado para uma cache cheia, algum bloco terá que ser removido e
reescrito no disco, caso tenha sido modificado desde o insta nte em que foi instalado na cache. Esta
situação é muito parecida com a paginação, e todos os algorit mos usuais de paginação, tal como o
―menos recentemente usado‖ (LRU) podem ser aplicados neste contexto.
Se um bloco for essencial para a consistência do sistema de arquivos (basicamente tudo, exceto
blocos de dados), e foi modificado na cache, é necessário que o mesmo seja escrito no disco
imediatamente. Escrevendo blocos críticos rapidamente no disco, reduzimos a probabilidade que
falhas danifiquem o sistema de arquivos.
Até mesmo com estas medidas para manter a integridade do sistema de arquivos, é
indesejável manter blocos de dados na cache durante muito tempo antes que sejam descarregados em
disco. Os sistemas de arquivos adotam duas estratégias para tal. No UNIX, a chamada de sistema
sync, força com que todos os blocos modificados sejam gravados em disco im ediatamente. Quando
o sistema é iniciado, um programa, usualmente chamado update, é ativado. De 30 em 30 segundos, a
atualização da cache é estabelecida. Como resultado, na pior hipótese, perde-se os blocos gravados
nos últimos 30 segundos em caso de uma pane.
A solução do MS-DOS é gravar todo bloco modificado para o disco tão logo ele tenha sido escrito.
Caches nas quais blocos modificados são reescritos imediatamente n o disco são chamadas caches de
escrita direta. Elas requerem muito mais E/S de disco que caches de escrita não direta. A diferença
entre estas duas técnicas pode ser vista quando um programa escreve num buffer de 1K, caracter por
caracter. O UNIX coleta todos os caracteres da cache, e escreve o bloco de uma vez em 30 segundos,
ou quando o bloco for removido da cache.
O MS-DOS faz acesso a disco para cada um dos caracteres escritos. Naturalmente, muitos programas fazem ―bufferização‖ interna, procedendo gravaçõe s em disco apenas quando existir uma
determinada quantidade de bytes pendentes. A estratégia adotada pelo MS-DOS foi influenciada pela garantia que a remoção de um disco flexível de sua unidade nã o causa perda de dados. No UNIX,
é necessária uma chamadasync antes da remoção de qualquer meio de armazenamento (ou da par ada
programada do sistema).
Cache não é a única maneira de aumentar o desempenho do sistema de arquivos. Uma outra maneira
é reduzir a quantidade de movimentos do braço do disco, colocando blocos que estão sendo
acessados em sequência, preferencialmente em um mesmo cilindro. Quando um arquivo é escrito, o
sistema de arquivos aloca os blocos um por vez, a medida do necessário. Se os blocos livre estiverem
gravados em um mapa de bits, e o mapa de bits inteiro está na memória principal, é fácil escolher um
bloco que está mais perto do bloco anterior. Com uma lista de blocos livre, parte da qual está no
disco, é mais difícil alocar blocos próximos.
Entretanto, com uma lista de blocos livre alguns agrupamentos de blocos podem ser feitos. O
artifício é manter a trilha do disco armazenada não em blocos, mais em grupos consecutivos de
blocos. Se uma trilha consistir de 64 setores de 512 bytes, o sistema pode usar blocos de 1K bytes (2
setores), porém alocando espaço no disco em unidades de 2 blocos (4 setores). Isto não é o mesmo
que ter um bloco de 2K, posto que na cache ainda se usa blocos de 1K com transferência para disco
também de 1K. Entretanto, a leitura sequencial reduz o número de busca de um fator de 2,
melhorando consideravelmente o desempenho.
Outra variante é fazer uso do posicionamento rotacional. Quando se alocam blocos, o sistema atenta
92
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
para colocar blocos consecutivos de um arquivo no mesmo cilindro, mas intercalados. Deste modo,
se um disco tiver um tempo de rotação de 16.67 mseg e 4 mse g são necessários para o processo do
usuário requerer e acessar um bloco do disco, cada bloco deve ser colocado em ao menos um quarto
da distância do seu antecessor.
Um outro agravante no desempenho dos sistemas que usam inodes, ou algo similar, é que para ler até
mesmo um pequeno arquivo, seja necessário 2 acessoson disco: um para o inode e outro para o
bloco. Caso todos os inodes estejam próximos do início do disco, distância média entre o inode
estará em torno da metade do número de cilindros, o que exigeongasl buscas.
Melhor alternativa é instalar osinodes no meio do disco, reduzindo a média de busca entre o inode e
o primeiro bloco de um fator de 2. Uma outra idéia consiste emdividir o disco em grupos de
cilindros, cada qual com os seus próprios inodes, blocos, e lista de blocos livre. Quando se cria um
novo arquivo, qualquer inode pode ser escolhido, mas tendo-se o cuidado de achar um bloco no
mesmo grupo de cilindros onde o inode está. Caso nenhum bloco esteja disponível, escolhe-se um
bloco do cilindro mais próximo.
Sistemas de alocação de arquivos

FAT: sistema criado no MS-DOS e depois utilizado no Windows. Usa listas encadeadas, tem
um limite de área utilizável em partições de 2 GB, caracteriza-se por um baixo desempenho no
acesso e armazenamento.

FAT32: igual ao FAT no que diz respeito a organização e desempenho, mas pode trabalhar
com partições de até 2TB.

NTFS: NT File System, original da plataforma Windows NT/2000/XP. Opera com uma
estrutura em árvore binária, oferecendo alto grau de segurança e desempenho:
nomes de arquivo com até 255 caracteres, podendo conter maiúsculas, minúsculas e
espaços em branco;
dispensa ferramentas de recuperação de erros;
bom sistema de proteção de arquivos;
criptografia;
suporta discos de até 264 bytes.

UNIX: Usa diretório hierárquico, com um raiz e outros diretórios subordinados. Neste
Sistema Operacional todos os arquivos são considerados apenas como uma ―seqüência‖ de bytes,
sem significado para o Sistema. É responsabilidade da aplicação controlar os métodos de acesso aos
arquivos. O UNIX utiliza também alguns diretórios padronizados, de exclusividade do Sistema.
ENTRADA/SAÍDA
Uma das principais funções do sistema operacional é controlar todos os dispositivos de entrada/saída
(E/S) do computador, emitindo comandos para os dispositivos, atendendo interrupções e
manipulando erros. Deve também prover uma interface entre os dispositivos e o resto do sistema, que
seja simples e fácil de usar (se possível, a interface devser a mesma para todos os dispositivos). O
código de entrada/saída representa uma fração significativa do total do sistema operacional. A forma
como o sistema operacional gerencia E/S é o objeto deste capítulo.
Dispositivos de E/S
Dispositivos de E/S podem ser grosseiramente divididos em duas categorias: dispositivos de bloco e
93
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
dispositivos de caracter. Um dispositivo de bloco armazena informações em blocos de t amanho
fixo, cada um com seu próprio endereço. Tamanhos comuns de blocos estão na faixa de 128 bytes a
1024 bytes. A propriedade essencial dos dispositivos de bloco é que é possível ler ou escrever cada
bloco independentemente de todos os outros. Em outras palavras, em qualquer instante, o programa
pode ler ou escrever qualquer um dos blocos. Discos são dispositivos de bloco.
O outro tipo de dispositivo de E/S, o de caracter, libera ou aceita uma fila de caracteres sem definir
nenhuma estrutura de bloco. Ele não é endereçável e não aceita operações de busca. Terminais,
impressoras, leitoras ótica e outros dispositivos que não trabalham como os discos são exemplos de
dispositivos de caracter.
Este esquema de classificação não é perfeito. Alguns dispositivos não são enquadrados nele.
Relógios, por exemplo, não são endereçáveis por bloco. Nem geram ou aceitam filas de caracteres.
Tudo o que fazem é gerar interrupções em intervalos regulares. Contudo, este modelo é geral
o suficiente para ser usado como base na construção de um sistema operacional com bom
nível de independência dos dispositivos de E/S. O sistema de arquivo, por exemplo, negocia apenas
com dispositivos de blocos abstratos, e deixa a parte dependente do dispositivo para o software de
mais baixo nível, chamado acionadores de dispositivos (device drivers).
Controladores de Dispositivos
Unidades de E/S consistem tipicamente de componentes mecânicos e eletrônicos. É frequente a
separação das duas porções para se obter um projeto mais geral e modular. O componente eletrônico
é chamado decontrolador do dispositivo (device controller ou adapter). Em mini e
microcomputadores, ele normalmente toma forma de um circuito impresso que pode ser inserido no
computador. O componente mecânico é o dispositivo propriamente dito.
O cartão do controlador normalmente tem um conector, no qual um cabo condutor do próprio
dispositivo pode ser conectado. Muitos controladores podem manusear dois ou mais dispositivos do
mesmo tipo.
A distinção entre dispositivo e controlador deve ser ressaltada, já que o sistema operacional vê o
controlador, não com o dispositivo. Normalmente, minicomputadores e microcomputadores usam
um barramento único para comunicação entre CPU e os controladores. Mainframes frequentemente
usam um modelo diferente, no qual múltiplosbarramentos e computadores especializados de E/S,
chamados canais de E/S, aliviam parte da carga da CPU.
A interface entre o controlador e o dispositivo é, via de regra, uma interface de baixo nível. O disco,
por exemplo, pode ser formatado com 8 setores de 512 bytes por trilha. O que realmente sai do
driver, entretanto, é uma lista serial de bits, partindo com um preâmbulo, depois os 4096 bits no
setor, e finalmente o checksum ou o código de correção de erro. O preâmbulo é escrito quando o
disco é formatado, e contém o número de cilindros e de setores, o tamanho do setor, e outros dados.
A tarefa do controlador é converter a lista serial de bits em um bloco de bytes e realizar alguma
correção de erro necessária. O bloco de bytes é tipicamente primeiro montado, bit por bit, em um
buffer mantido no controlador. Após o checksum ter sido verificado e o bloco declarado livre de erro,
ele pode então ser copiado para a memória principal.
Cada controlador tem alguns poucos registradores que são usados para comunicação com a CPU. Em
alguns computadores estes registradores são parte do espaço de endereçamento regular. A tabela
mostra os endereços de E/S e os vetores de interrupção alocados para alguns dos controladores do
IBM PC. A atribuição de endereços de E/S para dispositivos é feita por um decodificador lógico
associado ao controlador. Alguns IBM PC-compatíveis usam diferentes endereços de E/S.
94
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
dispositivo
endereço E/S vetor int.
relógio
040 - 043
8
teclado
060 - 063
9
porta serial secundária 2F8 - 2FF
11
disco rígido
320 - 32F
13
impressora
378 - 37F
15
vídeo monocromático 380 - 3BF
vídeo colorido
3D0 - 3DF
disco flexível
3F0 - 3F7
14
porta serial primária 3F8 - 3FF
12
O sistema operacional realiza E/S escrevendo comandos nos registradores dos controladores. O
controlador de disquete do IBM PC, por exemplo, aceita 15 diferentes comandos, tais como read,
write, seek, format, e recalibrate. Muitos dos comandos têm parâmetros, os quais são também
carregados nos registradores do controlador. Quando um comando é aceito, a CPU pode abandonar o
controlador atender a outra tarefa. Quando completado, o controlador causa uma interrupção com o
objetivo de permitir que o sistema operacional tome o controle da CPU e teste o resultado da
operação. A CPU obtém o resultado e o status do dispositivo pela leitura de um ou mais bytes de
informação nos registradores do controlador.
Manipuladores de Interrupções
Interrupções são eventos complicados de se tratar. Elas devem ser isoladas de modo que apenas uma
pequena parte do sistema operacional as manipule. Um meio para isolá-las é bloquear os processos
aguardando operações de E/S até que uma interrupção anuncie que a operação se completou.
Quando a interrupção acontece, a rotina de tratamento daquela interrupção libera o processo
bloqueado. Em alguns sistemas isto é conseguido fazendo-se um UP sobre um semáforo. Em outros,
ele fará um SIGNAL sobre a variável de condição no monitor. E ainda em outros, uma mensagem é
enviada ao processo bloqueado. Em todos os casos o efeito da interrupção é que o processo que
estava previamente bloqueado deverá agora estar habilitado para execução.
95
Associação Profissionalizante
“Vereador Jandir Schincariol”
APVJS
BIBLIOGRAFIA
www.unicamp.br
www.ufrn.br
www.microsoft.com.br
www.babbo.com.br
www.boadica.com.br
www.lunixit.com.br
Davis, William S., Sistemas Operacionais - Uma Visão Sistemática, Ed. Campus, 1990.
Machado, Francis B. e Maia, Luiz P., Introdução à Arquitetura de Sistemas Operacionais, Ed. LTC,
1994.
Stallings, William, Operating Systems,Ed. Acmillan Publishing Company, 1992.
Silberschatz, Abraham e Galvin, Peter B., Operating Systems Concepts, Ed. Addison-Wesley
Publishing Company, 1994.
Tanenbaum, Andrew S., Sistemas Operacionais Modernos, Ed. Campus, 1995.
Tanenbaum, Andrew S., Organização Estruturada de Computadores, Ed. Prentice-Hall do Brasil,
1990. 
Tanenbaum, Andrew S., Sistemas Operacionais - Projeto e Implementação, Ed. Prentice-Hall do
Brasil,
1987. 

Machado, Francis B. e Maia, Luiz P., Introdução à Arquitetura de Sistemas Operacionais, Ed. LTC,
1994.


96
Download