Você está na página 1de 16

O Sistema Mach

B
APÊNDICE

Neste apêndice, examinamos o sistema operacional Mach. O Embora muitos sistemas operacionais experimentais este-
Mach é projetado para incorporar as diversas inovações recen- jam sendo projetados, construídos e usados, o Mach atende
tes da pesquisa em sistemas operacionais e produzir um sis- melhor às necessidades das massas do que os outros sistemas
tema totalmente funcional e tecnicamente avançado. Diferente porque oferece compatibilidade total com o UNIX 4.3 BSD.
do UNIX, que foi desenvolvido sem preocupação com mul- Portanto, ele fornece uma oportunidade única para compa-
tiprocessamento, o Mach incorpora suporte total a multi- rarmos dois sistemas operacionais funcionalmente semelhan-
processamento. Seu suporte a multiprocessamento também tes, mas diferentes internamente. O Mach e o UNIX diferem
é excessivamente flexível, acomodando sistemas de memória em suas ênfases e, assim, nossa discussão do Mach não é
compartilhada assim como sistemas sem memória comparti- exatamente paralela à discussão do UNIX. Além disso, não
lhada entre processadores. O Mach é projetado para operar em incluímos uma seção sobre a interface de usuário porque esse
sistemas de computação de um até milhares de processadores. componente é semelhante à interface de usuário do 4.3 BSD.
Além disso, ele é mais facilmente portado para muitas arquite- Como você verá, o Mach também fornece o recurso de emu-
turas de computadores diferentes. Um objetivo-chave do Mach lação de camadas de outros sistemas operacionais; outros
é ser um sistema distribuído capaz de funcionar em hardwares sistemas operacionais podem até mesmo executar concorren-
heterogêneos. temente com o Mach.

B.1 História do Sistema Mach


A linhagem do Mach vem do sistema operacional Accent Por intermédio do Release 2, o Mach fornece compatibili-
desenvolvido na Carnegie Mellon Universisty (CMU). Embora dade com os sistemas BSD correspondentes ao incluir grande
o Accent tenha sido pioneiro em vários conceitos novos de sis- parte do código do BSD no kernel. Os novos recursos e fun-
temas operacionais, sua utilidade era limitada pela incapaci- cionalidades do Mach tornam os kernels desses releases maio-
dade de executar aplicações UNIX e por seus fortes vínculos res do que os kernels BSD correspondentes. O Mach 3 (Figura
com uma arquitetura de hardware específica, o que tornava B.1) transfere o código do BSD para fora do kernel, deixando um
difícil sua portabilidade. O sistema de comunicação e a filosofia microkernel muito menor. Esse sistema implementa no kernel
do Mach derivam do Accent, mas muitas outras partes signifi- apenas recursos básicos do Mach; todo o código específico do
cativas do sistema (por exemplo, o sistema de memória virtual UNIX tem sido removido para operar em servidores de moda-
e o gerenciamento de tarefas e threads) foram desenvolvidas a lidade de usuário. A remoção de código específico do UNIX do
partir do zero. Um objetivo importante do esforço do Mach foi kernel permite a substituição do BSD por outro sistema opera-
o suporte a multiprocessadores. cional ou a execução simultânea de várias interfaces de sistemas
O desenvolvimento do Mach seguiu um caminho evo-
lucionário a partir dos sistemas BSD UNIX. O código do
Mach foi, inicialmente, desenvolvido dentro do kernel do
4.2 BSD, com os componentes do kernel do BSD sendo subs-
tituídos por componentes do Mach à medida que esses com-
ponentes eram concluídos. Os componentes do BSD foram
atualizados para o 4.3 BSD quando ele se tornou disponí- sistema de
vel. Por volta de 1986, os subsistemas de memória virtual e banco
de dados
comunicação estavam sendo executados na família de com-
putadores VAX DEC, inclusive em versões multiprocessado-
ras do VAX. Versões para o IBM RT/PC e para estações de tarefas IPC memória scheduling
e threads virtual
trabalho Sun 3 vieram em seguida; o ano de 1987 viu a con-
clusão das versões multiprocessadoras Encore Multimax e
Mach
Sequent Balance que incluíam suporte a tarefas e threads,
assim como os primeiros releases oficiais do sistema, Rele-
ase 0 e Release 1. Figura B.1 Estrutura do Mach 3.
O Sistema Mach  2 9

operacionais acima do microkernel. Além do BSD, implemen- o Mach 2.5 como base para seu novo sistema operacional, o
tações de modalidade de usuário têm sido desenvolvidas para OSF/1. O lançamento do OSF/1 ocorreu um ano depois e,
DOS, o sistema operacional Macintosh e o OSF/1. Essa abor- agora, ele compete com o UNIX System V, Release 4, o sistema
dagem tem semelhanças com o conceito de máquina virtual, operacional preferido entre os membros da UNIX Internatio-
mas a máquina virtual é definida por software (a interface do nal (UI). Os membros da OSF incluem importantes empresas
kernel do Mach) e não por hardware. A partir do Release 3.0, o de tecnologia como a IBM, a DEC e a HP. O Mach 2.5 também
Mach tornou-se disponível em uma ampla variedade de siste- é a base do sistema operacional da estação de trabalho NeXT,
mas, incluindo máquinas de processador único Sun, Intel, IBM criação de Steve Jobs, famoso pelos computadores da Apple. A
e DEC e sistemas multiprocessadores DEC, Sequent e Encore. OSF está avaliando o Mach 3 como base de um futuro release
O Mach tomou a dianteira na indústria quando a Open de sistema operacional e a pesquisa sobre o Mach continua na
Software Foundation (OSF) anunciou em 1989 que usaria CMU, na OSF e em outros locais.

B.2 Princípios de Projeto


O sistema operacional Mach foi projetado para fornecer meca- • Fácil portabilidade para uma ampla classe de uniprocessa-
nismos básicos que faltam na maioria dos sistemas opera- dores
cionais atuais. O objetivo é projetar um sistema operacional • Uma extensa biblioteca de utilitários e aplicações
que seja compatível com o BSD e, além disso, se destaque nas
seguintes áreas:
• Capacidade de combinar utilitários facilmente por meio de
pipes
• Suporte a arquiteturas diversificadas, incluindo multi-
É claro que os projetistas também queriam dar nova roupa-
processadores com vários níveis de acesso compartilhado
gem ao que consideravam as desvantagens do BSD:
à memória: acesso uniforme à memória (UMA), acesso
não uniforme à memória (NUMA) e sem acesso remoto à • Um kernel que se tornou repositório de muitos recursos
memória (NORMA – no remote memory access) redundantes – e que, consequentemente, é difícil de geren-
• Capacidade de funcionar com velocidades variadas de redes ciar e modificar
entre computadores, das redes de longa distância às redes • Objetivos originais de projeto que tornavam difícil dar
locais de alta velocidade, e com multiprocessadores forte- suporte a multiprocessadores, sistemas distribuídos e biblio-
mente acoplados tecas de programas compartilhadas – por exemplo, já que o
• Estrutura do kernel simplificada, com pequeno número de kernel foi projetado para uniprocessadores, não tem recursos
abstrações (por sua vez, essas abstrações são suficientemente para trancamento (locking) de código ou dados que outros
genéricas para permitir que outros sistemas operacionais processadores possam estar usando.
sejam implementados acima do Mach) • Excessivas abstrações básicas, fornecendo muitos meios alter-
• Operação distribuída, fornecendo transparência de rede aos nativos semelhantes para a execução da mesma tarefa
clientes e uma organização orientada a objetos tanto interna O desenvolvimento do Mach continua sendo um empre-
quanto externamente endimento de porte. Os benefícios de um sistema assim são
• Integração entre gerenciamento de memória e comunica- igualmente grandes, no entanto. O sistema operacional é
ção entre processos para fornecer comunicação eficiente de executado em muitas arquiteturas uni e multiprocessadoras
grandes volumes de dados, assim como gerenciamento de existentes e pode ser facilmente portado para futuras arqui-
memória com base em comunicação teturas. Ele torna a pesquisa mais fácil porque os cientistas
• Suporte a sistemas heterogêneos para tornar o Mach ampla- da computação podem adicionar recursos por intermédio de
mente disponível e operável entre sistemas de computação de código de nível de usuário, em vez de ter de escrever seu pró-
vários fornecedores prio sistema operacional personalizado. As áreas de experi-
mentação incluem sistemas operacionais, bancos de dados,
Os projetistas do Mach têm sido muito influenciados pelo
sistemas distribuídos confiáveis, linguagens de multiproces-
BSD (e pelo UNIX, em geral), cujos benefícios incluem:
samento, segurança e inteligência artificial distribuída. Em
• Uma interface de programador simples, com um bom sua versão corrente, o sistema Mach costuma ser tão eficiente
conjunto de primitivas e um conjunto consistente de inter- quanto outras versões importantes do UNIX ao executar tare-
faces aos recursos do sistema fas semelhantes.

B.3 Componentes do Sistema


Para atingir os objetivos de projeto do Mach, os desenvolvedores que estiver aí suficientemente poderoso para que todos os outros
reduziram a funcionalidade do sistema operacional a um pequeno recursos possam ser implementados em nível de usuário.
conjunto de abstrações básicas, a partir das quais todas as outras A filosofia de projeto do Mach é possuir um kernel sim-
funcionalidades podem ser derivadas. A abordagem do Mach é ples e extensível, concentrado em recursos de comunicação.
colocar o mínimo possível dentro do kernel, mas tornando o Por exemplo, todas as solicitações ao kernel e toda a movi-
3 0   Apêndice B

