You are on page 1of 31

Uvod u operativne sisteme

Definicija i funkcije operativnog sistema

OS: Upravlja programima, podacima i delovima računara (procesorom, kontrolerima, memorijom), s ciljem
da oni budu što celishodnije upotrebljeni. Kreira pristupačno radno okruženje za krajnjeg korisnika računara.
Sakriva od korisnika detalje funkcionisanja ovih delova koji nisu bitni za korišćenje računara.
Drugim rečima, OS je skup programa koji upravljaju resursima računarskog sistema i obezbeđuju
interfejs prema korisniku.
Upravljanje resursima računara (resource management).
Pod pojmom resurs podrazumevamo sve što je programu potrebno za rad.
Resursi mogu biti:
• Hardverski (procesor, memorija, ulazno-izlazni uređaji)
• Softverski (programi, podaci, odnosno datoteke svih vrsta).
• Zadatak OSa je da vodi računa o resursima računara, odnosno da zadovolji potrebe programa, da
prati koji program koristi koje resurse itd.
Obezbeđivanje interfejsa prema korisniku.
OS kreira takozvanu virtuelnu mašinu. Virtuelna mašina se u ovom slučaju odnosi na apstrakciju. To je
jedinstven pogled na računarski sistem sa tačke gledišta korisnika,
nezavisan od konfiguracije računara, konkretnog hardvera i same arhitekture. Ova nezavisnost može biti
izražena u većoj ili manjoj meri.
OS je skup sistemskih programa koji posreduje između korisnika računara i računarskog hardvera, s
ciljem da:
Izvršava korisničke programe i olakša rešavanje korisničkih problema
Korišćenje računarskog sistema učini podesnijim za korisnika
Omogući što efikasnije iskorišćenje računarskog hardvera.
OS je jedan od najvažnijih i najsloženijih delova računarskog sistema I sastoji se od više relativno nezavisnih
celina! Hijerarhijski model ima sledeći smisao: Na posmatranom nivou OSa mogu se zahtevati usluge samo
od njegovih nižih nivoa, a nikako od viših. Najniži sloj je poznat kao jezgro operativnog sistema (kernel).
Ne postoje čvrsto definisana pravila koja regulišu raspodelu funkcija operativnog sistema po nivoima.
U memoriji se uvek nalaze samo najvažniji delovi OSa, takozvani rezidentni delovi, koji:
• Aktiviraju i završavaju korisničke programe
• Dodeljuju memoriju procesima
• Omogućavaju rad sa datotekama
• Obavljaju ulazno-izlazne operacije.
• Rezidentni deo operativnog sistema mora obavezno podržavati mehanizam prekida, jer je on
osnova: Višeprogramskog rada I Komuniciranja računara sa spoljnim svetom.
Deo operativnog sistema koji mora uvek postojati u radnoj memoriji je jezgro. Funkcije koje koriste svi nivoi
moraju se smestiti u jezgro operativnog sistema. Ostali delovi se ubacuju u memoriju kada su potrebni i
izbacuju kada više nisu potrebni.
Više OSa mogu da koriste isto ili slično jezgro.
Očekivane funkcije jednog računarskog sistema:
Izvršavanje određenih aktivnosti bez ljudske intervencije. Ljudske intrevencije su mnogo sporije od računara!
Mogućnost planiranja i raspoređivanje poslova i postojanje jezika za upravljanje poslovima. Određivanje koji
će se posao koji je spreman za rad izvršavati, odnosno
kome će se dodeliti procesor.
Multiprogramiranje. Pokretanje više programa na istom računaru istovremeno. Svaki program dobije deo
memorije, a procesor se dobija prema funkciji za raspoređivanje poslova.
Eliminisanje zavisnosti U/I operacija. U/I operacije su mnogo sporije od procesora pa OS mora da ih
izoluje.Univerzalan metod za obaveštavanje OS da se neka U/I operacija završila su prekidi.
Na osnovu definicije OS i očekivane funkcionalnosti jednog računarskog sistema
zaključuje se da OS mora obavljati sledeće funkcije:
• Upravljanje poslovima (sekvenciranje i raspoređivanje poslova) i interpretacija komandnog jezika
• Rukovanje ulazno-izlaznim operacijama
• Rukovanje greškama i prekidima
• Upravljanje resursima
• Višestruki pristup
• Zaštita resursa od zlonamernih napada, slučajnih grešaka korisnika i grešaka u korisničkim
programima i samom operativnom sistemu
• Obezbeđivanje dobrog interfejsa za operatera i korisnika
• Obračun korišćenja računarskih resursa.
Karakteristike operativnih sistema

Karakteristike operativnih sistema su: konkurentnost, deoba resursa, postojanje dugotrajne memorije i
determinizam.
Konkurentnost. Postojanje više simultanih, paralelnih aktivnosti. Problematične posledice konkurentnosti
su, na primer:
• Problemi sinhronizacije aktivnosti koje su međusobno zavisne.
• Problemi zaštite resursa koju aktivnosti dele.
Deoba resursa (softverskih i hardverskih). Konkurentne aktivnosti mogu da zahtevaju deljenje resursa ili
informacija. Razlog za deljenje hardverskog resursa može biti cena, a softverskog rad većeg broja ljudi na
nekom projektu.
Postojanje dugotrajne memorije. Deljenje programa i podataka nameće potrebu za trajnim skladištenjem
podataka sa mogućnošću brzog pristupa, tj za uređajima masovne ili
sekundarne memorije. Pri tom treba rešiti sledeće probleme:
• Obezbeđenje jednostavnog pristupa podacima
• Zaštita od zlonamernih ili nehotičnih grešaka i od grešaka samog sistema.
Nedeterminizam.
OS mora biti deterministički orijentisan. Kad izvršava isti program sa istim podacima mora da daje isti
rezultat, bez obzira da li će to raditi danas, sutra, ili za mesec dana.
OS se mora okarakterisati nedertemnističkim ponašanjem. Mora da odgovori na masu zahteva i
događaja koji se mogu desiti na nepredvidiv način (zahtevi za resursima, greške u toku izvršavanja
programa, prekidni signali uređaja).
U poželjne osobine operativnog sistema spadaju: visok nivo efikasnosti, visok nivo
pouzdanosti, jednostavnost održavanja i prihvatljiva veličina.
Efikasnost. Efikasnost OSa se predstavlja pomoću više kriterijuma, pri čemu značaj svakog kriterijuma u
globalnoj predstavi zavisi od vrste i namene Osa. Kriterijumi su:
• Srednje vreme između poslova
• Vreme neiskorišćenosti OS
• Vreme prolaska (turn-around time) za paketnu obradu
• Vreme odziva za interaktivne sisteme (response time),
• Iskorišćenost resursa (resurce utilisation)
• Propusna moć (broj poslova po satu, odnosno ukupna veličina posla koji
• može biti obavljen interaktivno u nekom vremenu).
Neka je t korisno vreme kada procesor radi korisne stvari, t održavanje vreme kada procesor radi poslove
vezane za održavanje samog sistema (housekeeping), a t ukupno ukupno vreme. Merilo efikasnosti
(efficiency): e = t korisno / t ukupno (0 < e <1). Merilo gubitka vremena (overhead): o = t održavanje / t ukupno (0 <
e <1, e + o =1).
Visok nivo pouzdanosti. Idealno, OS bi trebalo da bude potpuno bez grešaka, što u realnosti nije ostvarivo.
Merilo pouzdanosti je broj grešaka (ili srednje vreme između dve greške ili dva otkaza).
Jednostavnost održavanja. Na održavanju sistema treba da radi što manji broj ljudi. Postiže se
modularnom strukturom sa jasno definisanim interfejsima između modula i dobrom pratećom
dokumentacijom.
Prihvatljiva veličina.S povećanjem količine savremenih memorijskih sistema ovo gubi važnost. S druge
strane, veliki sistemi su podložni greškama, ali i njihov razvoj traje duže.

Vrste operativnih sistema

Prema broju korisnika, OS se mogu podeliti na:


• Jednokorisničke: obezbeđuju virtuelnu mašinu za samo jednog korisnika.
• Višekorisničke: obezbeđuje simultani pristup za više korisnika istovremeno.
Prema broju simultanih aktivnosti, odnosno prema broju procesa koji se mogu izvršavati paralelno ili
kvaziparalelno, OS se dele na:
• Jednoprocesne
• Višeprocesne.
Na osnovu kombinovanog kriterijuma mogu se izdvojiti tri vrste operativnih sistema:
• Jednokorisnički jednoprocesni (na primer, MS-DOS)
• Jednokorisnički višeprocesni (na primer, OS/2)
• Višekorisnički višeprocesni (na primer, Linux).
Prema nameni, OS se dele na:
• OS opšte namene, koji mogu da obavljaju razne poslove, kao što su obrada teksta i slike.
• OS specijalne namene, koji, po pravilu, služe za kontrolu procesa.
Prema načinu obrade poslova, OS se dele na:
• Sisteme sa grupnom obradom (batch). Korisnici predaju svoje poslove na izvršenje koji se zatim
odvijaju jedan za drugim. Korisnici nemaju mogućnost komuniciranja sa svojim poslovima.
• Interaktivne sisteme (interactive systems) Korisnici zadaju poslove i komuniciraju sa svojim
poslovima preko svojih terminala. Paralelnost u radu se postiže tako što se svakom programu
dodeljuje jedan kvantum procesorskog vremena. Po isteku kvantuma proces se prekida, bilo da je
završio sa radom ili ne, a procesor se dodeljuje sledećem procesu u redu čekanja.
• Kombinovane sisteme.

Višeprocesorski sistemi (multiprocessor systems) su sistemi sa više procesora koji su čvsto povezani
zatvorenim komunikacionim linijama, a nalaze se u istom kućištu. Procesori dele istu memoriju i sistemski
časovnik. Komunikacija i sinhronizacija između procesora obično se odvija preko deljive memorije.
Prednosti:
• Povećanje brzine. U idealnom slučaju N procesora bi radilo N puta brže, ali zbog međuprocesorske
sinhronizacije, to povećanje je manje od N.
• Povećanje ekonomičnosti. Dele se hardverski resursi: memorija, časovnik, DMA kanali, prekidni
kontroleri, i koristi jedan izvor napajanja.
• Povećanje pouzdanosti.Sistem nastaviti da radi i ukoliko otkaže jedan ili više procesora.
Postoje dva koncepta za realizaciju višeprocesorskih sistema:
Simetrično multiprocesiranje (symmetric multiprocessing, SMP) Svaki procesor izvršava istu kopiju
operativnog sistema, pri čemu te kopije komuniciraju jedna sa drugom kad god je potrebno. Svi procesori su
ravnopravni, odnosno nema odnosa gospodara-roba (master-slave). U idealnom slučaju, svakom procesoru
se dodeljuje jedan proces i oni se izvršavaju nezavisno, bez slabljenja performasi.Većina modernih OS
podržava SMP.
Asimetrično multiprocesiranje (asymmetric multiprocessing). U slučaju asimetričnog multiprocesiranja,
svakom procesoru je dodeljen specifičan posao. Postoji jedan glavni procesor (master) koji potpuno
kontroliše ceo sistem I koji dodeljuje poslove ostalim procesorima (slaves). Ova koncepcija se uglavnom
koristi u ektremno brzim i velikim sistemima.

Distribuirani sistemi. Kolekcija računara koji ne dele zajedničku memoriju i sistemski časovnik. Svaki
procesor, odnosno računar, ima sopstvenu lokalnu memoriju, a međusobna komunikacija se ostvaruje putem
mreže realizovane kao LAN ili WAN. Osim podataka, datoteka i štampača, distribuiraju se i procesi.
Distribuirani sistemi zahtevaju mrežnu infrastrukturu i mogu biti realizovani ili
kao: Klijent-server arhitektura. Ravnopravni računarski sistemi koji po mreži dele resurse (peer-to-peer
systems).
U klijent-server arhitekuri, postoje računari koje predstavljaju servere i računari koji koriste njihove usluge -
klijenti (clinets). Postoje dve vrste servera:
• Serveri za izračunavanje (computing servers), kojima klijenti šalju zahteve na obradu.
• Serveri podataka (file servers), koji služe za smeštanje datoteka.

Udruženi sistemi (clustered system) sastoje se od udruženih računara, odnosno od dva ili više nezavisnih
računara koji dele diskove i čvrsto su povezani LAN mrežom. Svaki računar u udruženom sistemu naziva se
čvor (node). Na svakom čvoru se izvršava jedan nivo softvera za udruživanje. Postoje dve vrste
udruživanja:
Asimetrično udruživanje (asymmetric clustering). Jedan server (čvor) izvršava aplikaciju, dok ostali – prateći
serveri (monitoring servers) prate rad glavnog servera u budnom ali neaktivnom stanju. U slučaju otkaza
glavnog servera jedan od pratećih servera preuzeće
njegovu ulogu.
Simetrično udruživanje (symmetric clustering). Svi serveri su aktivni i izvršavaju aplikaciju. Time se znatno
poboljšavaju performase, ali sistem mora da izdrži otkaz jednog ili više servera kao i u perthodnom slučaju.

Neke vrste računarskog okruženja:


Ugrađeno okruženje (embedded computing) je tipično za sisteme u realnom vremenu koje odlikuje
nepostojanje tastarure, monitora i diskova. Aplikacija koja se izvršava u realnom vremenu dobija ulazne
informacije preko uređaja kao što su senzori, dok se statusne i izlazne informacije prikazuju na malom
displeju.
Tradicinalno okruženje. Pod tradicionalnim okruženjem podrazumevamo jednokorisničke računare ili
sisteme sa deljenjem vremena, gde se korisnici preko svojih terminala povezuju na servere.
Računarstvo u oblaku. Isporuka računarskih resursa i skladišnih kapaciteta kao usluga za heterogenu
grupu krajnjih korisnika. Oslanja na deljenje resursa preko Interneta. Krajni korisnici pristupaju aplikacijama u
oblaku preko Web pregledača ili desktop aplikacije na mobilnom telefonu Softver i korisnički podaci nalaze
na servirama na udaljenoj lokaci.
Osnova računarstva u oblaku je konvergentna infrastruktura, koju čine različite IT tehnologije povezane u
jednu logičku i funkcionalnu celinu, kao apstrakcija fizičkih resursa vitruelizacijom.
Struktura virtuelnih mašina može se jednostavno definisati na sledeći način:
• Na najnižem nivou se nalazi hardver.
• Iznad hardvera se nalazi monitor virtuelnih mašina (virtual machine monitor), odnosno poseban
sistem koji obezbeđuje niz virtuelnih mašina (emulacije hardvera).
• Zatim se na te virtuelne mašine mogu instalirati različiti gostujući OS.
Hardverske operacije koje šalju ti OS prema svojim virtuelnim mašinama prihvata monitor virtuelnih mašina i
realizuje ih u skladu sa hardverom ispod sebe.
U modelu računarskog oblaka razlikujemo dva odvojena dela sistema:
• Korisnički deo (front end), koji obuhvata sve delove infrastrukture koji su pod kontrolom korisnika kao
i sam način pristupa korisnika usluzi.
• Zadnji deo (back end), koji obuhvata infrastukruru klaud provajdera.
Postoje tri osnovna tipa računarstva u oblaku:
• Softver kao usluga, SaaS (Software as a Service). Primer: Google Apps, Microsoft Office 365.
• Platforma kao usluga, PaaS (Platform as a Service). Primer: Google App Engine, Microsoft Azure.
• Infrastruktura kao usluga, IaaS (Cloud Infrastructure as a Service). Primer: Amazon CloudFormation
(EC2).

Opšti pregled strukture operativnih sistema

