Dizajn

Procesi - FreeBSD

Proces je program koji je trenutno u izvršavanju. Svaki proces zauzima odredjene sistemske resurse, kao što su memorija i procesorsko vreme. Kernel pruža korisnicima iluziju konkurentnog izvršavanja više procesa u isto vreme rasporedjivanjem tih resursa medju procesima koji su spremni za izvršavanje.

Proces se izvršava ili u korisničkom, ili u kernel-modu. U korisničkom modu instrukcije se izvršavaju u neprivilegovanom modu hardvera. Kada proces zatraži od kernela da izvrši neki sistemski poziv, instrukcije se vrše u privilegovanom, ali kernelom ograničenom i kontrolisanom modu. Ovako su aplikacije odvojene od hardvera.

Kernel razlikuje procese prema njihovom proces identifier (PID) broju. Korisnici mogu kreirati procese, kontrolisati izvršavanje procesa i primiti obaveštenje kada se status izvršavanja procesa promeni.

Procesi mogu stvoriti nove pozivanjem sistemskog poziva fork. Njime se stvara istovetna kopija procesa; dobiju se dva ista programa i sa istim promenljivama i istim vrednostima. Oba procesa (roditelj i dete) nastavljaju sa izvršavanjem instrukcije koja sledi posle pozivanja fork-a, s tim što postoji jedna razlika: detetu fork vraća vrednost nula, a roditelju vraća vrednost PID-a deteta (koja je različita od nule).

Obično posle pozivanja fork-a jedan od ova dva procesa poziva sistemski poziv execve, kojim se vrši prepisivanje postojeće memorijske slike procesa novom, koja se čita iz binarnog fajla, posle čega počinje izvršavanje novog programa.

Proces može da završi svoje izvršavanje pozivanjem sistemskog poziva exit. Ako je njegov roditelj pozvao sistemski poziv wait, PID deteta se signalom šalje roditelju tako da on može da zna koje dete je završilo sa izvršavanjem. Ako se dete-proces sruši, sistem simulira exit sistemski poziv i obaveštava roditelja. Prilikom izlaženja, dete-proces postajezombi proces, koji se ne izvšava, ali postoji u memoriji, kako bi roditelj mogao, koristeći wait4 sistemski poziv, da dobije više informacija o detetovom izvršavanju.

Multiprogramiranje

Multiprogramiranje predstavlja iluziju paralelnog izvršavanja više procesa ili programa. Kernel to omogućava pomoću smenjivanja konteksa procesa (context switching). Kontekst procesa obuhvata sve informacije koje kernel koristi za izvršavanje procesa (PID, prioritet, stanje izvršavanja, data, stack i text segmente, stanje signala, akcije na signale, tajmere, deskriptore...). Kernel odlučuje koji će proces sledeći da izvršava - ovo se naziva scheduling - vremensko planiranje.

Scheduling

Zadatak kernela je da isplanira i zakaže izvršavanje procesa tako da svi procesi mogu da zauzmu podjednako resursa. Programi se ocenjuju prema količini računanja i količini I/O koje izvršavaju i na osnovu toga im se odredjuje prioritet. On se u FreeBSD-u izračunava svake sekunde, na osnovu količine računanja u prethodnom periodu, količine memorije koju zauzima, ukupne zauzetosti resursa sistema i vrednosti nice koju ima svaki proces i koja označava poželjni prioritet. Svi procesi naizmenično dobijaju odredjen vremenski period izvršavanja. U FreeBSD-u ovaj period je 0,1 sekunda, posle čega kernel prelazi na izvršavanje procesa sa najvišim prioritetom.

Prioritet procesa

Procesi koji čekaju da se I/O operacija završi imaju veći prioritet izvršavanja, jer se izvršavaju u kernel-modu. Nasuprot tome, procesima koji zahtevaju dosta računanja (procesorskog vremena) prioritet se smanjuje, kako ne bi zauzeli kompletan procesor i zaustavili izvršavanje ostalih procesa. Na ovaj način 4.4BSD kernel daje prednost interaktivnim programima (kakvi su npr. tekst editori) nad dugotrajnim batch-type procesima koji zahtevaju dosta procesorskog vremena i koji zagušuju sistem.

Ograničavanje resursa

Kernel podržava ograničavanje količine resursa koji su dostupni pojedinačnim procesima. Ova ograničenja mogu biti: maksimalno CPU vreme koje proces može da zauzme, količina memorije koju može da alocira, veličina i broj fajlova koje proces može da kreira, broj simultanih procesa koje korisnik može da pokrene i dr.

Limiti, soft i hard

Za svako ograničenje postoje soft (mekani) i hard (čvrsti) limit. Kada proces predje soft limit, stiže mu signal koji obično rezultira prekidanjem izvršavanja procesa, ali proces može i da ignoriše ovaj signal i pokuša da oslobodi resurse. Ukoliko to ne uradi sledeći pokušaj alociranja još resursa neće uspeti.

Hard limit se ne može prekoračiti. Svi korisnici mogu svojim procesima da smanje hard limit, a jedino superuser može da ga poveća.

Sistemski procesi

Svi procesi u 4.4BSD-u (i naravno FreeBSD-u) potiču od jednog procesa kojeg startuje kernel. Prilikom startovanja sistema kreiraju se tri procesa i oni uvek postoje i izvršavaju se. Procesi swapper i pagedaemon su procesi koji se izvršavaju u kernel modu. Swapper (PID 0) je odgovoran za vremensko planiranje premeštanja procesa iz RAM memorije u sekundarni memorijski prostor (swap) ukoliko sistem ima manjak memorije. Pagedaemon (PID 2) je odgovoran za ispisivanje delova adresnog prostora procesa na swap. Init (PID 1) je proces koji se izvršava u korisničkom modu, van kernela i koji je odgovoran za administrativne zadatke, kao što je pokretanje drugih procesa (po jedan getty proces za svaki terminal mašine) zatvaranje procesa prilikom gašenja sistema (ulaskom u beskonačnu petlju ili restartovanjem sistema).

Identifikatori korisnika

Važna odgovornost operativnog sistema je da pruži mehanizam za kontrolu i ograničenje pristupa privilegovanim operacijama kernela (npr. gašenje sistema ili slanje mail-a). U FreeBSD-u ovaj mehanizam se zasniva na razlikovanju korisnika i grupa korisnika sistema. Svaki korisnik ima jedinstveni user identifier (UID), 32-bitni broj koji mu je pripisao sistemski administrator. Korisnici su svrstani u grupe, koje se označavaju GID (group identifier) brojem. Jednom korisniku koji se naziva superuser dostupne su sve operacije kernela, dok su mnoge od njih nedostupne običnim korisnicima.

Svakom procesu su pripisani UID i GID korisnika koji ga je pokrenuo, tako da obični korisnici mogu samo svojim procesima da šalju signale. Svaki fajl ima pristupne dozvole (access permissions) za vlasnika fajla, grupu korisnika kojoj pripada vlasnik i ostale korisnike. Ove dozvole uključuju čitanje (read), prepravljanje (write) i izvršavanje fajla (execute). Ovako se obezbedjuje kontrola pristupa fajlovima.

Setuid i setgid

U UNIX sistemima postoje setuid i setgid programi koji omogućavaju da korisnik kontrolisano izvši neke operacije koje mu nisu dozvoljene. Ovakvi programi moraju biti veoma pažljivo napisni kako ne bi došlo do zloupotreba privilegija.

2000 - 2018, Autor - Marko Uskoković. Izrada i web prostor - Goran Aleksić.