mentação de dados entre processos são manipuladas através receptor pode usar essa informação para identificar o objeto
de um mecanismo de comunicação. Portanto, o Mach pode referenciado pela mensagem.
fornecer proteção a seus usuários no âmbito de todo o sis- • Uma mensagem é o método básico de comunicação entre
tema, protegendo o mecanismo de comunicação. A otimiza- threads no Mach. Ela é um conjunto tipificado de objetos de
ção desse caminho único de comunicação pode resultar em dados; para cada objeto, ela pode conter os dados reais ou um
ganhos de desempenho significativos e é mais simples do que ponteiro para dados out-of-line1. Os direitos de porta são pas-
tentar otimizar vários caminhos. O Mach é extensível por- sados em mensagens; essa é a única maneira de movimentá-los
que muitas funções, tradicionalmente baseadas no kernel, entre tarefas. (A passagem de um direito de porta em memória
podem ser implementadas como servidores de nível de usuá- compartilhada não funciona porque o kernel do Mach não per-
rio. Por exemplo, todos os paginadores (inclusive o paginador mitirá que a nova tarefa use um direito obtido desta forma.)
default) podem ser implementados externamente e chamadas
pelo kernel para o usuário.
• Um objeto memória é uma fonte de memória; as tarefas
podem acessá-lo mapeando partes de um objeto (ou o objeto
O Mach é um exemplo de sistema orientado a objetos em que
inteiro) para seus espaços de endereçamento. O objeto pode
os dados e as operações que manipulam esses dados são encap-
ser gerenciado por um gerenciador de memória externo de
sulados em um objeto abstrato. Apenas as operações do objeto
modalidade de usuário. Um exemplo é um arquivo gerenciado
podem atuar sobre as entidades nele definidas. Os detalhes de
por um servidor de arquivos; no entanto, um objeto memória
como essas operações são implementadas ficam ocultos, assim
pode ser qualquer objeto para o qual o acesso mapeado na
como as estruturas de dados internas. Logo, um programador só
memória faça sentido. Uma implementação mapeada em buf-
pode usar um objeto invocando suas operações exportadas defi-
fer de um pipe UNIX é um exemplo.
nidas. O programador pode alterar as operações internas sem
mudar a definição da interface e, portanto, as modificações e oti- A Figura B.2 ilustra essas abstrações que aprofundamos no
mizações não afetam outros aspectos da operação do sistema. restante deste capítulo.
A abordagem orientada a objetos suportada pelo Mach permite Uma característica não usual do Mach, essencial para a efi-
que os objetos residam em qualquer local, em uma rede de sis- ciência do sistema, é a combinação de recursos de memória e
temas Mach, de forma transparente ao usuário. O mecanismo de comunicação entre processos (IPC). Enquanto outros sis-
port, discutido mais tarde nesta seção, torna tudo isso possível. temas distribuídos (como o Solaris, com seus recursos NFS)
As abstrações primitivas do Mach são o coração do sistema têm extensões de uso específico para o sistema de arquivos, de
e são as seguintes: modo a estendê-lo por toda uma rede, o Mach fornece uma
fusão de memória e mensagens, extensível e de uso geral, no
• Uma tarefa é um ambiente de execução que fornece a uni- coração do seu kernel. Esse recurso não só permite que o Mach
dade básica de alocação de recursos. Ela é composta por um
seja usado para programação distribuída e paralela, mas tam-
espaço de endereçamento virtual e acesso protegido a recur-
bém ajuda na implementação do próprio kernel.
sos do sistema, por meio de portas, e pode conter um ou mais
O Mach conecta gerenciamento de memória e IPC permi-
threads.
tindo que um seja usado na implementação do outro. A base
• Um thread é a unidade básica de execução e deve ser exe- do gerenciamento de memória é o uso de objetos memória.
cutado no contexto de uma tarefa (que fornece o espaço de Um objeto memória é representado por uma porta (ou por-
endereçamento). Todos os threads de uma tarefa compar- tas) e mensagens de IPC são enviadas a essa porta para solici-
tilham os recursos da tarefa (portas, memória etc). Não existe tar operações (por exemplo, pagein, pageout) no objeto. Já
a noção de processo no Mach. Em vez disso, um processo tra- que a IPC é usada, os objetos memória podem residir em sis-
dicional seria implementado como uma tarefa com um único temas remotos e serem acessados de maneira transparente. O
thread de controle. kernel armazena em cache local o conteúdo de objetos memó-
• Uma porta é o mecanismo básico de referência a objetos no ria. Inversamente, técnicas de gerenciamento de memória são
Mach e é implementada como um canal de comunicação pro- usadas na implementação de transmissão de mensagens. Onde
tegido pelo kernel. A comunicação é executada pelo envio de possível, o Mach transmite mensagens movendo ponteiros
mensagens para portas; as mensagens são enfileiradas na porta para objetos memória compartilhados, e não pela cópia dos
de destino quando não há um thread pronto para recebê-las. As próprios objetos.
portas são protegidas por recursos gerenciados pelo kernel ou A IPC tende a causar overhead considerável no sistema; para
direitos de portas; uma tarefa deve ter um direito de porta para mensagens dentro do sistema, ela é, em geral, menos eficiente do
enviar uma mensagem a uma porta. O programador invoca que a comunicação executada por meio de memória comparti-
uma operação em um objeto enviando uma mensagem a uma lhada. Já que o Mach é um kernel fundamentado em mensagens,
porta associada a esse objeto. O objeto que está sendo represen- a manipulação de mensagens deve ser executada eficientemente.
tado por uma porta recebe as mensagens. Grande parte da ineficiência na manipulação de mensagens,
• Um conjunto de portas é um grupo de portas que compar- em sistemas operacionais tradicionais, deve-se tanto à cópia de
tilham uma fila de mensagens comum. Um thread pode rece- mensagens de uma tarefa para outra (para mensagens dentro
ber mensagens de um conjunto de portas e, portanto, atender 1
Dados contidos diretamente na mensagem chamam-se dados in-line; se a mensa-
várias portas. Cada mensagem recebida identifica a porta gem contém ponteiros para os dados reais, os dados são chamados dados out-of-line.
individual (do conjunto) a partir da qual ela foi recebida; o (N.R.T.)
O Sistema Mach  3 1

região de texto
mensagem
threads
porta
contador de
programa

tarefa

região de dados
conjunto de portas

objeto memória secundária


memória

Figura B.2 Abstrações básicas do Mach.

do computador) como à baixa velocidade de transferência na • Melhor desempenho em comparação com a transmissão de
rede (para mensagens entre computadores). Para resolver esses mensagens do UNIX
problemas, o Mach usa o remapeamento de memória virtual • Migração de tarefas mais fácil (já que as portas são inde-
para transferir o conteúdo de mensagens grandes. Em outras
pendentes de localização, uma tarefa e todas as suas por-
palavras, a transferência de mensagens modifica o espaço de
tas podem ser transferidas de um computador para outro;
endereçamento da tarefa receptora para incluir uma cópia do
conteúdo da mensagem. Técnicas de cópia virtual (ou cópia todas as tarefas que se comunicaram anteriormente com
após gravação) são usadas para evitar ou retardar a cópia real a tarefa transferida podem continuar fazendo isso porque
dos dados. Essa abordagem tem diversas vantagens: elas só referenciam a tarefa por suas portas e se comuni-
cam por meio de mensagens para essas portas)
• Aumento da flexibilidade no gerenciamento de memória para
programas de usuário Nas seções a seguir, detalhamos a operação de gerencia-
• Maior generalidade, permitindo que a abordagem de cópia mento de processos, da IPC e do gerenciamento de memó-
virtual seja usada em computadores forte ou fracamente ria. Depois, discutimos a habilidade camaleônica do Mach de
acoplados suportar interfaces múltiplas de sistemas operacionais.

B.4 Gerenciamento de Processos


Uma tarefa pode ser considerada como um processo tradicio- ponto da chamada de criação fork, no pai. Threads e tarefas
nal que não tem um ponteiro de instruções ou um conjunto também podem ser suspensos e retomados.
de registradores. Ela contém um espaço de endereçamento Os threads são especialmente úteis em aplicações de ser-
virtual, um conjunto de direitos de porta e informações de vidor, comuns no UNIX, já que uma tarefa pode ter múlti-
contabilidade. A tarefa é uma entidade passiva que não faz plos threads para atender múltiplas solicitações feitas a ela.
coisa alguma, a menos que tenha um ou mais threads em exe- Os threads também permitem o uso eficiente de recursos de
cução nela. computação paralela. Em vez de haver um processo em cada
processador, com a correspondente perda de desempenho e
B.4.1 Estrutura Básica overhead imposto ao sistema operacional, uma tarefa pode ter
Uma tarefa contendo um thread é semelhante a um processo seus threads espalhados entre processadores paralelos. Além
no UNIX. Da mesma forma que uma chamada de sistema disso, os threads adicionam eficiência a programas de nível
fork produz um novo processo no UNIX, o Mach cria uma de usuário. Por exemplo, no UNIX, um processo inteiro deve
nova tarefa para emular esse comportamento. A memória da esperar quando ocorre um erro de página ou quando uma cha-
nova tarefa é uma duplicata do espaço de endereçamento do mada de sistema é executada. Em uma tarefa com múltiplos
pai, como imposto pelos atributos de herança da memória do threads, só o thread que causa o erro de página ou executa uma
pai. A nova tarefa contém um thread que é iniciado no mesmo chamada de sistema é adiado; todos os outros threads conti-
3 2   Apêndice B

