Programowanie współbieżne i rozproszone/PWR Ćwiczenia 2: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Mengel (dyskusja | edycje)
Nie podano opisu zmian
Mengel (dyskusja | edycje)
Nie podano opisu zmian
Linia 48: Linia 48:
Z poziomu programisty, proces może poznać swój [[PID]] wywołując funkcję systemową:
Z poziomu programisty, proces może poznać swój [[PID]] wywołując funkcję systemową:
:<tt>pid_t getpid(); </tt>
:<tt>pid_t getpid(); </tt>
Wartości typu <tt>pid_t</tt> reprezentują [[PID]]y procesów. Najczęściej jest to długa liczba całkowita (<tt>long int</tt>), ale w zależności od wariantu systemu operacyjnego definicja ta może być inna. Dlatego lepiej posługiwać się nazwą <tt>pid_t</tt>.
Wartości typu <tt>pid_t</tt> reprezentują [[PID]]y procesów. Najczęściej jest to długa liczba całkowita (<tt>long int</tt>), ale w zależności od wariantu systemu operacyjnego definicja ta może być inna. Dlatego lepiej posługiwać się nazwą <tt>pid_t</tt>.


=== Tworzenie nowego procesu ===
=== Tworzenie nowego procesu ===
W Linuksie, tak jak we wszystkich systemach uniksowych, istnieje hierarchia procesów. Każdy proces poza pierwszym procesem w systemie (procesem <tt>init</tt> o [[PID]]zie 1) jest tworzony przez inny proces. Nowy proces nazywamy [[procesem potomnym|proces potomny]], a proces który go stworzył nosi nazwę [[procesu macierzystego]].
W Linuksie, tak jak we wszystkich systemach uniksowych, istnieje hierarchia procesów. Każdy proces poza pierwszym procesem w systemie (procesem <tt>init</tt> o [[PID]]zie 1) jest tworzony przez inny proces. Nowy proces nazywamy [[proces potomny|procesem potomnym]], a proces który go stworzył nosi nazwę [[proces macierzysty|procesu macierzystego]].
<!--
  Do tworzenia procesow sluzy funkcja systemowa:


        pid_t fork();
Do tworzenia procesów służy funkcja systemowa:
:<tt>pid_t fork();</tt>
Powrót z wywołania tej funkcji następuje dwa razy:
* w procesie macierzystym, w którym wartością przekazywaną przez funkcję <tt>fork</tt> jest [[PID]] nowo utworzonego potomka,
* w procesie potomnym, w którym funkcja przekazuje w wyniku 0.


  Powrot z wywolania tej funkcji nastepuje dwa razy: w procesie macierzystym
Jak dokładnie działa funkcja systemowa <tt>fork()</tt>? Proces w systemie Unix jest wygodnie wyobrażać sobie jako obiekt składający się z trzech części:
  i w procesie potomnym. Dla potomka funkcja przekazuje w wyniku 0, a dla
{|
  procesu macierzystego PID nowo utworzonego potomka.
|+ Proces Uniksowy. Podział na logiczne części.
 
| Wykonywany kod || Dane (czyli w szczególności wszystkie zmienne procesu) || Dane systemowe (PID, PID ojca)
  Proces potomny wykonuje taki sam kod jak proces macierzysty - zaczyna
|}
  od wykonania nastepnej instrukcji po fork(). Jednak przestrzenie adresowe
Funkcja systemowa <tt>fork</tt> tworzy nowy proces i kopiuje do niego wszystkie powyższe elementy, zmieniając jedynie te elementy, który muszą zostać zmienione (na przykład PID). Zatem nowy proces potomny:
  tych procesow sa rozlaczne. Kazdy ma swoja kopie zmiennych. Wartosci
* wykonuje taki sam kod jak proces macierzysty;
  zmiennych w procesie potomnym sa poczatkowo takie same jak w procesie
* dziedziczy po procesie macierzystym całą historię wykonania, bo stos wykonania jest także kopiowany; oznacza to w szczególności, że
  macierzystym w momencie utworzenia nowego procesu. Procesy maja te same
wykonanie w procesie potomnym zaczyna się od następnej instrukcji po <tt>fork()</tt>.
  uprawnienia, te same otwarte pliki itd.
* ma te same zmienne co proces macierzysty i do tego zmienne te mają te same wartości co w procesie macierzystym. Jednak przestrzenie adresowe tych procesów są rozłączne: każdy ma swoją kopię zmiennych. Oznacza to m.in. to, że zmiana wartości zmiennej w procesie potomnym nie jest odzwierciedlana w procesie macierzystym i na odwrót.  
* ma te same uprawnienia, te same otwarte pliki itd. (tym zajmiemy się w kolejnym laboratorium)