Upravljanje osnovnim resursima računarskog sistema obezbeđuje više funkcionalnih grupa programa:
• Upravljanje procesorom
• Upravljanje memorijom
• Upravljanje ulazom i izlazom
• Upravljanje podacima
• Upravljanje sekundarnom memorijom
• Umrežavanje
• Zaštita
• Korisnički interfejs.
Procesor je jedan od najvažnijih resursa računarskog sistema, mada u pojedinim situacijama neki drugi
resursi mogu biti kritičniji. Upravljanje procesorom se može podeliti na dva nivoa: Nivo neposredne dodele
procesora nekom programu, tj. predaje kontrole nad procesorom nekom programu. Nivo razrešavanja
prioriteta, odnosno odlučivanja koji program ima najveći prioritet da bi postao proces i da bi u nekom
sledećem trenutku dobio kontrolu nad procesorom.
Pod upravljanjem memorijom podrazumeva se upravljanje radnom memorijom računara:
• Realizacija određene strategije dodeljivanja memorije. Redosled dodeljivanja memorije poslovima.
Statično ili dinamično dodeljivanje, principi dodeljivanja.
• Dodeljivanje memorije.
• Sprovođenje strategije oslobađanja memorije. Ukrupnjavanje manjih oslobođenih delova memorije.
Oslobađanje delova memorije.
Na nivou upravljanja uređajima realizuju se sledeće funkcije:
• Obezbeđivanje nezavisnosti uređaja. Programi treba da budu nezavisni od tipa uređaja koji se
koriste za U/I operacije.
• Obezbeđivanje efikasnog rada uređaja. U/I operacije predstavljaju često usko grlo računarskog
sistema, poželjno je da se što efikasnije preklapaju i izoluju od procesora.
• Realizacija određene strategije dodeljivanja uređaja. Redosled dodeljivanja uređaja poslovima Način
dodeljivanja uređaja: namenski, sa deobom, kao virtuelni itd.)
• Dodeljivanje uređaja, tj. fizičko dodeljivanje uređaja, kontrolnih jedinica i kanala poslovima.
• Realizacija određene strategije oslobađanja uređaja. Na primer, uređaj se oslobađa tek kad se
posao kojem je dodeljen završi.
Nivo upravljanja podacima treba da obezbedi softverska sredstva za organizovanje i pristupanje podacima
na način koji odgovara korisniku računarskog sistema. Koncepcija upravljanja zavisi, pre svega, od vrste
podataka i režima njihovog korišćenja.
Na ovom nivou realizuju se sledeće funkcije:
• Formiranje i brisanje osnovnih struktura podataka (datoteka)
• Čitanje datoteka i upisivanje u datoteke
• Obezbeđivanje uslova za simboličko obraćanje datotekama (prema njihovim imenima)
• Zaštita podataka od namernog i nenamernog uništavanja (usled otkaza sistema)
• Zaštita podataka od neovlašćenog pristupa i korišćenja
• Deoba datoteka (podataka) između više poslova (korisnika).
U literaturi sloj upravljanja podacima često se objedinjuje sa slojem upravljanja sekundarnom memorijom. U
tim slučajevima, ovaj sloj obavlja i funkcije organizacije memorijskog prostora na masovnim memorijama
(najčešće diskovima ili SSD uređajima).
OS monolitne strukture se sastoji od skupa procedura bez ikakvog grupisanja ili hijerarhije. Ovaj način
organizacije operativnih sistema dobio je naziv velika zbrka (big mess).
OS slojevite strukture se deli na više slojeva od kojih svaki ima tačno određenu funkciju (upravlja tačno
određenim resursima). Svaki sloj se oslanja isključivo na funkcije nižih slojeva. Procesi su locirani u
korisničkom sloju gde svaki od procesa poseduje zaseban adresni prostor – korisnički prostor (user space).
Taj prostor je razdvojen od adresnog prostora OSa, tj. sistemskog prostora (kernel space). Time se nameće
neophodnost uvođenja mehanizma sistemskih poziva (system calls).
Sistemski pozivi omogućavaju prelazak iz korisničkog prostora u sistemski prostor radi poziva operacija
Osa. Sistemski pozivi su funkcije koje definiše OS i obezbeđuju intefejs između programa koji se izvršava i
operativnog sistema. Drugim rečima, programi komuniciraju sa OS pomoću sistemskih poziva.
Sistemski pozivi se realizuju pomoću sistema prekida:
• Korisnički program postavlja parametre sistemskog poziva na određene memorijske lokacije, u
registre procesora ili na stek ili registre procesora i inicira prekid.
• OS preuzima kontrolu, uzima parametre, izvrši tražene radnje, rezultat stavlja u određene
memorijske lokacije ili u registre i vraća kontrolu programu.
Sistemske pozive često podržava i hardver, tj. procesor, na taj način što razlikuje dva režima rada: korisnički
režim (user mode) i sistemski režim (supervisor mode). Korisnički programi mogu raditi isklučivo u
korisničkom režimu rada procesora. Sistemski režim rada je predviđen za OS. Privilegovane instrukcije (kao
što su instrukcije za rad sa U/I uređajima) mogu se izvršiti jedino u sistemskom režimu. Ako korisnički
program pokuša da izvršiti neku operaciju koja je dozvoljena samo u sistemskom režimu rada, kontrola se
predaje OS. Prilikom sistemskih poziva procesor prelazi iz korisničkog režima rada u sistemski, a vraća se u
korisnički režim posle obrade poziva.
Mikrokernel arhitektura je savremen koncept u realizaciji OS. Osnovna zamisao je:
• Napraviti minimalan i pouzdan kernel visokih performansi.
• Sve ostale funkcije kernela potisnuti u takozvani korisnički prostor.
• Korisnički moduli međusobno komuniciraju slanjem poruka (message passing).
U dobre osobine mikrokernel arhitekture spadaju:
• Jednostavno proširivanje i optimizacija kernela.
• Jednostavno dodavanje novih modula bez uticaja na bazični kernel.
• Jednostavna prenosivost na drugu računarsku arhitekturu.
• Veća pouzdanost (manje koda se izvršava u kernelskom režimu).
• Veća sigurnost.

Jezgro i upravljanje procesima

Kernel

Kernel (jezgro) je osnovni je deo svakog OS. U hijerarhijskom (slojevitom) modelu, kernel je najbliži
hardveru. Kernel je veza, odnosno interfejs između hardvera i ostalih slojeva OS. U slojevitom modelu NT
arhitekture ispod kernela se nalazi sloj apstrakcije hardvera (engl. Hardware Abstraction Layer) koji
omogućava OS da vidi različit hardver na isti način.
Osnovna funkcija kernela je upravljanje procesima, odnosno:
• stvaranje okoline u kojoj mogu postojati procesi,
• dodeljivanje procesora procesima i
• obezbeđivanje mehanizama za interprocesnu komunikaciju.
Procesor je nedeljivi resurs! Na jednom procesoru sa jednim jezgrom u jednom trenutku može se izvršavati
samo jedan proces. Kernel određuje kada i na koje vreme će proces dobiti procesor. Ova pojava je poznata
pod imenom multipleksiranje i predstavlja osnovu kvaziparalelnosti.
Da bi kernel ostvario svoju osnovnu funkciju, neophodno je da na nivou hardvera postoje određene
komponente koje omogućavaju nadogradnju hardvera kernelom.
Mehanizam prekida obezbeđuje izvršenje prekidne (engl. interrupt) rutine, odnosno prebacivanje kontrole
izvršavanja sa korisničkog na kontrolni program. Najmanje što mehanizam prekida treba da uradi jeste da
sačuva vrednost programskog brojača prekinutog korisničkog programa i pokrene kontrolni program.
Kontrolni program dalje određuje izvor prekida i odgovara na određeni način.
Zaštitni mehanizam adresiranja memorije. Sprečava pogrešno adresiranje, odnosno mogućnost da jedan
proces upiše svoje prateće podatke u deo memorije koji je dodeljen drugom procesu. Ovaj mehanizam
automatski čuva integritet procesa i podataka koji se nalaze u operativnoj memoriji.
Privilegovani instrukcijski set. Privilegovani set su instrukcije koje su dostupne OSu, ali ne i korisničkim
programima. Ove instrukcije omogućavaju OSu da dodeli procesor drugom procesu, pristupi zaštićenim
registrima u memoriji, izvrši ulazno-izlaznu operaciju i slično. Prilikom izvršavanja privilegovanih instrukcija
OS se nalazi u kontrolnom režimu (engl. supervisory mode). Korisnički program ne može da izvrši
privilegovanu instrukciju direktno. Korisnički program pomoću sistemskog poziva zahteva od OSa da izvrši
privilegovanu instrukciju, nakon čega OS prelazi u kontrolni režim i izvršava tu instrukciju.
Real-time časovnik. Pomoću real-time časovnika vrši se kontrola i evidencija potrošnje resursa računara za
sve pojedinačne procese. Ovaj mehanizam se može koristiti za raspoređivanje i zakazivanje izvršenja raznih
poslova.
Delovi kernela. Jezgro paper-model OSa (teoretski model „na papiru“) može se podeliti na tri osnovne
celine: prvi nivo obrade prekida, dispečer sistema i rutine za ostvarivanje interprocesne komunikacije.
Prvi nivo obrade prekida (engl. First Level Interrupt Handler, FLIH). Rutine za određivanje izvora prekida i
iniciranje servisa (opsluživanje nekih vrsta prekida).FLIH odgovara na spoljašnje prekide i sistemske pozive.
Posle izvršavanja koda koji čini ovaj deo OSa, prekid se smatra opsluženim, a dispečer dalje odlučuje kom
će procesu dalje predati procesor na korišćenje.
Dispečer sistema (planer poslova niskog nivoa, engl. low-level scheduler). Deo kernela koji dodeljuje
procesor procesima. Procesor se uvek dodeljuje na osnovu nekog algoritma (na primer, Shortest Job First).
Rutine za ostvarivanje interprocesne komunikacije. Deo jezgra OSa koji obezbedjuje različite načine
komunikacije među procesima, kao što su:
• slanje poruka (engl. send message, post message),
• semaforske tehnike,
• imenovane cevi (engl. named pipes, mehanizam karakterističan za UNIX sisteme),
• korišćenje deljive memorije.
Koncept modularnog jezgra. Moduli su delovi kernelskog koda koji mogu da se napune u memoriju ili
izbace iz memorije nezavisno od ostatka kernela. Moduli implementiraju drajvere za hardver, novi sistem
datoteka, mrežne protokole, itd. Omogućavaju mikro-kernel arhitekturu (realizaciju minimalne stabilne
konfiguracije jezgra).

Pojam procesa

Proces je program ili deo programa u stanju izvršavanja, zajedno sa svim resursima koji su potrebni za rad.
Drugim rečima: Program je pasivan objekat, odnosno datoteka na disku. Kada se ta datoteka učita u
memoriju, ona postaje proces, odnosno aktivan objekat koji ima svoje resurse, poput registara i memorije.
To znači sledeće:Tri korisnika koji obavljaju neku aktivnost biće predstavljena sa tri razna procesa.Jedan
program, koji je sam sebe razdelio na dva dela radi istovremenog (simultanog) izvođenja, biti predstavljen sa
dva razna procesa.Sam operativni sistem je takođe sastavljen od niza procesa.
Svaki proces ima tri fundamentalne memorijska dela, odnosno sekcije:
• programsku sekciju koja se ne menja i koja sadrži programski kod,
• stek sekciju (engl. stack section) koja sadrži privremene podatke (parametre za procedure, povratne
adrese, itd ...),
• sekciju podataka (engl. data section).
Kontrolni blok procesa (engl. Process Control Block, PCB) je memorijska struktura koju generiše OS.
Zahvaljujući PCB izvršenje programa se može prekidati i nastavljati više puta. PCB sadrži osnovne
informacije o procesu koje OS koristi za upravljanje tim procesom:
• ime ili jedinstveni identifikator procesa (PID),
• kontekst (okolina) procesa,
• prioritet procesa,
• informacije vezane za memoriju procesa,
• lista otvorenih datoteka,
• status zauzetih ulazno-izlaznih resursa,
• trenutno stanje procesa.
Kontekst procesa čine podaci koji se čuvaju prilikom oduzimanja procesora, a koje generiše sam hardver:
programski brojač, vrednosti registara i pokazivači na deo memorije koji proces koristi. Deo PCB u kome se
čuva kontekst se još naziva i hardverski kontrolni blok procesa.
PCB se u realnim OS nikad ne nalazi u istom memorijskom području kao i proces.

Dijagram stanja procesa

Stanje procesa (engl. process state) opisuje ono što se u datom trenutku događa sa procesom. Broj stanja
u kojima se proces može naći zavisi od konačnog automata koji je korišćen za opis. U ovom slučaju, radi
jednostavnosti izlaganja, korišćen je konačni automat sa pet stanja:
• Stanje START, tj. trenutak formiranja procesa.
• Stanje izvršavanja (RUN, RUNNING). Procesor izvršava istrukcije ovog procesa. Broj procesa u
RUN stanju u jednom trenutku određen je brojem procesora (jezgara).
• Stanje čekanja na procesor (READY, RUNNABLE). Proces je dobio sve potrebne resurse osim
pocesora, spreman je za rad i čeka da mu se dodeli procesor.
• Stanje čekanja na resurs (WAIT, UNRUNNABLE). Proces čeka na neki događaj (na primer, da
drugi proces završi sa štampanjem) jer su mu za dalje izvršavanje potrebni neki resursi koji trenutno
nisu na raspolaganju.
• Kraj izvršenja procesa (STOP). Proces u stanju STOP oslobađa sve resurse koje je zauzeo.
Proces se u svakom trenutku mora naći u jednom od ovih stanja a tranzicije iz jednog u drugo stanje se vrše
zavisno od događaja vezanih za proces, resurse koje proces koristi itd. Provođenje procesa iz jednog stanja
u drugo (engl. state transition) obavlja OS. Prilikom upravljanja procesima, dispečer prati i ispituje stanja u
kontrolnim blokovima procesa. Na osnovu toga, procesi se mogu dodati u red za čekanje na procesor.
Dodavanje u red se svodi na zamenu podataka u kontrolnim blokovima i pokazivača pomoću kojih se
formiraju redovi. Svaki proces počinje u stanju START, koje predstavlja neku vrstu pripreme. Nakon toga se
dovodi u stanje READY, odnosno stanje čekanja na dodelu procesa u procesorskom redu.
Ovo opisuje prvu tranziciju u dijagramu stanja. Posle nje, proces prolazi kroz dodatne tranzicije u konačnom
automatu.
Konačni automat sa pet stanja.
• READY-RUN. Dodela procesora procesu koji
je došao na početak reda za dodelu
procesora. Proces prelazi iz stanja čekanja na
procesor u stanje izvršavanja kada procesor
prekine izvršenje tekućeg procesa, tako da
može da otpočne izvršavanje novog procesa.
• RUN-READY. Oduzimanje procesora procesu
nakon isticanja kvantuma u kojem mu je
dodeljen. Ova tranzicija je moguća samo u
višeprocesnim operativnim sistemima. Ukoliko
je OS pre-emptive procesor se može oduzeti i
ukoliko naiđe proces višeg prioriteta.
• RUN-WAIT. Oduzimanje procesora ako je neki resurs potreban za izvršenje procesa zauzet. Ova
tranzicija je moguća i u jednoprocesnim i u višeprocesnim operativnim sistemima. Ova tranzicija se
može desiti u slučaju da proces čeka rezultat operacije koje obavlja drugi proces što je tipično za
odnos proizvođač-potrošač.
• WAIT-READY. Proces se vraća na kraj procesorskog reda nakon oslobađanja resursa koji je
neophodan za rad procesa. Tranzicija WAIT-RUN nije moguća u višeprocesnim operativnim
sistemima!
• RUN-STOP. Proces završava sa radom (prirodno ili nasilno).
Svi procesi u stanju READY mogu se povezati u procesorski red koristeći strukturu liste. Dispečer koristi
procesorski red prilikom upravljanja procesima.
Prošireni dijagram stanja procesa. Na nekim OS uvodi se mogućnost privremenog prekida izvršenja
procesa. Proces čije je izvršenje privremeno prekinuto je suspendovan i ne takmiči se za resurse. Ovaj
model automata karakterističan je za UNIX operativne sisteme. Korisnik koji inicira proces ima pravo da ga
supenduje. Korisnik može da odmrzne proces, tj. da nastavi izvršenje suspendovanog procesa. Sam OS
može po potrebi da suspenduje određeni broj procesa i tako spreči pojavljivanje zastoja i spreči efekat
zasićenja usled prevelike količine keširanih podataka. Suspendovanje procesa se može javiti kao posledica
upotrebe virtuelne memorije, odnosno swap prostora. Formiraju se dva dodatna stanja: SUSPENDED-
READY. Proces je suspendovan u stanju čekanja na procesor. SUSPENDED-WAIT. Proces je suspendovan
u stanju čekanja na resurs.
Konačni automat sa sedam stanja.

Nove tranzicije u proširenom dijagramu stanja:


• READY-SUSPENDED READY. Dovođenje procesa iz
stanja READY u suspendovano stanje. Proces prolazi
kroz avu tranziciju ako: na sistemu postoji previše
procesa u stanju READY, treba izbeći zastoj (engl.
Deadlock) I korisnik eksplicitno suspenduje proces.
• WAIT-SUSPENDED WAIT. Dovođenje procesa u
suspendovano stanje iz stanja WAIT.
• SUSPENDED WAIT-SUSPENDED READY. Resurs
neophodan za dalje izvršenje procesa je slobodan, ali
proces je i dalje suspendovan.
• SUSPENDED READY-READY. Proces je odmrznut i
dovodi se na kraj procesorskog reda. Ova tranzicija je
moguća samo na eksplicitan zahtev korisnika.
• SUSPENDED WAIT-WAIT. Proces je odmrznut, ali resurs neophodan za njegovo izvršenje nije
oslobođen. Ova tranzicija je moguća samo na eksplicitan zahtev korisnika.
Raspoređivanje procesa