nuam em execução. Já que o Mach tem threads suportados pelo esse padrão. Como resultado, há fortes semelhanças entre os
kernel (Capítulo 4), esses threads implicam algum custo asso- threads C e as interfaces de programação do Pthreads. As roti-
ciado. Eles exigem estruturas de dados de suporte no kernel e nas de controle de threads incluem chamadas para a execução
o kernel deve fornecer algoritmos de scheduling mais comple- dessas tarefas:
xos. Esses algoritmos e estados dos threads são discutidos no
Capítulo 4.
• Criar um novo thread dentro de uma tarefa, dados uma fun-
ção a ser executada e parâmetros como entrada. O thread é,
No nível do usuário, os threads podem estar em um de dois
então, executado concorrentemente com o thread criador que
estados:
recebe um identificador de thread quando a chamada retorna.
• Em execução: O thread está em execução ou esperando a • Destruir o thread chamador e retornar um valor para o thread
alocação de um processador. Um thread é considerado em criador.
execução mesmo quando está bloqueado dentro do ker-
nel (esperando que um erro de página seja manipulado, por
• Esperar que um thread específico termine antes de permitir
que o thread chamador continue. Essa chamada é uma fer-
exemplo).
ramenta de sincronização, muito semelhante às chamadas de
• Suspenso: O thread não está em execução em um processa- sistema wait do UNIX.
dor nem esperando pela alocação de um processador. Um
thread só pode retomar sua execução quando volta ao estado
• Conceder o uso de um processador, sinalizando que o schedu-
ler pode executar outro thread nesse momento. Essa chamada
“em execução”.
também é útil em presença de um scheduler preemptivo, já
Esses dois estados também estão associados a uma tarefa. que pode ser usada para abandonar voluntariamente a CPU
Uma operação em uma tarefa afeta todos os threads da tarefa antes de o quantum de tempo (ou intervalo de scheduling)
e, portanto, a suspensão de uma tarefa envolve a suspensão de expirar quando um thread não mais precisa da CPU.
todos os seus threads. No entanto, a suspensão de tarefas e a
A exclusão mútua é obtida por meio do uso de spinlocks,
suspensão de threads são mecanismos independentes e separa-
como discutido no Capítulo 6. As rotinas associadas à exclusão
dos e, assim, a retomada de um thread em uma tarefa suspensa
mútua são as seguintes:
não retoma a tarefa.
O Mach fornece primitivas a partir das quais ferramentas de • A rotina mutex_alloc cria dinamicamente uma variável
sincronização de threads podem ser construídas. Essa prática mutex.
é consistente com a filosofia do Mach de fornecer funcionali- • A rotina mutex_free desaloca uma variável mutex criada
dade mínima, porém suficiente, no kernel. O recurso de IPC do dinamicamente.
Mach pode ser usado na sincronização, com processos (tarefas) • A rotina mutex_lock tranca (impõe um lock) uma variável
trocando mensagens em pontos de encontro. A sincronização mutex. O thread em execução entra em loop em um spin-
no nível dos threads é fornecida por chamadas que iniciam e lock até que o lock seja obtido. Isso resulta em deadlock se um
interrompem os threads nos momentos apropriados. Uma con- thread com um lock tenta trancar a mesma variável mutex. A
tagem de suspensos é mantida para cada thread. Esta contagem espera limitada não é garantida pelo pacote de threads C. Em
permite que várias chamadas suspend sejam executadas em vez disso, ela depende das instruções de hardware usadas na
um thread e só quando ocorre um número igual de chamadas implementação das rotinas mutex.
resume é que o thread é retomado. Infelizmente, esse recurso
tem suas limitações. Já que é um erro uma chamada start ser
• A rotina mutex_unlock destranca uma variável mutex,
muito parecido com o estilo da operação signal típica de
executada antes de uma chamada stop (a contagem de suspen-
um semáforo.
sos ficaria negativa), essas rotinas não podem ser usadas para
sincronizar o acesso a dados compartilhados. No entanto, as A sincronização geral sem espera em ação pode ser obtida
operações wait e signal, associadas aos semáforos e usadas com o uso de variáveis de condição que podem ser usadas
para sincronização, podem ser implementadas por intermédio para implementar uma região crítica condicional (ou moni-
das chamadas IPC. Discutimos esse método na Seção B.5. tor), como descrito no Capítulo 6. Uma variável de condição
é associada a uma variável mutex e reflete um estado booleano
B.4.2 O Pacote de Threads C dessa variável. As rotinas associadas à sincronização geral são
as seguintes:
O Mach fornece rotinas de baixo nível, porém flexíveis, em
vez de funções refinadas, grandes e mais restritivas. Em vez
• A rotina condition_alloc aloca dinamicamente uma
variável de condição.
de fazer os programadores trabalharem nesse baixo nível, o
Mach fornece interfaces de nível mais alto para a programa- • A rotina condition_free exclui uma variável de condi-
ção em C e outras linguagens. Por exemplo, o pacote de threads ção criada dinamicamente alocada como resultado de
C fornece vários threads de controle, variáveis compartilha- condition_alloc.
das, exclusão mútua para seções críticas e variáveis de condi- • A rotina condition_wait destranca (desativa o lock)
ção para sincronização. Na verdade, os threads C são uma das a variável mutex associada e bloqueia o thread até que uma
maiores influências do padrão Pthreads do POSIX e muitos rotina condition_signal seja executada na variável
sistemas operacionais estão sendo modificados para suportar de condição, indicando que o evento que estava sendo espe-
O Sistema Mach  3 3

rado pode ter ocorrido. A variável mutex é, então, trancada e B.4.3 O Scheduler da CPU
o thread continua. Uma rotina condition_signal não
O scheduler da CPU para um sistema operacional multiproces-
garante a permanência da condição até que o thread desblo-
sador baseado em threads é mais complexo do que seus equi-
queado finalmente retorne de sua chamada condition_
valentes baseados em processos. Geralmente, há mais threads
wait e, assim, o thread despertado deve entrar em loop,
em um sistema multithreads do que processos em um sistema
executando a rotina condition_wait até que seja desblo-
multitarefas. Controlar vários processadores também é difí-
queado e a condição permaneça.
cil e é uma área de pesquisa relativamente nova. O Mach usa
Como exemplo das rotinas de threads C, considere o pro- uma política simples para manter o scheduler gerenciável. Ape-
blema de sincronização do buffer limitado da Seção 6.6.1. O nas threads são incluídos no schedule e, portanto, nenhum
produtor e o consumidor são representados como threads que conhecimento das tarefas é necessário ao scheduler. Todos
acessam o pool comum de buffers limitados. Usamos uma os threads competem igualmente por recursos, inclusive por
variável mutex para proteger o buffer enquanto ele está sendo quanta de tempo.
atualizado. Uma vez que tenhamos acesso exclusivo ao buffer, Cada thread tem um número de prioridade associado que
usamos variáveis de condição para bloquear o thread pro- varia de 0 a 127 e sua base é a média exponencial do uso da
dutor se o buffer estiver cheio e para bloquear o thread con- CPU pelo thread. Isto é, um thread que usou recentemente
sumidor se o buffer estiver vazio. Embora esse programa a CPU, por um período longo, tem a prioridade mais baixa.
normalmente fosse escrito na linguagem C, em um sistema O Mach usa a prioridade para inserir o thread em uma das
Mach, usaremos a sintaxe familiar ao estilo Pascal, dos capí- 32 filas de execução globais. Essas filas são pesquisadas por
tulos anteriores, a título de clareza. Como no Capítulo 6, esta- ordem de prioridade, em busca de threads em espera, quando
mos supondo que o buffer seja composto por n posições, um processador se torna ocioso. O Mach também mantém
cada um podendo conter um item. O semáforo mutex for- filas de execução por processador ou filas locais. Uma fila de
nece exclusão mútua para acessos ao pool de buffers e é ini- execução local é usada para threads limitados a um processa-
cializado com o valor 1. Os semáforos empty e full contam o dor individual. Por exemplo, um driver de dispositivo de um
número de buffers vazios e cheios, respectivamente. O semá- dispositivo conectado a uma CPU individual só deve ser exe-
foro empty é inicializado com o valor n; o semáforo full é ini- cutado nessa CPU.
cializado com o valor 0. A variável de condição nonempty é Em vez de um despachante central que atribua threads
verdadeira enquanto o buffer possuir itens e nonfull é verda- a processadores, cada processador consulta as filas de exe-
deira se o buffer possuir uma posição vazia. cução local e global para selecionar o próximo thread apro-
O primeiro passo inclui a alocação das variáveis mutex e de priado para execução. Os threads da fila de execução local
condição: têm prioridade absoluta sobre os das filas globais porque
mutex_alloc(mutex); condition_alloc(nonempty, nonfull); assume-se que eles estejam executando alguma tarefa para
o kernel. As filas de execução – como a maioria de outros
O código do thread produtor é mostrado na Figura B.3 e o objetos no Mach – são trancadas ao serem modificadas para
código do thread consumidor, na Figura B.4. Quando o pro- que não ocorram alterações simultâneas feitas por múltiplos
grama termina, as variáveis mutex e de condição têm de ser processadores. Para acelerar o despacho de threads na fila
desalocadas: de execução global, o Mach mantém uma lista de processa-
mutex_free(mutex); condition_free(nonempty, nonfull); dores ociosos.

Figura B.3 A estrutura do processo produtor. Figura B.4 A estrutura do processo consumidor.
3 4   Apêndice B

