You are on page 1of 44

Universidade Estadual de Campinas - UNICAMP

Faculdade de Engenharia Eltrica e de Computao

Introduo aos Sistemas Operacionais

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

O que um Sistema Operacional ?

A maioria de usurios de computador tm alguma experincia com sistemas operacionais,


mas difcil denir precisamente o que um sistema operacional. Parte do problema decorre
do fato do sistema operacional realizar duas funes bsicas que, dependendo do ponto de vista
abordado, uma se destaca sobre a outra. Estas funes so descritas a seguir.
O Sistema Operacional como uma Mquina Virtual

A arquitetura1 da maioria dos computadores no nvel da linguagem de mquina primitiva


e difcil de programar, especicamente para operaes de entrada e sada. prefervel para um
programador trabalhar com abstraes de mais alto nvel onde detalhes de implementao das
abstraes no so visveis. No caso de discos, por exemplo, uma abstrao tpica que estes
armazenam uma coleo de arquivos identicados por nomes simblicos.
O programa que esconde os detalhes de implementao das abstraes o sistema operacional. A abstrao apresentada ao usurio pelo sistema operacional simples e mais fcil de
usar que o hardware original.
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.
1 Conjunto

de instrues, organizao de memria, entrada/sada (E/S), estrutura de barramento, etc.

1.2 Histria dos Sistemas Operacionais

O Sistema Operacional como um Gerenciador de Recursos

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

Histria dos Sistemas Operacionais

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

Aps muitos esforos mal sucedidos de se construir computadores digitais antes da 2a


guerra
mundial, em torno da metade da dcada de 1940 alguns sucessos foram obtidos na construo de
mquinas de clculo empregando-se vlvulas e rels. Estas mquinas eram enormes, ocupando
salas com racks que abrigavam dezenas de milhares de vlvulas (e consumiam quantidades
imensas de energia).
Naquela poca, um pequeno grupo de pessoas projetava, construia, programava, operava
e mantinha cada mquina. Toda programao era feita absolutamente em linguagem de mquina, muitas vezes interligando plugs para controlar funes bsicas da mquina. Linguagens
de programao eram desconhecidas; sistemas operacionais idem. Por volta de 1950 foram
introduzidos os cartes perfurados aumentando a facilidade de programao.
A Segunda Gerao (1955-1965): Transistores e Processamento em Batch

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

eram capazes de gerenciar apenas um

job

por vez

1.2 Histria dos Sistemas Operacionais

A Terceira Gerao (1965-1980): Circuitos Integrados e Multiprogramao

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.

1.3 Conceitos Bsicos em Sistemas Operacionais

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 em um 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, em um 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.
1.3

Conceitos Bsicos em Sistemas Operacionais

Processos

Um conceito fundamental em sistemas operacionais o de processo ou tarefa. Um processo


(s vezes chamado de processo sequencial) basicamente um programa em execuo, sendo
uma entidade ativa que compete por recursos (principalmente CPU) e interage com outros
processos.
Em um instante qualquer, um processo est em um determinado estado. Estes estados
podem ser:
executando (usando a CPU para executar as instrues do programa);
bloqueado (aguardando recursos, que no CPU, indisponveis no momento);
ativo (aguardando apenas CPU para executar).
Um processo em execuo passa por um sequncia de estados ordenados no tempo. Um
processo possui duas importantes propriedades:
o resultado da execuo de um processo independe da velocidade com que executado;
se um processo for executado novamente com os mesmos dados, ele passar precisamente
pela mesma sequncia de instrues e fornecer o mesmo resultado.
Estas propriedades enfatizam a natureza sequencial e determinstica de um processo. O
processo sequencial denido pelo resultado de suas instrues, no pela velocidade com que
as instrues so executadas.
Sistemas Multitarefas e Multiusurios

Como j mencionado, um programa em execuo chamado de processo ou tarefa. Um


sistema operacional multitarefa se distingue pela sua habilidade de suportar a execuo concorrente de processos sobre um processador nico, sem necessariamente prover elaborada forma
de gerenciamento de recursos (CPU, memria, etc).

1.3 Conceitos Bsicos em Sistemas Operacionais