Redovi čekanja na procesor. Povezane liste formirane od PCB procesa sa definisanim redosledom
izvršavanja procesa. Svi procesi koju su spremni za rad i nalaze se u operativnoj memoriji čuvaju se u tom
redu. OS takođe uvodi i poseban red čekanja za svaki ulazno-izlazni uređaj (engl. I/O queue). Svaki red
čekanja na uređaj sadrži povezanu listu PCB procesa koji taj uređaj zahtevaju. Novi proces se inicijalno
postavlja u red čeknja za spremne procese u kome čeka dodelu procesora, nakon čega napušta red i počinje
da se izvršava.
Proces koji se nalazi u stanju izvršavanja može:
• ostati bez procesora kada mu istekne
vremenski kvantum,
• kreirati novi proces i čekati u blokiranom
stanju da se novi proces izvrši,
• ostati bez procesora kada se dogodi prekid,
• postaviti I/O zahtev nakon čega se
prebacuje u red čekanja na ulazno-izlazni
uređaj.
Proces se vraća u red čekanja na procesor dok se
ne završi. Nakon završetka proces oslobađa sve
zauzete resurse.

Rutine OS za raspoređivanje procesa:


Planer poslova. U hijerarhijskom modelu se nalazi iznad kernela i obavlja sledeće funkcije:
• deli poslove na procese,
• na osnovu određenih algoritama dodeljuje prioritete procesima,
• dovodi procese u red čekanja na procesor.
Poziva se kada se pojave novi procesi ili kada jedan ili više procesa završi aktivnosti.
Dispečer dodeljuje procesor procesima koji se nalaze u procesorskom redu:
• tekućem procesu nakon isteka vremenskog kvantuma,
• drugom procesu ukoliko je tekući proces prešao iz stanja RUN u stanje WAIT ili READY.
Poziva se veoma često i od njega se očekuje veoma brz odziv kako bi mogao adekvatno da odgovori na
sukcesivne pozive. Vreme koje je potrebno dispečeru da zaustavi jedan proces i dodeli procesor drugom je
poznato kao kašnjenje dispečera (engl. dispatch latency).
Izvršavanje jednog procesa se sastoji iz: jednog ili više ciklusa izvršavanja na procesoru (engl. CPU burst),
jednog ili više ciklusa čekanja na ulazno-izlazne operacije (engl. I/O burst).
Na osnovu resursa koje dominantno koriste postoje:
• Procesi koje dominantno koriste procesor (engl. CPU bound) generišu vrlo malo U/I zahteva, najveći
deo svog vremena troše na upotrebu procesora.
• Procesi koji dominantno koriste ulazno-izlazne operacije (engl. I/O bound): najveći deo vremena
izvršavanja otpada na ulazno-izlazne cikluse, na upotrebu procesora i memorije se troši relativno
malo vremena, relativno brzo će se blokirati čekajuči na U/I operacije (ulazak u WAIT stanje).
Planer poslova mora da napravi dobru mešavinu I/O i CPU internzivnih procesa. Ako većina procesa koju
planer odabere intenzivno koristi U/I uređaje, procesor će biti slabo iskorišćen.
Zamena konteksta procesa (engl. context switch). Kontekst procesa su podaci koji se čuvaju prilikom
oduzimanja procesora, a koji omogućuju nastavak izvršenja procesa. Prilikom dodele procesora drugom
procesu dispečer:
• pamti stanje procesa koji se prekida, kao bi se proces mogao kasnije nastaviti i
• puni memoriju stanjem novog procesa kome se dodeljuje procesor.
Navedene operacije su poznatije pod nazivom zamena konteksta procesa. Prilikom zamene konteksta
poslednje stanje tekućeg procesa se čuva u njegovom PCB. Poslednje stanje procesa koji će se dalje
izvršavati rekonstruiše se iz odgovarajućeg PCB. Nakon toga se procesu predaje kontrola za nastavak
izvršenja. Zamena konteksta je premašenje sistema ali je neophodna za multiprogramiranje. Premašenje
zavisi od performansi procesora i memorije, broja registara koji se moraju sačuvati, optimalnih asembelskih
instrukcija, korišćenja raznih memorijskih tehnika itd.
Srednji nivo raspoređivanja. Srednji raspoređivač (engl.
intermediate scheduler) je posledica upotrebe swap tehnike,
odnosno virtulene memorije kod interaktivnih sistema.
Suština je u sledećem: Svaki novokreirani proces odlazi u
red čekanja a dispečer odlučuje kome će da dodeli
procesor. Neki procesi mogu biti suspendovani, odnosno
privremeno prekinuti i upisani na disk (engl. swap space),
čime se oslobađa memorija za druge procese.
Premeštanjem sa diska u memoriju, suspendovani procesi se vraćaju u red čekanja na procesor. Srednji
raspoređivač obavlja:
• suspenzije procesa (engl. swap-out),
• povratka procesa u stanje spremnosti (engl. swap-in),
• izbor procesa za obe funkcije.

Operacije nad procesima

Ranije opisani koncept jezgra uz korišćenje kontrolnih blokova procesa dozvoljava OS da nad procesima
izvrši sledeće operacije:
• kreiranje novog procesa – kreiranje kontrolnog bloka i ažuriranje procesne liste,
• kreiranje veza proces-proces roditelj,
• uništenje procesa brisanjem kontrolnog bloka iz procesne liste,
• promenu stanja procesa – obavljanje tranzicija u dijagramu stanja (npr. dodela procesora),
• promenu prioriteta procesa.
Kreiranje procesa. Proces može odgovarajućim sistemskim pozivom da kreira nove procese. Proces koji
kreira nove procese je roditeljski proces (engl. parent process) Proces koji je roditelj kreirao naziva dete
proces (engl. child process). Proces roditelj može da nastavi da se izvršava nezavisno i konkurentno sa
detetom ili da se blokira i čeka dok proces dete ne zavši svoje aktivnosti. Svaki proces koji je dete nekog
drugog procesa može dalje kreirati nove procese. Na taj način se formira hijerarhijska procesna struktura
(stablo aktivnih procesa).
Kreiranje procesa – primer (Linux OS).
• Svaki proces dobija univerzalni identifikator PID (engl. Process Identifier).
• Novi procesi se kreiraju pomoću sistemskog poziva fork() . Oba procesa (roditelj i dete) nastavaljaju
izvršenje nakon sistemskog poziva fork() . Svaki od njih dobija različit PID: dete dobija PID=0, a
roditelj PID različit od 0. Sistemski poziv fork() duplicira adresni prostor roditelja i dodeljuje ga detetu.
Rezultat: Adresni prostor oba procesa je napunjen istim programom (kodom). I Identifikatori procesa
su različiti.
• Dete proces zatim izvršava sistemski poziv exec() . Ovaj poziv puni program u adresni prostor
dodeljen detetu i izvršava ga.
• Proces roditelj izvršava sistemski poziv wait() . Time se blokira dok proces dete proces ne završi
svoje aktivnosti i ne vrati status roditeljskom procesu.
# include <stdio.h>
main (int argc, char *argv[]) {
int pid;
pid = fork ();
// proces dete
If (pid == 0) {
execlp (“/bin/sh”, “ls”, NULL);
}
// proces roditelj
else {
wait (NULL);
/* proces dete završio svoje aktivnosti */
exit (0);
}
}
Primer odgovara slučaju interpretera /bin/sh koji izvršava komandu ls . Roditelj kreira novi proces pomoću
fork sistemskog poziva. Proces dete čiji je PID 0 izvršava sistemski poziv exec koji će u dodeljni adresni
prostor napuniti i izvšiti program ls . Proces roditelj čiji je PID različit od 0, čeka da se ls komanda završi. Tek
kada proces dete završi aktivnosti, roditelj će izaći iz wait sistemkog poziva.

Rutine za interprocesnu komunikaciju

Rutine za interprocesnu komunikaciju se moraju implementirati u kernelu kako bi bile dostupne svim
procesima i kako bi imale direktan pristup dispečeru. Interprocesna komunikacija se može ostvariti na više
načina kao što su:
• semaforske tehnike,
• slanje poruka,
• korišćenje deljive memorije (na primer, bafera),
• korišćenje imenovanih cevi.
Proces je nezavistan ukoliko nema direktnog uticaja na izvršenje drugih procesa i ukoliko na njegovo
izvršenje direktno ne utiču drugi procesi. Praktično, nezavisni procesi ne dele nikakve podatke sa drugim
procesima.
Kooperativni procesi su oni procesi koji jedni na druge međusobno utiču. Praktično, to su procesi koji dele
podatke ili bilo kakve resurse.
Konkurentno izvršavanje kooperatvnih procesa zahteva mehanizam koji će dozvoliti procesima da
međusobno komuniciraju između sebe i da sinhronizuju svoje akcije. Problem sinhronizacije se može
objasniti na čuvenom problemu proizvođač-potrošač. Proivođač je proces koji proizvodi informacije a
potrošač je proces koji ih troši (koristi). Ta dva procesa mogu da rade konkurentno ukoliko postoji deljivi bafer
koji će puniti proizvođač, a prazniti potrošač. Pravila sinhronizacije:
• Potrošač ne može uzeti ništa iz bafera ako proizvočač to prethodno nije stavio u bafer.
• Ukoliko je bafer pun, proizvođač ne može ubaciti informaciju dok potrošač najpre ne uzme nešto iz
bafera.
Deljivi bafer se može realizovan kao cirkularna struktura koja se sastoji od N elemenata [0, N-1]. Pokazivači
in i out određuju prvo slobodno i prvo puno mesto u baferu. Bafer je prazan kada je in=out . Bafer je pun
kada (in+1) mod N = out .
# define N 10
typedef struct {
/* Promenljive koje čine jedan element bafera, odnosno jednu informaciju */
} item;
item buffer[N] // Bafer veličine N
int in = 0; // Prvo slobodno mesto
int out = 0; // Prvo zauzeto mesto
Proizvođač: Potrošač:
item next_produced; item next_consumed;
while (1) { while (1) {
/* Proizvođač proizvodi informaciju */ while (in == out);
while (((in+1)%N) == out); /* Sinhronizacija (bafer je prazan). Potrošač
/* Sinhronizacija (bafer je pun). Proizvođač čeka se da proizvođač nešto stavi u bafer /*
čeka da potrošač nešto uzme iz bafera */ next_consumed = buffer[out];
buffer[in] = next_produced; out = (out+1) % N;
in = (in+1) % N; /* Potrošač konzumira informaciju */
} }
Ovo rešenje je korektno samo u slučaju da se u baferu mogu naći najviše N-1 informacija. Za slučaj bafera u
kome se mogu naći svih N informacija mora se obezbediti dodatna sinhronizacija (biće objašnjeno u
izlaganju o sinhronizaciji procesa).
Slanje poruka. Slanjem poruka omogućava se sinhronizacija aktivnosti bez upotrebe deljive memorije.
Pogodno je za distribuirana okruženja gde procesi egzistiraju na različitim računarima. Da bi procesi mogli
da komuniciraju slanjem poruka, neophodno je u kernel implementirati sledeće dve operacije (primitive):
slanje poruke (engl. send message, post message) I prijem poruke (engl. receive message).
Postoje različite šeme za realizaciju ovih primitiva kao što su:
• Sinhrono ili blokirajuće (engl. blocking) slanje i primanje poruka. Proces koji šalje poruku se
blokira dok drugi proces ili sanduče ne prime poruku. Proces koji prima poruku se blokira dok ne
dobije poruku.
• Asinhrono ili neblokirajuće (engl. nonblocking) slanje i primanje poruka. Moguće su različite
kombinacije ovih metoda. Primer: šema u kojoj su i slanje i primanje blokirajući se zove rendezvous.
Direktna komunikacija. Procesi moraju da imaju mogućnost imenovanja radi jednoznačne identifikacije.
Procedure za slanje i primanje moraju da sadrže ime procesa sa kim žele konuniciraju. Adresiranje:
simetrično ili asimetrično. Asimetrično: pošiljaoc navodi ime primaoca a primalac ne mora da navede ime
pošiljaoca. send (P, message), receive (Q, message) // simetrično adresiranje, receive (id, message) //
asimetrično adresiranje Pravila direktne komunikacije:
• Link se uspostavlja automatski između para procesa koji žele da komuniciraju.
• Jedan link se uspostavlja samo za dva procesa.
Nedostatak: pri promeni imena procesa sve reference sa starim imenom moraju se pronaći i modifikovati u
novo ime (a te situacije nisu uvek poželjne).
Indirektna komunikacija. Poruke se šalju ili primaju preko poštanskih sandučića (engl. mailbox) ili portova.
Poštansko sanduče je objekat sa jedinstvenim ID u kome OS ostavlja poruke drugih procesa. Dva procesa
mogu komunicirati samo ako dele sanduče. Proces može komunicirati sa procesom preko više različitih
sadučića. Primer: slanje poruka u poštansko sanduče A i primanje poruka iz poštanskog sandučeta A: send
(A, message), receive (A, message)
Pravila indirektne komunikacije:
• Link se uspostavlja između para procesa koji dele sanduče.
• Linku se mogu pridružiti više od dva procesa.
• Više različitih linkova može postojati između svakog para procesa, gde svaki link odgovara jednom
sandučetu.
Gde nastaje problem? Tri procesa (P1, P2 i P3) koji dele isto sanduče A. Proces P1 šalje poruku u sanduče
A. Procesi P2 i P3 proveravaju da li je neka poruka smeštena u sanduče. Pitanje: koji će proces preuzeti
upućenu poruku? Ovaj problem se može rešiti na više načina: Link preko jednog poštanskog sandučeta
mogu da uspostave isključivo dva procesa. Samo jedan proces može obaviti prijem u jednom trenutku
vremena. Adresiranje poruke (navođenje imena procesa primaoca). Sandučići mogu biti vlasništvo procesa
ili OS-a. Šta OS mora da obezbedi za indirektnu komunikaciju? Mehanizme za kreiranje novog sandučeta za
svaki par procesa koji želi da komunicira, slanje i primanje poruka kroz sanduče i brisanje sandučeta.
Semafori. Semafor je celobrojna nenegativna promenljiva, čija vrednost štiti neki resurs (određuje da li je
slobodan ili zauzet) i omogućava komunikaciju između procesa. Semafor ima svoju početnu vrednost s a
nad njim se mogu izvršiti dve operacije: signal I wait . Operacija wait(s) umanjuje vrednost semafora samo
ako je s>0. Ako je s=0 proces koji izvršava ovu operaciju ulazi u stanje čekanja na resurs. Kada vrednost s
postane pozitivna (drugi proces je oslobodio resurs) operacija wait će: umanjiti vrednost semafora (s=s-1), I
uvesti proces u kritičnu sekciju (deo koda u kome proces koristi resurs). Kada proces želi da prekine
korišćenje resursa on: izvršava operaciju signal(s) čime uvećava s (s=s+1), I napušta kritičnu
sekciju.Operacije signal i wait su nedeljive – ne mogu podeliti na više ciklusa. Dva procesa ne mogu
istovremeno izvršavati ove operacije nad istim semaforom.
Mehanizam utičnica (engl. Socket). Par procesa koji želi da komunicira preko mreže formira par utičnica
(po jednu za svaki proces). Utičnica se definiše pomoću dva parametra IP:port. Koristi se klijent-server
arhitektura: server osluškuje da li je stigao zathev klijenata na tom portu. Primer: računar želi da uspostavi
Web sesiju sa serverom. Klijent proces na strani računara kreira svoju utičnicu na portu 1625 i preko tog
priključka komunicira sa tačno definisanom Web utičnicom (port 80) na strani Web servera.

Laki i teški procesi

