Académique Documents
Professionnel Documents
Culture Documents
1 2
Faculdade de Engenharia Eltrica e de Computao UNICAMP Faculdade de Engenharia Eltrica e de Computao UNICAMP 3 Departamento de Informtica - UFU
Sumrio
1 INTRODUO 1.1 O que um Sistema Operacional ? . . . . . . . . 1.2 Histria dos Sistemas Operacionais . . . . . . . . 1.3 Conceitos Bsicos em Sistemas Operacionais . . 1.4 O Sistema Operacional UNIX . . . . . . . . . . 1.5 Uma Viso Geral do Sistema Operacional UNIX 1.6 Arquitetura do Sistema Operacional UNIX . . . . 3 3 4 6 8 9 16 23 23 28 30 33 35 40 49 49 51 59 62 64
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
2 PROCESSOS 2.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Escalonamento de Processos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Gerenciamento de Processos no Sistema Operacional UNIX . . . . . . . . . . . . . 2.4 Escalonamento de Processos no Unix . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 Controle de Processos no UNIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6 Comunicao e Sincronizao Inter-processos no UNIX . . . . . . . . . . . . . . . . 3 SISTEMA DE ARQUIVOS 3.1 Interface do Sistema de Arquivos . . . . . . . 3.2 Projeto do Sistema de Arquivos . . . . . . . . 3.3 Conabilidade do Sistema de Arquivos . . . . 3.4 Desempenho do Sistema de Arquivos . . . . 3.5 O Sistema de Arquivos do UNIX (System V)
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
4 GERENCIAMENTO DE MEMRIA 4.1 Gerenciamento de Memria Sem Permuta ou Paginao . 4.2 Swapping (Permuta) . . . . . . . . . . . . . . . . . . . 4.3 Memria Virtual . . . . . . . . . . . . . . . . . . . . . . 4.4 Algoritmos de Troca de Pgina . . . . . . . . . . . . . . 4.5 Gerenciamento de Memria no UNIX . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
75 . 75 . 80 . 85 . 90 . 94
5 ENTRADA/SADA 101 5.1 Princpios do Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 5.2 Princpios do Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
DCA-FEEC-UNICAMP
5.3 5.4 5.5
Discos RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 Discos Rotativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Entrada/Sada no UNIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 119 119 122 126 131
6 TPICOS ESPECIAIS 6.1 Padronizao em Sistemas Operacionais 6.2 Processos Leves (Threads) . . . . . . . 6.3 Arquitetura de Microprocessadores . . . 6.4 Intel 80386 . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
Captulo 1
INTRODUO
Programas computacionais (ou software) constituem o elo entre o aparato eletrnico (ou hardware) e o ser humano. Tal elo se faz necessrio dada a discrepncia entre o tipo de informao manipulada pelo homem e pela mquina. A mquina opera com cadeias de cdigos binrios enquanto o homem opera com estruturas mais abstratas como conjuntos, arquivos, algoritmos, etc. Programas computacionais podem ser grosseiramente divididos em dois tipos: programas do sistema, que manipulam a operao do computador; programas aplicativos, que resolvem problemas para o usurio. O mais importante dos programas do sistema o sistema operacional, que controla todos os recursos do computador e proporciona a base de sustentao para a execuo de programas aplicativos.
DCA-FEEC-UNICAMP
Nesta viso, a funo do sistema operacional apresentada ao usurio como uma mquina estendida ou mquina virtual que mais fcil de programar que o hardware que a suporta.
DCA-FEEC-UNICAMP
A maioria dos computadores de 2a gerao foram utilizados para clculos cientcos e de enge nharia. Estes sistemas eram largamente programados em FORTRAN e ASSEMBLY. Sistemas operacionais tpicos 1 eram o FMS (Fortran Monitor Systems) e o IBSYS (IBMs Operating Systems).
DCA-FEEC-UNICAMP
O aumento do potencial destas mquinas criou um vastssimo mercado de software a elas dirigido. Como requisito bsico, estes produtos (tanto aplicativos quanto o prprio sistema operacional) necessitavam ser amigveis, visando usurios sem conhecimento aprofundado de computadores e sem inteno de estudar muito para utiliz-los. Esta foi certamente a maior mudana em relao ao OS/360 que era to obscuro que diversos livros foram escritos sobre ele. Dois sistemas operacionais dominaram o mercado: MS-DOS para os computadores pessoais e UNIX para as estaes de trabalho. O prximo desenvolvimento no campo dos sistemas operacionais surgiu com a tecnologia de redes de computadores: os sistemas operacionais de rede e distribudos. Sistemas operacionais de rede diferem dos sistemas operacionais para um simples processador no tocante capacidade de manipular recursos distribudos pelos processadores da rede. Por exemplo, um arquivo pode ser acessado por um usurio num processador, mesmo que sicamente o arquivo se encontre em outro processador. Sistemas operacionais de rede provem ao usurio uma interface transparente de acesso a recursos compartilhados (aplicativos, arquivos, impressoras, etc), sejam estes recursos locais ou remotos. Sistemas operacionais distribudos so muito mais complexos. Estes sistemas permitem que os processadores cooperem em servios intrnsecos de sistemas operacionais tais como escalonamento de tarefas e paginao. Por exemplo, num sistema operacional distribudo uma tarefa pode migrar durante sua execuo de um computador sobrecarregado para outro que apresente carga mais leve. Contrrio aos sistemas operacionais de rede que so largamente disponveis comercialmente, sistemas operacionais distribudos tm sua utilizao ainda restrita.
Que no CPU.
DCA-FEEC-UNICAMP
Estas propriedades enfatizam a natureza sequencial de um processo. O processo sequencial denido pelo resultado de suas instrues, no pela velocidade com que as instrues so executadas.
1.3.3 Multiprogramao
Multiprogramao um conceito mais geral que multitarefa e denota um sistema operacional que prov gerenciamento da totalidade de recursos tais como CPU, memria, sistema de arquivos, em adio ao suporte da execuo concorrente dos processos. Em uma mquina podemos ter o conjunto de processos sendo executados de forma serial ou de forma concorrente, ou seja, os recursos presentes na mquina podem ser alocados a um nico programa at a concluso de sua execuo ou esses recursos podem ser alocados de modo dinmico entre um nmero de programas ativos de acordo com o nvel de prioridade ou o estgio de execuo de cada um dos programas. No caso de um computador no qual o sistema operacional usado permite apenas a monoprogramao, os programas sero executados instruo-a-instruo, at que seu processamento seja concludo. Durante a sua execuo, o programa passar por diversas fases, alterando momentos em que se encontra executando ou bloqueado aguardando, por exemplo, a concluso de uma operao de entrada/sada de dados (normalmente lenta, se comparada velocidade de execuo das instrues por parte do processador). Atravs do uso da multiprogramao possvel reduzir os perodos de inatividade da CPU e consequentemente aumentar a ecincia do uso do sistema como um todo. O termo multiprogramao denota um sistema operacional o qual em adio ao suporte de mltiplos processos concorrentes, permite que instrues e dados de dois ou mais processos disjuntos estejam residentes na memria principal simultaneamente. O nvel de multiprogramao presente em um sistema pode ser classicado como integral ou serial. A multiprogramao dita integral caso mais de um processo possa se encontrar em execuo em um dado instante, enquanto que no caso da serial apenas um processo se encontra em execuo a cada instante, sendo a CPU alocada aos processos de forma intercalada ao longo do tempo. Uma vez que a maioria dos computadores apresenta apenas uma unica CPU, a multiprogramao serial encontrada com mais frequncia.
DCA-FEEC-UNICAMP
1.3.4 Multiprocessamento
Embora a maioria dos computadores disponha de uma nica CPU que executa instrues uma a uma, certos projetos mais avanados incrementaram a velocidade efetiva de computao permitindo que vrias instrues fossem executadas ao mesmo tempo. Um computador com mltiplos processadores que compartilhem uma memria principal comum chamado um multiprocessador. O sistema que suporta tal congurao um sistema que suporta o multiprocessamento.
DCA-FEEC-UNICAMP
multiusurio/multiprogramado;
sh a.out
find
make
ld vi
Figura 1.1: Arquitetura do sistema operacional UNIX Programas interagem com o ncleo atravs da evocao de um conjunto bem denido de chamadas de sistema. Muitos destes programas so denominados comandos. O conjunto de chamadas do sistema e os algoritmos internos que implementam estas chamadas formam o corpo do ncleo. A organizao do ambiente UNIX pode ser vista na forma de camadas conforme mostrado na gura 1.1.
DCA-FEEC-UNICAMP
10
tratamento consistente dos dados de arquivo; facilidade na criao/eliminao de arquivos; crescimento dinmico de arquivos; proteo aos dados dos arquivos; tratamento dos dispositivos perifricos como arquivos de dados. O sistema de arquivo organizado na forma de rvore conforme pode ser visto no exemplo da gura 1.2.
/
usr
tmp
etc
pub
dev
bin
5bin
5include 5lib
emacs tex
X11
tty00
tty01
sh ed vi
Figura 1.2: Organizao hierrquica do sistema de arquivos Ainda com relao a esta gura temos: / > raiz; no-folhas > diretrios de arquivos; folhas > diretrios ou arquivos regulares ou arquivos especiais de dispositivos. A localizao de um arquivo na hierarquia pode ser na forma absoluta ou relativa. Na forma absoluta utiliza-se o caracter / no incio do endereo para indicar a raiz, enquanto no caso relativo inicia-se o caminho com o nome do arquivo que tem o diretrio atual como o ponto de partida do endereo. Os programas no ambiente UNIX no possuem nenhum conhecimento sobre o formato interno no qual o ncleo armazena os dados de arquivo. Os dados so fornecidos pelo UNIX como um stream (cadeia) de bytes, cabendo aos programas interpretarem o seu conteudo. Este tratamento estende-se tambm aos diretrios, ou seja, estes so vistos como arquivos regulares. O acesso aos arquivos controlado pelas permisses de acesso associadas a cada arquivo. No caso, temos os seguintes tipos de permisses: leitura, escrita e execuo, para os seguintes tipos de usurios: proprietrio do arquivo, grupo de usurios ou qualquer outro usurio. Uma caracterstica importante do UNIX o fato de que os programas acessam os dispositivos perifricos com a mesma sintaxe utilizada para o acesso aos arquivos regulares. Os dispositivos tambm so protegidos da mesma forma que os arquivos regulares.
DCA-FEEC-UNICAMP
11
O cdigo abaixo ilustra o programa copy que copia o contedo de um arquivo para outro. /* #include <stdio.h> #include <sys/fcntl.h> #include <sys/stat.h> char buffer[512]; void copy(old, new) int old, new; { int count; while((count = read(old, buffer, sizeof(buffer))) > 0) write(new, buffer, count); } */
main(argc, argv) int argc; char *argv[]; { int fdold, fdnew; if(argc != 3) { printf("Uso: copy f1 f2\n"); exit(1); } /* abre arquivo para leitura */ fdold = open(argv[1], O_RDONLY); if(fdold == -1) /* erro no open */ { printf("Impossivel abrir %s\n", argv[1]); exit(1); } /* cria arquivo novo */ fdnew = creat(argv[2], 0666); if(fdnew == -1) /* erro no creat */ { printf("Impossivel criar %s\n", argv[2]);
DCA-FEEC-UNICAMP
exit(1); } /* chama copy */ copy(fdold, fdnew); exit(0); } /*
12
*/
DCA-FEEC-UNICAMP
13
Uma das caractersticas marcantes do UNIX que este no suporta, no nvel do ncleo, muitas das funes que fazem parte dos ncleos de outros sistemas operacionais. No caso do UNIX, estas funes so, em geral, programas no nvel do usurio. O exemplo de programa mais destacado neste caso o programa shell que o responsvel pela intepretao dos comandos do usurio. Na maior parte das vezes o shell executa o comando fork e o processo lho executa o comando solicitado atravs da chamada exec. As palavras restantes na linha de comando so tratadas como parmetros do comando. O shell aceita trs tipos de comandos: arquivo executvel produzido por compilao; arquivo executvel contendo uma sequncia de linhas de comando do shell; comando interno do shell. O shell normalmente executa um comando sincronamente, ou seja, espera o trmino do processo associado ao comando antes da leitura de uma nova linha de comando. Tambm possvel a execuo assncrona do comando. Neste caso, o shell l e executa a prxima linha de comando sem esperar o trmino do processo associado ao comando anterior, o qual executa em background. Como o shell um programa que se situa no nvel do usurio, no fazendo parte do ncleo, fcil modic-lo para um ambiente particular.
DCA-FEEC-UNICAMP
14
Esta transferncia pode ser do processo completo (swapping), ou de segmentos do processo (paginao).
DCA-FEEC-UNICAMP
15
As excees podem ser caracterizadas como algo que ocorre no meio da execuo de uma instruo, onde o sistema tenta reiniciar a instruo aps tratar a exceo. No caso das interrupes, estas podem ser consideradas como se ocorressem entre a execuo de duas instrues, sendo que o sistema continua a executar a partir da prxima instruo aps tratar a interrupo. O UNIX utiliza um mesmo mecanismo para manipular as condies de interrupo e exceo. Nveis de Execuo do Processador O ncleo necessita muitas vezes impedir a ocorrncia de interrupes durante a execuo de atividades crticas. Exemplo: o ncleo no deve aceitar interrupo do disco enquanto estiver operando sobre listas ligadas, isto porque o tratamento da interrupo pode interferir na atualizao dos apontadores provocando inconsistncias. Normalmente, os computadores possuem instrues privilegiadas que permitem denir o nvel de execuo do processador. A atribuio do nvel de execuo do processador em um determinado valor mascara a interrupo daquele nvel e dos nveis inferiores (tornando habilitadas as de nveis superiores). Na gura 1.3, caso o ncleo mascare a interrupo do disco, todas as interrupes, exceto a do relgio e dos erros da mquina, so impedidas.
Erros de Hardware Prioridade Alta Relgio Disco Dispositivos de Rede Terminais Prioridade Baixa Interrupo de Software
Gerenciamento de Memria O ncleo reside permanentemente na memria principal, assim como, os processos em execuo (ou pelo menos parte deles). Quando da compilao, so gerados endereos no programa que representam variveis e instrues. O compilador gera estes endereos para uma mquina virtual como se nenhum outro programa fosse executar simultaneamente na mquina real. Quando da execuo do programa, o ncleo aloca espao na memria principal atravs do mapeamento do endereo virtual no endereo fsico da mquina. Este mapeamento depende das caractersticas do hardware da mquina.
DCA-FEEC-UNICAMP
16
subsistema de arquivos
comunicao interprocessos
escalonador
drivers de dispositivos
Figura 1.4: Arquitetura do ncleo do sistema operacional UNIX Os programas em linguagem de mquina podem evocar chamadas ao sistema diretamente, isto , sem o uso da biblioteca. Por sua vez, os programas em linguagem de alto nvel realizam as chamadas como se estivessem evocando funes ordinrias, cabendo biblioteca mapear estas chamadas de funes nas primitivas necessrias para acessar o sistema operacional. Outras bibliotecas permitem um uso mais sosticado das chamadas ao sistema (exemplo: biblioteca de E/S). A gura 1.4 divide as chamadas ao sistema em chamadas ao sub-sistema de arquivos e ao subsistema de controle dos processos. O sub-sistema de arquivos acessa os dados nos arquivos atravs
DCA-FEEC-UNICAMP
17
de um mecanismo de bufferizao que, atravs da interao com os drivers de dispositivos de E/S orientados a bloco, regula o uxo de dado entre o ncleo e os dispositivos de armazenamento secundrio. Os dispositivos de E/S orientados a bloco so dispositivos de armazenamento de acesso randmico. O sub-sistema de arquivo interage diretamente com dispositivos que no so do tipo bloco (terminais, por exemplo). Neste caso, no h a interveno do mecanismo de bufferizao. Os sub-sistemas de arquivo e de controle dos processos interagem quando do carregamento de um arquivo na memria para execuo. O mdulo de gerenciamento da memria controla a alocao de memria, ou seja, caso em um determinado instante o sistema no possua memria fsica suciente para todos os processos, o ncleo move-os entre a memria fsica e a memria secundria de modo a que todos os processos possuam as mesmas chances de execuo. Duas polticas so normalmente utilizadas: permuta (swapping) e paginao. O mdulo de escalonamento aloca a CPU aos processos, os quais executam at o instante em que liberam a CPU para aguardar um recurso, ou ento, so preemptados porque a execuo excedeu o quantum de tempo disponvel para o processo. Neste caso, o escalonador escolhe o processo pronto de maior prioridade. Ainda com relao aos processos, existem vrias formas de comunicao entre estes, variando desde a sinalizao assncrona de eventos at a transmisso sncrona de mensagens entre processos.
DCA-FEEC-UNICAMP
TDAU
18
Figura 1.5: Estruturas de dado do sistema de arquivos O ncleo retorna um descritor de arquivo quando das chamadas open e create, o qual corresponde a um ndice na TDAU. Quando da execuo de um write ou um read, o ncleo utiliza o descritor de arquivo para acessar a TDAU e atravs desta alcanar a TA e o inode do arquivo onde, atravs deste ltimo, o ncleo encontra o dado no arquivo. Esta arquitetura dos dados permite vrios nveis de acesso compartilhado ao arquivo. Uma instalao pode possuir vrias unidades fsicas de disco, cada uma delas contendo um ou mais sistemas de arquivo. O ncleo relaciona-se com os sistemas de arquivo de um ponto de vista lgico ao invs de tratar com discos. Cada dispositivo lgico identicado por um nmero do dispositivo lgico. A converso entre os endereos do dispositivo lgico (sistema de arquivo) e os endereos, no dispositivo fsico (disco) realizada pelo driver do disco. Um sistema de arquivos consiste de uma sequncia de blocos lgicos, cada um contendo qualquer mltiplo de 512 bytes. O tamanho de um bloco lgico homogneo dentro do sistema de arquivos podendo, entretanto, variar para diferentes sistemas de arquivo em uma dada congurao. Blocos maiores representam um aumento na taxa de transferncia dos dados entre a memria e o disco. Entretanto, blocos maiores demandam mais espao em memria para manipul-los. Um sistema de arquivos possui a seguinte estrutura (ver gura 1.6):
bloco de boot super bloco lista de inodes blocos de dados
Figura 1.6: Estrutura do sistema de arquivos bloco de boot : contm o cdigo do bootstrap que lido na mquina quando da partida do sistema operacional; super-bloco : descreve o estado de um sistema de arquivo; lista de inodes : tem o seu tamanho denido quando da congurao do sistema de arquivos. Um dos inodes corresponde raiz do S.A. atravs deste inode que a estrutura de diretrios do sistema acessada;
DCA-FEEC-UNICAMP
19
bloco de dados : contm arquivos e dados administrativos. Um bloco de dados s pode pertencer a um nico arquivo do sistema. Processos Um processo corresponde execuo de um programa e consiste de um conjunto de bytes que a CPU interpreta como instruo de mquina, dado e pilha. O processo executa uma sequncia de instrues que auto-contida e que no salta para um outro processo. Ele l e escreve seus dados nas suas reas de dado e pilha, mas no pode ler ou escrever nas reas de dado e pilha de outro processo. Os processos comunicam com outros processos e com o resto do sistema atravs de chamadas de sistema. Do ponto de vista prtico, um processo em UNIX uma entidade criada pela chamada fork. Exceto o primeiro, qualquer outro processo criado atravs da chamada fork. O processo que chamou o fork identicado como processo pai e o que acabou de ser criado identicado como processo lho. Todo processo tem um nico pai mas pode ter vrios lhos. O ncleo identica cada processo atravs de um nmero denominado process ID (PID). No caso do processo lho, ele recebe como retorno aps a execuo do fork o valor 0, enquanto o processo pai recebe um valor diferente de 0 que corresponde ao PID do lho. Atravs do teste do valor retornado pelo fork, um processo pode distinguir se ele o processo pai ou o processo lho e, em consequncia, tomar a ao correspondente. O processo 0 um processo especial criado quando da iniciao do sistema (boot). Aps criar o processo 1, conhecido como init, o processo 0 torna-se o processo swapper. O processo 1 ancestral de qualquer outro processo no sistema, possuindo uma relao especial com estes, relao esta que ser discutida nos captulos subsequentes. Um arquivo executvel gerado quando da compilao de um programa consiste das seguintes partes: um conjunto de cabealhos que descrevem os atributos dos arquivos; o texto do programa; representao em linguagem de mquina dos dados que possuem valor inicial e uma indicao de quanto espao o ncleo necessita alocar para os dados sem valor inicial, denominado bss; outras sees tais como informaes sobre a tabela de smbolos. O ncleo carrega um arquivo executvel, gerado pelo compilador, durante a execuo de uma chamada exec, consistindo o processo carregado de trs partes: texto, dado e pilha. As regies de texto e dado correspondem s sees do texto e dados iniciados e no-iniciados (bss). A pilha criada automaticamente e o seu tamanho ajustado dinamicamente pelo ncleo em tempo de execuo. Um quadro (frame) da pilha contm os parmetros para a funo chamada, suas variveis locais e os dados necessrios (apontador de pilha e contador de programa) para recuperar o quadro anterior na pilha. Como um processo no UNIX pode executar em 2 modos, ncleo ou usurio, utiliza-se uma pilha separada para cada modo. O lado esquerdo da gura 1.7 mostra a pilha do usurio para o programa copy quando da chamada de sistema write.
DCA-FEEC-UNICAMP
20
variveis locais end. do quadro 2 end. de retorno apos chamada do write parmetros do write (new, buffer, count) variveis locais (count) end. do quadro 1 end. de retorno aps chamada do copy parmetros do copy (old, new) variveis locais (fdold, fdnew) end. do quadro 0 end. de retorno aps chamada do main parmetros do main (argc, argv) Pilha do Usurio
processamento da chamada white Pilha do Ncleo quadro 0 interface das chamadas de sistema
Figura 1.7: Estado das pilhas para o programa copy Cada chamada de sistema possui uma entrada na biblioteca de chamadas de sistema, a qual codicada em assembler, contendo instrues especiais (traps) que, quando executadas, provocam uma interrupo resultando em um chaveamento no hardware para o modo ncleo passando a utilizar a pilha do ncleo. A construo da pilha do ncleo ocorre nos mesmos moldes da construo da pilha no modo usurio. Todo processo possui uma entrada na tabela de processos (TP) do ncleo e a cada um alocada uma rea U que contm dados privados manipulados somente pelo ncleo. A TP aponta para uma tabela de regies do processo (pregion), cujas entradas apontam para entradas na tabela de regio. Uma regio uma rea contgua de um espao de endereo do processo, tal como: texto, dado e pilha. As entradas na tabela de regio descrevem os atributos da regio, ou seja, se a regio contm texto ou dado, se uma regio compartilhada ou privada e se o contedo da regio encontra-se em memria. O nvel extra de encadeamento, ou seja, da pregion para a tabela de regio, permite que processos independentes compartilhem regies de memria. Quando um processo evoca a chamada exec o ncleo aloca regies para o texto, dado e pilha do processo que est sendo criado, aps liberar as regies antigas do processo que estava executando.
DCA-FEEC-UNICAMP
21
Quando um processo evoca fork o ncleo duplica o espao de endereo do processo antigo permitindo, quando possvel, que processos compartilhem regies ou, caso contrrio, fazendo uma cpia da regio. Quando um processo evoca exit o ncleo libera as regies que o processo estava usando. A gura 1.8 ilustra as estruturas de dados associadas ao controle dos processos.
pregion rea U Tabela de Regies
Figura 1.8: Estruturas de dados associadas ao controle dos processos A entrada na tabela de processos e a rea U contm informaes de controle e status sobre o processo. A rea U pode ser vista como uma extenso da entrada do processo na tabela de processos. Campos importantes da tabela de processos: campo de estado; identicadores dos usurios que possuem o processo; um conjunto descritor de evento quando o processo est bloqueado. A rea U contm informaes que descrevem o processo e que so acessadas somente durante a execuo do processo. Os campos mais importantes so: apontador para o campo na TP do processo em execuo; descritores de arquivo para todos os arquivos abertos; parmetros internos de E/S; limites de tamanho do processo e arquivo. Contexto de um Processo O contexto de um processo o estado denido pelo seu texto correspondendo aos valores das suas variveis globais e estruturas de dado, os valores dos registros de mquina usados, os valores armazenados no seu slot na tabela de processos e na rea U e o contedo das suas pilhas de usurio e ncleo. Quando o ncleo decide executar um novo processo realiza-se uma mudana de contexto. Quando da realizao de uma mudana de contexto o ncleo salva informaes sucientes de modo a que posteriormente ele possa recuperar o contexto do processo anterior e continuar a sua
DCA-FEEC-UNICAMP
22
execuo. Da mesma forma, quando da mudana do modo usurio para o modo ncleo, o ncleo salva as informaes necessrias para que o processo possa retornar ao modo usurio e continuar a execuo. Neste ltimo caso, temos uma mudana de modo e no de um chaveamento de contexto. Estados do Processo A vida de um processo pode ser representada por um conjunto de estados (gura 1.9): executando no modo usurio; executando no modo ncleo; pronto; bloqueado (dormindo).
retorno
interrupo/retorno 2
Bloqueado
Figura 1.9: Estados de um processo O ncleo protege a sua consistncia permitindo chaveamento de contexto apenas quando o processo transita do estado executando no modo ncleo para o modo bloqueado. O ncleo tambm eleva o nvel de execuo do processador quando da execuo de regies crticas de modo a impedir interrupes que possam provocar inconsistncias em suas estruturas de dados. O escalonador de processo realiza, periodicamente, a preempo de processos executando no modo usurio de forma a que os processos no monopolizem a CPU.
Captulo 2
PROCESSOS
2.1 Introduo
No captulo anterior denimos o conceito de processo, bem como algumas generalidades sobre como o sistema operacional UNIX gerencia processos. Neste captulo, avanaremos no estudo de processos, analisando problemas de concorrncia, escalonamento e comunicao inter-processos.
23
DCA-FEEC-UNICAMP
24
2.1.2 Concorrncia
Em muitos sistemas operacionais, processos frequentemente compartilham outros recursos alm da CPU. Por exemplo, durante uma chamada de sistema um processo pode ter acesso a uma tabela mantida pelo ncleo. Neste caso, o ncleo deve inibir a comutao da CPU para outro processo, at que todas as operaes na tabela forem efetuadas. Caso contrrio, a tabela fatalmente assumiria um estado inconsistente onde apenas algumas alteraes foram processadas. Em situaes como a exemplicada acima, a tabela denida como um recurso compartilhado, e a parte do cdigo que o manipula como uma regio crtica. A execuo de uma regio crtica deve ser um procedimento controlado a m de evitar que os recursos compartilhados atinjam estados inconsistentes.
DCA-FEEC-UNICAMP
25
Para permitir que regies crticas que acessam recursos compartilhados distintos possam ser executadas ao mesmo tempo, cada recurso compartilhado possui um identicador (via de regra um nmero inteiro). Assim sendo, as duas funes que compem o algoritmo de garantia de mtua excluso possuem este identicador como parmetro.
Uma para cada recurso compartilhado. Este algoritmo facilmente generalizado para
N processos, N > 2.
DCA-FEEC-UNICAMP
Soluo de Peterson
26
Obtida pela combinao das idias de variveis LOCK e TURN, criando-se tambm uma soluo por software para o problema. Esta soluo evita os problemas individuais das solues anteriores, mas pouco utilizada na prtica por utilizar espera ocupada. Instruo TSL Esta proposta requer uma pequena ajuda do hardware. Ela utiliza a instruo TSL (Test and Set Lock) presente em muitos processadores. Esta instruo permite a implementao de variveis LOCK cujo teste e atualizao so atmicos (em outas palavras, a instruo TSL indivisvel mesmo frente a interrupes de hardware).
DCA-FEEC-UNICAMP
27
Note que os contadores de eventos nunca decrescem e partem sempre de 0. Contadores de evento so mais convenientes que semforos para problemas to tipo produtor-consumidor com buffer limitado. Monitores Semforos e contadores de evento tornam simples a proteo de recursos compartilhados. Entretanto, uma simples troca na ordem da chamada das primitivas pode gerar uma situao de deadlock. Em suma, a utilizao de semforos e contadores de eventos deve se processar com extrema cautela. Monitores so uma proposta de mecanismo de sincronizao de alto nvel. Um monitor uma coleo de procedimentos, variveis e estruturas de dados agrupados em um bloco. Os processos podem acessar os procedimentos do monitor mas no suas estruturas internas. Monitores tm uma caracterstica importante: somente um processo pode estar ativo5 no monitor em um dado instante (garantindo portanto a mtua excluso). Monitores constituem-se em um conceito de linguagem de programao, ou seja, o compilador reconhece que os monitores so especiais e pode manusear as chamadas do monitor diferentemente de outras chamadas. Esta uma das desvantagens de monitores: precisam de linguagens de programao que os incorpore. A concluso que monitores, apesar de elegantes na manuteno de mtua excluso, de aplicao restrita, pois raras so as linguagens de programao que os incorporam.
DCA-FEEC-UNICAMP
Compartilhamento de Dados
28
Processos podem se comunicar atravs 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 mtua excluso (tipicamente semforos) ou tornando as instrues de leitura e gravao atmicas. Duas primitivas so necessrias: STORE(posio, dado) : grava dados numa certa posio; FETCH(posio, dado) : acessa dados de uma certa posio. 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 dispe de um conjunto de servios que um processo cliente evoca como se evocasse um procedimento local. O cliente indica o servio desejado ao servidor, passando parmetros para sua execuo, se for o caso. Recebida a requisio, esta processada pelo servidor 6 que retorna os resultados ao cliente. O envio e recepo de parmetros e retornos se d por troca de mensagens. Uma biblioteca de RPC possui duas primitivas bsicas: REGISTER_RPC(servio) : utilizada por servidores para anunciar que servios esto aptos a processar; CALL_RPC(servio, parmetros, resultados) : utilizada por clientes para evocar servios.
DCA-FEEC-UNICAMP
29
importante observar que alguns desses objetivos so contraditrios. Se um algoritmo favorece o escalonamento de processos interativos certamento estar comprometendo os no interativos. Vejamos agora alguns algoritmos de escalonamento.
DCA-FEEC-UNICAMP
Escalonamento em Dois Nveis
30
At agora foi considerado que todos os processos residem em memria primria. Entretanto se esta memria for insuciente, processos ativos podem ser armazenados temporariamente em memria secundria (tipicamente disco). O meio mais prtico para controlar a comutao de processos denir dois nveis de escalonamento. Um escalonador de baixo nvel se restringe a troca de processos que esto na memria primria no momento. Um escalonador de alto nvel decide sobre a troca dos processos entre as memrias primria e secundria.
DCA-FEEC-UNICAMP
31
retorno
"Preemptado"
Terminado
escalonado aguardando evento Bloqueado em Memria 3 evento Pronto em Memria memria abundante
"swap out"
"swap out"
"swap in"
fork
Figura 2.1: Diagrama completo de transio de estados para processos completada para este processo, retornando 0. A partir da, o processo entra em execuo no modo usurio, processando suas instrues uma a uma. Expirado seu quantum de CPU, uma interrupo de relgio faz com que o processo retorne ao modo ncleo novamente. Terminado o tratamento da interrupo, o escalonador pode decidir alocar a CPU a um outro processo, movendo este para o estado 7. Este estado equivalente ao estado 3 como mostra a linha pontilhada na gura 2.1. Esta distino feita para enfatizar que um processo tem a CPU tomada somente quando est apto a retornar para o modo usurio, diferente do estado 3 onde deve voltar ao modo ncleo para completar uma chamada de sistema. A eventual execuo de uma chamada de sistema faz com que o processo abandone o modo usurio (estado 1) e continue sua execuco no modo ncleo (estado 2). Suponha que o processo requeira uma operao de E/S do disco. O ncleo coloca o processo no estado 4 (dormindo em memria) at que o processo seja noticado que a operao de E/S se completou (mais precisamente, quando a operao se completa, o hardware interrompe a CPU, cujo tratamento da interrupo resulta no acordar do processo). Se ao ser desbloqueado o processo ainda estiver residindo em memria primria, o mesmo posto no estado 3, aguardando CPU.
DCA-FEEC-UNICAMP
32
Entretanto, se durante sua permanncia no estado 4 o ncleo necessitar de espao na memria primria, o processo sofre swapping, sendo removido da memria primria e armazenado em memria secundria (tipicamente disco). Neste caso, o processo atinge o estado 6 (dormindo em memria secundria). Uma vez completada a operao de E/S com o processo no estado 6, este transita para o estado 5 (pronto em memria secundria). Quando o swapper escolhe o processo para aloc-lo novamente em memria primria, este volta para o estado 3. No estado 3, quando o escalonador volta a atribuir a CPU ao processo, o mesmo atinge o estado 2 onde completa a chamada de sistema e volta ao estado 1, executando no modo usurio. Quando um exit executado pelo processo, o mesmo transita, via estado 2, para seu estado terminal (9), permanecendo neste estado at que o processo pai seja noticado. Algumas observaes sobre o diagrama de transio de estados apresentado na gura 2.1: uma vez criado, as transies de estado de um processo dependem exclusivamente do sistema operacional; um processo pode forar a entrada no modo ncleo atravs da execuo de uma chamada de sistema, mas a sada deste estado foge ao seu controle; um processo pode atingir o estado 9 sem explicitamente evocar um exit: traps aritmticos como diviso por zero e overows, ou de segmentao como referncia a posies invlidas de memria, podem forar compulsoriamente o trmino do processo.
DCA-FEEC-UNICAMP
33
um ponteiro de volta ao respectivo ndice na tabela de processos; privilgios que o processo dispe, de acordo com o seu UID; tempos de execuo nos modos usurio e ncleo; ponteiros para os gerenciadores de sinais denidos pelo processo; o terminal de login associado ao processo, caso exista; um campo de erro, armazenando os erros gerados por chamadas de sistema; parmetros de I/O, tais como endereo de dados a serem transferidos, tamanho destes dados, destino, etc; o diretrio corrente e o diretrio raiz; descritores de arquivos abertos pelo processo; limites (tamanho mximo de pilha, arquivos, etc); permisses (modos de acesso atribuidos durante a criao de arquivos).
DCA-FEEC-UNICAMP
prioridades em modo ncleo
34
Nveis de Prioridade swapper no passvel de interrupo aguardando E/S em disco aguardando buffer aguardando inode aguardando entrada de terminal passvel de interrupo limiar de prioridade em modo ncleo nvel de usurio 0 nvel de usurio 1 aguardando sada em terminal
processos
Escalonamento por Prioridades aguardando trmino do proc. filho Escalonamento Round Robin
Figura 2.2: Classes de prioridades para ns de escalonamento de processos O algoritmo de escalonamento do UNIX processado segundo o seguinte esquema. Quando ocorre uma interrupo do hardware: caso a interrupo acorde um ou mais processos com prioridade de modo ncleo, aloque a CPU quele de mais alta prioridade; caso contrrio, se uma mudana de contexto se zer necessria, aloque a CPU ao processo de mais alta prioridade dentre as de modo usurio. Em existindo mais de um processo apto a executar no mesmo nvel, a seleo se d segundo a poltica Round Robin. Pode-se observar que o escalonamento de processos no UNIX se d em duas direes: por prioridades na vertical, e por Round Robin na horizontal (para processos de mesma prioridade). Outras caractersticas importantes do algoritmo de escalonamento do UNIX: 1. As prioridades no modo ncleo dependem apenas do evento aguardado pelo processo. 2. Processos transitando do modo ncleo para o modo usurio, tem seu nvel de prioridade rebaixado em relao sua posio inicial. Esta penalidade, por utilizar recursos do ncleo,
DCA-FEEC-UNICAMP
35
visa evitar o monoplio da CPU pelos processos que utilizam chamadas de sistema de forma frequente. 3. A cada intervalo de tempo (tipicamente um segundo), as prioridades em modo usurio so recomputadas. Processos que se utilizaram recentemente da CPU so penalizados em benefcio dos processos que no a utilizaram.
*/
DCA-FEEC-UNICAMP
36
dados do pai
pilha do pai
pilha do ncleo
texto (compartilhado) processo filho rea U pregion arquivos abertos dados do filho diretrio corrente diretrio raiz Tabela de Inodes
pilha do filho
pilha do ncleo
Figura 2.3: A execuo de uma chamada de sistema fork. fd2 = open("arq2", O_RDONLY, 0); sprintf(arg1, "%d", fd1); sprintf(arg2, "%d", fd2); pid = fork(); if(pid == 0) { /* processo filho */ execlv("prog2", arg1, arg2, NULL); /* se passar por aqui, execv falhou */ printf("execlv falhou !"); exit(0); } /* processo pai continua */
DCA-FEEC-UNICAMP
... /*
37
*/
No exemplo acima, o programa executa um fork, deixando a cargo do lho a execuo do novo processo. Os descritores de arquivo fd1 e fd2 so passados como argumento para o novo programa. Capturando estes argumentos, o novo programa capaz de executar operaes nos respectivos arquivos sem reabr-los. /* /* prog1 */ main(argc, argv) int argc; char *argv[]; { int fd1, fd2; /* acessa descritores abertos pelo executor do exec */ sscanf(argv[1], "%d", &fd1); sscanf(argv[2], "%d", &fd2); ... } /* */ */
"C );
DCA-FEEC-UNICAMP
sinal SIGHUP SIGINT SIGILL SIGFPE SIGKILL SIGSEGV SIGSYS SIGALRM SIGSTOP SIGCONT SIGCHLD
38
Tabela 2.1: Exemplos de sinais no UNIX System V Sinais so explicitamente enviados a processos atravs da chamada de sistema kill. kill tem como parmetros o PID do processo ao qual o sinal se destina; e o tipo de sinal. Existem em torno de 30 tipos de sinais no UNIX System V, sendo os mais importantes mostrados na tabela 2.1. Processos podem apresentar as seguintes reaes a sinais: o processo compulsoriamente terminado; o processo bloqueado at a ocorrncia de um sinal de desbloqueio; o processo ignora o sinal; o processo captura o sinal. Sinais so armazenados na tabela de processos mantida pelo ncleo, sendo a ao correspondente ao sinal tomada quando o processo passa da execuo de modo ncleo para modo usurio. Para cada sinal denido um comportamento default para o proceso que o recebe. Em geral, este comportamente simplesmente o trmino do processo. Um processo pode alterar o comportamento default frente a ocorrncia de um dado sinal atravs da chamada de sistema signal. signal possui dois parmetros: o nmero do sinal (denido em signal.h); e a ao a ser executada quando do recebimento deste sinal. A ao pode possuir trs valores: 0 : o processo terminado quando receber o sinal; 1 : o sinal ignorado; endereo vlido de funo : A funo chamada assincronamente quando da ocorrncia do sinal. Esta funo dita gerenciador do sinal para o processo. Exemplo: capturar interrupes de teclado. Quando o usurio executa um "C , um sinal do tipo SIGINT enviado ao processo que est executando em foreground. O comportamento default para este sinal o trmino do processo. Suponha um programador precavido que deseje a conrmao
DCA-FEEC-UNICAMP
39
que o "C no foi acidental. O cdigo abaixo ilustra esta situao: /* /* gerenciador para SIGINT */ int ger() { int c; printf("Tem certeza que quer abortar [s/n] ? "); c = getchar(); if(c == s) exit(0); } */
Todas as vezes que um SIGINT for enviado ao processo, a funo ger chamada assincronamente, solicitando conrmao do trmino da execuo. Caso o usurio responda n, a funo retorna e o programa continua normalmente. A maneira como o ncleo processa sinais descrita sucintamente a seguir. Quando um sinal enviado a um processo (pelo ncleo ou por outro processo), o ncleo simplesmente ativa o campo correspondente ao sinal na tabela de processos. Neste campo est localizado tambm o gerenciador do sinal (denido pelo processo ou default). No momento que um processo passa do modo ncleo para o modo usurio, o ncleo verica se existe sinais enviados ao processo e ainda no tratados. Caso exista, o ncleo executa os seguintes passos: 1. Salva o contador de programa e o stack pointer do processo. 2. Caso o processo no dena um gerenciador para o sinal, executa a ao default. Caso contrrio, prossiga. 3. Associa temporariamente a ao default para o sinal. 4. Cria um novo quadro na pilha como se o processo estivesse evocando o gerenciador neste momento. 5. Direciona o contador de programa para o endereo da rotina gerenciadora do sinal e atualiza o stack pointer para levar em conta o aumento da pilha causado pela chamada do gerenciador.
DCA-FEEC-UNICAMP
40
O passo 3 merece um comentrio adicional. Ele existe para evitar que uma rajada de sinais ocasione um stack overow pelo empilhamento de mltiplas chamadas do gerenciador (caso o intervalo de ocorrncia dos sinais seja menor que o tempo de execuo do gerenciador). Entretanto, durante a execuo da rotina gerenciadora, o processo ca numa condio vulnervel, pois a ao default que ser executada face a ocorrncia de um novo sinal de mesmo tipo.
2.6.1 Pipes
O mecanismo original de comunicao inter-processos so os chamados pipes. Em geral, pipes so empregados para estabelecer comunicao entre processos pai e lho. Um pipe um canal unidirecional de comunicao, isto , a informao ui numa nica direo. Para estabelecer-se comunicao bidirecional, so necessrios dois pipes. Pipes podem ser vistos como um buffer conectando dois processos. Um processo escreve dados num dos lados do buffer, enquanto o outro l estes dados no lado oposto. Esta forma de comunicao pode ser obtida com o emprego de arquivos em disco. A diferena bsica que pipes so bloqueantes, isto , a gravao em um pipe cheio ou a leitura em um pipe vazio causa o bloqueio do processo. Pipes so implementados pelo ncleo como um sistema de arquivos. Cada pipe tem um inode associado, sendo que o ncleo aloca blocos de dados medida que dados vo sendo escritos no pipe (desalocando-os medida que so lidos). Pipes so criados com a chamada de sistema pipe. A chamada retorna dois descritores de arquivos, sendo o primeiro para leitura e o segundo para gravao. Esta chamada, em geral, se processa antes de ocorrer um fork. Se a comunicao for no sentido pai ! lho, o processo pai fecha o primeiro descritor (com a chamada close), e o lho o segundo. A partir da, o pai executa chamadas write no segundo descritor e o lho read no primeiro. Um segundo pipe pode ser empregado para a comunicao no sentido inverso, atentando-se para o fechamento correto dos descritores que no sero empregados pelo processo. Aps o nal da sesso de comunicao, os lados abertos do pipe tambm so fechados a m de liberar os recursos a ele associados pelo ncleo. Exemplo: enviar um string do processo pai para o processo lho. /* main{} { int fd[2]; char buff[32]; */
DCA-FEEC-UNICAMP
41
if(pipe(fd) == -1) {perror("pipe"); exit(0);} if(fork() != 0) { /* PAI */ close(fd[0]); strcpy(buff, "oi filho !"); write(fd[1], buff, strlen(buff) + 1); close(fd[1]); exit(0); } else { /* FILHO */ close(fd[1]); read(fd[0], buff, 32); printf("%s", buff); close(fd[0]); exit(0); } /* */
2.6.2 Mensagens
Troca de mensagens um mecanismo de comunicao mais exvel que pipes. Enquanto um pipe um canal sncrono e unidirecional, mensagens so canais tanto sncronos quanto assncronos e bidirecionais. Para o envio e recepo de mensagens, cria-se um port de comunio. Ports so identicados por um nmero inteiro. A chamada de sistema msgget cria um port, retornando seu identicador local. O primeiro parmetro uma chave atribuida ao port, seu identicador global. O segundo parmetro so opes relativas a criao, acesso, etc. Via de regra, msgget retorna um port dado seu identicador global, criando-o caso tal port inexista. O ncleo mantm uma tabela de ports, e mensagens enviadas a ports so enleiradas, sendo recebidas na ordem que foram enviadas. A comunicao bidirecional, posto que, de posse de um identicador local de port, um processo pode tanto enviar quanto receber mensagens neste port. Mensagens so enviadas com a chamada de sistema msgsnd. A chamada possui quatro parmetros: o identicador do port para o qual a mensagem deve ser enviada; a estrutura que contm a mensagem; seu tamanho em bytes; e a opo de envio assncrono (retornando um cdigo de erro caso no exista espao para o ncleo armazenar a mensagem no port). A opo default o envio sncrono, onde o processo bloqueia ante a impossibilidade de armazenamento da mensagem no port. Estruturas contendo mensagens devem ser denidas como structs contendo dois campos: um inteiro (tipo da mensagem); e uma cadeia de bytes (o contedo da mensagem). Exemplo: struct mensagem { int tipo; /* tipo da mensagem */
DCA-FEEC-UNICAMP
char conteudo[1024]; };
42
A recepo de mensagens se d atravs da chamada de sistema msgrcv. Cinco parmetros so necessrios: o identicador local do port; a estrutura onde a mensagem ser copiada; o tamanho mximo em bytes alocados pela estrutura; o tipo de mensagem desejada; e opo de recebimento assncrono (retornando um cdigo de erro caso o port no contenha mensagem do tipo especicado). Uma quarta chamada de sistema, msgctl, empregada para obter e alterar o status de ports. Possui trs parmetros: o identicador local do port; o tipo de operao e o endereo da estrutura com as informaes de entrada ou retorno, de acordo com a ao explicitada no segundo parmetro.
DCA-FEEC-UNICAMP
Tabela de Memria Compartilhada
43
Tabela de Regies
pregion (processo 1)
Tabela de Processos
processo 1
processo 2
Figura 2.4: Esquema de memria compartilhada #include <sys/ipc.h> #include <sys/sem.h> #define KEY 67 extern char *shmat(); main() { char *buff; char *poema[16]; int i; int sh; /* cria area compartilhada */ sh = shmget(KEY, 1024, 0777 | IPC_CREAT);
DCA-FEEC-UNICAMP
44
/* assoacia area compartilhada a um endereco local */ buff = shmat(sh, 0, 0); poema[0] poema[1] poema[2] poema[3] poema[4] poema[5] poema[6] poema[7] = = = = = = = = "As armas e os baroes assinalados"; "Que da ocidental praia Lusitana"; "Por mares nunca dantes navegados"; "Passaram ainda alem de Tapobrana"; "E, em perigos e guerras esforcados"; "Mais do que prometia a forca humana"; "Por gente remota edificaram"; "Novo reino, que tanto sublimaram";
/* armazena o texto na area compartilhada */ for(i = 0; i < 8; i++) strcpy((buff + i * 100), poema[i]); } Agora, de um outro processo, podemos acessar o texto e imprim-lo.
main() { char *buff; char *poema[16]; int i; int sh; /* acessa area compartilhada */ sh = shmget(KEY, 1024, 0777); if(sh < 0) { printf("\nArea compartilhada nao criada\n"); exit(0);
DCA-FEEC-UNICAMP
}
45
/* assoacia area compartilhada a um endereco local */ buff = shmat(sh, 0, 0); /* acessa texto da area compartilhada */ for(i = 0; i < 8; i++) poema[i] = (buff + i * 100); for(i = 0; i < 8; i++) printf("\n\n"); } /* printf("\n%s", poema[i]);
*/
2.6.4 Semforos
Semforo um mecanismo de sincronizao inter-processos composto das operaes DOWN e UP. Via de regra, dene-se um semforo para cada recurso compartilhado. O execuo da parte cdigo que acessa tais regursos (regio crtica) abraada pelas operaes DOWN e UP. Processos denem/acessam semforos com a chamada de sistema semget. Esta chamada requer trs parmetros: um identicador global para um array de semforos; o nmero de semforos contido no array; e um ag estipulando aes relativas a permisses e criao. Operaes em semforos se processam atravs da chamada de sistema semop. Esta chamada requer trs parmetros: o identicador local do semforo (obtido via semget); um array de estruturas sembuf; e o nmero de estruturas no array. Cada estrutura efetua uma operao no semforo de ndice estipulado na estrutura. struct sembuf { short sem_num; short sem_op; short sem_flag; };
O segundo campo da estrutura sembuf opera no respectivo semforo de acordo com a seguinte lgica. Se sem_op for: negativo : Se a soma de sem_op com o valor do semforo for no negativa, some sem_op ao valor do semforo e retorne. Se for negativa, bloqueie. positivo : Some sem_op ao valor do semforo e retorne. nulo : Retorne se o valor do semforo for nulo; bloqueie, caso contrrio.
DCA-FEEC-UNICAMP
46
fcil notar que fazendo sem_op ;1 ou +1 implementa-se, respectivamente, as operaes bsicas DOWN e UP. Similar a msgctl e shmctl, a chamada de sistema semctl empregada para obter e alterar o status de semforos (permisses, desativao, etc). O cdigo abaixo ilustra o uso de semforo para acesso a uma regio crtica (no caso, o vdeo). /* #include #include #include #include <stdio.h> <sys/types.h> <sys/ipc.h> <sys/sem.h> */
/* cria um semaforo */ int DefSem(key) key_t key; { int semid; union semun arg; semid = semget(key, 1, 0777 | IPC_CREAT); arg.val = 1; semctl(semid, 0, SETVAL, arg); return(semid); }
/* acessa um semaforo ja criado */ int GetSem(key) key_t key; { int semid; semid = semget(key, 1, 0777); return(semid); }
/* define operacao DOWN */ void DOWN(semid) int semid; { struct sembuf psem[2];
DCA-FEEC-UNICAMP
47
/* define operacao UP */ void UP(semid) int semid; { struct sembuf vsem[2]; vsem[0].sem_num = 0; vsem[0].sem_op = 1; vsem[0].sem_flg = SEM_UNDO; semop(semid, vsem, 1); }
semid = GetSem(13); if(semid < 0) { printf("\nSemaforo nao criado !\n"); exit(0); } poema[0] poema[1] poema[2] poema[3] = = = = "As armas e os baroes assinalados"; "Que da ocidental praia Lusitana"; "Por mares nunca dantes navegados"; "Passaram ainda alem de Tapobrana";
DCA-FEEC-UNICAMP
poema[4] poema[5] poema[6] poema[7] = = = =
48
"E, em perigos e guerras esforcados"; "Mais do que prometia a forca humana"; "Por gente remota edificaram"; "Novo reino, que tanto sublimaram";
while(1) { DOWN(semid); /* entrada na Regiao Critica */ for(i = 0; i < 8; i++) { printf("\n%s", poema[i]); sleep(1); } printf("\n\n"); UP(semid); /* saida da Regiao Critica */ } } /* */
Captulo 3
SISTEMA DE ARQUIVOS
A parte mais visvel 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. Usurios utilizam interativamente o sistema de arquivos (via shell) para listar, alterar propriedades e remover arquivos. A convenincia e facilidade de uso de um sistema operacional fortemente determinada pela interface, estrutura e conabilidade de seu sistema de arquivos.
49
DCA-FEEC-UNICAMP
50
de entrada e sada no drive B, cada um deles dever ser especicado juntamente com o nome do aquivo: A:programa < B:entrada > B:saida A maior parte dos sistemas operacionais suportam vrios tipos de arquivos. O UNIX, por exemplo, mantm arquivos regulares, diretrios e arquivos especiais. Arquivos regulares contm dados e programas do usurio. Diretrios permitem identicar arquivos atravs de nomes simblicos (i.e. sequncia de caracteres ASCII). Arquivos especiais so usados para especicar perifricos tais como terminais, impressoras, unidades de ta, 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 so subdivididos em diferentes tipos em funo de sua utilizao. Os tipos so identicados 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 executvel ARQUIVO.LIB - Biblioteca dos arquivos .OBJ usados pelo linker ARQUIVO.TXT - Texto de entrada para formatao de programa ARQUIVO.DAT - Arquivos de dados Em certos sistemas, as extenses so simples conveno: o sistema operacional no faz uso delas. Em outros, o sistema operacional tem regras rgidas em relao aos nomes. Por exemplo, o sistema no executar um arquivo a menos que sua extenso seja .BIN.
3.1.2 Diretrios
Para organizar os arquivos, o sistema de arquivos prov diretrios, os quais em muitos casos so tambm arquivos. Um diretrio contm tipicamente um nmero de registros, um por arquivo. Sistemas primitivos admitiam um nico diretrio compartilhado por todos os usurios, ou um nico diretrio por usurio. Os sistemas operacionais modernos permitem um nmero arbitrrio de diretrios por usurio (via de regra, formando uma hierarquia). A gura 3.1 ilustra estas trs situaes. Quando o sistema de arquivos organizado como uma rvore de diretrios, algum meio se faz necessrio para especicar nomes de arquivos. Dois mtodos so comumente empregados. No primeiro mtodo, cada arquivo identicado pela sequncia de diretrios desde o diretrio raiz at o arquivo (caminho absoluto). Como um exemplo, o caminho /usr/mfm/mailbox signica que o diretrio raiz (/) contm o subdiretrio usr, o qual contm o subdiretrio mfm, que por sua vez contm o arquivo mailbox. Nomes absolutos para caminhos sempre comeam na raiz e so nicos.
DCA-FEEC-UNICAMP
51
Uma outra forma de especicar nomes de arquivos atravs de seu caminho relativo. usado em conjunto com o conceito de diretrio de trabalho (ou diretrio corrente). Um usurio pode designar um diretrio como diretrio corrente. Neste caso, todos os caminhos so referenciados a partir do diretrio corrente. Se o diretrio corrente for /usr/mfm, ento o arquivo cujo caminho absoluto /usr/mfm/mailbox pode ser referenciado simplesmente como mailbox.
diretrio raiz
A (a)
arquivo
diretrio raiz
diretrio de usurio
(b)
diretrio raiz
diretrio de usurio
subdiretrio
(c)
Figura 3.1: Trs projetos de sistemas de arquivos: (a) diretrio nico compartilhado pelos usurios; (b) um diretrio por usurio; (c) rvore arbitrria por usurio
DCA-FEEC-UNICAMP
52
como os diretrios so organizados, etc. Projetistas esto interessados em como o espao de disco gerenciado, como os arquivos so armazenados, e como manipular arquivos de forma ecientemente e convel.
DCA-FEEC-UNICAMP
42 136 45 127 65 254 321 342 123 415 239 124 432 58 490 643 486 12 43 481
53
410 312
597 873
Figura 3.2: (a) blocos livre armazenados em lista ligada; (b) um mapa de bits.
DCA-FEEC-UNICAMP
FAT x x EOF 13 2 9 8 FREE 4 12 3 FREE EOF EOF EOF BAD 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 } tamanho do disco
54
12
10
13
Figura 3.3: Esquema de lista encadeada usado pelo MS-DOS. Os registros 0 e 1 so usadas para especicao do tipo do disco. Os cdigos EOF e FREE so usados para End Of File e registros Free, respectivamente. misturados aleatoriamente na mesma tabela. Isso signica que toda a FAT deve estar presente em memria, mesmo se somente um arquivo estiver aberto. Um mtodo mais ecaz, seria manter listas dos blocos para diferentes arquivos em lugares diferentes. Isto o que o UNIX faz. Associado a cada arquivo no UNIX, tem-se uma pequena tabela (no disco), chamada inode, como mostrado na gura 3.4. Ela contm informaes sobre o arquivo tais como tamanho e proteo. Os itens chaves so os 10 nmeros de blocos do disco e os 3 nmeros de blocos indiretos. Para arquivos com 10 blocos ou menos, todos os endereos dos blocos de dados no disco so mantidos no prprio inode, sendo sua localizao imediata. Quando o tamanho de um arquivo supera 10 blocos, um bloco livre adquirido e o ponteiro indireto simples passa a apontar para ele. Este bloco usado para armazenar os ponteiros dos blocos de disco. Com um bloco de disco de 1K e endereos de disco de 32 bits, o bloco indireto simples pode acessar 256 endereos de disco. Esse esquema suciente para arquivos de at 266 blocos (10 no inode, 256 no bloco indireto simples). Acima de 266 blocos, o ponteiro indireto duplo usado para apontar para um bloco de disco de at 256 ponteiros, que no apontam para blocos de dados, mas sim para 256 blocos indiretos simples.
DCA-FEEC-UNICAMP
55
INODE arquivo numeros de links identificador do proprietrio grupo do proprietrio tamanho do arquivo data da criao data do ltimo acesso data da ltima modificao
DCA-FEEC-UNICAMP
56
DCA-FEEC-UNICAMP
bytes 1 usurio 8 nome do arquivo 3
57
tipo (extenso)
8 nome do arquivo
3 tipo (extenso)
1 atributos
10
2 hora
2 data
4 tamanho
(b)
2 numero do inode
14 nome do arquivo
(c)
Figura 3.5: Registros de diretrios: (a) CPM; (b) MS-DOS; (c) UNIX tro .. o nmero do inode do diretrio pai. Assim, o procedimento de procurar por ../src/prog.c simplesmente localiza .. no diretrio de trabalho, acha o nmero do inode para o diretrio pai, e pesquisa pelo diretrio src. Nenhum mecanismo especial necessrio para manipular estes nomes.
DCA-FEEC-UNICAMP
bloco 1 diretrio / (raiz) 1 1 4 7 14 9 6 8 17 11 . .. bin dev lib etc usr tmp var pub
58
/usr/mfm no inode #6
bloco 416 (diretrio /usr/mfm) . 51 .. 6 321 106 85 539 cursos papers mbox pvm
Figura 3.6: Os passos para achar /usr/mfm/mailbox acessado. Este mtodo chamado de conexo simblica. Cada um destes mtodos tm suas desvantagens. No primeiro mtodo, no momento que B conecta-se ao arquivo compartilhado, o inode registra C como proprietrio do arquivo. A criao de uma conexo no muda o proprietrio do arquivo (ver gura 3.8), mas incrementa um contador no inode que diz quantos diretrios apontam para o arquivo. No caso de C subsequentemente tentar remover o arquivo, o sistema encontra um problema. Se o sistema remover o arquivo e seu inode, B ter um registro de diretrio apontando para um inode invlido. Se o inode for mais tarde reutilizado para um outro arquivo, a conexo de B apontar para o arquivo incorreto. O sistema pode ver pelo contador do inode que o arquivo est ainda em uso, mas no h maneira de encontrar todos os registros do diretrio para o arquivo, a m de apag-los. Ponteiros para os diretrios no podem ser armazenados no inode, uma vez que podem haver um nmero ilimitado de diretrios. A nica soluo remover os registros do diretrio C, mas abandonar o inode intacto, com o contador em 1, como mostra a gura 3.8(c). Temos agora uma situao na qual B tem um registro de diretrio para um arquivo de C. Se o sistema faz controle de cotas, C continuar sendo contabilizado pelo arquivo at B decidir remov-lo, momento em que o contador ir para 0 e o arquivo ser removido. Empregando-se conexes simblicas este problema no ocorre pois somente um diretrio proprietrio guarda o ponteiro para o inode. Diretrios que acabaram de conectar-se ao arquivo armazenam o caminho para o arquivo, no ponteiros para o seu inode. Quando o arquivo for removido do diretrio proprietrio, o inode liberado pelo sistema, e subsequentes tentativas para usar o arquivo via conexo simblica falhar, dada a incapacidade do sistema em localizar o arquivo. Remover uma
DCA-FEEC-UNICAMP
59
diretrio raiz
diretrio de usurio
subdiretrio
A C
arquivo compartilhado
Figura 3.7: Um sistema de arquivos contendo um arquivo compartilhado conexo simblica no afeta o arquivo, causando apenas o decrscimo do contador do inode. Conexes simblicas introduzem um overhead extra na manipulao de arquivos. Num acesso via conexo simblica, vrios inodes devem ser lidos do disco: o primeiro para acessar o caminho e os subsequentes para percorrer todo o caminho at a localizao do arquivo (ver gura 3.6). Alm de mltiplos acessos a disco, um inode extra necessrio para cada conexo simblica, juntamente com um bloco extra para armazenar o caminho. Existe ainda outro problema introduzido pelas conexes, simblicas ou no. Quando conexes so permitidas, uma pesquisa numa rvore de diretrios pode encontrar o mesmo arquivo vrias vezes. Isto um problema a se considerar, por exemplo, em aplicativos que efetuam backups.
DCA-FEEC-UNICAMP
diretrio do usurio C
60
proprietrio = C contador = 1
(a)
Figura 3.8: (a) situao anterior conexo; (b) aps a conexo ter sido feita; (c) aps o proprietrio remover o arquivo blocos defeituosos. Estes blocos so armazenados num arquivo, acessado quando da construo da lista de blocos livre. Conhecendo os blocos defeituosos, o sistema operacional no os incorpora na lista de blocos livre, eliminando assim sua ocorrncia futura em arquivos de dados.
3.3.2 Backups
Mesmo com uma estratgia engenhosa para tratar os blocos defeituosos, importante se proceder backups frequentes. Sistemas de arquivos em discos de pequena capacidade podem ser salvos em ta magntica, por exemplo, tas padro de 9 trilhas (com capacidade de 50 Megabytes por bobina) ou ta de 8 mm (com capacidade de at 1 Gigabyte). Para discos de grande capacidade (e.g. 1 Gigabyte), salvar o contedo inteiro em tas inconveniente e consome muito tempo. Uma estratgia de fcil implementao, mas que diminui pela metade a capacidade de armazenamento, prover cada computador com um segundo disco de igual capacidade. Ambos os discos so divididos em duas metades: dados e backup. Diariamente, a poro de dados de um disco copiada para a poro de backup do outro disco, e vice-versa. Deste modo, se um disco for completamente destrudo, nenhuma informao perdida. Uma outra alternativa o backup incremental. Em sua forma mais simples, copia-se para ta todos os arquivos a cada semana ou ms, e, diariamente, apenas daqueles arquivos que foram modicados deste o ltimo backup completo. Num outro esquema, mais eciente, copia-se apenas aqueles arquivos que foram alterados desde o ltimo backup. Para implementar este mtodo, o horrio da ltima duplicao para cada arquivo deve ser mantida no disco.
DCA-FEEC-UNICAMP
61
DCA-FEEC-UNICAMP
62
valores com os contadores dos inodes. Em um sistema de arquivos consistente, ambos contadores coincidiro. Contudo, dois tipos de erros podem ocorrer: o contador do inode pode ser maior ou menor que o da lista do utilitrio. Se a contagem no inode for maior que o nmero de registros do diretrio, ento mesmo se todos os arquivos forem removidos dos diretrios, o contador ainda ser diferente de 0 e o inode no ser liberado. Este erro no catastrco, mas consome espao no disco com arquivos que no esto em nenhum dos diretrios. O contador de conexes do inode deve ser corrigido atravs da atribuio do valor obtido pelo utilitrio. Outro erro (potencialmente catastrco) ocorre quando o contador do inode menor que o encontrado pelo utilitrio. A medida que os arquivos que apontam para o inode vo sendo removidos, o contador do inode pode chegar a zero, momento que o inode e seus respectivos blocos so liberados. Esta ao resultar em um dos diretrios apontando para um inode no mais em uso, cujos blocos podem rapidamente ser atribuidos a outros arquivos. Novamente, a soluo forar o contador do inode para o nmero real de registros do diretrio (obtidas pelo utilitrio). Estas duas operaes, vericar blocos e vericar diretrios, so frequentemente integradas por razes de ecincia (i.e., uma nica passagem sobre os inodes requerida). Outros controles heursticos so tambm possveis. Por exemplo, diretrios tm um formato denido, com um nmero inodes e nomes ASCII. Se um nmero inode for maior que o nmero de inodes no disco, o diretrio encontra-se num estado inconsistente.
DCA-FEEC-UNICAMP
63
manter blocos de dados na cache durante muito tempo antes que sejam descarregados em disco. Os sistemas de arquivos adotam duas estratgias para tal. No UNIX, a chamada de sistema sync, fora com que todos os blocos modicados sejam gravados em disco imediatamente. Quando o sistema iniciado, um programa, usualmente chamado update, ativado. De 30 em 30 segundos, a atualizao da cache estabelecida. Como resultado, na pior hiptese, perde-se os blocos gravados nos ltimos 30 segundos em caso de uma pane. A soluo do MS-DOS gravar todo bloco modicado para o disco to logo ele tenha sido escrito. Caches nas quais blocos modicados so reescritos imediatamente no disco so chamadas caches de escrita direta. Elas requerem muito mais E/S de disco que caches de escrita no direta. A diferena entre estas duas tcnicas 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 bufferizao interna, procedendo gravaes em disco apenas quando existir uma determinada quantidade de bytes pendentes. A estratgia adotada pelo MS-DOS foi inuenciada pela garantia que a remoo de um disco exvel de sua unidade no causa perda de dados. No UNIX, necessria uma chamada sync antes da remoo de qualquer meio de armazenamento (ou da parada programada do sistema). Cache no a nica maneira de aumentar o desempenho do sistema de arquivos. Uma outra maneira reduzir a quantidade de movimentos do brao do disco, colocando blocos que esto sendo acessados em sequncia, preferencialmente em um mesmo cilindro. Quando um arquivo escrito, o sistema de arquivos aloca os blocos um por vez, a medida do necessrio. Se os blocos livre estiverem gravados em um mapa de bits, e o mapa de bits inteiro est na memria principal, fcil escolher um bloco que est mais perto do bloco anterior. Com uma lista de blocos livre, parte da qual est no disco, mais difcil alocar blocos prximos. Entretanto, com uma lista de blocos livre alguns agrupamentos de blocos podem ser feitos. O artifcio manter a trilha do disco armazenada no 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), porm alocando espao no disco em unidades de 2 blocos (4 setores). Isto no o mesmo que ter um bloco de 2K, posto que na cache ainda se usa blocos de 1K com transferncia para disco tambm de 1K. Entretanto, a leitura sequencial reduz o nmero 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 para colocar blocos consecutivos de um arquivo no mesmo cilindro, mas intercalados. Deste modo, se um disco tiver um tempo de rotao de 16.67 mseg e 4 mseg so necessrios para o processo do usurio requerer e acessar um bloco do disco, cada bloco deve ser colocado em ao menos um quarto da distncia 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 necessrio 2 acessos no disco: um para o inode e outro para o bloco. Caso todos os inodes estejam prximos do incio do disco, distncia mdia entre o inode estar em torno da metade do nmero de cilindros, o que exige longas buscas. Melhor alternativa instalar os inodes no meio do disco, reduzindo a mdia de busca entre o inode e o primeiro bloco de um fator de 2. Uma outra idia consiste em dividir o disco em grupos
DCA-FEEC-UNICAMP
64
de cilindros, cada qual com os seus prprios 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 disponvel, escolhe-se um bloco do cilindro mais prximo.
DCA-FEEC-UNICAMP
buffer contendo dados vlidos;
65
buffer com escrita retardada - signica a situao em que o ncleo deve escrever o contedo do buffer no disco antes de reatribuir o buffer a um outro bloco; o ncleo encontra-se lendo ou escrevendo o contedo do buffer no disco; um processo encontra-se aguardando que o buffer torne-se livre. A gura 3.9 ilustra o cabealho de um buffer.
nmero do dispositivo nmero do bloco status ponteiro p/ area de dados ponteiro p/ prximo (fila de hash) ponteiro p/ anterior (fila de hash) ponteiro p/ prximo (lista de blocos livre) ponteiro p/ anterior (lista de blocos livre) rea de dados (tamanho do bloco)
Estrutura do Pool de Buffers Os blocos de dado no disco so organizados no cache de buffers atravs de uma poltica denominada de uso menos recente. Atravs desta poltica, quando um buffer alocado a um determinado bloco, este buffer no poder ser realocado a um outro bloco, a menos que todos os outros blocos tenham sido usados mais recentemente. Para implementao desta poltica o ncleo mantm uma lista de buffers livre que organizada segundo a ordem do uso menos recente. O ncleo retira um buffer da cabea da lista quando da necessidade de um buffer livre. possvel que um buffer seja retirado do meio da lista caso o ncleo identique um bloco especco no cache de buffers. Em ambos os casos o buffer removido da lista. Quando o ncleo retorna um buffer ao pool, ele normalmente coloca o buffer no nal da lista sendo que, ocasionalmente (em situaes de erro), o buffer colocado na cabea da lista. O buffer nunca recolocado no meio da lista de buffers livre. Quando o ncleo necessita acessar um bloco do disco, ele procura um buffer que possua a combinao adequada nmero de dispositivo-nmero de bloco. Para evitar a necessidade do ncleo pesquisar o cache de buffers por completo, estes so organizados em las separadas, espalhadas por uma funo de hash que tem como parmetros os nmeros do dispositivo e do bloco. Os buffers so
DCA-FEEC-UNICAMP
66
colocados em uma la hash circular, duplamente ligada, em uma forma equivalente estrutura da lista de buffers livre. Todo buffer est na la hash, no existindo, entretanto, signicado para a sua posio na la. Um buffer pode encontrar-se, simultaneamente, na lista de buffers livre, caso o seu estado seja livre, e na la hash (por exemplo, o buffer 64 da gura 3.10). Desta forma, o ncleo pode procurar um buffer na lista hash caso ele esteja procurando um buffer especco, ou ele pode remover um buffer da lista de buffers livre caso ele esteja procurando por um buffer livre qualquer. Resumindo, um buffer que se encontra na lista hash pode ou no encontrar-se na lista de buffers livre.
fila de hash
28
64
17
97
98
50
14
38
cauda
Cenrios para Recuperao de um Buffer O cache de buffers manipulado por um conjunto de algoritmos que so invocados pelo sistema de arquivos. O sistema de arquivos determina o nmero do dispositivo lgico e o nmero do bloco a ser acessado, por exemplo, quando um processo necessita ler dados de um arquivo. Quando da leitura ou escrita de dados de um determinado bloco do disco, o ncleo determina se o bloco encontra-se no cache de buffers e, caso ele no se encontre, um buffer livre atribuido
DCA-FEEC-UNICAMP
67
ao bloco. Os algoritmos para leitura/escrita em blocos do disco usam um algoritmo (getblk) para alocao de buffers a partir do pool. Existem cinco cenrios tpicos associados ao algoritmo getblk (gura 3.11): 1. O ncleo encontra o buffer correspondente ao bloco na la hash e o buffer est livre. Neste caso, o algoritmo marca o buffer como ocupado, remove-o da lista de buffers livre e retorna um ponteiro para o buffer. 2. O ncleo no encontra o buffer correspondente ao bloco na la hash e aloca um buffer da lista de buffers livre, reposicionando-o na la de hash. 3. O ncleo no encontra o buffer correspondente ao bloco na la hash e, na tentativa de alocar um buffer da lista de buffer livre (como no cenrio 2), encontra um buffer na lista de buffers livre marcado com escrita adiada (delayed write). Neste caso, o ncleo deve escrever (assincronamente) o buffer no disco e continuar a procura de um buffer livre para o bloco. 4. O ncleo no encontra o buffer correspondente ao bloco na la hash, e a lista de buffers livre encontra-se vazia. Neste caso, o processo bloqueado at que outro processo devolva um buffer lista de buffers livre. 5. O ncleo encontra o buffer correspondente ao bloco na la hash, mas o seu buffer est ocupado (outro processo est acessando exatamente este bloco). Neste caso, o processo bloqueado at que o outro processo conclua a operao sob este bloco. Note que em qualquer cenrio acima, ou o algoritmo getblk volta um buffer j posicionado na la de hash para que a operao de E/S possa continuar; ou bloqueia o processo a espera de buffer ou liberao do bloco. Alm do algoritmo getblk, existem outros quatro algoritmos que operam o cache de buffers: 1. brelse: libera um bloco, retornando-o lista de blocos livre. 2. bread: l sincronamente (com espera) o bloco do disco para o buffer. 3. breada: l assincronamente (sem espera) o bloco do disco para o buffer. 4. bwrite: escreve um bloco do buffer para o disco.
DCA-FEEC-UNICAMP
68
if(lista de buffers livre vazia) // cenrio 4 { sleep(evento "lista de buffers livre no vazia") continue } remova buffer da lista de buffers livre if(buffer marcado "delayed write") // cenrio 3 { escreva assincronamente o contedo do buffer em disco continue } // cenrio 2 reposicione buffer na fila de hash retorne buffer } while(TRUE) }
Figura 3.11: Algoritmo para alocao de um buffer da buffer cache (getblk) iput: libera o inode; bmap: dene os parmetros do ncleo para o acesso a um arquivo; namei: converte um nome (path) de arquivo no inode correspondente; alloc: aloca blocos do disco para os arquivos; free: libera blocos de disco; ialloc: aloca inodes para os arquivos; ifree: libera inodes. Estes algoritmos utilizam outros que manipulam o cache de buffers (getblk, brelse, bread, breada, bwrite).
DCA-FEEC-UNICAMP
Estrutura do Inode
69
Um inode existe estaticamente no disco e o ncleo realiza a sua leitura para a memria quando necessita manipul-lo. O inode no disco contm os seguintes campos (ver gura 3.4): identicador do dono do arquivo: divido em dono individual e grupo; tipo do arquivo: regular, diretrio, especial ou FIFO (pipes); permisso de acesso; instantes de acesso ao arquivo: ltima modicao, ltimo acesso e ltima modicao ocorrida no inode; nmero de conexes (links) associados ao arquivo; endereos no disco dos blocos de dados do arquivo; tamanho do arquivo. A cpia do inode em memria contm os seguintes campos em adio aos campos do inode em disco: status do inode na memria indicando: - o inode est trancado; - processo encontra-se esperando que o inode seja liberado; - a representao do inode na memria difere da cpia do disco devido a mudanas nos dados do inode; - a representao do arquivo na memria difere da cpia do disco devido a mudanas nos dados do arquivo; - o arquivo um mount point. o nmero do dispositivo lgico do S.A. que contm o arquivo; o nmero do inode. O inode no disco no necessita deste nmero pois os inodes so armazenados em um arranjo liner no disco; apontadores para outros inodes na memria. O ncleo liga os inodes em las hash e em uma lista de inodes livre da mesma forma que os buffers so ligados no cache de buffers; um contador de referncia, indicando o nmero de instncias do arquivo que esto ativas. A diferena mais signicativa entre o inode na memria e o cabealho do buffer no cache de buffers o contador de referncia presente no inode, o qual indica o nmero de instncias (acessos) ativas do arquivo. Um inode torna-se ativo quando um processo realiza a sua alocao, por exemplo, atravs da abertura do arquivo. Um inode colocado na lista de inodes livre se, e somente se, o seu contador de referncia 0, signicando que o ncleo pode realocar sua estrutura na memria a um outro inode do disco. A lista de inodes livre serve como um cache de inodes (exatamente como o cache de buffers).
DCA-FEEC-UNICAMP
Acesso aos Inodes
70
O ncleo identica um inode especco atravs do nmero do seu sistema de arquivo e do seu nmero dentro deste sistema. O algoritmo iget cria uma cpia do inode na memria fsica, realizando um papel equivalente ao algoritmo getblk utilizado para encontrar um bloco do disco no cache de buffers. Caso o algoritmo no encontre o inode na la hash associada ao nmero do dispositivo e ao nmero do inode procurado, um inode alocado a partir da lista de inodes livre sendo consequentemente trancado (locked). A partir deste ponto o ncleo encontra-se em condio de ler o inode do disco correspondente ao arquivo que esta sendo referenciado e copi-lo para a memria fsica. Para determinar o bloco do disco que contm o inode referenciado e para determinar o offset do inode dentro do bloco, o ncleo utiliza as seguintes expresses:
no do bloco: ((no do inode-1) / nmero de inodes por bloco) + nmero do bloco inicial da lista
de inodes offset: ((no do inode-1) MOD (nmero de inodes por bloco) * tamanho do inode no disco Quando o ncleo libera um inode (algoritmo iput) ele decrementa seu contador de referncia. Caso o valor do contador se torne 0, o ncleo escreve o inode no disco caso a cpia na memria seja diferente da cpia no disco. O inode colocado na lista de inodes livre na hiptese de que este inode possa ser necessrio posteriormente. Estrutura de um Arquivo Regular A indicao dos blocos do disco que constituem um determinado arquivo encontra-se no inode associado ao arquivo. Esta indicao traduz-se na utilizao de 13 nmeros para blocos. Os 10 prio meiros nmeros (blocos diretos) contm nmeros para blocos de disco; o 11 nmero um indireto o um indireto duplo e o 13o um indireto triplo. Esta soluo, conforme discutido antesimples, o 12 riormente, permite que os 10 primeiros nmeros componham um arquivo de 10 Kbytes. Elevando-se este nmero para 11, 12 e 13, tem-se, respectivamente, arquivos de at 256 Kilobytes, 64 Megabytes e 16 Gigabytes (mximo para o UNIX). Os processos enxergam o arquivo como um conjunto de bytes comeando com o endereo 0 e terminando com o endereo equivalente ao tamanho do arquivo menos 1. O ncleo converte esta viso dos processos em termos de bytes em uma viso em termos de blocos: o arquivo comea com o bloco 0 (apontado pelo primeiro nmero de bloco no inode) e continua at o nmero de bloco lgico correspondente ao tamanho do arquivo. Um exame mais detalhado das entradas dos blocos no inode pode mostrar que algumas entradas possuem o valor 0, indicando que o bloco lgico no contm dados. Isto acontece caso nenhum processo tenha escrito dados no arquivo em qualquer offset correspondente a estes blocos. Deve ser observado que nenhum espao em disco desperdiado para estes blocos. Este layout pode ser criado pelo uso das chamadas lseek e write.
DCA-FEEC-UNICAMP
71
3.5.4 O Super-Bloco
At o momento consideramos a hiptese de que um inode havia sido previamente associado a um arquivo e que os blocos do disco j continham os dados. Ser discutido na sequncia como o ncleo atribui inodes e blocos do disco. Para isto importante conhecer a estrutura do super-bloco. O super-bloco um segmento contnuo de disco formado pelos seguintes campos: tamanho do sistema de arquivos; nmero de blocos livre no sistema; lista de blocos livre disponveis no S.A.; ndice do prximo bloco livre na lista de blocos livre; tamanho da lista de inodes; nmero de inodes livre no S.A.; lista de inodes livre no S.A.; ndice do prximo inode livre na lista de inodes; campos trancados (locked) para as listas de blocos livre e inodes livre; ag indicando que o super-bloco foi modicado. O super-bloco mantido na memria fsica de modo a agilizar as operaes sobre o sistema de arquivos, sendo periodicamente copiado no disco para manter a consistncia do sistema de arquivos.
4
DCA-FEEC-UNICAMP
72
DCA-FEEC-UNICAMP
73
DCA-FEEC-UNICAMP
74
Captulo 4
GERENCIAMENTO DE MEMRIA
Memria 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 memria chamada de gerenciador de memria, sendo o objeto deste captulo. Dentre outras tarefas, o gerenciador de memria monitora quais partes da memria esto em uso e quais esto disponveis; aloca e libera memria para os processos; gerencia a permuta de processos entre memria principal e secundria (quando a memria principal no capaz de abrigar todos os processos).
4.1.1 Monoprogramao
O esquema mais simples possvel de gerenciamento de memria consiste em ter-se somente um processo na memria durante toda a sua execuo. O usurio carrega um programa do disco ou ta para a memria, podendo este fazer uso de toda a mquina. Se a memria for insuciente, o programa simplesmente tem sua execuo rejeitada. Embora essa tcnica ter sido comum em meados da dcada de sessenta, ela no mais utilizada. A tcnica usada em microcomputadores mostrada na gura 4.1. A memria dividida entre o sistema operacional e um processo do usurio. O sistema operacional pode estar no nal da memria RAM (Random Access Memory) como mostrado na gura 4.1(a), ou em ROM (Read Only Memory), como mostrado na gura 4.1(b), ou ainda tendo os device drivers em ROM e o resto do sistema operacional na RAM ocupando a parte baixa da memria, como mostrado na gura 4.1(c). O IBM PC utiliza o modelo da gura 4.1(c), com os device drivers localizados no bloco de 8K mais alto dentro do espao de 1M de endereamento. O programa na ROM chamado de BIOS
75
DCA-FEEC-UNICAMP
(Basic Input Output System).
0xFFF...
76
programa do usurio
Figura 4.1: Trs formas de organizar a memria para o sistema operacional e um processo do usurio Quando o sistema organizado dessa maneira, somente um processo pode estar em execuo por vez. O usurio entra com um comando no terminal, e o sistema operacional carrega o programa requerido do disco para a memria e o executa. Quando o processo termina, o sistema operacional reassume a CPU e espera por um novo comando para carregar um outro processo na memria j liberada pelo primeiro.
DCA-FEEC-UNICAMP
Modelagem da Multiprogramao
77
Quando a multiprogramo usada, o percentual de utilizao da CPU aumenta. A grosso modo, se a mdia dos processos utilizam CPU somente 20% do tempo que permanecem na memria, com 5 processos em memria, 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. O melhor modelo ver o uso da CPU do ponto de vista probabilstico. Suponha que os processo gastem em mdia uma frao p do tempo a espera de E/S. Com n processos na memria por vez, a n probabilidade que todos os n processos estejam esperando por E/S p . A utilizao da CPU ento 1 ; pn. A gura 4.2 mostra a utilizao da CPU em funo de n, chamado grau de multiprogramao.
utilizao da CPU (%) 100 20% de E/S 80 50% de E/S 60 80 de E/S 40
20
10
Figura 4.2: Utilizao da CPU como uma funo do nmero de processos na memria Da gura est claro que caso os processos gastem 80% do seu tempo esperando por E/S, ao menos 10 processos devem estar na memria por vez para obter um desperdcio de CPU em torno de 10%. Quando se considera que um processo interativo aguardando comandos do terminal est num estado de espera de E/S, deve car claro que tempos de espera para E/S superiores a 80% so usuais. Processos utilizando disco e tas com elevada frequncia, tambm contribuem para o aumento deste percentual.
DCA-FEEC-UNICAMP
78
memria em (possilvelmente diferentes) n parties. Estas parties podem, por exemplo, ser estabelecidas na congurao do sistema operacional. Quando um processo inicia, este pode ser colocado em uma la de entrada para ocupar a menor partio de tamanho suciente para acomod-lo. Desde que as parties so xas, qualquer espao em uma partio no usado pelo processo perdido. A gura 4.3(a) apresenta este esquema de partio.
partio 4 700K partio 4
partio 3
partio 3
200K partio 1 100K sistema operacional (a) sistema operacional (b) partio 1
Figura 4.3: (a) Parties de memria xa com las de entrada separadas para cada partio; (b) partio de memria xa com uma la simples de entrada A desvantagem de se ordenar os processos que chegam em las separadas torna-se aparente quando a la para a maior partio est vazia, mas a la para a menor partio est cheia, como no caso das parties 1 e 4 na gura 4.3(a). Uma organizao alternativa manter uma la nica como na gura 4.3(b). Toda vez que uma partio liberada, a mesma alocada ao primeiro processo da la. Uma vez que indesejvel gastar uma partio grande com um processo pequeno, uma estratgia mais ecaz procurar em toda la de entrada a maior tarefa para a partio liberada. Note que o ltimo algoritmo discrimina os processos pequenos, quando usualmente desejvel dar a eles o melhor tratamento, no o pior. Este sistema, com parties xas denidas pelo operador, foi usado pelo sistema operacional OS/360 nos grandes mainframes da IBM por muitos anos. Ele era chamado de MFT (Multiprograming with a Fixed number of Task). Ele simples de se entender e igualmente simples de implementar: os processos que chegam so colocados em uma la at que uma partio adequada seja liberada, quando ento so carregados e executados.
DCA-FEEC-UNICAMP
Realocao e Proteo
79
Multiprogramao introduz dois problemas essenciais que devem ser resolvidos: realocao e proteo. Da gura 4.3 est claro que diferentes processos sero executados em endereos diferentes. Quando um programa ligado (linked) 1 , o linker deve saber em qual endereo na memria o programa comear. Por exemplo, suponha que a primeira instruo de um programa uma chamada para um procedimento de endereo relativo 100 dentro do arquivo binrio produzido pelo linker. Se o programa for carregado na partio 1 da gura 4.3(a), esta instruo saltar para o endereo absoluto 100, em plena rea do sistema operacional. O que necessrio uma chamada para 100K + 100. Se o programa for carregado na da partio 2, ele deve ser executado como uma chamada para 200K + 100, e assim por diante. Este problema conhecido como o problema da realocao. Uma soluo possvel modicar realmente as instrues quando o programa carregado para a memria. Programas carregados na partio 1 tm 100K adicionados para cada endereo, programas carregados na partio 2 tm 200K adicionados ao endereamento, e assim sucessivamente. Para realizar a realocao durante o carregamento, o linker deve incluir no programa binrio uma lista contando quais palavras do programa so endereos para ser realocados e quais so cdigo, constantes, e outros itens que no devem ser realocados. Realocao durante o carregamento no resolve o problema da proteo. Pelo fato de programas operarem endereos absolutos de memria, no existe maneira de proibir um programa de ler ou gravar em qualquer posio de memria. Em sistemas multi-usurios indesejvel permitir que processos leiam e escrevam em posies de memria alocadas a outros processos. A soluo de proteo adotada pela IBM na famlia 360 foi dividir a memria em blocos de 2K bytes e atribuir um cdigo de proteo de 4 bits para cada bloco. A cada processo atribuido um cdigo nico de 4 bits, gravado tambm nos blocos de memria que ele ocupa. Este cdigo parte do registro PSW (program status word) quando o processo tem a posse da CPU. O hardware protege qualquer tentativa de programa em execuo de acessar a memria cujo cdigo de proteo difere daquele presente na PSW. Desde que somente o sistema operacional pode mudar os cdigos de proteo dos blocos de memria e dos processos, processos do usurio esto protegidos de interferncias entre s e com o sistema operacional. Uma soluo alternativa, adotada por praticamente todos os microprocessadores atuais, para realocao e proteo equipar a mquina com dois registradores especiais no hardware, chamados de registradores de base e limite. Quando um processo escalonado, o registrador de base carregado com o endereo do comeo da sua partio, e o registrador limite carregado com o tamanho da partio. Cada endereo de memria referenciado tem o contedo do registrador de base a ele adicionado antes de ser enviado para o barramento de acesso memria. Por exemplo, se o registrador de base for 100K, uma instruo CALL 100 efetivamente modicada para CALL (100K + 100). Endereos so comparados com o registrador de limite para prevenir endereamento fora do espao alocado ao processo. O hardware tambm protege os registradores de base e limite para evitar que programas dos usurios os modiquem. O IBM-PC usa uma verso simplicada deste esquema: tem-se registradores de base (os registradores de segmento), mas no registradores de limite.
Isto , o programa principal, subrotinas escritas pelo usurio, e bibliotecas so combinados dentro de um espao de endereamento nico.
1
DCA-FEEC-UNICAMP
80
Uma vantagem adicional do uso de registrador de base para realocao que um programa pode ser movido na memria aps ter sua execuo iniciada. Depois de ter sido movido, tudo que se precisa para torn-lo pronto para execuo em outra posio da memria mudar o valor do registrador de base. Quando a realocao feita por alterao dos endereos do programa quando o mesmo carregado, sua execuo em outra posio de memria demanda que todos os endereos sejam novamente recomputados.
DCA-FEEC-UNICAMP
81
B E
Figura 4.4: Mudanas na alocao de memria com processos chegando e deixando a memria (regies hachuradas representam espao no usado) Na prtica, os segmentos de dados e pilha de um processo tendem a crescer durante a sua execuo. Alocao dinmica de memria e recurso (presentes em praticamente em todas as linguagens modernas de programao) so exemplos tpicos de crescimento destes segmentos. Se o processo necessitar expandir sua memria e existir um buraco adjacente, simplesmente o buraco pode vir a ser incorporado ao espao de endereamento do processo. De outra forma, se o processo est adjacente a outro processo, o primeiro dever ser movido para um burraco grande o suciente para armazena-lo, ou um ou mais processos tero que ser movidos para disco com o intito de criar espao na memria. Se o processo no puder crescer na memria e a rea do disco reservada para abrigar processos permutados estiver cheia, o processo deve ser terminado. Se for esperado que muitos processos crescero na memria quando executados, uma boa poltica seria alocar uma pequena rea extra toda vez que o processo permutado ou movido. Contudo, quando os processos so permutados para o disco, somente a rea de memria atualmente em uso deve ser copiada, sendo desnecessrio permutar a rea extra de memria. A gura 4.5(a) mostra a congurao da memria na qual a rea para crescimento foi alocada para os dois processos.
DCA-FEEC-UNICAMP
82
espao para crescimento espao para crescimento B (dados) B espao em uso B (texto)
A (pilha) espao para crescimento espao para crescimento A sistema operacional (a) espao em uso A (dados) A (texto) sistema operacional (b)
Figura 4.5: (a) Espao para crescimento do segmento de dados. (b) espao para crescimento da pilha e do segmento de dados. memria considervel pode ser desperdiada se o tamanho do processo no for um mltiplo exato da unidade de alocao. Um mapa de bits (ocupando uma poro xa da memria) prov uma maneira simples de gerenciar memria, uma vez que o tamanho do mapa de bits depende somente do tamanho da memria e do tamanho da unidade de alocao. O problema principal com isto que quando se decide trazer um processo de k unidades de alocao para a memria, o gerenciador de memria deve pesquisar no mapa de bits uma sequncia de k consecutivos bits 0 no mapa. Esta operao lenta, razo pela qual os mapas de bits so evitados na prtica.
DCA-FEEC-UNICAMP
A 8 11111000 11111111 10011111 B
83
(a)
(b) A P 0 5 B 6 8 p B 9 14 C P 15 17 B 18 19 D P 20 25
Figura 4.6: (a) parte da memria com 5 processos e 3 buracos (as marcas mostram as unidades de alocao da memria e as regies hachuradas esto livres); (b) mapa de bits correspondente. (c) a mesma informao como uma lista ligada evocados quando o gerenciador de memria necessita um segmento de memria de M bytes. Algoritmo First-t o algoritmo mais simples. O algoritmo procura ao longo da lista de segmentos at encontrar um buraco de tamanho maior ou igual a M. Caso o buraco tenha tamanho superior a M (N), o buraco quebrado em dois segmentos: um para o processo (de tamanho M) e o outro para a memria no usada (de tamanho N - M). First-t um algoritmo rpido pois naliza a busca o mais cedo possvel. Algoritmo Next-t Este algoritmo trabalha da mesma forma que o rst-t, exceto que quarda a posio da lista onde o ltimo buraco foi alocado. Da prxima vez que chamado, o algoritmo comea a procurar a partir deste ponto. Algoritmo Best-t Este algoritmo procura pela lista inteira e toma o buraco de tamanho mais prximo de M. um algoritmo lento e cria na memria buracos pequenos que dicilmente sero alocados. Entretanto, para M grande, o best-t aumenta as chances de se encontrar na lista um buraco de tamanho adequado, posto que minimiza o uso buracos grandes para atender alocaes pequenas. Como um exemplo, considere a gura 4.6. Se um bloco de tamanho 2 for solicitado, o algoritmo rst t alocar o buraco 5, e o best t o buraco 18.
DCA-FEEC-UNICAMP
84
Figura 4.7: Quatro combinaes de memria quando um processo terminar Algoritmo Quick-t Este algoritmo mantm listas separadas para tamanhos comumente requeridos. Por exemplo, seja uma tabela com n entradas, na qual a primeira um ponteiro para a cabea da lista de buracos de tamanho 4K, a segunda um ponteiro para a cabea da lista de buracos de tamanho 8K, a terceira de tamanho 12K, e assim sucessivamente. Com o quick-t, acha-se um buraco de tamanho requerido muito rapidamente, mas com a desvantagem de todos os esquemas de classicar os buracos por tamanho, a saber, quando um processo termina ou permutado para disco, determinar seus vizinhos para uma possvel fuso uma operao custosa. Se fuses no forem feitas, a memria rapidamente se fragmentar em um grande nmero de pequenos buracos no utilizveis. Todos os quatro algoritmos podem aumentar seus desempenhos mantendo-se em separado listas para processos e buracos. Neste caso, todos devotam suas energias para inspeo de buracos, no de processos. O preo pago por esse aumento de velocidade na alocao uma complexidade adicional e diminuio de velocidade quando se trata de liberar memria, uma vez que um segmento livre tem de ser removido da lista de processos e inserido na lista de buracos. Novamente, a inecincia est em se determinar possveis fuses.
DCA-FEEC-UNICAMP
85
da memria principal. Em outros sistemas, quando um processo criado, um espao para permuta alocado em disco (usando um dos algoritmos descritos acima). Sempre que um processo em memria d lugar a outro processo, ele colocado no espao em disco a ele previamente alocado. Quando um processo termina, o seu espao para permuta em disco desalocado. Esta tcnica mais eciente que a anterior pois uma nica alocao de espao em disco por processo necessria (lembre-se que um processo pode ser permutado vrias vezes durante a sua execuo). Entretanto, uma rea maior de disco deve ser reservada para swapping.
4.3.1 Paginao
A maioria dos sistemas com memria virtual usa uma tcnica chamada paginao. Em qualquer computador existe certo conjunto de endereos de memria que programas podem referenciar. Quando um programa usa uma instruo como MOVE REG,1000, ele est movendo o contedo do endereo de memria 1000 para o registrador REG (ou vice versa, dependendo do computador). Endereos podem ser gerados usando indexao, registradores base, registradores de segmento, dentre outras maneiras. Estes endereos gerados pelos programas so chamados endereos virtuais e formam o espao virtual de endereamento do processo. Em computadores sem memria vitual, o endereo virtual
DCA-FEEC-UNICAMP
86
colocado diretamente no barramento de memria e causa uma palavra da memria fsica com mesmo endereo ser lida ou escrita. Quando memria virtual usada, os endereos de memria no vo diretamente para o barramento de memria. Ao invs disso, eles vo unidade de gerenciamento de memria (Memory Management Unit, MMU), onde um hardware especco mapeia os endereos virtuais nos endereos da memria fsica como ilustrado na gura 4.8.
processador
Figura 4.8: A posio e funo da MMU Um exemplo de como este mapeamento trabalha mostrado na gura 4.9. Neste exemplo, temos um computador que pode gerar endereos de 16 bits, de 0 at 64K. Estes so os endereos vituais. Este computador, entretanto, tem somente 32K de memria fsica, assim, embora programas de 64K possam ser escritos, eles no podem ser carregados para a memria na sua totalidade para serem executados. Uma cpia completa de um ncleo de imagem do programa, acima de 64K, deve estar presente no disco; os pedaos podem ser trazidos para a memria pelo sistema a medida que se tornem necessrios. O espao de endereamento virtual dividido em unidades chamadas pginas. As unidades correspondentes na memria fsica so chamadas page frames. As pginas e page frames so sempre do mesmo tamanho. Neste exemplo elas so de 4K, mas tamanhos de pginas de 512 bytes, 1K, e 2K so comumente usados. Com 64K de espao de endereo virtual e 32K de memria fsica, temos 16 pginas e 8 page frames. Transferncias entre memria e disco so sempre feitas em unidades de pginas. Quando o programa tenta acessar o endereo 0, por exemplo, usando a instruo MOV REG,0 o endereo virtual 0 enviado para a MMU. Ela reconhece que este endereo cai na pgina 0 (0 a 4095), o qual, de acordo com seu mapeamento a page frame nmero 2 (8192 at 12287). Ele ento transforma o endereo para 8192 e coloca o endereo 8192 no barramento. A tabela de memria nada sabe a respeito da MMU, e apenas v uma requisio para leitura ou escrita no endereo 8192, a qual respeitada. Assim, a MMU mapeou todo endereo virtual entre 0 e 4095 em endereo fsico de 8192 a 12287. O que acontece se o programa tenta usar um pgina no mapeada ? Como exemplo, seja a ins-
DCA-FEEC-UNICAMP
espao de endereamento virtual (tabela) 0 2 1 1 2 6 3 0 4 4 5 3 6 X 7 X 8 X 9 5 10 X 11 7 12 X 13 X 14 X 15 X
87
Figura 4.9: Relao entre endereo virtual e endereo fsico de memria, dada pela tabela de pginas truo MOV REG,32780, o qual referencia o byte nmero 12 dentro da pgina virtual 8 (comeando em 32768). A MMU observa que a pgina est sem mapeamento (indicada por um x na gura 4.9), e fora a CPU a causar uma interrupo (trap) no sistema operacional. Este trap chamado uma falta de pgina (page fault). O sistema operacional remove o page frame menos usado e escreve seu contedo de volta no disco. Ele ento busca a pgina referenciada para o page frame liberado, atualiza o mapa, e retorna instruo interrompida. Agora vajamos como a MMU trabalha e porque temos de escolher um tamanho de pgina como uma potncia de 2. Na gura 4.10 temos um exemplo de um endereco virtual, 8196 (0010000000000100 em binrio), sendo mapeado usando o mapa da MMU da gura 4.9. O endereo virtual de 16 bits divido em um nmero de pgina de 4 bits e offset de 12 bits dentro da pgina. Com 4 bits para o nmero da pgina, podemos representar 16 pginas, e com 12 bits para o deslocamento (offset), podemos enderear todos os 4096 bytes dentro da uma pgina.
DCA-FEEC-UNICAMP
88
pgina virtual = 2 tabela de pginas endereo | bit presente/ausente 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 010 001 110 000 100 011 000 000 000 101 000 111 000 000 000 000 1 1 1 1 1 1 0 0 0 1 0 1 0 0 0 0
110
Figura 4.10: Operao interna da MMU com 16 pginas de 4K O nmero da pgina usado como um ndice dentro da tabela de pginas, permitindo ao page frame corresponder quela pgina virtual. Se o bit ausente/presente for 0, uma interrupo causada. Se for 1, o nmero do page frame encontrado na tabela de pginas copiado para os 3 bits2 de mais alta ordem do registrador de sada, juntamente com os 12 bits do offset, o qual copiado sem ser modicado dentro do endereo virtual de entrada. O registrador de sada ento colocado no barramento de memria como endereo de memria fsica. Note que no procedimento descrito acima, entra em endereo virtual de 16 bits (0 - 64K) e sai um endereo fsico de 15 bits (0 - 32K).
2
DCA-FEEC-UNICAMP
89
4.3.2 Segmentao
Paginao prov uma tcnica para implementao de um grande espao enderevel numa memria fsica limitada. Para algumas aplicaes, um espao enderevel bi-dimensional mais conve32 niente. Idealmente, cada programa deve ter um nmero muito grande de segmentos (i.e. 2 = 4G), 32 ). Os primeiros 64K de segmentos cada um consistindo de grande nmeto de bytes (i.e. tambm 2 podem ser revervados para procedimentos, dados, e pilhas, pertencentes ao programa em execuo. Os segmentos restantes podem conter um arquivo por segmento, tal que processos possam diretamente enderear 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 disposio, com cada byte da memria sendo endereado por um par (segment, offset). Iniciada com o projeto MULTICS, a idia de memria segmentada sobrevive at hoje. Uma implementao tpica prov suporte de hardware para at 16 processos, cada um com espao de endereamento virtual de 1024 pginas de 2K ou 4K. Se introduzirmos pginas de 4K para este exemplo, cada processo ter um espao de endereamento virtual de 4M, consistindo de 1024 pginas de 4K cada. Este esquema poderia ser implementado dando a cada processo sua prpria tabela com 1024 nmeros de page frames. Entretanto, esta tcnica raramente empregada. Em vez disto, o hardware da MMU contm uma tabela com 16 sees, uma para cada um dos 16 processos. Cada seo tem 64 descritores de segmento, ento o espao de endereamento para cada processo de 4M dividido em 64 segmentos, cada um contendo 16 pginas de 4K. As tabelas de segmento e pgina so descritas na gura 4.11(a). Cada um dos descritores de segmento contm um tamanho de segmento (0 16 pginas), bits de proteo dizendo se um segmento pode ser lido ou escrito, e um ponteiro para a prpria tabela de pginas. Cada uma das tabelas de pginas contm 16 entradas, cada entrada apontando para uma page frame na memria (guardando o nmero da page frame). Quando o sistema operacional comea um processo, ele carrega um nmero de 4 bits do processo num registrador especial do hardware. Sempre que o processo referencia a memria, a MMU traduz o endereo virtual como se segue. Toma-se o nmero de 4 bits do processo e os 6 bits de mais alta ordem dos 22 que compem o endereo virtual (necessrios para o endereo de 4M), combinando-os em um nmero de 10 bits usados para indexar a tabela de segmentos e localizar o descritor de segmento relevante. Note que existem exatos 210 = 1024 segmentos na tabela: 64 segmentos/processo X 16 processos. Verica-se ento os bits de proteo no descritor de segmentos para ver se o acesso permitido. Se o for, a MMU ento verica o nmero da pgina extrada do endereo virtual com o tamanho do segmento no descritor de segmentos, para vericar se o segmento grande o bastante. Caso seja, o nmero da pgina usado como um ndice para a tabela de pginas, cujo endereo fornecido no descritor de segmento (todas tabelas de pginas so mantidas numa memria rpida especial dentro da MMU). Uma vez que o nmero da estrutura de pgina encontrado, ele combinado com o deslocamento do endereo virtual para formar o endereo fsico da memria, o qual ento posto no barramento. Uma das caractersticas chave deste modelo que quando o sistema operacional escolhe um processo, tudo o que ele tem de fazer mudar o registrador do nmero de 4 bits do processo. Isto faz com que no tenha que recarregar todas as tabelas de segmento ou de pgina. Dois ou mais
DCA-FEEC-UNICAMP
tabela de segmentos
90
. . . . . .
. . .
4 bytes processo #
6 segmento #
4 pgina #
12 off-set na pgina
Figura 4.11: (a) MMU usada em muitos computadores baseados no 68000; (b) endereamento virtual para um sistema de 4M processos podem dividir um segmento se seus descritores de segmentos apontam para a mesma tabela de pginas. Qualquer mudana feita por um processo numa pgina deste segmento automaticamente visvel para os outros processos. Enquanto o modelo da gura 4.11 prov cada um dos 16 processos com somente 64 segmentos de 64K cada, a idia pode facilmente ser estendida para espaos de endereo mais largos ao preo de uma tabela maior dentro da MMU. A maior parte do espao para as tabelas de pginas. Se tivssemos quatro vezes mais memria para as tabelas de pginas dentro da MMU e seus contedos com 4 processos em vez de 16, o MMU poderiamos suportar 64 segmentos de 1M por processo.
DCA-FEEC-UNICAMP
91
Apesar de ser possvel escolher uma pgina aleatria para dar lugar pgina em demanda, o desempenho do sistema melhorado se for escolhida uma pgina pouco usada (referenciada). Se uma pgina muito usada removida, ela provavelmente ter de ser trazida de volta em breve, resultando um esforo adicional. Algoritmos ecientes de troca de pgina visam minimizar este esforo.
DCA-FEEC-UNICAMP
92
pelo sistema operacional. Periodicamente (i.e., a cada interrupo de relgio), o bit R zerado, para distinguir pginas que no foram referenciadas recentemente daquelas que tenham sido. Quando uma falta de pgina ocorre, o sistema operacional examina todas as pginas e as classica em 4 categorias baseado nos valores correntes de seus bits R e M: Classe 0 : no referenciada, no modicada. Classe 1 : no referenciada, modicada. Classe 2 : referenciada, no modicada. Classe 3 : referenciada, modicada. Ainda que as pginas na classe 1 paream, primeira vista, impossveis de existir, elas ocorrem quando as pginas da classe 3 tm seu bit R zerado pela interrupo do relgio. Interrupes de relgio no zeram o bit M porque esta informao necessria para determinar se uma pgina ter que ser reescrita no disco ou no. O algoritimo No Recentemente Usada (Not Recently Used, NRU), remove uma pgina aleatria da classe no vazia de numerao mais baixa. Implcito neste algoritmo que melhor remover uma pgina modicada que no foi referenciada pelo menos no ltimo tick de relgio (tipicamente 20 mseg), que uma pgina no modicada mas muito usada. As caractersticas principais do NRU que ele fcil de entender, eciente de se implementar, e gera um desempenho que, enquanto certamente no timo, geralmente tido como adequado.
DCA-FEEC-UNICAMP
93
DCA-FEEC-UNICAMP
94
duas partes. Primeiro, os contadores so cada um deslocados 1 bit para a direita antes do bit R ser incrementado. Segundo, o bit R incrementado no bit mais a esquerda. Quando ocorre ume falta de pgina, a pgina de menor contador removida. bvio que a pgina que no tenha sido referenciada por, digamos, quatro ticks de relgio ter quatro zeros signicativos em seu contador, tendo assim um valor mais baixo que o contador de uma pgina que tenha sido referenciada nos quatro ltimos ticks de relgio. Uma diferena entre LRU e Aging que, no ltimo os contadores tm um nmero nito de bits (tipicamente 8). Portanto, no podemos classicar as pginas segundo referncias anteriores capacidade do contador.
DCA-FEEC-UNICAMP
95
validade: ag que indica se o contedo da pgina vlido (isto , o endereo fsico guarda o contedo da pgina); proteo: indica se o contedo da pgina do tipo READ ONLY ou READ/WRITE. descritor de bloco com os seguintes campos: dispositivo de swap com rea disponvel para ler/gravar o contedo da pgina; nmero do bloco alocado pgina; o tipo da pgina: swap, arquivo executvel, demand ll e demand zero (denidos mais adiante). A tabela de frames armazena dados adicionais pgina: endereo fsico de memria que contm os dados referentes esta pgina; um contador de referncia indicando quantos processos compartilham esta pgina em memria; O dispositivo de swap associado pgina; nmero do bloco alocado pgina. Finalmente, a tabela de uso de swap acessada pelo dispositivo de swap e nmero do bloco neste dispositivo. Esta tabela armazena apenas um contador de referncia indicando quantas pginas se utilizam deste bloco em disco. Deve-se notar que algumas informaes so replicadas em tabelas distintas. Esta replicao visa beneciar a ecincia do esquema de paginao, diminuindo o nmero de consultas s tabelas. A gura 4.12 ilustra uma referncia ao endereo virtual 1493K. O hardware mapeia este endereo na pgina nmero 794. O contedo desta pgina pode estar em memria ou no dispositivo de swap #1, bloco 2743. As tabelas de frames e de uso de swap mostram seus respectivos contadores de referncia em 1, informando que o processo o nico a utilizar esta pgina tanto em memria como em disco. As tabelas de pginas e a de frames apontam para o endereo fsico de memria onde os dados referentes a esta pgina esto armazenados. A Chamada fork num Sistema Paginado A gura 4.13 mostra a situao imediatamente aps uma chamada de sistema fork num sistema paginado. A rea de texto no duplicada tendo tanto o processo pai quanto o lho as mesmas entradas para a tabela de pginas (estas pginas so do tipo READ ONLY). O ncleo duplica as tabelas de pginas que contm as reas de dados e de pilha. As entradas destas tabalas compartilham as mesmas entradas na tabela de frames (com o contador de referncia agora em 2). Todas as entradas na tabela de pginas so marcadas como COPY-ON-WRITE, signicando que quando qualquer um dos dois processos alterar o contedo da pgina, a mesma deve ser desmembrada, desvinculando-se os endereos fsicos de memria e as entradas na tabela de frames.
DCA-FEEC-UNICAMP
96
frame 794 contador ref. 1 disp. swap #1 bloco 2743 swap em uso contador ref. 1
Figura 4.12: As vrias estruturas de dados empregadas para gerenciamento de memria A Chamada exec num Sistema Paginado Durante uma chamada exec, o ncleo carrega o programa executvel do disco para a memria. Num sistema paginado, pode ocorrer que o tamanho do executvel supere o tamanho fsico da memria. Neste caso, aps todo o executvel ter sido carregado, parte dele j se encontra no dispositivo de swap. Inicialmente, montado a tabela de pginas (com os respectivos descritores de blocos) para o processo. O sistema conhece o tamanho do executvel a priori, informao esta presente no cabealho do prprio executvel. As pginas so marcadas como demand zero para reas de pilha ou demand ll para reas de texto e dados. A partir da, o ncleo comea a cpia das regies de texto e dados para as pginas em memria. O ncleo aloca uma pgina para cada registro da tabela de pgina. Pginas demand zero (para pilha) no esto presentes no cdigo executvel, sendo simplesmente alocadas e zeradas. Pginas demand ll (texto e dados) so copiadas do disco das respectivas pores do executvel. Para copiar diretamente do executvel para uma pgina em memria, o ncleo adiciona ao inode (em memria) um vetor de blocos que compem o executvel. O descritor de bloco da tabela de pgina, nesta fase, armazena o ndice do bloco no vetor que contm a poro do executvel a ser carregado nesta pgina. Ao copiar a poro do executvel para a pgina, o ncleo localiza o bloco acessando seu ndice no descritor de bloco e seu nmero na posio correspondente no vetor (ver gura 4.14). Uma vez copiado a parte do arquivo executvel para a memria fsica alocada pgina, o descritor de bloco atualizado, contendo agora um bloco fsico de swap associado pgina.
DCA-FEEC-UNICAMP
pregion do processo pai texto dados/ pilha
97
DCA-FEEC-UNICAMP
98
inode lista de blocos 0 regio inode 279 descritor de bloco bloco lgico 84 84 . . .
Figura 4.14: Lista de blocos adicionada ao inode durante a carga de um executvel bit de validade reativado.
DCA-FEEC-UNICAMP
99
pgina em memria
....
Figura 4.15: Fila de pginas candidatas a permuta No segundo caso, caso a pgina desde quando adicionada lista livre no foi associada a nenhum outro processo, a pgina continua vlida, sendo removida da lista de pginas livres sem que nenhuma operao de E/S se faa necessria. No terceiro caso, o ncleo atrves do descritor de bloco encontra na vetor de blocos do inode aquele que contm a parte do executvel sendo requisitado. Uma operao de E/S se faz necessria para trazer o contedo do disco para a memria fsica associada pgina. Neste caso, o ncleo tambm associa pagina uma bloco de swap. No quarto caso, uma pgina alocada, sendo seu contedo atualizado de forma similar ao caso anterior. Finalmente, no ltimo caso, uma pgina alocada e seu contedo de memria simplesmente zerado.
DCA-FEEC-UNICAMP
100
copia o contedo da pgina em falta para a nova pgina, e decrementa seu contador de referncia. Se o contador vai a zero, a pgina marcada como COPY-ON-WRITE pode ser reusada. A tabela de pgina do processo aponta para a nova pgina, agora com permissao de escrita. A partir deste ponto, o processo retoma sua execuo.
Captulo 5
ENTRADA/SADA
Uma das principais funes do sistema operacional controlar todos os dispositivos de entrada/sada (E/S) do computador, emitindo comandos para os dispositivos, atendendo interrupes e manipulando erros. Deve tambm prover uma interface entre os dispositivos e o resto do sistema, que seja simples e fcil de usar (se possvel, a interface deve ser a mesma para todos os dispositivos). O cdigo de entrada/sada representa uma frao signicativa do total do sistema operacional. A forma como o sistema operacional gerencia E/S o objeto deste captulo.
101
DCA-FEEC-UNICAMP
102
Tudo o que fazem gerar interrupes em intervalos regulares. Contudo, este modelo geral o suciente para ser usado como base na construo de um sistema operacional com bom nvel de independncia 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 nvel, chamado acionadores de dispositivos (device drivers).
CPU
memria
barramento
Figura 5.1: Um modelo para conexo da CPU, memria, controladores e dispositivos de E/S A interface entre o controlador e o dispositivo , via de regra, uma interface de baixo nvel. 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 prembulo, depois os 4096 bits no setor, e nalmente o checksum ou o cdigo de correo de erro. O prembulo escrito quando o disco formatado, e contm o nmero 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 correo de erro necessria. O bloco de bytes tipicamente primeiro montado, bit por bit, em um buffer mantido no controlador. Aps o checksum ter sido vericado e o bloco declarado livre de erro, ele pode ento ser copiado para a memria principal.
DCA-FEEC-UNICAMP
103
O controlador para o terminal CRT (catode ray tube) tambm trabalha como um dispositivo serial de bits e em baixo nvel. Ele l da memria o byte contendo o caracter a ser exibido, e gera os sinais usados na modulao do feixe do CRT para causar a escrita na tela. O controlador tambm gera os sinais para o feixe CRT fazer o retrace horizontal aps ele ter terminado de esquadrinhar a linha, como tambm, sinais para fazer o retrace vertical aps a tela toda ter sido esquadrinhada. Se no tivssemos um controlador CRT, o sistema operacional teria que gerar estes sinais no tubo. Com o controlador, o sistema operacional inicia-o com poucos parmetros, tais como o nmero de caracteres por linha e o nmero de linhas por tela, deixando o controlador tomar conta do direcionador do feixe de raios catdicos. Cada controlador tem alguns poucos registradores que so usados para comunicao com a CPU. Em alguns computadores estes registradores so parte do espao de endereamento regular. A tabela 5.1 mostra os endereos de E/S e os vetores de interrupo alocados para alguns dos controladores do IBM PC. A atribuio de endereos de E/S para dispositivos feita por um decodicador lgico associado ao controlador. Alguns IBM PC-compatveis usam diferentes endereos de E/S. dispositivo relgio teclado porta serial secundria disco rgido impressora vdeo monocromtico vdeo colorido disco exvel porta serial primria endereo E/S 040 - 043 060 - 063 2F8 - 2FF 320 - 32F 378 - 37F 380 - 3BF 3D0 - 3DF 3F0 - 3F7 3F8 - 3FF vetor int. 8 9 11 13 15 14 12
Tabela 5.1: Alguns exemplos de controladores, os seus endereos de E/S e seus vetores de interrupo no IBM PC 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 tm parmetros, os quais so tambm 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 interrupo com o objetivo de permitir que o sistema operacional tome o controle da CPU e teste o resultado da operao. A CPU obtm o resultado e o status do dispositivo pela leitura de um ou mais bytes de informao nos registradores do controlador.
DCA-FEEC-UNICAMP
104
Esta operao executada somente aps o bloco todo ter sido transferido. Ento, o controlador causa uma interrupo. Quando o sistema operacional reassume a CPU, ele pode ler o bloco do buffer do controlador (byte a byte ou palavra a palavra) numa operao cclica, onde em cada ciclo um byte ou palavra transferido do controlador para a memria. Obviamente, o ciclo de transferncia de bytes dos controladores para a memria consome um tempo aprecivel da CPU. DMA foi criado para livrar a CPU desta tarefa. Quando utilizado, a CPU fornece duas informaes ao controlador (alm do endereo do bloco a ser lido): o endereo de memria para onde o bloco deve ser copiado e o nmero de bytes a serem transferidos (ver gura 5.2).
unidades de disco
barramento
Figura 5.2: A transferncia via DMA processada sem interveno da CPU Aps o controlador ter lido o bloco, efetuado o checksum e no ter constatado erros de leitura, o prprio controlador copia (via barramento) o primeiro byte (ou palavra) para o endereo de memria suprido pela CPU quando da requisio da operao. A partir da, a cpia prossegue incrementadose o endereo da memria e decrementado-se o contador do DMA (bytes transferidos), at que este se torne zero. Neste instante, o controlador causa uma interrupo. Quando o sistema operacional reassume a CPU, nenhuma transferncia necessita ser efetuada pois o buffer requisitado j se encontra na memria.
DCA-FEEC-UNICAMP
105
DCA-FEEC-UNICAMP
106
Quando a interrupo acontece, a rotina de tratamento daquela interrupo libera o processo bloqueado. Em alguns sistemas isto conseguido fazendo-se um UP sobre um semforo. Em outros, ele far um SIGNAL sobre a varivel de condio no monitor. E ainda em outros, uma mensagem enviada ao processo bloqueado. Em todos os casos o efeito da interrupo que o processo que estava previamente bloqueado dever agora estar habilitado para execuo.
DCA-FEEC-UNICAMP
107
DCA-FEEC-UNICAMP
108
Quando um arquivo criado e preenchido com dados, novos blocos de disco tm que ser alocados para o arquivo. Para realizar esta alocao, o sistema operacional precisa de uma lista ou mapa de bits dos blocos livres no disco, mas o algoritmo para localizar um bloco livre independente do dispositivo e pode ser implementado acima do nvel do driver. Alguns dispositivos, tais como as tas magnticas, podem ser usadas somente por um simples processo em um dado momento. o sistema operacional que examina a requisio para usar o dispositivo e aceita ou no, dependendo da disponibilidade do dispositivo requisitado. A manipulao de erros tambm feita nesta camada. Um erro tpico causado por um bloco do disco ruim e que no pode mais ser lido. Aps o driver tentar ler o bloco vrias vezes, ele informa ao software independente do dispositivo a razo. O erro ento tratado. Se ocorreu num arquivo do usurio, suciente informar o erro para o mesmo. Entretanto, se o erro ocorreu numa rea crtica, o sistema operacional deve apresentar uma mensagem e, eventualmente, terminar sua execuo.
DCA-FEEC-UNICAMP
109
A gura 5.3 resume o sistema de E/S, mostrando todas os nveis e funes principais de cada nvel.
camada processos do usurio funcionalidade executa operao de E/S
identifio, proteo, bloqueio "bufferizao" inicia registradores do dispositivo verifica status da operao desbloqueia o driver quando a operao de E/S se completa
drivers de dispositivos
gerenciadores de interrupo
dispositivos
requisio de E/S
resposta da requisio
DCA-FEEC-UNICAMP
110
gerencivel, mas em grandes computadores, com dezenas de discos, deixar o controle de todos os dispositivos para o usurio intolervel. A gura 5.4 mostra a idia por detrs dos discos RAM. O disco RAM dividido em n blocos, dependendo de quanto de memria foi alocado para ele. Cada bloco tem o mesmo tamanho que o tamanho do bloco usado em discos rotativos. Quando o driver recebe um bloco para ler ou escrever, ele apenas computa onde na memria de disco da RAM o bloco est, e l ou escreve nesta posio de memria. Normalmente, a transferncia deve ser feita pela chamada de um procedimento em linguagem assembly, que copia os dados gerados pelo programa do usurio com a mxima velocidade com a qual o hardware capaz de operar.
processos do usurio
sistema operacional
DCA-FEEC-UNICAMP
111
Tabela 5.2: Parmetros de unidades de discos exveis (360 Kbytes) para o IBM PC
DCA-FEEC-UNICAMP
112
indexada pelo nmero do cilindro, com todas as requisies pendentes para cada cilindro, encadeadas juntas numa lista. Para este tipo de estrutura de dados, podemos melhorar o algoritmo de escalonamento FirstCome, First-Served. Considere um disco com 40 cilindros. Uma requisio chega para ler um bloco no cilindro 11. Enquanto a busca para o cilindro 11 est em progresso, novas requisies chegam para os cilindros 1, 36, 16, 34, 9, e 12, nesta ordem. Elas so inseridas na tabela de requisies pendentes, tendo cada cilindro um lista separada. As requisies so mostradas na gura 5.5.
posio inicial
X 0 5
X 10
X X 15
X 20 25
X 30
X cilindro
sequncia de movimentos
tempo
Figura 5.5: Algoritmo de escalonamento menor seek primeiro (SSF) Quando a requisio corrente termina (cilindro 11), o disk driver tem que escolher qual ser a prxima requisio. Usando FCFS, ele ir para o cilindro 1, ento para o 36, e assim por diante. Este algoritmo requer movimentos do brao de 10, 35, 20, 18, 25, e 3, respectivamente, num total de 111 cilindros. Alternativamente, a prxima requisio pode ser manuseada a m de minimizar o tempo de seek. Dadas as requisies da gura 5.5, a sequncia 12, 9, 16, 1, 34, e 36, como mostrado na linha entalhada da gura 5.5. Com esta sequncia, os movimentos do brao so 1, 3, 7, 15, 33, e 2, num total de 61 cilindros. Este algoritmo, menor seek primeiro (SSF), diminuiu o total de movimentos do brao pela metade, comparado com o FCFS. Infelizmente, SSF tem um problema. Suponha mais requisies chegando enquanto as requisies da gura 5.5 est sendo processada. Por exemplo, se, aps chegar ao cilindro 16, uma nova requisio para o cilindro 8 est presente. Esta requisio ter prioridade sobre o cilindro 1. Se a requisio for para o cilindro 13, o brao ir para o 13, ao invs de ir para o cilindro 1. Com disco muito carregados, o brao tende a permanecer no meio do disco a maior parte do tempo, prejudicando assim as requisies das extremidades. Requisies distantes do meio so em mdia mais demoradas, colocando o objetivo de mnima resposta no tempo e equitatividade em conito. Um algoritmo para reconciliar os objetivos conitantes entre a ecincia e equitatividade constituise em manter o movimento do brao na mesma direo at no haver mais requisies pendentes naquela direo, e ento o movimento do brao mudado. Este algoritmo, conhecido como algoritmo do elevador, requer o software mantenha 1 bit: o bit da direo corrente, UP ou DOWN. Quando a
DCA-FEEC-UNICAMP
113
requisio termina, o disk driver testa o bit. Se UP, o brao movido para a prxima requisio pendente de posies mais altas, se houver. Se no h requisies pendentes para posies mais altas, o bit de direo revertido. Quando o bit mudado para DOWN, o movimento ser para a prxima requisio de posio mais baixa, se houver. A gura 5.6 mostra o algoritmo do elevador usando as mesmas sete requisies da gura 5.5, assumindo que o bit de direo esteja inicialmente em UP. A ordem na qual os cilindros so servidos 12, 16, 34, 36, 9, e 1, gerando movimento do brao de 1, 4, 18, 2, 27, e 8, num total de 60 cilindros. Neste caso, o algoritmo do elevador suavemente melhor que SSF, embora seja usualmente pior. Uma propriedade interessante do algoritmo do elevador que dada uma coleo de requisies, o limite superior para o total de movimentos xado: ele apenas duas vezes o nmero de cilindros.
posio inicial
X 0 5
X 10
X X 15
X 20 25
X 30
X cilindro
Figura 5.6: Escalonamento de requisies no disco atravs do algoritmo do elevador Alguns controladores de disco provem um modo do software para inspecionar o nmero de setores correntes sob a cabea. Com um desses controladores, uma outra otimizao possvel. Se duas ou mais requisies para o mesmo cilindro esto pendentes, o driver pode emitir a requisio para o setor que passar sob a cabea do prximo cilindro. Note que quando trilhas mltiplas esto presentes num cilindro, requisies consecutivas podem ser conduzidas para diferentes trilhas com nenhuma penalidade. O controlador pode selecionar alguma das cabeas instantneamente, uma vez que seleo de cabea no involve movimento dos braos nem atraso rotacional. Quando existe vrios dispositivos, uma tabela de requisies pendentes deve ser mantida para cada dispositivo separadamente. Quando algum dispositivo est desocupado, um seek deve ser emitido para mover os seus braos para o cilindro onde ser necessrio (assumindo que o controlador permita seeks sobrepostos). Quando a transferncia corrente termina, um teste pode ser feito para vericar se algum dos dispositivos esto posicionados no cilindro correto. Se um ou mais esto, a prxima transferncia pode ser iniciada no dispositivo que j est no cilindro correto. Se nenhum dos braos est na posio desejada, o driver deve emitir novos seeks sobre os dispositivos que j completaram a transferncia, e esperar at a prxima interrupo para examinar em qual dispositivo o posicionamento do brao se completou.
DCA-FEEC-UNICAMP
Manipulao de Erros
114
Discos RAM no tm preocupao sobre seek ou na otimizao rotacional: em algum instante todos os blocos podem ser lidos ou escritos sem nenhum movimento fsico. Uma outra rea na qual discos RAM so consideravelmente mais simples que discos rotativos a manipulao de erros. Discos rotativos so submetidos por uma larga variedade de erros. Alguns dos mais comuns so: erros de programao (i.e. requisio para setor no existente); erro de checksum transiente (i.e. causado por sujeira na cabea); erro de checksum permantente (i.e. bloco do disco sicamente danicado); erro de seek (i.e. enviar o brao para o cilindro 6, mas ele vai para o 7); erro de controlador (i.e. recusa do controlador em aceitar comandos). funo do disk driver manipular cada um desses erros da melhor maneira possvel. Erros de programao ocorrem quando o driver diz ao controlador para executar uma operao de seek em um cilindro no existente, ler de um setor no existente, usar uma cabea no existente, ou transferir de ou para uma posio de memria inexistente. Erros checksum transientes so causados por poeira no ar entre a cabea e a superfcie do disco. Em muitos casos eles podem ser eliminados pela repetio da operao algumas vezes. Se o erro persiste, o bloco deve ser marcado como defeituoso. Um modo de evitar blocos defeituosos escrever um programa especial que toma a relao destes blocos como entrada, e cria um arquivo contendo todos os blocos defeituosos. Uma vez que este arquivo tenha sido criado, para o alocador do disco parecer que estes blocos esto ocupados, no os alocando para outros arquivos. Como o arquivo de blocos defeituosos nunca lido, os blocos defeituosos permanecero inertes no disco. Evitar a utilizao de blocos defeituosos constitui numa tarefa rdua. Alguns controladores inteligentes reservam algumas poucas trilhas, no normalmente disponveis para programas do usurio. Quando um disco formatado, o controlador determina quais blocos so defeituosos e automaticamente substitui por uma trilha de reserva. A tabela de mapas de trilhas defeituosos para trilhas de reserva mantida na memria interna do controlador e no disco. Esta substituio transparente para o driver. Erros de seek so causados por problemas mecnicos no brao. O controlador mantm o rastreamento da posio do brao internamente. Para realizar um seek, ele emite uma srie de pulsos para o motor do brao, um pulso por cilindro, para mover o brao para o novo cilindro. Quando o brao chega no destino, o controlador l o nmero do cilindro (escrito quando o drive foi formatado). Se o brao est no lugar errado, um erro de seek ocorre. Alguns computadores corrigem o erro de seek automaticamente, mas outros (incluindo os IBM PCs) apenas atribuem um bit de erro e abandonam o resto para o driver. O driver manipula este erro pela emisso de um comando recalibrate, que move o brao to longe ele possa ir, e reinicia o controlador interno do cilindro corrente em 0. Usualmente isto soluciona o problema. Caso contrrio, o dispositivo deve ser reparado.
DCA-FEEC-UNICAMP
115
Como temos visto, o controlador um pequeno computador especializado, contendo software, variveis, buffers, e ocassionalmente bugs. Algumas vezes uma sequncia no usual de eventos, tal como uma interrupo sobre um dispositivo ocorrendo simultaneamente com um comando recalibrate para outro, dispara o bug e causa o controlador entrar em loop ou perder-se do estava fazendo. Projetistas de controladores usualmente consideram a pior situao e provem um pino no chip, o qual, quando em nvel alto, fora o controlador esquecer sua tarefa corrente, reiniciando a si mesmo. Se tudo isso falhar, o disk driver pode reiniciar o controlador. Se isto tambm for em vo, o driver imprime uma mensagem e termina sua operao. Cache de Rastreamento O tempo requerido para uma operao de seek para um novo cilindro usualmente muito maior que o tempo de transferncia ou rotao. Em outras palavras, uma vez que o driver tenha posicionado o brao em algum lugar, pouco importa o tempo gasto para ler um setor ou uma trilha inteira. Alguns disk drivers tiram proveito desta propriedade mantendo secretamente uma cache do rastreamento (track-at-a-time cache), o que no conhecido pelo software independente do dispositivo. Se um setor demandado e o mesmo encontra-se no cache, nenhuma transferncia do disco requerida. A desvantagem da cache de rastreamento (em adio complexidade do software e espao de buffer necessrio), que a transferncia da cache para o programa que requisitou a operao deve ser feita pela CPU, usando um loop programado, ao invs de DMA. Alguns controladores aprimoram este processo, e fazem o track-at-a-time caching na sua memria interna, transparente para o driver. Assim a transferncia entre o controlador e a memria pode usar DMA. Note que ambos controlador e driver podem ler ou escrever trilhas inteiras em um nico comando, mas que o software independente do sispositivo no pode, uma vez que ele considera o disco como uma sequncia linear de blocos, sem considerar como eles so divididos em trilhas e cilindros.
DCA-FEEC-UNICAMP
116
A gura 5.7 mostra o esquema bsico de entrada/sada no UNIX. Quando um processo executa uma chamada de sistema open, por exemplo, o ncleo acessa o inode do arquivo passado chamada e descobre que um arquivo associado a um dispositivo de E/S. Atravs de uma tabela de chaveamento de dispositivo, o ncleo obtm o endereo da rotina de open para este dispositivo. Uma vez iniciado o dispositivo, um campo na tabela de arquivos (ver Cap. 3) adicionado, sendo o ndice deste campo (descritor) retornado ao processo.
open close read write ioctl open close read mount umount write
open
close
strategy
driver
driver
gerenciador de interrupes
gerenciador de interrupes
Figura 5.7: Esquema bsico de E/S no UNIX Uma chamada close faz com que o ncleo acesse o respectivo procedimento para o dispositivo, cuja identicao obtida na tabela de arquivos. Chamadas ioctl permitem o usurio operar tanto arquivos regulares quanto dispositivos do tipo caracter. Operaes tpicas so: bloquear um arquivo;
DCA-FEEC-UNICAMP
desligar o eco do terminal;
117
ajustar taxa de transferncia de modens; reenrolar uma ta. Para dispositivos do tipo bloco, chamadas read e write seguem o mesmo procedimento. Para tais dispositivos, na qual o driver tem que iteragir com as rotinas de buffer cache, o procedimento outro. Uma rotina denominada strategy perfaz as operaes de leitura e escrita em tais dispositivos. Quando uma operao de leitura ou escrita requisitada, o ncleo identica a rotina strategy denida para o dispositivo, passando mesma o endereo do cabealho do buffer para onde os dados devem ser copiados, caso leitura, ou contendo os dados para escrita.
5.5.2 Streams
Stream um conceito que prov maior modularidade na implementao de drivers para dispositivos do tipo caracter (principalmente drivers de rede que so estruturados em mltiplas camadas). Um stream um conjunto de pares de listas ligadas. Uma lista armazena requisies de escrita e na outra esto as leituras que o dispositivo j efetuou (gura 5.8). Cada par de listas implementa um determinado nvel de abstrao, desde os mais altos (como as chamadas de sistema) at os mais baixos (como controle direto do dispositivo), passando por nveis intermedirios (como protocolos). A gura 5.8 mostra um driver de terminal empregando o conceito de stream.
inode do arquivo do dispositivo
write
read
cabea do STREAM
fila de entrada
fila de sada
put
push
disciplina de linha
fila de entrada
fila de sada
put
push
driver do terminal
fila de entrada
fila de sada
Figura 5.8: Driver de terminal composto de um stream com trs pares de listas
DCA-FEEC-UNICAMP
118
Quando um processo escreve dados num stream, o ncleo envia os dados para a prxima lista, at chegar ao dispositivo. Quando o driver recebe dados do dispositivo, ocorre o processo inverso: os dados so enviados at chegar lista de nvel mais alto, permanecendo a disposio do processo que requisitou a operao. Cada lista do stream consiste numa estrutura de dados contendo: um procedimento de abertura invocado durante uma chamada open; um procedimento de fechamento invocado durante uma chamada close; um procedimento de put para adicionar dados lista; um procedimento de padro (servio) chamado quando a lista processada; um ponteiro para a prxima lista no stream; um ponteiro para a la de itens aguardando passagem para a para a prxima lista no stream; campos utilizados para o controle de uxo, escalonamento de servios. etc. O ncleo descobre se o driver comum ou baseado em streams quando da consulta tabela de chaveamento de dispositivo. O uxo de dados entre listas se d por estruturas denominadas mensagens. Uma mensagem consiste de uma lista de blocos contendo dados ou controle. Mensagens de controle so originadas durante o processamento de uma chamada ioctl. Um open causa a criao do stream, com um conjunto de blocos para o uxo de mensagens. Quando um processo escreve num stream, o ncleo copia os dados do espao de endereamento do processo para os blocos alocados ao stream. O stream transfere estes blocos para a prxima lista envocando sua rotina de put. Caso tal operao falhe (por no haver blocos disponveis nesta lista, por exemplo), estes blocos so marcados para processamento futuro. A leitura de um stream se d com a chamada ioctl com a opo PUSH. Streams so destruidos por ocasio da chamada close para seu dispositivo. Streams permitem a implementao de drivers onde as chamadas open, close, read e write possuem cdigo dependente do dispositivo fsico apenas nos nveis mais baixos.
Captulo 6
TPICOS ESPECIAIS
O objetivo deste captulo consiste na discusso de alguns itens importantes no contexto dos sistemas operacionais. A primeira questo abordada procura discutir o esforo internacional com relao denio de um padro de interface atravs do Projeto POSIX. Posteriormente, apresenta-se o conceito de thread que um novo modelo voltado para a programao concorrente e que tem sido implementado na maior parte dos novos sistemas operacionais. Por ltimo, o captulo discute alguns aspectos do projeto de hardware dos processadores 8088/8086, 80286 e 80386; trata-se de uma discusso introdutria que procura enfatizar a evoluo ocorrida nesta famlia de processadores tendo como objetivo facilitar a implementao de ambientes multiprogramados.
119
DCA-FEEC-UNICAMP
120
plataforma de aplicao
ambiente externo
Figura 6.1: Ambiente POSIX (International Electrotechnical Commission). O padro 1003.1, originalmente denido para a linguagem C ter, brevemente, denio para o Fortran (1003.9) e Ada (1003.5). A tabela 6.1 mostra os vrios grupos de trabalho envolvidos no projeto de padronizao, assim como, o estado em que se encontram. A classe de padres do POSIX abriga mais do que a denio das interfaces para o sistema operacional. O Comit reconheceu que as aplicaes de tempo real possuem necessidades especcas originando os padres 1003.4 (extenses para tempo real), 1003.4a (sobre threads) e 1003.13 (perl do ambiente da aplicao para suporte s aplicaes de tempo real). Outro aspecto importante o fato de que o padro no especica mecanismos de implementao, mas exige que as empresas aderentes ao POSIX.4 indiquem dados de performance para todas as extenses em diversas condies de mquina e temporizao. Vericao das mtricas anunciadas pelas empresas sero realizadas em laboratrios devidamente licenciados. As extenses de tempo real incluem: semforos binrios; xao de processo na memria; memria compartilhada; escalonamento preemptivo baseado em prioridade; noticao de evento assncrono; comunicao entre processos;
DCA-FEEC-UNICAMP
standard 1003.1 1003.2 1003.2a 1003.4 1003.4a 1003.5 1003.6 1003.7 1003.8 1003.9 1003.12 1003.15 1003.17 1201.1 1224 1238.0 1238.1
121
escpo servios bsicos tais como E/S e controle de processos shell e utilitrios linguagem de comando e utilitrios portabilidade utilitrios para time sharing tempo-real facilidades p/ programaes em tempo-real processos leves facilidades para programao concorrente interface ADA chamadas do 1003.1 em ADA segurana segurana multinvel, controle de acesso, etc administrao adio de usurios, status checking, etc transparncia acesso transparente (via rede) a arquivos interface Fortran chamadas do 1003.1 em Fortran interface de rede servios de comunicao independente de protocolo escalonamento em batch funes para processamento no interativo diretrio de servios registro e localizao de servios sistema grco funes de interfaceamento grco baseado em janelas X.400 correio eletrnico padro OSI funes de suporte funes de baixo nvel padro OSI FTAM transferncia de arquivos padro OSI
Tabela 6.1: Grupos representativos dos padres de interface do IEEE para programas aplicativos. O standard 1003.1 est completo (ISO 9945.1); os standards 1003.2 a 1003.6 3 1003.9 encontram-se prximo de uma verso nal; os demais standards esto ainda em discusso. sistema de arquivos de tempo real. Uma rea que ainda encontra-se em discusso relaciona-se s threads. Um thread um processo leve que utiliza o espao de endereamento de um processo convencional (pesado) e requer um menor overhead na criao, gerenciamento e execuo, do que um processo convencional. A mquina necessita manter menos informaes de estado para uma thread e, apesar dela executar no espao de endereamento do processo pai, ela o elemento de escalonamento e manipulao de sinais. O grupo de trabalho POSIX 1003.4a est discutindo quanto do contexto deve estar associado a uma thread e como uma noticao de evento assncrono ser negociada pela thread. Enquanto estas questes no forem completadas, o POSIX 4.a no far parte do padro POSIX 4. Por ltimo, o Comit identicou 4 pers para os sistemas de tempo real: mnimo, controle, dedicado e propsito geral. O objetivo dos pers o de permitir que o ncleo seja congurado para uma instalao ou aplicao especca. O perl mnimo usado nos sistemas dedicados, autnomos, com poucos dispositivos de E/S e no utiliza memria de massa. Neste caso o sistema formado somente por um nico processo
DCA-FEEC-UNICAMP
122
POSIX.1 com tratadores de interrupo, para todo o processamento a ser realizado. O perl de controle inclui um gerenciamento estruturado de E/S e memria, e acomoda armazenamento de disco em RAM e sinais. Armazenamento de massa pode ser utilizado mas no obrigatrio. O perl dedicado inclui mltiplos processos e processadores. A maior parte das extenses POSIX.4 so necessrias exceto o sistema de arquivos de tempo real. O perl de propsito geral consiste na funcionalidade completa do POSIX.1 e POSIX.4 incluindo a capacidade de uso interativo. Pode ser usado com conexo a rede, threads, gerenciamento de janela e dispositivos de E/S de alta velocidade para armazenamento de massa.
DCA-FEEC-UNICAMP
123
processo
thread #1
descritores de arquivos
thread #2
pipes
semforos
thread #N
gerenciadores de sinal
Figura 6.2: Layout de um processo 4095 threads. A verso de 16 bits possui limitaes no nmero de threads que podem executar dentro de um processo (da ordem de 50 threads por processo) devido natureza segmentada da memria do ncleo. No sistema de 32 bits podem existir tantas threads quanto o usurio deseje dentro de um processo, at o limite do nmero de threads disponveis no sistema. Na sequncia, so discutidos alguns aspectos relativos manipulao das threads utilizando-se como referncia o sistema operacional OS/2. Threads no fazem parte do UNIX apesar de algumas verses implementarem este conceito de forma no padronizada (como no caso do SUNOS).
DCA-FEEC-UNICAMP
124
thread
DCA-FEEC-UNICAMP
125
DCA-FEEC-UNICAMP
126
processo com restries crticas de tempo 31 30 ... 0 baixa prioridade round-robin alta prioridade
Figura 6.4: Estrutura de prioridades no OS/2 A verso OS/2 de 32 bits implementa opcionalmente o quantum dinmico que procura maximizar a utilizao do processador para threads que executam no modo usurio.
DCA-FEEC-UNICAMP
127
6.3.2 Sumrio
Como o 8088 no oferece nunhum mecanismo de proteo memria ou E/S, no se trata de uma plataforma para suportar multiprogamao. Devido ao esquema de memria segmentada, m cdigo escrito para o 8088 transportvel somente para sistemas que possuam, exatamente, a mesma semntica de segmento e esquema de endereamento. O modelo de memria segmentada e o pequeno conjunto de registradores adiciona um nvel de complexidade ao desenvolvimento de programas e ferramentas de programao de suporte ao 8088.
DCA-FEEC-UNICAMP
128
DCA-FEEC-UNICAMP
129
seletor
....
+ limite do segmento
descritor ....
reservado direitos de acesso end. de base (B0-15) end. de base (B16-23) limite
Figura 6.5: Traduo de endereo no modo protegido do 80286 Caso um seletor que referencie um descritor de segmento invlido seja carregado no registrador de segmento correspondente, o 80286 ativa uma falha de proteo geral tratada pelo sistema operacional. Uma falha de proteo geral gerada caso um seletor vlido tente acessar uma posio de memria ilegal. Apesar das aplicaes terem noo da presena dos seletores, elas no tm acesso direto s tabelas de descritor. Estas tabelas so mantidas pelo sistema operacional em funo dos programas em execuo. Para agilizar a operao, quando um registro de segmento carregado com um seletor vlido, o descritor lido automaticamente em um cache no chip correspondente ao registro de segmento.
DCA-FEEC-UNICAMP
Proteo
130
O conceito de proteo fundamental em sistemas multiprogramados e com endereamento virtual. O sistema operacional deve ser protegido das aplicaes e estas devem ser protegidas entre si. O 80286 suporta um modelo de proteo que permite ao sistema operacional isolar-se das aplicaes do usurio, isolar as aplicaes do usurio entre si e validar os acessos memria. Sempre que a memria referenciada, o hardware da unidade de gerenciamento de memria (MMU) no 80286 testa a referncia para vericar se ela satisfaz o critrio de proteo. Como este teste feito antes que uma instruo se complete, qualquer violao proteo que ocorra durante o teste far com que o 80286 provoque uma exceo. Os nveis de privilgio do 80286 so usados para proteger dados e cdigos crticos do sistema contra cdigo menos convel; o sistema usa LDTs para isolar cada segmento de processo atravs da alocao de uma LDT para cada um e pelo chaveamento de LDTs quando os processos so chaveados. Quando um seletor que referencia um segmento carregado no registro de segmento, o processador carrega no somente o endereo de base e o limite de segmento no cache de descritor mas, tambm, a informao de proteo. O bit de acesso desativado toda a vez que o seletor carregado no registrador de segmento; ele ativado sempre que o segmento lido ou escrito, e pode ser usado pelo sistema operacional para monitorar o uso do segmento. O bit Presente no descritor indica se o segmento se encontra na memria permitindo que o sistema operacional gerencie a memria virtual. Testes de Tipo e Limite O campo de tipo de um descritor distingue entre diferentes formatos de descritor e especica o uso previsto para o segmento. Indica, por exemplo, se o descritor corresponde a segmento de cdigo, segmento de dados ou segmento especial usado pelo sistema. O bit de escrita indica se o segmento de dados somente de leitura ou de leitura/gravao. No caso de segmentos de cdigo este bit impede que gravaes ocorram nestes segmentos. O campo limite do segmento no descritor indica o tamanho do segmento. Caso um programa tente acessar um offset alm do limite de um segmento, uma falha de proteo indicada. Nveis de Privilgio O 80286 possui um esquema de proteo de 4 nveis: nvel 0, representa o nvel de privilgio mais alto (sistema opreacional); o nvel 3 representa o nvel de menor conana (programas do usurio). Os nveis de privilgio so encontrados em trs reas da arquitetura do 80286: descritores (DPL) - indica o nvel de privilgio necessrio para acessar o segmento; seletores (RPL) - representa o nvel de privilgio de um procedimento que fornece um seletor como parmetro; o 80286 mantm, internamente, o nvel de privilgio atual (CPL). Normalmente, CPL tem o mesmo valor do DPL do segmento de cdigo em execuo. O valor do CPL muda quando o controle transferido entre segmentos de cdigo com DPLs diferentes. O 80286 determina o direito de um procedimento acessar segmentos comparando o CPL com os nveis de privilgio (DPL e RPL) dos segmentos envolvidos. Quando um programa carrega o seletor de um segmento de dado no registro de segmento, o 80286 testa para ver se o programa pode acessar o segmento, ou seja, se CPL menor ou igual ao DPL do segmento que contm o dado.
DCA-FEEC-UNICAMP
131
6.3.4 Sumrio
O modelo protegido do 80286 fornece as funes necessrias para implementao de um sistema operacional baseado em memria virtual e multiprogramao. Devido limitao dos 64 Kb na arquitetura de endereamento, a programao do 80286 no trivial e o cdigo fonte de difcil transporte. Programas grandes no 80286 devem alterar os registradores de segmento frequentemente, tornando lenta sua execuo.
DCA-FEEC-UNICAMP
132
registradores gerais 32 bits EAX EBX ECX EDX ESI EDI EBP ESP AX BX CX DX SI DI BP SP EIP
EFLAGS
Figura 6.6: Conjunto de registradores do 80386 Anteriormente, a depurao atravs de pontos de parada (breakpoints) tinha de se implementada por software; no caso do 80386, existem registradores que possibilitam a implementao por hardware de pontos de parada para ns de depurao. O processador inclui registradores de sistema com o objetivo de facilitar o gerenciamento da memria, equivalentes aqueles encontrados no 80286: GDTR, LDTR, IDTR e TR. O 80386 possui um novo conjunto de registradores, denominados registradores de controle. Estes registradores so: CR0 (equivalente ao MSW do 80286) que contm os ags de controle do sistema; este registrador possui um novo ag para indicar se a paginao encontra-se habilitada no sistema. CR3 usado para localizar a estrutura correspondente ao diretrio de pginas, sendo denominado de registro de base de diretrio de pginas (PDBR). O CR2 utilizado quando a paginao encontra-se habilitada para indicar o endereo linear de uma falha de pgina. O 80386 contm, tambm, um conjunto de registradores de teste usados no teste do buffer TLB (translation lookaside buffer) que utilizado como uma cache para o armazenamento de informaes relativamente paginao da memria. Arquitetura de Memria O 80386 suporta uma traduo paginada e segmentada do endereo virtual. Quando o modo protegido encontra-se habilitado, a traduo de endereo de 32 bits segmentado ocorre por default. Endereos resultantes da traduo do endereo segmentado so endereos fsicos como no 80286, a menos que a paginao esteja habilitada. Neste caso, os endereos gerados pela traduo segmentada denominam-se endereos lineares. Os endereos lineares so ento traduzidos pela unidade de paginao para criar endereos fsicos. Nenhuma destas tradues visvel para o programador da
DCA-FEEC-UNICAMP
133
aplicao, mas oferece ao programador de sistema uma grande exibilidade no projeto de diferentes modelos de memria. Segmentao A traduo de endereo segmentado ocorre no modo protegido do 80386, esteja ou no a paginao habilitada. A arquitetura de memria segmentada do 80386 utiliza as mesmas construes que so empregadas no endereamento e proteo da memria virtual do 80286. O 80386 usa os mesmos descritores, tabelas de descritores, registradores de sistema e mecanismos de proteo, da mesma forma que o 80286 os utiliza. A caracterstica de 32 bits na segmentao do 80386 resulta d a redenio dos campos reservados nos descritores do 80286 para suportar endereamento de 32 bits. Como o 80286 requeria que estes campos fossem 0, todo cdigo de sistema e aplicao que zerem os campos reservados no descritor, executa no 80386 sem modicao. Neste caso, como o endereamento de 32 bits ocorre, os 8 bits de mais alta ordem dos endereos fsicos gerados pelo 80386 so sempre 0. Portanto, quando o cdigo do 80386 encontra-se executando, endereos fsicos maiores que 16 Mb no so gerados pelo 80386 e o sistema, no caso, comporta-se como um 80286 rpido executando em modo protegido. Como no 80286, um descritor de segmento formado por 8 bytes e contm o endereo de base do segmento, o tamanho do segmento ou limite, informaes de acesso que descrevem qual o tipo de segmento e como este pode ser utilizado. A gura 6.7 ilustra o contedo do descritor de segmento para o 80386.
G D/B
legenda: G: bit de granularidade D/B: default/big bit DPS: disponvel para o sistema
Figura 6.7: Descritor de segmento no 80386 Os dois primeiros bytes do descritor, que no 80286 eram reservados, so utilizados para estender a denio bsica do descritor no 80386. Existe um endereo de base do segmento de 32 bits, um
DCA-FEEC-UNICAMP
134
campo de limite de segmento de 24 bits e vrios novos bits de acesso. Um endereo de base de segmento pode estar em qualquer ponto na faixa do 4 Gb. O limite de 24 bits especica o tamanho do segmento dependendo do bit de granularidade. Caso este bit esteja desativado, o limite denido em unidades de 1 byte at o mximo de 1 Mb. Caso o bit de granularidade esteja ativado o limite denido em unidades de 4 Kb at o mximo de 4 Gb. No caso de um sistema 80286 executando no 80386, ele sempre ter este bit desativado de modo que o limite seja interpretado como 16 bits e tendo a granularidade de 1 byte. Paginao Conforme visto no captulo 4, paginao uma tcnica de gerenciamento da memria virtual utilizando blocos de tamanho xo (pginas) em oposio aos segmentos de tamanho variado no caso dos sistemas segmentados. O 80386 utiliza a arquitetura de pginas para fornecer um mecanismo de alocao de memria fsica em um sistema contendo grandes segmentos. Como o 80386 permite segmentos que podem ser muito maiores do que 64 Kb, o gerenciamento da memria sem utilizao de uma tcnica do tipo paginao seria muito difcil, na medida em que o segmento deve residir em posies contguas da memria. Ainda, a permuta (swapping) de segmentos de tamanho variado para a memria secundria poderia resultar em um baixo desempenho do sistema. Desta forma, o esquema de paginao no 80386 permite que os segmentos residam em espaos no contnuos da memria e permite que a memria virtual seja gerenciada em termos de blocos pequenos e de tamanho xo. Em sees anteriores, referiu-se ao endereo de 32 bits resultante da traduo do endereo segmentado, como endereo fsico. No 80386, entretanto, este endereo chamado de endereo linear. Caso o 80386 no tenha o esquema de paginao habilitado, o endereo linear o mesmo que o endereo fsico. Entretanto, se o mecanismo estiver habilitado pelo bit de paginao no registrador CR0, ento o endero linear no mais igual ao endereo fsico. Neste caso, o endereo linear de 32 bits traduzido pela unidade de paginao do 80386 em um endereo fsico nal de 32 bits. Quando a paginao encontra-se habilitada, o 80386 divide a memria em unidades de 4 Kb de endereos contguos (pginas). O endereo linear neste caso traduz uma tupla ordenada que especica a tabela de pginas e o offset dentro da pgina. A gura 6.8 ilustra o formato do endereo linear. A unidade de paginao do 80386 realiza a traduo dinmica do endereo atravs de 2 mapeamentos diretos. A estrutura usada pela unidade de paginao para mapear endereos a tabela de pginas (ver captulo 4). Esta tabela constitui-se reside numa pgina de 1K entradas de 32 bits denominadas especicao de pgina. Dois nveis de tabelas de pginas so utilizadas para enderear uma pgina da memria. O primeiro nvel o diretrio de pginas, o qual localizado pelo registrador CR3. Este diretrio enderea at 1 K tabelas de pginas do segundo nvel. Uma tabela de pginas do segundo nvel enderea at 1 K pginas. Portanto, cada tabela de pgina do segundo nvel pode mapear 4 Mb (1 Kb * 4 Kb) de memria fsica e um diretrio de pginas pode mapear 1 K * 4 Mb = 4 Gb de memria fsica. A gura 6.9 ilustra como o 80386 converte um endereo linear em um endereo fsico. As entradas das tabelas de pginas possuem o mesmo formato sejam elas do primeiro ou do segundo nvel. Como cada pgina limitada a 4 Kb, a entrada da tabela de pgina (PTE) utiliza somente os 20 bits de mais alta ordem para designar uma pgina. Os outros 12 bits so utilizados para denir os atributos da pgina. A gura 6.10 ilustra o formato de uma entrada na tabela de
DCA-FEEC-UNICAMP
135
Figura 6.8: Endereo linear no 80386 pgina. O bit present indica se a PTE pode ser usada na traduo do endereo. Caso o bit presente no esteja ativado nas tabelas de pginas quando da ocorrncia de uma traduo de endereo, o 80386 envia uma falha de pgina. O tratador neste caso pode trazer a pgina do disco para a memria fsica e reiniciar a instruo. Isto pode ocorrer duas vezes para um dado acesso memria caso a tabela de pginas no se encontre presente em memria. O bit accessed e o bit dirty so usados em funo do uso de uma pgina. O 80386 ativa o bit accessed sempre que uma referncia memria tenta ler ou escrever em um endereo mapeado por um PTE. O bit dirty ativado somente quando se trata de escrita em um endereo mapeado por um PTE. O 80386 no desativa estes bits. O sistema operacional utiliza estes bits para determinar quais pginas devero ser transferidas para o disco quando uma demanda de memria fsica excede a memria disponvel. Proteo de Pginas O bit read/write e o bit user/supervisor so utilizados na proteo da pgina. O bit user/supervisor especica quais nveis de privilgio podem acessar a pgina. Caso o bit user/supervisor esteja desativado, a pgina trata-se de uma pgina de nvel supervisor; caso esteja ativado trata-se de uma pgina de usurio. O nvel corrente de privilgio (CPL) utilizado para determinar se o 80386 encontra-se executando no nvel de privilgio do supervisor ou no nvel de privilgio do usurio. Se o CPL 0, 1 ou 2, o 80386 encontra-se executando no nvel de privilgio do supervisor. Caso o CPL seja 3, a CPU encontra-se executando no nvel de privilgio do usurio. Quando o 80386 encontra-se executando no nvel de privilgio do supervisor, todas as pginas so endereveis; quando encontrase executando no nvel de privilgio do usurio, somente as pginas de usurio so endereveis. O bit read/write determina o tipo de acesso de uma dada pgina. Caso o bit esteja desativado, a pgina somente pode ser lida; caso o bit esteja ativado a pgina pode ser lida e escrita. Como as tabelas de pginas encontram-se na memria fsica, uma referncia a uma posio de memria requer vrios ciclos de memria para obter as informaes de endereo das estruturas de dados de paginao para realizar a traduo de endereo. Para aumentar o desempenho desta operao crtica o 80386 usa uma cache denominada TLB (translation lookaside buffer) para armazenar
DCA-FEEC-UNICAMP
136
tabela de pginas
pgina
pgina
....
Figura 6.9: Converso de endereo segmentado em linear e linear em fsico no 80386 em hardware as pginas mais recentemente utilizadas.
6.4.1 Sumrio
O microprocessador Intel 80386 possui um sosticado esquema de gerenciamento e proteo de memria quando comparado com seus antecessores. Esta sosticao permite a construo de sistemas operacionais modernos (Windows NT, OS/2 de 32 bits, etc) ou a migrao de sistemas que outrora necessitavam de plataformas de hardware dispendiosas, como o caso do UNIX.
DCA-FEEC-UNICAMP
137
31
12 11 DS 00 D A 00 U/S R/W P
legenda: P: bit "presente" R/W: bit escrita/gravao U/S bit "user/supervisor" A: bit de acesso D: bit "dirty" DS: disponvel para o sistema obs: endero da pgina virtual = nmero da pgina virtual