Sistemas operacionais multiusurios permitem acessos simultneos ao computador atravs


de dois ou mais terminais de entrada. Embora frequentemente associada com multiprogramao, multitarefa no implica necessariamente em uma operao multiusurio. Operao
multiprocessos sem suporte de multiusurios pode ser encontrado em sistemas operacionais de
alguns computadores pessoais (por exemplo, Windows'98) avanados e em sistemas de temporeal.
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 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)

O interpretador de comando um processo que perfaz a interface do usurio com o sistema


operacional. Este processo l o teclado a espera de comandos, interpreta-os e passa seus par-

1.4 O Sistema Operacional UNIX

metros ao sistema operacional. Servios como login/logout, manipulao de arquivos, execuo


de programas, etc, so solicitados atravs do interpretador de comandos.
Chamadas de Sistema (System Calls)

Assim como o interpretador de comandos a interface usurio/sistema operacional, as


chamadas do sistema constituem a interface programas aplicativos/sistema operacional. As
chamadas do sistema so funes que podem ser ligadas com os aplicativos provendo servios
como: leitura do relgio interno, operaes de entrada/sada, comunicao inter-processos, etc.
1.4

O Sistema Operacional UNIX

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

(kernel) : Prov suporte aos programas e servios.

Desenvolvido nos Laboratrios da Bell em meados da dcada de setenta, o sistema UNIX


inicialmente atendia as necessidades especcas do grupo de Cincia da Computao da Bell.
A razo da aceitao do UNIX explicada pelos atributos abaixo:
escrito em linguagem de alto nvel, o que facilita seu transporte para diferentes plataformas;
interface simples para com o usurio

(shell) ;

fornece primitivas que permitem o desenvolvimento de programas complexos a partir de


programas mais simples;
estrutura hierrquica de arquivos;
formatao de arquivos baseada no conceito de

stream (cadeia) de bytes;

interfaceamento simples e consistente com os dispositivos perifricos;


multiusurio/multiprogramado;
esconde a arquitetura do harware, permitindo que um programa execute em mltiplas
plataformas.
Programas interagem com o ncleo do sistema operacional atravs da evocao de um
conjunto bem denido de chamadas de sistema.
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.

1.4 O Sistema Operacional UNIX

outros programas aplicativos

man

sh

nroff

a.out

cpp

find

Ncleo
comp

make

cc

Hardware
who

as

date

ld
wc

vi
ed

grep

outros programas aplicativos

Fig. 1.1: Arquitetura do sistema operacional UNIX


O Sistema de Arquivos

O sistema de arquivos do UNIX caracterizado por:


estrutura hierrquica;
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.
Ainda com relao a esta gura temos:
/: diretrio raiz;
no-folhas: diretrios de arquivos;
folhas: diretrios ou arquivos regulares ou arquivos especiais de dispositivos.

1.4 O Sistema Operacional UNIX

8
/

usr

bin

5bin

tmp

5include 5lib

etc

hosts passwd exportfs

pub

emacs tex

dev

X11

tty00

tty01

sh ed vi

Fig. 1.2: Organizao hierrquica do sistema de arquivos


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 pelo sistema operacional
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.
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(int old, int new)
{
int count;
while((count = read(old, buffer, sizeof(buffer))) > 0)
write(new, buffer, count);
}
main(int argc, char *argv[])
{

*/

1.4 O Sistema Operacional UNIX

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]);
exit(1);
}
/* chama copy */
copy(fdold, fdnew);
exit(0);
}
/*

*/

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;

*/

1.4 O Sistema Operacional UNIX

10

double t1, t2;


pid = fork();
/* fork */
if(pid == 0) execl(argv[1], NULL);
/* processo filho */
gettimeofday(&tv1, NULL);
/* processo pai continua ... */
t1 = (double)(tv1.tv_sec) + (double)(tv1.tv_usec)/ 1000000.00;
wait(NULL);
/* sincroniza com o termino do filho */
gettimeofday(&tv2, NULL);
t2 = (double)(tv2.tv_sec) + (double)(tv2.tv_usec)/ 1000000.00;
printf("\nO tempo de execucao de %s eh: %lf\n", argv[1], (t2 - t1));
}
/*

*/

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 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. De fato, o UNIX disponibiliza vrios shells
para o usurio, cada qual com determinados recursos (por exemplo, capacidade de edio das
linhas de comando e capacidade de completar nomes de arquivos).
Modularidade no Ambiente UNIX

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:

