Equivalente fork em Windows API

Delphi

21/07/2005

Pessoal,

Como faço para reproduzir o mesmo efeito da função fork() do UNIX no Windows? Que é a criação de um processo clone do processo que invocou a função.

[]s,

Rafael Cabral


Rafael Miguel

Rafael Miguel

Curtidas 0

Respostas

Daemon

Daemon

21/07/2005

...o que você gostaria de fazer exatamente com isso?? ...qual é o propósito?? para eu poder saber qual será a alternativa...


GOSTEI 0
Beppe

Beppe

21/07/2005

Depende da semântica que deseja...se quiser compartilhar o mesmo espaço de endereços, decenda de TThread e implemente Execute. Senão é CreateProcess.


GOSTEI 0
Daemon

Daemon

21/07/2005

....é isso ai.....Thread é a palavra certa. .......acho que isso vai servir para o seu proposito. .. ..rs..


GOSTEI 0
Adriano Santos

Adriano Santos

21/07/2005

Alguém pode me dizer o que é fork ?????

boiei


GOSTEI 0
Beppe

Beppe

21/07/2005

fork é uma chamada de sistema padronizada no POSIX. Serve pra dividir o processo atual em dois threads, compartilhando o mesmo espaço de endereços. Eu acho um esquema muito podre de IPC, pq vez sim vez não é seguida por um execve, que substitui o thread corrente por um novo programa. É usada principalmente nos Unices, mas tbm na linguagem C.


GOSTEI 0
Adriano Santos

Adriano Santos

21/07/2005

Beppe, em outras palavras o nosso amigo Rafael Miguel quer dividir um endereço em mais de um e então criar processos para executar uma determinada tarefa?

Bom neste caso, embora eu não sabia usar TThread, apenas conheço o o funcionamento, o melhor para ele é isso, assim ele pode gerar mais de um processo e deixar que o Windows gerencie, to certo?


GOSTEI 0
Beppe

Beppe

21/07/2005

Beppe, em outras palavras o nosso amigo Rafael Miguel quer dividir um endereço em mais de um e então criar processos para executar uma determinada tarefa? Bom neste caso, embora eu não sabia usar TThread, apenas conheço o o funcionamento, o melhor para ele é isso, assim ele pode gerar mais de um processo e deixar que o Windows gerencie, to certo?

Isso. Mas ele tem que dar mais detalhes, mas em princípio seria threads.


GOSTEI 0
Daemon

Daemon

21/07/2005

....soh tem que tomar cuidado com travamento das Threads. ..como Deadlock, por exemplo. ....... ...mas de resto......fica bem legal o lance do processo em paralelo. ....


GOSTEI 0
Adriano Santos

Adriano Santos

21/07/2005

Mas os Deadlocks e outros erros ocorrem normalmente por loops eternos por exemplo né?

Me fala uma coisa....quando o computador é multi-processado, ou seja, tem mais de um processador, esse esquema pode ser usado para dividir os processos entre os dois chips?


GOSTEI 0
Massuda

Massuda

21/07/2005

Mas os Deadlocks e outros erros ocorrem normalmente por loops eternos por exemplo né?
Não necessariamente. O exemplo clássico de deadlock é quando duas threads disputam acesso a recursos (por exemplo, uma impressora, um arquivo em disco) que são compartilhados entre as threads.

Por exemplo, imagine duas threads que precisam ter acesso exclusivo ao disco e a impressora simultaneamente; a primeira thread pede (ao sistema operacional) acesso ao disco e depois à impressora enquanto a segunda thread pede os acessos na ordem inversa; é possível em um dado instante que a primeira thread tenha acesso ao disco mas esteja tentando acessar a impressora enquanto a segunda thread tem acesso a impressora e está tentando acessar o disco; note que as duas threads não estão em loop infinito mas sim estão paradas aguardando algo... isso é o deadlock. Do modo como descrevi, fica fácil perceber que se ambas as threads tentassem acessar os recursos na mesma ordem, o problema não ocorreria.

