Tooster

Untitled

Nov 6th, 2018
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.57 KB | None | 0 0
  1. > Zadanie 6. Najpowszechniej implementowane wątki przestrzeni jądra wprowadzają do programów dodatkowy stopień złożoności. Co dziwnego może się wydarzyć w wielowątkowym procesie uniksowym gdy:
  2. > * wołamy funkcję fork, aby utworzyć podproces
  3. > * użytkownik wciska kombinację «CTRL+C» i w rezultacie jądro wysyła «SIGINT» do procesu
  4. > * czytamy w wielu wątkach ze zwykłego pliku korzystając z jednego deskryptora pliku
  5. > * modyfikujemy zmienną środowiskową funkcją [putenv(3)](http://man7.org/linux/man-pages/man3/putenv.3.html)
  6. > * wątki intensywnie korzystają z menadżera pamięci z użyciem procedury malloc
  7.  
  8. * fork:
  9. niektóre operacje mogą być krytyczne, nieatomowe i chronione mutexem. W forku mamy wtedy w połowie przetworzone dane. Dziecko ma tylko jeden wątek. Cieżko a nawet niemozliwe powiedzieć co robiły inne wątki i co zrobić żeby dane były znowu spójne. Stan mutexa jest niezdefiniowany - zalezny od implementacji: może np. być zablokowany w dziecku jeśli był zablokowany w ojcu - mamy przesrane jeśli inny wątek (nie ten od forka) miał akurat mutex.
  10. * SIGINT:
  11. tylko jeden wątek dostaje sygnał. Jeśli wątek miał złą maskę sygnału, to może on zostać zignorowany (bo maska jest lokalna względem wątku) {chyba ?}.
  12. * 1 deskryptor:
  13. plik ma coś takiego jak 'kursor' - który jest wykorzystywany w read() i write() - wiele wątków może przesunąć kursor, bo skorzysta z offsetu z deskryptora a nie lokalnego względem wątku. Przez to możemy w jednym wątku przeskoczyć ileś bajtów i mieć złe dane. Ogólnie to to jest undefined behaviour w POSIXie (tak przynajmniej kojarzę - ale fajnie by było znaleźć wiecej info)
  14. > The read() function shall attempt to read nbyte bytes from the file associated with the open file descriptor, fildes, into the buffer pointed to by buf. The behavior of multiple concurrent reads on the same pipe, FIFO, or terminal device is unspecified.
  15. * putenv(3) - jest oznaczony jako not thread-safe, może być tak, że jeden wątek robi putenv(string), ale procedura umieszcza w środowisku tylko wskaźnik na tego stringa (dlatego stosuje się albo statycznego albo mallocowanego) Jeśli jakiś wątek zmienia w jakiś sposób tego stringa NIE PRZEZ PUTENVA, wtedy w różnych wątkach mozemy mieć różne wartości.
  16. > The putenv() function shall use the string argument to set environment variable values. The string argument should point to a string of the form "name= value". The putenv() function shall make the value of the environment variable name equal to value by altering an existing variable or creating a new one. In either case, the string pointed to by string shall become part of the environment, so altering the string shall change the environment. The space used by string is no longer used once a new string which defines name is passed to putenv().
  17. * malloc - używa drobnego albo żadnego blokowania(w zależności od konfiguracji) z wykorzystaniem globalnego mutexa, więc każda operacja malloc w innym wątku czeka na odblokowanie mutexa żeby móc się wykonać. W przeciwieństwie do tcmalloca od Googla, który to ma mutex na odpowiednie kubełki pewnych rozmiarów, w związku z czym można wykonywaćkilka malloców naraz. Przez globalny mutex mamy bardzo częste blokowanie operacji malloc, więc i alokowanie miejsca podczas działania programu będzie musiało czekać. wtedy albo będziemy mieli strasznie zcinający program, albo dostaniemy out of memory jeśli nie ma zaimplementowanego spamowania malloc do skutku. No to ogólnie duże spowolnienie na wydajności programu.
Add Comment
Please, Sign In to add comment