2013-03-02 3 views
0

У меня есть программа, которая выполняет один и тот же код последовательно и параллельно одновременно между различными контрольно-пропускными пунктами в течение всей программы. Для этого исходная программа отменяет дочерний процесс, который выполняется последовательно, пока родительский процесс работает параллельно. Независимо от того, какой процесс достигнет следующей контрольной точки сначала, он убивает другой процесс, и это повторяется до тех пор, пока не завершится выполнение выполнения, как можно быстрее (игнорируя накладные расходы на вилку и накладные расходы).Forked Processes Execute Sleeping

Я реализовал это, и все работает нормально, когда только последовательное выполнение является самым быстрым, или только параллельное выполнение является самым быстрым, но когда первые несколько секций выполняются быстрее всего, а затем следующие несколько выполняются быстрее всего, оба процесса спать. Я не вижу, что может быть причиной этого. Я ударил определенный предел, наложенный на процессы разветвления? Может ли убить родительский процесс повлиять на выполнение раздвоенного дочернего процесса или наоборот?

В приведенном ниже коде представлена ​​моя функция 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(); 

} 

Спасибо,

Dan

+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 fork разрешен только в том случае, если дочерний процесс не использует функции OpenMP, или , он делает это как совершенно новый процесс (например, после exec()).