Intervjuer iz Xiaomi-ja: koja je razlika između procesa i niti?
Nakon nekoliko poglavlja stekli smo prilično potpuno razumevanje osnovnih pojmova i načina upotrebe niti. Sledeće ćemo analizirati kako su niti evoluirale iz procesa, koja je razlika između njih i zašto je bitno razjasniti tu razliku za dalje učenje — čak i intervjueri nekih firma vole da pitaju o tome.
Proces
Prvi računari mogli su da prihvate samo određene instrukcije; korisnik unese jednu instrukciju, a računar izvrši jednu operaciju. Dok korisnik razmišlja ili unosi podatke, računar čeka. To je bilo veoma neefikasno — mnogo puta je računar bio u stanju čekanja.
Operativni sistem za paketnu obradu
Kasnije se pojavio operativni sistem za paketnu obradu: niz instrukcija koje treba izvršiti zapisivao se u listu, koja se računaru predavala odjednom. Korisnik bi više programa koje treba izvršiti zapisao na magnetsku traku, a zatim bi računar čitao i redom izvršavao te programe, ispisujući rezultate na drugu magnetsku traku.
Operativni sistem za paketnu obradu donekle je poboljšao efikasnost računara, ali pošto je način izvršavanja instrukcija i dalje serijski, u memoriji u svakom trenutku radi samo jedan program — naredni program mora čekati da prethodni završi pre nego što počne; a prethodni program bi se ponekad blokirao zbog IO operacija, mreže i sl., pa efikasnost paketne obrade takođe nije visoka.
Pojava procesa
Zahtevi za računarskim performansama postajali su sve veći, a postojeći sistemi za paketnu obradu nisu mogli da ih zadovolje. Uska tačka sistema paketne obrade bila je u tome što u memoriji postoji samo jedan program — mogu li u memoriji biti više programa? To je bio problem koji je trebalo rešiti.
Tako su naučnici predložili pojam procesa.
Proces je prostor u memoriji dodeljen aplikaciji, odnosno program koji je u toku izvršavanja; procesi se međusobno ne ometaju. Istovremeno, proces čuva stanje programa u svakom trenutku.
Program: zbirka koda napisanog u nekom programskom jeziku (Java, Python itd.) koja obavlja određeni zadatak ili funkciju; to je uređena zbirka instrukcija i podataka, jedan statički kod.
U to vreme CPU radi po principu obrtanja vremenskih isečaka: CPU svakom procesu dodeli vremenski interval, koji se naziva vremenskim isečkom. Ako proces još uvek radi na kraju isečka, obustavlja se izvršavanje tog procesa i CPU se dodeljuje drugom procesu (taj proces se zove promena konteksta). Ako se proces pre isteka isečka blokira ili završi, CPU odmah prebacuje, bez čekanja na istek isečka.
Kad se proces obustavi, čuva se trenutno stanje procesa (identifikator procesa, resursi koje proces koristi itd.); kada se ponovo aktivira, na osnovu prethodno sačuvanog stanja proces se obnavlja i nastavlja izvršavanje.
Operativni sistem koji koristi procese i CPU-ovo okretanje vremenskih isečaka makro-posmatrano istovremeno izvršava više zadataka; drugim rečima, procesi čine istovremenost operativnog sistema mogućom. Iako makro-posmatrano ima više zadataka u izvršavanju, u stvari, za jednojezgarni CPU u svakom konkretnom trenutku samo jedan zadatak zauzima resurse CPU-a.
Dalji zahtevi prema operativnom sistemu
Pojava procesa znatno je poboljšala performanse operativnog sistema, ali s vremenom ljudi nisu bili zadovoljni time što jedan proces u jednom trenutku može raditi samo jednu stvar; ako proces ima više podzadataka, on ih mora izvršavati jedan po jedan, što znatno utiče na efikasnost.
Na primer, pri proveri korisnikovog računara, antivirusni program se zablokira na jednoj proveri, što utiče na sve sledeće provere. Ili kad koristite funkciju skeniranja virusa, dok se skeniranje ne završi ne možete koristiti funkciju čišćenja smeća u antivirusnom programu — što očigledno ne zadovoljava.
Nit
Može li se omogućiti da se ti podzapsci izvršavaju istovremeno? Tako je predložen pojam niti: jedna nit izvršava jedan podzadatak, pa jedan proces sadrži više niti, a svaka nit je odgovorna za jedan zasebni podzadatak.
- Uz niti stvari postaju mnogo jednostavnije. Kad korisnik pokrene skeniranje virusa, pusti se da ta nit to obavi. Ako korisnik istovremeno pokrene čišćenje smeća, može se privremeno obustaviti nit za skeniranje, prvo odgovoriti na zahtev za čišćenje smeća i pustiti tu nit da radi; po odgovoru se ponovo prebacuje nazad na skeniranje virusa.
- Napomena: način na koji operativni sistem dodeljuje vremenske isečke svakoj niti vezan je za strategiju raspoređivanja niti; zainteresovani mogu pogledati literaturu iz oblasti „Operativni sistemi"; ovde to nećemo razrađivati jer tema obuhvata mnogo toga.
Ukratko, procesi i niti znatno su poboljšali performanse operativnog sistema. Procesi su omogućili istovremenost operativnog sistema, a niti su omogućile unutrašnju istovremenost procesa.
Pošto se višeprocesnim pristupom već može ostvariti istovremenost, zašto onda koristiti više niti?
Višeprocesni pristup zaista može ostvariti istovremenost, ali višenitni pristup ima sledeće prednosti:
- Komunikacija između procesa je složena, dok je komunikacija između niti jednostavna; obično nam trebaju deljeni resursi, a ti resursi se lako koriste u komunikaciji između niti.
- Procesi su teški, a niti lake — višenitni pristup ima manje sistemskih troškova.
Razlika između procesa i niti
Proces je nezavisno okruženje izvršavanja, a nit je zadatak koji se izvršava u okviru procesa. Bitna razlika je da li samostalno zauzima memorijski adresni prostor i druge sistemske resurse (npr. IO):
- Proces samostalno zauzima određeni memorijski adresni prostor, pa između procesa postoji memorijska izolacija, podaci su razdvojeni, deljenje podataka je složeno ali je sinhronizacija jednostavna, i procesi se međusobno ne ometaju; nit deli memorijski adresni prostor i resurse koje zauzima proces kome pripada, pa je deljenje podataka jednostavno, ali je sinhronizacija složena.
- Proces samostalno zauzima memorijski adresni prostor, pa problem u jednom procesu ne utiče na druge procese i ne utiče na stabilnost glavnog programa — velika pouzdanost; pad jedne niti može uticati na stabilnost celog programa — manja pouzdanost.
- Proces samostalno zauzima memorijski adresni prostor, pa kreiranje i uništavanje procesa, pored čuvanja registara i steka, zahteva i zauzimanje/oslobađanje resursa i raspoređivanje stranica — troškovi su veliki; nit treba da sačuva samo registre i stek — troškovi su mali.
Još jedna važna razlika: proces je osnovna jedinica za raspodelu resursa operativnog sistema, dok je nit osnovna jedinica za raspoređivanje operativnog sistema, odnosno jedinica kojoj CPU dodeljuje vreme.
Iskoristimo još nekoliko slika da to izrazimo vizuelno, radi jasnijeg opažanja.