Usar loops infinitos não é problema desde que exista condições do sistema operacional alternar as threads em execução (sleep, I/O, etc).

...quando o computador é multi-processado, ou seja, tem mais de um processador, esse esquema pode ser usado para dividir os processos entre os dois chips?
Acredito que sim, embora provavelmente decidir por alocar uma thread em um ou outro processador seja tarefa do sistema operacional, não do seu programa.


GOSTEI 0
Daemon

Daemon

21/07/2005

..na verdade ....quando vc cria um processo, ele automaticamente recebe afinidade para os dois processadores, ou seja, o que estiver disponivel, vai processar, mas você pode ir no gerenciador de tarefas e mandar um processo ser atendido por somente um processador.... ....ai entra um detalhe ........cuidado com a dependencia de um processo, por outro ...pois um processo X que precise do processo Y antes de continuar ou antes de iniciar o processo Z. ..pode terminar de ser processado primeiro ......


GOSTEI 0
Daemon

Daemon

21/07/2005

...e sim .....deadlocks são feitos por loops infirnitos ....DE THREAD, ou seja. ...uma thread A depende de uma Thread B para continuar e derepente a Thread B começa esperar a Thread A terminar de ser processada, por simples questões do proprio gerenciamento de Threads do sistema operacional ..


GOSTEI 0
Adriano Santos

Adriano Santos

21/07/2005

..na verdade ....quando vc cria um processo, ele automaticamente recebe afinidade para os dois processadores, ou seja, o que estiver disponivel, vai processar, mas você pode ir no gerenciador de tarefas e mandar um processo ser atendido por somente um processador.... ....ai entra um detalhe ........cuidado com a dependencia de um processo, por outro ...pois um processo X que precise do processo Y antes de continuar ou antes de iniciar o processo Z. ..pode terminar de ser processado primeiro ......



Então, mencionei isso porque participei de uma palestra de um colega aqui do ClubeDelphi, não me lembro que, em Sorocaba, num destes encontros do Clube, e lembro que ele mencinou isso, mas confesso que não entendi muito bem....só entendi que é o SO que faz a divisão do processo.


GOSTEI 0
Kapak

Kapak

21/07/2005

Colegas, se vcs estão falando da classe TThread, não estou entendendo direito. Quando crio vários objetos TThread na aplicação, o gerenciador de tarefas apresenta apenas um processo; daí concluo que a Thread principal do aplicativo é o processo e as Threads secundárias rodam concorrentemente entre sí e com a Thread principal mas sempre dentro de um único processo do Windows. Então minha dúvida é: Como uma Thread secundária conseguirá rodar em outro processador ?


GOSTEI 0
Rafael Miguel

Rafael Miguel

21/07/2005

Na verdade o que eu queria é executar determinadas ações se o processo for o filho. No UNIX, o fork cria um processo exatamente igual ao que chamou. Então no UNIX a criação de um processo seria exatamente assim:

result = fork();
if result = 0
{
   //processo pai
}
else
{
  //processo filho
  execl() //Executa um comando
}


Então como podem perceber, posso colocar dois processos para executar apenas um código fonte. Sendo que o desvio ocorre dependendo do processo, se é o pai faz uma coisa, normalmente ele espera o processo filho terminar mas no meu caso queria passar direto, ou seja, deixar um processo filho sem pai. Não sei se no Windows isso é possível.

Na verdade o que eu quero fazer era realizar um backup do meu sistema. Sendo que para fazer a cópia física do programa, teria que fechar o programa para assim realizar a cópía. Depois da cópia, o sistema seria reiniciado. A função que executa esse procedimento está numa DLL.

[]s,

Rafael Miguel


GOSTEI 0
Beppe

Beppe

21/07/2005

daemon, loops eternos são apenas loops eternos, que podem estar fazendo um trabalho útil. Um thread em deadlock não está em loop, nem executando está, pq o SO não alocará o processador para threads esperando (por um recurso). Exemplo de loop eterno que faz trabalho útil:
repeat
  ...
  Application.ProcessMessages;
until False;

