logo
Contato | Sobre...        
rebarba rebarba

Rodrigo Strauss :: Blog

follow us in feedly

Win32: Mais sobre processos

Uma coisa muito importante deve ser notada pelos (linux|unix|bsd) boys: não existe fork no Windows. (outra coisa muito importante deve ser notada pelos (chatos|acha-pelo-em-ovo) boys: sim, existe no Unix Subsystem, mas é preciso uma boa dose de drogas bem pesadas para chamar o Unix Subsystem de usável). Quando novos processo são criados, tudo é novo, não só o address space. É possível que um processo herde os handles do processo pai (veja a referência do CreateFile na MSDN), mas um compartilhamento de memória ou variáveis exige um esforço extra de implementação.

Outra coisa importante é que, além de não existir fork, não existe a "cultura" fork e o Windows não ajuda. Um processo por usuário conectado ou por job/work não é usado e não recomendado. O custo da criação de um processo no Windows é bem mais alto do que um fork, porque um fork pode usar e abusar do recurso copy-on-write de memória. Quando um fork é executado no Linux, por exemplo, a maioria das páginas de memória física do processo atual e do novo são simplesmente compartilhadas. A mágica toda é um flag que marca a página de memória como read only. Quando um dos processos resultados do fork grava uma página, o processador dispara uma exceção, que faz com que o Linux crie uma página de memória exclusiva para o processo e faça a gravação. Ou seja, as páginas exclusivas só são criadas quando é realmente necessário. O Memory Manager do Windows também usa esse recurso, mas em outras ocasiões (como para as páginas de memória que contém o código executável dos arquivos .exe e .dll).

Além de tudo isso, ainda tem o problema do Desktop Heap Size (mais informações em um Google perto de você). Depois de um certo ponto, você não consegue mais criar processos - em um teste que eu fiz não consegui criar mais do que 180 processos sem ajustar o Desktop Heap Size, que requer mexer no registro e um reboot. Esse (defeito|tradeoff|particularidade) é compensado pelo fato do conceito de threads ser nativo do Windows NT desde a primeira versão, ao contrário do mundo *nix. Ou seja, se você faz um fork por (usuário|job|work) no Unix, no Windows isso precisa ser adaptado para uma thread por (usuário|job|work). Só que aí você precisa sincronizar o acesso às variáveis, coisa que veremos depois...


Em 08/02/2008 22:00, por Rodrigo Strauss


  
 
 
Comentários
LVR | em 09/02/2008 | #
Salve,

Post interessante. Mas, deixo como sugestão um post só para explicar a diferença entre processo e thread, pois isto pode não ser evidente para todos.

E sou capaz de apostar como muita gente pensa que entende a diferença entre ambos, mas pensa que entende.

E o Google pode mais atrapalhar do quê ajudar neste caso.

[]´s
---
LVR
LVR | website | e-mail | em 09/02/2008 | #
Dizendo isto:

"E sou capaz de apostar como muita gente pensa que entende a diferença entre ambos, mas pensa que entende."

Queria dizer isto:
"Sou capaz de apostar que muita gente não entende corretamente a diferença, mesmo pensando que entende."

[]´s
---
LVR
Rodrigo Strauss | website | e-mail | em 10/02/2008 | #
Falarei sobre threads nos próximos posts :-)
Victor Hugo Malcauskas | em 14/02/2008 | #
Grande Rodrigo StraussTRUP..
Brincadeirinha,
Parabéns. Cada vez mais, posts de alta qualidade!
Algo a dizer?
Nome:


Site:


E-mail:


Escreva o número vinte e seis:


 Não mostre meu e-mail no site, não serve pra nada mesmo...

Comentário





Os comentários devem ser sobre assuntos relativos ao post, eu provavelmente apagarei comentários totalmente offtopic. Se quiser me enviar uma mensagem, use o formulário de contato. E não esqueça: isso é um site pessoal e eu me reservo o direito de apagar qualquer comentário ofensivo ou inapropriado.
rebarba rebarba
  ::::