At 20:42 9/7/2001 -0300, Edgard Lemos wrote:
>A vers�o 2.0 do Apache parece resolver os dois problemas numa cajadada
>s�. Multithread para POSIX e interface nativa para Windows.
>
>Mas a minha pergunta � o seguinte: o que o Linux faz para tratar
>threads e processos do mesmo modo? A maneira como Linux trata os
>processos d� algum ganho de modo que fique t�o r�pido quanto se os
>tratasse como threads?

Os outros sistemas operacionais sao sistemas microkernel, escritos para 
trabalhar em ambiente de multiprocessamento sim�trico. Nesse ambiente, 
aplicacoes multithreaded tomam vantagem, pois v�rias camadas de execu��o 
podem 'espalhar-se' nos v�rios processadores executando blocos de instru��o 
simetricamente. Mas nesses sistemas, por uma razao de performance, o c�digo 
para context-switching, que trata 'revezamento' entre processos geralmente 
roda dentro do microkernel, enquanto o codigo de gerenciamento de memoria 
reservada aos processos fica uma camada acima, sendo uma operacao penosa 
fazer fork's de processos nesses sistemas, pois para cada um ele teria que 
se reportar ao c�digo q est� na camada superior para fazer alocacao de 
memoria, abrir descritores de arquivo etc. Para entender context-switching, 
� bom saber que sistemas operacionais multitarefa reservam para cada tarefa 
tem um tempo X para permanecer no processador, e encerrado esse tempo passa 
para outra tarefa q esteja na fila de execucao.

Na verdade, a ideia por tr�s do design desses sistemas operacionais � que a 
criacao de novos processos seja uma coisa muito rara, sendo apenas um 
'trip�' para as threads, pois o processamento de instrucoes se daria nessas 
threads compartilhando o mesmo espaco de memoria desses processos e �s 
vezes os mesmos fds. Entao, a propria engine de context-switching (ou 
agendador) se encarregaria de espalhar esses blocos de execucao por cada 
processador.

Em sistemas monoliticos como o Linux nao existe isso, e como o agendador 
est� na mesma unica camada que o codigo que gerencia memoria, tempo 
disponivel dos processadores e etc, � muito mais r�pido criar novos 
processos de uma vez pois n�o h� necessidade de passar por uma camada para 
reportar-se a uma entidade principal. Apesar de haver memoria protegida, 
nao h� separacao em nivel de codigo entre gerenciamento de mem�ria do 
nucleo, memoria dos servicos e memoria das aplicacoes, e em Linux e outros 
unixes gratis convencionou-se tornar tudo um processo por questao de 
eficiencia. Como as threads deveriam compartilhar a mesma memoria do seu 
processo pai, para que o kernel monolitico nao possa confund�-las com o 
mesmo processo � aberta uma nova entrada para cada thread na tabela de 
processos, e desse jeito novos file descriptors sao abertos, e alguma 
memoria a mais � alocada para cada thread. Assim, as threads podem 
conversar entre si com um segmento diferente de memoria compartilhada, mas 
nao com a mesma onde deveriam estar operando. No caso do Apache, onde sao 
abertos alguns poucos processos (ou threads, na versao 2) isso � 
extremamente eficiente! Mas n�o escala, pois em aplicacoes com dezenas, 
centenas ou milhares de threads cada uma � tratada como um processo 
diferente, consumindo memoria exponencialmente, abrindo mais file 
descriptors e saturando o scheduler. No caso de maquinas com multiplos 
processadores, a distribuicao de tarefas fica prejudicada pois como o 
kernel fica ocupado demais alocando e desalocando memoria, revezando tempo 
de tarefas em cada processador e tratando descritores de arquivo pra cima e 
pra baixo, tudo ao mesmo tempo, isso gera lat�ncia e alguns processadores 
acabam ficando tempo demais ociosos sem tarefas para executar, pois quanto 
mais processadores, mais o tempo disponivel ser� dividido tanto com os 
outros chips como com os processos, gerenciamento de memoria e threads, o 
que � um dos motivos q o Patola falou de pq o Linux nao escala na mesma 
propor��o em q se adiciona processadores. Uma hora a m�quina simplesmente 
vai pedir arrego =). Como consertar isso? N�o d�, isso � decidido em tempo 
de projeto. Teria q ser reescrito todo o kernel, como eu comentei em 
diversas mensagens anteriores. Esse foi um dos principais motivos pelos 
quais a Sun abandonou a base de codigo BSD antiga do SunOS e adotou um 
microkernel para o Solaris.

Leitura recomendada:

* Sistemas operacionais modernos - Andrew Tanembaum - Prentice Hall do Brasil
* Sistemas operacionais - William Shay - Makron
* Como funciona seu computador :) (� um livrinho ilustrado, fino e grande, 
com ilustracoes mostrando o processo de funcionamento de um computador do 
boot ao prompt. Nao lembro o autor, vi lah na biblioteca da T�cnica)
* Arquitetura de sistemas operacionais - Francis Machado - LTC

Todos esses vc encontra nas bibliotecas da maioria das universidades.

Esse � um artigo muito bom sobre multithreading em n�vel de hardware, q 
saiu recentemente no Slashdot:

http://www.systemlogic.net/articles/01/6/multithreading/

Se eu nao me engano, h� algum material sobre threading no site da Ars 
Technica (www.arstechnica.com), mas eu nao guardei o link

--
Thiago Pimentel
Preview Tecnologia

Pra qu� levar tudo t�o a s�rio, se a vida � uma alucinante viagem da qual 
jamais sairemos vivos...
        -- Bob Marley


Assinantes em 10/07/2001: 2256
Mensagens recebidas desde 07/01/1999: 122293
Historico e [des]cadastramento: http://linux-br.conectiva.com.br
Assuntos administrativos e problemas com a lista:
            mailto:[EMAIL PROTECTED]

Responder a