Jezgro računara je CPU koji nosi sve zadatke izračunavanja. On je poput fabrike koja stalno radi.

Pretpostavimo da je struja fabrike ograničena i da se može isporučiti samo jednoj radionici u jednom trenutku. Drugim rečima, kad jedna radionica radi, sve ostale moraju stajati. Znači: jedan CPU u jednom trenutku može izvršavati samo jedan zadatak.

Proces je poput radionice fabrike; on predstavlja jedan zadatak koji CPU može da obradi. U svakom trenutku CPU uvek izvršava jedan proces, dok su ostali procesi u stanju mirovanja.

U jednoj radionici može biti mnogo radnika; oni zajednički obavljaju jedan zadatak.

Nit je poput radnika u radionici; jedan proces može sadržati više niti.

Prostor radionice je deljen među radnicima — mnoge prostorije mogu svi da ulaze i izlaze. To simbolizuje da je memorijski prostor procesa deljen i da svaka nit može koristiti tu deljenu memoriju.

Međutim, prostorije su različite veličine; neke mogu primiti najviše jednog čoveka, npr. toalet. Kad je neko unutra, drugi ne mogu ući. To predstavlja da kad jedna nit koristi deo deljene memorije, ostale niti moraju čekati da završi, pa tek onda mogu koristiti taj deo memorije.

Jednostavan način da se spreči ulazak drugih jeste da se na vrata stavi brava. Ko prvi dođe zaključa, a ko dođe kasnije videći bravu čeka u redu ispred vrata dok se brava ne otključa. To se zove „mutex brava" (Mutual exclusion, skraćeno Mutex) i sprečava više niti da istovremeno čitaju ili pišu po istoj memorijskoj oblasti.

Neke prostorije mogu istovremeno primiti n ljudi, npr. kuhinja. Ako je broj ljudi veći od n, višak mora čekati napolju. To je kao neke memorijske oblasti koje mogu koristiti samo određeni broj niti.

Rešenje je da se na vrata okači n ključeva. Ko uđe uzme ključ, a izlazeći ga vrati. Ko dođe kasnije i vidi da više nema ključeva zna da mora čekati u redu. Takav pristup se zove „semafor" (Semaphore) i služi da se osigura da više niti ne dolaze u sukob.
Lako je uvideti da je mutex poseban slučaj semafora (kad je n=1). Drugim rečima, ovaj drugi može zameniti prvi. Ali pošto je mutex jednostavniji i efikasniji, u situacijama kada resurs mora biti isključiv i dalje se koristi ovakav dizajn.

