Uma comparação prática entre sistema Multitarefa e Multithread: UNIX e NT


Autor: José Francisco Marochi Mayer - ASTEC
As aplicações modernas apontam cada vez com mais clareza as fraquezas de alguns sistemas operacionais - que já podemos chamar de ultrapassados - como o MS-DOS, indicando a necessidade cada vez maior de um Sistema Operacional mais completo e seguro. Sistemas que consigam compartimentalizar processos de forma que não interfiram uns nos outros.

As necessidades cada vez maiores de processamento também apontam para sistemas que sejam inteligentes o suficiente para usar muito mais que os pobres 640 Kb do MS-DOS. Estudos indicam que a evolução das aplicações consomem 1 bit de endereçamento por ano. Isto equivale a dobrar a capacidade de endereçamento a cada ano. Os 16 bits da década de 80 já se esgotaram. A julgar pelo ritmo frenético em que as coisas estão acontecendo, entre 96 e 98 estaremos estourando os 32 bits. Felizmente, o aparecimento de processadores de 64 bits nos dão fôlego por mais trinta anos (espera-se).

Seja como for, qualquer Sistema Operacional que se apresente como moderno deve ter capacidade para trabalhar com espaços de endereçamento grandes (32, 64,128, ... ).

Porém as características não param aí. Não podemos mais imaginar Sistemas Operacionais multitarefa onde uma delas tome conta da máquina. O escalonamento preemptivo, que permite a interrupção de uma tarefa por tempo ou por outra de alta prioridade não é apenas uma necessidade, passa a ser item obrigatório.

Temos ainda a questão do multiprocessamento, ou seja, processamento paralelo, como ter várias CPUs trabalhando em conjunto para obter resultados mais rápidos, é o desafio. Tanto o UNIX quanto o NT estão aptos para tal.

Mas, por que não aproveitar ao máximo a característica do multiprocessamento para o próprio núcleo do Sistema Operacional? As threads estão trazendo o conceito deste tipo de aproveitamento de forma a maximizar sua utilização.

Estes são apenas alguns aspectos dentre tantos, como: segurança, sistema de arquivos mais amplo e seguro, comunicação mais facilitada entre ambientes, internacionalização de aplicativos, etc.

Nesta arena de batalha, despontam dois gladiadores, de peso: UNIX e NT. Qual deles sairá vitorioso? Cada um que faça sua escolha, polegar para cima ou para baixo, é uma questão de experimentar o quanto cada um pode oferecer.

1 Breve Histórico

Feitos em épocas diferentes, guardadas as devidas proporções, ambos os sistemas UNIX e NT tiveram seu início como fruto de uma necessidade dos usuários. Ora no meio técnico e acadêmico, ora pelos próprios ditames da nova era de usuários da computação pessoal.

1.1 UNIX

O Sistema Operacional UNIX tem sua origem nos Laboratórios Bell a partir do Multics, por volta de 1969. O Multics pode ser considerado o precursor dos sistemas interativos. A dificuldade de se trabalhar com sistemas operados apenas no modo Batch fomentou a idéia de sistemas em que a resposta poderia ser imediata, contra os vários minutos perdidos nos tradicionais batch. Embora tivesse dado um avanço, o Multics apresentava ainda dificuldades aos programadores. Em 1969, Ken Thompson desenvolveu um Sistema Operacional que viria ao encontro das necessidades dos programadores e também tomando o acesso as máquinas mais fácil. Assim nasceu o UNIX.

Mas os problemas não paravam aí. Ao desenvolver sistemas baseados em linguagens simbólicas, dependentes da própria máquina, perdia-se a possibilidade de se transportar facilmente para outras máquinas. Atento a isso, Ken Thompson desenvolveu uma linguagem chamada B. Esta, depois de modificada por Dennis Ritchie, teve seu nome alterado para C, muito conhecida de nós até hoje. Feito isto, Ken, Ritchie e outros reescreveram o sistema UNIX em C o que lhe dava a característica de portabilidade. Podemos então dizer que o UNIX e a Linguagem C praticamente nasceram juntos.

Posteriormente, já na Universidade da Califórnia, Berkley, em 1976, Ken, após apresentar o sistema UNIX, desenvolveu quase totalmente o que seria chamado de versão 6.

Em 1977, Ken retorna aos laboratórios Bell e continua trabalhando no UNIX. A esta altura, a ampla utilização pelos Laboratórios Bell e empregados de agências governamentais contribuíram para a divulgação cada vez maior do UNIX. As universidades também viram no Sistema UNIX uma opção.

A partir de 1979 a demanda comercial aumentou, mas haviam problemas, especialmente, como a proteção de dados confidenciais e programas de uso mais simples. Em 1982 a Bell lançou o sistema III. Em 1983, o sistema V.

