У меня есть программа, которая выполняет один и тот же код последовательно и параллельно одновременно между различными контрольно-пропускными пунктами в течение всей программы. Для этого исходная программа отменяет дочерний процесс, который выполняется последовательно, пока родительский процесс работает параллельно. Независимо от того, какой процесс достигнет следующей контрольной точки сначала, он убивает другой процесс, и это повторяется до тех пор, пока не завершится выполнение выполнения, как можно быстрее (игнорируя накладные расходы на вилку и накладные расходы).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
Что вы подразумеваете под «родительской нитью» ?? Этот ребенок, которого вы разветвляли, является процессом и никогда не является нитью, существует очень четкое различие между процессами и потоками! Взгляните сюда 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