A natureza multiprocessadora do Mach causa dificulda- tido tentar depurar apenas um thread ou gerar exceções, a par-
des adicionais de scheduling. Um quantum de tempo fixo não tir de threads múltiplos, que invoquem depuradores múltiplos.
é apropriado porque, por exemplo, pode haver menos threads Além dessa distinção, a única diferença entre os dois tipos de
executáveis do que processadores disponíveis. Seria um des- exceções reside em sua herança a partir de uma tarefa pai. Os
perdício interromper um thread, com uma mudança de con- recursos de manipulação de exceções no âmbito de uma tarefa
texto para o kernel, quando seu quantum expira, apenas para são passados da tarefa pai às tarefas filhas e, portanto, os depu-
que ele seja retornado ao estado de execução. Portanto, em vez radores podem manipular uma árvore inteira de tarefas. Os
de usar um quantum de tamanho fixo, o Mach varia o tama- manipuladores de erros não são herdados e não tem um mani-
nho do quantum de tempo inversamente ao número total pulador default em tempo de criação de threads e tarefas. Para
de threads no sistema. No entanto, ele mantém o quantum de concluir, os manipuladores de erros têm precedência sobre os
tempo constante no sistema inteiro. Por exemplo, em um depuradores quando as exceções ocorrem simultaneamente.
sistema com 10 processadores, 11 threads e um quantum de Essa abordagem é usada porque os manipuladores de erros
100 milissegundos, uma mudança de contexto somente precisa costumam fazer parte da tarefa e, portanto, devem ser executa-
ocorrer a cada segundo, em cada processador, para manter o dos normalmente mesmo na presença de um depurador.
quantum desejado. A manipulação de exceções ocorre da seguinte forma:
É claro que ainda existem complicações. Até mesmo o • O thread-alvo gera a notificação de uma ocorrência de exce-
abandono da CPU enquanto há a espera por um recurso, é ção por intermédio de uma mensagem RPC raise enviada
mais difícil do que em sistemas operacionais tradicionais. Pri- para o manipulador.
meiro, um thread deve emitir uma chamada para alertar o
scheduler de que está para ser bloqueado. Esse alerta evita
• O alvo chama, então, uma rotina para esperar até que a exce-
ção seja manipulada.
condições de concorrência e deadlocks que poderiam ocor-
rer em caso de execução em um ambiente multiprocessa- • O manipulador recebe a notificação da exceção que inclui,
dor. Uma segunda chamada causa realmente a remoção do usualmente, informações sobre a exceção, o thread e a tarefa
thread da fila de execução até que o evento apropriado ocorra. que causou a exceção.
O scheduler usa muitos outros estados internos dos threads • O manipulador executa sua função de acordo com o tipo da
para controlar a execução de threads. exceção. A ação do manipulador envolve a derrubada da exce-
ção o que causa a retomada ou o encerramento do thread-alvo.
B.4.4 Manipulação de Exceções Para dar suporte à execução de programas BSD, o Mach
O Mach foi projetado para fornecer um único sistema de mani- tem de suportar sinais no estilo BSD. Os sinais fornecem inter-
pulação de exceções simples e consistente, com suporte para rupções e exceções geradas por software. Infelizmente, sinais
exceções – padrão assim como para exceções definidas pelo têm funcionalidade limitada em sistemas operacionais multi-
usuário. Para evitar redundância no kernel, ele usa primitivas threads. O primeiro problema é que, no UNIX, um manipu-
do kernel sempre que possível. Por exemplo, um manipulador lador de sinais deve ser uma rotina do processo que recebe o
de exceções é apenas outro thread da tarefa em que a exce- sinal. Se o sinal for causado por um problema no próprio pro-
ção ocorre. Mensagens de chamadas de procedimento remo- cesso (por exemplo, uma divisão por zero), o problema não
tas (RPC) são usadas para sincronizar a execução do thread pode ser remediado porque um processo tem acesso limitado
que causou a exceção (o alvo) com a execução do manipulador ao seu próprio contexto. Um segundo aspecto mais complicado
e para transmitir informações sobre a exceção, entre o alvo e o dos sinais é que eles foram projetados apenas para programas
manipulador. As exceções do Mach também são usadas para com um único thread. Por exemplo, não faz sentido que todos
emular o pacote signal do BSD. os threads de uma tarefa obtenham um sinal, mas como um
As paralisações da execução normal de um programa sinal pode ser visto por apenas um thread?
ocorrem de duas maneiras: exceções geradas internamente e Já que o sistema de sinais deve funcionar corretamente com
interrupções externas. Interrupções são paralisações geradas aplicações multithreads para que o Mach execute programas
assincronamente em um thread ou tarefa, enquanto exceções 4.3 BSD, os sinais não podiam ser abandonados. No entanto,
são causadas pela ocorrência de condições incomuns durante o código teve de ser reescrito várias vezes para produzir um
a execução de um thread. O recurso de exceção de uso geral pacote de sinais funcionalmente correto! Um último problema
do Mach é usado para suporte à detecção de erros e ao depu- dos sinais do UNIX é que eles podem ser perdidos. Essa perda
rador. Esse recurso também é útil para outras funções, como acontece quando outro sinal do mesmo tipo ocorre antes de o
obter o dump (despejo) de memória de uma tarefa inválida, primeiro ser manipulado. As exceções do Mach são enfileira-
permitindo que as tarefas manipulem seus próprios erros (em das como resultado de sua implementação de RPCs.
sua maioria, aritméticos), e emular instruções não implemen- Sinais gerados externamente, inclusive os enviados de um
tadas em hardware. processo BSD para outro, são processados pela seção de servi-
O Mach dá suporte a dois níveis de granularidade diferen- dor BSD do kernel do Mach 2.5. Portanto, seu comportamento
tes para a manipulação de exceções A manipulação de erros é é o mesmo que ocorre sob o BSD. Exceções de hardware cons-
suportada pela manipulação de exceções por thread, enquanto tituem uma questão diferente porque os programas BSD espe-
os depuradores usam a manipulação por tarefa. Faz pouco sen- ram receber exceções de hardware como sinais. Logo, uma
O Sistema Mach  3 5

exceção de hardware causada por um thread deve chegar ao derrubando a condição de exceção original. Com a conclusão
thread como um sinal. Para que esse resultado seja produzido, da RPC, o thread iniciador reentra em estado de execução. Ele
as exceções de hardware são convertidas em RPCs de exceções. vê imediatamente o sinal e executa seu código de manipulação
Para tarefas e threads que não fazem uso explícito do recurso de sinais. Dessa forma, todas as exceções de hardware come-
de manipulação de exceções do Mach, o destino das RPCs de çam de maneira uniforme – como RPCs de exceções. Threads
exceções é uma tarefa default interna ao kernel. Essa tarefa tem não projetados para manipular essas exceções, no entanto, as
apenas uma finalidade: seu thread é executado em um loop recebem como ocorreria em um sistema BSD – padrão – como
contínuo, recebendo as RPCs de exceções. Para cada RPC, ela sinais. No Mach 3.0, o código de manipulação de sinais é trans-
converte a exceção no sinal apropriado que é enviado ao thread ferido inteiramente para um servidor, mas a estrutura geral e o
causador da exceção de hardware. Ela, então, conclui a RPC fluxo de controle são semelhantes aos do Mach 2.5.

B.5 Comunicação entre Processos


A maioria dos sistemas operacionais comerciais, como o UNIX, que fique disponível uma locação na fila ou deixar que o kernel
fornece comunicação entre processos e entre hosts, com nomes distribua a mensagem em lugar da porta.
globais fixos (ou endereços de Internet). Não há independên- Várias chamadas de sistema fornecem as seguintes funcio-
cia de localização de recursos porque qualquer sistema remoto nalidades para a porta:
que precise usar um recurso, deve saber o nome do sistema que • Alocar uma nova porta em uma tarefa especificada e fornecer,
fornece esse recurso. Geralmente, dados em mensagens são à tarefa do chamador, todos os direitos de acesso à nova porta.
fluxos de bytes não tipificados. O Mach simplifica esse cená- O nome da porta é retornado.
rio enviando mensagens entre portas independentes de loca-
lização. As mensagens contêm dados tipificados para facilitar
• Desalocar os direitos de acesso de uma tarefa para uma porta.
Se a tarefa tiver o direito de recebimento, a porta é destruída
a interpretação. Todos os métodos de comunicação do BSD
e todas as outras tarefas com direitos de envio são, potencial-
podem ser implementados com esse sistema simplificado.
mente, notificadas.
Os dois componentes de IPC do Mach são as portas e as
mensagens. Quase tudo no Mach é um objeto e todos os obje- • Obter o status corrente da porta de uma tarefa.
tos são endereçados através de suas portas de comunicação. • Criar uma porta reserva à qual é fornecido o direito de recebi-
Mensagens são enviadas a essas portas para iniciar operações mento de uma porta se a tarefa com o direito de recebimento
nos objetos pelas rotinas que implementam os objetos. Ao solicitar sua desalocação ou for encerrada.
depender somente de portas e mensagens para toda a comuni- Quando uma tarefa é criada, o kernel gera várias portas
cação, o Mach fornece independência de localização aos obje- para ela. A função task_self retorna o nome da porta que
tos e segurança na comunicação. A independência de dados é representa a tarefa em chamadas ao kernel. Por exemplo, para
fornecida pela tarefa NetMsgServer (Seção B.5.3). uma tarefa alocar uma nova porta, ela chamaria port_allo-
O Mach garante a segurança requerendo que os emisso- cate com task_self como o nome da tarefa que possuirá
res e receptores de mensagens tenham direitos. Um direito a porta. A criação de threads resulta em uma porta thread_
consiste de um nome de porta e uma competência – enviar self semelhante para threads no kernel. Esse esquema é pare-
ou receber – nessa porta e se parece muito com uma com- cido com o conceito-padrão de ID de processo encontrado no
petência nos sistemas orientados a objetos. Apenas uma UNIX. Outra porta criada para uma tarefa é retornada por
tarefa pode ter direitos de recebimento em uma determi- task_notify e é a porta para a qual o kernel enviará mensa-
nada porta, mas muitas tarefas podem ter direitos de envio. gens de notificação de eventos (como as notificações de encer-
Quando um objeto é criado, seu criador também aloca uma ramento de portas).
porta para representar o objeto e obtém os direitos de acesso As portas também podem ser reunidas em conjuntos de
dessa porta. Direitos podem ser concedidos pelo criador do portas. Esse recurso é útil quando um thread precisa atender às
objeto, inclusive o kernel, e são passados em mensagens. Se o solicitações que chegam em várias portas – por exemplo, para
detentor de um direito de recebimento envia esse direito em vários objetos. Uma porta não pode ser membro de mais de um
uma mensagem, o receptor da mensagem obtém o direito e o conjunto de portas de cada vez; e, se uma porta estiver em um
emissor o perde. Uma tarefa pode alocar portas para permi- conjunto, pode não ser usada diretamente para receber men-
tir o acesso a qualquer objeto que possua ou para comuni- sagens. Em vez disso, as mensagens serão roteadas para a fila
cação. A destruição de uma porta ou do detentor do direito do conjunto de portas. Um conjunto de portas não pode rece-
de recebimento causa a revogação de todos os direitos dessa ber mensagens, diferente da porta. Os conjuntos de portas são
porta e as tarefas que detêm direitos de envio podem ser objetos que servem a uma finalidade semelhante a da chamada
notificadas, se desejado. de sistema select do 4.3 BSD, mas são mais eficientes.