Apesar de se dizer um sistema aberto, a divulgação dos fontes no início de sua vida tornou o UNIX um sistema cheio de clones (Xenix, SCO, UNIXWARE,...). Apesar de, basicamente, todos se equivalerem, cada fabricante implementou alguns componentes que dão os chamados sabores diferenciados para o UNIX.

1.2 NT

No giro tecnológico da informática é interessante notar como o hardware tem evoluído rapidamente, enquanto os softwares nem sempre têm acompanhado. Especialmente quando pensamos em sistemas operacionais, verificamos que o velho MS-DOS de guerra é velho mesmo. Se considerarmos o quanto demora para projetar e construir um sistema operacional até o momento em que chega às mãos do usuário final, percebemos como passam rapidamente 10, 15 ou mais anos.

As constantes mudanças de hardware colaboram às vezes para a estagnação de certos sistemas operacionais que dependem muito da máquina em que vão rodar. Construir um Sistema Operacional independente de hardware é, ou era, o sonho de qualquer desenvolvedor de software.

Certamente foi considerando estes aspectos que a Microsoft contratou David N. CuttIer, em outubro de 1988, para liderar o esforço de desenvolvimento de um novo sistema operacional para os anos 90. David já tinha larga experiência em Sistemas Operacionais e rapidamente formou uma equipe para criar o novo Sistema Operacional que viria revolucionar e provocar discussões acaloradas na sua implantação.

Alguns pontos básicos deveriam ser considerados, visando atender expectativas do mercado em relação a um novo Sistema Operacional.

* Portabilidade - considerando as tecnologias emergentes de máquinas RISC, multiprocessadores, arquiteturas 32 e 64 bits, enfim, as constantes mudanças demonstravam a necessidade de escrever em linguagem portável.
* Multiprocessamento - de forma a tornar mais eficiente a utilização de computadores multiprocessados, a arte de poder processar simultaneamente, dividindo o tempo entre os processadores disponíveis.
* Distribuição - a revolução ocasionada pelo uso de computadores pessoais mudou o enfoque anterior de concentrar em uma única máquina o processamento e os dados. O que surge com força total na década de 90 é a capacidade de compartilhar recursos, de estabelecer fácil comunicação e poder se valer do poder de processamento compartilhado em uma rede.
* POSIX - com a adoção do POSIX pelo governo americano e outros, parece inevitável que um sistema operacional de futuro esteja aderente a este. Este desafio foi também considerado no desenvolvimento do NT.
* Segurança - este é um dos mais críticos itens dos sistemas atuais. No desenvolvimento do NT foi considerado alcançar os níveis de segurança C2, definido pelo governo americano, mas espera-se, em versões futuras, poder satisfazer níveis de segurança mais altos.

2 Características

Embora guardem alguma relação entre si, especialmente na multitarefa, o Windows NT é um sistema que procura responder às necessidades cada vez maiores de Sistemas Operacionais ágeis e que possam multiplicar o poder dos computadores e se valer de computadores multiprocessados.

2.1 UNIX

A estrutura do UNIX pode ser dividida basicamente em três: Kernel, Shell e Aplicativos. Poderíamos acrescentar mais uma que seria a dos programas dos usuários (fig. 1). O Kernel planeja tarefas e administra os dados. O shell é a interface com o usuário. Esta interpreta os pedidos do usuário e executa os programas para atender o pedido. Na camada de aplicativos encontramos capacidades especiais incorporadas ao Sistema Operacional.

Comparacao1.gif (10992 bytes)

Figura 1

Portabilidade é a característica mais marcante do UNIX. Cerca de 90% do Kernel está escrito em C e o restante em linguagem de máquina. Assim, quando se quer portar o UNIX para uma nova máquina, no máximo 10% deverá ser reescrito. A portabilidade pode ser dividida em duas, a do próprio sistema e a dos aplicativos. Os aplicativos escritos em C, Pascal, Basic, etc. são facilmente portados de um sistema UNIX para outro. Eventualmente, algumas funções não padronizadas para todos os sabores de UNIX deverão ser reescritas. No mais, é só recompilar.

Capacidade Multiusuário significa que o UNIX suporta mais que um usuário simultaneamente. Estes usuários podem compartilhar os recursos como dados, impressoras, etc. O sistema UNIX foi projetado de forma a atribuir níveis de segurança com relação aos recursos que estarão disponíveis para cada usuário.

Capacidade Multitarefa é a capacidade dada ao usuário de realizar mais de uma tarefa simultaneamente. Pode-se, por exemplo, estar editando um arquivo enquanto outro está sendo impresso e um terceiro processo efetua manutenção em Banco de Dados. As tarefas executadas simultaneamente podem ter prioridades diferentes e são executadas em background. Existem limites para o número de tarefas simultâneas que dependem das características da máquina que se estiver usando. Também o número maior de tarefas afeta o tempo de resposta geral do sistema.

