logo
Contato | Sobre...        
rebarba rebarba

Rodrigo Strauss :: Blog


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 | 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 | 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!
rebarba rebarba
  ::::