B.5.1 Portas B.5.2 Mensagens


Uma porta é implementada como uma fila limitada e prote- Uma mensagem é composta por um cabeçalho de tamanho
gida, dentro do kernel do sistema em que o objeto reside. Se fixo e um número variável de objetos de dados tipificados. O
uma fila estiver cheia, o emissor pode abortar o envio, esperar cabeçalho contém o nome da porta de destino, o nome da porta
3 6   Apêndice B

porta

fila de mensagens mensagem mensagem

porta de destino
porta de resposta
tamanho/operação
dados tipificados puros
porta
direitos de porta
dados out-of-line

controle de mensagens

objeto cache de memória objeto cache de memória

Figura B.5 Mensagens no Mach.

de resposta para a qual mensagens de retorno devem ser envia- transmissão de mensagens é implementada por meio do geren-
das e o tamanho da mensagem (Figura B.5). Os dados na men- ciamento de memória virtual.
sagem (ou dados in-line) ficavam limitados a menos de 8 KB Na versão 2.5, essa operação era implementada em duas
em sistemas Mach 2.5, mas o Mach 3.0 não tem limites. Quais- fases. O ponteiro para uma região de memória fazia o ker-
quer dados que excedam esse limite devem ser enviados em nel mapear essa região de memória para seu próprio espaço,
várias mensagens ou, o que é mais provável, podem ser referen- temporariamente, definindo o mapa de memória do emissor
ciados por um ponteiro em uma mensagem (ou dados out-of- como da modalidade de cópia após gravação para assegurar
line). Cada seção de dados pode conter dados de tipo simples que nenhuma modificação afetasse a versão original dos dados.
(números ou caracteres), direitos de porta ou ponteiros para Quando uma mensagem era recebida em seu destino, o ker-
dados out-of-line. Cada seção tem um tipo associado para que nel movia seu mapeamento para o espaço de endereçamento
o receptor possa descompactar os dados corretamente mesmo do receptor, usando uma região de memória virtual recém-alo-
se usar uma ordenação de bytes diferente da usada pelo emis- cada dentro dessa tarefa.
sor. O kernel também inspeciona a mensagem em busca de Na versão 3, esse processo foi simplificado. O kernel cria
certos tipos de dados. Por exemplo, o kernel deve processar as uma estrutura de dados que seria uma cópia da região se fizesse
informações de porta de uma mensagem, traduzindo o nome parte de um mapa de endereços. No recebimento, essa estru-
da porta para um endereço interno da estrutura de dados da tura de dados é adicionada ao mapa do receptor e se torna uma
porta ou encaminhando-as, para processamento, a NetMsgSer- cópia acessível a este receptor.
ver (Seção B.5.3). As regiões recém-alocadas em uma tarefa não precisam
O uso de ponteiros em uma mensagem fornece o meio ser contíguas a alocações anteriores e, portanto, diz-se que a
de transferência do espaço de endereçamento inteiro de uma memória virtual do Mach é esparsa, composta por regiões de
tarefa em uma única mensagem. O kernel também deve pro- dados separadas por endereços não alocados. Uma transferên-
cessar ponteiros para dados out-of-line, já que um ponteiro cia completa de mensagem é mostrada na Figura B.6.
para dados no espaço de endereçamento do emissor seria invá-
lido no do receptor – principalmente, se o emissor e o recep- B.5.3 O NetMsgServer
tor residirem em sistemas diferentes! Geralmente, os sistemas Para uma mensagem ser enviada entre computadores, seu des-
enviam mensagens copiando os dados do emissor para o recep- tino deve ser localizado e a mensagem deve ser transmitida ao
tor. Já que essa técnica pode ser ineficiente, principalmente destino. Tradicionalmente, o UNIX deixa esses mecanismos a
em caso de mensagens grandes, o Mach otimiza este procedi- cargo dos protocolos de rede de baixo nível que requerem o uso
mento. Os dados referenciados por um ponteiro em uma men- de extremidades de comunicação atribuídas estaticamente (por
sagem sendo enviada a uma porta no mesmo sistema, não são exemplo, o número de porta para serviços baseados em TCP ou
copiados entre o emissor e o receptor. Em vez disso, o mapa de UDP). Um dos princípios do Mach é que todos os objetos no
endereços da tarefa receptora é modificado para incluir uma sistema sejam independentes de localização e que a localização
cópia do tipo cópia após gravação das páginas da mensagem. seja transparente ao usuário. Este princípio requer que o Mach
Essa operação é muito mais rápida do que uma cópia de dados forneça nomeação e transporte transparentes com referência à
e torna a transmissão de mensagens eficiente. Em essência, a localização, para estender a IPC por vários computadores.
O Sistema Mach  3 7

mapa mapa de mapa mapa mapa de mapa


de A kernel de B de A kernel de B

operação de envio operação de recebimento

Figura B.6 Transferência de mensagens no Mach.

Esta nomeação e este transporte são executados pelo à porta original; esse procedimento é um exemplo de como os
Network Message Server (NetMsgServer), um daemon de NetMsgServers cooperam para tornar uma porta substituta
conexão de rede de nível de usuário, baseado em competên- indistinguível da porta original.
cias, que encaminha mensagens entre hosts. Ele também for- Já que o Mach é projetado para funcionar em uma rede de
nece um serviço de nomes primitivo, abrangente a toda a rede, sistemas heterogêneos, ele deve fornecer um meio de enviar,
que permite às tarefas registrarem portas para buscas a serem entre sistemas, dados formatados de uma forma que seja com-
realizadas por tarefas em qualquer outro computador da rede. preensível tanto para o emissor quanto para o receptor. Infeliz-
As portas no Mach só podem ser transferidas em mensagens e mente, os computadores diferem nos formatos que usam para
as mensagens devem ser enviadas a portas; o serviço de nomes armazenar vários tipos de dados. Por exemplo, um inteiro em
primitivo resolve o problema de transferir a primeira porta para um sistema pode ocupar 2 bytes para ser armazenado e o byte
que tarefas em diferentes computadores troquem mensagens. mais significativo pode ser armazenado antes do menos signi-
As interações subsequentes da IPC são totalmente transpa- ficativo. Outro sistema pode inverter esta ordem. Portanto, o
rentes; o NetMsgServer rastreia todos os direitos e a memó- NetMsgServer usa a informação de tipo, armazenada em uma
ria out-of-line passados em mensagens entre computadores e mensagem, para converter os dados do formato do emissor
providencia as transferências apropriadas. Os NetMsgServers para o do receptor. Dessa forma, todos os dados são represen-
mantêm, entre eles próprios, um banco de dados distribuído de tados corretamente quando alcançam seu destino.
direitos de porta transferidos entre computadores e das portas O NetMsgServer de um determinado computador aceita
às quais esses direitos correspondem. RPCs que incluem e buscam portas de rede em seu serviço
O kernel usa o NetMsgServer quando uma mensagem tem de nomes, bem como as removem do seu serviço de nomes.
de ser enviada a uma porta que não está no computador do ker- Como medida de segurança, um valor de porta fornecido em
nel. A IPC do kernel do Mach é usada para transferir a men- uma solicitação de inclusão deve coincidir com o da solicitação
sagem ao NetMsgServer local. O NetMsgServer usa, então, de remoção para que um thread possa requerer a remoção de
quaisquer protocolos de rede apropriados para transferir a um nome de porta do banco de dados.
mensagem ao seu parceiro no outro computador; o conceito Como exemplo da operação do NetMsgServer, consi-
de um NetMsgServer é independente de protocolo e foram dere um thread no nó A enviando uma mensagem para uma
construídos NetMsgServers que usam vários protocolos. É porta que está em uma tarefa no nó B. O programa simples-
claro que os NetMsgServers envolvidos em uma transferência mente envia uma mensagem a uma porta para a qual ele tenha
devem estar de acordo quanto ao protocolo usado. Para con- direito de envio. Primeiro, a mensagem é passada ao kernel que
cluir, o NetMsgServer do computador de destino usa a IPC do a libera para seu primeiro receptor, o NetMsgServer do nó A.
kernel deste computador para enviar a mensagem à tarefa de O NetMsgServer contata, então, (por intermédio de suas infor-
destino correta. mações do banco de dados) o NetMsgServer do nó B e envia a
O recurso de estender a IPC local, transparentemente pelos mensagem. O NetMsgServer do nó B apresenta a mensagem ao
nós, é suportado pelo uso de portas substitutas. Quando um kernel com a porta local apropriada para o nó B. Para concluir,
direito de envio é transferido de um computador para outro, o o kernel fornece a mensagem para a tarefa receptora quando
NetMsgServer do computador de destino cria uma nova porta, um thread desta tarefa executa uma chamada msg_receive.
ou porta substituta, para representar a porta original no des- Essa sequência de eventos é mostrada na Figura B.7.
tino. As mensagens enviadas a essa porta substituta são rece- O Mach 3.0 oferece uma alternativa ao NetMsgServer
bidas pelo NetMsgServer e encaminhadas transparentemente como parte de seu suporte aperfeiçoado a multiprocessadores
3 8   Apêndice B

meio de redes que conectem um multiprocessador NORMA a


sistema A sistema B outros computadores. Além da IPC NORMA, o Mach 3.0 tam-
bém dá suporte ao gerenciamento de memória em um sistema
processo processo NORMA e o recurso pelo qual uma tarefa desse sistema pode
de de criar tarefas filhas em nós que não sejam os seus. Esses recur-
usuário usuário
sos dão suporte à implementação de um sistema operacional de
imagem única em um multiprocessador NORMA; o multipro-
NetMsg- NetMsg- cessador se comporta como um sistema grande e não como um
Server Server agrupamento de sistemas menores (tanto para usuários quanto
para aplicações).

B.5.4 Sincronização Através da IPC