1.4 O Sistema Operacional UNIX






11

ls: lista todos os arquivos do diretrio corrente na sada padro;

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:


grep main a.c b.c c.c


Lista as ocorrncias da palavra main nos arquivos a.c, b.c e c.c.

grep main a.c b.c c.c j wc -l


Submete a sada do comando anterior a um utilitrio que conta o nmero de linhas
de um arquivo (wc, opo -l).

Servios do Sistema Operacional

Dentre os servios suportados pelo ncleo do UNIX temos:


controle de execuo dos processos: criao, terminao, suspenso, comunicao entre
processos;
escalonamento (ordem de acesso CPU) de processos;
alocao de memria principal para execuo dos processos. Caso a memria esteja escassa, o ncleo move temporariamente processos da memria primria para a secundria3 ;
alocao de memria secundria para armazenamento/recuperao eciente dos dados do
usurio (este servio constitui o sistema de arquivos);
acesso controlado aos dispositivos perifricos tais como terminais, tas, discos, redes, etc.
O ncleo fornece estes servios de forma transparente. Exemplo:
o ncleo deteta que um dado arquivo um arquivo regular ou um dispositivo, mas esconde
esta distino dos processos do usurio;
o ncleo formata os dados em um arquivo para ns de armazenamento interno, entretanto,
este formato escondido do usurio, sendo retornado para este um stream no formatado
de bytes.
3 Esta

transferncia pode ser do processo completo (swapping), ou de segmentos do processo (paginao).

1.4 O Sistema Operacional UNIX

12

Aspectos do Hardware

A execuo dos processos do usurio no ambiente UNIX dividida em 2 nveis: usurio


e ncleo. Quando um processo executa uma chamada do sistema, o modo de execuo do
processo muda do modo usurio para o modo ncleo. As diferenas entre estes 2 modos so:
processos no modo usurio podem acessar as suas instrues e dados, mas no as instrues e dados do ncleo ou de qualquer outro processo. Processos no modo ncleo podem
acessar endereos do ncleo ou do usurio;
algumas instrues so privilegiadas e resultam em erro quando executadas no modo
usurio.
Interrupes e Excees

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 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 estruturas de dados internas, isto porque o tratamento da interrupo pode
interferir na atualizao das estruturas 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 enleiradas para tratamento a posteriori.
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

1.5 Arquitetura do Sistema Operacional UNIX

13

Erros de Hardware
Prioridade Alta
Relgio
Disco
Dispositivos de Rede
Terminais
Prioridade Baixa
Interrupo de Software

Fig. 1.3: Nveis de interrupo denidas pelo UNIX


endereo fsico da mquina. Este mapeamento depende das caractersticas do hardware da
mquina.
1.5

Arquitetura do Sistema Operacional UNIX

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

1.5 Arquitetura do Sistema Operacional UNIX

14

Programas do usurio
bibliotecas

traps
Nvel do usurio
Nvel do ncleo

interface das chamadas de sistema

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

Fig. 1.4: Arquitetura do ncleo do sistema operacional UNIX


processos.
Uma Viso do Sistema de Arquivos

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

mantm o oset, no arquivo correspondente, do prximo byte a ser lido/escrito, assim


como, os direitos de acesso do processo;

TDAU

identica todos os arquivos abertos para o processo.

1.5 Arquitetura do Sistema Operacional UNIX

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

Fig. 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

Fig. 1.6: Estrutura do sistema de arquivos


bloco de boot : contm o cdigo do
sistema operacional;

bootstrap que lido na mquina quando da partida do

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;
bloco de dados: contm arquivos e dados administrativos. Um bloco de dados s pode
pertencer a um nico arquivo do sistema.

1.5 Arquitetura do Sistema Operacional UNIX

16

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.
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.

1.5 Arquitetura do Sistema Operacional UNIX

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