Niti (engl. threads), odnosno laki procesi (engl. lightweight process, LWP) su osnovne celine za izvršavanje
koda pod savremenim OS. Niti predstavljaju programsku celinu koja treba da obavi jedan posao. Niti (jedna
ili više) pripadaju jednom tradicionalnom odnosno teškom procesu. Niti kao laki procesi i delovi jednog istog
procesa imaju:
• svoje unikatne resurse: poseban identifikator niti (engl. thread ID), posebnu vrednost programskog
brojača, drugih registara procesora i stek, podatke specifične za nit (ukoliko su potrebni);
• zajedničke resurse sa ostalim nitima istog procesa: kod sekcija, sekcija podataka, otvorene
datoteke, signali.
Proces sa svojim nitima može obavljati više poslova simultano Prebacivanje konteksta sa jedne niti na drugu
daleko brže i efikasnije od prebacivanje konteksta između teških procesa. Čuvaju se i rekontruišu samo
registri procesora i stek. Jednonitni proces (engl. singlethreaded) i višenitni proces (engl. multithreaded).
Rad sa nitima. U višenitnoj arhitekturi menja se semantika
sistemskih poziva za kreiranje i rad sa procesima. Mora postojati
poziv za kreiranje teškog procesa kao i poziv za kreiranje jedne
jedine niti. Prekidanje niti je aktivnost koja prekida izvršavnje niti
pre njenog prirodnog završetka. Nit koja će biti prekinuta obično se
naziva ciljna nit (engl. target thread). Prekidanje ciljne niti može se
dogoditi po dva scenarija:
• Asinhroni prekid. Aktivnost niti se odmah prekida bez
obzira na stanje u kome se nalazi.
• Odloženi prekid (teži za implementaciju). Ciljna nit
proverava periodično da li treba da prekine aktivnost i ako
treba to će učiniti u povoljnom trenutku kad obavi neku
celinu.
Signal upućen nekom višenitnom procesu zavisno od situacije može se proslediti:
• samo onoj niti kojoj je namenjen,
• svim nitima procesa,
• samo nekim nitima procesa,
• samo onoj niti procesa čija je namena da prima i obrađuje sve signale za proces.
Raspoređivanje procesa i dodela procesora

Uvodne napomene

Ideja multiprogramiranja je jasna i jednostavna: Svaki proces ostaje u stanju izvršenja dok mu: ne istekne
vremenski kvantum ili dok ne dođe u situaciju da mora da čeka na neki događaj (npr. završetak U/I)
komande. Na prostim sistemima procesor ne radi ništa dok proces čeka. Na višeprocesnim sistemima,
memorija se puni većim brojem procesa. Kad aktivni proces mora da čeka, OS mu oduzima procesor i
dodeljuje ga nekom drugom procesu. Dodela procesora po nekom algoritmu je jedna od fundamentalnih
funkcija OSa! Sličan princip se primenjuje i za druge resurse, kao što su U/I uređaji. Veći broj zahteva se
smešta u red za čekanje, a zatim se raspoređuju po nekom kriterijumu.
Procesor se dodeljuje drugom procesu pod sledećim okolnostima:
• kada proces pređe u stanje čekanja na resurs (1), npr. čeka na završetak I/O operacije koju je
inicirao,
• kada proces roditelj čeka proces dete da završi aktivnosti (2),
• prilikom tranzicije RUN-STOP, odnosno kada tekući proces završi aktivnosti (3),
• prilikom tranzicije RUN-READY (4).
Za slučaj (1), (2) i (3) novi proces mora biti izabran iz reda čekanja na procesor I aktiviran.
Raspoređivanje bez predpražnjenja (engl. nonpreemptive scheduling).
• Rapoređivanje bez prekidanja izvršenja tekućeg procesa.
• Procesor se može oduzeti samo od procesa koji je završio svoje aktivnosti ili čeka na resurs.
Raspoređivanje sa predpražnjenjem (engl. preemptive scheduling). Procesor se može oduzeti procesu
koji nije završio svoje aktivnosti i nije blokiran! Prednost: Procesor se može jako brzo dodeliti procesu višeg
prioriteta koji zahteva izvršenje. Problem: Moguća nekonzistentnost zajedničkih podataka. Proces koji je
otpočeo ažuriranje podataka je prekinut, a kontrola dodeljena drugom procesu koji koristi iste podatke.
Jedna od hardverskih komponenti neophodna za pretpražnjenje je tajmer koji peroidično postavlja prekidni
signal. Pretpražnjenje ima uticaj na konstrukciju kernela OSa. Pravilo: da ne bi nastao haos, proces koji je
pomoću sistemskog poziva prešao u kernelski režim se ne može prekidati sve dok je u tom režimu rada.
Kriterijumi dodele procesora.
• Iskorišćenje procesora. Po ovom kriterijumu procesor treba da bude zauzet, odnosno da radi nešto
bez prestanka.
• Propusna moć sistema (engl. Throughput). Definiše se kao broj procesa izvršen u jedinici
vremena. Za dugačke procese ovaj odnos može biti 1 proces na sat, za kratke transakcione procese
može biti na primer 10 procesa u sekundi. Propusna moć zavisi od vrste procesa i brojnih
hardverskih i sistemskih osobinama.
• Vreme potrebno za kompletiranje procesa (engl. turnaround time). Ukupno vreme potrebno da se
izvrši pojedinačni proces. Računa se od trenutka kreiranja do završetka procesa a uključuje i vreme
potrebno da proces uđe u red čekanja, vreme provedeno u redu čekanja, itd.
• Vreme čekanja (engl. waiting time). Ukupno vreme koje proces provede u redu čekanja na procesor
(engl. ready queue). Proces do kraja svog izvršavanja može više puta da bude u ovom redu čekanja
kao i da na ovo vreme direktno utiču algoritmi za rasproređivanje.
• Vreme odziva (engl. response time). Vreme potrebno da se nakon slanja zahteva pojave prvi
rezultati izvršenja procesa. Ovo vreme je veoma bitno kod interaktivnih sistema.
Primer: da li želite da čekate na terminal na aerodromu više od 1h? Zavisno od namene sistema algoritmi se
optimizuju za određene kriterijume, najmanje, najveće ili srednje vrednosti.
Primer: Za interaktivne sisteme je značajnije minimizirati najveće vreme odziva a ne srednje vreme.
Ispitivanje algoritama. Pitanje: kako odabrati algoritam za raspoređivanje procesa u nekom posebnom
sistemu? Prvi problem: postavititi glavni kriterijum ili kombinaciju kriterijuma kao što su: Maksimizovanje
iskorišćenosti procesora uz ograničenje da max. vreme odziva bude 1 sec. Maksimizovanje propusne moći
tako da srednje vreme izvršavanja bude lienarno proporcionalno ukupnom vremenu izvršavanja. Kada se
defniše kriterijum obavlja se analiza različitih algoritama po pravilu putem simulacije. Za simulaciju je
potrebno radno optrećenje (engl. workload) koje može biti sintetičko ili realno. Opterećenje se formira
snimanjem svih procesa jednog realnog sistema u određenom periodu vremena u statističku datoteku (engl.
trace file). Simulira se red čekanja koji može biti izveden u jednom ili u više nivoa. Svaki red ima svoj
kapacitet, vremensku raspodelu nailaska procesa, i algoritam koji se primenjuje za raspoređivanje procesa.
Kada simulator obavi svoje, dobijaju se inforamcije o uspešnosti jednog algoritma na datom statističkom
uzorku.
Algoritmi za raspoređivanje procesa

First Come, First Served


Prvi došao, prvi uslužen (engl. First Come, First Served, FCFS) je najprostiji algoritam za raspoređivanje
procesora. Procesi dobijaju procesor onim redom kojim su pristizali u red čekanja. Red čekanja funkcioniše
po standardnom FIFO principu:
• PCB procesa koji je ušao u red čekanja na procesor stavlja se na kraj liste.
• Procesor uvek dodeljuje onom procesu koji je na početku liste.
Algoritam je lak i za razumevanje i za implementaciju. Međutim, srednje vreme čekanja (engl. waiting time)
za ovaj algoritam je krajnje dugačko.
Primer 1:
Procesi P1, P2 i P3 čija su vremena izvršavanja 24,
3 i 3msec nailaze u poretku P1,P2, P3.
Vremena čekanja (waiting time) za procese P1, P2 i
P3 su 0, 24 i 27msec respektivno.
Srednje vreme čekanja t w = (0+24+27)/3 = 17msec.
Primer 2:
Promena redosleda nailaska procesa (P2, P3, P1).
Situacija se značajno menja.
Vremena čekanja za procese P1, P2 i P3 6, 0 i
3msec respektivno.
Srednje vreme čekanja je t w = (6+0+3)/3 = 3msec.
Na osnovu primera zapaža se da srednje vreme čekanja zavisi:
• Od dužine trajanja procesa
• Od sekvence njihovog nailaska u sistem.
Kod FCFS algoritma moguća je pojava konvoj efekta. Svi procesi čekaju da se završi jedan proces koji dugo
traje. Analogija sa saobraćajem: Veliko sporo vozilo (šleper) na uzbrdici prati veći broj manjih bržih vozila.
Brža vozila ne mogu da preteknu šleper zbog pune linije.
FCFS ne poštuje priorite procesa već samo vreme dolaska u red čekanja. Zato se izvodi bez pretpražnjenja,
odnosno prekidanja procesa. To znači da se proces koji je dobio izvršava u potpunosti ili do trenutka
blokiranja zbog čekanja na U/I operaciju. Zbog toga je FCFS je krajnje nepodesan za interaktivne sisteme.

Shortest Job First


Algoritam Shortest Job First (SJF) funkcioniše po principu: obavi prvo najkraći posao. Za sve procese u
redu čekanja procenjuje se vreme potrebno za izvršavanje. Procesor se dodeljuje onom procesu kome treba
najmanje vremena za izvršenje, odnosno procesu koji bi najkraće trajao. Za koji imaju ista procenjena
vremena izvršavanja primenjuje se FCFS algoritam. Osnovni nedostatak:
• Sistem ne može tačno da proceni trajanje procesa u celini.
• Predviđanje trajanja procesa se zasniva na činjenici da se proces sastoji iz više ciklusa korišćenja
procesora (engl. CPU burst) koji se prekidaju U/I operacijama.
• Procena trajanja se obavlja tako što se proceni trajanje sledećeg ciklusa korišćenja procesora na
osnovu prethodnih ciklusa korišćenja procesora.
• Algoritam se preciznije može nazvati najkraći sledeći CPU ciklus (engl. shortest next CPU burst).
Procena trajanja sledećeg ciklusa korišćenja procesora. Jedan od načina da se obavi procena trajanja
sledećeg ciklusa korišćenja procesora je određivanje srednje vrednosti na bazi svih prethodnih CPU ciklusa.
Neka su:
τ n+1 je procenjena vrednost trajanja sledećeg CPU ciklusa
t n je realno trajanje prethodnog CPU ciklusa
τ n je procenjena vrednost trajanja prethodnog CPU ciklusa
Koeficijent a je na intervalu 0<=a<=1. Koeficijent a određuje relativnu težinu istorije procene u ondnosu na
realno vreme poslednjeg poznatog ciklusa.
Formula za procenu trajanja sledećeg ciklusa korišćenja procesora:
Kombinuje prethodnu vrednost t n i istoriju procene trajanja ciklusa koja je sublimisana u τ n
t n+1 = a t n + (1-a)τ n
Primer procene trajanja sledećeg ciklusa korišćenja
procesora:
a=0.5, τ 0 =10 vremenskih jedinica, t 0 =6, t 1 =4, t 2 =6,
t3=4, t 4 =t 5 =t 6 =13 vremenskih jedinica.
Procenjena vremena su: τ 1 =8, τ 2 =6, τ 3 =6, τ 4 =5,
τ5=9, τ 6 =11, τ 7 =12.
Postoje dve varijante SJF algoritma:
• Sa pretpražnjenjem (engl. preemptive) Uvek završiti tekući proces bez obzira kakav se novi proces
pojavio u redu čekanja.
• Bez pretpražnjenja (engl. non-preemptive) Ukoliko je vreme potrebno za izvršenje novog procesa
kraće od vremena potrebnog za završetak aktivnosti tekućeg procesa, procesor će biti dodeljen
novom procesu. Naziva se i raspređivanje sa najmanjim preostalim vremenom (engl. shortest-
remaining time first).
Za SJF veoma je bitno znati dve informacije:
• Vreme nailaska procesa u red čekanja (engl. arrival time)
• Vreme potrebno za izvršenje procesa (engl. CPU burst time).
Napomena: kod FCFS je bitan samo jedan parametar, a to je vreme nailaska procesa u red.
Primer: SJF bez pretpražnjenja.

U prvom trenutku u redu se nalazi samo proces P1 čije izvršenje traje 7 vremenskih jedinica. U toku
izvršavanja procesa P1 u red pristižu preostala tri procesa. Kada proces P1 završi svoje aktivnosti SJF
odabira proces P3 zato što je najkraći. Nakon završetka aktivnosti procesa P3 (t=8) u redu ostaju dva
procesa sa jednakim vremenima izvršavanja. SJF na njih primenjuje FCFS algoritam koji odabira proces P2
a zatim P4. Vremena čekanja za procese su: t w (P1) = 0, t w (P2) = 8-2 = 6, t w (P3) = 7-4 = 3, t w (P4) = 12-5
= 7, Srednje vreme čekanja je t w = (0+6+3+7)/4 = 4. U slučaju FCFS srednje vreme čekanja bi bilo
tw=(0+5+7+7)/4 = 4,75.
Primer: SJF sa pretpražnjenjem (SRTF).

U prvom trenutku u redu čekanja se nalazi samo proces P1 (vreme izvršavanja 7), koji počinje da se
izvršava. U trenutku t=2 pojavljuje se proces P2 (vreme izvršenja 4) što je manje od vremena preostalog za
izvršenje procesa P1 (5 vremenskih jedinica). Zbog toga se procesor u trenutku t=2 prazni i predaje procesu
P2. U trenutku t=4 pojavljuje se novi proces P3. Opet se obavlja analiza preostalih vremena: P1 zahteva još
5, P2 još 2 ciklusa, a P3 kao novi proces samo 1 ciklus, što će izazvati novo pražnjenje nakon koga P3
dobija procesor … Vremena čekanja za procese su: t w (P1) = 11-2 = 9, t w (P2) = 5-4 = 1, t w (P3) = 0,
tw(P4)=7-5=2, Srednje vreme čekanja je t w = (9+1+0+2)/4 = 3.

Raspoređivanje na osnovu prioriteta


Svakom procesu se dodeljuje prioritet a algoritam bira proces sa najvećim prioritetom. Prioritet je celobrojna
vrednost a najčešće se koristi konvencija po kojoj:
• Manji broj znači veći prioritet.
• Veći broj znači manji prioritet (na primer, vrednost 0 je najviši prioritet).
• U slučaju procesa sa jednakim prioritetom, odluka se donosi po FCFS principu.
SJF je specijalan slučaj prioritetno-orijentisanih algoritama za raspoređivaje. Prioritet je obrnuto
proporcionalan trajanju sledećeg CPU ciklusa procesa. To znači da duži procesi imaju manji prioritet i
obrnuto.
Prioritetno-orijentisani algoritmi mogu biti realizovani:
• Sa pretpražnjenjem (engl. priority preemptive scheduling). Tekući proces se prekida izvršenje ukoliko
se pojavi proces većeg prioriteta (provera se odvija uvek kada se pojavi novi proces).
• Bez pretpražnjenja (engl. priority non-preemptive scheduling). Proces koji je dobio kontrolu ne
prekida izvršenje bez obzira što se pojavo proces većeg prioriteta.
Glavni problem: blokiranje niskoprioritetnih procesa. Procesi niskog prioriteta mogu veoma dugo
(neograničeno) da čekaju na procesor. Primer rešenja problema zakucavanja niskoprioritetnih procesa:
povećanje prioriteta sa vremenom provedenim u redu čekanja na procesor. Preciznije rečeno rezultujući
prioritet se formira na osnovu: Početnog prioriteta, koji proces dobija kada uđe u red čekanja na procesor I
Vremena provedenog u redu čekanja (engl. aging).
Ako prioritete dinamički određuje OS dobro je uzeti u obzir:
• Procesima koji intenzivno koriste U/I uređaje treba dodeliti viši prioritet jer su ovakvi procesi često
blokirani a procesor im treba u kraćim intervalima.
• Procesima koji intenzivno koriste procesor i operativnu memoriju treba dodeliti niži prioritet. U
obrnutom slučaju I/O bound procesi bi dugo čekali na procesor i zauzimali mesto u operativnoj
memoriji a U/I podsistem bi ostao prilično besposlen.
Round Robin
Round Robin (RR) se može posmatrati kao FCFS algoritam sa pretpražnjenjem. Najpre se definiše
vremenski kvantum (engl. time slice) i kružni red čekanja na procesor. Svaki prispeli proces ubacuje na kraj
liste. Od sistema se očekuje da generiše prekidni signal po isteku vremenskog kvantuma. RR funkcioniše na
sledeći način:
• Proces je završio aktivnost pre isteka vremenskog kvantuma. Proces oslobađa procesor a RR
uklanja proces iz liste i predaje kontrolu sledećem procesu.
• Proces nije završio aktivnosti ali mora da prekine izvršenje kada mu istekne vremenski kvantum. RR
postavlja prekinuti proces na kraj reda a kontrolu predaje sledećem procesu iz liste.
• Proces se blokirao zbog čekanja na U/I operacije. Blokirani proces oslobađa procesor a RR predaje
kontrolu sledećem procesu iz liste. Proces prelazi u red čekanja na kraj RR liste tek nakon povratka
u stanje READY.
RR je fer je prema procesima (svi dobijaju procesor na korišćenje ravnomerno I ravnopravno). Ako imamo n
procesa u redu čekanja, svakom procesu pripada 1/n procesorskog vremena. Ako je kvantum dužine q,
nijedan proces u stanju READY neće čekati više od (n-1)q vremena na sledeću dodelu procesora.
Nedostaci:
• Srednje vreme odziva RR algoritma je po pravilu jako dugo.
• Prebacivanje konteksta između dva procesa unosi premašenje u vidu nekorisnog vremenskog
kašnjenja.
• Ovo premašenje je jedan od glavnih činilaca prilikom izbora veličine kvantuma. Što je kvantum
manji, procesor će biti ravnomernije raspodeljen, ali će I prebacivanje konteksta između procesa biti
češće, tako da će premašenje sistema biti veće. Ukoliko je kvantum veći, RR algoritam konvergira
ka FCFS algoritmu.
Primer:
Kvantum: 20 vremenskih jedinica.
Četiri procesa (P1, P2, P3 i P4) su došla u red u skoro
istom trenutku.
Vremena izvršavanja ovih procesa su 53, 17, 68 i 24
vremenskih jedinica, respektivno.