O mecanismo de IPC é extremamente flexível e é usado em
todo o Mach. Por exemplo, ele pode ser usado na sincroniza-
ção de threads. Uma porta pode ser usada como variável de
emissor receptor sincronização e ter n mensagens enviadas para ela por n recur-
sos. Qualquer thread que queira usar um recurso executa uma
chamada de recebimento nessa porta. O thread receberá uma
Figura B.7 Encaminhamento de IPC de rede pelo mensagem se o recurso estiver disponível; caso contrário, ele
NetMsgServer. esperará na porta até que uma mensagem esteja disponível
nesse local. Para devolver um recurso após utilizá-lo, o thread
NORMA. O subsistema de IPC NORMA do Mach 3.0 imple- pode enviar uma mensagem à porta. Neste aspecto, o recebi-
menta funcionalidade semelhante a do NetMsgServer, dire- mento é equivalente à operação de semáforo wait e o envio
tamente no kernel, fornecendo uma IPC entre os nós muito é equivalente a signal. Esse método pode ser usado na sin-
mais eficiente para multicomputadores com hardware de inter- cronização de operações de semáforo entre threads da mesma
conexão rápido. Por exemplo, a demorada cópia de mensa- tarefa, mas não pode ser usado na sincronização entre tarefas
gens entre o NetMsgServer e o kernel é eliminada. O uso da porque apenas uma tarefa pode ter direitos de recebimento em
IPC NORMA não exclui o uso do NetMsgServer; ele ainda uma porta. Para obter mais semáforos de uso geral, podemos
pode ser usado para fornecer o serviço de IPC do Mach por criar um daemon simples que implemente o mesmo método.

B.6 Gerenciamento de Memória


Dada a natureza orientada a objetos do Mach, não é surpresa des também são transferidas como segmentos de memória
que uma abstração fundamental seja o objeto memória. Obje- compartilhada. Para cada um desses segmentos, uma seção
tos memória são usados para gerenciar memória secundária de endereço de memória virtual é usada para conceder aos
e, geralmente, representam arquivos, pipes ou outros dados threads acesso à mensagem. À medida que novos itens são
que sejam mapeados na memória virtual, para leitura e gra- mapeados para o espaço de endereçamento ou dele removi-
vação (Figura B.8). Objetos memória podem ser apoiados por dos, brechas de memória não alocada aparecem no espaço de
gerenciadores de memória de nível de usuário que tomam o endereçamento.
lugar do paginador de memória virtual incorporado ao ker- O Mach não tenta comprimir o espaço de endereça-
nel, mais tradicional, encontrado em outros sistemas ope- mento, embora uma tarefa possa falhar (ou cair) se não hou-
racionais. Ao contrário da abordagem tradicional em que o ver lugar, em seu espaço de endereçamento, para uma região
kernel gerencia a memória secundária, o Mach trata objetos requerida. Considerando que os espaços de endereçamento
memória secundária (geralmente arquivos) como todos os têm 4 GB ou mais, essa limitação não é, atualmente, um pro-
outros objetos do sistema. Cada objeto tem uma porta asso- blema. No entanto, a manutenção de uma tabela de pági-
ciada a ele e pode ser manipulado por mensagens enviadas nas regular num espaço de endereçamento de 4 GB para
a essa porta. Os objetos memória – diferente das rotinas de cada tarefa, especialmente um que contenha brechas, usaria
gerenciamento de memória em kernels tradicionais monolí- montantes excessivos de memória (1 MB ou mais). A chave
ticos – permitem a fácil experimentação de novos algoritmos para espaços de endereçamento esparsos é que o espaço da
de manipulação da memória. tabela de páginas seja usado apenas para regiões corrente-
mente alocadas. Quando ocorre um erro de página, o ker-
nel deve verificar se a página está em uma região válida, em
B.6.1 Estrutura Básica vez de simplesmente indexar a tabela de páginas e verificar
O espaço de endereçamento virtual de uma tarefa é, em geral, a entrada. Embora a busca resultante seja mais complexa, os
esparso e composto por muitas brechas de espaço não alo- benefícios da redução dos requisitos de armazenamento na
cado. Por exemplo, um arquivo mapeado para a memória é memória e da manutenção de um espaço de endereçamento
colocado em algum conjunto de endereços. Mensagens gran- mais simples tornam a abordagem válida.
O Sistema Mach  3 9

espaço de
endereçamento
do usuário
entrada
anterior

próxima
cabeça cauda entrada

início/fim do
espaço de
endereçamento

dados dados não


texto pilha herança
inicializados inicializados

proteção
corrente/máxima

objeto
páginas
armazenadas
em cache deslocamento
nesse local
porta para
memória
entrada do mapa
secundária
objeto memória
virtual

Figura B.8 Mapas de endereços de tarefas na memória virtual do Mach.

