Это занято ожиданием? - PullRequest
       2

Это занято ожиданием?

3 голосов
/ 05 ноября 2010

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

id = fork();
for (i = 0; i < 20; i++)
{
    switch (id)
    {
             case 0:
                /* do stuff with child */
                exit(0);
             default:
             {
                 if (children>=3) {
                     int s;
                     wait(&s);
                     children--;
                 }
                 children++;
                 id = fork();
             }
    }
}

Ответы [ 4 ]

3 голосов
/ 05 ноября 2010

wait заставит ядро ​​выбрать другие задания, которые не помечены как заблокированные, так что это не случай ожидания занятости. Также не слишком ли много переключается для fork (), почему бы не использовать простой оператор if?

1 голос
/ 05 ноября 2010

Я согласен с вами, ожидание смерти ребенка (даже внутри цикла) не будет занято ожиданием.OTOH вы можете столкнуться с реальными проблемами, если один или несколько дочерних процессов требуют значительных вычислительных ресурсов.Дочерние ресурсы, требующие большого объема вычислений, всегда будут готовы к запуску, и не гарантируется, что родительский процессор получит процессор.

1 голос
/ 05 ноября 2010

На самом деле это не покупает ожидание (он не проверяет состояние дочерних элементов в цикле; вместо этого, если блоки внутри вызова wait()).

Тем не менее, код может перегружать процессор в зависимости отчто происходит в do stuff with child.Это будет выглядеть как занятое ожидание (загрузка процессора 100%), хотя на самом деле несколько процессов выполняют настоящую работу.

1 голос
/ 05 ноября 2010

Вы правы, wait ожидает незанятости, передавая процессор ядру, пока дочерний процесс не завершится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...