/ / Relacja między sekwencją wywołania fork () i exec () - wielowątkowość, unix, fork, exec

Relacja między sekwencją wywołania fork () i exec () - wielowątkowość, unix, fork, exec

Dostałem różnicę między wywołaniem systemowym fork () i exec ()

Program może być wielowątkowy - tj.może zawierać więcej niż jeden wątek, na przykład T1, T2 id T3. Jeśli dany wątek programu - powiedzmy T2 - wykona fork (), zostanie utworzony nowy duplikat (z wyjątkiem innego PID, PC, stosu) z dwoma możliwościami:

  1. Utworzony proces będzie zawierał wszystkie wątki T1, T2, T3.

  2. Utworzony proces będzie zawierał tylko wątek, który wykonał fork (), tj. T2. Jest to proces z pojedynczym gwintem

Istnieją dwie wersje fork () dla powyższego scenariusza.

  • Punkt 1 oznacza exec ()
  • Punkt 2 oznacza fork ()

Mam rację?

Pytanie

Jeśli sekwencja połączenia jest podobna

  • fork () zaraz po nim następuje exec ()

  • Po exec () natychmiast następuje fork ()

Czy ktoś może podać praktyczny przykład powyższych dwóch przypadków?

Odpowiedzi:

0 dla odpowiedzi № 1

Mam rację?

Nie całkiem. Koncepcja widelca jest uniksowym. Jeśli wywołasz fork (), powinieneś uzyskać prawie dokładną kopię oryginalnego procesu. Jedyną różnicą jest to, że wartość zwracana przez fork w procesie macierzystym jest ideą procesu procesu potomnego, podczas gdy wartość obrotu fork w procesie potomnym wynosi 0.

if (fork () == 0)
{
// In the child process
// Usually call exec here.
}
else
{
//  In the parent process
}

W wariantach UNIX powinieneś otrzymać kopie wszystkich wątków rodzica w dziecku. Inne systemy mogą mieć różne zachowania.

Natychmiast następuje wywołanie fork ()przez wywołanie exec (lub jednego z jego wariantów) w celu załadowania innego programu. Rzadko się zdarza, aby po prostu kopiować kopie programu nadrzędnego i po prostu go uruchamiać (wyjątek: jest to typowe w aplikacjach serwerowych obsługujących połączenia sieciowe).

Czy ktoś może podać praktyczny przykład powyższych dwóch przypadków?

Po pierwsze, ta sekwencja zwykle nie występuje:

Po exec () natychmiast następuje fork ()

Jest to normalne użycie widelca:

fork () zaraz po nim następuje exec ()

Na przykład rozważ powłokę wiersza poleceń. Wpisz coś takiego:

$ ./someapplication param1 param2

Aby zacząć someapplication, powłoka musi stworzyć nowy proces. Robi to, wywołując fork (). To po prostu tworzy kopię powłoki (niezbyt użyteczne). Kopia procesu potomnego powłoki wywołuje komendę exec, aby uruchomić someapplication.

Tak, to jest mylące. W większości systemów operacyjnych użytkownik określa plik wykonywalny podczas tworzenia procesu potomnego. Ten system wideł miał sens w czasach komputera PDP i miał sens w przypadku niektórych aplikacji do programowania sieciowego, gdy oglądano je w kontekście ograniczeń systemu UNIX.

Na przykład w tym systemie operacyjnym RSXuruchomiono na PDP, były przepisy na przerwań oprogramowania.Jeden proces może obsługiwać wiele połączeń sieciowych i urządzeń.To byłoby kolejki żądania I / O do urządzenia (bez blokowania), a następnie otrzymywać przerwanie oprogramowania, gdy I / O W związku z tym pojedynczy proces może mieć żądania I / O oczekujące na wiele urządzeń.

Uniks był znacznie mniej wyrafinowany. Wszystkie operacje we / wy zostały zablokowane. Gdzie w RSX normalnie miałbyś jeden proces kontrolujący wiele urządzeń, w UNIXie masz jeden proces na urządzenie (pamiętaj, że jest to przed dniami wątków - chociaż blokowanie wywołań we / wy wciąż jest problematyczne z wątkami eunuchów). Model widelca pasuje do sposobu działania systemu UNIX i zapewnia prosty sposób tworzenia procesu.W RSX było znacznie więcej kosztów dla procesu tworzenia.