Performanse RR algoritma zavise od veličine vremenskog kvantuma. U slučaju većih vremenskih kvantuma
RR konvergira ka FCFS algoritmu. U slučaju veoma malih vremenskih kvantuma svaki proces radi brzinom
jednakom 1/n brzine realnog procesora. Ovo je idealan slučaj (pretpostavlja se da dispečer obavlja
prebacivanje konteksta trenutno). Realno: Dispečer je realizovan softverski i izvršava se kao zaseban
proces. Kao takav unosi kašnjenje pri svakom prebacivanju konteksta. Realna brzina izvršavanja svakog
procesa je manja od 1/n brzine realnog CPU I opada sa porastom učestanosti prebacivanja konteksta.
Analiza štetnog uticaja veoma malih vremenskih kvantuma.
Srednje vreme izvršavanja procesa za male vrednosti
kvantuma ne popravlja se obavezno sa povećanjem
vremenskog kvantuma!
Primer:Vremena potrebna za izvršenje procesa 6, 3, 1 i 7
vremenskih jedinica. Svi procesi pristižu u sistem u trenutku
t=0. Vremenski kvantumi veličine 2, 4 I 5 povećavaju vreme
izvršenja umesto, da ga smanjuju.
Pretpostavite da je RR implementiran tako da su članovi reda za dodelu
procesora pokazivači na kontrolne blokove procesa. Pitanje: šta se
postiže stavljanjem dva pokazivača na isti proces u red čekanja na
procesor? Odgovor: postiže se efekat sličan povećanju prioriteta
procesa, jer proces češće dobija procesor na korićenje. Pitanje: kako se
može izmeniti osnovni RR tako da se isti efekat postigne bez uvođenja
dvostrukih pokazivača? Odgovor: uvođenjem dva različita vremenska
kvantuma, pri čemu se veći kvantum dodeljuje procesima sa višim
prioritetom, a manji procesima sa nižim prioritetom.

Raspoređivanje u više procesorskih redova

Ova klasa algoritama odnosi se na sisteme i sitacije u kojima se procesi mogu klasifikovati u različite grupe.
Primer: procesi koji rade u prvom planu (engl. foreground) i procesi koji rade u pozadini (engl.
background). Ove dve klase procesa imaju različite zahteve za vreme odziva i zbog toga se koriste različiti
algoritmi za raspoređivanje procesora. Interaktivni procesi imaju osetno veći prioritet u odnosu na procese
koji rade u pozadini.
Algoritmi za raspoređivanje u više redova dele red čekanja u više razdvojenih redova. Procesi se ubacuju
u odgovarajući red čekanja na osnovu osobina procesa, kao što su veličina memorije, prioritet i tip procesa.
Svaki red čekanja ima poseban nezavistan algoritam za raspoređivanje koji odgovara njegovim potrebama.
Primer: Poseban red čekanja za interaktive procese se opslužuje po
RR algoritmu. Poseban red čekanja za procese koji rade u pozadini,
koji se opslužuje po FCFS algoritmu.
U slučaju više redova čekanja, kada je u pitanju selekcija procesa
između različitih redova, primenjuje se prioritetna šema sa
pretpražnjenjem. Pored apsolutnog prioriteta, može se uvesti i RR
između različitih redova (na primer, OS može dodeliti 80%
procesorskog vremena interaktivnom redu i 20% vremena pozadinskom redu).
Povratna sprega između redova. U prethodnoj šemi procesi pripadaju svojim redovima od nastanka do
završetka aktivnosti. Ponekad se zahteva fleksibilnost koja će omogućiti prelazak procesa iz jednog u drugi
red. Ideja: procesi se na osnovu svojih karakteristika (vezanih za korišćenje procesora i U/I uređaja) razdvoje
u različite redove.
Proces koji zahteva puno procesorskog vremena ubacuje se u niskoprioritetni red.
• Interaktivni i U/I dominantni peocesi ubacuju se u visokoprioritetne redove.
• Uvodi se vremenska komponenta koja spečava zakucavanje: Ako proces čeka isuviše dugo,
prebacuje se u red višeg prioiteta.
Parametri koji definišu redove čekanja sa povratnom spregom su:
• broj redova,
• algoritam za raspoređivanje za svaki red posebno,
• metode za određivanje reda u koji će proces ući po kreiranju i kada proces može da pređe u red
višeg, odnosno nižeg prioriteta.
Ovo rešenje primenjuju praktično svi savremeni OS.

Raspoređivanje u višeprocesorskoj okolini

Raspoređivanje je daleko složenije jer zahteva ozbiljnu sinhronizaciju procesora. Pretpostavićemo da su


svaki procesor može da izvršava bilo koji proces iz reda čekanja.
U tom slučaju može se:
• Obezbediti poseban red čekanja za svaki procesor. Problem: jedan procesor može biti potpuno
besposlen ukoliko je odgovarajući red prazan a drugi procesor gotovo potpuno opterećen.
• Konstruisati zajednički red čekanja. OS može koristiti više tehnika za raspoređivanje:
• Simetrično (svaki procesor ispituje zajednički red i bira procese koje će izvršavati). Opasnost
postoji prilikom pristupa zajedničkim podacima. Takođe, dva procesora ne smeju da preuzmu isti
proces.
• Asimetrično (međuprocesorski master-slave odnos). Master procesor izvršava kernelski kod i U/I
operacije. Ostali procesori izvršavaju korisnički kod. Nije efikasno jer sve U/I operacije izvršava
samo jedan procesor.

Sinhronizacija procesa

Problem sinhronizacije

Kooperatvni proces može da utiče na druge procese ili da trpi uticaj drugih procesa. Do toga dolazi usled
deljenja podataka koji su smešteni u memoriji ili u datotekama. Ukoliko nema sinhronizacije, moguća je
nekonzistentnost tih podataka!
Primer: Dva procesa P1 i P2 žele da privremeno sačuvaju neku vrednost na memorijskoj lokaciji A. Proces
P1 proverava da li je memorijska lokacija A slobodna. Lokacija A je slobodna  proces P1 je obavešten da je
lokacija A slobodna. Proces P2 proverava da li je memorijska lokacija A slobodna. Lokacija A je slobodna 
proces P2 je obavešten da je lokacija A slobodna. Proces P1 upisuje podatak na memorijsku lokaciju A.
Proces P2 upisuje drugi podatak na memorijsku lokaciju A. Proces P1 čita pogrešan podatak sa memorijske
lokacije A! Da bi se izbegle slične situacije, OS mora da obezbedi mehanizme za očuvanje konzistentnosti
podataka, odnosno mehanizme sinhroizacije procesa.
Problem proizvođača i potrošača. Rešenje sa baferom kapaciteta N elemenata i promenljivim in i out radi
za N-1 elemenata u baferu. Hoćemo da izmenimo kod tako da bafer radi sa punim kapacitetom. Uvodimo
novu deljivu promenljivu counter koja opisuje broj zauzetih elemenata u baferu. Početna vrednost
promenljive counter je 0. Promenljiva se uvećava za 1 svaki put kada proizvođač doda novi element u bafer.
Promenljiva se umanjuje za 1 svaki put kada potrošač uzme jedan element iz bafera.
typedef struct { Proizvođač v1.0: Potrošač v1.0:
/* Jedan element bafera */ item next_produced; item next_consumed;
} item; while (1) { while (1) {
item buffer [N] // Bafer veličine N /* Proizvođač proizvodi informaciju */ while (in == out);
while (((in+1) % N) == out); /* Sinhronizacija (bafer je prazan).
int in = 0; // Prvo slobodno mesto /* Sinhronizacija (bafer je pun). Potrošač čeka se da proizvođač
int out = 0; // Prvo zauzeto mesto Proizvođač čeka da potrošač nešto nešto stavi u bafer /*
int counter = 0; // Broj zauzetih uzme iz bafera */ next_consumed = buffer[out];
elemenata buffer[in] = next_produced; out = (out+1) % N;
in = (in+1) % N; /* Potrošač konzumira informaciju */
} }
Rešenje je OK u slučaju da se u baferu mogu naći najviše N-1 informacija. Bafer je pun kada (in+1) mod N =
out . Bafer je prazan kada je in=out .
Proizvođač v2.0: Potrošač v2.0: Potrošač v2.0:
item next_produced; item next_consumed;
while (1) { while (1) {
/* Proizvođač proizvodi informaciju */ while (counter==0);
while (counter == N) /* Sinhronizacija (bafer je prazan).
/* Sinhronizacija (bafer je pun). Potrošač čeka se da proizvođač
Proizvođač čeka da potrošač nešto nešto stavi u bafer /*
uzme iz bafera */ next_consumed = buffer[out];
buffer[in] = next_produced; out = (out+1) % N;
in = (in+1) % N; counter--;
counter++; /* Potrošač konzumira informaciju */
} }
Rešenje za bafer sa punim kapacitetom: proizvođač i potrošač koriste promenljivu counter . Bafer je pun
kada je counter=N . Bafer je prazan kada je counter=0 . Pitanje: čemu „crveno slovo“ nad promenljivom
counter ? Proces proizvođač i potrošač se mogu izvršavati konkurentno samo ako se operacije counter++ i
counter-- izvršavaju atomarno ili nedeljivo, odnosno bez prekidanja. Problemi nastaju kao posledica
implementacije operacija uvećanja i umanjenja promenljive counter koje nisu atomarne već se izvršavaju se
na sledeći način:
• Vrednost promenljive counter se upiše u lokalni CPU regitar.
• Vrednost registra se uveća ili umanji za 1.
• Vrednost registra se vraća u promenljivu counter .
Kod za operacije counter++ i counter-- na simboličkom mašinskom jeziku:
Operacija counter++ : Operacija counter-- : Operacija counter-- :
register1 = counter register2 = counter
register1 = register1 + 1 register2 = register2 – 1
counter = register1 counter = register2
Primer preklapanja mašinskih instrukcija ako globalne operacije nisu atomarne. Vrednost promenljive
counter u početnom trenutku je 5. Proizvođač i potrošač obavljaju svoje operacije counter++ i counter--
konkurentno. Izvršava se šest mašinskih instrukcija. Nakon izvršenja ovih operacija vrednost promenljive
counter može biti 4, 5 ili 6. Ispravna vrednost je 5.
Naredba Izvršava Instrukcija register1 register2 counter
T0 proizvođač register1 = counter 5 / 5
T1 proizvođač register1 = register1 + 1 6 / 5
T2 potrošač register2 = counter 6 5 5
T3 potrošač register2 = register2 – 1 6 4 5
T4 proizvođač counter = register1 6 4 6
T5 potrošač counter = register2 6 4 4
Primer preklapanja mašinskih instrukcija ako globalne operacije nisu nedeljive. Ova sekvenca za posledicu
ima pogrešnu vrednost promenljive counter (4). Promena redosleda naredbi T4 i T5 takođe dovodi do
nekorektne situacija, odnosno pogrešne vrednosti promenljive counter (6). U oba slučaja greška nastupa
zato što oba procesa konkurentno pristupaju zajedničkoj promenljivoj.
Naredba Izvršava Instrukcija register1 register2 counter
T0 proizvođač register1 = counter 5 / 5
T1 proizvođač register1 = register1 + 1 6 / 5
T2 potrošač register2 = counter 6 5 5
T3 potrošač register2 = register2 – 1 6 4 5
T4 potrošač counter = register2 6 4 4
T5 proizvođač counter = register1 6 4 6
Ako više procesa pristupa i modifikuje iste podatke konkurentno, krajnja vrednost zajedničkih podataka zavisi
od sekvence instrukcija koje tim podacima pristupaju. Ova sekvenca se naziva stanje trke (engl. race
condition) i zavisi od: prekidnih signala, I načina raspređivanja procesa. U trci se pobednik obično ne zna,
tako da je krajnji rezultat sekvence neizvestan. Ovo se ne sme dozvoliti! Stanje trke se može sprečiti ukoliko
se obezbedi mehanizam sinhronizacije koji će dozvoliti pristup zajedničkom resursu samo jednom od
konkurentnih procesa u jednom vremenskom trenutku.

Kritična sekcija

Kritična sekcija (engl. critical section) je deo koda u kome proces pristupa ili menja zajedničke podatke
(memorijske promenljive, tabele ili datoteke). OS može dozvoliti samo jednom procesu da bude u svojoj
kritičnoj sekciji, tj. izvršavanje kritičnih sekcija procesa je međusobno isključivo u vremenu (engl. mutual
exclusion). Proces traži od OS dozvolu da uđe u kritičnu sekciju pomoću specijalnog koda (ulazne sekcije).
Kada prođe ulaznu sekciju, proces može ući u svoju kritičnu sekciju. Po završetku proces mora objaviti svim
ostalim procesima da više nije u kritičnoj sekciji, što se postiže delom koda koji se zove izlazna sekcija.
Određivanje dela koda koji predstavlja kritičnu sekciju je zadatak programera!
do {
entry section
critical section
exit section
/* ostatak koda koji ne pripada kritičnoj sekciji */
} while (1);
Pretpostavke softverskog rešenja kritične sekcije:
• Međusobno isključenje. Unutar kritične oblasti u jednom trenutku može naći najviše jedan proces.
• Mogućnost ulaska. Svaki proces ima mogućnost ulaska u svoju kritičnu sekciju.
• Sprečavanje ulaska. Proces van kritične sekcije ne sme sprečiti druge procese da uđu u svoje
kritične sekcije. Proces u kritičnoj sekciji može sprečiti ostale procese da uđu u kritičnu sekciju.
• Čekanje. Proces ne sme neograničeno dugo da čeka da uđe u svoju kritičnu sekciju. Proces se sme
neograničeno dugo da ostane u svojoj kritičnoj sekciji. Proces mora da izađe i omogući drugim
procesima da uđu u svoje kritične sekcije.

Algoritam stroge alternacije

Zajednička promenljiva turn određuje koji proces može ući u svoju kritičnu sekciju. Samo proces čija je
vrednost indeksa jednaka vrednosti promenljive turn može ući u svoju kritičnu sekciju. Ulazana sekcija: while
petlja (čeka da promenljiva turn postane jednaka indeksu procesa). Izlazna sekcija: promenljivoj turn se
dodeljuje vrednost indeksa drugog procesa.Primer za dva procesa P0 i P1:
Kod procesa P0: Kod procesa P1:
do { do {
while (turn != 0) ; // ulazna sekcija while (turn != 1); // ulazna sekcija
/* kritična sekcija */ /* kritična sekcija */
turn = 1; // izlazna sekcija turn = 0; // izlazna sekcija
/* ostatak koda */ /* ostatak koda */
} while (1); } while (1);
Poštuje se stroga alternacija procesa po pitanju ulaska u svoje kritične oblasti. Može se dešavati samo
sekvenca P0 -> P1 -> P0 -> P1 … Rešenje zadovoljava uslov međusobnog isključenja (engl. mutual
exclusion). Samo jedan proces može da uđe u svoju kritičnu sekciju.
Nedostaci rešenja:
• P1 ne može ući u svoju kritičnu sekciju ako P0 ne prođe svoju kritičnu sekciju I postavi vrednost promenljive
turn na 1. Može doći do blokiranja sistema.
• Polling tehnika ulazne sekcije. Stalno se proverava stanje promenljive turn što troši procesorsko vreme.
• Slučaj dva procesa od kojih je jedan znatno sporiji u odnosu na drugi. Brži proces će dugo čekati da spori
proces dodeli odgovarajuću vrednost promenljivoj turn i time mu omogući ulazak u kritičnu sekciju.
Realizacija kritične sekcije bez stroge alternacije