Fig. 1.7: Estado das pilhas para o programa

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;

1.5 Arquitetura do Sistema Operacional UNIX


pregion

18
Tabela de Regies

rea U

memria primria
Tabela de Processos

Fig. 1.8: Estruturas de dados associadas ao controle dos processos


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 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;

1.5 Arquitetura do Sistema Operacional UNIX

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

Fig. 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 interprocessos.
2.1.1

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

obtido apenas com a utilizao de mltiplas CPUs.

2.1 Introduo

2.1.2

21

Concorrncia e Regies Crticas

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 sejam 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.
A chave para prevenir problemas em reas compatilhadas proibir que mais de um processo
leia ou escreva dados compartilhados ao mesmo tempo, ou seja, deve-se garantir a mtua
excluso. Se for garantido que nenhum par de processos estejam executando ao mesmo tempo
uma regio crtica delimitando um mesmo recurso compartilhado, inconsistncias so evitadas2 .
Embora este quesito evite inconsistncias, o mesmo no garante ecincia na utilizao dos
recursos compartilhados. Para assegurarmos uma boa soluo, necessrio que:
dois processos no estejam simultaneamente dentro de suas regies crticas referentes ao
mesmo recurso compartilhado (garantia de mtua excluso);
a garantia de mtua excluso se d independente da velocidade relativa dos processos ou
nmero de CPUs;
nenhum processo executando fora de regies crticas bloqueie outro processo;
nenhum processo espere um tempo arbitrariamente longo para executar uma regio crtica
(ou sofra estarvao).
Vrios algoritmos de controle visando garantir as propriedades acima foram propostos. Estes
algoritmos so classicados segundo o modo com que esperam pela autorizao de entrada em
uma regio crtica: espera ocupada (competindo pela CPU durante a espera) ou bloqueada
(no competindo pela CPU).
Todo algoritmo de mtua excluso possui, invariavelmente, duas partes (implementadas
como duas funes distintas). A primeira funo evocada quando o processo deseja iniciar a
execuo de uma regio crtica. Quando esta funo retorna, o processo est apto a executar
a regio crtica. No nal da execuo, o processo evoca a segunda funo, anunciando que a
regio crtica j foi executada. Esta segunda funo, via de regra, provoca o retorno da primeira
funo em outro processo.
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.
2 Note

que regies crticas delimitando diferentes recursos podem ser executadas por diferentes processos ao
mesmo tempo.

2.1 Introduo

2.1.3

22

Mtua Excluso Com Espera Ocupada

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

A soluo mais simples o mtodo de desabilitar todas as interrupes quando se est


entrando na regio crtica, e reabilit-las ao sair. Esta proposta no muito atrativa, pois d
ao processo usurio poder de desabilitar todas as interrupes, inclusive aquelas que permitem
o ncleo reassumir a CPU. Caso o processo no as reabilite por algum motivo, o sistema
operacional jamais reassume o controle do harware.
Em outro aspecto, conveniente para o sistema operacional desabilitar interrupes durante
algumas instrues, enquanto est atualizando variveis internas. Assim, desabilitar interrupes uma soluo til para o sistema operacional, no para processos de aplicao.
Variveis LOCK

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

para cada recurso compartilhado.


algoritmo facilmente generalizado para N processos, N

> 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

Mtua Excluso com Espera Bloqueada

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

Um outro tipo de varivel de sincronizao entre processos. Trs operaes so denidas


para um contador de evento (E):
READ(E): retorna o valor corrente de E;
ADVANCE(E): incrementa atomicamente E;
AWAIT(E,v): bloqueia at que E

 v.

2.1 Introduo

24

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
buer 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 (por exemplo, Java implementa monitores atravs
da palavra-chave synchronized).
2.1.5

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

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:
5 Executando

qualquer um de seus procedimentos.

2.2 Escalonamento de Processos

25

store(posio, dado): grava dados em uma 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 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.

progresso : garatir que cada processo tenha acesso CPU;

2.

ecincia : manter a CPU ocupada praticamente 100% do tempo;

3.

tempo de resposta : minimizar o tempo de resposta na execuo dos processos, principal-

