Нужна помощь в понимании некоторых понятий о fork () - PullRequest
2 голосов
/ 16 декабря 2011

Итак, у меня есть пара вопросов о fork ():

1) Я почти уверен, что разветвление позволяет нескольким потокам обращаться к общему адресному пространству, что делает его очень дешевым для системы. Я также почти уверен, что каждому процессу выделяется место в стеке. Кроме того, я не верю, что вызов fork () создал новый образ процесса (насколько я знаю, который создается с помощью exec ()) Прав ли я в этих утверждениях?

2) Теперь о невероятно сложном вопросе: вызывает ли вызов fork () процесс, равносильный многопоточности? Например, если вы используете fork () для родительского процесса, есть ли у родительского и дочернего процесса собственный поток?

3) если fork () копирует родительский процесс, как ребенок узнает, когда прекратить разветвление? Т.е. у вас есть следующий простой код:

#include
int glob=6;
char buf[]="a write to stdout\n";
main()
{
   int var;
   int pid;
   var=88;
   printf("Before Fork\n");
   if((pid=fork())<0)
       printf("fork Error\n");
   else if(pid==0)
   {
       glob++;
       var++;
   } 
   else
       printf("\nPID= %d ,GLOB = %d,VAR = %d\n",getpid(),glob,var);
   exit(0);
}

(src http://allprograms -c.blogspot.com / 2010/01 / simple-fork-program-in-linuxunix-c.html )

Что мешает ребенку разветвляться снова и снова и снова? Останавливается ли дочерний процесс при вызове fork (), а затем команда fork () возвращает PID дочернего процесса родителю?

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

Любая помощь будет принята с благодарностью, и большое спасибо.

1 Ответ

0 голосов
/ 16 декабря 2011

Короче говоря:

  1. Форкинг не позволяет разветвленному процессу (его дочернему элементу) изменять родительские данные.Когда вы создаете новый процесс, он получает копию родительского дескриптора процесса (это данные, файловые дескрипторы и т. Д.).Форкинг не дешевый.Это на самом деле очень дорогая операция из-за копирования.Разветвленный процесс является копией своего родителя, а стек также копируется.exec() «только» загружает и выполняет новый код, так как «образ процесса», на который вы ссылаетесь, уже создан во время разветвления.

  2. Формирование родительского процесса создает дочерний процесс,Родительский процесс может иметь потоки, дочерний процесс также может иметь потоки.Потоки из родительского процесса не могут вмешиваться в потоки из дочернего процесса.В двухъядерном процессоре одно ядро ​​может запускать родительский процесс, в то время как другое ядро ​​может запускать дочерний процесс параллельно.Если у родительского процесса запущен поток, то одно ядро ​​может запускать родительский процесс, тогда как другое ядро ​​может запускать поток родительского процесса параллельно.

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

...