나는 프로그램 전체에서 다양한 체크 포인트간에 동일한 코드를 순차적으로 동시에 병렬로 실행하는 프로그램을 가지고있다. 이렇게하기 위해 초기 프로그램은 상위 프로세스가 병렬로 실행되는 동안 순차적으로 실행되는 하위 프로세스를 포크합니다. 어떤 프로세스가 다음 검사 점에 도달하면 먼저 다른 프로세스가 종료되고 실행이 끝날 때까지이 작업이 반복되므로 가능한 한 빨리 실행됩니다 (포크 및 사본 오버 헤드 무시).포크 프로세스 잠자는 실행
순차 실행 만이 가장 빠르거나 병렬 실행이 가장 빠를 때 모든 것이 잘 작동하지만 처음 몇 개의 섹션이 가장 빠르게 실행될 때 다음에 가장 빠른 순차적으로 실행됩니다. 두 과정 모두 수면. 나는 이것이 무엇을 일으킬 수 있는지를 볼 수 없다. 나는 프로세스를 포크하는 데 부과 된 몇 가지 한계에 부딪 혔습니까? 부모 프로세스를 죽이면 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();
}
감사합니다,
댄
"상위 스레드"란 무엇입니까? 이 자식은 프로세스이며 결코 스레드가 아닙니다. 프로세스와 스레드 사이에 아주 뚜렷한 차이가 있습니다! 여기 좀 봐 http://stackoverflow.com/questions/200469/what-is-the-difference-between-a-process-and-a-thread 다른 것들을 정리, waitpid()를 사용 해본 적이 있습니까? –
좀비를 정리하기 위해'wait()'를 호출하지 않는다면, 당신은'RLIMIT_NPROC'를 실행 중일 수 있습니다. – Barmar
나는 스레드가 아니라 스레드를 의미하므로 그에 맞게 업데이트되었습니다. wait 또는 waitpid를 호출하지 않고 kill 문이 변경된 후에 추가하면 아무 것도 변경되지 않습니다. 제가 올바르게 이해한다면, 기다리는 것은 부모님에 의해서만 아이들이 나가기를 기다릴 수 있습니다. 그러나 제 경우에는 부모님이 살해되고 있습니다. Waitpid 남은 좀비 프로세스가있는 경우 도움이 될 수 있지만 상단에 따르면 아무 것도없고, 원래 프로세스가 아닌 자식 프로세스 (즉 원래 프로세스가 아님)와 직접적인 하위 프로세스 (둘 다 자고 있음)가 있습니다. – divot