Академический Документы
Профессиональный Документы
Культура Документы
Maurcio F. Magalhes
FEEC - UNICAMP
Univ. Estadual de Campinas
Eleri Cardozo
FEEC - UNICAMP
Univ. Estadual de Campinas
Lus F. Faina
FACOM - UFU
Univ. Federal de Uberlndia
Maro de 2000
Campinas, SP - Brasil
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 classicados em dois grandes grupos:
software de sistema, que manipulam a operao do computador;
programas aplicativos, que resolvem problemas para o usurio.
O mais importante dos software de sistema o sistema operacional, que controla todos os
recursos do computador e proporciona a base de sustentao para a execuo de programas
aplicativos.
1.1
Um computador moderno composto de vrios subsistemas tais como processadores, memrias, discos, terminais, tas magnticas, interfaces de rede, impressoras, e outros dispositivos de
E/S. Neste ponto de vista, o sistema operacional tem a funo de gerenciar de forma adequada
estes recursos de sorte que as tarefas impostas pelos usurios sejam atendidas da forma mais
rpida e convel possvel. Um exemplo tpico o compartilhamento da unidade central de
processamento (CPU) entre as vrias tarefas (programas) em sistemas multiprogramados. O
sistema operacional o responsvel pela distribuio de forma otimizada da CPU entre as
tarefas em execuo.
1.2
Os sistemas operacionais tm evoludo com o passar dos anos. Nas prximas sees vamos
apresentar de forma sucinta este desenvolvimento.
A Primeira Gerao (1945-1955): Vlvulas e Plugs
A introduo do transistor mudou radicalmente o quadro. Computadores tornaram-se conveis e difundidos (com a fabricao em srie), sendo empregados em atividades mltiplas.
Pela primeira vez, houve uma separao clara entre projetistas, construtores, operadores, programadores e pessoal de manuteno. Entretanto, dado seu custo ainda elevado, somente
corporaes e universidades de porte detinham recursos e infra-estrutura para empregar os
computadores desta gerao.
Estas mquinas eram acondicionadas em salas especiais com pessoal especializado para
sua operao. Para executar um job (programa), o programador produzia um conjunto de
cartes perfurados (um carto por comando do programa), e o entregava ao operador que dava
entrada do programa no computador. Quando o computador completava o trabalho, o operador
devolvia os cartes com a impresso dos resultados ao programador.
A maioria dos computadores de 2a gerao foram utilizados para clculos cientcos e de
engenharia. Estes sistemas eram largamente programados em FORTRAN e ASSEMBLY. Sistemas operacionais tpicos2 eram o FMS (Fortran Monitor Systems) e o IBSYS (IBM's Operating
Systems).
2 Que
job
por vez
No incio dos anos 60, a maioria dos fabricantes de computadores mantinham duas linhas
distintas e incompatveis de produtos. De um lado, havia os computadores cientcos que eram
usados para clculos numricos nas cincias e na engenharia. Do outro, haviam os computadores
comerciais que executavam tarefas como ordenao de dados e impresso de relatrios, sendo
utilizados principalmente por instituies nanceiras.
A IBM tentou resolver este problema introduzindo a srie System/360. Esta srie consistia
de mquinas com mesma arquitetura e conjunto de instrues. Desta maneira, programas
escritos para uma mquina da srie executavam em todas as demais. A srie 360 foi projetada
para atender tanto aplicaes cientcas quanto comerciais.
No foi possvel para a IBM escrever um sistema operacional que atendesse a todos os
conitos de requisitos dos usurios. O resultado foi um sistema operacional (OS/360) enorme
e complexo comparado com o FMS.
A despeito do tamanho e problemas, o OS/360 atendia relativamente bem s necessidades
dos usurios. Ele tambm popularizou muitas tcnicas ausentes nos sistemas operacionais
de 2a gerao, como por exemplo a multiprogramao. Outra caracterstica apresentada foi
a capacidade de ler jobs dos cartes perfurados para os discos, assim que o programador os
entregasse. Dessa maneira, assim que um job terminasse, o computador iniciava a execuo do
seguinte, que j fra lido e armazenado em disco. Esta tcnica foi chamada spool (simultaneous
peripherical operation on line), sendo tambm utilizada para a sada de dados.
O tempo de espera dos resultados dos programas reduziu-se drasticamente com a 3a gerao
de sistemas. O desejo por respostas rpidas abriu caminho para o time-sharing, uma variao
da multiprogramao onde cada usurio tem um terminal on-line e todos compartilham uma
nica CPU.
Aps o sucesso do primeiro sistema operacional com capacidade de time-sharing (o CTSS)
desenvolvido no MIT, um consrcio envolvendo o MIT, a GE e o Laboratrio Bell foi formado
com o intuito de desenvolver um projeto ambicioso para a poca: um sistema operacional
que suportasse centenas de usurios on-line. O MULTICS (MULTiplexed Information and
Computing Service) introduziu muitas idias inovadoras, mas sua implementao mostrou-se
impraticvel para a dcada de sessenta. O projeto MULTICS inuenciou os pesquisadores da
Bell que viriam a desenvolver o UNIX uma dcada depois.
A Quarta Gerao (1980-): Computadores Pessoais e Estaes de Trabalho
Com o desenvolvimento de circuitos integrados em larga escala (LSI), chips contendo milhares de transistores em um centmetro quadrado de silcio, surgiu a era dos computadores pessoais
e estaes de trabalho. Em termos de arquitetura, estes no diferem dos minicomputadores
da classe do PDP-11, exceto no quesito mais importante: preo. Enquanto os minicomputadores atendiam companhias e universidades, os computadores pessoais e estaes de trabalho
passaram a atender usurios individualmente.
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 tem dominado o mercado: MS-DOS (seguido do MS-Windows) para
os computadores pessoais e UNIX (com suas vrias vertentes) para as estaes de trabalho.
Processos
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 utilizado 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 denominada 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.
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 sejam 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.
Interpretador de Comandos (Shell)
Dada sua larga aceitao, o sistema operacional UNIX ser utilizado como referncia neste
curso. O sistema dividido em duas partes:
programas e servios: shell, mail, vi, date, etc;
ncleo
(shell) ;
man
sh
nroff
a.out
cpp
find
Ncleo
comp
make
cc
Hardware
who
as
date
ld
wc
vi
ed
grep
8
/
usr
bin
5bin
tmp
5include 5lib
etc
pub
emacs tex
dev
X11
tty00
tty01
sh ed vi
#include <stdio.h>
#include <sys/fcntl.h>
#include <sys/stat.h>
char buffer[512];
void copy(int old, int new)
{
int count;
while((count = read(old, buffer, sizeof(buffer))) > 0)
write(new, buffer, count);
}
main(int argc, char *argv[])
{
*/
*/
O Ambiente de Processamento
Um programa um arquivo executvel, e um processo uma instncia do programa em execuo. No UNIX vrios processos podem executar simultneamente, sendo que vrias instncias
de um mesmo programa podem existir ao mesmo tempo no sistema.
o programa abaixo ilustra os comandos fork, execl, wait e exit (implcito) utilizados na
criao e sincronizao de processos.
/*
#include <stdio.h>
#include <sys/wait.h>
#include <sys/time.h>
main(int argc, char *argv[])
{
int pid;
struct timeval tv1, tv2;
*/
10
*/
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 situados 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
comando interno do
shell ;
shell.
O ambiente tem como losoa permitir aos usurios o desenvolvimento de programas pequenos e modulares que possam ser usados como blocos primitivos na construo de programas
mais complexos. Existem duas formas de compor programas no UNIX:
redirecionamento de entrada/sada (E/S): os processos possuem, convencionalmente, acesso a trs tipos de arquivos padro: entrada, sada e erro.
Processos que so executados a partir de um terminal possuem, tipicamente, o terminal
como arquivo de entrada, sada e erro. Estes arquivos podem ser redirecionados independentemente. Exemplo:
11
ls > output: redireciona a sada padro para o arquivo chamado output no diretrio atual;
mail mjb < carta: faz com que o programa mail (correio eletrnico) leia o contedo da mensagem do arquivo carta, e no do terminal.
pipe: permite que um uxo de dados seja estabelecido entre um processo produtor e um
processo consumidor.
Processos podem redirecionar a sua sada padro para um pipe a ser lido por outro
processo que tenha redirecionado a sua entrada padro para o mesmo pipe. Exemplo:
12
Aspectos do Hardware
O UNIX permite que dispositivos tais como perifricos de E/S ou o relgio do sistema
interrompam a CPU assincronamente. Geralmente, o hardware dene prioridades para os
dispositivos de acordo com a ordem na qual as interrupes devero ser atendidas caso ocorram
simultaneamente.
Uma condio de exceo refere-se ocorrncia de um evento no esperado provocado pelo
processo. Alguns destes eventos podem ser: endereamento ilegal da memria, execuo de
instruo privilegiada, diviso por zero, etc.
As excees podem ser caracterizadas como algo que ocorre no curso 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 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
13
Erros de Hardware
Prioridade Alta
Relgio
Disco
Dispositivos de Rede
Terminais
Prioridade Baixa
Interrupo de Software
Uma viso mais detalhada da arquitetura do ncleo do UNIX mostrada na gura 1.4.
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 sub-sistema de controle dos processos. O sub-sistema de arquivos acessa os dados nos
arquivos atravs de um mecanismo de buerizao 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 buerizao.
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 tenham 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
14
Programas do usurio
bibliotecas
traps
Nvel do usurio
Nvel do ncleo
comunicao
interprocessos
subsistema de arquivos
subsistema
de controle
de processos
escalonador
buffer cache
gerenciamento
de memria
caractere
bloco
drivers de dispositivos
controle do hardware
Nvel do ncleo
Nvel de hardware
hardware
A representao interna de um arquivo dado por um inode. Este contm uma descrio
do layout no disco do arquivo de dado, assim como outras informaes tais como: proprietrio
do arquivo, permisses de acesso e instantes de acesso.
Todo arquivo possui um inode, o qual alocado quando da sua criao, podendo possuir,
entretanto, vrios nomes, todos mapeados no mesmo inode. Cada um destes nomes denominase link. Os inodes so armazenados no sistema de arquivos e so lidos em uma tabela de inodes
(em memria) quando da manipulao dos respectivos arquivos.
Duas outras estruturas de dados so importantes: tabela de arquivo (TA) e tabela descritora
de arquivo do usurio (TDAU), sendo que TA uma estrutura global ao ncleo enquanto uma
TDAU criada para cada processo. Quando da criao/abertura de um arquivo, o ncleo
associa uma entrada de cada uma das tabelas ao inode correspondente ao arquivo, permitindo
que as entradas destas trs estruturas -TA, TDAU e inode - mantenham o estado do arquivo,
assim como, os direitos de acesso ao arquivo.
TA
TDAU
15
A gura 1.5 ilustra o uso das tabelas TDAU, TA e de inodes. Note nesta gura um link
onde dois campos na TDAU apontam para o mesmo campo na TA.
TDAU
TA
Tabela de Inodes
super
bloco
lista de inodes
blocos de dados
16
Processos
variveis locais
17
direo do
crescimento
da pilha
end. do quadro 2
end. de retorno apos
chamada do write
parmetros do write
(new, buffer, count)
quadro 3
call write
variveis locais
(count)
end. do quadro 1
end. de retorno aps
chamada do copy
parmetros do copy
(old, new)
variveis locais
(fdold, fdnew)
quadro 2
call copy
end. do quadro 0
end. de retorno aps
chamada do main
parmetros do main
(argc, argv)
quadro 1
call main
Pilha do Usurio
processamento da
chamada white
Pilha do Ncleo
quadro 0
incio
quadro 0
interface das chamadas de sistema
copy
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 endereamento 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. Quando um processo evoca fork o ncleo duplica o espao de endereamento
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.
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;
18
Tabela de Regies
rea U
memria primria
Tabela de Processos
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 que posteriormente ele possa recuperar o contexto do processo e continuar a sua 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
O ciclo de vida de um processo pode ser representada por um conjunto de estados (gura
1.9):
executando no modo usurio;
executando no modo ncleo;
19
pronto;
bloqueado (dormindo).
chamada de sistema
ou interrupo
Executando em
Modo Ncleo
Executando em
Modo Usurio
retorno
interrupo/retorno
2
escalonado
aguardando
evento
3
evento
Bloqueado
Pronto
Captulo 2
Processos
2.1
Introduo
Modelo de Processos
A maioria dos computadores modernos so capazes de realizar diversas atividades em paralelo. Enquanto executa um programa do usurio, o computador pode ler um disco ou utilizar a
impressora. Em sistemas multiprogramados, a CPU comutada de programa a programa em
perodos da ordem de milisegundos, dando ao usurio a impresso de paralelismo.
O gerenciamento de atividades paralelas difcil de ser implementado com ecincia. Entretanto, projetistas de sistemas operacionais ao longo dos anos vm desenvolvendo modelos
objetivando tornar esta tarefa mais simples.
No modelo mais empregado atualmente, todos os programas executveis no computador,
muitas vezes incluindo subsistemas do sistema operacional, esto organizados na forma de processos. Conceitualmente, cada processo tem uma prpria CPU virtual (tabela armazenando
contedo de registradores, contador de programa, etc). A posse da CPU real passada periodicamente de processo a processo. O sistema pode ser visto como uma coleo de processos
sendo executados em pseudo paralelismo1. Conforme denido anteriormente, a habilidade de
executar mltiplos programas em uma nica CPU denomina-se multiprogramao.
Em sistemas multiprogramados, a velocidade de execuo de um processo funo da
quantidade de processos competindo pela CPU. Isto implica que o tempo de execuo de um
processo varia a cada nova execuo, dependadendo da carga da mquina. Assim sendo,
processos no devem ser programados com consideraes intrnsecas de tempo. Quando so
requeridas consideraes de tempo real, medidas especiais devem ser tomadas para assegurar
que estas iro ocorrer.
1 Paralelismo real
2.1 Introduo
2.1.2
21
que regies crticas delimitando diferentes recursos podem ser executadas por diferentes processos ao
mesmo tempo.
2.1 Introduo
2.1.3
22
Nesta seo analisaremos algumas propostas para garantir excluso mtua nas regies crticas, no permitindo que mais de um processo possam manipular um recurso compartilhado
ao mesmo tempo. Em todas, o processo que est tentanto acessar uma regio crtica em execuo por outro processo permanece em espera ocupada, isto , competindo pela CPU mas sem
avanar no seu processamento. Por esta razo, os mtodos que empregam espera bloqueada
so os mais utilizados na prtica.
Desabilitar Interrupes
Uma segunda tentativa leva-nos a uma soluo por software. Considere uma varivel simples
e compartilhada3 LOCK, inicialmente igual a 0. Quando um processo deseja entrar em sua
regio crtica ele primeiro testa o LOCK. Se for 0, o processo altera para 1 e executa a regio
crtica. Se for 1 ele espera at que seja 0. Embora parea uma boa soluo, o que ir ocorrer
se ambos testam uma varivel de valor 0 ao mesmo tempo ?
Alternncia Estrita
Esta proposta dene uma varivel TURN, inicialmente 0. Ela indica quem deve esperar e
quem pode entrar na seo crtica. Se TURN for 0, o processo 0 pode entrar na regio crtica.
Ao sair, deve passar o valor de TURN para 1. Quando TURN 1 o processo 1 pode entrar na
seo crtica. Ao sair passa o valor de TURN para 04 .
Este algoritmo garante a mtua excluso. Entretanto, os processos estritamente se alternam
na posse do recurso compartilhado. Isto faz com que um processo necessite aguardar o acesso
a um recurso compartilhado por todos os demais at que chegue novamente a sua vez. O que
ocorre quando o nmero de acessos for diferente entre os processos ?
Soluo de Peterson
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.
3 Uma
4 Este
> 2.
2.1 Introduo
23
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).
2.1.4
Sero apresentados a seguir alguns mecanismos de garantia de mtua excluso que bloqueiam os processos quando tentam executar uma regio crtica ocupada. So mais ecientes que
os anteriores, posto que processos bloqueados no competem pela CPU.
Sleep e Wakeup
Um dos mtodos mais simples consiste do par sleep e wakeup. sleep uma chamada de
sistema que muda o estado de um processo em execuo para bloqueado. Um processo bloqueado volta a tornar-se ativo quando outro o desbloqueia atravs da chamada wakeup. O mtodo
o mesmo que emprega variveis LOCK operadas por instrues TSL, exceto que quando a
varivel apresenta valor 1, o processo executa sleep. O processo que altera o valor de LOCK
para 0 ao sair da regio crtica o responsvel por ativar um processo bloqueado (via wakeup ).
Infelizmente, com o emprego de apenas sleep e wakeup fcil demonstrar e existncia de um
estado onde todos os processos encontram-se bloqueados. Esta situao denominada deadlock.
Semforos
So variveis inteiras que contam o nmero de vezes que a operao wakeup tenha sido
realizada. Duas operaes, DOWN e UP (generalizaes de sleep e wakeup ) so denidas. A
operao DOWN executada no incio da regio crtica, enquanto UP executada no nal. O
semforo consiste de um contador iniciado em 1 e uma lista de processos aguardando liberao
para executar a regio crtica protegida pelo semforo.
A operao DOWN decrementa o contador do semforo de uma unidade e verica seu valor.
Se for igual a 0, retorna (fazendo com que o processo entre na regio crtica). Se o valor for
menor que 0, o processo bloqueado e adicionado lista de processos aguardando liberao. A
operao UP incrementa o valor do semforo. Se um ou mais processos estiverem bloqueados
sobre aquele semforo, um deles escolhido da lista pelo sistema para completar a operao
DOWN. Neste caso o sistema remove-o da lista e emite-lhe um sinal de wakeup ).
As operaes com semforos so atmicas implementadas com instrues TSL.
Contadores de Evento
v.
2.1 Introduo
24
Comunicao Inter-processos
Muitos autores consideram os mecanismos de mtua excluso apresentados acima como formas de processos se comunicarem. Entretanto, preferimos considerar tais mecanismos como de
sincronizao inter-processos, usando o termo comunicao apenas quando ocorrer intercmbio
de informao entre processos. Sincronizao so procedimentos de controle, normalmente usados para garantir mtua excluso, e utilizados para geranciar a competio entre os processos.
Comunicao, por sua vez, visa promover a cooperao entre os processos.
Passagem de Mensagem
Este mtodo de comunicao entre processos usa duas chamadas de sistema: send e receive.
send(destino, mensagem): envia mensagem a um processo destino.
receive(fonte, mensagem): recebe mensagem de um processo fonte.
Destino e fonte de mensagens so buers alocados pelos processos para ns de envio e
recepo de mensagens. Mensagens so estruturas tipadas ou no cujo contedo interpretado
unicamente pelos processos emissor e receptor da mensagem.
Compartilhamento de Dados
25
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 servidor6 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.
2.2
Escalonamento de Processos
Quando mais de um processo estiver ativo (pronto para executar), cabe ao sistema operacional decidir qual ter a posse da CPU. A parte do sistema operacional que toma esta deciso
chamada escalonador e o algoritmo utilizado o algoritmo de escalonamento.
Vrios critrios devem ser observados por um algoritmo de escalonamento:
1.
2.
3.
4.
5.
Este o mais antigo e simples algoritmo de escalonamento. Cada processo executado por
um intervalo de tempo (quantum). Se o processo ainda estiver executando ao nal do quantum,
ele suspenso e a CPU alocada a outro processo. Se o processo acabar ou for bloqueado
antes do nal do quantum, a CPU tambm passada a outro processo. A nica questo a ser
analisada o tamanho do quantum. Se for muito pequeno, diminui a ecincia da CPU, pois a
alocao da CPU para outro processo implica um certo overhead. Se for muito grande, degrada
a resposta para os processos interativos.
6 Ou
26
O algoritmo Round Robin faz a considerao que todos os processos so de igual importncia. Certas aplicaes, como controle de processos industriais, demandam um algoritmo de
escalonamento com prioridades. A idia bsica que cada processo tem uma prioridade e processos com prioridades superiores devem ser executados primeiro. Para prevenir que processos
de alta prioridade executem indenidamente, o escalonador, via de regra, diminui a prioridade
dos processos com o aumento de seu respectivo tempo de execuo.
Mltiplas Filas
Este um algoritmo que dene classes com prioridades. Processos na classe de menor
prioridade so executados por um quantum. Processos na classe seguinte, por dois quanta. Na
prxima classe por 4 quanta, e assim por diante. Quando um processo utiliza todos os quanta a
ele alocados, o mesmo interrompido e sua classe tem a prioridade diminuda. Este algoritmo
diminui o nmero de comutaes da CPU entre os processos ativos.
Tarefas Pequenas Primeiro
Este algoritmo indicado para aplicaes no interativas, onde o tempo mdio de execuo
conhecido a priori. O algoritmo dene que as tarefas menores devem ser executadas primeiro.
Prova-se que esta poltica minimiza o tempo mdio de espera das tarefas.
Algoritmo Policy-Driven
Este algoritmo particiona a CPU de forma equnime entre os usurios (no entre os processos). O algoritmo dene que se existirem n usurios ligados ao sistema, e cada usurio dever
receber 1/n do poder da CPU. Para isto, o sistema deve manter informaes do tempo de
CPU que cada usurio j disps desde que entrou no sistema, e do instante de tempo que cada
usurio ligou-se ao sistema.
Escalonamento em Dois Nveis
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.
2.3
27
Transies de Estado
swapping );
retorno
"Preemptado"
9
exit
Terminado
perda da CPU
Executando em
Modo Ncleo
interrupo/retorno
escalonado
aguardando
evento
Bloqueado
em Memria
evento
Pronto
em Memria
memria abundante
"swap out"
"swap in"
"swap out"
fork
memria escassa
Bloqueado
em Memria
Secundria
evento
6
Pronto
em Memria
Secundria
28
29
30
processos
swapper
no passvel
de interrupo
passvel de
interrupo
limiar de prioridade
em modo ncleo
nvel de usurio 0
nvel de usurio 1
nvel de usurio N
prioridades
em modo
usurio
31
a nica maneira do novo processo conhecer o valor destes descritores atravs da passagem de
parmetros via argc e argv.
32
processo pai
rea U
Tabela de Arquivos
pregion
arquivos abertos
dados
do pai
diretrio corrente
diretrio raiz
pilha
do pai
pilha do ncleo
texto
(compartilhado)
processo filho
rea U
Tabela de Inodes
pregion
arquivos abertos
dados
do filho
diretrio corrente
diretrio raiz
pilha
do filho
pilha do ncleo
/*
*/
33
...
*/
/*
*/
/* prog1 */
main(int argc, char *argv[])
{
int fd1, fd2;
/* acessa descritores abertos pelo executor do exec */
sscanf(argv[1], "%d", &fd1);
sscanf(argv[2], "%d", &fd2);
...
}
*/
/*
Interrupo de Processos
Processos no UNIX podem ter sua execuo alterada assincronamente por ao de um outro
processo (ou do usurio, atravs do shell ). Esta ao referida como o envio de um sinal. Sinais
podem ser enviados a um processo para notic-lo:
de uma requisio de mudana de estado (ex: morte de um processo via chamada kill);
do trmino do processo lho;
da ocorrncia de excees (ex: trap aritmtico);
de situaes irrecuperveis (ex: recursos exauridos durante o processamento de um exec);
da ocorrncia de erros inesperados (ex: utilizao de um
pipe quebrado);
"C );
breakpoint ).
signicado
SIGHUP
SIGINT
SIGILL
SIGFPE
SIGKILL
SIGSEGV
SIGSYS
SIGALRM
SIGSTOP
SIGCONT
SIGCHLD
hang-up
interrupo
instruo ilegal (trap)
exceo aritmtica (trap)
trmino forado
violao de segmentao (trap)
argumento invlido em chamada de sistema
alarme de relgio
suspeno da execuo
continuao da execuo
mudane. status de proceso lho
34
*/
35
c = getchar();
if(c == 's') exit(0);
}
main()
{
signal(SIGINT, ger);
...
}
*/
/*
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
default. Caso
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.
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 em uma condio vulnervel, pois a ao default que ser executada face a ocorrncia de um novo sinal de mesmo
tipo.
2.6
Nesta seo descreveremos trs mecanismos de comunicao inter-processos (pipes, mensagens e memria compartilhada), e um de sincronizao inter-processos (semforos). Pipes
so disponveis em qualquer verso de UNIX, enquanto os demais esto presentes apenas nas
verses compatveis com o System V.
36
Pipes
main()
{
int fd[2];
char buff[32];
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]);
*/
37
exit(0);
}
/*
*/
Mensagens
struct mensagem {
int tipo;
/* tipo da mensagem */
char conteudo[1024]; /* conteudo da mensagem (1K max.) */
};
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.
Memria Compartilhada
38
controle (criao e acesso). Como msgget, esta chamada retorna um identicador local da
regio, criando-a caso inexista.
Uma vez acessada, um processo associa a regio compartilhada em seu prprio espao de
endereamento. Para tal, utiliza-se a chamada de sistema shmat que possui trs parmetros:
o identicador local da regio compartilhada, o endereo local que apontar para a regio; e
parmetros de controle (se a regio deve ser considerada de leitura apenas, por exemplo).
O procedimento inverso, isto , a desassociao de uma regio compartilhada de um endereamento local se d com a chamada de sistema shmdt. Esta chamada possui um nico
parmetro: o endereo local previamente associado a uma regio compartilhada.
Finalmente, a chamada shmctl empregada para obter e alterar o status de uma regio
compartilhada (permisses, desativao, etc). similar a msgctl.
Deve-se observar que o mecanismo de memria compartilhada no necessita operaes especiais para a manipulao de dados. Como a regio mapeada em um endereo local, leituras
e escritas neste endereo se processam com os comandos de associao e cpia binria providos
pelas linguagem C.
Deve-se observar ainda, que este mecanismo de comunicao sempre assncrono, e pode
suportar comunicao do tipo de-um-para-muitos (um processo escreve na memria compartilhada e vrios outros lem).
Memria compartilhada implementada pelo ncleo atravs de uma tabela de regies alocadas por shmget. Esta tabela aponta para a tabela de regies de memria mantida pelo
ncleo. Aps a chamada shmat, a tabela de regies do processo aponta para a respectiva regio
mantida pelo ncleo (gura 2.4).
Tabela de
Memria
Compartilhada
Tabela de Regies
pregion
(processo 1)
Tabela de Processos
processo 1
processo 2
pregion
(processo 2)
memria principal
39
/*
*/
#include
#include
#include
#include
<stdio.h>
<sys/types.h>
<sys/ipc.h>
<sys/sem.h>
#define KEY 67
extern char *shmat();
main()
{
char *buff;
char *poema[16];
int i, sh;
/* cria area compartilhada */
sh = shmget(KEY, 1024, 0777 | IPC_CREAT);
/* 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]
=
=
=
=
=
=
=
=
#include
#include
#include
#include
<stdio.h>
<sys/types.h>
<sys/ipc.h>
<sys/sem.h>
#define KEY 67
extern char *shmat();
main()
40
{
char *buff;
char *poema[16];
int i, sh;
/* acessa area compartilhada */
sh = shmget(KEY, 1024, 0777);
if(sh < 0)
{
printf("\nArea compartilhada nao criada\n");
exit(0);
}
/* 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]);
/*
*/
Semforos
struct sembuf {
short sem_num;
short sem_op;
short sem_flag;
};
/* indice do semaforo */
/* operacao requisitada */
/* controle da operacao */
41
negativo: caso a soma de sem_op com o valor do semforo seja no negativa, some
sem_op ao valor do semforo e retorne. Caso seja negativa, bloqueie.
positivo: some
#include
#include
#include
#include
*/
<stdio.h>
<sys/types.h>
<sys/ipc.h>
<sys/sem.h>
/* cria um semaforo */
int DefSem(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_t key)
{
int semid;
semid = semget(key, 1, 0777);
return(semid);
}
/* define operacao DOWN */
void DOWN(int semid)
{
struct sembuf psem[2];
psem[0].sem_num = 0;
psem[0].sem_op = -1;
psem[0].sem_flg = SEM_UNDO;
semop(semid, psem, 1);
}
/* define operacao UP */
void UP(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);
}
main()
{
char *poema[16];
int i;
int semid;
semid = GetSem(13);
if(semid < 0)
{
printf("\nSemaforo nao criado !\n");
exit(0);
}
poema[0]
poema[1]
poema[2]
poema[3]
poema[4]
poema[5]
poema[6]
poema[7]
=
=
=
=
=
=
=
=
while(1)
{
DOWN(semid);
/* entrada na Regiao Critica */
for(i = 0; i < 8; i++)
{
printf("\n%s", poema[i]);
sleep(1);
42
}
/*
43
}
printf("\n\n");
UP(semid);
/* saida da Regiao Critica */
}
*/