4.

tempo de espera : minimizar o tempo de espera de servios no interativos (compilao,

5.

vazo : maximizar o nmero de processos executados por unidade de tempo.

mente os interativos (editores, planilhas, etc);


impresso, etc);

importante observar que alguns desses objetivos so contraditrios. Se um algoritmo


favorece o escalonamento de processos interativos certamento estar comprometendo os no
interativos. Vejamos alguns algoritmos de escalonamento.
Escalonamento Round Robin

Este o mais antigo e simples algoritmo de escalonamento. Cada processo executado por
um intervalo de tempo (quantum). Se o processo ainda estiver executando ao 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

colocada em uma la de espera.

2.3 Gerenciamento de Processos no UNIX

26

Algoritmos com Prioridades

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

Gerenciamento de Processos no UNIX

No captulo 1 introduzimos o conceito de processo, como so criados e como o sistema


operacional os mantm. Neste captulo detalharemos mais a estruturao de processos no
UNIX e apresentaremos como processos so controlados, escalonados e se comunicam.

2.3 Gerenciamento de Processos no UNIX

27

Transies de Estado

Na gura 1.9 apresentamos um diagrama de estados simplicado onde um processo possuia


4 estados: executando em modo usurio, executando em modo ncleo, pronto e bloqueado
(dormindo). A rigor, um processo no UNIX apresenta 9 estados (gura 2.1):
1. Executando em modo usurio;
2. Executando em modo ncleo;
3. Pronto para execuo (aguardando apenas CPU) e residindo em memria primria;
4. Bloqueado (dormindo) e residindo em memria primria;
5. Pronto para execuo, mas residindo em memria secundria (aguardando

swapping );

6. Bloqueado (dormindo) e residindo em memria secundria;


7. O processo est saindo do modo ncleo e retornando ao modo usurio, quando ocorre
uma mudana de contexto e o processo perde a CPU;
8. O processo acabou de ser criado e est em transio para pronto;
9. O processo executou um exit, no mais existe, mas seu registro mantido at que seja
enviado ao processo pai seu cdigo de retorno e outras estatsticas.
Executando em
Modo Usurio
1
escalonado
chamada de sistema
ou interrupo

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

Fig. 2.1: Diagrama completo de transio de estados para processos

2.3 Gerenciamento de Processos no UNIX

28

Vejamos o que tipicamente ocorre a partir da criao de um processo. Aps executado


uma chamada fork, so criados para o novo processo um campo na tabela de processos, sua
rea U e apontadores para sua pregion. O processo encontra-se no estado 8. Dependendo
da disponibilidade ou no de memria primria, o processo move-se, respectivamente, para
os estados 3 ou 5. Assuma que o processo deslocou-se para o estado 3 (pronto em memria
primria). O escalonador seleciona ento o processo para executar, movendo-o para o estado
2 (executando em modo ncleo), onde a chamada fork ser 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-o para o estado 7. Este
estado similar ao estado 3, sendo a distino feita para enfatizar que o 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 movido para o estado 3, aguardando CPU.
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.
Descritores de Processos

A tabela de processos e a rea U descrevem o estado dos processos. A primeira uma


estrutura mantida pelo ncleo com os seguintes campos:
o estado do processo;

2.4 Escalonamento de Processos no Unix

29

a localizao da rea U e do prprio processo, seja na memria primria ou secundria,


bem como o tamanho do processo;
o identicador do usurio (UID), isto , o dono do processo;
o identicador do processo (PID), nico durante toda a vida do processo;
eventos aguardados pelo processo quando no estado bloqueado (dormindo);
parmetros de escalonamento, utilizados para decidir quais processos transitaro entre
estados de execuo nos modos usurio e ncleo;
sinais enviados ao processo, mas ainda no tratados;
marcas de tempo como tempo total CPU, despertadores armados pelo processo, etc,
alm de recursos consumidos do ncleo (estes parmetros so utilizados no cmputo da
prioridade de escalonamento do processo).
A rea U de um processo armazena as seguintes informaes:
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).
2.4

Escalonamento de Processos no Unix

O escalonamento de processos no UNIX segue um algoritmo que combina prioridades e


