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





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