Сколько процессов и потоков будет генерировать следующий код C? - PullRequest
0 голосов
/ 08 октября 2019

Рассмотрим следующий код, написанный на языке Си. Во время выполнения while(1); сколько процессов и потоков у нас будет соответственно?

int main(void) 
{
   int i;
   for (i=0; i<3; i++)
      fork();
   while(1);
}

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Простой способ узнать это добавить эту строку перед циклом while(1):

printf("I am process: %d, my parent is %d\n", (int) getpid(), (int) getppid());

Пример вывода:

Я - процесс: 4365, мой родитель -8358
Я процесс: 4366, мой родитель 4365
Я процесс: 4367, мой родитель 4365
Я процесс: 4369, мой родитель 4365
Я процесс: 4368, мойРодитель: 4366
Я - процесс: 4370, мой родитель - 4366
Я - процесс: 4371, мой родитель - 4367
Я - процесс: 4372, мой родитель - 4368

Всего 8 процессов, каждый с одним потоком.

Что случилось? 8358 была моей оболочкой. Когда я выполнил этот код, он создал процесс 4365. Это один.

4365 создал три процесса, один, когда у него было еще два цикла (4366), другой, когда еще один цикл (4367)и один на своем последнем цикле (4369). Это еще три, так что теперь у нас до четырех.

Тот, который он создал с двумя циклами, чтобы идти (4366) создал еще два процесса, один, когда у него был один цикл, чтобы идти (4368) и один, когдау него не было петель, чтобы идти (4370). Это еще два, так что теперь у нас до шести.

У нас еще есть два процесса с одним циклом, один из которых создан первым процессом (4367), а второй - вторым процессом (4368). Каждый из них создает еще один процесс (4371 и 4372). Это еще два, так что теперь мы до 8.

0 голосов
/ 09 октября 2019

Процесс всегда будет иметь основной поток, иначе он не сможет планировать себя в очередь потоков, что позволяет физическому процессору выполнять инструкции.

Кроме того, нет реального ограничениясколько процессов / потоков вы можете порождать, поскольку они ограничены объемом памяти, имеющимся в вашей системе.

Ваш следующий код, предполагая, что fork не завершится неудачей, исключая ваш родительский процесс, будет порождать 3 процесса и для каждогоПроцесс 1 поток

Это означает, включая ваш родительский процесс, 4 процесса и 4 потока.

см. Ответ Дэвида Шварца

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