Como dito, a divisão de um processador é tarefa do SO, mas no caso de deadlock o Windows não faz nada(algoritmo do avestruz)

kapak, threads é o que são gerenciados pelo ´Process Manager´, disputando tempo em um processador. Cada thread possui um contexto(registradores, flags, program counter, memória virtual compartilhada). Para rodar em um processador, só é preciso que este tenha acesso à memória física alocada ao processo, e que se carregue o contexto do thread nos registradores, e só.

Rafael Miguel, o modelo de processos do Windows é diferente, mas threads lhe atenderão. vá em File -> New -> Other -> Thread para criar uma nova classe que cria um thread separado. No seu método Execute vc coloca o código que deve executar concorrentemente. Se pesquisar por thread ou TThread no fórum vai achar muitas respostas. Qualquer coisa, pergunte.


GOSTEI 0
Rafael Miguel

Rafael Miguel

21/07/2005

Obrigadão pela ajuda.

Os testes que fiz com Thread aqui sempre param de executar quando o pai morre. Tem alguma maneira de criar uma thread sem pai, ou então da thread continuar executando mesmo com a morte do pai?

[]s,

Rafael Cabral


GOSTEI 0
Beppe

Beppe

21/07/2005

Vc chama o processo de ´pai´ não é? Quando é chamado TerminateProcess em um processo todas as threads dele são forçadas a terminar. O ideal seria não deixar terminar, nas condições normais, como clicar no X. Dá pra esperar pelo thread esperar com o método Wait(algumacoisa, não lembro direito).

Em outros casos, terá que fazer um programa sparado.


GOSTEI 0
Rafael Miguel

Rafael Miguel

21/07/2005

Era justamente isso que eu estava tentando evitar. A criação de um programa separado.

Sabe se eu posso passar parâmetros para alguma função dentro de um outro programa que pode ser exports como em uma DLL? Se puder já ajuda muito, pois eu estava tentando passar uma estrutura como parâmetro.

[]s,

Rafael Cabral


GOSTEI 0
Kapak

Kapak

21/07/2005

kapak, threads é o que são gerenciados pelo ´Process Manager´, disputando tempo em um processador. Cada thread possui um contexto(registradores, flags, program counter, memória virtual compartilhada). Para rodar em um processador, só é preciso que este tenha acesso à memória física alocada ao processo, e que se carregue o contexto do thread nos registradores, e só.
Pelo que foi dito anteriormente sobre a criação de Threads, entendí que fosse a classe TThread implementada em Classes.pas do Delphi. Então quando vc cria
estas Threads na sua aplicação, elas terão como características:
1-Serão sempre secundárias.
2-Sua prioridade será inferior à da Thread principal.
3-Compartilham o mesmo espaço de memória do aplicativo.
4-Acredito eu que nunca poderão ser processadas num processador diferente do que o da Thread principal(processo).

Então minha dúvida era referente ao ítem 4, quando foi dito que Threads poderiam rodar em processadores diferentes. As principais(processos) sim, mas as secundárias, acredito que não.


GOSTEI 0
Beppe

Beppe

21/07/2005

1-Serão sempre secundárias. 2-Sua prioridade será inferior à da Thread principal. 3-Compartilham o mesmo espaço de memória do aplicativo. 4-Acredito eu que nunca poderão ser processadas num processador diferente do que o da Thread principal(processo). Então minha dúvida era referente ao ítem 4, quando foi dito que Threads poderiam rodar em processadores diferentes. As principais(processos) sim, mas as secundárias, acredito que não.

1 - secundárias, terciárias...para o sistema, nenhuma tem vantagem (automática)
2 - Não, mas podem ser ajustadas(aumentada ou diminuída).
3 - Sim.
4 - Podem sim, desde que o processador tenha acesso a memória disponível ao processo.

Poder distribuir as threads(ou até mesmo uma threads, a cada fatia de tempo) entre processadores é feito para aumentar a performance, mas isso pode causar um slowdown, já que assertar o uso de memória por um processador consome tempo, por isso existe o conceito de afinidade.


GOSTEI 0
POSTAR