O sistema de arquivamento do UNIX é hierárquico. Os programas e dados podem ser organizados convenientemente. Inicia sempre pelo /root e apresenta alguns subdiretórios padrão (fig. 2).

Comparacao2.gif (5034 bytes)

Figura 2

2.2 NT

Também no caso do NT podemos dividir sua estrutura em duas partes: o modo usuário (subsistemas protegidos) e o modo executivo (Kernel). Os subsistemas comunicam-se através de mensagens, usando a filosofia cliente e servidor de processos. O executivo é capaz de suportar qualquer número de processos servidores. Esta abordagem permite a implementação de um Sistema Operacional em que os componentes são pequenos e independentes. Os serviços são prestados por servidores especializados e atendem a solicitações de clientes que podem ser outro processo servidor do sistema operacional ou um programa aplicativo.

Cada subsistema protegido fornece uma API através da qual pode ser chamado. Quando deseja um serviço aciona uma API que envia uma mensagem para o servidor. O servidor responde mandando uma mensagem de volta.

Os subsistemas podem ser de ambiente ou integrais. O primeiro fornece API específica para um sistema operacional. É assim que se torna possível coexistirem o ambiente WIN32, POSIX, OS/2, Windows 16 e o MS-DOS. Cada um desses subsistemas tem um API, embora usem sempre o WIN32 para receber entradas e exibir saídas para o usuário.

Já os subsistemas integrais executam funções importantes para o sistema operacional como o subsistema de segurança. É ele que anota os privilégios especiais, recursos que estão sendo auditados para acesso, mensagens de auditoria que devem ser geradas, etc. Também são implementados vários serviços de rede através dos subsistemas integrais.

Comparacao3.gif (12665 bytes)

Figura 3

O executivo consiste em uma série de componentes implementados em dois grupos fundamentais: serviços de sistema, que podem ser chamados por outros componentes do próprio executivo e outros subsistemas; rotinas internas, disponíveis apenas para componentes internos ao executivo.

As responsabilidades dos componentes do executivo são várias, como: Gerenciador de Objetos, monitor de referência de segurança, gerenciador de processos, chamada de procedimento (LPC), gerenciador de memória virtual, e outras. Cabe destacar uma delas, a camada de abstração do Hardware (HAL). Ela coloca uma camada de código entre o executivo e o hardware onde o NT está sendo processado. Esta camada é responsável pela facilidade de portar o NT para qualquer hardware.

O subsistema de ambiente Win32 é o responsável pela interface com o usuário. Além de controlar os dispositivos de entrada como teclado, mouse e outros, além do que é exibido na tela, ele é o servidor para aplicações Win32. Quando uma aplicação não reconhecida pelo Win32 ocorre, ele reconhece o tipo de aplicação e chama o respectivo subsistema para executá-la. É assim que é possível emular o MS-DOS, o OS/2 e aplicações Windows 16 bits.

3 Conceituação

Para entender melhor a diferença entre a forma de trabalhar dos sistemas operacionais UNIX e NT é importante buscar alguns conceitos básicos como multitarefa, multithread, multiprocessamento.

3.1 Monotarefa

Cada tarefa se ocupa totalmente com um processo ou operação de I/O de cada vez. Uma tarefa é executada após terminar completamente outra (fig. 4). É assim que funciona o tradicional MS-DOS.

Comparacao4.gif (3675 bytes)

Figura 4

3.2 Muititarefa

Significa que um determinado usuário pode realizar mais de uma tarefa ao mesmo tempo. Por exemplo: atualizar um Banco de Dados e emitir um relatório. As tarefas podem ser executadas em segundo plano ou não. Depende se há ou não interação com o usuário. O limite de tarefas que podem ser abertas simultaneamente depende das características da máquina. Porém, é certo que quanto maior número de tarefas abertas, tanto mais lento será o tempo de resposta global do Sistema Operacional (fig. 5).

Comparacao5.gif (4916 bytes)

Figura 5

Podemos dividir a multitarefa em cooperativa e preemptiva.

No caso da multitarefa, cooperativa, quando uma tarefa é iniciada, pega o controle dos recursos do Sistema Operacional e do Hardware, devolvendo-o eventualmente para a próxima. Isto funciona conforme o comportamento da aplicação. Se ela demandar um processamento longo sobre si mesma, pode prender o Sistema Operacional todo.