Round Robin. necessrio enfatizar que tal algoritmo tem o objetivo de compartilhar a CPU
de forma equnime entre mltiplos usurios (sendo portanto orientada ao time-sharing ). Tal
algoritmo inadequado para aplicaes que requeiram o cumprimento estrito de restries
temporais, como impostas por aquelas denominadas de tempo real estritas (hard real-time).
O ncleo divide os processos segundo duas classes de prioridades:
prioridades em modo ncleo (altas), referentes a processos bloqueados no estado 4 ou 5;

2.4 Escalonamento de Processos no Unix

30

prioridades em modo usurio (baixas), referentes a processos prontos no estado 7.


A gura 2.2 mostra as classes de prioridades adotadas. Prioridades em modo ncleo
so subdivididas em dois grupos. O primeiro grupo, de elevada prioridade, constituido de
processos bloqueados a espera de swapping, E/S em disco, buers de cache e inodes. Quando
acordados, estes processos completam suas respectivas chamadas de sistema ininterruptamente
(visando a rpida liberao de recursos do ncleo, tais como buers).
prioridades
em modo
ncleo
Nveis de Prioridade

processos

swapper
no passvel
de interrupo

aguardando E/S em disco


aguardando buffer
aguardando inode
aguardando entrada de terminal

passvel de
interrupo

aguardando sada em terminal


Escalonamento por Prioridades
aguardando trmino do proc. filho

limiar de prioridade
em modo ncleo
nvel de usurio 0

Escalonamento Round Robin

nvel de usurio 1

nvel de usurio N
prioridades
em modo
usurio

Fig. 2.2: Classes de prioridades para ns de escalonamento de processos


O segundo grupo, de prioridade mais baixa que o primeiro, constitui-se de processos bloqueados a espera de entrada de terminal, sada em terminal e terminao de processo lho.
Tais processos podem ser interrompidos, pois estes estados de bloqueio no demandam grandes
recursos do ncleo.
Finalmente, processos aguardando apenas CPU (estado 7) so dispostos segundo um certo
nmero de nveis de prioridade (este nmero dependente da particular implementao).
Processos em uma mesma classe de prioridade so dispostos em uma la, como representado
na gura 2.2 pelos crculos interligados.
O algoritmo de escalonamento do UNIX processado segundo o seguinte esquema. Quando
ocorre uma interrupo do hardware:
caso a interrupo habilite 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.

2.5 Controle de Processos no UNIX

31

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, 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.
2.5

Controle de Processos no UNIX

O controle de processos se divide em duas atividades: instanciao (criao) e interrupo


de processos.
Instanciao de Processos

O mecanismo bsico de criao de processos no UNIX a chamada de sistema fork. A


gura 2.3 ilustra o que ocorre quando um processo executa esta chamada de sistema. Um novo
elemento na tabela de processos mantida pelo ncleo criado; a rea U criada imagem da
rea U do processo pai; uma tabela de regio criada com reas de pilha e dados copiadas do
processo pai, e rea de texto compartilhada com o processo pai. A pilha mantida pelo ncleo
copiado tambm.
Como pode-se observar na gura, a cpia da rea U faz com que todos os descritores de
arquivo permaneam ativos para o processo lho. A cpia das regies de dados e pilhas faz
com que toda a histria de execuo do processo pai (valores de variveis, retorno de funes,
etc) seja herdada pelo processo lho.
Uma alternativa de instanciao de processos a famlia exec de chamadas de sistema. Uma
chamada exec utiliza os recursos do processo que a executou para instalar um novo processo.
Diferente do fork, o processo que executa uma chamada exec deixa de existir.
A chamada exec tem como parmetros o arquivo executvel e dados a serem passados ao
novo processo, sendo por este obtidos na funo main atravs dos argumentos argc e argv.
Basicamente, uma chamada exec libera as regies de memria relativas a texto, dados
e pilha alocadas pelo processo executor da chamada, instalando novas regies para o novo
processo. O campo na tabela de processos mantida pelo ncleo e a regio U permanecem
inalterados. A pilha mantida pelo ncleo refeita para o novo processo. Isto signica que
a histria do processo antigo perdida, mas o PID e descritores de arquivo por ele abertos
permanecem vlidos7 .
Fica claro agora uma das utilidades da chamada fork: criar um novo processo sem que o
processo que o criou tenha sua execuo terminada. Exemplo:
7 Entretanto,