O Mach também tem chamadas de sistema para dar suporte criados e mantidos somente pelo kernel) é importante. O resul-
à funcionalidade de memória virtual-padrão, incluindo alo- tado final é que, no sentido tradicional, a memória pode ser
cação, desalocação e cópia de memória virtual. Ao alocar um paginada por gerenciadores de memória escritos pelo usuário.
novo objeto memória virtual, o thread pode fornecer um ende- Quando o objeto é destruído, cabe ao gerenciador de memó-
reço para o objeto ou deixar que o kernel escolha o endereço. ria gravar de volta, na memória secundária, quaisquer páginas
A memória física não é alocada até que as páginas desse objeto alteradas. Nenhuma suposição é feita pelo Mach sobre o con-
sejam acessadas. A memória de retaguarda do objeto é geren- teúdo ou a importância dos objetos memória e, portanto, os
ciada pelo paginador default (Seção B.6.2). Objetos memória objetos memória são independentes do kernel.
virtual também são alocados automaticamente quando uma Em várias circunstâncias, os gerenciadores de memória de
tarefa recebe uma mensagem contendo dados out-of-line. nível de usuário são insuficientes. Por exemplo, uma tarefa, ao
Chamadas de sistema associadas retornam informações alocar uma nova região de memória virtual, pode não ter um
sobre um objeto memória no espaço de endereçamento de uma gerenciador de memória atribuído a essa região, já que ela não
tarefa, alteram a proteção de acesso do objeto e especificam representa um objeto de armazenamento secundário (mas deve
como um objeto deve ser passado a tarefas filhas na hora de ser paginada), ou um gerenciador de memória pode deixar de
sua criação (compartilhado, cópia após gravação ou ausente). executar remoção de páginas da memória. O próprio Mach
também precisa de um gerenciador de memória para cuidar
B.6.2 Gerenciadores de Memória de Nível de suas necessidades de memória. Para esses casos, o Mach for-
de Usuário nece um gerenciador de memória default. O gerenciador de
Um objeto de armazenamento secundário é mapeado para o memória default do Mach 2.5 usa o sistema de arquivos-padrão
espaço de endereçamento virtual de uma tarefa. O Mach man- para armazenar dados que devem ser gravados em disco, em
tém um cache de páginas de todos os objetos mapeados residen- vez de requerer um espaço de permuta separado, como no 4.3
tes na memória, como em outras implementações de memória BSD. No Mach 3.0 (e no OSF/1), o gerenciador de memória
virtual. No entanto, um erro de página que ocorra quando um default pode usar tanto arquivos de um sistema de arquivos-
thread acessa uma página não residente, é executado como padrão como partições de disco dedicadas. O gerenciador de
uma mensagem para a porta do objeto. O conceito de que um memória default tem uma interface semelhante à dos geren-
objeto memória pode ser criado e servido por tarefas não tra- ciadores de nível de usuário, com algumas extensões, para dar
tadas pelo kernel (diferente dos threads, por exemplo, que são suporte ao seu papel como o gerenciador de memória ao qual
4 0   Apêndice B

podemos confiar a execução da remoção de páginas quando ciador de memória, incluída na chamada, invocando a rotina
gerenciadores de nível de usuário deixam de fazê-la. memory_manager_init que o gerenciador de memória
A política de remoção de páginas é implementada por um deve fornecer, como parte de seu suporte a um objeto memó-
thread interno do kernel, o daemon de pageout. Um algoritmo ria. As duas portas passadas para o gerenciador de memória
de paginação baseado em FIFO com segunda chance (Seção são a porta de controle e a porta de nome. A porta de con-
9.4.5) é usado para selecionar páginas a serem substituídas. As trole é usada pelo gerenciador de memória para fornecer dados
páginas selecionadas são enviadas ao gerenciador apropriado ao kernel – por exemplo, páginas a se tornarem residentes. As
(de nível de usuário ou default) para a remoção real de páginas. portas de nome são usadas em todo o Mach. Elas não rece-
Um gerenciador de nível de usuário pode ser mais inteligente bem mensagens, mas são usadas simplesmente como um ponto
do que o gerenciador default e pode implementar um algo- de referência e comparação. Para concluir, o objeto memória
ritmo de paginação diferente, adequado ao objeto ao qual ele deve responder a uma chamada memory_manager_init
está dando suporte (isto é, selecionando alguma outra página com uma chamada memory_object_set_attributes
e removendo-a à força). Se um gerenciador de nível de usuário para indicar que está pronto para aceitar solicitações. Quando
não conseguir reduzir o conjunto de páginas residentes quando todas as tarefas com direitos de envio para um objeto memó-
solicitado a fazer isso pelo kernel, o gerenciador de memória ria, abandonam esses direitos, o kernel desaloca as portas do
default é invocado e ele remove da memória o gerenciador objeto, liberando assim o gerenciador de memória e o objeto
de nível de usuário para reduzir o tamanho do conjunto resi- memória para destruição.
dente desse gerenciador. Se o gerenciador de nível de usuário Várias chamadas do kernel são necessárias para dar suporte
se recuperar do problema que o impediu de executar suas pró- a gerenciadores de memória externos. A chamada vm_map já
prias remoções de páginas, ele acessará essas páginas (fazendo foi discutida no parágrafo acima. Além dela, alguns comandos
o kernel trazê-las para a memória novamente) e poderá então obtêm e configuram atributos e fornecem trancamento no nível
removê-las como achar melhor. de página quando ele é necessário (por exemplo, depois que um
Se um thread precisa acessar dados em um objeto memó- erro de página ocorreu, mas antes que o gerenciador de memó-
ria (por exemplo, um arquivo), ele invoca a chamada de sis- ria tenha retornado os dados apropriados). Outra chamada é
tema vm_map. Essa chamada de sistema inclui uma porta usada pelo gerenciador de memória para passar uma página
que identifica o objeto e o gerenciador de memória que é res- (ou várias páginas, se estiver sendo usada leitura antecipada)
ponsável pela região. O kernel executa chamadas nessa porta para o kernel em resposta a um erro de página. Essa chamada
quando dados estão para ser lidos dessa região ou nela grava- é necessária já que o kernel invoca o gerenciador de memó-
dos. Uma complexidade adicional é que o kernel faz essas cha- ria assincronamente. Para concluir, várias chamadas permitem
madas assincronamente, já que não seria razoável que o kernel que o gerenciador de memória reporte erros ao kernel.
servisse um thread de nível de usuário. Diferente da situação da O próprio gerenciador de memória deve dar suporte a
remoção de páginas, o kernel não tem o que fazer se sua solici- várias chamadas para poder suportar um objeto. Já discuti-
tação não for atendida pelo gerenciador de memória externo. mos memory_object_init e outras. Quando um thread
Ele não tem conhecimento do conteúdo de um objeto ou de causa um erro de página em uma página do objeto memória,
como esse objeto deve ser manipulado. o kernel envia uma memory_object_data_request à
Os gerenciadores de memória são responsáveis pela consis- porta do objeto memória em nome do thread que causou o
tência do conteúdo de um objeto memória, mapeado por tare- erro. O thread é colocado em estado de espera até o gerencia-
fas em diferentes máquinas. (Tarefas em uma única máquina dor de memória retornar a página em uma chamada memory_
compartilham uma única cópia de um objeto memória mapeado.) object_data_provided ou retornar um erro apropriado
Considere uma situação em que tarefas em duas máquinas dife- ao kernel. Qualquer página que tenha sido modificada ou qual-
rentes tentem modificar, concorrentemente, a mesma página quer página preciosa que o kernel precise remover da memória
de um objeto. Cabe ao gerenciador decidir se essas modifica- residente (devido ao envelhecimento da página, por exemplo),
ções devem ser serializadas. Um gerenciador conservador, ao é enviada ao objeto memória por intermédio de memory_
implementar uma consistência rigorosa de memória, obriga- object_data_write. Páginas preciosas são páginas que
ria as modificações a serem serializadas, concedendo acesso de podem não ter sido modificadas, mas que não podem ser des-
gravação a apenas um kernel de cada vez. Um gerenciador mais cartadas, como de outro modo seriam, porque o gerencia-
sofisticado poderia permitir que os dois acessos ocorressem dor de memória não retém mais uma cópia. O gerenciador de
concorrentemente (por exemplo, se o gerenciador soubesse memória declara essas páginas como preciosas e espera que o
que as duas tarefas estavam modificando áreas distintas den- kernel as retorne quando elas são removidas da memória. As
tro da página e que ele poderia mesclar as modificações, com páginas preciosas evitam a duplicação e a cópia desnecessárias
sucesso, em algum momento futuro). A maioria dos gerencia- da memória.
dores de memória externos escritos para o Mach (por exemplo, Ainda há varias outras chamadas para trancamento, infor-
os que implementam arquivos mapeados) não implementam mações de proteção e modificação e os outros detalhes com os
lógica para lidar com kernels múltiplos, devido à complexidade quais todos os sistemas de memória virtual devem lidar.
dessa lógica. Na versão atual, o Mach não permite que gerenciadores de
Quando a primeira chamada vm_map é feita em um objeto memória externos afetem diretamente o algoritmo de substitui-
memória, o kernel envia uma mensagem à porta do geren- ção de páginas. O Mach não exporta as informações de acesso
O Sistema Mach  4 1

à memória que seriam necessárias para que uma tarefa externa sistente apenas quando esta é utilizada por tarefas executadas
selecione a página menos recentemente usada, por exemplo. em processadores que compartilhem memória. Uma tarefa pai
Métodos para fornecer essas informações estão sendo investi- pode declarar as regiões de memória que devem ser herdadas
gados atualmente. Um gerenciador de memória externo conti- por seus filhos e quais regiões devem ser de leitura-gravação.
nua sendo útil por várias razões, no entanto: Esse esquema é diferente da herança com cópia após grava-
• Ele pode rejeitar o alvo que o kernel deseja substituir se sou- ção em que cada tarefa mantém sua própria cópia de quaisquer
ber de uma candidata melhor (por exemplo, a substituição de páginas alteradas. Um objeto gravável é endereçado a partir
páginas MRU). do mapa de endereços de cada tarefa e todas as alterações são
feitas na mesma cópia. Os threads das tarefas são responsáveis
• Ele pode monitorar o objeto memória ao qual estiver dando por coordenar as alterações na memória para que elas não
suporte e solicitar que páginas sejam removidas antes que a
afetem uns aos outros (gravando na mesma locação concor-
memória invoque, como de costume, o daemon de pageout
rentemente). Essa coordenação pode ser feita por meio dos
do Mach.
métodos normais de sincronização: seções críticas ou locks
• Ele é particularmente importante para manter a consistência de exclusão mútua.
da memória secundária no caso de threads de processadores Para o caso de memória compartilhada entre máqui-
múltiplos, como mostramos na Seção B.6.3. nas separadas, o Mach permite o uso de gerenciadores de
• Ele pode controlar a ordem de operações na memória secun- memória externos. Se um conjunto de tarefas não relacio-
dária para impor restrições de consistência demandadas por nadas quer compartilhar uma seção de memória, as tare-
sistemas de gerenciamento de bancos de dados. Por exemplo, fas podem usar o mesmo gerenciador de memória externo
para registrar o histórico de transações, estas devem ser gra- e acessar as mesmas áreas de memória secundária por seu
vadas em um arquivo de log em disco antes de modificarem intermédio. O implementador desse sistema teria que escre-
os dados do banco de dados. ver as tarefas e o paginador externo. Esse paginador poderia
• Ele pode controlar o acesso a arquivos mapeados. ser muito simples ou muito complicado, conforme neces-
sário. Uma implementação simples não permitiria leituras
enquanto uma página estivesse sendo gravada. Qualquer
B.6.3 Memória Compartilhada tentativa de gravação faria o paginador invalidar a página
O Mach usa memória compartilhada para reduzir a complexi- em todas as tarefas que a estivessem acessando no momento.
dade de vários recursos do sistema, assim como para fornecer O paginador permitiria, então, a gravação e revalidaria as
esses recursos de maneira eficiente. A memória comparti- leituras com a nova versão da página. Os leitores simples-
lhada, em geral, permite comunicação extremamente rápida mente acompanhariam a manipulação de um erro de página
entre processos, reduz o overhead no gerenciamento de arqui- até a página se tornar novamente disponível. O Mach for-
vos e ajuda a suportar multiprocessamento e gerenciamento de nece um gerenciador de memória como esse: o Network
bancos de dados. No entanto, o Mach não usa memória com- Memory Server (NetMemServer). Para multicomputadores,
partilhada para todos esses papéis tradicionais da memória a configuração NORMA do Mach 3.0 fornece suporte seme-
compartilhada. Por exemplo, todos os threads de uma tarefa lhante como parte-padrão do kernel. Esse subsistema XMM
compartilham a memória dessa tarefa e, portanto, nenhum permite que sistemas multicomputadores usem gerenciado-
recurso formal de memória compartilhada é necessário den- res de memória externos que não incorporem lógica para
tro de uma tarefa. Porém, o Mach ainda deve fornecer memória manipulação de kernels múltiplos; o subsistema XMM é res-
compartilhada tradicional para dar suporte a outros construto- ponsável por manter a consistência dos dados entre ker-
res do sistema operacional, como a chamada de sistema fork nels múltiplos que compartilhem memória e por fazer com
do UNIX. que esses kernels pareçam um único kernel para o gerencia-
É obviamente difícil que tarefas de várias máquinas com- dor de memória. O subsistema XMM também implementa
partilhem memória e mantenham a consistência dos dados. lógica de cópia virtual para os objetos mapeados que ele
O Mach não tenta resolver esse problema diretamente; em gerencia. Essa lógica de cópia virtual inclui tanto cópia após
vez disso, ele fornece recursos para permitir que o problema referência entre kernels multicomputadores quanto otimi-
seja resolvido. O Mach suporta memória compartilhada con- zações sofisticadas de cópia após gravação.

B.7 Interface do Programador


Um programador pode trabalhar em vários níveis dentro do Mach. O Mach 3.0 abandonou o modelo de servidor único para
É claro que há o nível de chamadas de sistema que, no Mach 2.5, é dar suporte a servidores múltiplos. Portanto, ele se tornou
equivalente à interface de chamadas de sistema do 4.3 BSD. A ver- um verdadeiro microkernel, sem todos os recursos normal-
são 2.5 inclui grande parte do 4.3 BSD como um thread no kernel. mente encontrados em um kernel. Em vez disso, toda a fun-
Uma chamada de sistema BSD faz a interceptação para o kernel cionalidade pode ser fornecida por intermédio de bibliotecas
e é atendida por esse thread em nome do chamador, de maneira de emulação, de servidores ou de uma combinação dos dois.
semelhante a como o BSD-padrão a manipularia. A emulação não Para manter a definição de microkernel, as bibliotecas de emu-
é multithreads e, portanto, tem eficiência limitada. lação e servidores executam fora do kernel em nível de usuário.
4 2   Apêndice B

Dessa forma, vários sistemas operacionais podem ser executa- No próximo nível mais alto de programação está o pacote
dos concorrentemente em um kernel do Mach 3.0. de threads C. Esse pacote é uma biblioteca de tempo de exe-
Uma biblioteca de emulação é um conjunto de rotinas que cução que fornece uma interface da linguagem C para as
reside em uma parte somente de leitura do espaço de endereça- primitivas de threads básicas do Mach. Ele fornece acesso
mento de um programa. Quaisquer chamadas do sistema ope- conveniente a essas primitivas, incluindo rotinas para cria-
racional que o programa faça, são convertidas em chamadas ção e junção de threads, exclusão mútua por meio de variá-
de sub-rotinas para a biblioteca. Sistemas operacionais monou- veis mutex (Seção B.4.2) e sincronização por meio do uso de
suários, como o MS-DOS e o sistema operacional Macintosh, variáveis de condição. Infelizmente, não é apropriado que o
têm sido implementados exclusivamente como bibliotecas pacote de threads C seja usado entre sistemas que não com-
de emulação. Por razões de eficiência, a biblioteca de emula- partilhem memória (sistemas NORMA) porque ele depende
ção reside no espaço de endereçamento do programa que pre- de memória compartilhada para implementar seus constru-
cisa de sua funcionalidade; mas, em teoria, ela poderia ser uma tores. Atualmente, não há algo equivalente aos threads C para
tarefa separada. sistemas NORMA. Outras bibliotecas de tempo de execução
Sistemas operacionais mais complexos são emulados por têm sido escritas para o Mach, inclusive o suporte de threads
meio do uso de bibliotecas e de um ou mais servidores. Chama- a outras linguagens.
das de sistema que não possam ser implementadas na biblio- Embora o uso de primitivas torne o Mach flexível, tam-
teca, são redirecionadas ao servidor apropriado. Os servidores bém torna muitas tarefas de programação repetitivas. Por
podem ser multithreads para aumentar a eficiência; o BSD e o exemplo, quantidades significativas de código são associadas
OSF/1 são implementados como servidores multithreads indi- ao envio e recebimento de mensagens por tarefas que usem
viduais. Os sistemas podem ser decompostos em vários servi- mensagens (que, no Mach, são quase todas). Portanto, os
dores, para maior modularidade. projetistas do Mach fornecem um gerador de interfaces (ou
Funcionalmente, uma chamada de sistema começa em uma gerador de stubs) chamado MIG. O MIG é, essencialmente,
tarefa e passa pelo kernel antes de ser redirecionada, se apro- um compilador que recebe, como entrada, uma definição da
priado, à biblioteca do espaço de endereçamento da tarefa ou interface a ser usada (declarações de variáveis, tipos e proce-
a um servidor. Embora essa transferência de controle adicio- dimentos) e gera o código de interface RPC necessário para
nal diminua a eficiência do Mach, essa diminuição é um pouco enviar e receber as mensagens que estejam de acordo com
amenizada pela capacidade de threads múltiplos executarem, essa definição e para conectar as mensagens aos threads emis-
concorrentemente, códigos semelhantes aos do BSD. sores e receptores.

B.8 Resumo
O sistema operacional Mach é projetado para incorporar as que o código de suporte do 4.3 BSD seja executado no espaço
várias inovações recentes da pesquisa em sistemas operacio- do usuário, em um sistema Mach 3.0.
nais e produzir um sistema operacional totalmente funcional e O Mach usa processos peso-leves, na forma de threads de
tecnicamente avançado. execução múltiplos dentro de uma tarefa (ou espaço de ende-
O Mach foi projetado visando três objetivos críticos: reçamento), para suportar multiprocessamento e computação
• Emular o UNIX 4.3 BSD de modo que os arquivos execu- paralela. Seu uso extensivo de mensagens, como único método
táveis de um sistema UNIX possam ser executados correta- de comunicação, assegura que os mecanismos de proteção
mente sob o Mach. sejam completos e eficientes. Ao integrar as mensagens ao sis-
tema de memória virtual, o Mach também assegura a sua mani-
• Ser um sistema operacional moderno que suporte muitos
pulação eficiente. Para concluir, ao fazer o sistema de memória
modelos de memória, bem como computação paralela e dis-
virtual usar mensagens para se comunicar com os daemons que
tribuída.
gerenciam a memória de retaguarda, o Mach fornece grande
• Obter um kernel mais simples e fácil de modificar do que o flexibilidade ao projeto e à implementação dessas tarefas de
4.3 BSD. gerenciamento do objeto memória.
Como mostramos, o Mach está a caminho de alcançar esses Ao fornecer chamadas de sistema de baixo nível, ou pri-
objetivos. mitivas, a partir das quais funções mais complexas possam ser
O Mach 2.5 inclui o 4.3 BSD em seu kernel, o que fornece a construídas, o Mach reduz o tamanho do kernel ao mesmo
emulação necessária, mas aumenta o kernel. Esse código do 4.3 tempo em que permite a emulação do sistema operacional no
BSD foi reescrito para fornecer a mesma funcionalidade do 4.3, nível do usuário, de forma muito semelhante aos sistemas de
mas utilizando as primitivas do Mach. Tal alteração permite máquina virtual da IBM.

Exercícios
B.1 Quais são os três recursos do Mach que o tornam apropriado B.2 Cite duas maneiras pelas quais os conjuntos de portas sejam
ao processamento distribuído? úteis na implementação de programas paralelos.
O Sistema Mach  4 3

B.3 Considere uma aplicação que mantenha um banco de dados B.7 Por que os gerenciadores de memória externos não conseguem
e forneça recursos para que outras tarefas incluam e excluam substituir os algoritmos internos de substituição de páginas?
informações ou consultem o banco de dados. Forneça três De que informações os gerenciadores externos precisariam
configurações de portas, threads e tipos de mensagens que para tomar decisões de substituição de páginas? Por que o
poderiam ser usadas para implementar esse sistema. Qual é fornecimento dessas informações violaria o princípio que
a melhor? Explique sua resposta. embasa os gerenciadores externos?
B.4 Descreva uma tarefa que promova a migração de subtarefas B.8 Por que é difícil implementar exclusão mútua e variáveis
(tarefas criadas por ela) para outros sistemas. Inclua de condição em um ambiente no qual CPUs semelhantes
informações sobre como ela decidiria quando migrar as não compartilham qualquer memória? Que abordagem e
tarefas, que tarefas seriam migradas e como a migração mecanismo poderiam ser usados para tornar esses recursos
ocorreria. disponíveis em um sistema NORMA?
B.5 Cite dois tipos de aplicações para as quais você usaria o pacote B.9 Quais são as vantagens de reescrever o código do 4.3 BSD
MIG. como uma biblioteca de nível de usuário externa, em vez de
deixá-lo como parte do kernel do Mach? Há desvantagens?
B.6 Por que alguém usaria chamadas de sistema de baixo nível
Explique sua resposta.
em lugar do pacote de threads C?

Notas Bibliográficas
O sistema operacional Accent foi descrito por Rashid e Robert- Os tópicos incluem uma visão geral, threads, conexão de rede,
son [1981]. Uma visão geral histórica da evolução desde um gerenciamento de memória, muitos detalhes internos e alguns
sistema ainda mais antigo, o RIG, passando pelo Accent até o exemplos de implementações do Mach. Os slides dessas pales-
Mach foi fornecida por Rashid [1986]. Discussões gerais rela- tras foram fornecidos pela OSF [1989].
cionadas ao modelo do Mach foram oferecidas por Tevanian e O grupo de notícias comp.os.mach, acessível em sistemas
Smith [1989]. em que o USENET News está disponível (a maioria das insti-
Accetta et al. [1986] apresentaram uma visão geral do pro- tuições educacionais dos Estados Unidos e algumas em outros
jeto original do Mach. O scheduler do Mach foi descrito em países), é usado na troca de informações sobre o projeto do
detalhes por Tevanian et al. [1987a] e Black [1990]. Uma ver- Mach e seus componentes.
são mais antiga do sistema de mapeamento de memória e de Uma visão geral da estrutura do microkernel do Mach 3.0,
memória compartilhada do Mach foi apresentada por Teva- complementada com análises de desempenho do Mach 2.5 e
nian et al. [1987b]. 3.0 comparadas com outros sistemas, foi fornecida em Black et
A descrição mais atual do pacote de threads C apareceu al. [1992]. Detalhes dos mecanismos internos do kernel e das
em Cooper e Draves [1987]; o MIG foi descrito por Draves et interfaces do Mach 3.0 foram fornecidos em Loepere [1992].
al. [1989]. Uma visão geral da funcionalidade desses pacotes e Tanenbaum [1992] apresentou uma comparação entre o Mach
uma introdução geral à programação no Mach foram apresen- e o Amoeba. Discussões relacionadas ao paralelismo no Mach
tadas por Walmer e Thompson [1989] e Boykin et al. [1993]. e no 4.3 BSD foram oferecidas por Boykin e Langerman [1990].
Black et al. [1988] discutiram o recurso de manipulação Pesquisas em andamento foram apresentadas em USENIX
de exceções do Mach. Um depurador multithreads, com base Mach and Microkernel Symposia [USENIX 1990, USENIX 1991
nesse mecanismo, foi descrito em Caswell e Black [1989]. e USENIX 1992b]. Áreas ativas de pesquisa incluem memó-
Uma série de palestras sobre o Mach, patrocinadas pelo ria virtual, tempo real e segurança (McNamee e Armstrong
consórcio UNIX da OSF, está disponível em videotape da OSF. [1990]).

Créditos
As Figuras B.1, B.6 e B.8 foram reproduzidas com permissão A Figura B.6 foi reproduzida de Accetta, Baron, Bolosky,
da Open Software Foundation, Inc. Extraídas da Mach Lecture Golub, Rashid, Tevanian e Young, “Mach: A New Kernel Foun-
Series, OSF, outubro de 1989, Cambridge, Massachusetts. dation for UNIX Development”, Proceedings of Summer
As Figuras B.1 e B.8 foram apresentadas por R. Rashid da USENIX, junho de 1986, Atlanta, Georgia. Reimpressa com
Carnegie Mellon University e a Figura B.7 foi apresentada por permissão dos autores.
D. Julin também da Carnegie Mellon University.

Você também pode gostar