Na multitarefa preemptiva, o Sistema Operacional reparte fatias de tempo e recursos do sistema para cada tarefa. Quando o tempo de uma tarefa estoura, ela é suspensa, salvando-se seu estado para ser restaurado mais tarde, quando ela for novamente ativada. Outra tarefa é restaurada para tomar o seu lugar. Também quando uma tarefa de alta prioridade é detectada pode ser feita a troca. Este recurso garante que nenhuma aplicação irá consumir todos os recursos do sistema.

3.3 Multithread

Permite que uma tarefa seja dividida em duas ou mais subtarefas (threads). Cada subtarefa pega uma linha de operações da CPU. As linhas são executadas de forma concorrente.

Multithread ou Multiplethread = múltiplas linhas de execução, suplementam a capacidade de multitarefa.

Diferença básica entre multitarefa e multithread: na multitarefa é necessário que se inicie outro programa para que haja execução simultânea. Na multithread abre-se uma nova thread de um mesmo programa e basta utilizar variáveis comuns para haver troca de informações. Isto requer menos recursos, diminuindo a complexidade dos aplicativos. Esta característica também oferece vantagem mesmo quando se utiliza uma única CPU.

3.4 Muitiprocessamento

É quando existem dois ou mais processadores (CPU) em uma mesma máquina. Podemos ainda dividir o multiprocessamento em Simétrico e Assimétrico.

O MPS (multiprocessamento simétrico) aumenta quase linearmente o desempenho, na medida que acrescentamos novos processadores. No MPS os processadores compartilham acesso a recursos do Sistema Operacional como memória, disco e outros subsistemas. Todos os processadores desempenham os mesmos tipos de funções, assumindo qualquer atividade que chegue até eles.

Já no caso dos MPA (multiprocessadores assimétricos) há menor escalonabilidade, embora em algumas situações específicas eles possam produzir melhores resultados. Isso se explica pelo fato de trabalharem como uma equipe, com processadores especializados para várias atividades.

Alguns superservidores apresentam, ao mesmo tempo, ambas as características, mas na maior parte das vezes apenas uma ou outra.

Conclusão

Aliando-se a multitarefa, multithread e multiprocessamento é possível ter ganhos importantes no tempo total de execução de uma tarefa (fig. 6).

Comparacao6.gif (4139 bytes)

Figura 6

Tanto o UNIX quanto o NT se valem dos recursos de multitarefa e multiprocessamento. Começam a surgir no mercado máquinas multiprocessadas, o que garante maior utilização destas técnicas. Nem todos os Sistemas Operacionais UNIX utilizam o multiprocessamento simétrico.

O NT, além de usar o multiprocessamento simétrico, trata as tarefas como threads. Cada processo no NT tem pelo menos uma thread. Um processo pode abrir novas threads, na medida que for necessário. Essas threads, em geral, tratam de operações assíncronas que podem, portanto, ocorrer a qualquer momento, independente do fluxo principal do programa.

Alguns UNIX simulam a filosofia de threads detendo-se porém no tratamento por processo. A vantagem do NT é tratar as threads mesmo dentro do próprio Sistema Operacional, o que lhe traz vantagens adicionais.

Aparentemente o NT é uma resposta à altura das expectativas de um sistema operacional moderno e que também está muito aderente à nova filosofia de Cliente/Servidor. O UNIX, sistema que já pode ser considerado de vida média, certamente tem ainda muita aplicação. No entanto, deve evoluir para conceitos que lhe dêem maior portabilidade - como o HAL do NT - e evoluir para o melhor aproveitamento de máquinas multiprocessadas.

Referências bibliográficas:

1. CUSTER, Helen. Windows NT. São Paulo: Makron Books, 1993. 410p.

2. ENGLER, Natalie & LINTHICUM, David. Mais do que um PC turbinado. Byte, São Paulo, v.3, n.4, p.134-135, abr. 1994.

3. EZZELL, Ben. The power under the hood. PC Magazine, New York, v. 12, n. 12, p. 173-196, june 1993.

4. NORTON, Peter & WILTON, Richard. Novo guia Peter Norton para programadores do IBM PC e PS/2. Rio de Janeiro: Campus, 1991. 472p.

5. ROBINSON, Jim et al. Windows NT: NOS or NOT? LAN Magazine, USA, p. 164-176, feb. 1994

6. SANT'ANNA, Mauro. Multithread, o que significa e quais as vantagens. PC World, Rio de Janeiro, v.2, n.22, p.76, abr. 1994.

7. THOMAS, Rebecca & YATES, Jean. UNIX Total. São Paulo: McGraw Hili, 1989. 744p.

8. UDELL, Jon. Justificando o NT. Byte Brasil, São Paulo, v.3, n.5, p.68-77, maio 1994.

9. WINDOWS NT a revolução no cenário do PC. PC World, Rio de Janeiro, v. 1, n. 16, p.38-43, out. 1993.