Equivalente fork em Windows API
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
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
Curtidas 0
Respostas
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
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
21/07/2005
....é isso ai.....Thread é a palavra certa. .......acho que isso vai servir para o seu proposito. .. ..rs..
GOSTEI 0
Adriano Santos
21/07/2005
Alguém pode me dizer o que é fork ?????
boiei
boiei
GOSTEI 0
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
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?
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
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
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
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?
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
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
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
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
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
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
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:
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
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
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:
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.
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
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
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
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.
Em outros casos, terá que fazer um programa sparado.
GOSTEI 0
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
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
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
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