<!--
  * Tworzenie nowego procesu ilustruje przyklad proc_fork.c, ktory nalezy
  * Tworzenie nowego procesu ilustruje przyklad proc_fork.c, ktory nalezy
   teraz przeczytac i uruchomic ./proc_fork (o funkcji wait bedzie za chwile).
   teraz przeczytac i uruchomic ./proc_fork (o funkcji wait bedzie za chwile).

Wersja z 08:57, 12 cze 2006

Tematyka laboratorium

  1. Przypomnienie zasad tworzenia plików Makefile
  2. Kompilacja programów w środowisku Unix
  3. Procesy w systemie Unix: tworzenie, kończenie,


Literatura uzupełniająca

  1. M. K. Johnson, E. W. Troan, Oprogramowanie użytkowe w systemie Linux, rozdz. 9.2.1 i 9.4.1-9.4.5
  2. W. R. Stevens, Programowanie zastowań sieciowych w systemie UNI, rozdz. 2.5.1-2.5.4
  3. M. J. Bach, Budowa systemu operacyjnego UNIX, rozdz. 7.1, 7.3-7.5
  4. man do poszczególnych funkcji systemowych

Scenariusz zajęć

Identyfikator procesu

Każdy proces w systemie ma jednoznaczny identyfikator nazywany potocznie PID (od angielskiego: Process ID). Identyfikatory aktualnie wykonujących się procesów możesz poznać wykonując w Linuksie polecenie ps.

Ćwiczenie
Wykonaj polecenie ps. Zobaczysz wszystkie uruchomione przez Ciebie procesy w tej sesji. Znajdzie się wsród nich proces ps i bash (lub inny stosowany przez Ciebie interpreter poleceń), który analizuje i wykonuje Twoje polecenia. Pierwsza kolumna to PID procesu, a ostatnia to polecenie, które dany proces wykonuje. Więcej informacji na temat polecenia ps uzyskasz wywołując man ps.

Z poziomu programisty, proces może poznać swój PID wywołując funkcję systemową:

pid_t getpid();

Wartości typu pid_t reprezentują PIDy procesów. Najczęściej jest to długa liczba całkowita (long int), ale w zależności od wariantu systemu operacyjnego definicja ta może być inna. Dlatego lepiej posługiwać się nazwą pid_t.

Tworzenie nowego procesu

W Linuksie, tak jak we wszystkich systemach uniksowych, istnieje hierarchia procesów. Każdy proces poza pierwszym procesem w systemie (procesem init o PIDzie 1) jest tworzony przez inny proces. Nowy proces nazywamy procesem potomnym, a proces który go stworzył nosi nazwę procesu macierzystego.

Do tworzenia procesów służy funkcja systemowa:

pid_t fork();

Powrót z wywołania tej funkcji następuje dwa razy:

  • w procesie macierzystym, w którym wartością przekazywaną przez funkcję fork jest PID nowo utworzonego potomka,
  • w procesie potomnym, w którym funkcja przekazuje w wyniku 0.

Jak dokładnie działa funkcja systemowa fork()? Proces w systemie Unix jest wygodnie wyobrażać sobie jako obiekt składający się z trzech części:

Proces Uniksowy. Podział na logiczne części.
Wykonywany kod Dane (czyli w szczególności wszystkie zmienne procesu) Dane systemowe (PID, PID ojca)

Funkcja systemowa fork tworzy nowy proces i kopiuje do niego wszystkie powyższe elementy, zmieniając jedynie te elementy, który muszą zostać zmienione (na przykład PID). Zatem nowy proces potomny:

  • wykonuje taki sam kod jak proces macierzysty;
  • dziedziczy po procesie macierzystym całą historię wykonania, bo stos wykonania jest także kopiowany; oznacza to w szczególności, że

wykonanie w procesie potomnym zaczyna się od następnej instrukcji po fork().

  • ma te same zmienne co proces macierzysty i do tego zmienne te mają te same wartości co w procesie macierzystym. Jednak przestrzenie adresowe tych procesów są rozłączne: każdy ma swoją kopię zmiennych. Oznacza to m.in. to, że zmiana wartości zmiennej w procesie potomnym nie jest odzwierciedlana w procesie macierzystym i na odwrót.
  • ma te same uprawnienia, te same otwarte pliki itd. (tym zajmiemy się w kolejnym laboratorium)