Osnovni nedostatak prethodnog algoritma je sam princip stroge alternacije. Algoritam ne sadrži dovoljno
informacija o procesima. Jedina informacija u algoritmu tiče se procesa koji ima pravo da uđe u kritičnu
sekciju, bez obzira da li proces to želi ili ne. Stroga alternacija se može eliminisati uvođenjem binarne
promenljive flag za svaki proces posebno.
• Ako je flag[i]=1 , proces Pi je spreman i želi da uđe u svoju kritičnu sekciju.
• Ako je flag[i]=0 , proces Pi ne želi da uđe u svoju kritičnu sekciju jer njegovo izvršenje trenutno ne
zavisi od zajedničkih podataka.
Inicijalno, za dva procesa P0 i P1 uvode se dve kontrolne promenljive flag[0] i flag[1] sa početnom vrednošću
0. int flag[2]; flag[0] = flag[1] = 0; // boolean
Kod procesa Pi je:
do {
flag[i] = 1;
while (flag[j]); // ulazna sekcija
/* kritična sekcija */
flag[i] = 0; // izlazna sekcija
/* ostatak koda */
} while (1);
Rešenje deluje korektno. Zadovoljava međusobno isključenje. Van kritičnih sekcija procesi ne utiču jedan na
drugog. Proces postavlja fleg na 1 (želi da uđe u svoju kritičnu sekciju). Proces proverava da li je drugi
proces postavio svoj fleg na 1. Ako jeste, čeka u petlji da drugi proces izađe iz kritične sekcije i postavi svoj
fleg na 0.
Sledeća sekvenca dokazuje da je ovaj algoritam pogrešan (otpada kao rešenje):
• P0 postavlja flag[0]=1 . Posle toga se kontrola dodeljuje procesu P1.
• P1 postavlja flag[1]=1 . Oba procesa upadaju u beskonačnu petlju jer su oba flega postavljena na 1 i
ni jedan ne mođe da uđe u svoju kritičnu sekciju.

Dekker-Petersonov algoritam

Kod procesa Pi je:


do {
flag[i] = 1;
turn = j;
while (flag[j] && turn = j);
/* kritična sekcija */
flag[i] = 0;
/* ostatak koda */
} while (1);
Promenljiva flag ukazuju da proces želi da u uđe u svoju kritičnu sekciju. Promenljiva turn određuje koji
proces ima prednost ulaska u kritičnu sekciju. Način rada: Proces Pi najpre postavlja turn=j odnosno daje
šansu drugom procesu (Pj) da uđe u svoju kritičnu sekciju. Proces Pi čeka na ulazak u kritičnu sekciji samo
ako su ispunjeni sledeći uslovi:
• Proces Pj želi da uđe u svoju kritičnu sekciju: flag[j]=1
• Procesu Pj je data šansa za ulazak u kritičnu sekciju: turn=j .
U svim drugim situacijama proces Pi ulazi u svoju kritičnu sekciju.
Svi uslovi su zadovoljeni.
• Poštuje se međusobno isključenje. Promenljiva turn obezbeđuje da u kritičnu sekciju može ući samo
jedan proces I to onaj koji ima prednost. Proces koji nema prednost ne odustaje, ali čeka na red.
• Nema stroge alternacije. Neka se P1 zaglavi u ostatku koda koji ne pripada kritičnoj sekciji dovoljno
dugo. Proces P0 kreće da izvršava do-while petlju iz početka. Tada je flag[1]=0 , flag[0]=1 , turn=1 .
Vrednost logičkog izraza while petlje procesa P0 biće 0. Proces P0 može ponovo ući u kritičnu
sekciju a da ne čeka na proces P1.
• Nema zaglavljivanja u beskonačnoj petlji. Ne može biti istovremeno turn=0 i turn=1 . Ne postoji
mogućnost da oba procesa beskonačno dugo ostanu unutar while petlje.
Pekarski algoritam

Pekarski (engl. bakery) algoritam je generalizacija prethodnog rešenja za realan slučaj sa N procesa u
sitemu. Ideja: poštovanje reda, čime se sprečava haos. Red se (navodno) poštuje u bankama, poštama, pa I
pekarama – otud naziv algoritma. Pravilo: Svaki kupac u pekari dobija broj (engl. ticket). Radnik uslužuje
kupce redom, počev od onog sa najmanjim brojem.
Slično pravilo primenjuje se i na procese:
• Svakom procesu se dodeljuje broj.
• Pekarski algoritam ne garantuje da će dva procesa uvek dobiti različite brojeve.
• Ako dva procesa dobiju isti broj, odlučiće ime, odnosno indeks procesa (process ID).
Pravila pekarskog algoritma. Sekvenca brojeva se generiše u rastućem redu i dodeljuje procesima (npr.
1,2,3,3,3,3,4,5…) Procesi se opslužuju na osnovu vrednosti dodeljenih brojeva počev od procesa kome je
dodeljen najmanji broj i. Ako dva procesa Pi i Pj dobiju iste brojeve prvo se opslužuje proces sa manjim
indeksom. Primer: ako je i<j tada se prvo opslužuje Pi.
Leksikografski poredak dva elementa (ticket, process ID) dat je na sledeći način:
• (a, b) < (c, d) ako je a < c ili ako je a = c i b < d.
• max (a 0 , ... , a n-1 ) je broj a k , takav da je a k 3 a i za svako I e [0, n–1]
Zajednički podaci za pekarski algoritam: int choosing[n] (boolean) i int number[n] . Za svaki proces se
definišu promenljive: Binarna choosing[i] koja služi za sinhronizaciju prilikom dobijanja broja. Celobrojna
number[i] koja sadrži broj koji je proces Pi dobio i koji mu definiše prioritet. Ni jedan proces ne može ući u
kritičnu sekciju dok neki proces dobija broj. Svi podaci su inicijalno postavljeni na 0.
do {
choosing[i] = 1;
/* Pi dobija broj. Kandidati za ulazak u kritičnu sekciju moraju da čekaju */
number[i] = max (number[0], ... , number[n–1]) + 1;
/* Pi dobija najveći broj u tom trenutku, uvećan za 1, što mu garantuje najniži prioritet */
choosing[i] = 0;
/* Pi oslobađa fleg choosing[i]=0 i pristupa ulaznoj sekciji */
for (j=0; j<n; j++) {
while (choosing[j]);
while ( (number[j] != 0) && ((number[j], j) < (number[i], i)) );
/* U ulaznoj sekciji, proces ostaje sve dok ne postane proces sa najmanjim brojem.
To se proverava u petlji (number[j], j) < (number[i], i)) */
}
/* kritična sekcija */
number[i] = 0;
/* Pi anulira svoj broj i više ne učestvuje u takmičenju za ulazak u kritičnu sekciju */
/* ostatak koda */
} while (1);

Hardverska realizacija kritične sekcije

Kritična sekcija je rešiva na nivou harvera ako postoje nedeljive procesorske instrukcije: Za čitanje i
izmenu memorijske reči ili Razmenu sadržaja dve memorijske reči. VAŽNO: instrukcije se ne smeju prekidati
u toku izvršavanja!
Mašinska naredba procesora TestAndSet (&target) :
• (1) Čita vrednost korisničke promenljive target
• (2) Kopira tu vrednost u korisničku promenljivu rv
• (3) Postavlja vrednost promenljive target na true (1).
U praksi rv predstavlja neki registar procesora, a target neku memorijsku lokaciju.
Naredba swap: Razmenjuje vrednosti dve memorijske promenljive preko privremenog registra procesora
(neka se radi ilustracije zove temp ).
• (1) temp = a
• (2) a = b
• (3) b = temp
Algoritam koji koristi hardversku podršku za realizaciju kritične oblasti (naredba TestAndSet ). Koristi se
promenljiva lock čija je inicijalna vrednost 0: int lock = 0; Kod za sve procese:
do {
while (TestAndSet(lock));
/* kritična sekcija */
lock = 0;
/* ostatak koda */
} while (1);
Hardver garantuje da: (a) samo jedan proces može da pročita vrednost promenljive lock i da je neposredno
posle toga postavi na 1, (b) pri tome ne može biti prekinut. Proces koji želi da uđe u svoju kritičnu sekciju
postavlja lock na 1 i ulazi u kritičnu sekciju. Svi ostali procesi čekaće u while petlji dok je lock=1 . Kada
proces napusti K.S. postaviće lock na 0 i omogućiti drugim procesima da uđu u svoju K.S.
Algoritam koji koristi hardversku podršku za realizaciju kritične oblasti (naredba swap ).
Kod za sve procese je:
do {
key = 1;
while (key == 1) swap(lock, key);
/* kritična sekcija */
lock = 0;
/* ostatak koda */
} while (1);
Promenljivoj lock se inicijalno dodeljuje vrednost 0. Proces koji želi da uđe u svoju kritičnu sekciju zamenjuje
vrednosti lock i key (lock=1 , key=0 ). Proces ulazi u svoju kritičnu sekciju. Ostali procesi će detektovati
lock=1 i čekaće da proces napusti svoju KS i postavi lock=0 . Nakon toga neki drugi proces može ući u svoju
kritičnu sekciju.

Semafori

Semafor je celobrojna promenljiva nenegativne vrednosti koja:


• Štiti neki resurs i
• Omogućava komunikaciju između procesa: Mehanizam međusobnog isključenja ili Sinhronizaciju
aktivnosti kooperativnih procesa.
Vrednost semafora određuje da li je resurs kog taj semafor štiti slobodan.
• Ukoliko je vrednost semafora val(s)=0 resurs je zauzet.
• Resurs je slobodan ukoliko je vrednost semafora val(s)>0 .
Svaki semafor ima svoju početnu vrednost.
Nad semaforom se mogu izvršiti dve nedeljive operacije:
• Operacija signal(s): increment s;
• Operacija wait(s): when (s > 0) do decrement s;
Nedeljivost ovih operacija se ogleda u sledećim činjenicama: Operacije signal i wait se ne mogu podeliti na
više ciklusa. Dva procesa ne mogu istovremeno izvršavati ove operacije nad istim semaforom.
Problem kritične sekcije može se rešiti upotrebom binarnog semafora mutex (mutual exclusion).
semaphore mutex; /* inicijalno, mutex = 1 */
Kod koji važi za sve procese na sistemu obezbediće zaštitu kritičnih sekcija:
do {
wait(mutex); // ulazna sekcija
/* kritična sekcija */
signal(mutex);
/* ostatak koda */
} while (1);
Samo jedan proces proći će semafor, oboriti mu vrednost na 0 i ući u svoju kritičnu sekciju. Svi drugi procesi
čekaju na semaforu. Kada proces napusti kritičnu sekciju oslobodiće semafor komandom signal(mutex) .
Saradnju između procesa čije su aktivnosti sinhronizovane obezbeđuje semafor proceed . Inicijalna vrednost
ovog semafora je 0. Primer: Procesu P1 je u tački S1 neophodna informacija koju proces P2 obezbeđuje u
tački S2.P1 ne može da nastavi izvršenje u tački S1 dok P2ne prođe tačku S2 i obezbedi neophodnu
informaciju.
Proces P1 Proces P2 Program koji se izvršava u Program koji se izvršava u procesu
procesu P1: P2:
... ...
/* P1 čeka na infomaciju koju /* P2 obezbeđuje infomaciju
wait (proceed) S1 obezbeđuje P2 */ neophodnu za
wait (proceed); dalje izvršenje procesa P1 */
S1 signal (proceed) /* Proces P1 nastavlja izvršenje */ signal (proceed);
... ...
Nedostaci i mogući problemi.
• Ignorisanje prioriteta procesa. Može se desiti da najprioritetniji proces uđe u kritičnu sekciju posle velikog
broja neprioritetnih procesa.
• Mogućnost da proces bude zaposlen čekanjem (busy waiting). Proces se neprestano vrti u while petlji i ne radi
ništa korisno. U petlji proverava vrednost semafora kako bi saznao da li može ući u svoju kritičnu sekciju. Iako
ne radi ništa korisno proces troši procesorsko vreme. Primer: 1.000 procesa od kojih se jedan nalazi u kritičnoj
sekciji. Ostali čekaju na ulazak u svoje kritične sekcije. Jedan proces radi nešto korisno i 999 procesa čekajući u
petlji troše procesorsko vreme.
Rešenje problema. Kritična sekcija se realizuje pomoću sistemskih poziva kojima se proces može blokirati.
Proces koji čeka da uđe u kritičnu sekciju postaje blokiran dok ga drugi proces ne oslobodi. U kontekstu
semaforskih tehnika: proces koji čeka na semaforu čija je vrednost 0 blokira se i kao takav ne troši
procesorsko vreme.
Redefinicija pojma semafora. Za svaki semafor se uvodi poseban red čekanja (semaforski red). Svi
procesi koji izvršavaju operaciju wait nad semaforom čija je vrednost negativna ili jednaka nuli se pomoću
sistemskog poziva sleep blokiraju i prevode u semaforski red. Procesor se oslobađa i predaje nekom drugom
procesu koji nije blokiran. Proces nastavlja svoje izvršenje nakon sistemskog poziva wakeup koji ukida
blokadu procesu. Blokada se može ukinuti samo ako je proces:
• Prvi u semaforskom redu ili ima najviši prioritet na semaforu, i
• Neki drugi proces obavi signal operaciju nad tim semaforom.
Semafor u proširenom kontekstu je struktura čiji su elementi:
• Celobrojna vrednost semafora (koja može biti i negativna) i
• Lista pokazivača na procese koji čekaju na semafor (semaforski red).
typedef struct {
int value;
struct process *L;
} semaphore;
Vrednost semafora s može biti:
• val(s)>0 . Resurs je slobodan.
• val(s)=0 . Resurs je zauzet, ali je semaforski red prazan.
• val(s)<0 . Resurs je zauzet, u semaforskom redu postoje procesi koji čekaju na taj semafor.
Operacija wait :
Umanjuje vrednost semafora.
Ako je vrednost nakon toga negativna, stavlja proces u semaforski red i blokira proces.
Operacija signal :
Uvećava vrednost semafora.
Ako je vrednost posle toga negativna ili jednaka nuli uklanja jedan od procesa iz liste (izvršava wakeup
sistemski poziv i prebacuje proces u red čekanja za spremne procese).
wait (S) { signal (S) {
S.value--; S.value++;
if (S.value < 0) { if (S.value <= 0) {
/* Dodaj proces u semaforski red */ /* Ukloni proces P iz semaforskog reda */
sleep(); w akeup(P);
} }
} }
Problem zastoja i zakucavanja
Loša implementacija semafora može dovesti do situacije u kojoj jedan ili više procesa beskonačno dugo
čekaju na događaje koji se nikada neće dogoditi. Takvi procesi se nalaze u situaciji koja se zove zastoj.
Primer: Procesi P0 i P1 izvršavaju operacije nad semaforima S i Q (inicijalne vrednosti 1). P0: wait(S) -> S =
0, P1: wait(Q) -> Q = 0 Procesi P0 i P1 će se nakon toga naći u stanju zastoja: P0 čeka na Q, P1 može
uvećati Q naredbom signal(Q) . P1 čeka na S, P0 može uvećati S naredbom signal(S) . Nijedna signal
operacija se neće izvrštiti, jer oba procesa čekaju na semaforima.
Proces P0 Proces P1
... ...
wait(S) wait(Q)
wait(Q) wait(S)
... ...
signal(S) signal(Q)
signal(Q) signal(S)
Do zakucavanja (engl. starvation) dolazi ako procesi beskonačno dugo čekaju u semaforskom redu. Ova
situacija je moguća ako se procesi iz semaforskog reda uklanjaju po LIFO principu.
Binarni i brojački semafori Realizacija brojačkog semafora S (engl. counting semaphore) pomoću dva
binarna semafora S1 i S2 (promenljive tipa binary-semaphore ) i celobrojne promenljive C.
binary-semaphore S1, S2; wait(S) { signal(S) {
S1 = 1; S2 = 0; wait(S1); wait(S1);
int C; C--; C++;
// početna vrednost semafora S if (C < 0) { if (C <= 0) signal(S2);
signal(S1); else signal(S1);
wait(S2); }
}
signal(S1);
}

Klasični problemi sinhronizacije i semafori Primena semaforskih tehnika za rešavanje sledećih problema:

Proizvođač – potrošač
Bafer kapaciteta N.
Sinhronizacija: brojački semafori čije vrednosti pripadaju intervalu [0,N-1].
• item_available (potrošač ne može uzeti ništa iz bafera, ukoliko proizvočač to prethodno nije stavio u
bafer)
• space_available (ukoliko je bafer pun, proizvođač ne može ubaciti informaciju).
Mutex semafor buffer_ready štiti bafer kao nedeljivi resurs. Sprečava mogućnost zabune sa pokazivačima
koja nastaje ukoliko jedan proces čita informacije iz bafera, dok drugi proces nešto upisuje u bafer.
Promenjljive:
typedef struct {} item /* Jedan element bafera */
item buffer [N] // Bafer veličine N
int in = 0; // Prvo slobodno mesto
int out = 0; // Prvo zauzeto mesto
Inicijalizacija semafora: Proizvođač: Potrošač:
item_available = 0; do { do {
space_available = N; /* proizvođač proizvodi informaciju item next_consumed;
buffer_ready = 1; */ wait (item_available);
item next_produced; wait (buffer_ready);
wait (space_available); next_consumed = buffer[out];
wait (buffer_ready); out = (out+1)%N;
buffer[in] = next_produced; signal (buffer_ready);
in = (in+1)%N; signal (space_available);
signal (buffer_ready); /* potrošač konzumira informaciju
signal (item_available); */
} while (1); } while (1);

Problem čitalaca i pisaca


Konkurentni procesi mogu da dele objekte podataka. Zavisnosti od toga šta procesi žele da rade sa
podacima izdvajamo dve kategorije procesa:
• procese čitaoce (engl. readers) – žele samo da čitaju deljive objekte,
• procese pisce (engl. writers) – žele da menjaju sadržaj objekata.
Pravila:
• Dva procesa čitaoca mogu istovremeno da čitaju sadržaj deljenog objekta.
• Proces koji piše ne sme dozvoliti konkurentni pristup deljenom objektu. Dva pisca ne mogu
istovremeno da menjaju sadržaj zajedničkog objekta. Nema čitanja dok pisac ne obavi svoje
aktivnosti.
Napomena: za razliku od bafera koji ima N elemenata, ovde je reč o jednom objektu, čiji se sadržaj čita ili
modifikuje.
Problem čitalaca i pisaca može se rešiti pomoću jedne promenljive i dva mutex semafora:
• Semafor write služi za međusobno isklučenje procesa pisaca i čitaoca.
• Promenljiva read_count čuva informaciju o broju aktivnih čitalaca.
• Semafor counter_ready obezbeđuje međusobno isključenje pristupa kontroloj promenljivoj
read_count .
Pisac će nešto upisati pod uslovom da niko od čitaoca ili drugih pisaca nije aktivan.
Inicijalizacija: Čitalac:
write=1; wait(counter_ready);
counter_ready=1; readcount++;
readcount=0; if (readcount == 1) wait(write);
signal(counter_ready);
Pisac: /* proces čita sadržaj objekta */
wait(write); wait(counter_ready);
/* proces modifikuje sadržaj objekta */ readcount--;
signal(write); if (readcount == 0) signal(write);
signal(counter_ready);
Čitalac proverava koliko ima aktivnih čitalaca u sistemu. Čitalac pomoću semafora counter_ready kontroliše
pristup promenljivoj readcount . Ako je vrednost promenljive readcount nakon inkrementiranja jednaka 1: On
je jedini čitaoc i mora eventualno sačekati na pisca - wait(write) . U protivnom, on nije prvi i može slobodno
da čita. Proces završava čitanje i dekrementira vrednost promenljive readcount . Ako je čitaoc poslednji,
odnosno jedini: Izvršiće operaciju signal(write) i time osloboditi objekat za pisce.

Problem večere filozofa


Pet filozofa sede za okruglim stolom. Ispred svakog filozofa nalazi se po jedan tanjir sa špagetama. Između
svaka dva tanjira postavljena je po jedna viljuška. Filozofi su svoj život posvetili razmišljanju. Ako postanu
gladni, oni jedu pa ponovo razmišljaju. Da bi filozof mogao jesti, potrebne su mu dve viljuške. Filozof koji
postane gladan: Najpre pogleda da li može uzeti obe viljuške. Ako može, onda jede. Za to vreme njegovi
susedi ne mogu jesti. Ako ne može, filozof misli i čeka dok obe viljuške ne postanu slobodne. Kada završi sa
jelom, filozof spušta obe viljuške na sto i nastavlja da misli.
Rešenje: svaki filozof predstavlja proces, a svaka viljuška semafor. Potrebno je pet semafora kojima se štite
viljuške ( viljuska [i] ) čiju ćemo početnu vrednost postaviti na 1. Kod za svakog filozofa koji rešava problem
večere filozofa je sledeći:
philosopher (i) {
do {
wait(fork[i]); /* jedna viljuška*/
wait(fork[(i+1)%5]); /* druga viljuška*/
/* filozof jede */
signal(fork[i]);
signal(fork[(i+1)%5]);
/* filozof misli */
} while (1);
}
Problem: svi filozofi ogladne odjedanput i uzmu viljušku sa leve strane. Tada niko neće razrešiti drugu wait
operaciju (niko neće doći do druge viljuške). Može se sprečiti ako se dozvoli da filozof uzme viljuške samo
ako su obe slobodne. Asimetrična rešenja: neparni filozofi (prvi, treći i peti) uzimaju prvo svoje leve viljuške a
zatim desne, a parni prvo desne pa leve.

Kritični regioni

Kritični regioni štite od grubih, nehotičnih programerskih grešaka u sinhronizaciji.


Kritični region zahteva promenljivu v tipa T , koja je zajednička za veći broj procesa. Simbolički se
obeležava na sledeći način: v: shared T ; Promenljivoj v se može pristupati samo unutar regiona naredbi S ,
uslovno, sa sledećom sintaksom: region v when (B) S ;
Ova konstrukcija ima sledeće značenje: Dok se naredba S izvršava, nijedan drugi proces neće pristupati
promenljivoj v . Izraz B je logički izraz, koji upravlja radom u kritičnom regionu. Kada proces uđe u kritični
region, izraz B se ispituje i ukoliko je tačan, naredba S se izvršava. Ako izraz nije tačan, međusobno
isključenje se napušta i odlaže, dok B ne postane tačan.
Primer: rešenje problema ograničenog bafera pomoću kritičnih regiona.
Zajednički podaci su: Proizvođač: Potrošač:
struct buffer { region buffer when (count < n) { region buffer when (count > 0) {
int pool[n]; pool[in] = next_produced; next_consumned = pool[out];
int count, in, out; in = (in+1)%n; out = (out+1)%+n;
} count++; count--;
} }
Monitori

Monitori omogućavaju programeru da resurse posmatra kao objekte. Struktura monitora podseća na
instance klasa kod objektno orijentisanog programiranja. Svaki monitor se sastoji iz:
• Promenljivih koje opisuju deljeni resurs (objekat) čije vrednosti definišu stanje monitora. Lokalne
promenljive vidljive su samo unutar monitora,
• Skupa procedura i funkcija kojima se pristupa objektu, odnosno promenljivima monitora.
• Dela programa koji inicijalizuje objekat (izvršava se samo jednom, prilikom kreiranja objekta).
monitor ime_monitora {
/* deklaracije deljenih promenljivih */
P1 (...) { /* definicija procedure/funkcije P1 */ }
P2 (...) { /* definicija procedure/funkcije P2 */ }
Pn (...) { /* definicija procedure/funkcije Pn */ }
{ /* inicijalizacija monitora */
}
}
Primer - bafer koji se koristi prilikom rešavanju problema proizvođač-potrošač može se
predstaviti monitorom koji čine:
• Baferski prostor i pokazivači na prvo slobodno i prvo zauzeto mesto.
• Procedure za dodavanje elemenata u bafer i uzimanje elemenata iz bafera.
• Procedure za inicijalizaciju pokazivača na početak bafera.
Konstrukcija monitora dozvoljava da samo jedan proces bude aktivan u monitoru. Ako su potrebni dodatni
sinhronizacioni mehanizmi, programer mora sam da definiše promenljive kojima će dodatni problem razrešiti.
Ako je dodatni sinhronizacioni mehanizam neka uslovna konstrukcija, definišu se tzv. uslovne promenljive:
condition x, y ; Operacije koje mogu da se izvode nad ovim promenljivim su signal i wait . Operacija x.wait()
će blokirati proces koji je tu operaciju pozvao. Operacija x.signal() će ukinuti blokadu sa tačno jednog
blokiranog procesa. Ako nema blokiranih procesa, operacija signal ne radi ništa.
Struktura monitora sa uslovnim promenljivama.
Rešenje problema večere filozofa pomoću monitora. Struktura podataka
state predstavlja trenutno stanje filozofa: misli, gladan je ili jede. Kada misli
ne treba mu ništa, kad je gladan pokušava da jede, a ne misli. Filozof može
da jede samo ako njegovi susedi ne jedu. Uvode se i uslovne promenljive
state[i] koje će blokirati filozofa ukoliko je gladan, a ne može da dođe do
obe viljuške.

Definisaćemo monitor dp :
monitor dp { void test(int i) {
enum {thinking, hungry, eating} state[5]; if ((state[i] == hungry) &&
condition self[5]; (state[(i+4)%5] != eating) &&
(state[(i+1)%5] != eating)) {
void pickup(int i) { state[i] = eating;
state[i] = hungry; self[i].signal();
test[i]; }
if (state[i] != eating) self[i].wait(); }
}
void init() {
void release(int i) { for (int i = 0; i < 5; i++)
state[i] = thinking; state[i] = thinking;
test((i+4) % 5); }
test((i+1) % 5);
} }
Najpre se u monitoru svi filozofi dovedu u stanje think (svi misle, niko nije gladan, niko ne jede).
Svaki filozof mora obaviti sledeće operacije:
dp.pickup(i);
/* filozof jede */
dp.release(i);
Svaki filozof mora da pozove proceduru pickup iz monitora dp pre nego što počne da jede. U okviru
procedure filozof će ili doći do obe viljuške ili će biti blokiran operacijom self[i].wait . Ako dođe do obe
viljuške, filozof jede, a zatim ih spusti na sto. Posle toga, poziva se procedura release koja oslobađa obe
viljuške a po potrebi I blokirane filozofe.

Zastoj

Sistemski model i osobine zastoja

Resursi i instance
Sistem se sastoji od konačnog broja resusra koje koriste konkurentni procesi. Svaki resurs se može
sastojati od jedne ili više identičnih instanci. Primer: server ima četiri procesora. Procesor je resurs sa četiri
instance. Ako resurs ima više instanci a proces zahteva jednu, alokacija bilo koje slobodne instance će
zadovoljiti potrebe procesa. U normalnom režimu rada proces može da koristi resurs samo na sledeći način:
• Zahtev (engl. request). U ovoj fazi proces zahteva resurs. Ako zahtev za dodelom resursa ne može
da se ispuni trenutno, proces mora da čeka dok se resurs ne oslobodi.
• Korišćenje (engl. use). U ovoj fazi proces je dobio resurs i može ga slobodno koristiti.
• Oslobađanje (engl. release). Nakon korišćenja resursa proces mora da oslobodi resurs.
Drugim rečima: proces mora zahtevati resurs pre korišćenja i otpustiti resurs nakon
korišćenja.

Šta je zastoj?
U višeprocesnoj okolini više procesa se mogu međusobno takmičiti za konačan broj resursa. Proces P1 koji
zahteva neraspoloživ resurs R1 ulazi u stanje WAIT i postaje blokiran. Pitanje: da li blokirani proces P1 može
zauvek ostati u tom stanju? Ova pojava je moguća. Jedan proces može zahtevati više različitih resursa.
Scenario: Pre ulaska u stanje WAIT procesu P1 je dodeljen drugi resurs R2. Resurs R2 ostaje neraspoloživ
za druge procese. Resurs R1 je dodeljen na korišćenje drugom procesu P2. Proces P2 u toku vremena
prelazi u stanje čekanja na neraspoloživ resurs R2.
U ovoj sitaciji niko ne oslobađa svoje resurse a traži nove – procesi ostaju zaglavljeni. Takva situacija naziva
se zastoj (engl. deadlock).
Zastoj treba izbeći. Sistem doveden u stanje zastoja se mora oporaviti.

Potrebni uslovi za pojavu zastoja


Međusobno isključenje. Samo jedan proces u jednom trenutku može koristiti resurs ili jednu njegovu
instancu. Drugi proces koji zahteva taj resurs (instancu) mora da čeka dok se resurs ne oslobodi.
Nema pretpražnjenja („otimačine“ resursa). Resurs se ne može nasilno oduzeti i predati drugom procesu.
Proces koji ga koristi mora da završi posao i oslobodi resurs.
Uslov zadržavanja resursa i čekanja na drugi (engl. hold and wait). Proces drži jedan resurs. Proces
istovremeno čeka na dobijanje resursa koga koristi neki drugi proces.
Kružno čekanje (engl. circular wait).
Postoji skup procesa {P 0 , P 1 , ..., P 0 } koji čekaju na resurse u kružnom poretku.
Proces P 0 čeka na resurs koga drži proces P 1 . Proces P 1 čeka na resurs koga drži proces P 2 … Proces
Pn–1 čeka na resurs koga drži proces P n . Proces P n čeka na resurs koga drži proces P 0 .

Graf dodeljenih resursa