Dizajn operativnog sistema može se sažeti u tri tačke:
- U obliku više procesa, dozvoljava da više zadataka istovremeno radi;
- U obliku više niti, dozvoljava da se jedan zadatak podeli na više delova koji paralelno rade;
- Pruža mehanizam koordinacije koji, s jedne strane, sprečava sukobe među procesima i među nitima, a s druge strane dozvoljava procesima i nitima da dele resurse.
Prednosti koje donose niti
Dugo vremena hardver se razvijao veoma brzo, a jedan od poznatih zakona je „Murov zakon".
Murov zakon nije prirodni ni fizički zakon, već predviđanje budućnosti zasnovano na posmatranju podataka. Prema predviđenoj brzini, naša računarska moć raste eksponencijalno i uskoro bismo imali izvanrednu računarsku snagu. 2004. godine Intel je najavio odgađanje plana za 4GHz čip na 2005., a u jesen 2004. Intel je objavio potpuno odustajanje od plana za 4GHz — Murov zakon je, posle više od pola veka važenja, naglo zaustavljen. Međutim, pametni inženjeri hardvera nisu zaustavili razvoj; da bi dodatno povećali brzinu izračunavanja, odustali su od pojedinačnih računskih jedinica i umesto toga objedinili više računskih jedinica, čime su nastali višejezgarni CPU-i.
Za svega desetak godina kućni CPU-i poput Intel i7 dostižu 4, pa i 8 jezgara. Profesionalni serveri obično imaju nekoliko nezavisnih CPU-a, od kojih svaki može imati i preko 8 jezgara. Stoga se čini da se Murov zakon nastavlja proveravati u domenu proširenja jezgara CPU-a. U dobu višejezgarnih CPU-a istovremeno programiranje postaje sve važnije, jer se kroz istovremeno programiranje može do maksimuma iskoristiti računarska moć višejezgarnog CPU-a.
Vrhunski računarski naučnik Donald Ervin Knuth ovako je ocenio situaciju: po mom mišljenju, ovaj fenomen (istovremenost) više ili manje proizlazi iz nemoći dizajnera hardvera, koji su odgovornost za Murov zakon prepustili programerima.
Pored toga, u nekim posebnim poslovnim scenarijima okolnosti same odgovaraju istovremenom programiranju. Na primer, u obradi slike, jedna slika od 1024x768 piksela sadrži čak 786 hiljada piksela. Preći kroz sve piksele u kratkom vremenu zahteva dugo vreme i predstavlja veliki proračun, pa tu treba iskoristiti moć višejezgarnog računanja.
Ili, kad online kupujemo, radi bržeg odgovora potrebno je razdvojiti operacije poput smanjenja zaliha, generisanja narudžbi i sl., što se može postići višenitnom tehnikom. U složenim poslovnim modelima paralelni programi bolje odgovaraju potrebama nego serijski. Zbog ovih prednosti višenitna tehnologija postaje sve važnija, a i Java programeri treba da savladaju istovremeno programiranje, kako bi:
- u potpunosti iskoristili računarsku moć višejezgarnog CPU-a;
- olakšali razdvajanje poslovnih logika i poboljšali performanse aplikacije.
Zadovoljni ste sada sa pojmom procesa i niti? Na sledećem intervjuu, kad vas pitaju o tome, možete odmah da ih „batinate".
Zaključak
Ukratko, i procesi i niti su načini na koje operativni sistem ostvaruje istovremeno izvršavanje, ali se razlikuju u upravljanju resursima, nezavisnosti, troškovima i obimu uticaja.
- Proces je osnovna jedinica za raspodelu resursa operativnog sistema; nit je osnovna jedinica za raspoređivanje operativnog sistema.
- Proces ima nezavisan memorijski prostor; nit deli memorijski prostor procesa kome pripada.
- Kreiranje i uništavanje procesa zahteva zauzimanje i oslobađanje resursa, pa su troškovi veliki; kreiranje i uništavanje niti zahteva samo čuvanje registara i informacija o steku, pa su troškovi mali.
- Komunikacija među procesima je složena, dok je komunikacija među nitima jednostavna.
- Procesi su međusobno nezavisni — pad jednog procesa ne utiče na druge; niti su međusobno zavisne — pad jedne niti može uticati na stabilnost celog programa.
Urednik: Chenmo Wang Er; deo sadržaja potiče iz open-source repozitorijuma koji je prijatelj Xiao Qi Yinghuochong objavio: Duboko i pristupačno o Java višenitnosti, toplo preporučujemo. Deo slika potiče sa bloga Ruana Yifenga; adresa je ovde.