a nica maneira do novo processo conhecer o valor destes descritores atravs da passagem de
parmetros via argc e argv.

2.5 Controle de Processos no UNIX

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

Fig. 2.3: A execucuo de uma chamada de sistema fork.

/*

int pid, fd1, fd2;


char arg1[16], arg2[16];
...
fd1 = open("arq1", O_RDONLY, 0);
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 */

*/

2.5 Controle de Processos no UNIX

33

...
*/

/*

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(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);

do disparo de despertadores de tempo (ex: retorno da chamada sleep);


de interrupes oriundas de terminais (ex:

"C );

de interrupes para ns de depurao (ex: ocorrncia de um

breakpoint ).

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;

2.5 Controle de Processos no UNIX


sinal

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

Tab. 2.1: Exemplos de sinais no UNIX System V


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 comportamento 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 denominada 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 que o "C no foi acidental. O cdigo abaixo ilustra esta situao:
/*

/* gerenciador para SIGINT */


int ger()
{
int c;
printf("Tem certeza que quer terminar [s/n] ? ");

*/

2.6 Comunicao e Sincronizao Inter-processos no UNIX

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

stack pointer do processo.

2. Caso o processo no dena um gerenciador para o sinal, executa a ao


contrrio, prossiga.
3. Associa temporariamente a ao

default. Caso

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.
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

Comunicao e Sincronizao Inter-processos no UNIX

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.

2.6 Comunicao e Sincronizao Inter-processos no UNIX

36

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 em uma nica direo. Para
estabelecer-se comunicao bidirecional, so necessrios dois pipes.
Pipes podem ser vistos como um buer conectando dois processos. Um processo escreve
dados em um dos lados do buer, 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];
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]);

*/

2.6 Comunicao e Sincronizao Inter-processos no UNIX

37

exit(0);
}
/*

*/

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 */
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

Uma outra forma de comunicao disponvel no UNIX o compartilhamento de um espao


virtual. Este espao criado via chamada de sistema shmget. shmget possui trs parmetros:
um identicador global da regio compartilhada, o tamanho da regio em bytes; e opes de

2.6 Comunicao e Sincronizao Inter-processos no UNIX

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

regio de memria compartilhada


aps chamada de sistema shmat

Fig. 2.4: Esquema de memria compartilhada


O cdigo abaixo aloca um texto em uma regio de memria compartilhada.

2.6 Comunicao e Sincronizao Inter-processos no UNIX

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]

=
=
=
=
=
=
=
=

"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.

#include
#include
#include
#include

<stdio.h>
<sys/types.h>
<sys/ipc.h>
<sys/sem.h>

#define KEY 67
extern char *shmat();
main()

2.6 Comunicao e Sincronizao Inter-processos no UNIX

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

Semforo um mecanismo de sincronizao inter-processos composto das operaes DOWN


e UP. Via de regra, dene-se um semforo para cada recurso compartilhado. A 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;
};

/* indice do semaforo */
/* operacao requisitada */
/* controle da operacao */

O segundo campo da estrutura


seguinte lgica. Se sem_op for:

sembuf opera no respectivo semforo de acordo com a

2.6 Comunicao e Sincronizao Inter-processos no UNIX

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

sem_op ao valor do semforo e retorne.

nulo: retorne se o valor do semforo for nulo; bloqueie, caso contrrio.


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_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;

2.6 Comunicao e Sincronizao Inter-processos no UNIX

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]

=
=
=
=
=
=
=
=

"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";

while(1)
{
DOWN(semid);
/* entrada na Regiao Critica */
for(i = 0; i < 8; i++)
{
printf("\n%s", poema[i]);
sleep(1);

42

2.6 Comunicao e Sincronizao Inter-processos no UNIX

}
/*

43

}
printf("\n\n");
UP(semid);
/* saida da Regiao Critica */
}
*/

You might also like