Nit (računarstvo)

Niti u računarstvu predstavljaju zadatke koji se istovremeno izvršavaju u okviru jednog procesa. Instrukcije koje sačinjavaju jednu nit se izvršavaju u isto vrijeme sa instrukcijama koje sačinjavaju druge niti (ako u računaru postoji više procesora) ili je ta istovremenost samo prividna (ako u računaru postoji samo jedan procesor).

U okviru jednog procesa teče više niti. Za razliku od procesa koji imaju odvojene memorijske prostore, niti dijele isti memorijski prostor.

Kao što više procesa rade u isto vrijeme na jednom računaru, tako se niti mogu zamisliti kao više poslova u okviru jednog procesa. Sve niti jednog procesa imaju isti imenski prostor, koriste zajedničku memoriju i tabele otvorenih datoteka. Na taj način je višenitno programiranje znatno jednostavnije nego raspoređivanje poslova u više sistemskih procesa.

Problemi uredi

Uzroci najčešćih problema višenitnog programiranja leže u istim stvarima koje predstavljaju njegove prednosti. Naime, iako korišćenje zajedničke memorije predstavlja određeno olakšanje (jer se mogu koristiti zajedničke globalne promjenljive i imenski prostor, koristiti pokazivači zbog istog adresnog prostora itd.), često dolazi do sukoba više niti pri pristupanju i čitanju/mijenjanju iste memorijske lokacije u isto vrijeme. Desi se da jedna nit počne sa čitanjem vrijednosti neke memorijske lokacije i prije nego što neka druga nit završi sa pisanjem u nju; tako prva nit dobije pola stare a pola nova podatke, što često uzrokuje netačne rezultate ili čak iznenadni prestanak rada cijelog programa.

U ovakvim situacijama se najčešće pribjegava rješenjima koja obuhvataju razne načine zaključavanja memorije. Naime, u raznim programskim jezicima i okruženjima postoje različiti načini da jedna nit „zabrani“ drugim da pristupe određenom resursu dok ta nit ne završi što ima da završi. U većini programskih okruženja se to postiže korišćenjem tzv. muteksa koji funkcionišu na principu zaključane sobe: kada se jedna nit zaključa u sobu, druge niti ne mogu ući dok ona ne otključa i izađe. Tako isto, kada jedna nit „zaključa“ muteks, ona može koristiti resurs. Ako neka druga nit pokuša da zaključa muteks, moraće da sačeka dok ga prva nit ne otključa.

Kružna blokada uredi

Kružna blokada (engl. deadlock) je termin koji označava situaciju kada neka nit A čeka da nit B otključa neki muteks, ali B ne može da ga otključa jer u tom trenutku čeka da nit A otključa neki drugi muteks. U takvoj situaciji obje niti čekaju jedna drugu i situacija je nerješiva. Jedan od načina da se to desi je da obje niti pokušavaju da zauzmu dva ili više istih resursa, ali različitim redoslijedom. Programer mora pažljivo da osmisli algoritam programa da bi izbjegao takve i slične situacije. Čišćenje programa od takvih problema zna da bude vrlo složeno, jer se problem ne pojavljuje pri svakom pokretanju programa i zna da se desi tek kad se objavi i raspodijeli klijentima.

Posiks niti uredi

Standard „Posiks“ (engl. POSIX) definiše programski interfejs za rukovanje nitima na bazi proceduralnog programiranja, tj. očekuje opis zadataka koje nit obavlja u obliku jedne funkcije. Samo otpočinjanje rada niti, njeno kontrolisanje i prekidanje se obavlja preko skupa funkcija koje ovaj standard propisuje, i čija imena sva počinju sa „pthread_“. Navodimo neke od osnovnih:

  • pthread_create - pokretanje niti.
  • pthread_join - pokretanje niti nakon što se neka druga nit završi.
  • pthread_cancel - nasilno zaustavljanje rada neke niti
  • pthread_mutex_init - kreiranje muteksa
  • pthread_mutex_lock - zaključavanje muteksa
  • pthread_mutex_unlock - otključavanje muteksa

Objektno orijentisane niti uredi

U objektno orijentisanim programskim jezicima poput Jave i C++-a, niti obično imaju formu objekta — svaka nit predstavlja poseban objekat čija jedna metoda (obično pod nazivom run(), bez argumenata) sadrži zadatke koje funkcija treba da obavi. To su obično objekti neke klase koja je naslijedila klasu „Nit“: u Javi su to klasa Thread i interfejs Runnable, u Qt-u je to klasa QThread itd. Najčešće se nakon pripreme poziva metoda klase start tog objekta da bi se funkcija run pokrenula u posebnoj niti.

U Javi, u kojoj postoji čvrsta hijerarhija klasa koje sve direktno ili indirektno naslijeđuju klasu Object, mogućnost zaključavanja resursa je smještena u samoj klasi Object što dodatno pojednostavljuje rukovanje dijeljenim resursima.

Vidi još uredi

Spoljašnje veze uredi