2013-03-02 7 views
0

나는 프로그램 전체에서 다양한 체크 포인트간에 동일한 코드를 순차적으로 동시에 병렬로 실행하는 프로그램을 가지고있다. 이렇게하기 위해 초기 프로그램은 상위 프로세스가 병렬로 실행되는 동안 순차적으로 실행되는 하위 프로세스를 포크합니다. 어떤 프로세스가 다음 검사 점에 도달하면 먼저 다른 프로세스가 종료되고 실행이 끝날 때까지이 작업이 반복되므로 가능한 한 빨리 실행됩니다 (포크 및 사본 오버 헤드 무시).포크 프로세스 잠자는 실행

순차 실행 만이 가장 빠르거나 병렬 실행이 가장 빠를 때 모든 것이 잘 작동하지만 처음 몇 개의 섹션이 가장 빠르게 실행될 때 다음에 가장 빠른 순차적으로 실행됩니다. 두 과정 모두 수면. 나는 이것이 무엇을 일으킬 수 있는지를 볼 수 없다. 나는 프로세스를 포크하는 데 부과 된 몇 가지 한계에 부딪 혔습니까? 부모 프로세스를 죽이면 fork 된 자식 프로세스가 실행될 수 있습니까?

아래의 코드는 모든 검사 점에서 실행되는 checkPoint() 함수를 제공합니다. 마지막 부분의 끝을 처리하는 사용자 정의 코드가 있습니다. 병렬 코드는 연속 코드가 OpenMP pragma 문과 절대로 만나는 OpenMP를 사용하여 구현됩니다.

pid_t parent = 0; 
pid_t child = 0; 

void checkPoint() { 

    if (parent == 0) { 

     // First Time 
     parent = getpid(); 

    } else if (child == 0) { 

     // Child Process 
     kill(parent, SIGKILL); 
     parent = getpid(); 

    } else { 

     // Parent Process 
     kill(child, SIGKILL); 

    } 

    child = fork(); 

} 

감사합니다,

+0

"상위 스레드"란 무엇입니까? 이 자식은 프로세스이며 결코 스레드가 아닙니다. 프로세스와 스레드 사이에 아주 뚜렷한 차이가 있습니다! 여기 좀 봐 http://stackoverflow.com/questions/200469/what-is-the-difference-between-a-process-and-a-thread 다른 것들을 정리, waitpid()를 사용 해본 적이 있습니까? –

+0

좀비를 정리하기 위해'wait()'를 호출하지 않는다면, 당신은'RLIMIT_NPROC'를 실행 중일 수 있습니다. – Barmar

+0

나는 스레드가 아니라 스레드를 의미하므로 그에 맞게 업데이트되었습니다. wait 또는 waitpid를 호출하지 않고 kill 문이 변경된 후에 추가하면 아무 것도 변경되지 않습니다. 제가 올바르게 이해한다면, 기다리는 것은 부모님에 의해서만 아이들이 나가기를 기다릴 수 있습니다. 그러나 제 경우에는 부모님이 살해되고 있습니다. Waitpid 남은 좀비 프로세스가있는 경우 도움이 될 수 있지만 상단에 따르면 아무 것도없고, 원래 프로세스가 아닌 자식 프로세스 (즉 원래 프로세스가 아님)와 직접적인 하위 프로세스 (둘 다 자고 있음)가 있습니다. – divot

답변

0

그것은이 GCC, OpenMP의와 포크를 사용할 때 발생하는 버그 것으로 나타났다. 프로그램이 데몬으로() 또는 이와 유사한 수단을 사용하여 백그라운드 프로세스가 될하고자하는 경우

http://bisqwit.iki.fi/story/howto/openmp/#OpenmpAndFork

에서 촬영, 당신은 포크 전에 OpenMP를 기능을 사용하지 않아야합니다. OpenMP 기능을 사용한 후 하위 프로세스가 OpenMP 기능을 사용하지 않거나 이 완전히 새로운 프로세스 (예 : exec() 이후) 인 경우에만 포크 이 허용됩니다.

관련 문제