Graf dodeljenih resursa (engl. resource allocation graph se sastoji od skupa objekata I skupa strelica E.
Skup objekata se sastoji od:
• Skupa svih aktivnih procesa u sistemu: P = {P1, P2, ..., Pn}
• Skupa svih raspoloživih resursa: R = {R1, R2, ..., Rm}.
Skup strelica se sastoji od:
• Strelica zahteva (Pi -> Rj). Proces Pi zahteva jednu instancu resursa Rj i čeka na nju. Strelica se
dodaje u graf uvek kada proces traži resurs.
• Strelica alokacije (Rj -> Pi). Resurs Rj dodeljen procesu Pi. Strelica se dodaje u graf uvek kada se
resurs dodeli procesu.
Ako graf ne sadrži kružni tok, zastoja sigurno nema. Ako graf sadrži bar jedan kružni tok moguće su dve
situacije:
• ako svi resursi u kružnom toku sadrže tačno jednu instancu, zastoj se dogodio;
• ako resursi u kružnom toku sadrže više instanci može se dogoditi da zastoja nema.
Graf dodeljenih resursa (primer)
P = {P1, P2, P3}
R = {R1, R2, R3, R4}.
Resursi R1, R2, R3 i R4 redom imaju 1, 2, 1 i 3 instance.
E = {P1  R1, P2  R3, P3  R2,
R1  P2, R2  P1, R2  P2, R3  P3}
Da li je zastoj moguć?
Na grafu postoje dve kružne putanje koje mogu izazvati zastoj:
(1) P1  R1  P2  R3  P3  R2  P1
(2) P2  R3  P3  R2  P2
Procesi P1, P2 i P2 su u zastoju! Proces P2 čeka na R3 koga drži P3. Proces
P3 traži R2 koga drže P1 i P2. Proces P2 je blokiran sa procesom P3 oko
resursa R3. Proces P1 traži R1 koga drži P2. Da li bi do zastoja došlo u slučaju da: Resurs R2 ima tri
instance? Resurs R3 ima dve instance?
Kružni tok na grafu ne znači obavezno zastoj!
Uočavamo kružni tok: P1  R1  P3  R2  P1.
Oba resursa imaju više instanci tako da nema zastoja.
Mogući scenario:
Proces P4 može da završi svoj posao i da oslobodi jednu instancu resursa
R2. Oslobođena instance resursa R2 se može dodeliti procesu P3. Time se
prekida krug i eliminiše zastoj.

Metode upravljanja zastojem

Problem upravljanja zastojem može se rešavati na tri načina:


• Sprečavanjem i izbegavanjem zastoja (engl. deadlock prevention and avoidance). Metode koje
obezbeđuju da sistem nikada ne uđe u stanje zastoja,
• Detekcijom i oporavkom od zastoja (engl. deadlock detection and recovery). Metode koje
dozvoljavaju sistemu da uđe u stanje zastoja. To stanje naknadno detektuju i oporavljaju sistem.
• Ignorisanjem problema zastoja. Neki OS se pretvaraju da se te pojave ne dešavaju. U tom slučaju
se ne koriste prethodne dve metode.

Sprečavanje pojave zastoja


Zastoj se dešava ako su četiri uslova istovremeno ispunjena. Zastoj se sprečava metodeana koje
obezbeđuju da se najmanje jedan uslov ne ispuni!
Međusobno isključenje. Obavezan uslov za sve nedeljive resurse. Za deljive resurse nije obavezan. Jedan
metod sprečavanja je izbegavanje uslova međusobnog isključenja za sve deljive resurse.
Uslov zadržavanja resursa i čekanja na drugi. Može se izbeći na dva načina:
• Svaki proces mora da traži i alocira sve svoje resurse pre početka izvršavanja.
• Proces može da traži resurs samo pod uslovom da ne drži ni jedan drugi. To znači da proces može
koristiti samo jedan resurs u jednom trenutku Time se značajno smanjuje korišćenje U/I resursa.
Nema pretpražnjenja. Ovaj uslov se može poništiti korišćenjem sledećeg protokola:
Proces koji traži novi neraspoloživ resurs otpušta sve zauzete resurse i prelazi u WAIT. Proces može preći u
stanje READY tek kada povrati sve resurse koje je posedovao i resurse koje je tražio na korišćenje. U ovom
slučaju proces ne može preći u stanje WAIT sa zauzetim resursima. Drugi način: Nasilna „otimačina“ resursa
od drugih procesa koji su blokirani a drže te resurse.
Kružno čekanje. Može se izbeći na sledeći način: Svakom resursu se dodeli broj N iz skupa prirodnih
brojeva N=F(Ri) Procesi mogu zahtevati resurse u strogo rastućem redu. Proces koji je zahtevao resurs Ri
može zahtevati resurs Rj samo ako je F(Rj)>F(Ri). Poslednji proces u nizu ne može da se vrati unazad i traži
resurs koga drži prvi proces.
Izbegavanje zastoja

Izbegavanje zastoja je moguće ako OS unapred ima informacije o resurima koje će procesi zahtevati.
Sistem koji zna šta procesi žele može da napravi redosled opsluživanja zahteva tako da se izbegne zastoj.
Najprostija šema izbegavanja zastoja: Od svakog procesa se traži da deklariše najveći broj potrebnih
resursa svakog tipa. Na osnovu toga se može konstruisati algoritam koji će sprečiti stanje zastoja. Algoritam
dinamički ispituje trenutno stanje dodeljenih resursa:
• broj raspoloživih resursa,
• broj dodeljenih resursa i
• broj maksimalno traženih resursa u jednom trenutku vremena.
Tako se osigurava da sistem nikada ne uđe u stanje kružnog čekanja.

Bezbedno stanje
Kada proces traži neki resurs, sistem mora da proceni da li će dodela tog resursa ostaviti sistem u
bezbednom stanju (engl. safe state).
Stanje je bezbedno ako sistem može može alocirati resurse svakom procesu u nekom poretku i još uvek
izbeći zastoj. Bezbedno stanje je stanje bez zastoja.
Stanje koje nije bezbedno: ne mora biti zastoj; može težiti ka zastoju; u tom stanju procesi mogu lako
dovesti sistem u zastoj.
Formalno: sistem je u bezbednom stanju ako postoji bezbedna sekvenca svih procesa. Sekvenca <P1,
P2, ..., Pn> je bezbedna ako za svaki proces Pi u svakom ternutku važi:
• Resursi koje Pi može još tražiti mogu da se zadovolje iz trenutno raspoloživih resursa.
• To uključuje i resurse koji pripadaju procesima Pj pokrenutim pre procesa Pi (j<i).
• Ako resursi nisu trenutno raspoloživi Pi čeka da svi Pj završe poslove i oslobode resurse.
Primer: Tri procesa (P0, P1 i P2) i 12 resursa istog tipa. U početnom trenutku: P0 dobio 5 resursa, P1 dobio
2 resursa, P2 dobio 2 resursa. Maksimalne potrebe procesa P0, P1 i P2 su redom 10, 4 i 9 resursa. Da li je
sekvenca <P1, P0, P2> bezbedna?
Sekvenca <P1, P0, P2> je bezbedna! Imamo 3 slobodna resursa. P1 može da zadovolji svoje maksimalne
potrebe (uzima još 2 resursa). P1 završava posao i oslobađa 4 resursa. Ostaje 5 slobodnih resursa. P0
može da zadovolji svoje maksimalne potrebe (uzima još 5 resursa). P0 završava posao i oslobađa 10
resursa. Ostaje 10 slobodnih resursa. P2 može da zadovolji svoje maksimalne potrebe (uzima još 7 resursa).
P2 završava posao i oslobađa 9 resursa.
Pitanje: da je u početnom trenutku P0 dobio 5 resursa, P1 dobio 2 resursa, P2 dobio 3 resursa, da li bi
sekvenca <P1, P0, P2> bila bezbedna? Ne. Nakon što P1 završi aktivnosti ostaje 4 slobodna resursa. Ako
P0 zatraži svih 10 resursa (max potrebe) doći će do zastoja.

Graf dodele resursa za izbegavanje zastoja


Uvodi se strelica mogućih zahteva (engl. claim edge). Ova strelica znači da proces može zahtevati resurs
u nekom budućem trenutku. U grafu se predstavlja isprekidanom linijom. Zahtevanje i oslobađanje resursa:
U trenutku u kome proces zahteva resurs: Mogući zahtev postaje stvarni zahtev za resurs. Strelica mogućeg
zahteva menja se strelicom zahteva. Kada proces oslobodi resurs strelica dodele menja se strelicom
mogućih zahteva. Svi mogući zahtevi moraju biti poznati pre nego što proces otpočne izvršavanje. To će
omogučiti da se nacrta graf sa mogućim zahtevima procesa. Na bazi tog grafa se odlučuje da li će sistem
dozvoliti zahtev ili ne. Ukoliko se ispunjenjem zaheva formiraju kružni tokovi, sistem se može dovesti u
nebezbedno stanje pa se procesu ne ispunjava zahtev.
Graf dodele resursa za izbegavanje zastoja (primer)

Resurs R2 je slobodan, ali da postoje


mogući zahtevi od procesa P1 i P2. Da li je
zastoj moguć?
Ako bi proces P2 izdao zahtev za
korišćenjem R2, sistem to ne bi smeo da
dozvoli. U slučaju da sistem to dozvoli i
dodeli resurs R2 procesu P2 pojaviće se
kružni tok. Ako i P1 zatraži R2, dolazi do
zastoja.
Bankarski algoritam
U čemu je problem sa grafom koji sadrži strelice mogućih zahteva? Nije podesan za resurse koji imaju više
instanci! U tim situacijama za izbegavanje zastoja koristi se bankarski algoritam (engl. Banker’s algorithm).
Algoritam se može primeniti ukoliko su ispunjeni sledeći uslovi:
• Resursi imaju uglavnom više instanci.
• Svaki proces unapred deklariše najveći broj instanci svakog resursa koji želi da koristi.
• Kada proces zahteva resurse sistem procenjuje da li će posle toga ostati u stabilnom stanju. Ako
ostaje u stabilnom stanju proces će dobiti resurs. U suprotnom proces mora da sačeka da drugi
procesi oslobode neke resurse.
• Proces koji dobije resurse mora da ih vrati u nekom konačnom vremenu.
Broj procesa: n. Broj resursa: m.
Strukture podataka za bankarski algoritam:
• Vektor rapoloživosti: available[j], j[0,m]. Ako je available[j]=k, tada je k instanci resursa Rj
rasploživo,
• Matrica makimalnih zahteva: max[n,m]. Ako je max[i,j] = k, tada proces Pi može tražiti ukupno k
instanci resursa Rj.
• Matrica alokacije: allocation[n,m]. Ako je allocation[i,j] = k, tada je proces Pi trenutno dobio k
instanci resursa Rj. Vrsta matrice alokacije je vektor allocation[i] (svi resursi koje je proces Pi dobio).
• Matrica potreba: need[n,m]. Ako je need[i,j] = k, tada proces Pi može tražiti još k instanci resursa Rj.
Vrsta matrice potreba je vektor need[i] (svi resursi koje proces Pi može tražiti).
Važi jednakost: need[i,j] = max[i,j] – allocation[i,j].
Uvodimo definiciju: za dva vektora X i Y od n elemenata važi X≤Y ako je X[i]≤Y[i] za svako i[1,n].
Neka su work i finish vektori dužine m i n, respektivno.
Sledeći algoritam određuje da li se sistem nalazi u bezbednom stanju.
1. Inicijalizacija:
work = available (vektor raspoloživih resursa)
finish[i] = 0 za i[1,n] (opisuje završetak procesa i)
2. Pronalaženje procesa Pi koji može da zadovolji svoje potrebe, odnosno procesa za koji važi:
(2.a) finish[i] = 0
(2.b) need[i] ≤ work
Ako nema takvih procesa idi na korak 4.
3. Procesu se dodeljuju svi potrebni resursi nakon čega on završava aktivnost i vraća ih u sistem.
work = work + allocation[i] (oslobađanje resursa)
finish[i] = 1
Ići na korak 2.
4. Ako je finish[i] = 1 za sve i, svi procesi mogu da završe posao pa je sistem u stabilnom stanju.
5. Algoritam zahteva m∙n 2 operacija kako bi proverio da li je sistem u stabilnom stanju.

Bankarski algoritam (primer provere bezbednog stanja)


U sistemu se nalaze tri procesa (P0, P1 i P2) i resurs A sa 12 instanci.
Stanje sistema je dato sledećom tabelom. Resurs A ima 3 slobodne
instance. Da li je sistem u bezbednom stanju?

Uvek se polazi od procesa sa manjim zahtevima. Kasnije se rešavaju problemi najzahtevnijih procesa!
Proces P1 najpre uzima još dve instance resursa, a zatim ih vraća.
Nakon toga proces P0 uzima još pet instanci resursa, a zatim ih vraća.
Na kraju, proces P2 uzima još sedam instanci resursa, koje po završetku vraća. Sekvenca <P1, P0, P2>
doveće do zadovoljenja potreba svih procesa. Dakle, sistem je u bezbednom stanju.
Kada proces zahteva resurs, primenjuje se algoritam za obradu zahteva i dodelu resursa. Sa request i
označićemo vektor trenutnih zahteva procesa Pi: Ako je request i [j]=k tada proces Pi traži k instanci resursa
Rj. Pre ulaska u algoritam za izbegavanje zastoja operativni sistem proverava:
• Da li proces traži više od onoga što je specificirao (request i ≥ need i )? Ako traži, prijavljuje se
greška i odbija se zahtev.
• Da li su resursi raspoloživi (request i ≤ available)? Ako nisu, OS uvodi proces u stanje čekanja.
Ako je request i < need i i request i ≤ available obavlja se kvazi-dodela resursa:
• available = available – request i (broj rasploživih resursa)
• allocation i = allocation i + request i (broj dodeljenih resursa)
• need i = need i – request i (potrebe procesa)
Nakon zamišljene dodele resursa ispituje se da li sistem ostaje u bezbednom stanju. Ako ostaje, sistem će
procesu Pi dodeliti resurse (alokacija postaje stvarna). U protivnom proces Pi mora da čeka.
Bankarski algoritam (primer)
U sistemu se nalazi pet procesa (P0 do P4) i četiri resursa (A, B, C i
D). U trenutku t 0 je available=(1,5,2,0). Stanje sistema u trenutku t 0
opisano je sledećom tabelom: Da li je sistem u bezbednom stanju?
Da li će sistem da odobri zahtev request 1 = (0, 4, 2, 0)?
Sistem je u bezbednom stanju, jer sledeća sekvenca procesa
zadovoljava uslove stabilnosti:
P0 uzima (0,0,0,0) a zatim vraća (0,0,1,2)  available=(1,5,3,2).
P3 uzima (0,0,2,0) a zatim vraća (0,6,5,2)  available=(1,11,6,4).
P2 uzima (1,0,0,2) a zatim vraća (2,3,5,6)  available=(2,14,11,8).
P1 uzima (0,7,5,0) a zatim vraća (1,7,5,0)  available=(3,14,11,8).
P4 uzima (0,6,4,2) a zatim vraća (0,6,5,6)  available=(3,14,12,12).
Najpre se proverava da li je request 1 ≤ available. Pošto je (0,4,2,0) ≤ (1,5,2,0) uslov je ispunjen. Obavlja se
kvazi-dodela resursa na osnovu zahteva. Procesu P1 dodeljujemo (0,4,2,0). Nakon dodele je
available=(1,1,0,0). Sistem nakon kvazi-dodele ostaje u bezbednom stanju, jer sledeća sekvenca procesa
zadovoljava uslove stabilnosti:
P0 uzima (0,0,0,0) a zatim vraća (0,0,1,2)  available=(1,1,1,2).
P2 uzima (1,0,0,2) a zatim vraća (2,3,5,6)  available=(2,4,6,6).
P3 uzima (0,0,2,0) a zatim vraća (0,6,5,2)  available=(2,10,9,8).
P1 uzima (0,3,3,0) a zatim vraća (1,7,5,0)  available=(3,14,11,8).
P4 uzima (0,6,4,2) a zatim vraća (0,6,5,6)  available=(3,14,12,12).
Sistem odobrava zahtev za dodelom resursa.

Detekcija i oporavak od zastoja

Ako sistem ne primenjuje algoritme za sprečavanje ili izbegavanje zastoja, tada su zastoji sasvim mogući,
čak i vrlo verovatni. U tom slučaju sistem mora da obezbedi dve stvari:
• Algoritam za detekciju zastoja (koji treba da ispita da li se zastoj dogodio).
• Algoritam za oporavak iz stanja zastoja.
U slučaju da svi resursi imaju samo jednu instancu za detekciju zastoja se koristi graf čekanja na resurse
(engl. wait-for graph). Konstruiše se od grafa dodeljenih resursa. Čvorovi grafa su samo procesi (nema
resursa). Strelice se crtaju samo između procesa koji čekaju jedan drugog za resurse. Postojanje zastoja
utvrđuje se ispitivanjem postojanja kružnih tokova. Ako kružni tok postoji to je zastoj. Algoritam se periodično
poziva da ispita postojanje kružnih tokova. Za ispitivanje je potrebno n 2 operacija, pri čemu je n broj strelica
u grafu čekanja.
Graf čekanja na resurse

Ukoliko resursi imaju više instanci za detekciju zastoja se koristi algoritam sličan bankarskom.
Strukture podataka:
• Vektor rapoloživosti: available[j], j[0,m]. Ako je available[j]=k, tada je k instanci resursa Rj
rasploživo,
• Matrica alokacije: allocation[n,m]. Ako je allocation[i,j] = k, tada je proces Pi trenutno dobio k instanci
resursa Rj.
• Matrica trenutnih zahteva: request[n,m]. Ako je request[i,j] = k, tada proces Pi trenutno traži k
instanci resursa Rj.
Neka su work i finish vektori dužine m i n, respektivno.
Sledeći algoritam određuje da li se sistem nalazi u stanju zastoja.
1. Inicijalizacija:
work = available
finish[i] = {0, ako je allocation i  0; inače je 1} za i[1,n]
2. Pronalaženje procesa Pi koji može da zadovolji svoje potrebe, odnosno procesa za koji važi:
(2.a) finish[i] = 0
(2.b) request i ≤ work
Ako nema takvih procesa idi na korak 4.
3. U ovom koraku se resursi procesa vraćaju u sistem.
work = work + allocation i (oslobađanje resursa)
finish[i] = 1
Ići na korak 2.
4. Ako je finish[i] = 0 za sve i[1,n], sistem je u zastoju (preciznije proces Pi je u zastoju).
Algoritam zahteva m∙n 2 operacija kako bi proverio da li je sistem u stanju zastoja.
Detekcija zastoja u slučaju da resursi imaju više instanci (primer)

Sistem sa pet procesa (P0 do P4) i tri resursa: A (7 instanci), B (2 instance), C (6 instanci). U trenutku t 0
nema raspoloživih resursa, odnosno available = (0,0,0). Stanje sistema u trenutku t 0 opisano je sledećom
tabelom. Kada se primeni algoritam za detekciju:
Dokazuje se da postoji sekvenca <P0, P2, P3, P1, P4> koja dovodi do rezultata finish[i]=1 za sve procese.
To znači da sistem neće biti doveden u stanje zastoja.
Interesantno: Sistem u trenutku t 0 nema raspoloživih resursa. Počevši od procesa koji najmanje traže (P0 i
P2) može se obaviti dodela resursa bez dovođenja do zastoja.
Ukoliko uvedemo malu izmenu: proces P2 traži jednu instancu resursa C. Proces P0 ima najmanje prohteve,
završava, vraća resurse  available=(0,1,0). Nakon toga nemamo proces koji može da zadovolji svoje
potrebe. Dakle, sistem je u stanju zastoja - procesi P1, P2, P3, i P4 su zaglavljeni.

Oporavak od zastoja
Posle detekcije zastoja potrebno je izvršiti oporavak. Dve metode za oporavak od zastoja koje se najčešće
koriste su:
• Prekid izvršenja procesa u zastoju. Osobađaju se svi resursi koje je zauzimao proces koji se
prekida. Postoje dve tehnike: Prekid izvršenja svih zaglavljenih procesa. Prekid izvršenja procesa
do razbijanja kružnog toka.
• Nasilno oduzimanje resursa od procesa koji su u zastoju. Tehnika koja ne prekida izvršenje
procesa. Određenom procesu (ili procesima) u zastoju se oduzimaju resursi. Odabir žrtve sa
najmanje gubitaka!

You might also like