2 1.1.Šta je operativni sistem. Materijal pripremili Samir Ribić, Nazif Husović, Enisa Brka

Size: px
Start display at page:

Download "2 1.1.Šta je operativni sistem. Materijal pripremili Samir Ribić, Nazif Husović, Enisa Brka"

Transcription

1

2 2 1.1.Šta je operativni sistem Materijal pripremili Samir Ribić, Nazif Husović, Enisa Brka Sadržaj 1.Uvod u operativne sisteme Upravljanje procesima Raspoređivanje procesora Sinhronizacija procesa Upravljanje resursima i potpuni zastoji Upravljanje memorijom, kontinualna alokacija Diskontinualna alokacija memorije i virtualna memorija Ulazno-izlazni sistem računara Uređaji razumljivi korisniku Sekundarna memorija Datotečni sistemi Sigurnost računarskih sistema Arhitektura Microsoft-ovih operativnih sistema Arhitektura Unix i Linux Operativni sistemi za mobilne uređaje Izvorni kod malog jezgra

3 1.Uvod u operativne sisteme 1.1.Šta je operativni sistem Šta je operativni sistem Operativni sistem je program koji služi kao interfejs između korisnika računara i računarskog hardvera. Dvije osnovne uloge operativnog sistema su: Pružiti korisniku okruženje koje će mu omogućiti efikasno izvršenje programa Stvoriti pogodno korisničko okruženje Pogodno korisničko okruženje se postiže time što se operativni sistem može gledati kao proširena mašina. Arhitektura (set instrukcija, organizacije memorije, I/O, i struktura sabirnice) većine kompjutera na nivou mašinskog jezika je primitivna i neugodna da se programira, pogotovo za ulaz i izlaz. Na primjer, da se flopi disk programira koristeći samo naredbe njegovog kontrolera, mora se brinuti o pakovanju parametara, paljenju motora, kalibraciji kontrolera, itd. Ne ulazeći u stvarne detalje, trebalo bi biti jasno da prosječan programer vjerojatno ne želi da se previše detaljnono uključi u programiranje diskova. Umjesto toga, ono što programer želi je jednostavna apstrakcija na visokom nivou kojom će se baviti. U slučaju diskova, tipična apstrakcija bi bila disk koji sadrži kolekciju podataka pod nazivom datoteka. Svaka datoteka može se otvoriti za čitanje ili pisanje, a zatim čitati ili pisati, i na kraju zatvoriti. Detalji kao što su da li se ili ne snimanje obavlja putem modificirane frekventne modulacije, i kakvo je trenutno stanje motora, ne bi trebali da se pojavljuje u apstrakciji koja je predstavljena korisniku. U tom smislu, funkcija operativnog sistema je predstaviti korisniku ekvivalentnu produženu mašinu ili virtualnu mašinu koju je lakše programirati od osnovnog hardvera. Okruženje za efikasno izvršenje programa se postiže time što operativni sistem ima funkciju upravljača resursima. Moderni kompjuter sastoji se od procesora, memorije, tajmera, diskova, miševa, mrežnih interfejsa, printera, kao i širokog spektar drugih uređaja. Zamislite što bi se dogodilo da tri programa koji rade na nekom računaru pokušaju da ispišu svoj izlaz istovremeno na istom štampaču. Prvih nekoliko redova ispisa može biti iz programa 1, narednih nekoliko iz programa 2, onda neki od programa 3, i tako dalje. Rezultat bi bio haos. Operativni sistem može izbjeći problem čuvanjem svih izlaza predodređenih za štampač na disku. Kada se završi jedan program, operativni sistem onda može kopirati svoj izlaz iz datoteke diska gdje je pohranjen na štampač, dok u isto vrijeme drugi program može nastaviti generiranje više izlaza, ne obraćajući pažnju na činjenicu da izlaz nije ustvari štampač. Kada računar (ili mreža) ima više korisnika, potreba za upravljanjem i zaštitom memorije, I/O uređaja, i drugih resursa je još veća, jer korisnici bi u suprotnom ometali jedni druge. Osim toga, korisnici često moraju da dijele ne samo hardver, nego i podatke (datoteke, baze podataka, itd). Ukratko, ovaj pogled na operativni sistem ima za primarni zadatak da prati ko koristi koje resurse, da odobri zahtjeve resursa, mjeri korištenje, i posreduje između suprotstavljenih zahtjeva iz različitih programa i korisnika. 1.2.Računarski sistem Moderan kompjuterski sistem se sastoji od jednog ili više procesora, glavne memorije, diskova, štampača, tastatura, ekrana, mrežnih interfejsa, i drugih ulazno/izlaznih uređaja. Sve u svemu, kompleksan sistem. Pisanje programa koji prate sve ove komponente i koriste ih ispravno, a kamoli optimalno, je izuzetno težak posao. Iz tog razloga, kompjuteri su opremljeni

4 4 1.2.Računarski sistem sa slojem softvera pod nazivom operativni sistem, čiji je posao da upravlja svim ovim uređajima i pruža korisnicima programa što jednostavnije sučelje za hardver. Igra Bankovni šalter Web browser Kompajler Editor Interpreter Operativni sistem Aplikativni programi Sistemski programi Mašinski jezik Mikroarhitektura Hardver Fizički uređaj Slika 1 Položaj operativnog sistema u računarskom sistemu Pozicija operativnog sistema je prikazana na slici Slika 1. Na dnu je hardver, koji, u mnogim slučajevima, sam se sastoji od dva ili više nivoa (ili slojeva). Najniži nivo sadrži fizičke uređaje, koji se sastoji od čipova, žica, napajanja, katodnih cijevi i slično. Sljedeći dolazi nivo mikro-arhitekture, u kojem fizički uređaji su grupisani zajedno da formiraju funkcionalne cjeline. Obično ovaj nivo sadrži neke registre interne za CPU (Central Processing Unit) i put podataka do aritmetičko logičke jedinice. U svakom ciklusu, jedan ili dva operanda se dohvate iz registara i kombinuju u aritmetičko logičkoj jedinici (na primjer, sabiranjem ili Boolean I). Rezultat je pohranjen u jednom ili više registara. Na nekim računarima to kontroliše softver nazvan mikro-program. Na drugim računarima, to je pod direktnom kontrolom hardverskog sklopa. Svrha mikro-arhitekture je da se izvrši neki skup instrukcija. Neke od tih instrukcija se mogu obaviti u jednom ciklusu dohvatanja i prepoznavanja, a neke zahtijevaju više njih. Ove instrukcije mogu koristiti registre ili druge hardverske objekte. Zajedno, hardver i instrukcije vidljive u asemblerskom jeziku formiraju ISA (Instruction Set Architecture) nivo. Ovaj nivo se često naziva mašinski jezik. No programiranje na ovom nivou je dosta kompleksno, jer je previše vezano za osobine hardvera. Da bi se sakrila ta kompleksnost, postoje operativni sistemi. Sastoji se od sloja softvera koji (djelomično) skriva hardvera i daje programeru zgodniji skup instrukcija za rad. Na primjer, čitati bloka datoteka je konceptualno jednostavnije nego da se brinu o detaljima kretanja glave diska, čekanja da se smiri, i tako dalje. Na vrhu operativnog sistema je ostatak sistemskog softvera. Ovdje se nalazi školjka, prozorski sistem, kompajleri, uređivači, i slični programi koji su aplikacijski nezavisni. Konačno, iznad sistemskog programa dolaze programi aplikacija. Ovi programi su kupljeni ili pisani od strane korisnika da riješe svoje posebne probleme, kao što su obrada teksta, proračunske tablice, inženjering proračuna, ili čuvanje informacija u bazi podataka. Šta obuhvata operativni sistem u ovim slojevima? Na ovo pitanje postoje tri stanovišta. Najuže stanovište je da se operativnim sistemom smatra samo onaj dio koji se nalazi u jezgru i obavlja spomenute funkcije. On je zaštićen od korisničkog ometanja pomoću hardvera (zanemarujući za trenutak neke starije ili jeftine mikroprocesore koji nemaju zaštitu hardvera). Objašnjenje za ovo stanovište je da se školjka ili kompajler mogu mijenjati, ali raspoređivač procesora ne. No, ovo stanovište je previše akademsko. Stotine miliona korisnika koji uspješno koriste Windows i prepoznaju ga po njegovom korisničkom interfejsu, bi bili prilično

5 1.3.Istorija operativnih sistema 5 iznenađeni da čuju da to zapravo nije operativni sistem, nego da je on sadržan u jednoj datoteci NTOSKRNL.EXE, koja sama ne može ništa uraditi. Po tradicionalnom shvatanju, pored jezgra operativnog sistema, on sadrži i potreban minimum za rad, dakle kernel (jezgro) koje obavlja osnovne funkcije OS i uvijek se nalazi u memoriji, skup uslužnih sistemskih programa i školjku komandni ili grafički korisnički interfejs (GUI) prema funkcijama OS. Moderno shvatanje je nastalo pod komercijalnim uticajem. U operativni sistem ulazi ono što je njegov proizvođač sastavio u jedinstvenu cjelinu. To uključuje i odgovarajući skup aplikativnih programa bez kojih bi sistem također radio. Na primjer, uz Windows se isporučuju pregledač Internet Explorer, i uređivač teksta WordPad, i oni se za većinu korisnika smatraju njegovim dijelom. Poznat je slučaj suđenja protiv Microsoft-a iz godine kada je ova kompanija optužena za monopol na operativne sisteme zbog isporučivanja Internet Explorer-a (ranije samostalnog proizvoda) zajedno s operativnim sistemom, pa je u odbrani demonstrirano da bi njegovo isključivanje umanjilo performance i stabilnost sistema. No ovo stanovište je previše široko sa stanovišta proučavanja teorije operativnih sistema. 1.3.Istorija operativnih sistema Operativni sistemi su se razvijali kroz godine. Operativni sistemi su istorijski bili usko vezani za arhitekturu računala na kojima rade, ali se historija više puta ponavljala. Prva generacija ( , releji, vakuumske cijevi i ploče s programom): Nakon neuspješnog napora Babbage da napravi mehanički digitalni računar, ostvaren je mali napredak u izgradnji digitalnih kompjutera do Drugog svjetskog rata. Oko sredine-1940, Howard Aiken na Harvardu, John von Neumann na Institutu za Advanced Study u Princetonu, J. Presper Eckert i William Mauchley na University of Pennsylvania, i Konrad Zuse u Njemačkoj, između ostalog, su uspjeli izgraditi mašine za izračunavanje. Prvo su se koristili mehanički releji, ali su bili vrlo spori, s vremenom ciklusa mjerenim u sekundama. Releji su kasnije zamijenjen vakuumskim cijevima. Ove mašine su bile ogromne, zauzimale su cijelu sobu sa desetinama hiljada vakuumskih cijevi, ali su i dalje milionima puta sporije nego što je najjeftiniji personalni kompjuter danas dostupan. U tim ranim danima, jedna grupa ljudi dizajnira, gradi, programira, upravlja i održava svaku mašinu. Svo programiranje je učinjeno u apsolutnom mašinskom jeziku, često ožičeno na pločama za kontrolu osnovnih funkcija uređaja. Programski jezici su nepoznati (čak i asemblerski jezik je nepoznat). Operativni sistemi nisu postojali. Uobičajena je operacija bila za programera da se prijavi blok vremena na tabli na zidu, a zatim dođe do mašinske sale, ubaci svoje ploče u kompjuter, i provede narednih nekoliko sati u nadi da neće nijedna od vakuumskih cijevi ispasti u toku svoga izvršenja. Gotovo svi problemi su bili numerički proračuni, kao što su pravljenje tablice sinusa, kosinusa i logaritama. Do ranih ih godina, rutina je donekle popravila uvođenjem bušene kartice. Sada je moguće pisati programe na karticama i čitati ih umjesto ploča ali, postupak je bio isti. Druga generacija ( ) tranzistori, Batch Sistemi Uvođenje tranzistora u upotrebu sredinom 1950-ih promijenilo je sliku radikalno. Računari su postali dovoljno pouzdani da bi se mogli proizvoditi i prodavati uz očekivanje da će nastaviti raditi dovoljno dugo da se uradi neki koristan rad. Po prvi put, bilo je jasno razdvajanje između dizajnera, graditelja, operatera, programera, i osoblja za održavanje. Te mašine, sada zvane mainframe, bile su zaključane u posebno klimatizirane sobe, s osobljem profesionalnih operatera da ih vode. Samo velike korporacije ili velike vladine agencije ili univerziteti koji su mogli priuštiti višemilionsku cijenu. Da bi se pokrenuo posao

6 6 1.3.Istorija operativnih sistema (npr., program ili skup programa), programer bi prvo napisao program na papiru (u FORTRANu ili asembleru), a zatim ukucao na kartice. On bi onda donio skup kartica do ulazne sobe i predao ga u jednom od operatera i čekao dok izlaz ne postane spreman. Kada računar završi posao koji trenutno radi, operator će otići do štampača i otkinuti izlaz i iznijeti ga. S obzirom na visoke troškove opreme, ne čudi da su ljudi brzo tražili načine za smanjenje izgubljenog vremena. Rješenje u to vrijeme su bili grupni ili batch sistemi. Ideja je bila da se prikupi skup pun radnih mjesta u ulaznu sobu i onda ih pročita na magnetnoj traci pomoću malog i relativno jeftinog računara, koja se zatim odnosi na veliki računar namijenjen obradi. Nakon otprilike sat vremena prikupljanja skupa poslova s radnih mjesta, traka se premota i dovede u sobu za mašinu, gdje se montira na čitač trake. Operator zatim učita poseban program (predak današnjeg operativnog sistema), koji poziva na prvi posao sa trake i izvodi. Izlaz je napisan na drugu traku, umjesto da se štampa. Nakon svakog posla, operativni sistem automatski pročita sljedeći zadatak iz trake i pokrene ga. Kada je završena cijela grupa, operator je uklonio ulazne i izlazne trake, zamijenio ulaznu traku sa sljedećom grupom, i doveo izlaznu traku na računar za štampanje. Treća generacija ( ) IC i multiprogramiranje. Razvoj i održavanje dvije potpuno različite linije proizvoda (za unos podataka i obradu) je skupo za proizvođača. Osim toga, mnogi novi kupci su u početku trebali malu mašinu, ali su je kasnije prevazišli i poželjeli veću mašinu na kojoj će pokrenuti sve svoje stare programe, ali brže. IBM pokušava riješiti oba problema jednim potezom a to je uvođenjem System/360. To je prvi veliki računar koji koristi (male) integrirane krugove (IC), na taj način pružajući veliku prednost u odnosu cijena/performanse u usporedbi s mašinama druge generacije, koje su izgrađene od pojedinačnih tranzistora. To je bio neposredan uspjeh, a ideja porodice kompatibilnih kompjutera je potom usvojena od strane svih drugih velikih proizvođača. Potomci ovih mašina su još uvijek u upotrebi na računarskim centrima danas. Danas se često koriste za upravljanje ogromnih baza podataka (npr., za sistem avionske rezervacije) ili kao serveri za World Wide Web stranice koje moraju obraditi hiljade zahtjeva u sekundi. Uprkos ogromnim veličinama i problemima zbog toga, OS/360 i slični operativni sistemi proizvedeni od strane ostalih proizvođača kompjutera zapravo zadovoljavaju potrebe većine svojih kupaca i to prilično dobro. Oni također populariziraju nekoliko ključnih tehnika kojih nema u drugoj generaciju operativnih sistema. Vjerojatno najvažnija je multiprogramiranje. Dok je jedan posao na čekanju da se završi ulaz i izlaz, drugi posao može koristiti CPU. Ako ima dovoljno poslova, CPU može držati zauzetim gotovo 100 posto vremena. Imati više poslova u memoriji, odjednom zahtijeva poseban hardver za zaštitu svakog posla nestašluka od onog drugog, sistem je bio opremljeni sa ovim hardverom. Nakon toga je nastala varijanta multiprogramiranja, dijeljeno vrijeme u kojem svaki korisnik ima priključen terminal. U ovakvom sistemu sistema, ako od 20 korisnka koji su prijavljeni i 17 od njih razmišljaju ili govore ili piju kafu, CPU može biti dodijeljen u red za tri posla koje žele uslugu. Prvi manje-više uspješni operativni sistemi u dijeljenom vremenu su CTSS, MULTICS. Nakon pojave mini računara počevši od DEC PDP- 1 sve do PDP-11, cijene računara padaju i tada nastaje UNIX operativni sistem, pojednostavljen MULTICS sistem, koji je postao popularan u akademskom svijetu, vladinim agencijama i mnogim firmama. Iz ovog perioda treba pomenuti i operativni sistem VAX/VMS. Četvrta generacija (1980-danas) Personalni računar Sa razvojem LSI (Large Scale Integration) kola, čipova koji sadrži hiljade tranzistora na kvadratni centimetar silicija, došlo se do personalnih računara. Što se tiče arhitekture, personalni kompjuteri (u početku pod nazivom mikroračunari) nisu svi bili toliko različiti od mini-računara PDP-11 klase, ali u smislu

7 1.3.Istorija operativnih sistema 7 cijene su svakako bili drugačiji. Gdje je mini-računar omogućio odjelu u kompaniji ili univerzitetu vlastiti kompjuter, mikroprocesorski čip je omogućio za pojedinca njegov ili njen lični računar. Lični računari su često bili opremljeni programskim jezikom BASIC u ROM-u. Godine 1974, kada je Intel izašao sa 8080, prvim 8-bitnim CPU opće namjene, poželio je operativni sistem za 8080, u cilju testiranja. Intel je pitao jednog od svojih savjetnika, Gary Kildall, da ga napiše. Kildall zatim je napisao disk bazirani operativni sistem nazvan CP/M i osnovao Digital Research, za dalji razvoj i prodaju CP/M što mu je omogućilo da u potpunosti dominira svijetom mikroračunara oko 5 godina. U ranim 1980-im, IBM osmišlja IBM PC i nakon neuspješnog kontakta s Digital Research, obratio se firmi Microsoft, čiji je vlasnik Bill Gates ponudio paket s operativnim sistemom i BASIC interpreterom. Gates je otkupio ranu verziju DOS-a i angažovao njegovog autora Tim Paterson-a, da ga doradi. Revidirani sistem je preimenovan u MS-DOS (Microsoft Disk Operating System) i brzo počeo dominirati IBM PC tržištem. CP/M, MS-DOS, i drugi operativni sistemi ranih mikroračunara su svi bazirani na korisnike upisivanjem u komandi sa tastature. To se na kraju promijenilo zbog istraživanja koje je vršio Doug Engelbart na Stanford Research Institute u Engelbart izmislio GUI (Graphical User Interface), i uveo prozore, ikone, menije i miš. Ove ideje su usvojene od strane istraživača na Xerox PARCu. Jednog dana, Steve Jobs, koji je koji je kreirao Apple I računalo u svojoj garaži, posjetio PARC, vidio GUI, i odmah shvatio njegovu potencijalnu vrijednost. Nakon prvog projekta Lisa, drugi računar s GUI Apple Macintosh, bio je veliki uspjeh, ne samo zato što je mnogo jeftiniji nego Lisa, već i zato što je user friendly, što znači da je namijenjen za korisnika koji ne samo da nije znao ništa o kompjuterima, nego nije imao apsolutno nikakvu namjeru učenja. Kada je Microsoft odlučio izgraditi nasljednika MS-DOS-a, bio je pod jakim utjecajem uspjeha Macintosh, pa proizvodi sistem GUI zvani Windows, koji je prvobitno bio građen na vrhu MS-DOS, a počevši od 1995 nastaju samostalne verzije Windows, Windows 95, i Windows NT. GUI je postao popularan i na Unix sistemima, koji su također postali dostupni na personalnim računarima, pod nazivom X Windows sistemi (proizvod sa MITa), a popularna je postala besplatna podvarijanta Unix jezgra, Linux. Zanimljiv razvoj, koji se počeo odvijati sredinom 1980-ih je rast mreža osobnih računala, mrežnih operativnih sistema, i distribuiranih operativnih sistema. U mrežnom operativnom sistemu, korisnici su svjesni postojanja više računara i mogu se prijaviti na udaljenim mašinama i kopirati datoteke iz jedne mašine na drugu. Povezivanjem ovih mreža nastala je globalna računarska mreža Internet. Peta generacija sada, mobilni računari (mobile computers). O petoj generaciji se češće govorilo u budućnosti, kao o računarima vještačke inteligencije. Međutim gotovo neprimjetno su džepni računari, počevši od Psion Palm, programabilnih kalkulatora, bežičnih mreža, mobitela s dodatnim rokovnicima i ponekom video igrom, do tableta po prodavanosti prevazišli personalne računare. Sve više su korištene web aplikacije, globalno pozicioniranje (GPS), ekrani osjetljivi na dodir, beskontaktne kartice, džepni Internet, socijalne mreže. Nastaju operativni sistemi ios, Windows CE, Android, Simbian, BlackBerry itd. Treba reći da se historija ponavlja. Početni računari nove generacije su slabijih mogućnosti od najboljih računara prethodne generacije, pa se koncepti koji su postojali ranije ne mogu odmah primijeniti. Na primjer, prvi mikroračunar, Altair 8080 se programirao kontrolnom pločom (1975), baš kao i prvi mainframe računari (1945). Zatim nastaju jednoprogramski računari ( ), koji su u mainframe svijetu postojali već od Sistemi u dijeljenom vremenu su se na mainframe računarima pojavili oko 1965, na mikroračunarima oko 1985, a na džepnim računarima oko Više-procesorski sistemi su na mainframe nastali oko 1975, godine, na desktop računare su došli oko 2000, a na džepne oko godine. Slično tome,

8 8 1.4.Vrste operativnih sistema neki algoritmi korišteni u operativnim sistemima koji su u svoje vrijeme bili napušteni zbog lošeg iskorištenja hardvera se ponovo javljaju kada iskorištenost hardvera postaje manje bitna od drugih zahtijeva poput brzine. 1.4.Vrste operativnih sistema Operativne sisteme moguće je klasifikovati na više načina. Mogu se praviti podjele na osnovu broja korisnika i/ili procesa, prema načinu obrade poslova, prema distribuciji procesorske snage i ostalih resursa ili prema namjeni i funkcionalnim osobinama. 1.5.Podjela po broju korisnika i procesa Po broju korisnika koji istovremeno koriste računar, operativni sistemi se dijele na jednokorisničke (engl. single-user) i višekorisničke (engl. multiuser). Jednokorisnički operativni sistem je najčešći tip OS koji se koristi na kućnom računaru, kao i na računarima u uredima i drugim radnim okruženjima. Virtualna mašina se kreira za samo jednog korisnika. Višekorisnički računari zahtijevaju jaču hardversku konfiguraciju i omogućavaju simultani pristup više korisnika istovremeno (preko posebnih terminala). Po broju procesa koji se mogu istovremeno izvršavati, operativne sisteme dijelimo na jednoprocesne (engl. single-tasking, single-process) i višeprocesne (engl. multitasking, multiprocess). Kombinovani pristupi od ove dvije podjele su Jednokorisnički jedno-procesni (engl. single-user, singletasking) operativni sistemi, čiji je glavni predstavnik MS-DOS Jednokorisnički više-procesni (engl. single-user, multitasking) u koji spadaju OS/2, MS Windows, Android Višekorisnički više-procesni (engl. multiuser, multitasking), kakvi su npr UNIX, OS/360, VMS, MS Windows Terminal Server 1.6.Podjela po načinu obrade Po načinu obrade sisteme možemo podijeliti na Sisteme sa grupnom obradom (engl. batch) kod kojih se obavlja predaja poslova na izvršenje posredstvom ulaznih jedinica. Obrada se obavlja u nizu i nema komunikacije između korisnika i posla Interaktivni sistemi (engl. Interactive systems) kada korisnici komuniciraju sa svojim poslovima u okruženju s dijeljenim vremenom Kombinovani sistemi kod kojih se po karakteristikama zadatka oni obavljaju po želji grupnom obradom ili interaktivnim radom. (primjer IBM DOS/360) 1.7.Sistemi s grupnom obradom (batch sistemi) Najraniji operativni sistemi su sistemi s grupnom obradom. Koristili su ih prvi računari 1960-ih i 70-ih. Primjer ovakvog sistema je IBM IBSYS. Najčešći ulazni uređaji su čitač kartica i magnetne trake, a izlazni uređaj i linijski štampač, bušač kartica i magnetne trake.

9 1.7.Sistemi s grupnom obradom (batch sistemi) 9 Programi i podaci Procesor Čitač kartica U lazna traka Slika 2 Batch sistemi Izlazna traka Štampač Ovi sistemi nemaju interakcije sa korisnikom. Korisnik pripremi posao (job) za obradu koji sadrži program i podatke, operater to postavi na sistem, pokrene izvršavanje i vrati korisniku rezultat (izlazni podaci ili izvještaj o grešci). Na slici Slika 2 vidi se tipičan tok podataka u ovakvnim sistemima. Jedan job koji prevodi program u Fortran-u i izvršava ga može izgledati ovako. $JOB user_spec ; ime korisničkog posla $FORTRAN ; Učitaj FORTRAN kompajler slijede naredbe Fortrana INTEGER A,B,C READ(5,501) A,B,C 501 FORMAT(3I5) IF(A.EQ.0.OR. B.EQ.0.OR. C.EQ.0) STOP 1 S = (A + B + C) / 2.0 AREA = SQRT( S * (S - A) * (S - B) * (S C)) WRITE(6,601) A,B,C,AREA 601 FORMAT(4H A=,I5,5HB=,I5,5H C=,I5,8H AREA=,F10.2,12HSQUARE UNITS) STOP END $LOAD ; Učitaj kompajlirani program $RUN ; Pokreni program 3,5,7 $EOJ ; Kraj posla $JOB user2 ; Početak novog posla Na slici Slika 3 vidi se tipična arhitektura batch sistema. Poslovi čekaju u redu čekanja. OS je stalno u memoriji i samo redom učitava poslove i prelazi na njih, držeći ih u redu čekanja i redom izvršava jedan za drugim. Nakon toga šalje rezultate na izlaznu traku ili štampač. U laz:p ro gram i, p odaci naredbe R ezultat i R ed čekanja izvršenje Slika 3: Red čekanja u batch sistemima U vrijeme batch sistema procesori su bili veoma skupi i njihova iskorištenost je bila značajan faktor, kako bi se investicija u računarski sistem što bolje isplatila. Često su računarski centri iznajmljivali računarsko vrijeme drugim korisnicima. Kako su u svim računarskim sistemima ulazno-izlazni uređaji znatno sporiji od procesora, uočeno je da iskorištenje

10 Multiprogramirani batch sistemi procesora nije dovoljno. Na slici Slika 4 se vidi vremenski dijagram u kome procesor čeka na ulazno/izlazbe uređaje i za to vrijeme ne izvršava korisnički program. Procesor je neiskorišten U/I operacije Procesor t Slika 4 Efikasnost serijskih batch sistema 1.8.Multiprogramirani batch sistemi Uvođenjem diska omogućeno je da se poslovi smjeste na uređaj s direktnim pristupom. I dalje se pripremi grupa zadataka, ali oni se sada ne izvršavaju nužno onim redoslijedom kojim su poslani. Kada je jedan od poslova u stanju čekanja, operativni sistem može da pređe na izvršavanje drugog posla. Izbor posla iz skupa raspoloživih poslova (pool), koji će se učitati u memoriju i izvršavati zove se raspoređivanje poslova (job scheduling). Multiprogramiranje (multiprogramming) omogućava izvršavanje više poslova uporedo; dok jedan čeka na završetak I/O operacije, CPU izvršava drugi posao. Uvođenje multiprogramiranja otvara više pitanja. Kako iz skupa svih poslova izabrati one koji će se učitati u memoriju i izvršavati job scheduling? Kako smjestiti poslove različite veličine u memoriju memory management? Kada posao koga CPU trenutno izvršava zatraži U/I operaciju, kako izabrati slijedeći koga će CPU izvršavati CPU scheduling? Kako preći sa izvršavanja jednog posla na izvršavanje drugog context switch? Kako opsluživati zahtjeve za U/I operacijom na dijeljenom uređaju I/O device scheduling? Kako spriječiti da jedan posao slučajno ili namjerno ugrozi memorijski sadržaj drugog protection? 1.9.Sistemi dijeljenog vremena (time sharing) Batch sistemi ne pružaju korisniku mogućnost interakcije sa zadatkom dok se on izvršava. Time-sharing ili multitasking je logički nastavak multi-programiranja. To je tehnika dijeljenja vremena tako da se proces izvršava u malim intervalima. CPU izvršava više zadataka tako što se prebacuje između njih. Ovo prebacivanje se dešava tako često da korisnik može uticati na svaki od programa u izvršenju. Time su omogućene dvije vrste interaktivnih sistema. Interaktivni računarski sistem koji pruža on-line komunikaciju između korisnika i sistema. (primjer MS Windows) Sistem sa dijeljenim vremenom koji pruža mogućnost da više korisnika dijeli jedan računar. (primjer VAX/VMS) Kod ovih sistema uvodi se novi pojam, pojam procesa, koji predstavlja izvršavanje nekog programa nad datim skupom podataka. Pojmovi program i proces su slični, ali ipak različiti jer je program pasivni, a proces aktivni entitet koji uključuje i stanje memorije i procesora u toku izvršenja. Program je poput kuharskog recepta, a proces je stvarno kuhanje. Tako više procesa može biti aktivirano nad istim programom, a moguće su sve četiri kombinacije odnosa broja programa i procesa kod operativnih sistema, iako su neke dosta rijetke.

11 1.10.Kombinovani sistemi 11 Monoprogramski, monoprocesni su specijalizovani ili ugrađeni (embedded) sistemi za upravljanje nekim hardverom. Primjer predstavljaju kalkulatori, dječji laptopi, Nintendo Gameboy i slično. Izvršavaju jedan program koji se ne kopira u memoriji. Multiprogramski, monoprocesni sistemi dopuštaju da se od mnoštva programa učita jedan u memoriju. Primjer su CP/M i MS DOS za personalni računar starije generacije koji može imati u memoriji i izvršavati samo jedan program u jednom trenutku ili prvi batch sistemi Monoprogramski, multiprocesni su specijalizovani sistem posebne namjene sa više korisnika kao što je web server na čipu, WIZnet Embedded Web Server. Kada više korisnika istovremeno pristupa, može se pokrenuti nekoliko kopija njegovog jedinog programa koji on poznaje Multiprogramski, multiprocesni su svi moderni OS opšte namjene, Windows, Linux, Android, MacOS-X 1.10.Kombinovani sistemi I nakon uvođenja sistema s dijeljenim vremenom, neki poslovi su se rutinski i dalje obrađivali grupnom obradom. Skup bušenih kartica sa poslovima zamijenile su datoteke s uputstvima (ali je ponegdje kao u kontrolnom jeziku JCL za IBM z/os ostala terminologija da se jedan red u toj datoteci zove kartica). I u pretežno interaktivnim sistemima postoji mogućnost da se neki poslovi automatizuju primjenom skriptnih jezika Podjela po funkcionalnim osobinama Po funkcionalnim osobinama, operativni sistemi mogu se podijeliti na više kategorija, pri čemu mnogi operativni sistemi istovremeno pripadaju u nekoliko kategorija. Te kategorije su: Mainframe operativni sistemi namijenjeni su za fizički velike mašine. U prvom periodu su uglavnom bili batch sistemi, gdje su se slični poslovi udruživali u grupe i zajednički obrađivali. Vremenom se uvodila tehnika multiprogramiranja i automatskog sekvenciranja, čime se bez operatora prebacuje kontrola sa jednog posla na drugi Operativni sistemi za sisteme sa dijeljenim vremenom (engl.time-sharing systems) omogućavaju svakom korisniku komunikaciju sa svojim poslom i OS-om u toku rada. Tehnika multiprogramiranja omogućava da se više poslova se nalazi u memoriji istovremeno, a tehnika dijeljenja vremena radi na principu da poslije isteka vremenskog odsječka svaki posao mora predati kontrolu drugom poslu i sačekati svoj novi vremenski odsječak. Operativni sistemi za desktop sisteme su namijenjeni jednom korisniku po pristupačnoj cijeni. Prve verzije ovih sistema su imale skromne performanse. Kasnije je razvijen grafički korisnički interfejs (GUI). Sistemi su dosta fleksibilni, prilagodljivi i široko korišteni. Primjeri su DOS, MS Windows, Novell NetWare, UNIX, Linux Operativni sistemi za višeprocesorske sisteme (engl.multiprocessor systems) predviđeni su za sisteme sa više procesora koji komuniciraju putem zatvorenih komunikacionih linija,a smješteni su u istom kućištu. Komunikacija i sinhronizacija između procesora putem djeljive memorije. Mogu se realizovati na dva osnovna principa. U simetričnom multiprocesiranju svi procesori su ravnopravni i izvršavaju i korisničke programe i operativni sistem. Kod asimetričnog multiprocesiranja svakom procesoru je dodijeljen specifičan zadatak, a master procesor dodjeljuje zadatak ostalim procesorima.

12 Jezgro operativnog sistema Mrežni operativni sistemi (engl. network OS) omogućavaju komunikaciju računara povezanih u mrežu sa visokim stepenom autonomije. Korisnici mogu pristupati resursima udaljenih mašina na dva načina. To su daljinsko prijavljivanje na sistem (remote login) i razmjena datoteka sa udaljenim sistemom (remote file transfer). Svaki računar ima svoj OS, a međusobno razmjenjuju podatke pomoću odgovarajućih protokola. OS mogu biti različiti a potreban je samo zajednički protokol (zajednički jezik za komunikaciju). Danas najpopularniji takav protokol je TCP/IP. Distribuirani sistemi (engl. distributed systems) osim dijeljenja datoteka i resursa, distribuiraju i procese. Korisnik spolja vidi jedno-procesorski sistem. U stvarnosti, tu je više računara povezanih u mrežu a jedan OS upravlja svim resursima. Korisnik ne mora znati da je umrežen sa drugim računarima pa se cio sistem vidi kao jedan računar. U stvari oni su kolekcija procesora tj. računara koji ne dijele memoriju i sistemski sat. Svaki procesor ima lokalnu memoriju a komuniciraju putem LAN-a (lokalna mreža) ili WAN-a (mreža širokog područja). Posjeta web sajtu spolja izgleda kao pristup jednom računaru, a u stvari je riječ o distribuiranom sistemu u kome učestvuje više miliona računara. Udruženi sistemi (engl. clustered systems) ili klasteri se sastoje od udruženih računara čvrsto povezanih LAN mrežom. Postoje dvije vrste udruživanja: asimetrično (jedan server -čvor izvršava aplikaciju, ostali prateći -monitoring serveri) je namijenjeno za povećanje pouzdanosti, drugi se serveri uključuju tek u slučaju pada glavnog. Simetrično udruživanje povećava performanse, gdje su svi serveri aktivni i svi izvršavaju aplikaciju). Operativni sistemi za upravljanje u realnom vremenu (engl. real-time systems) su specijalni OS kod kojih se očekuje odgovor u tačno definisanom vremenskom intervalu. Koriste se kao specijalni grafički sistemi, sistemi za medicinsku grafiku, sistemi za industrijsku kontrolu, kontrolisanje naučnih eksperimenata. Izvori podataka su senzorski uređaji, razni prekidači, A/D i D/A konvertori. Ručni sistemi (engl. handheld systems), se koriste na uređajima malih dimenzija kao što su PDA uređaji (engl. Personal Digital Assistants), mobilni telefoni, tableti itd. Osnovna karakteristika ovih sistema je mobilnost, ali imaju slabije hardverske resurse od desktop računara (manje memorije, procesori su skromnijih mogućnosti, mali ekrani, ulazni hardver je manje ugodan). Ugrađeni sistemi (embedded systems) vrlo često su uređaji čiji korisnik i ne zna da su u pitanju računarski sistemi, poput POS kasa, pametnih kartica, savremenih televizora, kontrolera veš mašina i slično Jezgro operativnog sistema Jezgro operativnog sistema (engl. nukleus, kernel) je srž operativnog sistema. Jezgro operativnog sistema je zaduženo za upravljanje sistemskim resursima i za komunikaciju između komponenti hardvera i softvera. Jezgro je osnovna komponenta operativnog sistema koje predstavlja najniži apstracijski sloj izveden u softveru a zadatak mu je da izvršava kritične funkcije operativnog sistema: upravljanje primarnom i sekundarnom memorijom, upravljanje procesima; sinhronizacija, stvaranje, gašenje, izvršavanje, izmjena konteksta (eng. context switch), međuprocesna komunikacija, upravljanje prekidima. Jezgro je interfejs između hardvera i ostalih slojeva operativnog sistema, tako da ono direktno pristupa registrima periferijskih uređaja. Neki operativni sistemi kao što je Winows

13 1.13.Dizajn jezgra os-a 13 NT, ipak ne pristupaju uvijek direktno hardveru, nego se između jezgra i hardvera dodaju još jedan sloj, sloj apstrakcije hardvera (engl. Hardware Abstraction Layer, HAL). Osnovna funkcija jezgra je upravljanje procesima - dodjeljivanje procesora procesima, tj. davanje instrukcije procesoru da počne da izvršava instrukcije koje pripadaju procesu. Ali, da bi se nakon toga mogle izvršavati i instrukcije drugih procesa, kao i samog jezgra, moraju postojati određeni preduslovi za ostvarenje osnovne funkcije jezgra na nivou hardvera. To su mehanizam prekida, zaštita mehanizama adresiranja memorije, skup privilegovanih instrukcija i sat realnog vremena. Mehanizam prekida obezbjeđuje izvršenje upravljačkog programa (prekidne rutine) tako što prebacuje kontrolu sa korisničkog na upravljački program. Zaštita mehanizama adresiranja memorije onemogućava da jedan proces upiše svoje podatke u prostor memorije dodijeljen drugom procesu. Skup privilegovanih instrukcija je skup instrukcija dostupnih operativnom sistemu ali ne i korisničkom programu. Korisnički program izvršava privilegovane instrukcije samo putem sistemskih poziva. Satni mehanizam realnog vremena kontroliše i evidentira potrošnju resursa računara za sve pojedinačne procese. Ako neki od ovih preduslova nije ispunjen, na takvom sistemu se ne može napraviti robustan više-procesni sistem (mada su jednoprocesni, ili ranjivi višeprocesni sistemi i dalje mogući) Dizajn jezgra os-a U narednim tačkama, će se opisati sedam različitih arhitektura jezgra operativnog sistema. To su monolitna, slojevita, prstenasta, mikrokernel, hibridna jezgra, jezgra preko virtualnih mašina i egzokernel Monolitni sistemi Daleko najčešći način organizacije jezgra, mogao bi se zvati veliki nered. Struktura je takva da nema strukture. Takvu strukturu ima jezgro MSDOS ili Unix. Operativni sistem je napisan kao skup podprograma, od kojih svaki može pozvati bilo koji od onog drugog kad god je to potrebno. Kada se koristi ova tehniku, svaki podprogram u sistemu ima dobro definisano sučelje u pogledu parametara i rezultata, a svaki od njih je slobodan pozvati bilo koji drugi Čak i u monolitnim sistemima, međutim, moguće je imati bar malo strukture. Usluge (sistemski poziv) koje se traže od operativnog sistema započinju stavljanjem parametara u dobro definisanom mjestu (npr. na stack), a zatim izvršava instrukcija zamke. Ova instrukcija prebacuje mašinu iz režima korisnika u režim jezgra i zatim kontrolu preuzima operativni sistem. On zatim dohvata parametre i određuje što sistemski poziv treba da izvrši. Nakon toga, indeksom se nađe mjesto u tablici koja sadrži pokazivač na podprogram koji izvodi sistemski poziv. Ova organizacija ukazuje na osnovnu strukturu za operativni sistem: Glavni program koji poziva tražene podprograme servisa. Skup uslužnih podprograma koji obavljaju sistemske pozive. Skup zajedničkih procedura koje pomažu procedurama servisa.

14 Slojeviti sistemi 1.15.Slojeviti sistemi Generaliziranje strukture sa tri spomenuta dijela monolitnog jezgra je organizirati operativni sistem kao hijerarhiju slojeva, gdje je svaki sloj izgrađen jedan ispod drugog. Prvi sistem izgrađen na ovaj način je sistem izgrađen na Technische Hogeschool Eindhoven u Nizozemskoj. Sistem je imao 6 slojeva, kao što je prikazano na slici Slika 5. Sloj 0 se bavio dodjelom procesora, prebacivanjem između procesa kada je do prekida došlo ili tajmera istekao. Slojevi iznad predstavljaju druge grupe funkcija operativnog sistema. Osnovno pravilo je da je dopušteno pozivati samo rutine iz istog ili nižih slojeva od sloja u kome se rutine nalaze. Na taj način se smanjuje mogućnost da modifikacija jednog dijela operativnog sistema pokvari njegov ostatak. Pristup, međutim ima i nedostatak. Zamislimo da operativnom sistemu treba dodati mrežne mogućnosti. Kako je riječ o novom sloju treba ga negdje staviti. Ako se stavi ispod sloja datotečnog sistema, mrežni sloj neće moći čitati konfiguraciju mreže, npr. tablice za definisanje izlaza mreže. Ako se stavi iznad tog sloja, tada operativni sistem neće moći imati dijeljenje datoteka na virtualnim mrežnim diskovima Prstenasti sistem Prsten 3 Prsten 2 Prsten 1 Prsten 0 Jezgro Drajveri Drajveri Aplikacije Slika 6: MULTICS arhitektura OPERATOR KORISNIČKI PROGRAM ULAZ/IZLAZ MEĐUPROCESNA KOMUNIKACIJA RAD S MEMORIJOM I DATOTEKAMA UPRAVLJANJE PROCESIMA HARDVER ARHITEKTURA THE SISTEMA Slika 5: Slojeviti sistem Dalja generalizacija koncepta slojeva se pojavila u MULTICS sistemu. Umjesto slojeva, MULTICS je opisan kao da ima niz koncentričnih prstenova (Slika 6), gdje su unutrašnji više privilegovani od vanjskog (što je efektivno ista stvar). Kada je podprogram u vanjskom prstenu želio pozvati nešto u unutrašnjem prstenu, to je morao da izvrši ekvivalentnim sistemskim pozivom, to jest, TRAP instrukcijom čiji se parametri pažljivo provjere prije poziva. Dok je nanošenje slojeva stvarno samo dizajnerska pomoć, jer su svi dijelovi sistema na kraju povezani u jedan programski objekt, u MULTICS, mehanizam prstena je vrlo prisutan u vrijeme izvođenja i sprovodi se od strane hardvera. Prsteni ne grupišu procedure nužno po funkcionalnosti nego po zaštiti.

15 1.17.OS s mikrojezgrom OS s mikrojezgrom Trend u modernim operativnim sistemima ukloniti što je više moguće funkcionalnosti iz kernel moda, ostavljajući minimalni mikrokernel. Uobičajeni pristup je da se implementira većinau operativnog sistema u korisničkim procesima. Za zatražiti uslugu, kao što je čitanje blok datoteke, korisnički proces (sada poznat kao proces klijent) šalje zahtjev na server proces, koji onda obavlja posao i vraća odgovor. Korisnikov proces Korisnikov proces Procesni Server Datotečni Server Internet Server Inicijalizacijski Server Reinkarn. Server Podatkovni Server Disk drajver Audio drajver Terminal drajver Kernel Sistemski proces Proces sata Slika 7 Arhitektura Minix sistema s mikrojezgrom U ovom modelu, sve što kernel radi je održavanje komunikacije između klijenta i poslužitelja. Razdvajanjem operativnog sistema na dijelove, od kojih je svaki samo upravlja jednim aspektom sistema, kao što su usluge datoteka, procesi, terminal, ili memorija, svaki dio postaje mali i upravljiv. Osim toga, jer se svi serveri izvode u korisničkom a ne u kernel režimu, oni nemaju direktan pristup hardveru. Kao posljedica toga, ako se desi greška na serveru datotečnog sistema usluga datoteka se može srušiti, ali to obično neće oboriti cijelu mašinu. Pošto su podsistemi u odvojenim adresnim prostorima, oni ne mogu komunicirati pozivima podprograma ili dijeljenom memorijom. Umjesto toga sistemski procesi razmjenjuju poruke čijim raspoređivanjem upravlja mikro-jezgro. Mana mikrojezgra je u lošijim performansama, jer se izmjena iz sistemskog u korisnički režim rada dešava prilično često. Najpoznatiji operativni sistemi s ovom vrstom jezgra su Unix kompatibilni Mach i Minix. Na slici Slika 7 vidi se osnovna arhitektura Minix sistema. U jezgru se nalaze samo dva procesa, sistemski i proces sata. Sve ostalo, uključujući i drajvere periferijskih uređaja i datotečni sistem se nalazi u korisničkom režimu rada, u formi odvojenih servera. Postoji samo pet sistemskih poziva, koji prelaze u režim jezgra, uglavnom vezanih za slanje i prijem poruka. Nije moguće direktno upisivati iz servera na memorijske apsolutne lokacije, nego se zahtjev za tim obrađuje u jezgru. Minix 3 je pored toga što je namijenjen za nastavu, takođe vrlo pouzdan zbog ideje o reinkarnacijskom serveru. On proziva registrovane podsisteme i u slučaju pada nekog od njih ponovo ga pokreće ako je to moguće Hibridno jezgro Spajanjem ideja monolitnog jezgra sa mikrokernelom nastaju hibridna jezgra. Sistem je razdvojen na osnovno jezgro vrlo male funkcionalnosti (obično samo obrada prekida i raspoređivanje procesa) i dijelove za upravljanje resursima, ali oni ostaju u istom adresnom prostoru. Time se smanjuje pouzdanost u odnosu na čisto mikro-jezgro ali povećava brzina. Ipak, sistem je bolje interno struktuiran od monolitnog jezgra. Najpoznatiji primjer ovakvog jezgra je Windows NT serija. Njegov dio koji se zove Kernel je mali, ali se resursima upravlja

16 OS preko virtualnih mašina koristeći rutine koje se izvršavaju u režimu jezgra, koje se zovu Windows Executive. Aplikativni programi, međutim njega ne pozivaju direktno sistemskim pozivima u jezgro, nego pozivajući servere podsistema koji komuniciraju s jezgrom i omogućavaju da se po želji poziva koristeći Windows, OS/2 ili Posix API (iako većina programa ostaje s Windows pozivima) OS preko virtualnih mašina U IBM sistemu VM/370 uveden je novi koncept, operativni sistem preko virtualnih mašina. Srce sistema, monitor virtualnih mašina, radi na golom hardveru i omogućuje multiprogramiranje, pružajući nekoliko virtualnih mašina za više slojeve gore, kao što je prikazano na slici. Međutim, za razliku od svih ostalih operativnih sistema, te virtualne mašine nisu proširena mašina, s datotekama i ostalim lijepim karakteristikama. Umjesto toga, oni su tačna kopije golog hardvera, uključujući kernel/korisnika režim, I/O, prekide, i sve što ostalo prava mašina ima. Procesi Procesi Procesi Procesi Jezgro VM1 Jezgro VM2 Jezgro VM3 Implementacija virtuelne mašine Hardver Jezgro virtuelnih mašina Jezgro Hardver Monolitno jezgro Slika 8 OS preko virtualnih mašina Pošto je svaka virtualna mašina identična pravom hardveru, svaka može izvršiti bilo koji operativni sistem koji će izravno raditi na golom hardvera. Tako, dok klasično, monolitno jezgro izvršava jedan operativni sistem, ovim pristupom je moguće pokrenuti više operativnih sistema (Slika 8). Na primjer neke izvršavaju jedan od potomaka OS/360 za batch obradu ili obradu transakcija, dok će ostale izvršavati jednokorisničke, interaktivne sisteme pod nazivom CMS (Conversational Monitor System). OS OS OS OS Hipervizor tip 2 Hipervizor tip 1 Hardver OS Hardver Slika 9 Dvije vrste hipervizora

17 1.20.Exokernel 17 Prošlo je puno godina, dok se ova ideja nije postala izvodiva na mikroračunarima. Procesori Core 2 uključuju režim virtualizacije koji generišu izuzetke pri svakoj instrukciji čije ponašanje treba simulirati da virtualna mašina izgleda kao prava. Tako postaje moguća realizacija operativnih sistema sa slojem virtualne mašine između hardvera i operativnog sistema. U današnjoj terminologiji, monitor virtualnih mašina se zove hipervizor tipa 1, čiji je primjer Oracle VM. Ovo treba razlikovati od hipervizora tipa 2, koji se izvršava kao korisnički program (npr Qemu, VMWare) u već pokrenutom operativnom sistemu i izvršava drugi operativni sistem (Slika 9) Exokernel Sa VM/370, svaki korisnik proces dobiva potpunu kopiju stvarnog računala. Uz virtualni 8086 mod na Pentium-u, ili hipervizor tipa 2 svaki korisnik procesa dobiva potpunu kopiju drugog računara. Idući korak dalje, istraživači na MIT-u su izgradili sistem Aegis koji daje svaki korisniku klon stvarnog računara, ali sa podskupom resursa. Tako jedna virtualna mašina može dobiti disk blokove , sljedeća bi se mogla dobiti blokove , i tako dalje. Na donjem sloju, koji radi u kernel modu, je program pod nazivom exokernel. Njegov posao je da izdvoji resurse za virtualne mašine, a zatim provjeri pokušaje kako se oni koriste kako bi bili sigurni da neko ne pokušava koristiti tuđe resurse. Svaki virtualni stroj na nivou korisnika može pokrenuti vlastiti operativni sistem, osim da je svaki od njih je ograničen samo na dio resursa. Prednost exokernel sheme je da štedi sloj mapiranja. U drugom dizajnu, svaka virtualna mašina misli da ima svoj disk, s blokovima od 0 do N, tako da monitor virtualnih mašina mora održavati tablice korištenih disk adresa. Uz exokernel, nije potrebno ovo raspoređivanje. U exokernel treba voditi samo računa o tome koji virtualni stroj je dodijeljen kojem resursu Prekidi Pošto u modernim operativnim sistemima jezgro i korisnički proces rade u odvojenim memorijskim prostorima i sa različitim privilegijama, postoji česta potreba prelaska između ta dva režima rada. Ako procesor radi u režimu jezgra, može se preći u korisnički režim rada postavljanjem statusnog registra koji definira način rada. Nakon što se prešlo u korisnički režim,međutim, ne može se jednostavno preći na rad u kernel modu, jer bi to bilo kršenje privilegija. Prelazak iz korisničkog u režim jezgra odvija se preko softverskog prekida, hardverskog prekida i izuzetaka. Za ovo troje, upotrebićemo generički pojam zamka (trap), iako se tim pojmom često označava samo prvi od njih. Softverski prekid. Softverski prekid inicira se kada korisnik pozove specijalnu instrukciju. Tada se prisiljava program da skoči na dobro poznatu adresu na osnovu broja prekida, koji je predviđen kao parametar. Primjeri softverskog prekida se mogu naći na većini procesora, kao što su instrukcije int ili sysenter na Intel procesorima ; syscall na AMD procesorima ili SWI na ARM procesorima. Izuzeci Što se događa ako korisnik programa pokušava da izvrši instrukciju koja je dostupna samo u režimu jezgra, ili pokušava pristupiti memorijskom prostoru koji nije dostupan za to? U slučajevima kao što je ovaj dešava se izuzetak. Procesori imaju definisan skup izuzetaka koje poznaju. Na primjer, to može biti kršenje pristupa memoriji, ilegalne instrukcije, kršenje pristupa registru, dijeljenje nulom, ili pristup nepostojećoj lokaciji memorije. Iako se izuzeci ne očekuju od strane programera, oni su kao odgovor na izvršenje trenutne instrukcije.

18 Sistemski poziv Imajte na umu da Intel procesori prije Core 2 Duo nisu generisali zamku kada je korisnički program pokušao da izvrši privilegovane instrukcije, nego su se ti zahtjev ignorisali. To je otežavalo pravljenje virtualnih mašina. Hardverski prekid nastaje kada vanjski sistemski događaj koji šalje prekidni signal procesoru, kao što je završetak DMA ( pristup direktne memorije ) transfera od hardvera, kao što je kontroler diska. Hardverski prekidi mogu nastati spontano, a u bilo koje vrijeme. Oni nisu u funkciji instrukcije koja se trenutno izvršava i prisiljavaju na spontanu promjenu kontrole. Uprkos konfuziji u terminologiji, krajnji rezultat svih tih zamki je isti. Svaka zamka ima pridruženu tabelu i procesor skače na adresu u memoriji koja se temelji na broju zamke u tabeli vektora prekida. Zamka djeluje kao spontani poziv potprograma. Sadašnji programski brojač je gurnut na stack i program skače na dobro poznatu adresu. Ta adresa obično se nalazi u tablici vektora. Pri tome se izvrši prebacivanje iz korisničkog režima u kernel režim. Tablica je popunjena pri inicijalizaciji operativnog sistema, i njene elemente može mijenjati samo operativni sistem. Budući da se ona ne može mijenjati od strane korisnika, operativni sistem je uvjeren da programska kontrola ide na samo dobro definirane tačke u operativnom sistemu. Nakon ulaska u zamku, izvodi se kod operativnog sistema i kada je operativni sistem je spreman da prenese kontrolu nazad u korisnički režim, izvršava povratak (naredba IRET na Intel procesorima). To uključuje povratak procesora natrag u korisnički način rada i prebacuje kontrolu na adresu na vrhu steka. Svakom od ovih zamki drugačije upravlja operativni sistem. U slučaju softverskog prekida provjere se parametri. Ako oni predstavljaju regularan način poziva usluge operativnog sistema, prelazi se na odgovarajuću rutinu, sistemski poziv. Ako je u pitanju bio izuzetak, provjeri se šta ga je izazvalo. Može se desiti na primjer, da se pristupalo regularnoj memorijskoj lokaciji, ali ona nije trenutno dostupna. U ovom slučaju, operativni sistem učita potreban komad memorije i ponovi instrukciju. Ako akcija nije bila valjana, kao što pokušaj pristupa nevažećoj memorijskoj lokaciji, operativni sistem može poslati određeni signal procesu ili ga prekinuti. U nekim slučajevima, kao što je virtualizacija, operativni sistem će možda morati da simulira akcije privilegovanih instrukcija i zatim vratiti kontrolu natrag na sljedeće instrukcije u korisničkom procesu Za razliku od softverskih prekida i izuzetaka, hardverski prekidi nastaju spontano zbog nekih događaja koji su nevezani za trenutne instrukcije. Operativni sistem trebaju obezbijediti da ne mijenjaju stanje izvršavanja procesa pri obradi hardverskog prekida 1.22.Sistemski poziv Program često treba pročitati datoteku, pisati na neki uređaj, ili možda pokrenuti neki drugi program. Za sve ovo je potrebna intervencija operativnog sistema. Veza između programa operativnog sistema i korisnika je skup sistemskih poziva ( open, close, read, fork, execve, itd). Realizacija sistemskih poziva koristi mehanizam zamke koji omogućuje da se prebaci na dobro definirane tačke u jezgru. Izvršavanje sistemskih poziva obično uključuje čuvanje parametara na posebno formiran stek, skladištenje broja sistemskog poziva (svaka funkcija ima odgovarajući broj), a zatim izdavanje instrukcije za softverski prekid za prebacivanje kontrole kako bi operativni sistem prešao radi u režimu jezgra.

19 1.23.API pozivi 19 Na primjer, za sistemski poziv getpid (dobavljanje identifikatora procesa ) na Intel/Linux sistemima stavlja se broj 20 u registar EAX (20 je redni broj koji odgovara na getpid sistemski poziv), a zatim se izvršava INT 80h, koja generira softverski prekid. Rezultat će se dobiti u registru EAX. U verziji jezgra 3.13 ima 350 sistemskih poziva. Pozivaju se tako da se u EAX stavi redni broj sistemskog poziva, a njegovi parametri redom smiještaju u EBX, ECX, EDX, ESI, EDI. Oni koji se najčešće koriste imaju manje redne brojeve. Tako, od broja 1 sistemski pozivi su redom: exit, fork, read, write, open, close, waitpid, creat,link, unlink, execve, chdir, time, mknod, chmod,lchown, break, oldstat, lseek, getpid, mount, umount,setuid, getuid, stime, ptrace, alarm, oldfstat, pause,utime, stty, gtty, access, nice, ftime, sync, kill, rename, mkdir, rmdir, dup, pipe, times, prof, brk,setgid, getgid, signal, geteuid, getegid, acct, umount2, lock, ioctl, fcntl, mpx, setpgid, ulimit, oldolduname, umask, chroot, ustat, dup2, getppid, getpgrp, setsid,sigaction, sgetmask, ssetmask, setreuid, setregid,sigsuspend, sigpending, sethostname, setrlimit, getrlimit,getrusage, gettimeofday, settimeofday, getgroups, setgroups,select, symlink, oldlstat, readlink, uselib, swapon,reboot, readdir, mmap, munmap, truncate, ftruncate, fchmod, fchown, getpriority, setpriority, profil, statfs,fstatfs, ioperm, socketcall, syslog, setitimer, getitimer,stat, lstat, fstat... I Windows NT i njegovi nasljednici (npr Windows 8) imaju sličan način sistemskog poziva, ali je on vrlo malo poznat. Da se pozove usluga jezgra operativnog sistema koristi se jedna od tri instrukcije: INT 2Eh (na starijim sistemima), sysenter (na novijim Intel procesorima) i syscall (na AMD procesorima). Na primjer za poziv NtQuerySystemInformation može se pisati. NtQuerySystemInformation: mov eax, 97h lea edx, [esp+4] int 2Eh ; ili sysenter, syscall ret 10h Kao i kod poziva funkcija, jezgro treba biti paziti da spasi sve korisničke registre i obnovi ih sve prije nego što se vrati. Sva ova ružnoća skrivena je od programera sa skupom biblioteke rutina koje odgovaraju svakom sistemskom pozivu. Bibliotečne rutine spase parametre, izdaju zamku, i kopiraju rezultate natrag na korisnički stek tako da sistemski poziv izgleda baš kao redovni poziva funkcije. Generalno, sistemi pružaju biblioteke ili API koji se nalazi između korisničkog programa i operativnog sistema. Na Unix-sličnim sistemima, taj API je obično dio implementacija C biblioteke (libc), kao što su glibc, koja pruža omot funkcije za sistemske pozive, koji se često zove isto kao sistemski poziv koga pozivaju. Na Windows NT, taj API se zove Native API, u ntdll.dll biblioteci, nedokumentirani API koga koriste implementacije regularnog Windows API i neposredno koriste neki sistemski programi na Windows. Poziv funkcije biblioteke predstavlja običan poziv podprograma, koji sam po sebi ne prelazi u režim jezgra, ali prepakuje parametre i pozove odgovarajući softverski prekid. Na ovaj način, biblioteka koja postoji između jezgra OS i aplikacija, povećava prenosivost programa. Na sistemima sa exokernel, biblioteka je posebno važna kao posrednik. Sa exokernel, biblioteka kernel API radi na vrlo niskom nivou, i pruža apstrakcije i upravljanje resursima API pozivi Mada postoje biblioteke koje omogućavaju programeru da poziva sistemske pozive, češće se koriste viši nivoi apstrakcije. Sistemski pozivi su često nedokumentovani i nekompatibilni između verzija operativnih sistema. Na primjer, direktno pozivanje sistemskog poziva u Linux-

20 POSIX API u koristeći INT 80h će raditi samo na datom procesoru, ili čak konkretnoj verziji jezgra Linux-a za taj procesor. Umjesto toga, prilikom programiranja na nekom programskom jeziku, preporučuje se da programer koristi samo API (application programming interface) operativnog sistema, ili ako želi postići i manju ovisnost o operativnom sistemu, API vezan za dati programski jezik. API definiše kako neke softverske komponente međusobno reaguju s drugim POSIX API Sistemi nastali na bazi Unix koriste POSIX API kao prijenosni standard za funkcije operativnog sistema. Ako aplikacije koriste ovaj API, biće daleko lakše prenositi ih s jednog operativnog sistema na drugi, bez obzira koje se jezgro koristi. Ovaj standard opisuje određene zajedničke usluge, API, koje kompatibilan operativni sistem mora pružiti softveru (npr. utičnice, datoteke i niti) zajedno sa konvencijama o tome kako ih treba pozvati iz programa. Ideja je da će program napisan za jedan POSIX-kompatibilni OS biti lakše prebačen na drugi POSIX usklađen OS nego na OS koji nije POSIX usklađen. To je razlog zašto je mnogo lakše prebaciti aplikaciju iz, recimo, FreeBSD na Linux nego iz FreeBSD na Windows. Sljedeći primjer u jeziku C pokazuje kako se koristi funkcija open, koja je dio Posix API. #include <fcntl.h>... int fd; mode_t mode = S_IRUSR S_IWUSR S_IRGRP S_IROTH; char *filename = "/tmp/file";... fd = open(filename, O_WRONLY O_CREAT O_TRUNC, mode); DOS API Na operativnom sistemu MS DOS API funkcije se pozivaju mašinskom instrukcijom INT 21h, (i još nekim drugim INT naredbama) pa izgledaju kao sistemski pozivi. Ali, ovaj operativni sistem nema razliku između korisničkog režima i režima jezgra. Prije poziva ove instrukcije u registru AH se nalazi broj funkcije, a u drugim registrima poput AL, BH, SI itd. dodatni parametri. Vrijednosti AH registra kojim se bira poziv su navedene u tabeli Slika 10. Jezgro ovog sistema je datoteka MSDOS.SYS u kojoj se nalazi implementacija datih poziva. Primjer: Napusti program MOV AH,4Ch MOV AL,0 INT 21h

21 1.26.WINDOWS API Čitaj znak s standardnog ulaza 02 Piši znak na standardni izlaz 05 Piši znak na štampač 06 Konzolni ulaz izlaz 07 Direktno čitanje znaka bez pisanja 08 Čitanje znaka s STDIN bez pisanja 09 Piši znak na standarni izlaz 0A Baferovan ulaz 0B Dobavi status standarnog izlaza 0C Isprazni ulazni pafer 0D Disk reset 0E Odaberi podrazumijevani disk 19 Trenutni podrazimijevani disk 25 Postavi interapt vektor 2A Čitaj sistemski datum 2B Postavi sistemski datum 2C Čotaj sistemsko vrijeme 2D Postavi sistemsko vrijeme 2E Uključi verifikaciju 30 Dobavi verziju DOS-a 31 Završi program ali ostani u memoriji 35 Dobavi interapt vektor 36 Dobavi slobodan disk prostor 39 Kreiraj poddirektorj 3A Obriši poddirektorij 3B Postavi radni direktorij 3C Kreiraj datoteku 3D Otvori datoteku 3E Zatvori datoteku 3F Čitaj datoteku 40 Piši u datoteku 41 Obriši datoteku 42 Pozicioniraj se na datoteku 43 Pročitaj/postavi atribute datoteke 47 Dobavi trenutni direktorij 4C Napusti program 4D Dobavi povratni kod 54 Očitaj fleg verifikacije 56 Preimenuj datoteku 57 Pročitaj/postavi datum datoteke Slika 10 DOS API/ Sistemski pozivi 1.26.WINDOWS API U slučaju Windowsa, programerima je na raspolaganju više skupova API, raznih nivoa. Na slici Slika 11 navedene su verzije Windows-a u kojima je ovaj API moguće pozivati. Kao ilustracija, navešće se ime funkcije koja radi pokretanje novog procesa u svakom od njih. Najveći procenat računara s Windows operativnim sistemom poznaje Win32 API, pa će se u daljem tekstu reći nešto o njemu. Windows API je ime najvažnijih funkcija namijenjenih programerima, raspoloživih u Microsoft Windows operativnim sistemima. Dizajniran je za upotrebu u C/C++ programima i predstavlja najdirektniji način za interakciju između Windows sistema i softverskih aplikacija.

22 WINDOWS API Naziv Kernel API Native API Win32 API Verzije Windows.NET API XP,Vista, 7, 8,10 Namjena Funkcija za kreiranje procesa NT,2000,XP, Skup funkcija u režimu jezgra. Pozivaju ga samo PspCreateProcess. Vista,7,8,10 drajveri. NT,2000, Klasični sistemski poziv i izaziva prelazak u režim NtCreateProcess. XP, Vista, 7, jezgra. Koristi ga zanemariv broj programa, na primjer 8,10 checkdisk. 95,98,ME,N Smješten je u velikom broju dijeljenih datoteka i CreateProcess T,2000,XP, poziva se kao funkcije u C. Uz njega su još i objektno Vista, 7, bazirani API (pozivaju se kao C++ objekti bez 8,10 nasljeđivanja) COM, DirectX, ActiveX, najviše korišten Uključuje veliku biblioteku za objektno-orijentisane jezike i pruža priličnu neovisnost od programskog jezika Process.Start WinRT 8,8.1,10 Objektno-orijentisani API dizajniran za saradnju s drugim jezicima koristeći metapodatke Windows.System.Launche r.launchfileasync Win16 API 1,2,3,95,98, Šesnaestbitna verzija Windows WinExec ME,NT,2000, XP, Vista DOS API 1,2,3,95,98, Programi za MSDOS INT 21, AH=4Bh ME,NT,2000, XP, Vista Java API 98,ME,2000 Za izvršavanje programa u jeziku Java Runtime.exec OS/2 API NT, 2000 Izvršavanje programa pisanih za OS/2 DosExecPgm Posix API NT, 2000, XP Izvršavanje programa pisanih za Unix fork, execve Slika 11 Aplikacijski programski interfejsi u verzijama operativnog sistema Windows Funkcionalnost koju nudi Windows API grupiše se u sedam kategorija. Osnovne usluge Ovaj dio Windows API-ja pruža pristup najvažnijim resursima koje pruža Windows sistem. Uključeni su datotečni sistem, pristup uređajima, procesi i niti, pristup Windows registry-ju, i praćenju grešaka. Ove funkcije se nalaze unutar datoteka kernel32.dll i advapi32.dll. Grafičke funkcije (GDI) Ove funkcije omogućavaju izlaz na monitore, štampače i druge izlazne uređaje. Funkcije su locirane u datoteci gdi32.dll, a od Windows XP i u datoteci gdiplus.dll. Korisnički interfejs U korisnički interfejs spadaju funkcije koje omogućavaju upravljanje prozorima, osnovnim kontrolama ( kao što su dugmad i klizne trake), naprednim kontrolama (trake napretka, kartice), prijem ulaza miša i tastature i druge funkcionalnosti povezane s grafičkim interfejsom. Ova jedinica je locirana u user32.dll i comctl32.dll. U korisnički interfejs spada i grupa funkcija koja prikazuje standardne Windows dijaloške prozore za otvaranje i snimanje datoteka, izbor boja, fonta itd, koje su locirane su u comdlg32.dll. Jedna grupacija funkcija korisničkog interfejsa služi za kontrolu školjke operativnog sistema (Program manager, Explorer) i locirana je u bibliotekama shell32.dll i shlwapi.dll. Mrežni servisi Mrežni servisi pružaju različite usluge operativnog sistema vezane za pristup računarskoj mreži. U tu kategoriju spadaju NetBIOS (mogućnost imenovanja računara), Winsock (pravljenje Internet servera), NetDDE (razmjena podataka preko mreže), RPC (pokretanje programa na daljinu) i mnogi drugi. Web API funkcije Internet Explorer je integriran u operativni sistem počevši od Windows 98, pa se funkcije koje pruža web pregledač također mogu koristiti iz korisničkih programa. Ove funkcije se nalaze u grafičkoj kontroli koja uključuje web pregledač u aplikacije

23 1.27.Zadaci 23 (shdocvw.dll i mshtml.dll); u servisu urlmon.dll, koji pruža COM objekte za prepoznavanje adresa na webu; u biblioteci za višejezični pristup (mlang.dll); skupu komponenti za filtriranje slike DirectX Transforms; u podršci za XML ; u pristupu Windows adresaru. Multimedijalni APIji za aplikacije koje se bave animacijom i zvukom, postoje dvije vrste API-ja. Jedan je lociranwinmm.dll i omogućuje pristup zvučnoj kartici. Drugi se zove DirectX i namijenjen je pisanju igara. On uključuje Direct3D kao alternativa biblioteci OpenGL za pristup 3D akceleracijskom hardveru, DirectDraw za pristup ekranu kao dvodimenzionalnoj video memoriji, DirectSound za pristup zvučnoj kartici na niskom nivou, DirectInput za komunikaciju s ulaznim uređajima kao što su džojstici i tastature, DirectPlay kao infrastruktura za igre više igrača., DirectShow za prikaz video filmova u igrama i pravljenje medija plejera. Pored ovih API-ja dodana je i OpenGL biblioteka za trodimenzionalni prikaz objekata API za interakciju između programa Windows API se prvenstveno bavi interakcijom između Operativnog sistema i aplikacije. Za komunikaciju između Windows aplikacija, Microsoft je razvio skup tehnologija pored glavnog Windows API. Najstarija je bila Dynamic Data Exchange (DDE), nakon nje Object Linking and Embedding (OLE) i dalje Component Object Model (COM). Sljedeći primjer prikazuje jednostavan poziv Win32 API funkcije MessageBox koja prikazuje mali prozor s porukom. #include<windows.h> int WINAPI wwinmain(hinstance hinstance, HINSTANCE hprevinstance, PWSTR szcmdline, int ncmdshow) { MessageBox(NULL,"Dobro došli u Win32","Poruka",MB_OK); return 0; 1.27.Zadaci Zadatak 1. Ako koristite Linux, instalirajte dodatak (ako već nije instaliran) za gcc koji omogućava kompajliranje Windows programa. sudo apt-get update sudo apt-get install mingw32 Unesite hellowin.c. #include <windows.h> int main(int argc, char *argv[]) { MessageBox(NULL, "Hello, world!", "Hello, world!", MB_OK); return 0; Prevedite ga s i586-mingw32msvc-gcc hellowin.c -o hellowin.exe Pokrenite s wine hellowin.exe Ovim se windows program pokrenuo pod Linuxom, a treba da prikaže prozorčić s porukom. Ako koristite Windows kao razvojnu platformu, objasnite kako se prevodi program

24 Koncept procesa 2.Upravljanje procesima Operativni sistem omogućava izvršavanje korisničkih i sistemskih programa. Njihovo izvršavanje u memoriji predstavlja korištenje svih resursa računara, pa je stoga jedan od najvažnijih dijelova jezgra onaj koji je posvećen upravljanju programima u izvršenju procesima. Rani računarski sistemi, npr CP/M, nisu omogućavali izvršenje više od jednog programa istovremeno. Ovaj jedini program je imao potpunu kontrolu nad sistemom i pristup svim resursima. Moderni računari mogu istovremeno raditi više stvari istovremeno. Računar može čitati sa diska i prikazati tekst na monitoru ili printeru dok neki korisnički program radi. U multitasking sistemu CPU prelazi sa programa na program pri čemu svaki program može računati sa određenim vremenskim intervalom. Preciznije, u svakom trenutku na CPU se izvršava samo jedan program. U vremenskom intervalu od 1 s može biti obrađeno više programa što korisniku daje osjećaj paralelnog rada. Nekad se u ovom kontekstu govori o kvazi-paralelnosti da bi se istakla razlika u odnosu na pravu hardversku paralelnost u više-procesorskim sistemima, gdje dvije ili više procesorske jedinice dijele istu memoriju. 2.1.Koncept procesa Centralni koncept u svakom operativnom sistemu je proces: apstrakcija jednog aktivnog programa. Proces je program u izvršenju i mora se izvršavati sekvencijalno, što znači da se u jednom trenutku na jedno-procesorskom sistemu izvršava samo jedna instrukcija. U današnje vrijeme, računarski sistemi dozvoljavaju istovremeno ubacivanje više programa u memoriju i njihovo konkurentno izvršavanje. Dodjeljivanjem različitih procesa, odnosno programa u izvršenju, procesoru operativni sistem postaje efikasniji. Proces je više od programskog koda, on uključuje trenutne aktivnosti prezentirane vrijednošću programskog brojača (program counter) i sadržajem procesorskih registara. Za razliku od procesa koji je aktivan entitet program je pasivan entitet. 2.2.Model procesa U ovom modelu je čitav softver, a nekad takođe i operativni sistem, organizovan kao veliki broj sekvencijalnih procesa. Svaki proces ima svoju virtualnu CPU. U realnosti CPU se prebacuje između procesa. Da bi se shvatio sistem, lakše je zamisliti veliki broj (kvazi)- paralelnih procesa nego pokušavati zadržati pregled o tome da se CPU prebacuje između programa. Model procesa će se predstaviti kroz tri elementa koji ga opisuju: njegovu memorijsku sliku, programski brojač i strukture u jezgru koje opisuju stanje. U dijelu memorije dodijeljenom procesu uočavaju se tri fundamentalna memorijska dijela. - Programska sekcija koja se ne mijenja i koja sadrži programski kod. Programski brojač može da pokazuje samo na memorijske lokacije u ovom dijelu memorije. Ovaj dio memorije je obično nepromjenjiv, a u nekim operativnim sistemima ako je nad jednim programom pokrenuto više procesa, u memoriji je moguće čuvati jednu kopiju ovog memorijskog dijela. - Stek sekcija (engl. stack section) koja sadrži privremene podatke (parametre za procedure, povratne adrese, lokalne promjenjive), je organizovana obično na vrhu predviđenog memorijskog područja za proces. Koristi se specijalni registar zvani stek pointer i program

25 2.2.Model procesa 25 pristupa podacima na memorijskim lokacijama koje su u njegovoj neposrednoj blizini. Ovo područje je promjenjivo kako u sadržaju, tako i u njegovoj veličini. - Sekcija podataka (engl. data section) koja sadrži globalne promjenjive. Ovim memorijskim lokacijama se pristupa koristeći instrukcije koje navode njihove apsolutne ili relativne memorijske adrese. Sadržaj ovog područja je promjenjiv, ali veličina se mijenja razmjerno rijetko ili se u nekim slučajevima i ne može mijenjati. Procesor izvršava programske instrukcije operativnog sistema i korisničke aplikacije. Na slici Slika 12 se vidi da programski brojač procesora kroz vrijeme pokazuje na dijelove procesa P1 i P2, kao i dijelove jezgra operativnog sistema K. Iako u stvarnosti postoji samo jedan programski brojač, procesi to vide kao da svaki od njih ima svoj programski brojač i nezavisno se izvršavaju. P 1 K P 2 K P 1 K P 2 S t v a r n o i z v r š a v a n j e P 1 P 1 P 2 P 2 K K K S l i k a i z p e r s p e k t i v e p r o c e s a Slika 12 Vremenski tok izvršenja, virtualna samostalnost Za realizaciju modela procesa, operativni sistem održava tabelu, koja se naziva tabela procesa, i koja po procesu ima jednu rubriku. Ova rubrika sadrži informacije o stanju procesa, programskom brojaču, stack pointeru, zauzetosti memorije, stanju njegovih otvorenih datoteka, podacima o upravljanju i raspoređivanju i sve druge informacije koje se moraju snimiti kad proces prelazi iz stanja izvršavanja (engl. running) u stanje spreman (engl. ready) ili stanje blokiran (engl. blocked). Tako je svaki proces u operativnom sistemu predstavljen procesnim kontrolnim blokom (PCB- process controle block) prikazan na slici Slika 13. PCB je određen skladišni prostor koji dozvoljava operativnom sistemu lociranje informacija o procesu. To je struktura podataka koja definiše proces operativnom sistemu. PCB sadrži važne informacije o određenom procesu, direktno ili indirektno: Trenutno stanje procesa: ready, running, waiting, i dr.; Jedinstvenu identifikaciju procesa (ime ili jedinstveni identifikator procesa PID); Pokazivač na proces roditelj; Pokazivač na child proces (ako postoji); Pokazivač Stanje procesa Broj procesa Programski brojač Registri Memorijska područja Lista otvorenih datoteka Slika 13 PCB Informacija o raspoređivanju CPU uključuje prioritet procesa i bilo koje druge parametre karakteristične za raspoređivanje CPU. Pokazivač koji pokazuje na memoriju procesa;

26 Pokretanje procesa Područje registara: CPU registri se mijenjaju kada je u pitanju tip ili veličina, zavisno od arhitekture računara. Ovdje se ubrajaju akumulatori, indeksni registri, stek pointeri i registri opšte namjene uključujući i informacije o statusnim bitima (flag). Programski brojač pokazuje adresu slijedeće instrukcije koja za ovaj proces treba biti izvršena. Informacija o upravljanju memorijom može uključivati informaciju o vrijednosti baznog i limit registra, tabele stranica zavisno od memorijskog sistema koji se koristi. Lista otvorenih datoteka; Informacija o statusu U/I: uključuje listu U/I uređaja dodijeljenih procesu, listu otvorenih datoteka itd. Procesor na kome radi (ako ima više procesora). Accounting informacija uključuje korišteno CPU vrijeme, realno korišteno vrijeme, vremenske limite, broj procesa itd. Najveći dio sadržaja kontrolnog bloka procesa rezervisan je za čuvanje konteksta procesa. Kontekst procesa čine podaci koji se čuvaju prilikom oduzimanja procesora, a njih generiše sam hardver. Prelazak CPU na drugi proces zahtjeva snimanje stanja tekućeg procesa i pozivanje snimljenih podataka novog procesa. Kada dođe do promjene konteksta (engl. context switch) jezgro snima kontekst starog (tekućeg) procesa u PCB (Process Control Block) i puni sačuvani kontekst procesa koji je raspoređen za rad na CPU. Pomoću tabele procesa može se pojasniti kako nastaje iluzija više paralelnih sekvencijalnih procesa na jednoj mašini sa jednom CPU i više U/I uređaja. Kada dođe vrijeme za izvršavanje novog procesa, od trenutno izvršavanog se u tablici kontrolnih blokova procesa sačuva dovoljno informacija da se on može nastaviti tačno na onom mjestu gdje je zaustavljen, poput nastavka putovanja automobila nakon kratkog zaustavljanja na crvenom svjetlu saobraćajnog semafora. Zbog prelaska CPU između procesa brzina kojom proces radi nije jedinstvena i vjerovatno je nije moguće reproducirati kad se isti proces ponovo aktivira. Brzina izvršavanja većine procesa je pod uticajem relativne brzine različitih procesa. 2.3.Pokretanje procesa Postoje četiri događaja koje uzrokuju pokretanje jednog procesa: 1. inicijalizacija sistema, 2. sistemski poziv za pokretanjem procesa kroz neki drugi proces, 3. korisnički zahtjev za stvaranjem procesa, 4. inicijalizacija batch poslova. Prilikom inicijalizacije sistema pokreće se više procesa. Neki od tih procesa su procesi koji rade u prvom planu, što znači procesi koji komuniciraju sa korisnicima i izvršavaju zadatke za njih. Ostali su pozadinski procesi, koji izvršavaju specijalne funkcije i ne pripadaju određenim korisnicima. Npr. pozadinski proces može biti proces za prijem poruka, koji uglavnom ništa ne radi i samo prilikom pristizanja poruke postaje aktivan. Ovi pozadinski procesi se nazivaju demoni (deamons), dok Windows koristi termin servis (service). U UNIX sistem možemo koristiti program ps za prikaz svih aktivnih procesa. Kod Windows sistema kombinacija Ctrl-Alt-Del tipki prikazuje aktivne procese. Pored stvaranja procesa prilikom inicijalizacije sistema procesi se mogu i kasnije pokrenuti. Često aktivni procesi pokreću sistemske pozive za stvaranje jednog ili više novih procesa. Stvaranje novih procesa je posebno korisno kada je moguće izdijeliti posao na više nezavisnih ali povezanih procesa.

27 2.4.Završetak procesa 27 U interaktivnom sistemu korisnik pokreće program davanjem komande ili duplim klikom na ikonu. Svaka ovakva akcija pokreće novi proces. Zadnja situacija u kojoj se pokreće proces javlja se kod batch (grupnog) procesiranja u velikim mainframe računarima. Korisnik prenosi batch posao na sistem. Čim sistem odluči da ima dovoljno sredstava za obradu novog zadatka pokreće novi proces i u okviru njega obrađuje slijedeći zadatak. 2.4.Završetak procesa Prije ili kasnije proces završava rad iz jednog od sljedećih razloga: 1. normalni izlaz (dobrovoljno), 2. izlaz sa greškom (dobrovoljno), 3. fatalna greška (nije dobrovoljno), 4. ubijen (killed) od strane drugog procesa (nije dobrovoljno). Većina procesa završavaju kad su ispunili svoj zadatak. Većina grafički orijentisanih programa ima mogućnost dobrovoljnog završetka (exit, close, quit). Drugi razlog za završetak može biti jedna značajna greška, npr. ulazni podaci ne postoje. I u ovom slučaju sam program inicira završetak programa, ali ima određenu indikaciju da je program završen. Treći razlog za završetak je greška prouzrokovana kroz sam proces. Ovo se dešava najčešće zbog programske greške. Kod ovakve greške proces se ne završava pojavom ovakve greške već biva prekinut. Četvrti razlog za završetak je sistemski poziv od strane nekog drugog procesa koji upućuje operativni sistem da prekine neki proces. 2.5.Hijerarhija procesa U nekim sistemima nakon stvaranja child procesa postoji između roditeljskog i kreiranog (child) procesa određena veza. Kad child proces stvara dalje procese stvara se hijerarhija. U UNIX sistemu proces zajedno sa svim child procesima i njihovi child procesima gradi familiju. Nasuprot tome, kod Windows sistema ne postoji procesna hijerarhija, s tim što od verzije Windows 8 postoji hijerarhija grupe procesa koja se zove job. Sistemskim pozivom fork zahtijeva se kreiranje novog procesa. Kada proces koji se trenutno izvodi pokrene novi proces, pokrenuti proces postaje "dijete" procesa "roditelja" koji ga je pokrenuo. Dijete dobija kopije segmenta instrukcija i segmenta podataka od roditelja. U stvari, pošto se segment instrukcija normalno ne mijenja, jezgro može uštedjeti vrijeme i memoriju tako da postavi taj segment kao zajednički za oba procesa (sve dok ga jedan od njih ne odluči inicijalizirati novim programom). Također, dijete nasljeđuje većinu sistemskih podataka od roditelja. Sistemski poziv wait suspenduje izvršenje pozivajućeg procesa dok neki od procesa djece završi (ili bude zaustavljen za vrijeme praćenja). Ponekad je poželjno da roditelj pričeka da dijete završi. Recimo zanima ga sa kakvim exit kodom je proces dijete završio. U Unix sistemima za to služi sistemski poziv wait(). On blokira proces koji ga je pozvao sve dok jedno od njegovih djeteta ne završi. Kada proces dijete završi roditelj preuzme exit kod te obriše proces dijete. Postavlja se pitanje što ako proces dijete završi sa radom a roditelj ga ne čeka sa wait(). Proces dijete neće nestati jer bi se onda izgubili podaci o tome sa kakvim exit kodom je završio. Tada proces dijete postaje zombie proces i ps će za njega pod STAT ispisati Z. Roditelj procesi trebaju počisti zombi djecu za sobom. Ukoliko proces roditelj završi bez wait poziva, njegovu djecu naslijedi init proces (PID=1) koji onda počisti svu zombi djecu koji dobije.

28 Stanja procesa Osim fork i wait još jedna bitna sistemska funkcija je exec(). Pomoću nje proces koji ju pozove prestaje sa izvođenjem trenutnog programa i počinje sa drugim (koji je naveden kao argument). Postoje tri načina kako može završiti proces: pozivom exit, primitkom signala ili padom sistema (nestanak napajanja ili slično). 2.6.Stanja procesa Prilikom izvršenja procesa on mijenja stanja. Stanje procesa se definiše trenutnom aktivnošću procesa. Svaki proces može biti u jednom od sljedećih stanja, koja su prikazana na slici Slika New- novi: proces je upravo kreiran. - Running aktivan (izvršava se): instrukcije se izvršavaju. - Waiting (blocked) čeka (blokiran): proces čeka na pojavu nekog događaja kao što je neka U/I operacija. - Ready spreman: proces čeka da bude dodijeljen procesoru. - Terminated završen: proces je završio izvršenje. NEW READY RUNNING TERMNATED WAITING Slika 14 Dijagram stanja procesa Stanja ready i running su slična, u oba stanja proces je spreman za rad, s tim da mu u stanju ready CPU nije na raspolaganju. Stanje blokiran (waiting, blocked) se razlikuje po tome što proces ne može raditi čak i kad CPU ne bi imala ništa drugo raditi, zato što on čeka na neki vanjski događaj. Kao što vidimo osim kreiranja i završavanja procesa postoje četiri moguća prelaza između stanja procesa. 1. Kad proces primijeti da dalje ne može raditi, jer čeka na neke ulazne podatke ili na U/I operaciju, dolazi do prelaza iz stanja running u stanje waiting. U nekim sistemima proces mora pozvati sistemski poziv block ili pause da se može naći u ovom stanju. Procesi često moraju komunicirati sa ostalim procesima. Jedan proces može kao izlaz dati podatke koje drugi proces koristi kao ulazne podatke. Proces je blokiran ako ne može dalje raditi. Uglavnom se to dešava zbog čekanja na ulazne podatke koji još nisu na raspolaganju. Moguće je da proces bude zaustavljen jer operativni sistem odluči da dodjeli procesor nekom drugom procesu. U Unix sistemu se proces automatski blokira kad čita iz pipe-a ili specijalnih podataka i ne nalazi tamo nikakve podatke. 2. Prelaze iz stanja ready u running završava raspoređivač procesa (engl. scheduler), dio operativnog sistema, a da proces sam to i ne primjećuje.

29 2.7.Prošireni dijagram stanja procesa Jednako kao kod prethodnog prelaza, prelaz iz stanja running u ready završava raspoređivač procesa (engl. scheduler), dio operativnog sistem, a da proces sam to i ne primjećuje. 4. Prelaz iz waiting u ready se dešava nakon nekog vanjskog događaja na koji je proces čekao. U slučaju da u tom trenutku ni jedan drugi proces nije aktivan pokreće se i prelaz iz ready u running i proces dolazi u aktivno stanje. U suprotnom, proces čeka u stanju ready dok ne dođe na red. 2.7.Prošireni dijagram stanja procesa U nekim operativnim sistemima postoji mogućnost privremenog prekida izvršenja procesa (engl. suspend) proces prestaje da se takmiči za resurse. Izvršenje procesa se može suspendovati samo u stanjima wait i ready tako nastaju dva dodatna stanja: suspended- ready (suspendovan u stanju čekanja na procesor) i suspended-wait (suspendovan u stanju čekanja SUSPENDED READY NEW READY RUNNING TERMNATE WAITING SUSPENDED WAIT Slika 15: Prošireni dijagram stanja procesa na resurs). Na proširenom dijagramu stanja se sada nalaze nove tranzicije: - ready - suspended ready: Ovaj prelaz se dešava kada je previše procesa u stanju ready, treba izbjeći zastoj pa korisnik eksplicitno suspenduje proces. - wait - suspended wait Situacija je slična kao u prethodnom slučaju samo je proces bio u stanju wait. - suspended wait suspended ready: Ovaj prelaz se dešava kada se resurs neophodan za dalje izvršenje procesa oslobodi ali proces je i dalje suspendovan. - suspended ready - ready: Ovaj prelaz se dešava na eksplicitni zahtjev korisnika, proces je odmrznut i dovodi se na kraj reda čekanja na procesor. - suspended wait wait: Ova tranzicija se dešava kada je proces odmrznut ali resurs neophodan za njegovo izvršenje nije oslobođen. I ovaj prelaz je moguća samo na eksplicitan zahtjev korisnika. 2.8.Implementiranje procesa Za realizaciju modela procesa, operativni sistem održava tabelu, koja se naziva tabela procesa, i koja po procesu ima jednu rubriku. Ova rubrika sadrži informacije o stanju procesa, programskom brojaču, pokazivaču steka, zauzetosti memorije, stanju njegovih otvorenih podataka, podacima o upravljanju i raspoređivanju i sve druge informacije koje se moraju

30 Redovi raspoređivanja (engl. scheduling queues) snimiti kad proces prelazi iz stanja running u stanje ready ili blocked. Svaka od tih rubrika je u suštini kontrolni blok tog procesa. Tabela se može predstaviti kao niz ili ulančana lista. 2.9.Redovi raspoređivanja (engl. scheduling queues) Sama tabela procesa, međutim, nije idealna struktura za određivanje redoslijeda njihovog izvršavanja, nego se dopunjava ulančanim strukturama podataka koji predstavljaju redove čekanja. Kada proces uđe u sistem stavlja se u red poslova (zadataka). Ovaj red se sastoji od svih procesa u sistemu. Procesi koji se nalaze u glavnoj memoriji su spremni i čekaju na izvršenje, smješteni su u listu označenu kao ready queue. Postoje i drugi redovi u sistemu. Lista procesa koji čekaju na neki uređaj se zove device queue. Svaki uređaj ima svoj vlastit red. Slika 16 prikazuje ready queue i različite device queue. Prvi Zadnji Pokazivač Stanje procesa Pokazivač Stanje procesa Pokazivač Stanje procesa Red čekanja na CPU PCB PCB PCB Prvi Zadnji Red čekanja na modem Prvi Zadnji Red čekanja na disk Pokazivač Stanje procesa... PCB Pokazivač Stanje procesa... PCB Slika 16 Redovi čekanja Uobičajen način predstavljanja kretanja između različitih redova kada se govori o raspoređivanju procesa je dijagram redova kao što je prikazano na slici Slika 17. Svaki pravougaonik predstavlja red. Prisutna su dva tipa redova, red procesa koji su spremni za izvršenje na procesoru (ready queue) i redovi za uređaje. Kružna polja predstavljaju resurse koji služe redovima a strelice nam prikazuju tok procesa u sistemu. Red spremnih procesa CPU Uređaj U/I red U/I zahtjev Isteklo vrijeme Izvršenje procesa Pokreni proces Događaj Čekaj događaj Slika 17 Događaji koji utiču na promjene redova

31 2.10.Raspoređivači 31 Kada je proces aktivan jedan od sljedećih događaja može nastupiti: - ostati bez procesora kada mu istekne vremenski kvantum, - napraviti novi proces i čekati u blokiranom stanju da se novi proces izvrši, - ostati bez procesora kad se dogodi prekid, - postaviti U/I zahtjev, nakon čega se prebacuje u red čekanja na ulazno-izlazni uređaj, tj. postaje blokiran Raspoređivači Proces se tokom svog života u sistemu pomjera između različitih redova. Zadatak operativnog sistema je da na neki način u svrhu raspoređivanja i dodjeljivanja resursa izabere neki proces. Ovo vrši raspoređivač (engl. scheduler). Neki operativni sistemi imaju više vrsta raspoređivača. U batch sistemu često je više procesa nego što može biti izvršeno odmah. Ovi procesi se tipično prebacuju na disk gdje se čuvaju do kasnijeg izvršenja. Dugoročni (engl. long-term) raspoređivač poslova izabira proces, puni ga u memoriju za izvršenje. Kratkoročni raspoređivač poslova (engl. short-term scheduler) bira između procesa koji su spremni za izvršenje i dodjeljuje CPU jednom od njih. Osnovna razlika je u frekvenciji rada ova dva raspoređivača Promjena konteksta (engl. context switch) Prebacivanje CPU na drugi proces zahtijeva snimanje stanja starog procesa i pozivanje snimljenog stanja novog procesa. Ovaj zadatak se zove promjena konteksta. Vrijeme potrebno za promjenu konteksta veoma zavisi od hardverske podrške. Ono podrazumijeva, najjednostavnije rečeno, pomjeranje pokazivača na trenutni skup registara. Ukoliko ima više aktivnih procesa nego registara sistem kopira vrijednosti registara u memoriju. Moderni procesori imaju jedinicu za upravljanje memorijom MMU (engl. memory management unit) koje sprečavaju da neki proces prepisuje adresni prostor drugog procesa. Prebacivanje sa jednog procesa na drugi promjena konteksta znači reprogramiranje MMU da pokazuje na drugi adresni prostor i snimanje podataka o procesu te vraćanje podataka o drugom procesu. Ovo reprogramiranje može da potraje jer je potrebno izvjesno vrijeme da procesorski keševi budu napunjeni novim sadržajima memorijskih lokacija Windows API funkcije za procese Sistemski pozivi u Windows operativnim sistemima, vezani za upravljanje procesima, odlikuju se velikim brojem parametara radi preciznog podešavanja. Za upravljanje procesima najvažnije funkcije su sljedeće: CreateProcess(lpApplicationName, lpcommandline, lpprocessattributes, lpthreadattributes, binherithandles, dwcreationflags, lpenvironment, lpcurrentdirectory, lpstartupinfo, lpprocessinformation) -Kreira novi proces. LpStartup info pokazuje na veliku strukturu koja opisuje dimenzije prozora i oznake ulaza/izlaza CreateProcessAsUser(hToken, lpapplicationname, lpcommandline, lpprocessattributes, lpthreadattributes, binherithandles,dwcreationflags, lpenvironment, lpcurrentdirectory, lpstartupinfo, lpprocessinformation) - Kreira novi proces kao drugi korisnik ExitProcess(uExitCode) Završava trenutni proces GetCurrentProcessId () Dobavlja identifikator trenutnog procesa

32 Unix funkcije za upravljanje procesima OpenProcess(dwDesiredAccess, binherithandle, dwprocessid) Otvara proces i dobija njegov rukovatelj QueryFullProcessImageName( hprocess, dwflags, lpexename, lpdwsize) Saznaje ime procesa iz rukovatelja TerminateProcess(hProcess, uexitcode) Prekida izvršenje drugog procesa EnumProcesses(pProcessIds, warraysize, pbytesreturned) Očitava identifikatore svih procesa Procese je moguće grupisati u veće jedinice, koje se zovu Job. Uz njihovu pomoć je moguće npr. istovremeno prekinuti više procesa. Važnije funkcije za rad s job-ovima su sljedeće. CreateJobObject( lpjobattributes,lpname) -Kreira Job, grupni objekt kojim se može uticati na više procesa OpenJobObject(dwDesiredAccess,bInheritHandles, lpname) -Otvara postojeći Job AssignProcessToJobObject(hJob, hprocess) - Dodaje proces u Job TerminateJobObject( hjob, uexitcode) - Prekida sve procese vezane u Job 2.13.Unix funkcije za upravljanje procesima Dizajn Unix sistemskih poziva za pokretanje i kontrolu procesa je daleko jednostavniji. Funkcije imaju malo parametara. O nekim od njih je već ranije rečeno u ovom poglavlju. Najvažnije funkcije za rad s pojedinačnim procesima su sljedeće. fork(); Kreiraj dijete proces execl( pcpath, pcarg,...); Izvrši program iz datoteke execlp( pcfile, pcarg,...); Izvrši program iz datoteke execv( pcpath, pcargv[]); Izvrši program iz datoteke execvp( pcfile, pcargv[]); Izvrši program iz datoteke waitpid(idpid, pistatus, ioptions); Čekaj završetak procesa exit(istatus); Završi trenutni proces int kill(idpid, isig); Šalji signal procesu unsigned int sleep(uiseconds); Spavaj navedeni broj sekundi int pause(); Čekaj signal unsigned int alarm(uiseconds); Postavi alarm za slanje signala getpid(); Dobavi identifikacjiju procesa getppid(); Identifikacija roditeljskog procesa Može se pristupati i grupama procesa koristeći neke od sljedećih sistemskih funkcija. setpgid(iprocessid, iprocessgroup); Premješta proces u grupu procesa getpgid(iprocessid); Vraća grupu procesa za proces getpgrp(void); Vraća grupu procesa za trenutni proces int kill(iprocessgroup, isignal); Šalje signal grupi, ID grupe mora biti negativan broj 2.14.Programske niti Što više procesa radi,sve je veći udio vremena u kome CPU i operativni sistem vrše promjenu konteksta. Može se čak desiti da se potroši više vremena na promjenu konteksta nego na izvršavanje aplikacija. Za rješenje ovog problema u nekim situacijama uvode se programske niti (engl. threads). Programske niti su kao child procesi, osim što sve programske niti vezane

33 2.14.Programske niti 33 za jedan proces dijele isti adresni prostor. Prednost programskih niti je što je potrebno manje CPU vremena za prebacivanje između programskih niti, nego između procesa, pošto nema potrebe za promjenom adresnog prostora. Programske niti mogu lakše komunicirati međusobno zato što dijele isti adresni prostor. Programska nit je osnovna jedinica korištenja CPU. Programske niti se ponekad nazivaju laki (lightweight) proces LWP. Nit ima svoj programski brojač, skup registara i stek prostora. Svaka nit dijeli sa svojom partnerskom niti kodnu sekciju, sekciju podataka, resurse operativnog sistema. Nit i proces su različiti koncepti i moraju se tretirati odvojeno. Procesi grupišu resurse, niti su osnovni entiteti koji se izvršavaju na CPU. Niti proširuju model procesa za mogućnost istovremenog izvršenja u istom okruženju, sa visokim stepenom nezavisnosti. Termin višestruke niti (multithreading) se koristi da opiše situaciju pri kojoj se dozvoljava više niti unutar procesa. Više niti koje su aktivne paralelno u jednom procesu je analogno sa više procesa koji su aktivni na jednom računaru. U prvom slučaju niti dijele adresni prostor, otvorene datoteke i druge resurse. U drugom slučaju procesi dijele fizičku memoriju, diskove, printer i druge resurse. Zato što niti imaju neke osobine procesa ponekad se zovu lightweight procesi. Process Process Process Process Nit Nit Nit Niti Korisničko područje Korisničko područje Jezgro Jezgro Slika 18 Usporedba procesa i niti Slika 18 na lijevoj strani prikazuje tri tradicionalna procesa. Svaki proces ima svoj adresni prostor i nit izvršenja instrukcija. Na desnoj vidimo jedan proces sa tri niti. Iako u oba slučaja imamo tri niti, u prvom slučaju svaka radi u drugom adresnom prostoru dok u drugom slučaju one dijele jedan adresni prostor. Prelaskom između različitih procesa sistem stvara iluziju odvojenih sekvencijalnih procesa koji rade paralelno. Izmjena niti radi na isti način. CPU se prebacuje između različitih niti stvarajući iluziju niti koji rade paralelno. Različite niti u procesu nisu toliko nezavisne kao različiti procesi. Sve niti imaju isti adresni prostor što znači da dijele i iste globalne varijable. S obzirom da jedna nit može pristupiti svakoj memorijskoj adresi unutar adresnog prostora, ona može čitati ili pisati ili potpuno obrisati stack druge niti. Nema zaštite između niti, jer nije moguća i nije potrebna. Za razliku od različitih procesa koji mogu biti od različitih korisnika, pojedinačni proces uvijek posjeduje jedan korisnik, koji je vjerovatno kreirao višestruke niti izvršenja. Osim dijeljenja resursa, niti dijele i otvorene datoteke, child procese i signale kao što je prikazano na slici. Zato je organizacija na prethodnoj slici Slika 18 lijevo korištena kad procesi nisu povezani dok je na desnoj strani odgovarajuća kad su niti u stvari dio istog posla i aktivno i blisko sarađuju. U sljedećoj tabeli na slici Slika 19 se vidi koji resursi su karakteristični za nit a koji za proces.

34 Upotreba niti Resursi karakteristični za proces Adresni prostor Globalne varijable Otvorene datoteke Child procesi Alarmi Signali i signal obrađivači Accounting informacije Resursi karakteristični za programsku nit Programski brojač Registre Stek Stanje Slika 19 Resursi karakteristični za procese ili niti Elementi prve kolone su karakteristični za proces, a druge kolone za niti. Npr. ako jedna nit otvori datoteku, datoteka je vidljiva ostalim nitima u procesu i one je mogu čitati i upisivati. Kad bi svaka programska nit imala svoj adresni prostor, otvorene datoteke, alarme, i drugo to bi bio odvojen proces. Kao i tradicionalni proces sa samo jednom niti, programska nit može biti u jednom od nekoliko stanja: new, running, blocked, ready, ili terminated. Aktivna nit trenutno posjeduje CPU. Blokirana nit čeka na neki događaj koji će je deblokirati. Npr. kada nit izvodi sistemski poziv za čitanje sa tastature, blokirana je dok se unese nešto na tastaturi. Nit može čekati na neki vanjski događaj da je odblokira ili na neku drugu nit. Prelasci između stanja niti su isti kao između procesa. Svaka nit ima svoj vlastiti stek, kao što je prikazano na slici. Svaki nit poziva različite procedure i ima različitu izvršnu istoriju i zato joj je potreban vlastiti stek. Kada je prisutan multithreading, proces normalno započinje sa jednom niti. Ova nit ima sposobnost da kreira novu niti. Nova nit automatski radi u adresnom prostoru niti koja je kreira. Ponekad niti grade hijerarhiju, sa roditelj - dijete odnosom. Kreiranje i prekidanje niti su slični kreiranju i prekidanju procesa. Za niti je značajno da mogu dobrovoljno predati CPU, jer neki raspoređivači niti ne koriste dijeljenje vremena. Na taj način i druge niti mogu raditi. Mogu postojati pozivi koji omogućavaju nitima da čekaju na neku drugu nit da završi posao, ili da jave da su završili Upotreba niti Nakon što smo objasnili šta su niti, moramo objasniti zašto su potrebne. Osnovni razlog za korištenje niti je da u mnogo aplikacija imamo istovremeno više aktivnosti. Neke aktivnosti se mogu zaustavljati s vremena na vrijeme. Sa razlaganjem takvih aplikacija na višestruke sekvencijalne niti koje rade kvazi-paralelno, programski model postaje jednostavniji. Ovaj argument smo sreli već ranije kod procesa. Sa nitima dodajemo novi element: mogućnost da paralelni entiteti dijele adresni prostor i sve svoje podatke. Ova mogućnost je od velikog značaja za neke aplikacije. Drugi argument za uvođenje niti je taj što one nemaju resursa vezanih za sebe tako da ih je lakše kreirati a i uništiti u odnosu na procese. U mnogim sistemima kreiranje niti ide 100 puta brže u odnosu na kreiranje procesa. Treći razlog u korist niti je takođe vezan za performanse. Ukoliko imamo niti koji dozvoljavaju preklapanje aktivnosti, to ubrzava aplikacije. Konačno, niti su korisne u sistemu gdje postoji više CPU-a, gdje postoji realni paralelizam. Na primjer sabiranje matrica na takvim sistemima se izvršava daleko brže ako se svaki red sabira posebnom niti.

35 2.15.Upotreba niti 35 Kao prvi primjer razmotrimo obradu teksta. Jedan broj programa za obradu teksta prikazuje dokument na ekranu formatiran onako kako će biti prikazan na papiru. Prelom stranice i prelazak u novi red se nalazi na korektnoj i finalnoj poziciji tako da korisnik može pregledati i promijeniti dokument ako je potrebno. Pretpostavimo da korisnik piše knjigu. Za autora je jednostavnije da drži čitavu knjigu u jednoj datoteci, da bi mu bilo jednostavnije da pretražuje po temama, izvodi generalne promjene itd. Alternativa je da je svako poglavlje odvojena datoteka. Međutim držanje svih poglavlja i potpoglavlja u posebnim datotekama nema smisla kad se moraju uraditi globalne promjene na nivou knjige, s obzirom da bi tad trebalo editovati stotine datoteka. Razmotrimo sada šta se desi kada korisnik izbriše jednu rečenicu sa prve strane dokumenta od 800 strana. Recimo da nakon te promjene korisnik želi napraviti drugu promjenu na stranici broj 600, te ukucava komandu koja govori programu da ide na stranicu 600. Program je sad primoran da ponovo formatira sve do 600 strane da bi mogao znati šta se tačno nalazi na toj stranici. Vjerovatno će doći do kašnjenja u izvršenju što dovodi do nezadovoljstva korisnika. Zamislimo da je program za obradu teksta napisan kao program sa dvije niti. Jedana nit komunicira sa korisnicima, a druga vrši formatiranje u pozadini. Čim je rečenica izbrisana sa stranice 1 interaktivna nit kaže niti za ponovno formatiranje da formatira cijelu knjigu. U međuvremenu interaktivna nit nastavlja da osluškuje tastaturu i miša i odgovara na jednostavne komande kako što je scrolling stranice 1, dok u pozadini radi druga nit. Sa malo sreće ovo formatiranje će biti završeno prije nego što korisnik zatraži da vidi stranicu 600, tako da ona istog trenutka može biti prikazana. Zašto ne dodati još niti? Mnogi programi za obradu teksta imaju mogućnost automatskog snimanja podataka na disk svaki par minuta da bi zaštitili korisnika od gubitka podataka koji mogu biti prouzrokovani padom programa, sistema ili nestankom struje. Treća nit se može brinuti za disk backup bez mješanja sa prve dvije niti. Može se dodati i nit koja provjerava pravopis u toku kucanja. Situacija sa četiri niti je prikazana na slici Slika 20. Slika 20 Višenitna obrada teksta Kad bi program bio sa jednom niti, uvijek kad bi se pokrenulo snimanje na disk, komande sa tastature ili miša bile bi ignorisane sve dok se snimanje ne završi. Korisnik bi imao program loših performansi. Alternativno komande sa tastature i miša mogu prekinuti disk backup dozvoljavajući dobre performanse ali vodeći komplikovanom programu kojim se upravlja pomoću prekida. Sa četiri niti programski model je mnogo jednostavniji. Prva nit samo komunicira sa korisnikom. Druga nit preformatira dokument kada mu je to naloženo. Treća nit

36 Upotreba niti periodično upisuje sadržaj RAM-a na disk. Četvrta nit provjerava da li su riječi pravilno napisane. Treba biti jasno da četiri odvojena procesa ne bi funkcionisala ovdje pošto sve četiri niti operišu na istom dokumentu. Time što imamo četiri niti umjesto četiri procesa, one dijele istu memoriju i zato sve imaju pristup dokumentu koji se uređuje. Sada razmotrimo drugi primjer gdje su programske niti korisne: server za World Wide Web site. Zahtjevi za stranicama dolaze na server i zahtijevane stranice se šalju klijentima. Kod većine Web sajtova, obično postoje stranice kojima se češće pristupa. Web serveri koriste ovu činjenicu da poboljšaju performanse, čuvanjem ovakvih stranica u glavnoj memoriji da bi eliminisali potrebu da se one uzimaju sa diska. Takva kolekcija se zove cache i koristi se u mnogim drugim kontekstima. Jedan način za organizaciju servera je prikazan na slici. Ovdje imamo jednu nit dispečer koja čita dolazne zahtjeve iz mreže. Poslije pregledanja zahtjeva, dispečer bira praznu (tj. blokiranu) radnu nit i prosljeđuje joj zahtjev, moguće upisivanjem pointera na poruku u specijalnu riječ povezanu sa svakom niti. Dispečer onda budi uspavanu radnu nit, prebacujući je iz blokiranog u aktivno stanje. Dispatcher nit Worker niti Slika 21 Arhitektura višenitnog web servera Kada se worker probudi, provjerava da vidi da li zahtjev može biti zadovoljen iz Web page keša u kome sve niti imaju pristup. Ako ne može onda započinje read operaciju da dobije stranicu sa diska i ona se blokira dok ova operacija nije završena. Dok je ova nit blokirana operacijom na disku druga nit je izabrana da radi, taj druga nit je vjerovatno dispečer, tako da se završi više posla. Ovaj model dozvoljava serveru da bude konstruisan kao kolekcija sekvencijalnih niti. Dispečer program se sastoji od beskonačne petlje za uzimanje zadataka i predavanje istih workeru. Kod svakog workera se sastoji od beskonačne petlje koja se opet sastoji od prihvaćanja zahtjeva od dispečera i provjere Web keša, da vidi da li je stranica tu prisutna. Ako je tako ona se dostavlja klijentu i thread blokira aktivnost do novog zahtjeva. Ako nije, pribavlja stranicu sa diska, dostavlja je klijentu i blokira rad čekajući na novi zahtjev. Razmotrimo kako bi Web server trebao biti napisan bez niti. Jedna mogućnost je da radi kao jedna nit. Osnovna petlja Web servera dobiva zahtjev, pregleda ga i nastavlja do završetka prije uzimanja sljedećeg zahtjeva. Dok čeka na disk, server je prazan i ne obrađuje ni jedan drugi dolazeći zadatak. Ako Web server radi na dodijeljenoj mašini (koja služi samo za tu svrhu) što je najčešće slučaj, CPU je prazna dok Web server čeka na disk. Rezultat je da puno manje zahtjeva može biti obrađeno. Niti postižu puno bolje performanse a svaka nit je programirana sekvencijalno na uobičajen način. Razlike u performansama između jednonitne i višenitne verzije su uočljive posebno kada odmah poslije zahtjeva za stranicom velikom npr. 1M dođe zahtjev za stranicom velikom 1K. Na jednonitnoj verziji servera, mala stranica bi mogla biti poslana korisniku tek kada je velika obrađena, što bi predstavljalo daleko lošije vrijeme odziva. Do sad smo vidjeli mogući dizajn za višenitni server i jednonitni server. Niti omogućavaju da očuvamo koncept sekvencijalnih procesa, koji pravi blokirajuće sistemske pozive i da pored toga postignemo paralelizam. Blokirajući sistemski pozivi (blocking system calls) olakšavaju programiranje a paralelizam poboljšava performanse.

37 2.16.Implementacija niti u korisničkom prostoru 37 Jednonitni server održava jednostavnost blokirajućih sistemski poziva, ali ima lošije performanse. Proces može biti struktuisan sa ulaznom niti, programskom niti za obradu i izlaznom niti. Ulazna programska nit učitava podatke u ulazni bafer. Nit za obradu uzima podatke iz bafera i obrađuje ih. Izlazna programska nit piše rezultat na disk. Na ovaj način ulaz, obrada i izlaz se mogu dešavati u isto vrijeme Implementacija niti u korisničkom prostoru Postoje dva osnovna načina za implementaciju programskih niti: u korisničkom prostoru i u jezgru. Pored toga postoji i hibridna implementacija. Prvi metod je da se paket programske niti postavi potpuno u korisnički prostor. Jezgro ne zna ništa o njemu. Što se jezgra tiče, to je običan jednonitni proces. Prva i najočiglednija prednost je da programske niti na korisničkom nivou (userlevel thread) mogu biti implementirane na operativnom sistemu koji ne podržava programske niti. Većina operativnih sistema su bili u ovoj kategoriji a neki su još uvijek. Sve ovakve implementacije imaju istu generalnu strukturu koja je ilustrirana na slici Slika 22. Niti rade na vrhu run-time sistema, koji je kolekcija procedura koje upravljaju nitima. Kada se niti nalaze u korisničkom prostoru, svaki proces treba svoju privatnu tabelu niti da čuva zapis o Proces Raspoređivač Korisničko područje programskim nitima procesa. Ova tabela je analogna tabeli procesa osim što ona čuva podatke o osobinama niti kao što su programski brojač niti, stek pointer, registri, stanja itd. Ovom tabelom upravlja run-time sistem. Kada se nit pomjera u aktivno ili blokirano stanje, informacija koja je potrebna za ponovno pokretanje je smještena u tabeli programski niti, na tačno isti način na koji jezgro smiješta informacije o procesima u tabelu procesa. Ako nit uradi nešto što može prouzrokovati da ona bude lokalno blokirana, npr. čekanje na drugu nit u njenom procesu da završi posao, ona poziva run-time sistemsku proceduru. Ova procedura provjerava da li nit mora biti stavljena u stanje blokiranja. Ako je tako snime registre u tabelu niti, traži u tabeli nit koja je spremna na rad, i registre puni sa vrijednostima nove niti. Čim su se stack pointer i programski brojač prebačeni, nova nit automatski oživljava. Ako mašina ima instrukciju da snimi sve registre i drugu instrukciju da ih napuni, sve može biti urađenu u nekoliko instrukcija. Preusmjeravanje niti na ovaj način, je brže nego preskakanje u jezgro, i to je značajan argument u korist programskih niti na korisničkom nivou. Međutim postoji jedna ključna razlika u odnosu na procese. Procedura koja snima stanja niti i raspoređivač su samo lokalne procedure, tako da je pozvati njih efikasnije neko praviti poziv jezgru. Ovo čini raspoređivanje niti veoma brzim. Programske niti na korisničkom nivou takođe imaju i druge prednosti. Dozvoljavaju svakom procesu da ima svoj algoritam raspoređivanja. Za neke aplikacije plus je to što se ne mora brinuti da je nit zaustavljena u nezgodnom trenutku. Jezgro Niti Tabela niti Tabela procesa Slika 22: Niti u korisničkom prostoru

38 Implementacija niti u jezgru Uprkos boljim performansama, programske niti na korisničkom nivou imaju neke velike probleme. Prvi od ovih je kako je blokirajući sistemski poziv implementiran. Zamislimo da nit čita sa tastature prije nego je pritisnuta neka tipka. Dozvoliti niti da pravi sistemski poziv je u stvari nedopustivo, s obzirom da bi to zaustavilo sve niti. Glavna prednost korištenja niti je bila dozvoliti svima da koriste blokirajuće pozive, ali da se spriječi da jedna blokirana nit utiče na druge. Teško je vidjeti kako ovaj cilj može biti postignut sa blokirajućim sistemskim pozivima. Svi sistemski pozivi mogu biti promjenjeni u neblokirajuće (npr. čitanje sa tastature bi samo vratilo 0 bajta ako ni jedan karakter još nije u baferu), ali ovakav zahtjev za promjenama u operativnom sistemu nije atraktivan. Osim toga jedan argument u korist niti na korisničkom nivou je bio da oni mogu raditi sa postojećim operativnim sistemima. Moguća je druga alternativa u slučaju događaja gdje je moguće unaprijed reći da li će poziv blokirati. U nekim verzijama UNIX-a postoji sistemski poziv select koji može reći da li će doći do blokiranja kod budućeg read poziva. Ako je sigurno da read neće blokirati on se izvodi. Ako je će ovaj poziv biti blokiran on se onda ne izvodi. Umjesto toga se pokreće neka druga nit. Sljedeći put kad sistem za raspoređivanje niti dobije kontrolu, može ponovo provjeriti je li poziv read sada siguran. Ovaj pristup zahtijeva ponovno pisanje dijelova biblioteke sistemskih poziva, neefikasan je i neelegantan, ali nema puno izbora. Kod postavljen oko sistemskog poziva da se izvrši provjera, zove se jacket i wrapper. Drugi problem sa nitima na korisničkom nivou je da ako jedna programska nit počne rad ni jedna druga nit u tom procesu neće raditi osim ako prva nit ne prepusti CPU dobrovoljno. Unutar jednog procesa nema prekida na bazi sata, što ne daje mogućnost raspoređivanja na principu da svi dođu na red. Jedino moguće rješenje za niti koje bi vječno radile, je da run-time sistem zahtijeva signal sata (prekid) jednom u sekundi da preda kontrolu, ali i ovo je problematično. Treći, vjerovatno najteži argument protiv niti na korisničkom nivou je da programeri žele niti upravo u aplikacijama gdje one često blokiraju, kao što je višenitni Web server Implementacija niti u jezgru Razmotrimo sada situaciju u kojoj jezgro zna za niti i upravlja njima. Nije potreban run-time sistem kao što se vidi na slici Slika 23. Nema tabele niti u svakom procesu. Umjesto toga jezgro ima tabelu programskih niti koja prati sve niti u sistemu. Kad nit želi da kreira ili da uništi postojeću nit, pravi poziv u jezgro, koje onda kreira ili uništava niti tako što obnavlja njihovu tabelu. Ova tabela niti u jezgru, drži registre niti, stanja, i druge informacije. Informacije su iste kao i kod niti na korisničkom nivou ali se sada nalaze u jezgru a ne u korisničkom prostoru. Ove informacije su podskup informacija koje uređuje jezgro o svojim jedno-nitnim procesima. Osim Proces Korisničko područje Jezgro toga jezgro uređuje tradicionalnu tabelu procesa da sačuva informaciju o procesima. Niti Tabela procesa Tabela niti Slika 23 Implementacija niti u jezgru

39 2.18.Hibridna implementacija 39 Svi pozivi koji bi mogli blokirati niti su implementirani kao sistemski pozivi sa puno većom cijenom nego poziv u run-time sistem proceduru. Kada se nit blokira, jezgro ima mogućnost da pokrene drugu programsku nit iz istog procesa, ako je spremna, ili neku nit iz nekog drugog procesa. Sa nitima na korisničkom nivou, run- time sistem drži aktivnim niti iz vlastitog procesa dok mu jezgro ne oduzme CPU. Zbog relativno veće cijene kreiranja i uništavanja niti u jezgru, neki sistemi recikliraju svoje programske niti. Kad su niti uništene označe se kao not runnable, a na strukturu podataka jezgra ne utiče se na neki drugi način. Kasnije kada se nova nit mora kreirati, stara nit je reaktivirana. Recikliranje je takođe moguće kod niti na korisničkom nivou ali pošto je dodatni rad za upravljanje nitima značajno manji nema puno razloga da se ovo radi. Niti u jezgru ne zahtijevaju nikakve nove neblokirajuće sistemske pozive. Osnovni nedostatak je da sistemski pozivi prouzrokuju veće troškove tako da ukoliko se operacije na nitima (kreacija, prekidanje) često javljaju, nastaće veći dodatni posao Hibridna implementacija Istraživani su različiti načini da se kombinuju prednosti niti na korisničkom nivou sa nitima u jezgru. Jedan način je korištenje programskih niti u jezgru i multipleksiranje korisničkih niti na neke ili sve niti u jezgru kao što prikazuje Slika 24. U ovom dizajnu jezgro je svjesno samo programskih niti u jezgru i bavi sa njihovim raspoređivanjem. Neke od ovih niti mogu imati višestruke niti na korisničkom nivou multipleksirane na njima. Ove niti na korisničkom nivou se kreiraju, uništavaju i raspoređuju kao niti na korisničkom nivou u procesu koji je aktivan u operativnom sistemu koji radi bez više-nitnih mogućnosti. U ovom modelu svaka nit u jezgru ima neki skup niti na korisničkom nivou. Hibridna implementacija pruža tri načina kako se niti u korisničkom prostoru pridružuju nitima u jezgru. U modelu više u jednu (engl. Many-to-one), više korisničkih niti se mapira u jednu nit u jezgru. Upravljanje nitima se odvija na korisničkom nivou. Ako neka niti obavi bilo koji blokirajući sistemski poziv, blokiraće se cio proces, tj. sve niti. Samo jedna nit može pristupati jezgru u jednom trenutku. Kod ovog modela ne može se iskoristiti više-procesorska arhitektura, da se pojedine niti procesa izvršavaju na različitim procesorima. Model jedna u jednu (engl. One-to-one) je karakterističan za Windows NT, Windows 2000/XP/2003 i OS/2. Svaka korisnička nit se mapira u jednu nit u jezgru. Na ovaj način obezbijeđeno mnogo bolje konkurentno Proces Korisničko područje Jezgro izvršavanje niti, a više niti iz jezgra se mogu izvršavati paralelno na višeprocesorskoj arhitekturi. Mana pristupa je što mnogi sistemi ograničavaju maksimalan broj niti jezgra, pa pristup nije dovoljno skalabilan. Model više u više (engl. Many-to-many), znači da se više korisničkih niti mapira se u manji ili isti broj niti jezgra. To je najkompleksniji ali i najkvalitetniji model. Niti Maper Tabela niti Tabela procesa Slika 24 Hibridna implementacija niti

40 Pop-Up niti 2.19.Pop-Up niti Programske niti su često korisne u distribuiranim sistemima. Jedan značajan primjer je kako se upravlja dolazećom porukom koja traži uslugu. Tradicionalni pristup je imati proces ili nit blokiranu na receive sistemski poziv čekajući na dolazeću poruku. Kad poruka stigne on prihvata poruku i obrađuje je. Međutim, moguć je potpuno drugačiji pristup u kome pristizanje poruke uzrokuje da sistem kreira novu nit koja će se baviti porukom. Takava nit se zove popup thread i ilustrovana je na slici. Ključna prednost pop-up niti je da pošto su potpuno nove, nemaju nikave istorije (registri, stekovi itd)., koja mora biti pohranjena. Svaka starta nova i identična je sa ostalim. To nam omogućava brzu kreaciju takve niti. Nova nit je dodjeljena dolazećoj poruci. Rezultat korištenja pop-up niti je da kašnjenje između pristizanja poruke i početka obrade može biti veoma kratko. Za korištenje pop-up niti potrebno je malo planirati. Na primjer, u kom procesu radi nit? Ako sistem podržava aktivnost niti u kontekstu jezgra, nit može tamo raditi. Aktiviranje pop-up niti u prostoru jezgra je obično lakše i brže nago staviti ih u korisnički prostor. Pop-up nit u prostoru jezgra može lako pristupiti tabelama u jezgru i U/I uređajima, što može biti potrebno za obradu prekida Pretvaranje jedno-nitnog u više-nitni kod Mnogo postojećih programa je napisano za jednonitne procese. Konvertovanje ovih u višenitne je mnogo komplikovanije nego što izgleda na prvi pogled. Za početak, programski kod niti se normalno sastoji od višestrukih procedura, upravo kao proces. One mogu imati lokalne varijable, globalne varijable i proceduralne parametre. Lokalne varijable i parametri ne prouzrokuju probleme ali varijable koje su globalne za nit ali ne i za čitav program prouzrokuju. Ove varijable su globalne u smislu da ih mnoge procedure unutar niti koriste, a da ih druge niti ne koriste. Kao primjer razmotrimo errno varijable korištenu u Unix-u. Kada proces ili nit pravi sistemski poziv koji ne uspijeva, kod o grešci se stavlja u errno. Na slici nit 1 izvršava sistemski poziv access da otkrije ima li dozvolu da pristupi određenoj datoteci. Operativni sistem vraća odgovor u globalnoj varijabli errno. Nakon što se kontrola vratila niti 1, ali prije nego što ima šansu da pročita errno, raspoređivač odlučuje da je nit 1 dovoljno errno postavljen Process dugo imao CPU i odlučuje da se prebaci na nit 2. Nit 2 izvršava jedan open poziv koji ne uspijeva, što dovodi do ponovnog upisivanja u errno i access kod niti 1 se gubi zauvijek. Kad nit 1 starta kasnije pročitaće pogrešnu vrijednost i ponašaće se nekorektno. Niti Process Niti Nova nit na poruku Slika 25 Popup niti errno izmijenjen errno pročitan Slika 26 Uticaj niti na globalnu varijablu Nit 1 Nit 2

41 2.21.Windows funkcije za rad s nitima u korisničkom prostoru 41 Različita rješenja ovog problema su moguća. Jedno je da se zabrane globalne varijable potpuno. Koliko god da je ova ideja vrijedna, ona je u konfliktu sa većinom postojećeg softvera. Druga je dodjeljivanje svakoj niti njegove vlastite privatne globalne varijable kao što je prikazano na slici Slika 27. Na ovaj način svaka nit ima svoju privatnu kopiju errno i druge globalne varijable tako da se izbjegavaju konflikti. Ustvari ova odluka kreira novo područje, varijable vidljive svim procedurama niti uz postojeće područje varijabli vidljivih samo jednoj proceduri ili varijable vidljive svuda u programu. Međutim pristup privatnim globalnim varijablama je komplikovana, kako većina programskih jezika ima način izražavanja lokalnih i globalnih varijabli ali ne i neke međuforme. Nit 1 podrućje koda Nit 2 podrućje koda Nit 1 podrućje steka Nit 2 podrućje steka Nit 1 globalni podaci Nit 2 globalni podaci Slika 27 Privatne globalne varijable Moguće je odrediti blok memorije za globalne varijable i onda ove kao dodatne operacije predati niti. Iako ovo nije elegantno rješenje ono funkcioniše. Alternativno bi se mogle uvesti nove bibliotečne procedure za kreiranje čitanje i postavljanje ovih za niti globalnih varijabli Windows funkcije za rad s nitima u korisničkom prostoru Niti u korisničkom prostoru u Windows API se zovu vlakna (fiber). Iako su inferiorne nitima u jezgru (thread), uvedene su radi lakšeg prenošenja aplikacija s drugih operativnih sistema ili pravljenje vlastitog algoritma raspoređivanja. Svako vlakno ima svoju proceduru i dobrovoljno poziva takvu proceduru druge niti pozivom funkcije SwitchToFiber. Slijede važnije funkcije za rad s vlaknima. CreateFiber(dwStackSize,lpStartAddress,lpParameter) - Kreira objekt vlakna (niti koje raspoređuje korisnički program) FiberProc(lpParameter) - Podprogram svakog vlakna SwitchToFiber(lpFiber) - Prelazi na podprogram vlakna DeleteFiber(lpFiber) - Uklanja postojeće vlakno 2.22.Windows funkcije za rad s nitima u jezgru Slijedi nekoliko sistemskih poziva Windows-a za raspoređivanje niti u jezgru. CreateThread(lpThreadAttributes, dwstacksize, lpstartaddress, lpparameter, dwcreationflags,lpthreadid) Kreira programsku nit i vraća rukovatelj na nju ExitThread(dwExitCode) Završava nit koja je pozvala ovu funkciju GetCurrentThread() Vraća rukovatelj na nit koja je pozvala ovu funkciju OpenThread(dwDesiredAccess, binherithandle, dwthreadid) Uzima rukovatelj niti ResumeThread(hThread) Nastavlja suspendovanu nit Sleep (dwmilliseconds) Suspenduje nit na određeno vrijeme SuspendThread(hThread) Suspenduje navedenu nit SwitchToThread() Dobrovoljno predaje izvršenje drugoj niti TerminateThread( hthread,dwexitcode) Prekida navedenu nit

42 Posix niti 2.23.Posix niti Jezgra sistema Unix porodice su različite unutrašnje arhitekture, pa se niti implementiraju kao dodatna biblioteka. Ova biblioteka kasnije može biti implementirana da koristi postojeće niti u jezgru, ili ako jezgro ne podržava niti, onda je implementirana u korisničkom prostoru. pthread_create (pthread, pattr, pstart_routine,parg) Kreira nit pthread_exit (pstatus) Prekida nit koja je pozvala ovu funkciju i prosljeđuje status nitima koje su se povezale na nju pthread_cancel (pthread) Prekida navedenu nit pthread_attr_init (pattr) Kreira objekt s atributima niti pthread_attr_destroy (pattr) Uništava objekt s atributima niti pthread_join (pthreadid,ppstatus) Čeka da se navedena nit završi, oslobodi njene resurse i nastavi izvršenje trenutne niti pthread_detach (pthreadid) Oslobađa resurse završene niti ili najavljuje oslobađanje kada bude završena pthread_attr_setdetachstate (pattr, idetachstate), pthread_attr_getdetachstate (pattr, pdetachstate), pthread_attr_getstacksize (pattr, pstacksize), pthread_attr_setstacksize (pattr, istacksize), pthread_attr_getstackaddr (pattr, ppstackaddr), pthread_attr_setstackaddr (pattr, pstackaddr) Ove funkcije postavljaju ili čitaju atribute niti: stanje oslobađanja resursa, veličinu steka i početnu adresu steka Zadaci Zadatak 1 Funkcija CreateProcess je glavna funkcija Windows API za kreiranje procesa. Unesite program koristeći i snimite ga pod imenom startnotepad.c /* CreateProcess */ #include <windows.h> int main(int argc, char *argv[]){ STARTUPINFO sistartupinfo; PROCESS_INFORMATION piprocessinfo; memset(&sistartupinfo, 0, sizeof(sistartupinfo)); memset(&piprocessinfo, 0, sizeof(piprocessinfo)); sistartupinfo.cb = sizeof(sistartupinfo); if(createprocess("c:\\windows\\notepad.exe", // Application name " example.txt", // Application arguments 0, 0, FALSE, CREATE_DEFAULT_ERROR_MODE, 0, 0, // Working directory &sistartupinfo, &piprocessinfo) == FALSE) // Could not start application -> call 'GetLastError()' return 0;

43 2.24.Zadaci 43 Snimite program, prevedite ga i pokrenite. Potražite više o sistemskom pozivu CreateProcess na Internetu Zadatak 2: Pokrenite konzolu u Linux sistemu, i iz konzole tekstualni editor, na primjer kwrite fork.c Unutar tekstualnog editora unesite sljedeći primjer program. #include <unistd.h> /* Symbolicke konstante */ #include <sys/types.h> /* Primitivni sistemski tipovi */ #include <errno.h> /* Greske */ #include <stdio.h> /* Input/Output */ #include <sys/wait.h> /* Naredbe cekanja */ #include <stdlib.h> /* Opste rutine */ int main() { pid_t dijetepid; /* Ovdje se smjesta identifikator pid */ int retval; /* dijete process: povratni kod */ int status; /* roditelj proces: Izlazni status djeteta */ dijetepid = fork(); /* Kreiranje procesa */ if (dijetepid >= 0) {/* fork uspio */ if (dijetepid == 0) { /* fork() vraca 0 za dijete proces */ printf("dijete: Ja sam dijete proces!\n"); printf("dijete: Ovo je moj PID: %d\n", getpid()); printf("dijete: PID mog roditelja je: %d\n", getppid()); printf("dijete: Kopija dijetepid je: %d\n", dijetepid); printf("dijete: Pauza 1 sekunda...\n"); sleep(1); /* 1 sekunda */ printf("dijete: Unesi izlaznu vrijednost (0 to 255): "); scanf(" %d", &retval); printf("dijete: Gotovo!\n"); exit(retval); /* dijete izlazi s povratnim kodom */ else { /* fork() returns new pid to the roditelj process */ printf("roditelj: Ja sam roditelj proces!\n"); printf("roditelj: Ovo je moj PID: %d\n", getpid()); printf("roditelj: Dijetepid je %d\n",dijetepid); printf("roditelj: Cekam da dijete izadje.\n"); wait(&status); /* Ceka da dijete zavrsi i cuvanje statusa */ printf("roditelj: dijete dalo izlazni kod: %d\n", WEXITSTATUS(status)); printf("roditelj: Gotovo!\n"); exit(0); /* roditelj izlazi */ else { /* fork vrati -1 u slucaj greske */ perror("fork"); /* Poruka o gresci */ exit(0);

44 Zadaci Snimite primjer, napustite editor i prevedite primjer otkucavši u komandnom okruženju: gcc -o fork fork.c Pokrenite primjer otkucavši u komandnom okruženju:./fork Objasnite dobivene vrijednosti. Ponovo pokrenite primjer./fork ali ovaj puta otvorite drugi prozor s komandnim okruženjem. Šta se dešava pri izvršenju komandi ps ps -a ps -A Koristeći naredbu kill zaustavite obije kopije programa fork. Ova komanda kao parametar koristi PID koga vraća komanda ps. Pokrenite komandu top s kojom vidite sve aktivne procese.

45 3.Raspoređivanje procesora 3.1.Uvod u raspoređivanje 45 Kod multi-programiranja, često imamo situaciju da se više procesa natječe za procesor u isto vrijeme. Kada ima više procesa u procesorskom redu čekanja (engl. ready queue) i postoji samo jedan raspoloživ procesor, operativni sistem mora odlučiti koji od procesa da pokrene, odnosno da ga dovede na procesor. Dio operativnog sistema koji pravi ovaj izbor se naziva raspoređivač (engl. scheduler). Pri tome raspoređivač koristi algoritam koji ćemo zvati algoritmom raspoređivanja. Raspoređivanje se odnosi i na procese i na thread-ove. U početku, govorimo o raspoređivanju procesa, a kasnije razmotrićemo neka pitanja u vezi raspoređivanja thread-a. 3.1.Uvod u raspoređivanje U ranim danima, kod batch sistema, sa ulazom u obliku programa na magnetnoj traci, algoritam raspoređivanja je bio veoma jednostavan: samo izvrši sljedeći job na traci. Kod sistema sa dijeljenim vremenom (engl. timesharing sistems), algoritam postaje znatno kompleksniji, jer postoji više korisnika koji čekaju da budu usluženi. Takođe može biti jedan ili više batch procesa. Na personalnom računaru možete pomisliti da samo ima jedan aktivan proces. Međutim, postoje često pozadinski job-ovi, takvi kao što su deamon-i za prijem i slanje elektronske pošte. 3.2.Redovi čekanja procesa Većina raspoređivača odabira proces koji će doći na red za izvršenje gledajući procese raspoređene u neku dinamičku strukturu, kao što su ulančane liste, stabla ili tablice. Elementi tih struktura su kontrolni blokovi procesa ili pokazivači na njih. Te strukture su redovi čekanja. Stanja procesa i njihovi prelazi se preslikavaju u prebacivanje kontrolnog bloka procesa u odgovarajući red čekanja. Tako na primjer, spremni procesi za izvršenje ulaze u red čekanja spremnih procesa (engl. ready queue). Ovaj red čekanja može biti uređen kao ulančana lista. Zaglavlje reda čekanja spremnih procesa sadrži pokazivače na prvi i posljednji PCB u listi. Svaki PCB ima pokazivač koji ukazuje na sljedeći proces u redu čekanja spremnih procesa. Pored ovog reda, postoje i drugi redovi čekanja, poput reda čekanja za Ulaz/izlaz (engl. I/O Queue), reda čekanja na završetak procesa, reda čekanja na slobodnu memoriju itd. 3.3.Ponašanje procesa Gotovo svi procesi se naizmjenično izvršavaju sa U/I zahtjevima, kao što je to prikazano na slici. Tipično, procesor izvršava proces izvjesno vrijeme bez zaustavljanja, a onda, recimo, izda se sistemski poziv za čitanje ili pisanje datoteke. Kada se sistemski poziv završi, procesor nastavlja sa izvršavanjem jer mu treba još podataka, itd. Primijetimo da se neke ulazno izlazne aktivnosti računaju kao izvršavanje na procesoru. Na primjer, kada procesor kopira bite u video RAM da bi ažurirao ekran; ovo nije U/I jer je procesor aktivan. U/I, u pravom smislu, je kada proces ulazi u stanje blokiranja čekajući na eksterni uređaj da završi svoj posao..

46 Kada rasporediti procese Važno je primijetiti na slici Slika 28, da neki procesi kao što je prikazano pod a), troše većinu njihovog vremena na procesoru, dok drugi, tako kao što su prikazani na slici pod b), troše većinu vremena čekajući na izvršenje U/I operacija. Duži procesorski posao Kraći procesorski posao Čekanje na ulaz/izlaz Vrijeme Slika 28 Različita ponašanja procesa vezanih za procesor i procesa vezanih za ulaz/izlaz Ove prve ćemo zvati vezani za procesor a ove druge vezani za U/I. Procesi vezani za procesor, imaju duga vremena izvršavanja na procesoru i rijetka čekanja na U/I, dok procesi vezani za U/I imaju kratka vremena izvršavanja na procesoru, i dakle česta čekanja na U/I. 3.4.Kada rasporediti procese Postoji veliki broj slučajeva u kojima se zahtijeva raspoređivanje. Prvo, raspoređivanje se zahtijeva u dva slučaja: 1. Kada proces završi izvođenje, 2. Kada se proces blokira na U/I ili na semafor. U svakom od ovih slučajeva, proces koji se izvršavao na procesoru, prestaje sa svojim izvršavanjem i mora se izabrati sljedeći proces koji će se dovesti na procesor. Postoje tri druga slučaja kada se raspoređivanje obično izvodi, mada logički nije apsolutno potrebno da se uradi tog trenutka: 1. Kada se novi proces kreira, 2. Kada se desi U/I prekid, 3. Kada se desi prekid sata. U slučaju kreiranja novog procesa, ima smisla da se ponovno preračunaju prioriteti u ovom trenutku. U nekim slučajevima, proces roditelj će moći zahtijevati različit prioritet procesa dijete. U slučaju prekida koji dolazi od U/I uređaja, ovaj prekid obično znači da je U/I završio svoj posao. Poslije tog prekida, proces koji je bio blokiran može se prevesti u stanje spremnih procesa. U slučaju prekida sata, to je prilika da se odluči da li se tekući proces izvršava dovoljno dugo. U odnosu kako rade sa prekidima sata, algoritmi raspoređivanja se mogu podijeliti u dvije kategorije. Kod non-preemptive algoritama raspoređivanja (algoritmi bez istiskivanja) proces se izabere za izvršavanje i pusti se da se izvršava dok se ne blokira (ili zbog U/I ili zbog čekanja na drugi proces) ili dok on dobrovoljno oslobodi procesor (sistemskim pozivom ili završetkom procesa). Kod preemptive algoritma za raspoređivanje izabira se proces za izvršavanje i pusti da se izvršava maksimalno fiksno vrijeme. Ako se još želi izvršavati, na kraju tog vremenskog intervala, proces se skida sa procesora i raspoređivač bira drugi proces za izvršenje (ako postoji). Preemptive raspoređivač zahtijeva da se desi prekid sata, pa kada se proces nađe na kraju vremenskog intervala onda se upravljanje procesorom preda raspoređivaču. Ako prekidi sata nisu raspoloživi, non-preemptive raspoređivanje je jedina opcija.

47 3.5.Dispečer Dispečer Raspoređivanje procesa se obavlja dok se izvršava programski kod jezgra, obično pozvan hardverskim prekidom ili sistemskim pozivom. Nakon što kratkoročni raspoređivač odredi koji se naredni proces izvršava, dispečer prepušta procesor tom procesu. Osnovne funkcije su: Izmjena konteksta, tj. priprema registara i konfiguracije memorije Izmjena iz sistemskog u korisnički način rada Skok na odgovarajuću lokaciju u korisničkom programu Kašnjenje kod izmjene procesa (engl. Dispatch Latency)predstavlja vrijeme da se zaustavi jedan proces i pokrene drugi. To vrijeme kond nekih algoritama raspoređivanja može biti značajan procent ukupnog rada procesora. Stoga, dispečer, koji predstavlja čisti interni rad treba da bude veoma brz. U primjeru kernela u zadnjem poglavlju dispečer je realizovan koristeći setjmp i longjmp podprograme. U njima setjmp čuva neke registre na steku i zapamti mjesto gdje su sačuvani. S druge strane, longjmp kao parametar preuzme mjesto gdje su ti registri sačuvani i preuzme njihovu vrijednost. Izmjena konteksta na 386 i jačim procesorima se obavlja znatno brže zahvaljujući task registru. Procesori na PC računarima mogu obaviti izmjenu konteksta jednom instrukcijom skoka ili pozivom podprograma, ako je u opisu segmenta (o tome u 7. lekciji) segment predstavljen kao task segment. Tada će se snimiti svi registri na lokaciju koju pokazuje skriveni registar TS, u njega upisati nova adresa koja predstavlja adresu skoka i napuniti svi registri sa te adrese. Registri su raspoređeni prema strukturi prikazanoj na slici Slika 29. T S S E S P 0 S S 0 E S P 1 S S 1 E S P 2 S S 2 C R 3 E I P F L A G S E A X E C X E D X E B X E S P E B P E S I Slika 29 Struktura task segmenta na i Kategorije algoritma za raspoređivanje Nije iznenađujuće da se u različitim okruženjima, koriste različiti algoritmi za raspoređivanje. Ovo proizilazi iz činjenice da različite aplikacione oblasti i različite vrste operativnih sistema imaju različite ciljeve. Drugim riječima, ono što raspoređivač treba da optimizira nije isto u svim sistemima. Četiri značajno različita okruženja su: 1. Pozadinsko obavljanje poslova (engl. Batch) 2. Interaktivno 3. Okruženje realnog vremena i multimedijalni sistemi 4. Više-procesorsko okruženje Kod sistema koji obavljaju poslove pozadinski, ne postoji korisnička nestrpljivost čekanja brzog odgovora na njegovom terminalu. Kao posljedica ovog, često su prihvatljivi nonpreemptive algoritmi raspoređivanja kao i preemptive algoritmi raspoređivanja sa dugim vremenskim periodima za svaki proces. Ovaj pristup redukuje izmjene procesa na procesoru i na taj način se poboljšavaju performance (jer ima manje internog rada). U okruženju sa interaktivnim korisnicima, skidanje procesa sa procesora (preemption) je od suštinskog značaja da ne dozvoli jednom procesu da okupira procesor i zabrani servise E D I E S C S S S D S F S G S L D T I O M A P

48 Ciljevi algoritama za raspoređivanje drugim. Čak iako se proces ne izvršava u petlji, zbog programskih bug-ova, jedan proces može izbaciti sve druge veoma dugo. Skidanje procesa sa procesora je potrebno da se spriječi ovakvo ponašanje. U sistemima sa realnim vremenom, skidanje procesa sa procesora je prilično slobodno, ponekad ne treba jer procesi znaju da se ne smiju dugo izvršavati, već urade svoj posao brzo i blokiraju se. Razlika u odnosu na interaktivne sisteme je da sistemi realnog vremena izvršavaju programe čija je namjera isporuka podataka drugim aplikacijama. Interaktivni sistemi su opšte namjene i mogu pokretati programe koji nisu kooperativni ili čak maliciozni. Višeprocesorski sistemi mogu kombinovati različite zahtjeve, npr. da neki procesori u njima koriste algoritme za interaktivne procese, a neki za pozadinske. Ponekad je moguće povećavati brzinu pojedinačnog procesa izvršavajući paralelno njegove niti na različitim procesorima, ali samo do određene granice. 3.7.Ciljevi algoritama za raspoređivanje U cilju projektovanja novog algoritma za raspoređivanje, potrebno je imati pretpostavke šta dobar algoritam bi trebao da uradi. Neki ciljevi zavise od okoline (batch, interaktivni, ili real-time), ali postoje i neki koji su poželjni u svim slučajevima. Neki ciljevi su prikazani u tabeli na slici Slika 30. Za sve sisteme Poštenost daje svakom procesu pošteno dijeljenje procesora Provođenje politike donesena politika se provodi Održavanje balansa održavanje svih djelova sistema zauzetim Pozadinski sistemi (engl. BatchMaksimiziranje propusnosti (engl. Throughput ) job-ova po satu systems ) Vrijeme boravka u sistemu minimizira vrijeme između početka i završetka procesa Interaktivni sistemi Sistemi realnog vremena Iskorišćenost procesora iskorišćenost procesora se održava Vrijeme odgovora - brz odgovor na zahtjeve Korisnikova očekivanja proporcionalna u skladu sa zahtjevima Ispunjavanje deadline-a ne gubeći podatke Predvidivost izbjegava degradaciju sistema kod multimedijalnih sistema Slika 30 Ciljevi algoritama za raspoređivanje U svim okruženjima, poštenost je važna. Procesi koji se mogu porediti bi trebali dobiti i usluge koji se mogu porediti. Dajući jednom procesu mnogo više procesorskog vremena nego drugom sličnom procesu, nije pošteno. Naravno, različite kategorije procesa se mogu tretirati različito. Drugi opšti cilj je održavanje svih djelova procesa zauzetim kada je to moguće. Ako procesor i U/I uređaji mogu raditi cijelo vrijeme, više poslova može biti završeno u jedinici vremena nego u sistemu gdje su komponente nezaposlene. Ako imamo procese vezane za procesor zajedno sa procesima vezanim za U/I u memoriji zajedno, onda je to bolje nego punjenje i izvršavanje procesa vezanih za procesor, i kada oni završe, punjenje i izvršavanje U/I vezanih procesa. Ako se ova strategija koristi, kada se izvršavaju procesi vezani za procesor, oni će se boriti za procesor a disk će biti nezaposlen. Kasnije, kada procesi vezani za U/I uđu u memoriju, oni će se natjecati za disk a procesor će uglavnom biti nezaposlen. Bolje je

49 3.7.Ciljevi algoritama za raspoređivanje 49 održavati cijeli sistem zajedno sa pažljivim miješanjem procesa, kako bi iskoristili nezaposlenosti resursa, u ovom slučaju diska i procesora, i posao završili ranije. Rukovodioci u računarskim centrima velikih firmi izvršavaju mnogo batch poslova, tipično posmatraju tri mjere da bi vidjeli kako njihov sistem funkcionira: propusnost, vrijeme boravka posla u sistemu, i iskorišćenost procesora. Propusnost predstavlja broj poslova koji se završi u jedinici vremena (recimo 1 satu). Kažemo da je propusnost veća ako se završi 50 poslova u nekom vremenskom period od sistema koji to uradi sa 40 poslova u u istom periodu. Vrijeme boravka u sistemu predstavlja srednje vrijeme boravka procesa u sistemu od momenta kada je ušao u sistem do momenta kada završi svoje izvođenje. Algoritam za raspoređivanje koji maksimizira propusnost ne smije nužno minimizirati vrijeme boravka u sistemu. Na primjer, za dati skup kratkih i dugih poslova, ako raspoređivač izvršava kratke poslove i nikad ne izvršava duge poslove može postići izvrsnu propusnost (mnogo kratkih poslova u nekom period vremena) ali na račun ogromnih vremena boravka u sistemu za duge poslove. Ako kratki poslovi stižu konstantnim intenzitetom, dugi poslovi se ne mogu nikada izvršiti, čineći vrijeme boravka u sistemu beskonačnim dok se postiže visoka propusnost. Iskorišćenost procesora je važna kod batch sistema jer je na takvim sistemu procesor izuzetno važan. Rukovodilac računskog centra se osjeća krivim ako mu procesor ne radi cijelo vrijeme. Međutim ovo nije tako važna mjera. Koristeći iskorišćenost procesora kao mjeru je slično kao kod formule 1, koliko obrtaja u minuti može da postigne motor. Za interaktivne sisteme, posebno sisteme u dijeljenom vremenu, različiti ciljevi se postavljaju. Jedan od najvažnijih je minimiziranje vremena odgovora, što predstavlja vrijeme između izdavanja komande i dobijanja rezultata. Na personalnom računaru, gdje se izvršavaju pozadinski poslovi (na primjer, čitanje i spašavanje mail-a iz mreže), korisnički zahtjev za pokretanje programa ili otvaranja datoteke bi trebao imati prednost nad pozadinskim poslovima. Ako imamo da u sistemu interaktivni zahtjevi idu prvi onda se primijeti da sistem ima dobru uslugu Sljedeće pitanje bi se moglo nazvati proporcionalnost. Korisnici često imaju mišljenje (ali često netačno) o tome koliko dugo bi trebalo nešto trajati. Kada neki zahtjev, za koji se zna da traje dugo, korisnici to prihvataju, a kada neki zahtjev za koji korisnici znaju da traje kratko, uzima dugo vremena, to iritira korisnike. Na primjer, klikanjem na ikonu za poziv Interneta koristeći analogni modem traje 45 sekundi da bi se veza uspostavila i korisnici to prihvataju kao činjenicu, tako je i teško se mijenja. S druge strane, ako klikanjem na ikonu za prekid veze, rezultuje trajanjem 45 sekundi, korisnik će poslije 30 sekundi biti veoma ljut. Ovakvo ponašanje je zbog činjenice da korisnik doživljava da je uspostavljanje veze brži proces od raskidanja iste. U nekim slučajevima (takav kao što je ovaj), raspoređivač ne može uraditi ništa u vezi vremena odgovora, ali u drugim slučajevima on može, posebno kada postoji kašnjenje zbog lošeg organizovanja redosljeda procesa spremnih za izvršavanje. Sistemi realnog vremena imaju različite karakteristike u odnosu na interaktivne sisteme, a to znači i različite ciljeve raspoređivanja. Oni se karakterišu činjenicom da rokovi moraju ili bi bar trebali biti postignuti. Na primjer, ako računar kontroliše uređaj koji proizvodi podatke određenim intenzitetom, ne uspije da izvrši proces koji sakuplja podatke može završiti sa gubljenjem podataka. Dakle, glavni zahtjev od sistema realnog vremena je da se poslovi stignu izvršiti na vrijeme, odnosno prije krajnjeg roka kada treba biti završen posao (engl. deadline). U nekim sistemima realnog vremena, posebno onih koji uključuju multimediju, predvidivost je važna. Ako se deadline ne postigne, to ne mora biti fatalno ali će doći do

50 Raspoređivanje na tri nivoa degradacije, recimo zvuka. Video ima slične problem, ali je uho osjetljivije nego oko. Da bi izbjegli ovaj problem, raspoređivanje procesa bi trebalo biti jako predvidljivo i uobičajeno. 3.8.Raspoređivanje na tri nivoa Batch sistemi dozvoljavaju raspoređivanje na tri različita nivoa, kao što je to prikazano na slici Slika 31. Ako poslovi stižu u sistem oni se inicijalno smještaju u ulazni red čekanja smješten na disku. CPU CPU raspoređivač Ulazni red čekanja Pristupni raspoređivač Memorijski raspoređivač Disk Memorija Slika 31 Raspoređivanje na tri nivoa Raspoređivač koji dozvoljava da poslovi mogu ući u sistem, odlučuje koji od poslova da uvede u sistem. Ostali se drže u ulaznom redu čekanja dok se ne izaberu. Tipični algoritam za upravljanje pristupom sistemu bi mogao posmatrati poslove vezane za procesor i poslove vezane za U/I. Alternativni pristup bi bio da kratke poslove prihvata odmah dok bi dugi poslovi mogli da čekaju. Ovaj pristupni raspoređivač (engl. admission scheduler) drži neke poslove u ulaznom redu čekanja i može da dozvoli poslovima koji dođu kasnije da uđu u sistem ako je to njegov izbor. Kada se posao prihvati da uđe u sistem, za njega se kreira proces i on se može natjecati za procesor. Međutim, moglo bi se desiti da je broj procesa tako veliki da za njih nema mjesta u memoriji. U tom slučaju, neke od procesa treba izbaciti na disk (operacija swap out). Drugi nivo raspoređivanja je odlučivanje o procesima koji trebaju ostati u memoriji a koje bi trebalo držati na disku. Ovaj raspoređivač ćemo zvati raspoređivačem memorije, pošto on odlučuje koje procese će držati u memoriji a koje na disku. Ova odluka treba da se inicira često da bi dozvolila procesima na disku da dobiju traženi servis. Međutim, pošto je operacija dovođenja procesa sa diska veoma skupa (čitaj dugo traje), ove odluke ne bi trebalo da se iniciraju duže od 1 sekunde. Ako se sadržaj glavne memorije izmjenjuje često, veliki dio diskovne propusnosti se gubi i na taj način se obaraju performance U/I zahtjeva sa diska. Da bi optimizirali performance u cjelini, memorijski raspoređivač bi mogao željeti da pažljivo odluči koliko procesa želi da ima u memoriji i kakvih procesa. Ova veličina se naziva stepenom multiprogramiranja. Ako on ima informacije o procesima znajući da li je proces vezan za procesor ili za U/I, on može pokušati da održi u memoriji mješavinu i jednih i drugih.

51 3.9.Raspoređivanje u pozadinskim sistemima 51 Kao gruba aproksimacija, recimo ako neka klasa procesa troši 20% vremena, održavajući pet takvih procesa bi ugrubo mogli zaposliti procesor. Da bi napravio odluku, memorijski raspoređivač periodično pregleda svaki proces na disku da bi odlučio da li da ga dovuče u memoriju. Među kriterijima koje može koristiti da bi napravio odluku su sljedeći: 1. Koliko je prošlo vremena od trenutka izbacivanja ili ubacivanja procesa u memoriju? 2. Koliko je procesorskog vremena koristio? 3. Koliko je veliki proces? (s manjim procesima je lakše raditi) 4. Koliko je važan proces? Treći nivo raspoređivanja je preuzimanje jednog od spremnih procesa u memoriju da bi se izvršio sljedeći. Često se ovaj raspoređivač zove raspoređivačem procesora i on je onaj na koji ljudi misle kada govore o raspoređivaču. Bilo koji pogodan algoritam se može koristiti ovdje i preemptive i nonpreemptive. U nastavku će biti prikazana skupina algoritama vezani za ova tri okruženja. 3.9.Raspoređivanje u pozadinskim sistemima Poslije razmatranja opštih pitanja raspoređivanja prelazimo na pojedinačne algoritme raspoređivanja. U ovom dijelu, razmotrićemo algoritme koji se primjenjuju u batch sistemima. U sljedećem dijelu pozabavićemo se interaktivnim sistemima kao i sistemima u realnom vremenu. Ukažimo i na algoritme koji se koriste i u batch i u interaktivnim sistemima FCFS Proces Vrijeme Trajanje Redoslijed Vrijeme u Vrijeme dolaska sistemu čekanja P = =0 P = =21 P = =23 P1 P2 P Srednje vrijeme čekanja (0+21+3)/3=14,669 Slika 32 Algoritam FCFS prvi došao, prvi uslužen Vjerovatno najjednostavniji od svih algoritama za raspoređivanje je nonpreemptive algoritam FCFS (engl. first-come first-served). Kod ovog algoritma, procesi se pridružuju procesoru u redosljedu njihovih zahtjeva. U osnovi, postoji jedan red čekanja spremnih procesa. Kada se prvi proces kreira u sistemu, on odmah dobije procesor i dozvoljeno mu je da ga drži koliko hoće. Ako drugi procesi zatraže procesor, oni se smiještaju na kraj reda čekanja spremnih procesa. Kada se izvršni proces blokira, onda se na procesor dovodi prvi proces iz liste spremnih procesa. Kada blokirani proces postane spreman za izvršavanje (recimo, proces je tražio čitanje datoteke i zbog toga postao blokiran, a kada se čitanje završi on stiče uslove da bude deblokiran), onda se on smiješta u red čekanja spremnih procesa.

52 SJF (Shortest Job First) Na slici Slika 32 prikazana su vremena dolaska i trajanja tri procesa u proizvoljnim vremenskim jedinicama, te Gantov dijagram koji prikazuje kada će se koji proces zaista izvršavati. Zbog dužine procesa P1, procesi P2 i P3 će čekati na izvršenje dosta vremena. Velika vrijednost ovog algoritma je što se lako razumije i lako programira. Pošteno je u istom smislu kupiti karte za koncert čekajući u redu formiranom na FCFS način. Kod ovog algoritma, povezana lista održava evidenciju o svim spremnim procesima. Dovođenje procesa na procesor, predstavlja uklanjanje prvog elementa liste iz reda čekanja spremnih procesa. Dodavanje novog procesa predstavlja se dodavanjem na kraj liste. Šta može biti jednostavnije? Nažalost, FCFS algoritam ima i značajne nedostatke. Pretpostavimo da postoji proces vezan za procesor koji se izvršava 1 sec i mnogo procesa vezanih za U/I koji koriste malo procesorskog vremena ali svaki treba da obavi 1000 operacija čitanja diska da bi završio svoje izvođenje. Proces vezan za procesor se izvršava 1 sekundu a onda čita blok sa diska. Svi drugi U/I vezani procesi sada počnu izvođenje i pokrenu operacije čitanja diska. Kada proces vezan za procesor dobije svoj blok, on se izvrši još 1 sekundu praćen sa procesima vezanim za U/I. Konačan rezultat je da svaku proces U/I vezan dobija da čita 1 blok u sekundi i to će trajati 1000 sekundi da završi. Kod algoritma za raspoređivanje koji bi skidao procese sa procesora svakih 10 msec, U/I procesi bi završili za 10 sekundi umjesto za 1000 sekundi a da ne degradira performance procesa vezanog za procesor značajno. Efekat konvoja se javlja kod ovog algoritma ako se procesi povremeno suspenduju, a različitih su profila. Da se ilustruje ovaj efekat, neka se istovremeno izvršava CPU vezani proces (npr. Inverzija matrice) i U/I vezani procesi (npr. čekanja na unos s tastature). Neka ima n-1 job u sistemu koji su U/I vezani i 1 job koji je CPU vezan. I/O vezani poslovi prolaze brzo kroz red spremnih procesa i suspenduju se sami čekajući na U/I. CPU vezani job stiže na početak reda čekanja i izvršava se do završetka. U/I vezani poslovi ponovno se vraćaju u red spremnih procesa i čekaju dok se CPU vezani job ne završi. Pri tome ne rade ništa, jer čekaju na CPU vezani job. Kada CPU vezani job završi, drugi procesi odrade poslove s procesorom i brzo pređu na čekanje U/I ponovno. CPU postaje nezaposlen SJF (Shortest Job First) A B C D B C D A a) b) Slika 33 SJF (najkraći posao prvi), svi poslovi raspoloživi Sada posmatrajmo drugi, non-preemptive batch, algoritam koji pretpostavlja da su vremena izvršavanja poznata unaprijed. Recimo, u osiguravajućoj firmi, može se pretpostaviti sasvim tačno koliko će trajati izvršenje procesa koji obrađuje 1000 zahtjeva, pošto se sličan posao radi svaki dan. Kada nekoliko jednako važnih procesa se nalazi u redu spremnih procesa čekajući da budu pokrenuti, raspoređivač uzima proces koji će se najkraće izvršavati i dovodi ga na procesor. Na slici Slika 33 imamo 4 procesa A,B, C i D sa vremenima izvršavanja 8, 4, 4, i 4 minuta, respektivno. Ako se počnu izvršavati u ovom redosljedu, ukupno vrijeme boravka za proces A će biti 8 minuta, za B 12 minuta, za C 16 minuta i za D 20 minuta sa srednjom vrijednošću boravka procesa u sistemu od 14 minuta.

53 3.11.SJF (Shortest Job First) 53 Razmotrimo izvršavanje ova 4 procesa koristeći algoritam raspoređivanja SJF, kao što je prikazano na slici pod b). Ukupno vrijeme boravka u sistemu je sada 4, 8, 12, i 20 minuta sa srednjim vremenom boravka od 11 minuta. Za SJF se može dokazati da je optimalan. Razmotrimo slučaj sa 4 procesa sa vremenima izvršavanja a,b,c i d, respektivno. Prvi proces završava u vremenu a, drugi u vremenu a+b itd. Srednje vrijeme boravka u sistemu je (4a+3b+2c+d)/4. Jasno je da vrijeme a doprinosi više srednjoj vrijednosti nego druga vremena, tako da bi on i trebao biti najkraći proces, zatim b, pa c i na kraju d koji ima efekta samo na svoje sopstveno vrijeme boravka. Važno je ukazati na činjenicu da je SJF optimalan samo kada su svi procesi raspoloživi simultano (recimo, svi počinju da se izvršavaju u isto vrijeme). Kao primjer, razmotrimo 2 procesa, P1 i P2, sa vremenima dolazaka 0 i 2 i vremenima izvršenja 10 i 2. Pošto u trenutku 0 je raspoloživ samo proces A, imamo situaciju kao na slici Slika 34, sa srednjim vremenom čekanja 4. Proces Vrijeme dolaska Trajanje Redoslijed Vrijeme u sistemu Vrijeme čekanja P = =0 P = =8 P1 P2 Ali, ako se sačeka dolazak kraćeg posla (P2), imaćemo manje srednje vrijeme čekanja, 2 vremenske jedinice, kao u slučaju na slici Slika 35. Proces Srednje vrijeme čekanja (0+8)/2=4 Vrijeme dolaska Slika 34: SJF, kraći posao došao dok duži još traje Trajanje Redoslijed Vrijeme u sistemu Vrijeme čekanja P = =4 P =2 2-2=0 P2 P Srednje vrijeme čekanja (4+0)/2=2 Slika 35: SJF, raspoloživost procesa u isto vrijeme Dakle, optimalno srednje vrijeme čekanja bi imao algoritam koji daje prednost kraćim poslovima, ali koristio i procesor dok se takvi procesi ne pojave.

54 SRTN 3.12.SRTN Preemptive verzija SJF algoritma predstavljena je algoritmom SRTN (engl. shortest remaining time next). Kod ovog algoritma, raspoređivač uvijek izabira proces čije je preostalo vrijeme za izvršavanje najkraće. I ovdje, vrijeme izvršavanje treba biti poznato unaprijed. Kada novi proces dolazi u sistem, njegovo ukupno vrijeme se poredi sa vremenom preostalim za tekući proces. Ako novi proces treba manje vremena da završi izvođenje od tekućeg procesa na procesoru, tekući proces se skida sa procesora i novi proces započinje izvođenje. Ova shema dozvoljava novim kratkim procesima da dobiju dobar kvalitet usluge. Prethodni primjer sa dva procesa, koristeći ovaj algoritam sada kao na slici Slika 36. Proces Vrijeme dolaska Trajanje Redoslijed Vrijeme u sistemu Vrijeme čekanja P = =2 P =2 2-2=0 P1 P2 P Srednje vrijeme čekanja (2+0)/2=1 Slika 36: Algoritam SRTN, najkraće preostalo vrijeme sljedeće Ovaj algoritam je optimalan i kada procesi nisu raspoloživi simultano. Nažalost, primjenjiv je samo u ograničenom broju slučajeva Raspoređivanje u interaktivnim sistemima U ovom djelu razmatraćemo neke algoritme koji se koriste u interaktivnim sistemima. Neki od njih se mogu koristiti i kod raspoređivača procesora za pozadinske sisteme i sisteme u realnom vremenu. Kod ovih sistema nije moguć raspoređivač na tri nivoa već samo na dva: raspoređivač memorije i raspoređivač procesora. U nastavku se fokusirajmo na algoritme koji se koriste kod raspoređivača procesora Round-Robin raspoređivanje a) b) P1 P2 P3 P4 P5 P2 P3 P4 P5 P1 CPU Red čekanja CPU Red čekanja Slika 37: Princip Round-robin algoritma Jedan od najstarijih, najjednostavnijih i najpoštenijih i široko korišćenih algoritama je round-robin algoritam. Svakom procesu se pridružuje jedan vremenski interval, koji se naziva kvantum, u kome je dozvoljeno procesu da se izvršava.

55 3.15.Prioritetno raspoređivanje 55 Ako se proces još izvršava na kraju kvantuma, proces se skida sa procesora i dovodi se novi proces na procesor. Ako se proces blokirao ili završio izvođenje prije nego što je kvantum istekao, vrši se izmjena konteksta na procesoru i novi proces može dobiti svoj kvantum. Algoritam Round-robin je jednostavan za implementaciju. Svi raspoređivači treba da održavaju listu procesa koji se izvršavaju, kao što je to prikazano na slici Slika 37, pod a). Kada proces iskoristi svoj kvantum, on se postavlja na kraj liste kao što je prikazano na slici Slika 37 pod b). Jedino interesantno pitanje kod round robina je dužina kvantuma. Izmjena procesa na procesoru zahtjeva neko vrijeme za rad, koje se odnosi na neke administrativne poslove, punjenje registara i memorijskih pokazivača procesa, ažuriranje raznih tabela i lista, brisanje i punjenje memorijskog keša i sl. Pretpostavimo da izmjena procesa traje 1 msec a uključuje izmjenu memorijskih pokazivača različitih procesa, brisanje i punjenje keša i sl. Pretpostavimo da je kvantum jednak 4 msec. Sa ovim parametrima, poslije 4 msec korisnog rada, procesor mora potrošiti 1 msec na izmjeni procesa. To znači da će 20% procesorskog vremena biti izgubljeno na izmjeni procesa, što predstavlja značajan gubitak vremena. Da bi povećali efikasnost procesora, trebalo bi postaviti vrijednost kvantuma na, recimo, 100 ms. U ovom slučaju gubitak vremena na procesoru je samo 1%. Razmotrimo šta će se desiti na timesharing sistemima ako deset interaktivnih korisnika pristisnu tipku CR u isto vrijeme. Deset procesa će se smjestiti u listu spremnih procesa za izvršenje. Ako je procesor prazan, prvi će početi odmah da se izvršava, drugi početi 100 msec kasnije itd. Posljednji treba da sačeka 1 sec prije nego što dobije šansu, pretpostavljajući da svi drugi procesi koriste pune kvantume. Većina korisnika bi primijetila da je odgovor za 1 sec trom. Drugi faktor je ako se kvantum postavi na dužinu koja je veća od srednjeg vremena koje procesi provode na procesoru, skidanje sa procesora će se rijetko dešavati. Zaista, većina procesa će izvršiti operacije blokiranja prije nego što kvantum istekne uzrokujući izmjenu procesa. Eliminisanjem skidanja procesa sa procesora se povećavaju performance jer se izmjena procesa dešava samo kad je to logički potrebno, a to je u slučaju blokiranja procesa, jer ne može nastaviti, jer je logički vezan za neki događaj. Zaključak bi se mogao formulisati na sljedeći način: ako se postavlja kvantum veoma malim, to uzrokuje previše izmjena procesa i snižava efikasnost procesora. Ako kvantum postavimo isuviše velikim uzrokuje veoma loš odgovor na kratke interaktivne zahtjeve. Kvantum od 20 do 50 msec je često prihvatljiv kompromis Prioritetno raspoređivanje Round-robin raspoređivanje pretpostavlja unaprijed da su svi procesi jednako važni dajući im jednak kvantum. Često, ljudi koji imaju ili rade na računarima sa više korisnika imaju drugačiji pristup ovom problemu. Na univerzitetu, prihvatljiv redosljed bi bio da prvo dekan ima pristup a zatim profesori, sekretarice i studenti. Pokušaj da se eksterni faktori uzmu u obzir dovodi do prioritetnog raspoređivanja. Osnovna ideja je jasna: svakom procesu se pridružuje prioritet dok proces koji ima najveći prioritet može da se izvršava. Čak i na PC sa jednim korisnikom, mogu postajati višestruki procesi, pri čemu su neki važniji od drugih. Na primjer, deamon proces koji šalje elektronsku poštu u pozadini bi trebao imati niži prioritet nego proces koji prikazuje video sadržaj na ekranu. Da bi spriječili visoko prioritetne procese da se ne izvršavaju beskonačno dugo, raspoređivač smije smanjiti prioritet tekućeg procesa koji se izvršava na svakom prekidu sata. Ako ova akcija prouzrokuje da njegov prioritet padne ispod prioriteta sljedećeg procesa sa

56 Round Robin sa prioritetima najvećim prioritetom, doći će do izmjene procesa. Alternativno, svakom procesu se može pridružiti kvantum u kome se može izvršavati. Kada se kvantum u potpunosti iskoristi, sljedeći najprioritetniji proces se može izvršavati. Prioriteti se pridružuju procesima statički i dinamički. Npr, u komercijalnom računarskom centru, gdje se iznajmljuje vrijeme za obradu, visoko prioritetni poslovi bi mogli koštati 100 dolara za 1 sat, srednji prioritet 75 dolara/sat i niski prioritet 50 dolara/sat. Unix ima komandu nice koja dozvoljava korisniku da dobrovoljno reducira prioritet svog procesa u cilju da bude pažljiv prema drugim korisnicima. Prioriteti se, takođe, mogu dodjeljivati i dinamički da bi se postigli određeni ciljevi. Na primjer, neki procesu su vezani za U/I i većinu vremena troše čekajući na završetak U/I operacija. Kadgod takav proces zatraži procesor, trebalo bi mu dati procesor odmah, da mu se dozvoli da pokrene sljedeći U/I zahtjev koji se može izvoditi paralelno sa drugim procesom koji se nalazi na procesoru. Čineći da procesi vezani za U/I čekaju dugo na procesor dovodi do činjenice da oni nepotrebno zauzimaju i memoriju jako dugo. Jednostavan algoritam koji će dati dobar servis za procese vezane za U/I je postavljanje prioriteta na 1/f gdje je f dio posljednjeg kvantuma koji je proces koristio. Proces koji je koristio 1 msec od 50 msec će dobiti prioritet 50, dok proces koji je koristio 25 msec prije blokiranja će dobiti prioritet 2 a proces koji koristi cijeli kvantum će dobiti prioritet Round Robin sa prioritetima Često je zgodno da se grupa procesa nalazi u klasi prioriteta i koristi prioritetno raspoređivanje među klasama ali round-robin raspoređivanje u svakoj klasi. Na slici Slika 38, prikazan je sistem sa četiri klase prioriteta. Algoritam raspoređivanja radi na sljedeći način: dok god ima izvršivih procesa u prioritetnoj klasi 4, pokreni svaki proces u klasi za kvantum na round robin način, i ne brini o klasama nižeg prioriteta. Ako je prioritetna klasa 4 prazna, onda pokreni procese u prioritetnoj klasi 3 na round robin način. Ako su i klase 3 i 4 prazne, onda koristi klasu 2 na round robin način, itd. Ako se prioriteti ne podešavaju dinamički u skladu sa okruženjem, procesi niže prioritetne klase mogu nikada ne doći na procesor (kažemo gladovati za procesorom do smrti). Zaglavlja Redovi čekanja Viši prioritet Prioritet 1 P2 P3 P4 P5 Prioritet 2 P1 P7 Prioritet 3 P6 P8 P9 Prioritet 4 Niži prioritet Slika 38: Rount robin sa prioriteima MINIX 3 koristi sličan sistem kao na slici Slika 38, mada ima šesnaest prioritetnih klasa u osnovnoj konfiguraciji. MINIX 3 stavlja sljedeće procese u najvišu prioritetnu klasu: U/I drivere, i servere, upravljač memorijom, datotečni sistem i mrežu). Inicijalni prioritet svakog procesa je definisan za vrijeme kompiliranja programa. U/I koji dolazi od sporih uređaja može imati niži prioritet od U/I koji dolazi od brzih uređaja ili čak i servera. Korisnički procesi, u

57 3.17.Višestruki redovi čekanja 57 principu, imaju niži prioritet nego komponente operativnog sistema, ali svi prioriteti se mogu promijeniti u toku izvođenja Višestruki redovi čekanja Jedan od najranijih prioritetnih raspoređivača je bio CTSS. CTSS je imao jedan problem što je izmjena procesa bila vrlo spora jer se na računaru 7094 mogao držati samo jedan proces u memoriji. Svaka izmjena je značila izbacivanje tekućeg procesa na disk i čitanje novog procesa sa diska. CTSS dizajneri su shvatili da da je efikasnije dati procesu vezanom za procesor veliki kvantum jedanput u neko vrijeme nego da mu se daju mali kvantumi često, da bi redukovali operacije izbacivanja procesa na disk i vraćanje novog procesa sa diska (engl. swaping). S druge strane, dajući svim procesima veliki kvantum bi značio slabo vrijeme odgovora, kao što smo ranije primijetili. Njihovo rješenje je bilo da se postave prioritetne klase. Procesi u klasi najvećeg prioriteta su se izvršavali po jedan kvantum. Procesi u sljedećoj najvišoj klasi su se izvršavali po dva kvantuma. Procesi u sljedećoj klasi su se izvršavali po 4 kvantuma itd. Kad god proces iskoristi kvantum u cijelosti on se premješta u klasu koja je ispod. Kao primjer, razmotrimo proces koji treba da se izvršava bez prekida 100 kvantuma. Njemu će inicijalno biti dodijeljen jedan kvantum, a onda će biti izbačen. Sljedeći put će dobiti dva kvantuma prije nego što bude izbačen na disk. U sljedećim pokretanjima dobiće 4,8,16,32 i 64 kvantuma mada je trebao samo 37 kvantuma od ukupnih 64 kvantuma da bi završio svoje izvođenje. U ovom slučaju je potrebno samo 7 izbacivanja na disk umjesto 100 sa čistim round robin algoritmom. Štaviše, što proces tone dublje u prioritetnom redu čekanja, on će se izvršavati još manje frekventno, čuvajući procesor za kratke, interaktivne poslove Raspoređivanje sa više nivoa sa povratnom spregom(engl. Multilevel Feedback Queue(MFQ) Najduži ili najčešći vremenski odsječci Najkraći ili najrjeđi vremenski odsječci Slika 39 Višenivovsko raspoređivanje s različitim vremenskim odsjčcima U tehnici usluživanja sa višestrukim redovima čekanja ne postoji mobilnost procesa između nivoa. To znači da se nadolazeći procesi smještaju u redove čekanja na osnovu unaprijed date klasifikacije i ostaje u ovom redu čekanja dok god postoji. Kod tehnike raspoređivanja MFQ, prioriteti procesa se može mijenjati na osnovu rezultata korišćenja procesora. Procesi koji zahtijevaju više procesor su niži po važnosti dok procesi koji su vezani za ulaz/izlaz i češće oslobađaju prerano procesor blokiranjem, važnost im se poveća.

58 Garantirano raspoređivanje Ova tehnika sprečava umiranje procesa i daje procesima koji su vezani za ulaz/izlaz promjene na osnovu kojih se prosljeđuju procesu preklapajući se sa procesima vezanim za procesor. Pokazuje dobre osobine u borbi sa "konvojskim" efektom. Raspoređivanje među različitim redovima čekanja može se izvesti promjenom dužine ili frekvencije vremenskog odsječka. Raspoređivanje unutar svakog reda čekanja se, takođe, može mijenjati (Slika 39). Mada ova tehnika raspoređivanje zvuči vrlo zgodno, ona je u sušti vrlo kompleksna. Ovaj tip tehnike raspoređivanja je definisan sa slijedećim parametrima: Brojem redova čekanja metodama za raspoređivanje u svakom redu čekanja metodom za raspoređivanje između redova čekanja metodom sa podizanje prioriteta procesu metodom za smanjenja prioriteta procesu 3.19.Garantirano raspoređivanje Potpuno različit pristup kod raspoređivanja je da se daju realna obećanja korisniku o performansama. Jedno od realnih obećanja je: ako postoji n korisnika na sistemu, vi ćete dobiti 1/n procesorskog vremena. Slično, u sistemu sa jednim korisnikom sa n procesa koji se izvršavaju, svaki proces bi mogao dobiti 1/n procesorskog vremena. Da bi kvalitetno obavio svoja obećanja, sistem mora voditi evidenciju kako svaki proces koristi procesor od svog nastanka. Sistem zatim izračunava iznos korišćenog procesorskog vremena za svaki proces dijeleći ga sa n. Pošto je iznos datog vremena poznat onda se izračunava odnos između vremena provedenog na procesoru i vremena datog procesu za obradu. Ako je odnos jednak 0.5 to znači da je proces koristio samo 50% vremena na procesoru u odnosu na vrijeme koje je mogao koristiti. Algoritam traži proces sa najmanjim odnosom dok njegov odnos se ne promjeni tako da bude nešto viši od najbližeg odnosa drugog procesa Lutrijsko raspoređivanje Bilo bi dobra ideja da obećamo korisnicima da znaju kako bi se njihovi procesi mogli izvršavati na procesoru, ali je to teško implementirati. Međutim, može se koristiti drugi algoritam da daje slične predvidive rezultate sa puno jednostavnijom implementacijom. Ovaj algoritam se zove lutrijsko raspoređivanje (engl. lottery scheduling) (Waldspurger and Weihl, 1994). Osnovna ideja je da se procesima daju tiketi za razne sistemske resurse, takve kao što su, recimo procesorsko vrijeme. Kad god odluka o raspoređivanju treba da se napravi, lutrijski tiket se izabira slučajno i proces koji drži taj tiket dobija resurs. Kada se primjeni na raspoređivanje procesora, sistem može imati lutrijski tiket 50 puta u sekundi dok svaki vlasnik tiketa dobija 20 msec procesorskog vremena. Svi procesi su jednaki ali su neki više jednaki više važni procesi mogu dobiti dodatne tikete da bi povećali svoju šansu za dobitak. Ako postoji 100 tiketa za podjelu, i jedan proces drži 20, onda on će on imati 20% šanse da dobije svaki tiket. Na duže staze, dobiće 20 procenata procesorskog vremena. Nasuprot prioritetnom raspoređivaču, gdje je vrlo teško kazati za proces koji ima prioritet 40 šta to znači, ovdje je pravilo jasno: Proces drži dio f tiketa za koje će dobti dio f resursa.

59 3.21. Fair-Share Scheduling 59 Lutrijsko raspoređivanje ima nekoliko interesantnih karakteristika: Na primjer, ako se pojavi novi proces i dobije tikete, do sljedećeg dijeljenja tikete imaće šansu da dobije resurse proporcionalno broju tiketa koje drži. Drugim riječima, lutrijsko raspoređivanje je jako osjetljivo. Kooperirajući procesi mogu izmijeniti tikete ako oni žele. Na primjer, kada proces klijent pošalje poruku server procesu i onda se blokira, on može dati sve svoje tikete serveru da bi povećao šanse da se server počne izvršavati kao sljedeći proces. Kada server završi, on vraća tikete tako da se proces klijent može izvršavati ponovo. Lutrijsko raspoređivanje može se koristiti da razriješi probleme koji su teški da se rade sa drugim metodama. Jedan primjer predstavlja video server u kome nekoliko procesa obrađuje video tokove za njihove klijente ali sa različitim intenzitetom. Pretpostavimo da procesi trebaju tokove sa intenzitetima 10, 20 i 25 okvira/sec. Ako alociramo ovim procesima 10,20 i 25 tiketa respektivno, oni će automatski podjeliti vrijeme na procesoru u približno tačnoj proporciji koja je 10:20:25. Na slici Slika 40 ilustrovano je kako je ovaj algoritam skalabilan. Neka poslovi niskog prioriteta dobijaju po 1 tiket, a poslovi visokog prioriteta po 10 tiketa. Procesa visokog prioriteta Procesa niskog prioriteta %CPU za 1 proces visokog prioriteta ,9 0, Slika 40 Lutrijsko raspoređivanje %CPU za 1 procese niskog prioriteta Fair-Share Scheduling Do sada smo pretpostavljali da je svaki proces raspodijeljen na svoj način, bez posmatranja ko mu je vlasnik. Kao posljedicu ovog pristupa, možemo imati slučaj kada korisnik 1 pokreće devet procesa a korisnik 2 pokreće 1 proces, kod garantiranog raspoređivanja, korisnik 1 dobija 90% procesorskog vremena a korisnik 2 dobija 10% procesorskog vremena. Da bi spriječili ovu situaciju, neki sistemi uzimaju u obzir ko je vlasnik procesa prije raspoređivanja. U ovom slučaju, svakom korisniku se alocira neki dio procesorskog vremena i raspoređivač dodjeljuje procesorsko vrijeme u skladu sa unaprijed pridruženim vremenom za svakog vlasnika. Ako dva korisnika imaju obećanje da će dobiti 50% procesorskog vremena onda će to i dobiti bez obzira koliko jedan korisnik pokrenuo procesa. Na primjer, razmotrimo sistem da dva korisnika, kojima je obećano da će dobiti 50% procesorskog vremena. Jedan korisnik ima 4 procesa, A,B,C i D, a korisnik 2 ima samo jedan proces E. Ako se koristi raspoređivanje tipa round-robin, moguća sekvenca raspoređivanja koja će biti u skladu sa zahtjevima korisnika bi izgledala ovako: A E B E C E D E A E B E C E D E... Ako je korisniku 1 dato 2 puta više vremena neko korisniku 1 onda bi sekvenca izgledala ovako: A B E C D E A B E C D E... Brojne druge mogućnosti postoje i mogu se koristiti u zavisnosti kako ćemo pojam dijeljenja (čitaj poštenosti ) definisati.

60 Raspoređivanje u sistemima realnog vremena 3.22.Raspoređivanje u sistemima realnog vremena U sistemima realnog vremena, vrijeme igra veoma važnu ulogu. Jedan ili više fizičkih uređaja koji su izvan računara djeluju na računar, tako da računar mora da odgovori prema njima unutar fiksnog intervala vremena. Na primjer, računar dobija sa CD diska bite, koji dolaze sa uređaja, i mora ih konvertovati u muziku unutar vrlo malog vremenskog intervala. Ako se ne stigne da odgovori unutar pomenutog intervala vremena to bi moglo imati posljedice na zvuk. Drugi sistemi realnog vremena su, recimo, praćenje pacijenta u bolnici u jedinici intenzivne njege, autopilot u avionu, upravljanje robotom u automatiziranim fabrikama i sl. U svim ovim slučajevima odgovor mora biti na vrijeme, inače neće trebati nikako. Sistemi u realnom vremenu imaju posebne kriterije koje treba poštovati. Determinizam: Ovaj kriterij govori koliko OS kasni sa odzivom prije potvrde interapta ili sistemskog poziva. Operacije se obično obavljaju na fiksnom, predefinisanom vremenu, ili s određenim vremenskim intervalima. Dok se u jednoprocesnom sistemu to vrijeme i može znati za specijalne procese, kada se više procesa takmiči za resurse ili procesorsko vrijeme, nijedan OS neće biti deterministički. Responsivnost: Zajedno s determinizmom određuje vrijeme odgovora na vanjske događaje. Ovo je kritično za sisteme u realnom vremenu koji moraju zadovoljiti vremenske zahtjeve koje daju ljudi, uređaji ili tokovi iz sistema. Ovdje se brine o tome koliko treba nakon potvrde da OS obradi interapt. Korisnička kontrola: Mnogo šira u sistemima realnog vremena nego kod običnih operativnih sistema. Ovdje je bitno da korisnik može fino da podešava prioritete procesa. Korisnik određuje koji procesi su kritični da se moraju izvršiti na vrijeme ili uopšte ne. U ovim sistemima korisnici mogu postaviti i karakteristike poput straničenja, procesa koji su stalno u memoriji, algoritama disk transfera, prava procesa raznih prioriteta: Pouzdanost: Ovo je vrlo važno za sisteme u realnom vremenu. Gubitak ili degradacija performansi može imati katastrofalne posljedice, poput finansijskih gubitaka, oštećenja opreme ili gubitka života. Fail soft operacija: U slučaju pada sistema, sistem treba da padne na takav način da sačuva što više sposobnosti i podataka. Sistem u realnom vremenu je stabilan, ako sistem ispunjava rokove najprioritenijih zadataka, čak i ako neki manje kritični rokovi nisu zadovoljeni Sistemi realnog vremena su svrstani u dvije kategorije: hard real time sistemi, gdje se krajnji odgovori (engl. deadline) moraju postići, i soft real sistemi, nepostizanje krajnjeg odgovora u predviđenom intervalu je nepoželjna ali ipak tolerantna. U oba slučaja, ponašanje sistema realnog vremena se postiže dijeljenjem programa u jedan skup procesa, čije je ponašanje i predvidljivost poznata unaprijed. Ovi procesi su, po pravilu, kratkotrajni i završavaju u vremenima manjim od 1 sec. Kada se desi eksterni događaj, zadatak raspoređivača je da rasporedi procese na takav način da se vremena krajnjih odgovora mogu postići. Događaji na koje mora odgovoriti sistem u realnom vremenu mogu se podijeliti na periodične (koji se dešavaju u pravilnim intervalima) i neperiodični (koji se dešavaju nepredvidivo). Računarski sistem treba da je u stanju da odgovori na višestruke periodične tokove događaja. U zavisnosti koliko vremena svaki događaj zahtijeva za obradu, možda se ne može stići da se obrade svi događaji. Na primjer, ako ima m periodičnih događaja, a događaj i se dešava sa periodom Pi i zahtijeva Ci sekundi procesorskog vremena da bi obradio događaj, n Ci onda se sa ovim opterećenjem može boriti ako važi 1 T i= 1 i

61 3.23.Kategorije algoritama za raspoređivanje u realnom vremenu 61 U sistemima realnog vremena kod kojih se ovaj kriterij postigne (suma svih pojedinačnih odnosa manja je od 1), se kaže da se mogu rasporediti. Na primjer, neka u soft real time sistemu postoje tri periodična događaja, sa periodima 100, 200, i 500 ms respektivno. Ako ovi događaji zahtijevaju 50, 30 i 100 ms procesorskog vremena po događaju, respektivno, sistem ih može rasporediti jer je < 1. Ako se doda četvrti događaj sa periodom od 1 sekunde, sistem ih može rasporediti sve dok ovaj događaj ne bude trebao više od 150 msec procesorskog vremena po događaju. U ovim izračunavanjima se podrazumijeva da je interni rad kod izmjene konteksta je tako mali da se može ignorisati Kategorije algoritama za raspoređivanje u realnom vremenu Algoritmi raspoređivanja u sistemima realnog vremena mogu biti statički i dinamički. Statički algoritmi prave odluke o raspoređivanju prije nego se započne raspodjela. Statičko raspoređivanje radi samo kada postoje informacije raspoložive unaprijed o opterećenju potrebnom da se izvrši i da se postignu ispunjenja krajnjih vremena odgovora. Statički algoritmi mogu biti s statičkim tabelama i preemptivnim algoritmima.. Pristupi s statičkim tabelama imaju već ranije definisano kada se koji proces treba izvršavati. Nakon što se izvede statička analiza izvodivih rasporeda, rezultat je raspored koji određuje kada proces mora početi Statički pristup s preemptivnim algoritmima obavi statičku analizu, ali ne pravi raspored. Analiza se koristi za dodjelu prioriteta, pa se koristi prioritetni preemptivni raspoređivač. Dinamički algoritmi raspoređivanja odluku o raspoređivanju obavljaju u toku rada procesa i takođe se dijele u dvije kategorije, sa planiranjem i s najboljim trudom. Dinamički pristup s planiranjem pri izvršavanju, gledajući zadatke koji su u redovima čekanja, generiše raspored koji odredi kada pokrenuti koji zadatak. S druge strane, dinamički pristupi s najboljim trudom ne vrše analizu izvodivosti, nego sistem proba zadovoljiti sve rokove i prekida pokrenute procese čiji je rok istekao. Algoritmima raspoređivanja u realnom vremenu treba više informacija, nego algoritmima za raspoređivanje u interaktivnim sistemima. O svakom procesu treba čuvati vrijeme kada je proces spreman, kada mora početi, kada mora završiti, koliko mu treba da uradi posao, koji su zahtjevi resursa, prioritet i raspodjela podzadataka Algoritam najraniji rok prvo U ovom algoritmu, procesi koji se mogu rasporediti se raspoređuju tako da se prije izvršavaju oni procesi čiji rok završetka dolazi ranije. Algoritam omogućava da se izvrši veći broj procesa u odnosu na statički definisane prioritete. Ali pri velikom opterećenju, skup procesa čiji uslovi izvršenja neće biti zadovoljeni je teško predvidljiv, što za sisteme u realnom vremenu može biti kobno. Da se uporedi ponašanje ovog algoritma u odnosu na statičke prioritete, posmatraće se dva periodična procesa A i B, pri čemu A dolazi svakih 20 ms, i svaki odsječak traje po 10 ms, dok B dolazi svakih 50 ms i svaki odsječak traje 25 ms. Rokovi procesa su takvi da se obrada odsječka mora završiti prije narednog odsječka. Periodi i rokovi mogu se prikazati tabelom na slici Slika 41.

62 Raspoređivanje monotonom stopom Proces Vrijeme dolaska Vrijeme izvršenja Rok završetka A(1) A(2) A(3) A(4) B(1) B(2) B(3) Slika 41 Primjer rokova kod raspoređivanja u realnom vremenu Dijagrami raspoređivanja za prioritetne algoritme gdje je A ili B većeg prioriteta, odnosno kada se koristi algoritam najranijeg rasporeda prvo, izgledaju kao na slici Slika 42: A(1) A(2) A(3) A(4) A(5) B(1) B(2) Vremena dolaska A(1) B(1) A(2) B(1) A(3) B(2) A(4) B(2) A(5) B(2) Raspoređivanje prioritetnim algoritmom gdje A ima veći prioritet B(1) A(2) A(3) B(2) A(5) Raspoređivanje prioritetnim algoritmom gdje B ima veći prioritet A(1) B(1) A(2) B(1) A(3) B(2) A(4) B(2) A(5) Najraniji rok prvo Slika 42 Poređenje različitih algoritama za raspoređivanje u realnom vremenu 3.25.Raspoređivanje monotonom stopom Sistemi realnog vremena najčešće koriste algoritam kod koga se kraćim procesima ili kraćim odsječcima periodičnog procesa dodjeljuje veći prioritet. Pokazano je da za n periodičnih procesa perioda Ti, od kojih svaki traje Ci vremena, a rokovi su jednaki periodu n Ci n U = n( 2 1) i= 1 Ti važi: Izvodivost se može izračunati gledajući iskorištenje procesora. Pošto je Svi zahtjevi za ispunjenje periodičnih poslova fiksnog trajanja s rokom jednakim periodu se mogu ispuniti kada je iskorištenje sistema za ovakve poslove do 69%. Preostalih 31% se može dodijeliti procesima koji nisu tipa realnog vremena. lim n( n n 2 1) = ln 2 0,69147

63 3.26.Prioritetna inverzija Prioritetna inverzija Procesi treba da dijele resurse da bi komunicirali i obrađivali podatke. Aspekt višenitnog programiranja nije posebno specifičan u sistemima realnog vremena ili embedded sistemima. U bilo koje vrijeme, kad dva procesa dijele resurs, takav kao memorijski bafer, u sistemu koji koristi raspoređivač baziran na prioritetima, jedan od njih će obično imati veći prioritet. Visoko prioritetni procesi očekuju da budu usluženi što je moguće prije, odnosno čim postanu spremni. Međutim, ako proces sa nižim prioritetom koristi njihov dijeljeni resurs kada proritetniji proces postane spreman za izvršenje, onda više prioritetni proces mora čekati da proces koji ima niži prioritet završi sa korišćenjem resursa. Kažemo da prioritetniji proces čeka na resurs. Ako se ovaj proces mora izvršiti za neko određeno vrijeme onda se mora iznaći najgori scenario otključavanja za sve dijeljene resurse i uzeti u obzir prilikom projektovanja. Ako su kumulativna vremena otključavanja velika, shema dijeljenja resursa mora se ponovno projektovati. Mnogi komercijalni operativni sistemi u realnom vremenu (RTOS real time operating system) koriste raspoređivač sa pražnjenjm sa procesora (engl. preemptive). Ovi sistemi pridružuju svakom procesu jednistven nivo prioriteta. Raspoređivač obezbjeđuje da od spremnih procesa koji se nalaze u redu čekanja na procesor, proces sa najvećim prioritetom se izabira i dovodi na procesor. Da bi mogao ispuniti ovu funkciju, raspoređivač mora biti u stanju da skine sa procesora, u proces koji ima niži prioritet u toku njegovog izvršavanja. Zbog toga što procesi djele resurse, događaji koji se dešavaju izvan kontrole raspoređivača mogu spriječiti izvršavanje spremnih procesa visokog prioriteta kad bi trebalo. Ako se ovo desi, proces neće odgovoriti u predefinisanom periodu i doći će do greške. Prioritetna inverzija je termin za scenario u kojem spremni procesi visokog prioriteta ne uspijevaju da se izvrše a trebali bi. Pravi problem nastaje kada proces srednjeg nivoa prioriteta izbaci sa procesora proces koji je nižeg nivoa prioriteta koji koristi, kažemo drži, dijeljeni resurs na koji proces višeg prioriteta čeka. S obzirom da je proces većeg prioriteta spreman da se izvrši a izvršava se proces srednjeg nivoa prioriteta dolazimo do situacije koja se zove prioritetna inverzija. Opisana sekvenca događaja je ilustrovana na slici Slika 43. Proces niskog prioriteta L i visokog prioriteta H djele isti resurs. Pošto L dođe do resursa, proces H postaje spreman da se izvrši. Međutim, proces H mora čekati na proces L da se završi i oslobodi resurs, dakle on čeka na resurs. Prije nego proces L završi sa resursom, proces M postaje spreman da se izvrši i izbacuje L sa procesora proces L. Dok se M izvršava, a možda još procesa tipa M, proces H sa najvećim prioritetom i dalje čeka. Mnoge prioritetne inverzije su bezopasne ili uglavnom uzrokuju kašnjenja procesa koji bi trebali da se izvrše na vrijeme. Ali ponekad se prioritetna inverzija dešava i uzrokuje kritičan rad sistema. Takav događaj se desio na misiji MARS Pathfinder Ova misija je poznata po kolor slikama visoke rezolucije koje su slane na zemlju. H M vrijeme Slika 43: Prioritetna inverzija u RT sistemima

64 Raspoređivanje u multimedijalnim sistemima Istraživači na ovom problemu okrenuli su se ka dva rješenja: Prvo se naziva nasljeđe prioriteta kod koje proces sa nižim prioritetom nasljeđuje prioritet procesa visokog prioriteta koji čeka na dijeljeni resurs. Ovo će se desiti čim proces H počne čekati. Ovaj pristup zahtijeva podršku operativnog sistema. Drugo rješenje, tzv. prioritetni vrh, gdje se pridružuje prioritet svakom resursu. Raspoređivač onda prenosi prioritet resursa na proces koji pristupa resursu. Pridruženi prioritet resursu je prioritet korisnika sa najvećim prioritetom plus jedan. Kada takav proces završi posao njegov prioritet ostaje onakav kakav je bio Raspoređivanje u multimedijalnim sistemima U multimedijalnom svijetu često se koristi video na zahtjev, koji predstavlja mogućnost da potrošači kod kuće odaberu film koristeći svoje daljinske upravljače televizije (ili miš) i da ga prikazuju na svojim TV-u (ili računarskom monitoru) na licu mjesta. Video server je snažan računar koji čuva mnoge filmove u svom sistemu datoteka i izvodi ih na zahtjev. Ponekad se mainframe računari koriste kao video serveri, jer je povezivanje, recimo, 1000 velikih diskova na mainframe jednostavno, dok povezivanje 1000 diskova na običan računar ozbiljan problem. Serveri multimedijalnih datoteka (digitalnih filmova), trebaju da reprodukuju datoteke u predvidljivom vremenskom okviru. Najjednostavnija vrsta video servera je onaj koji može podržati prikaz fiksni broj filmova, gdje svi koriste isti broj kadrova u sekundi, video rezolucije, brzinu prijenosa podataka, i druge parametara. Pod ovim okolnostima, jednostavan, ali efikasan algoritam rasporeda je da za svaki film, postoji jedan proces (ili nit) čiji je posao da čita film iz diska jedan kadar po kadar, a zatim prenosi taj kadar za korisnika. Budući da svi procesi su jednako važni, imaju istu količinu posla po kadru, round-robin raspoređivanje radi posao dobro. Jedini dodatak potreban standardnm algoritmima raspoređivanja algoritama je tajming mehanizam kako bi bili sigurni da svaki proces radi na ispravnoj frekvenciji. Rok za A1 A1 A2 A3 A4 A5 B1 B2 B3 B4 C1 C Rok za B1 Rok za C2 C2 C C3 C vrijeme Slika 44: Vremenski dijagram u multimedijalnim serverima Nažalost, ovaj model se rijetko primjenjuje u stvarnosti. Broj korisnika se mijenja kako gledaoci dolaze i odlaze, a veličina okvira se razlikuje divlje zbog prirode video kompresije, dok različiti filmovi mogu imati različite rezolucije. Kao posljedica toga, različiti procesi mogu da rade na različitim frekvencijama, sa različitim obimom posla, i sa različitim rokovima u kojima rad mora biti završen (Slika 44). Stoga se u ovakvim sistemima koriste algoritmi za raspoređivanje u realnom vremenu. Između dva popularna algoritma, najraniji rok prvo i stopa monotonog rasporeda, ovdje se algoritam najraniji rok prvo pokazuje kao bolji, jer ima bolju propusnost, iako slabiju predvidivost.

65 3.28.Raspoređivanje niti Raspoređivanje niti Kada se izvršava nekoliko procesa od kojih svaki ima po nekoliko niti, onda postoje dva nivoa paralelizma: procesi i niti. Raspoređivanje u takvim sistemima se značajno razlikuje u zavisnosti da ili su podržane niti u korisničkom prostoru, niti u jezgru ili obje vrste niti. Niti u korisničkom prostoru: Pošto jezgro nije svjesno postojanja niti, ono radi, kao što uvijek radi, uzimanjem procesa, recimo A, i davanjem procesora u dužini njegovog kvantuma. Raspoređivač niti, koji se nalazi unutar procesa A odlučuje koju nit da pokrene, recimo A1. Pošto ovdje nema prekida sata za višestruke niti, ova nit može nastaviti izvršavanje toliko dugo koliko hoće. Ako iskoristi cijeli kvantum procesa onda će kernel izabrati drugi proces i dati mu procesor. Kada se proces A na kraju ponovno pokrene, nit A1 će nastaviti izvršavanje. Ona će nastaviti da troši cijelo dodijeljeno vrijeme procesu A sve dok ne završi. Međutim, njeno sebično ponašanje neće imati efekta na druge procese. Oni će kad tad dobiti odgovarajući dio vremena za procesor bez obzira šta se dešava unutar procesa A. Razmotrimo slučaj kada niti procesa A imaju malo posla da izvrše na procesoru, na primjer 5 msec rada unutar 50 msec kvantuma. Kao posljedica ovog, svaka nit se izvršava i po završetku predaje procesor ka raspoređivaču niti. Ovo bi moglo voditi sekvenci izvršavanja A1, A2, A3, A1, A2, A3, A1, A2, A3, A1, prije nego što kernel ne izvrši izmjenu na proces B. Ovo je ilustrirano na slici Slika 45. A1 A2 A3 A1 A2 A3 A1 A2 A3 A1 B1 B2 B3 B1 B2 B Slika 45: Moguća sekvenca izvršavanja niti pri raspoređivanju u korisničkom prostoru Algoritam za raspoređivanje koji se koristi u run/time sistemima može biti bilo koji od onih pomenutih ranije. U praksi, round-robin raspoređivanje i prioritetno raspoređivanje su načešći. Jedino ograničenje je odsustvo sata koji bi poslužio za prekid niti koji se izvršava isuviše dugo. Niti na nivou jezgra: Ovdje kernel preuzima pojedinačnu nit da bi je izvršio. On ne treba da uzima u obzir kojem procesu nit pripada, ali može ako želi. Nit dobija kvantum i ako se istroši ona se nasilno prekida. Sa kvantumom od 50 msec i niti koja se blokira svakih 5 ms, redoslijed niti, za neki period od 30 ms, bi mogao izgledati ovako: A1, B1, A2, B2, A3, B3, što nije moguće sa ovim parametrima i nitima na korisničkom nivou. Ova situacija je opisana na slici Slika 46 b. a) A1 B1 A2 B2 A3 B3 A1 B1 A2 A1 B2 A3 B3 A1 B1 A b) A1 A2 A3 A1 A2 A3 A1 A2 A3 A1 B1 B2 B3 B1 B2 B Slika 46 Moguće sekvence izvršavanja niti kod raspoređivanja u jezgru Glavna razlika između niti na korisničkom nivou i niti na nivou jezgra su performanse. Izvršavajući izmjenu niti u korisničkom prostoru potrebno je izvršiti određen broj mašinskih instrukcija. Promjena niti u jezgru traži punu izmjena konteksta, promjenu memorijske mape, označavanje keša nevažećim i nekoliko je stepena sporija. S druge strane, kod niti u jezgru, postoji blokiranje niti na U/I operaciju koja ne blokira cijeli proces kao što se to radi kod korisničkih niti.

66 Uvod u raspoređivanje procesa kod UNIX-a 3.29.Uvod u raspoređivanje procesa kod UNIX-a Interesantno je vidjeti kako izgledaju ove tehnike u jednom stvarnom operativnom sistemu, kao što je UNIX. Ovakva tehnika raspoređivanja se koristi, sa malim varijacijama, kod AT&T SVR3 i 4.3BSD. Noviji UNIX sistemi koriste nešto složenije pristupe. Prioriteti. Raspoređivanje u UNIX sistemima je bazirano na prioritetima. Prioritet procesa može biti od 0 do 127 pri čemu niži broj označava viši prioritet. Postoje opsezi prioriteta tako da prioriteti od 0-49 predstavljaju prioritete sistemskih procesa. I korisnički i sistemski procesi mogu imati prioritet unutar punog opsega prioriteta. Ovo sprečava da korisnički procesi mogu biti ugroženi sistemskim procesima. Parametri. Procesi variraju prioritet raspoređivanja koristeći nekoliko faktora. Ovi faktori su smješteni u strukturi proc koja sadrži slijedeća polja: p_pri - tekući prioritet raspoređivanja p_uspri - prioritet procesa u korisničkom načinu rada p_cpu - mjera korišćenja procesora p_nice - korisnički podatak koji govori o važnosti procesa Podizanje prioriteta u sistemskom načinu rada. Podatak p_pri predstavlja broj u opsegu od koji predstavlja prioritet procesa. Ovo je vrijednost koju raspoređivač koristi da bi izabrao proces koji će proslijediti na procesor. Ova vrijednost je ista kao p_usrpri. Međutim, ova vrijednost može biti manja čineći na taj način proces važnijim, tačnije prioritetnijim u trenutku kada proces izvodi sistemski poziv. Tradicionalni UNIX sistem nema kernel sa mogućnošću prekidanja. Ovo bi moglo da znači da bi samo jedan proces mogao biti u sistemskom stanju. Ako je proces blokiran, dok izvodi sistemski poziv, drugi korisnički procesi bi se mogli izvršavati ali ne i drugi sistemski pozivi i funkcije. Iz ovih razloga, proces koji je blokiran dok izvodi sistemski poziv često bi mogao imati vrijednost p_pri nisku kako bi što prije završio svoj posao u kernelu i vratio se u korisnički način rada. Ovo dozvoljava drugim procesima koji su blokirani po ulasku u kernel da počnu napredovati u izvršenju. Kada se završi izvođenje sistemskog poziva onda se vrijednost p_pri procesa ponovno postavi na vrijednost p_usrpri. Prioritet korisničkih procesa. Prioritet koji proces dobija unutar kernela poslije povratka iz reda čekanja blokiranih procesa se naziva prioritet spavanja (engl. sleep priority). Postoje različite veličine ovog prioriteta koje se mjenjaju u zavisnosti od uslova blokiranja. Na primjer, kod terminalskog ulaza/izlaza je 28 a za ulaz/izlaz sa diska je 20. Prioritet raspoređivanja procesa u korisničkom načinu rada zavisi od tri faktora: standarni, unaprijed definisani, priorite za korisnički način rada, PUSER je tipično jednak 50. Dosadašnje korišćenje procesora, p_cpu Vrijednost pridružena procesu, p_nice Vrijednost p_usr je poznata sistemu i u najviše implementacija je jednaka 50 i ukazuje na najveći nivo raspoređivanja za korisničke procese. Vrijednost p_nice je predefinisana sa 0, ali je korisnik može povećati. Prisjetimo se da procesi koje treba rasporediti na procesor su inverzno proporcionalni prioritetu. Povećavanjem vrijednosti p_nice proces smanjuje svoju vjerovatnoću da bude izabran. Procesi to rade ako se dugo izvršavaju ili su neinteraktivni pozadinski procesi. Vođenje evidencije o korišćenju procesora, Vrijednost koja se nalazi u p_cpu je mjera korišćenja procesora do trenutka posmatranja. Vrijednost joj može biti u opsegu od 0 do 127

67 3.30.Raspoređivanje u više-procesorskim sistemima 67 i inicijalno je postavljena na 0. Svake desetine sekunde, servisna rutina prekida koja radi sa prekidima sata realnog vremena uveća za jedan vrijednost p_cpu za tekući proces. Svake 1 sekunde druga servisna rutina smanjuje vrijednost p_cpu svih procesa koji se izvršavaju ili ne. Kod SVR3 sistema ovdje se koristi fiksno smanjenje vrijednosti za 0.5. Problem sa fiksnim smanjenjem je da to podiže prioritet gotovo svim procesima ako je opterećenje sistema veliko, pošto samo nekoliko procesa dobija procesor. Ovo dovodi do situacije da je polje p_cpu beznačajno. Projektanti 4.3BSD razriješili su ovaj problem uvođenjem varijabilnog smanjenja (engl. decay) koji je u funkciji srednjeg sistemskog opterećenja, srednjeg broja procesa u redu spremnih procesa u toku posljednje sekunde. Formula izgleda ovako: Decay_factor = (2 * load_average)/( 2 * load_average + 1) Formula za prioritet procesa u korisničkom načinu rada Raspoređivač izračunava prioritet korisničkih procesa na osnovu sljedećih faktora: P_usrpri = PUSER + (p_cpu/4) + (2 * p_nice) 3.30.Raspoređivanje u više-procesorskim sistemima Stalna želja za povećanjem brzine računara se dugo zadovoljavala povećanjem frekvencije računara uz smanjenje broja ciklusa po instrukciji. Ali brzina svjetlosti, koja definiše i brzinu struje u provodnicima ili svjetlosti u optičkom vlaknu na oko 2 cm/ns određuje da na 10GHz frekvenciji u jednom ciklusu signal može da pređe samo 2cm, što bi značilo da kompjuter treba biti te veličine da dimenzije najduže staze ne mogu prelaziti 1 cm, samo da signal ode i vrati se u jednom otkucaju sata. Izrada ovako malog kompjutera može biti moguća, ali onda se dešava još jedan fundamentalni problem: rasipanje topline. Što se brže pokreće računar, više zagrijavanja se stvara, a za manji kompjuter je teže da se riješi ova vrućina. Već na Pentium sistemima CPU hladnjak je veći od samog procesora. Jedan od pristupa za veću brzinu je kroz masovno paralelna računala. Ove mašine sastoje od mnogo procesora, od kojih svaki radi na "normalnom" brzinom (šta god to može značiti u datoj godini), ali koje kolektivno imaju daleko više računarske snage nego jedan CPU. Visoko paralelni kompjuteri se često koriste za probleme kao što su predviđanje vremena, modeliranje strujanja vazduha oko avionskog krila, simuliranja u svjetskoj ekonomiji, itd Klasifikacija više-procesorskih sistema Više-procesorske sisteme možemo podijeliti u tri klase. 1) Labavo vezani ili distribuirani multiprocesor ili klaster. Sastoji se od relativno autonomnih sistema, svaki procesor ima vlastitu glavnu memoriju i UI kanale. Ovi sistemi su bazirani na računarskim mrežama i poslovi raspoređivanja se svode na na algoritme raspoređivanja jednog procesora, ali više pitanja ima oko među-procesne komunikacije i sinhronizacije. 2) Funkcionalno specijalizovani procesori. Kod ovih sistema, glavni procesor opšte namjene kontroliše specijalizovane procesore koji mu pružaju usluge. Na primjer, postoje procesori za operacije u pokretnom zarezu, 3D grafiku, očitavanje tastature, generisanje zvuka. Ovi procesori dijele memoriju i U/I kanale s glavnim procesorom, ali način komunikacije s njima ide kao s svakim ulazno-izlaznim uređajem 3) Blisko vezani multiprocesori. Sastoji se od skupa procesora koji dijele zajedničku memoriju i pod udruženom kontrolom OS. Ovi procesori izvršavaju programe opšte namjene i o njihovom raspoređivanju biće riječi u ovom poglavlju.

68 Sinhronizacija i granularnost procesa 3.32.Sinhronizacija i granularnost procesa Ponašanje algoritama za raspoređivanje u više-procesorskim sistemima zavisi od toga koliko često treba obavljati sinhronizaciju između procesa. U tabeli na slici Slika 47 je pokazano nekoliko nivoa granularnosti. Granularnost Opis Sinhronizacijski interval (instrukcije) Fina Paralelizam u jednom toku instrukcija <20 Srednja Paralelizam unutar aplikacije Gruba Multiprocesiranje konkurentnih procesa Vrlo gruba Distribuiranje procesa kroz mrežu da se formira jedinstveno računsko okruženje Nezavisna Više nevezanih procesa Neprimjenjivo Slika 47 Stepeni granularnosti procesa 3.33.Dodjela procesa procesorima Ako pretpostavimo da je arhitektura multi-procesorskih sistema uniformna, u smislu da nijedan procesor nema posebnu prednost u pristupu glavnoj memoriji ili I/O uređajima, onda je najjednostavniji pristup raspoređivanju da se tretira procesor kao objedinjeni resurs i dodijele procesima procesori na zahtjev. Tada se postavlja pitanje da li zadatak treba biti statički ili dinamičke. U statičkom pristupu, proces je trajno dodijeljen jednom procesor od pokretanja do njegovog završetka, a zatim namjenski kratkoročni red čekanja se održava za svaki procesor. Prednost ovog pristupa je da može biti manje posla oko raspoređivanja, jer je zadatak procesoru dodijeljen jednom i za sve. Također, namjensko korištenja procesora omogućava strategiju poznatu kao grupni ili družbeni raspored, kao što je objašnjeno kasnije. Nedostatak statičkog dodjeljivanja je da jedan procesor može biti u stanju mirovanja, sa praznim redom čekanja, dok drugi procesor ima veći red čekanja. Da bi se spriječila ova situacija, može se koristiti zajednički red čekanja. Svi procesi idu u jedan globalni red i trebalo bi da su svi procesori dostupni. Tako, za života procesa, proces može biti izvršen na različitim procesorima u različitim vremenima. U tijesno povezanoj arhitekturi s zajedničkom memorijom, informacije o kontekstu za sve procese će biti na raspolaganju svim procesorima, a samim tim i troškovi zakazivanja procesa će biti nezavisni od identiteta procesora na kojem su planirani. Pored ovoga, druga opcija je dinamičko balansiranje opterećenja, u kome se procesi sele iz reda za za jedan procesor u red za drugi procesor. Bez obzira da li procesi su posvećeni procesoru, neki način je potreban za dodjelu procesa procesorima. Dva pristupa se koriste: master/slave i simetrični. Sa master/slave arhitekturom, ključne funkcije jezgra operativnog sistema uvijek rade na određenom procesoru. Drugi procesori mogu izvršiti samo korisničke programe. Master je odgovoran za zakazivanje poslova. Kada je proces aktivan, ako slave treba uslugu ( npr. U/I poziv ), mora poslati zahtjev prema master procesoru i čekati da se obavi usluga. Ovaj pristup je vrlo jednostavan i zahtijeva malo poboljšanje u jedno-procesorski operativni sistem. Rješavanje sukoba je pojednostavljeno jer je jedan procesor ima kontrolu nad svim memorijskim i U/I resursima. Postoje tri nedostatka ovog pristupa: Kvar na masteru ruši čitav sistem, na sistemima s većim brojem procesora master može postati usko grlo, a kada je broj procesora razmjerno mali, master procesor je nedovoljno iskorišten jer ne izvršava korisničke programe.

69 3.34.Raspoređivanje procesa na pojedinačnom procesoru u više-procesorskim sistemima 69 U simetričnoj arhitekturi, kernel se može izvršiti na bilo kom procesoru, i svaki procesor radi samostalno raspoređivanje iz skupa raspoloživih procesa. Ovaj pristup komplicira operativni sistem. Operativni sistem mora osigurati da dva procesora ne biraju isti proces i da se procesi nisu nekako izgubili iz reda. Moraju se uvesti tehnike za razrješavanje sukoba i sinhronizaciju konkurentnih zahtjeva za resursima. Postoji, naravno, spektar pristupa između ova dva ekstrema. Jedan od pristupa je da se više procesora posveti izvršenju jezgra umjesto samo jednog. Drugi pristup je jednostavno upravljati razlikom između potreba procesa za drugim procesorima na osnovu prioriteta i istorije izvršenja Raspoređivanje procesa na pojedinačnom procesoru u više-procesorskim sistemima Kada je svaki proces statički dodijeljen procesoru za vrijeme svog izvršenja, postavlja se novo pitanje: Da li da se procesor multiprogramira? Prva reakcija čitatelja može biti da se pita zašto se to pitanje treba postaviti, čini se posebno rasipno vezati procesor sa jednim procesom kada taj proces može često biti blokiran dok čeka I/O ili sinhronizaciju. U tradicionalnim multiprocesorskim sistemima, koji se bavi krupnom ili nezavisnom granularnosti sinhronizacije, jasno je da bi svaki pojedinačni procesor trebao biti u mogućnosti da pokrene više procesa za postizanje većeg korištenja i stoga boljih performansi. Međutim, za srednje granularne pokrenute aplikacije na više-procesorskim sistemima sa mnogim procesora, situacija je manje jasna. Kada je dostupno mnogo procesora, više nije najvažnije da svaki procesor bude zauzet što je više moguće. Umjesto toga, interes je da se pružaju najbolje performanse, u prosjeku za aplikacije. Aplikacija koja se sastoji od više niti može se izvršavati loše, osim ako sve njene niti dostupne za izvršenje istovremeno. Pitanje koje se odnose na multiprocesorsko raspoređivanje je stvarni izbor procesa za pokretanje. Na jedno-procesorskim sistemima, upotreba prioriteta ili sofisticiranih algoritama raspoređivanja na osnovu prethodnog korištenja može poboljšati performanse u odnosu na jednostavnu FCFS strategiju. Kada uzmemo u obzir više procesora, te složenosti mogu biti nepotrebne ili čak kontraproduktivne, i jednostavniji pristup može biti efikasniji s manje nepotrebnog posla. To je zato što duži procesi na više-procesorskom sistemu čine FCFS manje zagušujućim, jer procesi koji čekaju na završetak dužih procesa mogu dobiti i drugi procesor. U slučaju rasporeda niti, nova pitanja dolaze u igru koja mogu biti važnija od prioriteta ili istorije Raspoređivanje niti u više-procesorskim sistemma Kao što smo vidjeli, sa teme, koncept izvršenja niti je odvojen od ostatka definicije procesa. Aplikacija može biti implementirana kao skup niti, koje sarađuju i izvršavaju se istovremeno u istom adresnom prostoru. Na jednom procesoru, niti se mogu koristiti kao pomoć struktuiranju programa i da se preklapa I/O sa obradom. Zbog minimalne cijene prebacivanja niti u odnosu na prebacivanje procesa, ove prednosti su ostvarene sa malo troškova. Međutim, prednosti niti postaju evidentne u više-procesorskim sistemima. U takvom okruženju, niti se mogu koristiti za eksploataciju pravog paralelizma u aplikaciji. Ako razne niti aplikacije se istovremeno izvršavaju na posebnom procesorima, dramatični dobici u performansama su mogući. Za raspoređivanje niti na više-procesorskim sistemima, koristi se više pristupa kao što su podjela opterećenja, družbeno raspoređivanje, dodjela posvećenog procesora i dinamičko raspoređivanje

70 Podjela opterećenja 3.36.Podjela opterećenja Ovo je najjednostavniji pristup, direktno prenesen iz jedno-procesorskog okruženja. U jednom zajedničkom redu čekanja nalaze se sve niti i redom dodjeljuju pojedinom procesoru kada god on postaje slobodan. Mogu se koristiti algoritmi poput FCFS prvo najmanji broj niti preemptivno prvo najmanji broj niti Prednosti ovog pristupa je što je opterećenje ravnomjerno raspoređeno između procesora i nije potreban organizovan raspoređivač. Mane pristupa su što centralni red čekanja zauzima dio memorije koji zahtijeva uzajamno isključenje, što može voditi do uskih grla. Dalje, zaustavljene niti nakon reaktiviranja rijetko nastavljaju na istom procesoru, čime je manja efikasnost njegovog memorijskog keša. Konačno, ako sve niti pripadaju istom nizu niti, malo je vjerovatno da će sve one dobiti pristup procesorima u isto vrijeme. Tada, ako je potrebna saradnja između niti izmjena konteksta može znatno pokvariti performanse Družbeno raspoređivanje Družbeno raspoređivanje (gang scheduling) je istovremeno raspoređivanje niti koje čine jedan proces. U odnosu na podjelu opterećenja, pristup ima više prednosti: manje blokiranja i sinhronizacije, manje izmjena procesa, manje posla kod raspoređivanja, poboljšane performanse. Algoritam je koristan za srednje i grubo granularne aplikacije, čiji jedan dio se ne izvršava kada je drugi spreman za rad. Ovaj pristup zahtijeva alokaciju procesora. Pretpostavimo da imamo N procesora i M aplikacija, od kojih svaka ima N ili manje niti. Tada se obično daje svakoj aplikaciji 1/M raspoloživog vremena na N procesora, koristeći vremenske odsječke. Međutim, slici Slika 48 se vidi da to nije uvijek dobra strategija. P1 P4 P1 P4 prazno P4 prazno P4 prazno P4 prazno P4 prazno P4 prazno P4 CPU 1 CPU 2 CPU 3 CPU 4 Ravnomjerna raspodjela, Oba procesa po 50% vremena, Neiskorištenost 37,5% t P1 P4 P1 P4 CPU 1 Prazno P4 Prazno P4 CPU 2 Prazno P4 Prazno P4 CPU 3 Prazno P4 Praz no P4 CPU 4 Proces od 4 niti dobija 80% Vremena, proces od 1 niti 20%. Neiskorištenost 15% Slika 48: Iskorištenost višeprocesorskog sistema u zavisnosti od broja niti procesa U primjeru s 4 procesora i dvije aplikacije, od kojih je jedna jednonitna, a druga ima 4 niti ako se objema aplikacijama dodijeli jednako vrijeme u procesorima, tri procesora koja izvršavaju jedno-nitnu aplikaciju su neaktivna dok se ona izvršava na četvrtom procesoru. Tada je ukupno neiskorištenje resursa 37,5%. S druge strane, ako se procesu s više niti dodijeli više vremena, tada se neiskorištenost smanjuje. t

71 3.38.Dodjela posvećenog procesora Dodjela posvećenog procesora Ekstremna varijanta družbenog raspoređivanja se sastoji u tome da kada se rasporedi aplikacija, svaka od njenih niti dodijeljena procesoru ostaje mu dodijeljena do završetka aplikacije. Pri prvom pogledu, ovo je veliki gubitak resursa. Ako se nit aplikacije blokira zbog čekanja na U/I ili sinhronizacije s drugom niti, tada procesor koji izvršava ovu nit ostaje neaktivan. Time nema više multiprogramiranja sistema. No, imaju dva opravdanja za ovaj pristup. Prvo je da u vrlo paralelnim sistemima, s stotinama procesora, iskorištenost procesora više nije važna kao metrika efektivnosti ili performansi. Drugo opravdanje potiče od činjenice da izbjegavanje izmjene procesa u programu može drastično ubrzati taj program. Dokaz za ovo opravdanje je na slici Slika 49. Na osmoprocesorskom sistemu pokrenute su aplikacije Furijerove transformacije i množenja matrica, razdijeljene u niti. Aplikacije dijele račun u više niti. No, ubrzanje sa povećanjem broja niti raste dok se ne dostigne broj procesora. Nakon toga, daljnje povećanje broja niti samo usporava procesor. 7 Ubrzanje Broj niti Slika 49 Zavisnost ubrzanja od broja niti na višeprocesorskom računaru Ovo je posljedica Amdalovog zakona, koji podsjeća na limite paralelizacije programa. Ako se program može realizovati tako da se p% programa mora izvršiti sekvencijalno, a (100-p)% programa može paralelizovati, onda se ukupno vrijeme izvršenja ne može paralelizacijom smanjiti na manje od p%. Na primjer, neka od 10 sati izvršenja programa na jednoprocesorskom računaru, 1 sat otpada na sekvencijalni dio koda. Sa 2 procesora, posao se može obaviti za 1+9/2 =5,5 sati, sa 5 procesora za 1+9/5=2,8 sati. No daljnja ubrzanja nisu velika. Sa 100 procesora proces se obavi za 1,09 sati, sa 1000 procesora za 1,009 sati Dinamičko raspoređivanje Za neke aplikacije je moguće obezbijediti jezičke i sistemske alate koji omogućavaju dinamički promjenu niti. To bi omogućilo da OS prilagodi opterećenje radi poboljšanja iskorištenosti. Ovdje operativni sistem i aplikacija utiču na odluke o raspoređivanju. Odgovornost raspoređivanja OS je ograničena na dodjelu procesora. Prednost ove metode u odnosu na družbenu raspodjelu ili posvećeni procesor je da aplikacija može imati korist od toga. Procesi sa većim brojem prioriteta, odnosno manje važniji procesi, se neće izvršiti dok se redovi čekanja sa nižim prioritetnim brojem ne isprazne. Redovi čekanja se provjeravaju pomoću maske bita svaki put kada se proces ili blokira ili vremenski period pridružen nekom procesu istekne.

72 Posix funkcije koje podešavaju algoritme raspoređivanja 3.40.Posix funkcije koje podešavaju algoritme raspoređivanja Neke funkcije koje utiču na algoritam raspoređivanja su date na sljedećoj listi. pthread_setschedparam(pthread,ipolicy,psparam); Postavlja algoritam raspoređivanja niti i prioritet. Parametar ipolicy zavisi od OS, na primjer ipolicy može biti SCHED_OTHER, SCHED_FIFO, SCHED_RR, a psparam struktura koja među ostalim poljima sadrži prioritet pthread_getschedparam(pthread,ppolicy,psparam); Očitava parametre raspoređivanja niti nice(iinc); Proces dodjeljuje dio prioriteta samom sebi, manji broj veći prioritet 3.41.Windows funkcije koje podešavaju algoritme raspoređivanja Sljedeće API funkcije mogu da mijenjaju ili očitavaju parametre algoritma raspoređivanja. GetCurrentProcessorNumber() Vraća redni broj procesora koji izvršava proces GetPriorityClass(hProcess) Vraća kategoriju prioriteta procesa GetProcessTimes(hProcess,lpCreationTime,lpExitTime, lpkerneltime,lpusertime) Vraća koliko je vremena proces proveo u pojedinim režimima OS SetPriorityClass( hprocess,dwpriorityclass) Postavlja klasu prioriteta procesa GetThreadPriority(hThread) Vraća prioritet niti SetThreadPriority(hThread,nPriority) Postavlja prioritet niti 3.42.Zadaci Zadatak 1. Neka su data četiri procesa s sljedećim vremenima dolaska, trajanja, prioritetima (manji broj veći prioritet). Proces Vrijeme dolaska Trajanje Prioritet P P P P Treba ih rasporediti u jednoprocesorskom sistemu. Ne uzimajući u obzir vrijeme izmjene konteksta, izračunati srednje vrijeme čekanja za algoritme a) FCFS, b) SJF, c) SRTF, d) Prioritetni nepreemptivni e) Prioritetni preemptivni f) Round Robin q=2 g) Round Robin, q=2 s višestrukim prioritetima. Nacrtati Ganttove dijagrame izvršavanja procesa. Ako dva procesa imaju isti osnovni kriterij raspoređivanja, odabrati proces s manjim rednim brojem. a) FCFS Kod ovog algoritma procesi će se izvršiti onim redom kojim su pristigli. Gantov dijagram izgleda ovako. P1 P2 P3 P

73 3.42.Zadaci 73 Proces Vrijeme dolaska Trajanje Vrijeme završetka Vrijeme u sistemu Vrijeme čekanja P =6 6-6=0 P =7 7-3=4 P =7 7-1=6 P =8 8-5=3 Srednje vrijeme čekanja je ( )/4=3,25 b) SJF Kod ovog algoritma novi proces ne prekida trenutno izvršavani, ali nakon njegovog završetka bira se najkraći od u međuvremenu pristiglih. P1 P3 P2 P Proces Vrijeme dolaska Trajanje Vrijeme završetka Vrijeme u sistemu Vrijeme čekanja P =6 6-6=0 P =8 8-3=5 P =4 4-1=3 P =8 8-5=3 Srednje vrijeme čekanja je ( )/4=2,75 c) SRTF Kod ovog algoritma novi proces prekida trenutno izvršavani, ako mu je vrijeme izvršavanja kraće od preostalog vremena trenutnog procesa. P1 P2 P3 P2 P1 P Proces Vrijeme dolaska Trajanje Vrijeme završetka Vrijeme u sistemu Vrijeme čekanja P = =4 P =4 4-3=1 P =1 1-1=0 P =8 8-5=3 Srednje vrijeme čekanja je ( )/4=2 d) Prioritetni nepreemptivni P1 P2 P4 P Proces Prioritet Vrijeme dolaska Trajanje Vrijeme završetka Vrijeme u sistemu Vrijeme čekanja P =6 6-6=0 P =7 7-3=4 P = =11 P =7 7-5=2 Srednje vrijeme čekanja je ( )/4=4,25 e) Prioritetni preemptivni

74 Zadaci P1 P2 P1 P4 P1 P Proces Prioritet Vrijeme dolaska Trajanje Vrijeme završetka Vrijeme u sistemu Vrijeme čekanja P = =8 P =3 3-3=0 P = =11 P =5 5-5=0 Srednje vrijeme čekanja je ( )/4=4,75 f) Round Robin P1 P2 P3 P1 P2 P Trenutak Izvršava se Red čekanja 0 P1-2 P1 P2 3 P1 P2-P3 4 P2 P3-P1 6 P3 P1-P2 7 P1 P2-P4 9 P2 P4 10 P4-12 P4-14 P Proces Vrijeme dolaska Trajanje Vrijeme završetka Vrijeme u sistemu Vrijeme čekanja P =9 9-6=3 P =8 8-3=5 P =4 4-1=3 P =8 8-5=3 Srednje vrijeme čekanja je ( )/4=3,5 g) Round Robin s višestrukim redovima prioriteta P1 P2 P1 P4 P3 P

75 3.42.Zadaci 75 Trenutak Izvršava se Red čekanja Blokirani red 0 P P2 P1 3 P2 P1-P3 4 P2 P1-P3 5 P1 P3 7 P4 P3-P1 9 P4 P3-P1 11 P4 P3-P1 12 P3-13 P Proces Prioritet Vrijeme dolaska Trajanje Vrijeme završetka Vrijeme u sistemu Vrijeme čekanja P = =9 P =3 3-3=0 P = =9 P =5 5-5=0 Srednje vrijeme čekanja je ( )/4=4,5 Zadatak 2. Neka u lutrijskom raspoređivanju postoji 9 procesa tipa A kojima je dodijeljeno po 2 tiketa i 10 procesa tipa B kojima je dodijeljeno po 8 tiketa. Koliko procentualno vremena se izvršava jedan proces tipa A i jedan proces tipa B? Rješenje: Ukupno ima 9x2+10x8=98 tiketa. Statistički gledano, proces tipa A bi se trebao izvršavati 2/98 =2,04% vremena, a proces tipa B 8/98=8,16% vremena. Zadatak 3. Neka u avionskom sistemu u realnom vremenu očitavamo atmosferski pritisak svake sekunde, a obrada tog posla traje 0,3 s. Pozicija se očitava svakih 0,5 s a obrada traje 0,1 s. Brzina se očitava svakih 0,7 s a obrada traje 0,1s. Može li se obaviti raspoređivanje monotonom stopom? Rješenje: 0,3s/1s + 0,1s/0,5s + 0,1s/0,7s=0.642 <ln 2. Dakle, može se rasporediti. Zadatak 4. Na Windows sistemu napišite sljedeći program. Prevedite ga i izvršite. Pogledajte u task manager koliko procenata procesorskog vremena troši ovaj proces. Probajte mijenjati prioritete na: BELOW_NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS, IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, HIGH_PRIORITY_CLASS i REALTIME_PRIORITY_CLASS. Da li ste sve uspjeli? #include <windows.h> #include <stdio.h> int main( void ) { DWORD dwerror, dwpriclass; SetPriorityClass(GetCurrentProcess(),NORMAL_PRIORITY_CLASS); dwpriclass = GetPriorityClass(GetCurrentProcess()); printf("trenutna klasa prioriteta je 0x%x\n", dwpriclass); while (1) {; return 0;

76 Dijeljenje i natjecanje 4.Sinhronizacija procesa 4.1.Dijeljenje i natjecanje Procesi ili niti često dijele resurse. Neki od ovih resursa mogu se koristiti konkurentno sa bilo kojim brojem procesa, dok drugi mogu biti korišćeni samo od jednog procesa u nekom trenutku vremena. Kada se više procesa izvršava istovremeno u sistemu, a dijele neki resurs, mogući su konflikti. Zamislimo da postoje dvije niti ili dva procesa (nazovimo ih Proces 1 i Proces 2) koje istovremeno unos podatke u neki zajednički niz istim algoritmom, učitavši trenutnu poziciju niza u varijablu next_free, zatim smjeste podatak na tu poziciju i uvećaju pokazivač trenutne pozicije. Kada bi se cijela ta akcija obavila za proces 1, a zatim za proces 2, ispravnim redosljedom, podaci bi bili ispravno uneseni (Slika 50). Proces 1 Proces 2 int next_free int next_free 1 inext_free=in 4 inext_free=in 2 Smjesti F1 u next_free 5 Smjesti F2 u next_free 3 next_free=next_free+1 kn 6 next_free=next_free+1 F1 F2 Slika 50 Ispravni unos dijeljenog podatka s dvije niti Ali, šta ako se Proces 2 počeo izvršavati nakon što je Proces 1 pročitao vrijednost trenutne pozicije u nizu, ali je nije još promijenio? Tada će oba procesa vidjeti istu trenutnu poziciju i jedna od njihovih upisanih vrijednosti će biti oštećena (Slika 51). Proces 1 Proces 2 int next_free int next_free 1 inext_free=in 2 inext_free=in 3 Smjesti F1 u next_free 5 Smjesti F2 u next_free 4 next_free=next_free+1 kn 6 next_free=next_free+1 F1 F2 Slika 51 Konflikt zbog pristupa istoj lokaciji

77 4.2.Kritična sekcija 77 Primjera kada se mora spriječiti istovremeno korištenje resursa ima mnogo. Na primjer, ako više programa žele istovremeno štampati, rezultat će biti haos na papiru. Sigurno da postoji način, da se svi korisnici koji žele štampač, dogovore o redosljedu njegovog korišćenja ili da se odlože datoteke materijala za štampu na disk, a da sistem izvrši štampanje u skladu sa nekim pravilima. Drugi primjer bi mogla biti raskrsnica sa semaforima na kojoj učesnici u saobraćaju žele da prođu raskrsnicu bezbjedno (da koriste resurs) dok drugi čekaju da dođu u priliku da ga koriste. Pravila koja definišu kako bi trebalo biti dijeljeni resursi se naziva disciplinom dijeljenja resursa. Najčešća disciplina dijeljenja resursa je međusobno isključivanje (engl. mutual exclusion) ali postoje i druge discipline dijeljenja resursa. Kod pravila međusobnog isključivanja imamo slučaj da kada proces koristi resurs, onda niti jedan drugi proces ne može koristiti resurs. 4.2.Kritična sekcija Kako da izbjegnemo stanje natjecanja? Ovdje je potrebno pronaći način da se zabrani da više od jednog procesa čita i piše dijeljene podatke u isto vrijeme. Ovakva situacija se pojavljuje na mnogim mjestima kao što su dijeljena memorija, dijeljene datoteke i sl. Drugim riječima može se reći da ono što tražimo je međusobna isključivost kojom se osiguravamo da kada jedan proces koristi dijeljenu varijablu ili datoteku, dugi procesi neće biti u stanju obavljati istu stvar. To znači da problemi nastaju kada jedan proces počne da koristi dijeljeni resurs a drugi proces taj isti resurs nije oslobodio. Izbor odgovarajućih operacija kojim se postiže međusobna isključivost je osnovno pitanje kod projektovanja operativnih sistema i u nastavku će predstavljati predmet našeg proučavanja. Često u toku svog izvođenja proces ne koristi dijeljene varijable i tada ne dolazi do problema međusobnog isključivanja. Međutim često se procesi nalaze u situacijama da koriste dijeljene resurse, podatke ili datoteke. Kako mi rukujemo sa resursima iz programa? Naravno, pisanjem koda. Dio programa koji radi sa resursima na način da mu je potrebno međusobno isključivanje ili neki drugi tipovi zaštite se naziva kritična sekcija. Primijetimo, u praksi, čak i jedna linija koda u jeziku visokog nivoa može predstavljati kritičnu sekciju jer je jedna linija koda u jeziku visokog nivoa predstavljena sa nekoliko linija koda u mašinskom jeziku koji se može prekinuti. Ukoliko uredimo stvari na takav način da dva procesa ulaze u kritičnu sekciju u isto vrijeme tada se to stanje naziva stanjem natjecanja i postoje načini kako dozvoliti jednom procesu da uđe u kritičnu sekciju a drugim procesima zabraniti pristup kritičnoj sekciji. Mada ovaj zahtjev sprečava stanje natjecanja, on nije dovoljan da bi se procesi odvijali paralelno i efikasno dijelili podatke. Potrebno je definisati četiri stanja da bi se održalo dobro rješenje međusobnog isključivanja procesa: 1. Dva proces ne smiju biti u njihovoj kritičnoj sekciji 2. Ne bi smjele se praviti pretpostavke o brzini i broju procesora 3. Ne smije se dozvoliti procesu koji se izvršava izvan kritične sekcije da blokira druge procese 4. Proces ne bi trebao da čeka beskonačno da bi ušao u kritičnu sekciju Ponašanje koje želimo je prikazano na slici Slika 52. Proces A ulazi u kritičnu sekciju u trenutku T1. Malo kasnije u trenutku T2 proces B pokušava da uđe u kritičnu sekciju ali ne uspijeva jer je drugi proces već u kritičnoj sekciji. U kritičnoj sekciji može biti samo jedan proces.

78 Međusobno isključivanje sa zaposlenim čekanjem A ulazi u kritičnu sekciju A napušta kritičnu sekciju Proces A B pokušava ući u kritičnu B ulazi u kritičnu sekciju B napušta kritičnu sekciju Proces B B blokiran T1 T2 T3 T4 Slika 52 Čekanje pred kritičnom sekcijom vrijeme Kao posljedica ovog, proces B se privremeno suspenduje do trenutka T3 kada proces A napušta kritičnu sekciju i na taj način dozvoljava procesu B da odmah uđe u kritičnu sekciju. Kada proces B napusti kritičnu sekciju imamo situaciju gdje nema procesa u kritičnoj sekciji. 4.3.Međusobno isključivanje sa zaposlenim čekanjem U ovom djelu ćemo se baviti različitim metodama za postizanje međusobne isključivanja procesa, tako dok je jedan proces zaposlen i ažurira dijeljenu memoriju u svojoj kritičnoj sekciji dugi procesi neće moći ulaziti u istu kritičnu sekciju i uzrokovati probleme. 4.4.Zabrana prekida Najjednostavnije rješenje je da svaki proces zabrani sve prekide odmah po ulasku u kritičnu sekciju i omogući ih odmah po izlasku iz kritične sekcije. Kao rezultat rada sata realnog vremena i prekida dolazi do izmjene procesa na procesoru, pa ako zabranimo prekide, procesor se ne može dodijeliti drugom procesu. Dakle kada jedan proces zabrani prekide on može ažurirati dijeljenu memoriju bez bojazni da drugi proces može pristupiti njegovim podacima. Ovaj pristup nije poželjan jer nije mudro dati korisničkim procesima snagu da zabrane prekide. Pretpostavimo da jedan takav proces ima takve ovlasti, šta će se desiti ako on po izlasku iz kritične sekcije ne omogući prekide? To bi značilo da bi sistem brzo prestao sa radom. Kod multi-procesorskih sistema, sa dva ili više procesora, onemogućavanje prekida je važeće samo na procesoru na kome je komanda izdana dok drugi procesor nastavlja sa izvršavanjem i može pristupiti dijeljenoj memoriji. S druge strane, često je pogodno za kernel da zabrani prekide za nekoliko instrukcija dok ažurira varijable. Ako se prekid desi kada se lista spremnih procesa nalazi u nekonzistentnom stanju, stanje natjecanja bi se moglo desiti. U zaključku, kažimo da je zabrana prekida često korisna tehnika u samom operativnom sistemu ali nije pogodna za mehanizme međusobnog isključivanja za korisničke procese. 4.5.Dijeljena varijabla Kao drugi pokušaj, pogledajmo softverska rješenja. Neka imamo jednu dijeljenu varijablu koja je inicirana na 0. Kada proces hoće da uđe u kritičnu sekciju on prvo testira varijablu. Ako je varijabla jednaka 0, proces je postavi na 1 i ulazi u kritičnu sekciju. Ako je varijabla već postavljena na 1, proces čeka dok ne postane jednaka 0. Dakle, 0 znači da nema procesa u kritičnoj sekciji kod 1 znači da je proces u kritičnoj sekciji. Međutim, ovdje postoji problem. Pretpostavimo da jedan proces čita varijablu i vidi da je ona jednaka 0. Prije nego što je postavi na 1, dolazi do raspoređivanja drugog procesa i

79 4.6.Striktna promjena 79 njegovog pokretanja i on postavi dijeljenu varijablu na 1. Kada se prvi proces ponovno pokrene, on je već vidio da je varijabla postavljena na 0 i postavlja je na 1, pa tada oba procesa ulaze u kritičnu sekciju u isto vrijeme. Ako pomislimo da je prvi proces morao ponovno provjeravati stanje varijable tada nismo u pravu jer proces ne zna šta se u među-vremenu desilo i takav pristup neće pomoći. Znači, stanje natjecanja se dešava kada drugi proces modifikuje dijeljenu varijablu nakon što je prvi proces uradio provjeru varijable. 4.6.Striktna promjena Treći pristup problemu međusobnog isključivanja je prikazan na slici Slika 53. while (TRUE){ while (TRUE) { while(turn!= 0); while(turn!= 1); /*petlja*/ /* petlja * / kritična_sekcija (); kritična_sekcija (); turn = 1; turn = 0; kod_izvan_kritične_sekcije(); kod_izvan_kritične_sekcije(); (a) (b) Slika 53 Striktna promjena U oba slučaja, primijetite znak ; kojim se završava while iskaz. Na slici, cjelobrojna varijabla turn, inicirana na 0, održava redosljed ulazaka u kritičnu sekciju i ispituje i ažurira dijeljenu varijablu. Inicijalno, proces 1 testira varijablu turn, nalazi da je jednaka 0 i ulazi u kritičnu sekciju. Proces 2, takođe nalazi da je varijabla 0 i počne da se izvršava u petlji neprekidno provjeravajući da li je varijabla turn postala jednaka 1. Stalno provjeravanje varijable dok se neka vrijednost ne pojavi se naziva zaposlenim čekanjem. Ova situacija nije poželjna jer troši vrijeme na procesoru. Zaposleno čekanje se koristi samo kada se s razlogom očekuje da će vrijeme čekanja biti kratko. Varijabla kojom se izvodi zaposleno čekanja se zove varijabla zaključavanje (engl. spin lock). Kada proces 1 napusti kritičnu sekciju, on postavlja varijablu turn na 1, dozvoljavajući procesu 2 da uđe u kritičnu sekciju. Pretpostavimo da proces 2 završi svoju sekciju brzo tako da su oba procesa su izvan kritične sekcije sa varijablom turn postavljenom na 0. Sada proces 1 brzo izvrši svoju kritičnu sekciju, izlazeći iz kritične sekcije i postavljajući varijablu turn na 1. U ovom trenutku varijabla turn ima vrijednost 1 i oba procesa su izvan kritične sekcije. Odjednom, proces 1, koji je završio svoj kod izvan kritične sekcije, dođe na vrh petlje da bi ušao ponovno u kritičnu sekciju. Nažalost, nije mu dozvoljeno da uđe sada u kritičnu sekciju zato što je varijabla turn postavljena na 1 a proces 2 je zaposlen u svom kodu izvan kritične sekcije. Na ovaj način proces 1 čeka na iskazu while sve dok proces 2 ne postavi varijablu turn na 0. Ovakva ideja nije dobra u slučajevima kada je jedan proces brži od drugog. Ova situacija narušava stanje 3 postavljenog iznad: proces 1 je bio blokiran sa procesom koji nije u njegovoj kritičnoj sekciji. Mada ovaj algoritam sprečava sva natjecanja za kritičnom sekcijom, on nije ozbiljan kandidat kao rješenje problema međusobnog isključivanja jer narušava stanje Peterson-ovo rješenje Kombinujući ideju sa redosljedom izvršavanja procesa i ideju sa varijablama zaključavanja, matematičar T.Dekker je prvi izveo softversko rješenje za problem međusobnog isključivanja koji ne zahtjeva striktnu izmjenu procesa.

80 TSL Instrukcija 1981 godine, G.L. Peterson je otkrio mnogo jednostavniji način da se postigne međusobno isključivanje procesa. Njegov algoritam nije prikazan u nastavku, ali su prikazane procedure za ulazak i izlazak iz kritične sekcije što je dovoljno. #define FALSE 0 #define TRUE 1 #define N 2 /* broj procesa */ int turn; /* čiji je redosljed? */ int interested[n]; /* sve vrijednosti inicijalno na 0 (FALSE)*/ void ulazak_u_sekciju(int process) /* proces je 0 ili 1 */ { int other; /* broj drugog procesa */ other = 1 - process; /* prvi proces */ interested[process] = TRUE; /* interes za ulazak u k.s. */ turn = process; /* postavi zastavicu */ while (turn == process && interested[other] == TRUE) ; void izlazak_iz_sekcije(int process) /* proces: koji napušta kritičnu sekciju */ { interested[process] = FALSE; /* ukazuje na izlazak iz kritične sekcije*/ Prije korišćenja dijeljene varijable (t.j. prije ulaska u kritičnu sekciju), svaki proces poziva proceduru ulazak_u_sekciju(int process) sa svojim brojem procesa, 0 ili 1 kao parameter. Ovaj poziv će uzrokovati čekanje, ako je potrebno, dok ne bude siguran da može ući u kritičnu sekciju. Poslije završetka posla sa dijeljenim varijablama, proces poziva proceduru izlazak_iz_sekcije(int process) da oslobodi kritičnu sekciju i omogući drugim procesima njeno korišćenje. Da vidimo kako funkcioniše algoritam. U početku, nijedan proces se ne nalazi u kritičnoj sekciji. Sada proces 0 poziva proceduru za ulazak u kritičnu sekciju. On ukazuje da je zainteresovan za ulazak u kritičnu sekciju, postavljanjem njegovog elementa niza i varijable turn na 0. Pošto proces 1 nije zainteresovan za ulazak u kritičnu sekciju, procedura za ulazak se odmah izvršava. Ako proces 1 pozove proceduru za ulazak u kritičnu sekciju, on će čekati sve dok interested[0] ne postane FALSE, jedan događaj koji će se desiti kada proces 0 pozove proceduru za napuštanje kritične sekcije. Sada razmotrimo slučaj kada oba procesa pozovu proceduru za ulazak u kritičnu sekciju gotovo istovremeno. Oba će smjestiti njihov broj procesa u varijablu turn. Ko god da je upisao prvi, posljednji zapis se računa a prethodni briše. Pretpostavimo da je proces 1 smjestio svoju vrijednost posljednji, tako da je turn jednak 1. Kada oba procesa dođu na izvršavanje while iskaza, proces nula odmah ulazi u kritičnu sekciju dok proces 1 se vrti u petlji i ne ulazi u kritičnu sekciju. 4.8.TSL Instrukcija Pogledajmo sada na prijedloge koji zahtjevaju hardversku pomoć. Mnogi računari, posebno oni koji su projektovani sa višestrukim procesorima, imaju instrukciju tipa TSL RX,LOCK

81 4.9.Blokiranje i deblokiranje procesa 81 a znači provjeri i postavi (engl. Test and Set Lock) koja radi na sljedeći način: čita sadržaj memorijske riječi LOCK u registar RX i onda smiješta vrijednost različitu od 0 u memorijsku lokaciju LOCK. Operacija čitanja riječi i pisanje u nju su nedjeljive, kažemo atomske, tako da drugi procesi ne mogu pristupiti varijabli sve dok se instrukcija ne završi. Procesor izvršava TSL instrukciju i zaključava memorijsku sabirnicu da bi zabranio drugim procesorima da pristupe memoriji dok se instrukcija ne završi. Da bi koristili instrukciju TSL, koristićemo dijeljenu varijablu LOCK da bi napravili koordinirani pristup dijeljenoj memoriji. Kada je LOCK jednaka 0, bilo koji proces je može postaviti na 1 korišćenjem TSL instrukcije a zatim čitati i pisati dijeljenu memoriju. Kada završi ove operacije, proces postavlja varijablu LOCK opet na 0 korišćenjem jedne instrukcije move. Kako se ova instrukcija koristi da bi se spriječila dva procesa od simultanog ulaska u kritičnu sekciju? Ovo rješenje je dato na slici Slika 54. ulazak_u_kritičnu_sekciju: TSL REGISTER,LOCK ; kopiraj LOCK u registar i postavi LOCK na 1 CMP REGISTER,#0 ; da li je LOCK bio nula? JNE ulazak_u_kriticnu_sekciju ; ako nije nula, vrti se u petlji RET ; vrati se pozivaocu; ulazak u kritičnu sekciju dozvoljen izlazak_iz_kritične_sekcije: MOVE LOCK,#0 ; smjesti 0 u varijablu LOCK RET ; vrati se pozivaocu Slika 54 Upotreba TSL instrukcije Prva instrukcija kopira staru vrijednost varijable LOCK u registar i onda postavlja varijablu LOCK na 1. Zatim se stara vrijednost poredi sa 0. Ako rezultat poređenja nije 0, zaključavanje je već postavljeno tako da program ide nazad na početak i vrši testiranje ponovno. Prije ili kasnije ova varijabla će biti jednaka 0, kada proces koji se izvršava u kritičnoj sekciji završi sa svojom kritičnom sekcijom, i povratkom iz potprograma. Oslobađanje kritične sekcije je jednostavno i izvodi se smiještanjem 0 u varijablu LOCK. Nisu potrebne posebne instrukcije. Jedno rješenje problema kritične sekcije je sada jasno. Prije ulaska u kritičnu sekciju proces treba da pozove potprogram ulazak_u_kritičnu_sekciju, koji izvodi zaposleno čekanje, dok se zaključavanje ne oslobodi i onda dobije zaključavanje, pa potprogram završi izvođenje. Nakon završetka izvođenja kritične sekcije, proces mora pozvati potprogram izlazak_iz_kritične_sekcije koji postavlja 0 u varijablu LOCK. Kao kod svih rješenja baziranih na kritičnim sekcijama, procesi moraju pozvati potprograme ulazak_u_kritičnu_sekciju i izlazak_iz_kritične_sekcije u odgovarajuća vremena. 4.9.Blokiranje i deblokiranje procesa I Peterson-ovo rješenje i rješenje koje koristi TSL instrukciju su korektna, ali oba posjeduju manjkavost koja se zove zaposleno čekanje. U stvari, šta rade ova pomenuta rješenja: kada proces želi da uđe u kritičnu sekciju, on provjerava da vidi da li je ulaz dozvoljen. Ako nije, proces se vrti u petlji i čeka svoj ulazak. Ne samo da ovaj pristup troši procesorsko vrijeme nego može dovesti do neželjenih efekata. Neka u računaru se izvršavaju dva procesa, H sa visokim prioritetom i L sa niskim prioritetom koji djele kritičnu sekciju. Pravila raspoređivanja su takva da se H izvršava kad god je u redu spremnih procesa za izvršavanje. U nekom momentu, sa L procesom koji se nalazi u kritičnoj sekciji, H postane spreman za izvršavanje (t.j. kada se završi jedna U/I operacija). H sada počne da se izvršava i radi zaposleno čekanje jer L nikako ne može da dođe na procesor dok se H

82 Semafori proces izvršava, odnosno L nikada ne dobije šansu da napusti kritičnu sekciju tako da H proces čeka zauvijek. Ova situacija se pominje nekada kao problem prioritetne inverzije. Sada pogledajmo na neke funkcije za među-procesnu sinhronizaciju koje blokiraju proces umjesto onih koje troše vrijeme procesora kada im nije dozvoljeno da uđu u kritične sekcije. Jedne od najjednostavnijih su funkcije sleep i wakeup. Funkcija sleep predstavlja sistemski poziv koji uzrokuje da se pozivaoc blokira, odnosno da se suspenduje dok ga drugi proces deblokira iz nekog razloga. Proces deblokiranja se izvodi funkcijom wakeup sa jednim parametrom koji predstavlja proces koji treba deblokirati Semafori E. W. Dijkstra (1965) sugerisao je korišćenje cjelobrojne varijable da bi se računao broj procesa koji mogu ući u kritičnu sekciju. U ovom prijedlogu je uvedena nova varijabla nazvana semafor. Predložene su dvije operacije, down (drugi nazivi: wait ili p) i up (drugi nazivi: signal ili v). One su uopštene operacije sleep i wakeup, respektivn. Down operacija na semaforu provjerava da li je vrijednost semafor veća od 0. Ako jeste, smanji je za 1 i nastavi sa izvršavanjem. Ako je vrijednost jednaka 0, proces se blokira bez završavanja operacije down za neko vrijeme. Provjeravanje vrijednosti, njena izmjena i moguće blokiranje se izvode u jednoj, nedjeljivoj, atomskoj operaciji. To znači da kada se pokrene jedna operacija nad semaforskom varijablom, tada drugi procesi ne mogu pristupiti semaforskoj varijabli sve dok se operacija ne završi ili dođe do blokiranja. Ova atomičnost (mogućnost izvođenja koda bez prekida) je suština kod rješavanja problema sinhronizacije i izbjegavanja stanja natjecanje. Operacija up povećava vrijednost semafora za 1. Ako je postojao jedan ili više procesa koji su blokirani na semaforu, koji nisu bili u stanju da završe ranije izdane down operacije, jedan od procesa se izabira i na taj način mu je dozvoljeno da završi svoju down operaciju i nastavi sa svojim izvođenjem. Dakle, nakon izvođenje jedne up operacije na semaforu sa procesima koji su blokirani na njemu, semafor će ostati jednak 0, ali će biti deblokiran proces koji je bio blokiran na njemu (iz stanja blokiran biće preveden u stanje spremnih procesa za izvršenje). Operacija povećanja vrijednosti semaforske varijable i deblokiranja procesa je takođe nedjeljiva. Proces se nikada ne blokira kada izvodi operaciju up. U originalnom radu Dijkstra koristi imena p (hol. Proberen testiraj) i v (hol. verhogen povećaj za jedan) umjesto down i up, respektivno. Ove operacije su prvi put bile uvedene u jeziku Algol 68. U literaturi se koriste i operacije wait i signal koje se odnose na operacije down i up. Pseudo kod, prikazan ispod, ilustrira semantiku ove dvije operacije nad semaforom. P(sem) /* proberen testiraj, operacija wait(sem) */{ while (sem <= 0); sem = sem 1; V(sem) /* verhogen inkrementiraj, opeacija signal(sem) */ { sem = sem + 1; U cilju da obezbijedimo da kritična sekcija sa semaforima ostane zaštićena koristićemo TSL instrukciju i njene funkcije za ulazak i izlazak iz kritične sekcije. Na ovaj način pomoću osnovnih funkcija izgrađujemo složenije funkcije.

83 4.10.Semafori 83 p(csem) { while (1) { ulazak u k.s.; if (csem.value <= 0) { izlazak_iz_k.s.; continue; else { csem.value = csem.value 1; izlazak_iz_k.s.; break; v(csem) { ulazak u k.s.; csem.value = csem.value + 1; izlazak_iz_k.s.; Pogledajmo pažljivo implementaciju P(csem). Ako je natjecanje za kritičnu sekciju veliko i/ili je kritična sekcija dovoljno velika, onda se može potrošiti značajno puno vremena. Mnogi procesi će zauzimati procesor i neće ništa raditi osim što će trošiti cikluse čekajući na proces u redu spremnih procesa da se izvrše i oslobode kritičnu sekciju. Ovo zaposleno čekanje čini veliko natjecanje za kritičnom sekcijom još gorim. Ali nije sve izgubljeno. Uz pomoć operativnog sistema, možemo implementirati semafore tako da pozivajući proces će se blokirati umjesto da se vrti u operaciji P() i čeka na V() operaciju da se «probudi» i izvrši ponovno. Pseudo kod prikazuje implementaciju takvih semafora koji se još nazivaju blokirajući semafori. p(sem) { while (1) { acquire_mutex (csem.mutex); ulazak u k.s. if (csem.value <= 0) { Insert_queue (getpid(), csem.queue); Release_mutex_and_block (csem.mutex); /* atomski */ else { csem.value = csem.value 1; Release_mutex (csem.mutex); // izlazak iz kritične sekcije Break;

84 Mutex-i v(csem) { acquire_mutex (csem.mutex); // ulazak u k.s. csem.value = csem.value + 1; dequeue_and_wakeup (csem.queue); // prevođenje procesa iz stanja // blokiranosti u red spremnih procesa Release_mutex (csem.mutex); // izlazak iz k.s. Primijetimo da pri izvođenju funkcije P() nad procesom on mora atomski postati blokiran i osloboditi mutex. Ovo je zato da se ne desi rizik «izgubljenog buđenja» procesa. Zamislimo slučaj kada se izvrše dvije različite operacije: release_mutex(xsem.mutex) i sleep(). Ako se desi izmjena konteksta između ove dvije funkcije može se doći u situaciju da drugi proces izvrši operaciju V() i pokuša da probudi uspavani proces i oslobodi iz reda čekanja. Nažalost, prvi proces još nije ušao u red čekanja blokiranih procesa tako da buđenje može da ne uspije, i kad proces opet nastavi izvođenje doći će u stanje blokiranja i tada neće postojati operacija buđenja koja bi ga trebala izvaditi iz reda čekanja. Operativni sistemi obezbjeđuju ovu podršku u obliku sistemskog poziva sleep() koji uzima semafor mutex kao parametar. Kernel onda može osloboditi mutex i staviti proces u stanje spavanja (blokiran i suspendovan) u jednoj okolini oslobođenoj od prekida, dakle zaštićenoj Mutex-i Kada semaforska mogućnost za brojanje nije potrebna, koristi se pojednostavljena verzija semafora i on se naziva mutex. Mutex je dobar samo za upravljanje međusobnim isključivanjem za neki dijeljeni resurs ili dio koda. Oni su jednostavni za implementaciju i vrlo efikasni tako da ih to čini posebno korisnim u realizaciji niti u korisničkom adresnom prostoru. Mutex je varijabla koja može biti u jednom od dva stanja: otključanom ili zaključanom. Zbog samo dva stanja koje je potrebno memorisati, dovoljan je samo 1 bit ali se u praksi često koristi cjelobrojna varijabla sa vrijednošću 0 koja znači otključan i sve druge vrijednosti koje znači zaključan. Sa mutex-ima se koriste dvije procedure. Kada jedan proces ili thread treba da pristupi kritičnoj sekciji onda koristi proceduru mutex_lock. Ukoliko je tada mutex otključan, što znači da je pristup kritičnoj sekciji koda dozvoljen, poziv procedure je uspješan i pozvani proces ili nit može ući u kritičnu sekciju. S druge strane, ako je mutex zaključan, znači pristup kritičnoj sekciji nije dozvoljen, onda se proces pozivaoc blokira sve dok proces u kritičnoj sekciji ne završi i pozove mutex_unlock. Ako je više procesa blokirano na mutex-u, jedan od njih se izabira i on dobija pristup kritičnoj sekciji 4.12.Windows API za sinhronizaciju Windows API poznaje semafore i mutex-e i ako se njihova imena navode u obliku stringa kao parametara može se koristiti i između procesa, ne samo niti. Funkcije Windows API-ja za sinhronizaciju su InitializeCriticalSectionAndSpinCount( lpcriticalsection, dwspincount) Inicijalizira kritičnu sekciju i brojač pokušaja ulaska EnterCriticalSection(lpCriticalSection) Čeka na ulaz u kritičnu sekciju i uđe kada je slobodna TryEnterCriticalSection( lpcriticalsection) Pokušava ući u kritičnu sekciju bez čekanja LeaveCriticalSection(lpCriticalSection) Otključava kritičnu sekciju

85 4.13.Posix API za sinhroizaciju 85 DeleteCriticalSection(lpCriticalSection) Briše kritičnu sekciju WaitForSingleObject(hHandle,dwMilliseconds) Čeka na oslobađanje sinhronizacijskog objekta ii navedeno vrijeme WaitForMultipleObjects(nCount,lpHandles, bwaitall,dwmilliseconds) Čeka na oslobađanje bar jednog ili svih sinhronizacijskih objekata CreateMutex(lpMutexAttributes,bInitialOwner, lpname) Kreira objekt uzajamnog isključenja OpenMutex( dwdesiredaccess, binherithandle,lpname) Otvara postojeći Mutex CloseHandle(hObject) Zatvara sinhronizacijski objekt CreateEvent( lpeventattributes, bmanualreset,binitialstate,lpname) Kreira ili otvara objekt događaja CreateSemaphore(lpSemaphoreAttributes, linitialcount,lmaximumcount,lpname) Kreira semafor ReleaseSemaphore( hsemaphore, lreleasecount,lppreviouscount) Uvećava vrijednost semafora 4.13.Posix API za sinhroizaciju U ovom API za sinhronizaciju semaforima koriste se sljedeće funkcije. sem_open(pcname,ioflag,inmode,ivalue)povezuje se ili kreira imenovani semafor sem_init(psem,ipshared,ivalue) Inicijalizira neimenovani semafor sem_close(psem) Završava vezu s otvorenim semaforom sem_unlink(pcname) Završava vezu s otvorenim semaforom i uklanja ga kada ga zadnji proces prestane koristiti sem_destroy(psem) Uklanja semaforsku strukturu neimenovanog semafora sem_getvalue(psem,pvalue) Kopira vrijednost semafora u cijeli broj sem_wait(psem), sem_trywait(psem) Blokira se kada semafor drži drugi proces ili vraća grešku sem_post(psem) Povećava brojač semafora 4.14.Monitori Rad sa semaforima kod međuprocesne komunikacije izgleda lako. Međutim, problem nastaje kada se koristi više semafora i osnovno pitanje je koliko ste pažljivi sa korišćenjem semafora. Jedan mali previd može vas dovesti do neželjenog ponašanja koda. Da bi bilo jednostavnije pisanje korektnih programa, Brinch Hansen (1973) i Hoare (1974) predložili su sinhronizacijsku mogućnost na višem nivou koju su nazvali monitor. Monitor predstavlja skup procedura, promjenljivih i struktura podataka koje su sve grupisane zajedno u posebnu vrstu modula. Procesi mogu zvati procedure u monitoru kad god žele, ali ne mogu direktno pristupiti internim strukturama podataka iz procedura koje se nalaze izvan monitora. Na slici ispod je dat primjer monitora.

86 Monitori monitor example integer i; condition c; procedure producer (x);... end; procedure consumer (x);.. end; end monitor; Monitor ima ključnu karakteristiku koja ga čini korisnim za postizanje međusobnog isključivanja: samo jedan proces može biti aktivan u monitoru u bilo kojem trenutku. Monitori su konstrukcije programskih jezika tako da kompajler zna da su one posebne i mora raditi sa pozivima na procedure u monitoru različito od poziva drugih procedura. Kada jedan proces pozove proceduru u monitoru, prvih nekoliko instrukcija procedure će izvršiti kontrolu da ustanovi da li je neki drugi proces već aktivan u monitoru (koristi proceduru). Ako ustanovi da se proces nalazi u monitoru pozivajući proces će biti suspendovan sve dok drugi proces ne napusti monitor. Ako nema drugih procesa koji su u monitoru proces koji je napravio poziv ka monitoru može ući u monitor. Zadatak kompajlera je da implementira međusobno isključivanje na ulazu u monitor, ali je uobičajen način da se koristi mutex ili binarni semafor. Zato što ovaj pristup monitoru uređuje kompajler a ne programer, manje je vjerovatno da će doći do greške. U svakom slučaju, programer koji piše monitor ne mora biti svjestan kako će to kompajler uraditi da bi se postigla međusobna isključivost. Dovoljno je da zna da pokušavajući da se uđe u kritičnu sekciju u monitoru, biće dozvoljeno samo jednom procesu da koristi datu kritičnu sekciju u jednom trenutku. Mada monitori obezbjeđuju jednostavan način da se postigne međusobno isključenje procesa, to ponekad nije dovoljno. Takođe je potrebno imati mehanizme koji blokiraju procese ako ne mogu da uđu u monitor. U primjeru proizvođač potrošač, jednostavno je testirati sve procese na pun i prazan bafer u procedurama monitora, ali kako bi trebalo proizvođača blokirati ako nađe da je bafer pun? Rješenje je povezano sa uvođenjem uslovnih varijabli sa dvije operacije koje se mogu izvoditi nad njima, wait i signal. Kada monitor procedura otkrije da se proces ne može dalje nastaviti (t.j. proizvođač nađe da je bafer pun), on izvršava jednu operaciju wait na nekoj uslovnoj varijabli, recimo full. Ova akcija uzrokuje da se pozivni proces blokira. To dozvoljava drugom procesu, kome je bio prethodni ulaz zabranjen da nastavi sa izvršavanjem, odnosno da uđe u monitor. Drugi proces, na primjer, potrošač, može deblokirati blokiranog partnera izvodeći operaciju signal. Hoare je predložio da dozvoli da novi deblokirani proces se izvrši suspendujući drugi proces. Brinsh Hansen je predložio da proces koji izvrši operaciju signal mora odmah izaći iz monitora. Drugim rječima, iskaz signal se može pojaviti samo kao krajnji iskaz u monitor proceduri. U primjeru koristimo prijedlog Brinch Hansen-a jer je jednostavniji i lakši za implementaciju. Ako se izvrši operacija signal nad uslovnom varijablom na koju čeka nekoliko procesa, samo jedan od njih će se izabrati u skladu sa pravilima raspoređivanja. Postoji i treće rješenje, u kome se dozvoljava procesu koji je izvršio signal operaciju da nastavi izvršavanje i dozvoljava se procesima koji čekaju da se izvrše da to urade tek što proces koji je izdao operaciju signal završi svoje izvođenje.

87 4.15.Barijere 87 Iako su operacije s njima slične operacijama s semaforima, uslovne varijable nisu brojači. One ne akumuliraju događaje za kasniju upotrebu na način kako to rade semafori. U slučaju semafora inicijaliziranog na 0 ako se wait obavi nakon signal, program koji je pozvao wait će nastaviti s radom, dok kod uslovnih varijabli neće, nego će čekati na novi signal iskaz. Primjer jezika koji podržava monitore je Java. Klasa u jeziku Java se pretvara u monitor tako što se pri deklaraciji metode doda ključna riječ synchronized, čime se postiže međusobno isključivanje poziva ovih metoda iz različitih niti. Metodama wait() i notify() omogućava se funkcionalnost uslovnih varijabli Barijere Dok smo do sada imali prilike govoriti o tehnikama sinhronizacije dva procesa. Barijere predstavljaju mehanizam za sinhronizaciju grupe procesa. Neke aplikacije su podijeljene u faze i imaju pravilo da se nijedan proces ne smije izvršavati u sljedećoj fazi ako svi procesi nisu spremni da uđu u tu fazu. Ovakvo ponašanje u aplikacijama se može postići postavljanjem barijere na kraju svake faze. Kada jedan proces u grupi procesa dostigne barijeru, on se blokira dok svi procesi ne dostignu istu barijeru. Ove operacije su ilustrirane na slici Slika 55. a) b) c) P1 P1 P2 P2 P3 P3 P4 P4 P1 P2 P3 P4 t Slika 55: Barijere Na slici Slika 55 pod a) se mogu vidjeti četiri procesa koji se približavaju barijeri. Ovo znači da su u fazi izračunavanja ali da nisu još završili sa obradom za koju su zaduženi i da nisu još stigli na granicu barijere. Poslije izvjesnog vremena, prvi proces završava izvođenje poslova za koje je bio zadužen u ovoj fazi. Po stizanju na barijeru, izvršava funkcije vezane za barijeru preko poziva bibliotečnih funkcija i proces se blokira na barijeri. Nešto kasnije, drugi i treći proces završavaju izvršenje u toku prve faze i po dolasku na barijeru izvršavaju funkcije barijere ( Slika 55 b). Na kraju, kada posljednji proces C stigne na barijeru, i pri izvršenju funkcija barijere dolazi do deblokiranja svih procesa koji su čekali na barijeri, (Slika 55 c) Sinhronizacija procesa - Klasični problemi sinhronizacije Literatura koja se odnosi na probleme međuprocesne komunikacije je puna primjera koji se diskutuju i koriste različite sinhronizacione metode. U sljedećem dijelu pozabavićemo se sa tri takva primjera: o Problem proizvođač potrošač o Problem čitač pisač o Problem filozofa koji jedu

88 Problem proizvođač potrošač 4.17.Problem proizvođač potrošač Kao primjer kako se ove funkcije koriste u praksi, razmotrimo problem proizvođač potrošač, poznat i pod nazivom problem ograničenog bafera. Dva procesa dijele zajednički bafer fiksne veličine. Jedan od njih, proizvođač, stavlja informacije u bafer, a drugi ih uzima (kažemo koristi). Problemi se javljaju kada proizvođač želi da stavi novi element u bafer a bafer je već pun. Za proizvođača je rješenje da se blokira, a da se deblokira kada potrošač ukloni iz bafera jedan ili više elemenata. Slično, ako potrošač želi da ukloni jedan element iz bafera i vidi da je bafer prazan, treba da se blokira sve dok proizvođač ne stavi element u bafer i deblokira ga. Ovaj pristup zvuči sasvim jednostavno, ali dovodi do neke vrste stanja natjecanja, kao što smo vidjeli ranije. Da bi vodili evidenciju o broju elemenata u baferu, potrebna nam je varijabla count. Ako se u baferu može držati N elemenata, proizvođač će prvo testirati da vidi da li je count jednak N. Ako jeste izvršiće svoje blokiranje procesa, a ako nije, proizvođač će dodavati element u bafer i povećavati count za 1. #define N 100 /* broj mjesta u baferu */ int count =0; /* broj elemenata u baferu */ void producer(void) { int item; while (TRUE){ /* stalno ponavljanje */ item = produce_item(); /* proizvodi sljedeći element - item*/ if (count == N) sleep();/*ako je bafer pun, izvrši blokiranje */ insert_item(item); /* ubaci element item u bafer */ count = count + 1; /* povećaj brojač elemenata u baferu */ if (count == 1) wakeup(consumer);/* Je li bafer bio prazan? */ Posao potrošača je sličan: prvo se testira count da bi se vidjelo da li je jednak 0. Ako jeste, onda se vrši blokiranje procesa potrošač, a ako nije jednak 0 uklanja se element iz dijeljenog bafera i smanjuje za 1 varijabla count. Svaki od procesa ima zadatak da vidi da li je drugi proces u stanju blokiranosti i ako treba da se deblokira. (operacija wakeup). Void consumer(void) { Int item; While (TRUE){ /* stalna petlja */ If (count == 0) sleep(); /* ako je bafer prazan,blokiraj */ Item = remove_item(); /* izvadi element iz bafera */ Count = count - 1; /* smanji brojač elemenata u baferu */ If (count ==N 1) wakeup(producer); /* da li je bafer bio pun? ako jeste deblokiraj proizvođača */ consume_item(item); /* štampaj element */ Da bi izrazili sistemske pozive takve kao što su sleep i wakeup u C-u, prikazani su kao pozivi bibliotečnih rutina. Oni nisu dijelovi standardne C biblioteke ali vjerovatno su raspoloživi na bilo kojem sistemu koji u stvari ima ove sistemske pozive. Procedure enter_item i remove_item, koje nisu ovdje prikazane, rade ubacivanje elementa u bafer i vađenje elemenata iz bafera.

89 4.18.Rješavanje problema Proizvođač-Potrošač koristeći semafore 89 Sada se vratimo problemu natjecanja. Ono se može desiti zato što pristupamo varijabli count. Pretpostavimo da je bafer prazan i potrošač je pročitao count da vidi da li je jednak 0. U tom trenutku, raspoređivač odluči da zaustavi proces koji se izvršavao i da pokrene proces proizvođač. Proizvođač unosi novi element u bafer i povećava brojač koji sada iznosi 1. Shvatajući da je brojač bio jednak 0, potrošač se mora blokirati dok proizvođač, zato što je count jednak 1 misli da proces potrošač treba probuditi. Nažalost, potrošač nije stigao da odradi operaciju deblokiranja a signal za buđenje će se izgubiti. Kada se potrošač pokrene kasnije testiraće vrijednost count koju je prethodno pročitao i naći će da je to 0 i blokiraće sam sebe. Prije ili kasnije proizvođač će napuniti bafer i takođe će se blokirati (operacija sleep). Oba će biti blokirana zauvijek. Suštinski problem ovdje je da poslani signal deblokiranja procesa, koji još nije blokiran, je izgubljen. Ako nije izgubljen, onda je sve u redu. Ovaj problem bi mogli riješiti dodavanjem jednog bita kod deblokiranja procesa. Kada se signal deblokiranja pošalje procesu koji još nije blokiran, ovaj bit se postavi. Kasnije, kada proces pokuša da se blokira, ako je taj bit postavljen, treba ga oboriti na 0 i proces će još ostati deblokiran. Na taj način bi se moglo spriječiti da oba procesa ne dođu u stanje blokiranosti Rješavanje problema Proizvođač-Potrošač koristeći semafore Semafori razrješavaju problem gubitka operacije deblokiranja, kao što je prikazano na slici. Suština je da su implementirani na jedan nedjeljiv način. Normalan način implementacije operacija up i down je preko sistemskih poziva, gdje operativni sistem nakratko zabrani sve prekide dok se vrši kritična operacija testiranja semafora. Ako se koriste višestruki procesori, onda svaki semafor treba da bude zaštićen sa varijablom, sa TSL instrukcijom koja se koristi da se osiguramo da samo jedan procesor u jedinici vremena vrši testiranje semafora. Consumer() { While(1) { P(full); P(mutex); <<< kritična sekcija: ukloni element iz dijeljenog bafera >>> V(mutex); V(empty); Producer(){ While (1) { <<< proizvedi element >>> P(empty); /* postoji li prazan element bafera, blokiraj proces ako ga nema */ P(mutex); /* traži kritičnu sekciju dijeljeni bafer */ <<< kritična sekcija >>>< V(mutex); /* oslobodi kritičnu sekciju */ V(full); /* povećaj broj punih mjesta */

90 Problem filozofa koji jedu Ovo rješenje koristi tri semafora: jedan koji se zove full i služi za brojanje popunjenih mjesta u baferu, jedan koji se zove empty koji služi za brojanje praznih mjesta u baferu i jedan koji se zove mutex i služi da proizvođač i potrošač ne pristupe baferu istovremeno ( kažemo za međusobno isključivanje). Inicijalno varijabla full je jednaka 0, varijabla empty je inicijalno jednaka broj praznih elemenata u baferu (veličini bafera) i mutex je postavljen na 1. Semafori se inicijaliziraju na 1 i koriste ih dva ili više procesa da se osiguraju da samo jedan uđe u kritičnu sekciju u isto vrijeme. Takvi semafori se nazivaju binarnim semaforima. Ako svaki proces izvrši operaciju down prije ulaska u kritičnu sekciju i operaciju up poslije napuštanja kritične sekcije, međusobno isključivanje među procesima je zagarantovano. Kako imamo na raspolaganju dobre operacije za među-procesnu komunikaciju, pogledajmo kada se koriste. U sistemu koji koristi semafore, prirodan način je da se sakriju prekidi i da imamo semafor postavljen na 0 i pridružen svakom U/I uređaju. Poslije pokretanja U/I uređaja, proces kojim upravljamo datim uređajem izvršava operaciju down na datom semaforu, dakle odmah se blokira. Kada dođe do prekida, onda obrađivač prekida izvršava operaciju up na tom semaforu što omogućuje procesu koji je čekao na semafor da pređe u stanje spremnih procesa i da brzo dođe na izvršenje. U ovom primjeru, imamo korišćenje semafora na dva različita načina. Mutex-i se koriste za međusobno isključivanje procesa kod pristupa dijeljenoj varijabli. On je napravljen da garantuje samo jednom procesu u datom trenutku da će pristupiti baferu za čitanje i pisanje. Međusobno isključivanje se koristi da spriječi haos. Druga upotreba semafora je za sinhronizaciju. Semafori full i empty su potrebni da bi garantovali da se izvjesni niz događaja desi ili ne desi. U ovom slučaju oni obezbjeđuju da proizvođač prestane izvršavanje kada je bafer pun a potrošač prestane izvršavanje kada je bafer prazan. Ovaj način korišćenje je različiti od međusobnog isključivanja Problem filozofa koji jedu Dijkstra je 1965 predložio rješenje problema sinhronizacije koji nazivamo problem filozofa koji jedu. Problem se može prikazati na sljedeći način. Pet filozofa sjede za okruglim stolom. Svaki filozof ima tanjir sa špagetama. Za jedenje špageta potrebno je koristiti dvije viljuške. Između dva tanjira se nalazi po jedna viljuška. Raspored na stolu je prikazan na slici Slika 56. Slika 56 Pet filozofa koji jedu

91 4.19.Problem filozofa koji jedu 91 Proces koji obavljaju filozofi se sastoji od periodičnog jedenja i razmišljanja. Kada filozof postane gladan on pokušava da dobije lijevu i desnu viljušku. Ako je uspješno dobio dvije viljuške, on počne da jede izvjesno vrijeme, a onda spušta viljuške i nastavlja da razmišlja. Ključno pitanje je: može li se napisati program za svakog filozofa da radi ono što se pretpostavlja da radi a da nikada ne dođe u situaciju da ne može da obavlja svoje funkcije. Ispod je prikazano naivno rješenje problema: #define N 5 /* broj filozofa */ void philosopher(int i) {/* i: broj filozofa,od 0 do 4 */ while (TRUE) { think(); filozof razmišlja */ take_fork(i); /* uzima lijevu viljušku */ take_fork((i+1) % N); /* uzima desnu viljušku ;% je modulo operator */ eat(); /* yum-yum, spaghetti */ put_fork(i); /* stavlja lijevu viljušku na sto */ put_fork((i+1)%n); /* stavlja desnu na sto */ Može se modifikovati program tako da nakon uzimanja lijeve viljuške, program provjerava da vidi da li je desna viljuška raspoloživa. Ako nije, filozof spušta lijevu viljušku na sto, čeka izvjesno vrijeme i onda ponavlja cijeli proces. Ovaj pristup ima isuviše grešaka, iz različitih razloga. Filozofi bi mogli početi algoritam simultano, uzimajući njihove lijeve viljuške i vidjevši da njihova desna viljuška nije raspoloživa, zatim spuštaju svoje lijeve viljuške, čekaju, uzimaju svoje lijeve viljuške ponovno i tako zauvijek. Situacija kao ova u kojoj se svi programi nastavljaju izvršavati beskonačno dugo ali ne uspijevaju da naprave napredak se naziva umiranjem procesa. Razmotrimo pristup kada filozofi razmišljaju proizvoljan broj vremenskih jedinica prije nego što pokušaju ponovno tražiti, kako ne bi nastupili u isto vrijeme. Ovakav pristup će dati rezultate i broj grešaka će se znatno smanjiti. Međutim, želimo napisati aplikaciju koja nikada ne griješi i vrši sinhronizaciju procesa korektno. Rješenje je dato u sljedećem dijelu i omogućuje maksimalni paralelizam među procesima. Koristi jedan niz, stanje da vodi evidenciju da li filozof jede, razmišlja ili je gladan (kada pokušava da dobije dvije viljuške). Filozof se može premjestiti u stanje jede samo ako nijedan susjed ne jede. Susjedi filozofa su definisani sa makro vrijednostima LEFT i RIGHT. Drugim riječima, ako je i jednak 2 onda je LEFT jednako 1 a RIGHT jednako 3.

92 Problem filozofa koji jedu #define N 5 /* number of philosophers */ #define LEFT (i+n-1)%n /* number of i's left neighbor */ #define RIGHT (i+1)%n /* number of i's right neighbor */ #define THINKING 0 /* philosopher is thinking */ #define HUNGRY 1 /* philosopher is trying to get forks */ #define EATING 2 /* philosopher is eating */ typedef int semaphore; semaphores are a special kind of int */ int state[n]; /* array to keep track of everyone's state */ semaphore mutex = 1;* mutual exclusion for critical regions */ semaphore s[n]; /* one semaphore per philosopher */ void philosopher(int i)/* i: philosopher number, from 0 to N1 */ { while (TRUE){ /* repeat forever */ think(); /* philosopher is thinking */ take_forks(i); /* acquire two forks or block */ eat(); /* yum-yum, spaghetti */ put_forks(i); /* put both forks back on table */ void take_forks(int i) /* i:philosopher number, from 0 to N1 */ { down(&mutex); /* enter critical region */ state[i] = HUNGRY; /* record fact that philosopher i hungry */ test(i); /* try to acquire 2 forks */ up(&mutex); /* exit critical region */ down(&s[i]); /* block if forks were not acquired */ void put_forks(i) /* i: philosopher number, from 0 to N1 */ { down(&mutex); /* enter critical region */ state[i] = THINKING; /* philosopher has finished eating */ test(left); /* see if left neighbor can now eat */ test(right); /* see if right neighbor can now eat */ up(&mutex); /* exit critical region */ void test(i) /* i: philosopher number, from 0 to N1* / { if (state[i] == HUNGRY && state[left]!= EATING && state[right]!= EATING) { state[i] = EATING; up(&s[i]); Program koristi niz semafora, jedan po filozofu, tako da se gladni filozofi mogu blokirati ako je njihova viljuška zauzeta. Primijetimo da svaki proces izvršava proceduru philosopher kao svoj osnovni kod dok druge procedure, take_forks, put_forks i test su obične procedure i nalaze se u procesu.

93 4.20.Problem čitača i pisaca Problem čitača i pisaca Problem filozofa koji jedu je koristan za modeliranje procesa koji se natječu za ekskluzivan pristup ograničenom broju resursa, takvih kao što su U/I uređaji. Drugi, poznati, problem predstavlja problem čitača i pisaca kojim se modelira pristup bazama podataka. Zamislimo, na primjer, jedan sistem za rezervaciju karata, sa mnogo procesa koji se natječu u želji da pristupe sistemu čitajući ili pišući svoje zahtjeve. Prihvatljivo je da imamo više procesa koji čitaju baze podataka u isto vrijeme, ali ako neki od procesa želi da ažurira (čitaj piše) bazu podataka nijedan drugi proces ne smije imati pristup bazi podataka, čak ni čitači (procesi koji čitaju bazu podataka). Kako da se izgradi program za čitače i pisce u bazu podataka. Jedno rješenje je prikazano na slici ispod. U ovom rješenju, prvi čitač koji dobije pristup bazi podataka izvršava operaciju down() na semaforu db. Sljedeći čitači treba samo da povećaju brojač rc za jedan. Kada čitači napuštaju bazu podataka, oni smanjuju brojač za jedan i posljednji ćitač izvršava up() proceduru koja omogućuje blokiranim štampačima, ako ih ima, da dobiju pristup bazi podataka. typedef int semaphore; /* use your imagination */ semaphore mutex = 1; /* controls access to 'rc' */ semaphore db = 1; /* controls access to the database */ int rc = 0; /* # of processes reading or wanting to */ void reader(void) { while (TRUE){ /* repeat forever */ down(&mutex); /* get exclusive access to 'rc' */ rc = rc + 1; /* one reader more now */ if (rc == 1) down(&db); * if this is the first reader... */ up(&mutex); /* release exclusive access to 'rc' */ read_data_base(); /* access the data */ down(&mutex); /* get exclusive access to 'rc' */ rc = rc-1; /* one reader fewer now */ if (rc == 0) up(&db); /* if this is the last reader... */ up(&mutex); /* release exclusive access to 'rc' */ use_data_read(); /* noncritical region */ void writer(void) { while (TRUE){ /* repeat forever */ think_up_data(); /* noncritical region */ down(&db); /* get exclusive access */ write_data_base(); /* update the data */ up(&db); /* release exclusive access */ Pretpostavimo da, dok jedan čitač koristi bazu podataka, drugi čitač može doći i takva situacija je prihvatljiva. Pretpostavimo da sada dolazi pisac. On ne može pristupiti bazi podataka pošto mora imati eksluzivno pravo pristupa, tako da se pisac mora suspendovati. Kasnije mogu dolaziti i dodatni čitači povećavajući broj čitača. To znači, dok god je jedan čitač aktivan, čitači mogu pristupati bazi podataka. Kao posljedica takve strategije, dok god postoje

94 BACI Ben Ari Concurrent interpreter aktivni čitači novi čitači mogu pristupati bazi podataka, a to znači da će pisac biti blokiran bez obzira kada je stigao. Recimo, ako novi čitači stižu svake 2 sekunde i svaki čitač treba za čitanje baze podataka 5 sekundi, onda pisac neće nikada dobiti pravo pristupa bazi podataka. Da bi spriječili ovakvu situaciju program bi trebalo nešto promijeniti: kada čitač stiže a pisac je blokiran, čitača treba blokirati iza pisca umjesto da mu se da šansa da odmah pristupi bazi podataka. Na ovaj način, pisac mora da čeka na čitače koji su bili aktivni kada je je pisac tražio zahtjev za pristup bazi podataka a ne mora da čeka na one pisce koji su došli iza njega. Mana ovog rješenja je da se postiže manja konkurentnost a na taj način i lošije performanse BACI Ben Ari Concurrent interpreter Na univerzitetu Minesotta razvijen je nastavni programski jezik za upoznavanje koncepata konkurentog programiranja. BACI C-- je podskup jezika C. Dakle, prati se C/C++ sintaksa uz neka ograničenja i nove tipove podataka i programske strukture. Alternativno, postoji i Pascal verzija. Nije namijenjem razvoju aplikacija, nego za školske eksperimente iz sinhronizacije procesa. Kompajler za njega generiše pseudokod koji se nakon toga interpretira uz namjernu stohastiku prilikom izmjene niti. Ovo su njegove sintaksne osobine: 1. Nema drugih datoteka osim standardnog ulaza-izlaza: cout, cin i endl. 2. Samo prosti C/C++ tipovi postoje u C-- BACI: int i char. Podržane su konstante prostih tipova. (Sve varijable moraju biti definisane na početku kodnog bloka gdje se pojavlju.) 3. Podržan je string tip i neke ugrađene funkcije: stringcopy, stringcompare, stringconcat, etc. 4. Podržani su nizovi prostih tipova i string tipova. Deklaracija nizova prati uobičajenu C sintaksu. 5. Podržane su funkcije sa standardnim pravilima uključujući opseg varijabli i rekurziju. Parametri se prosljeđuju po vrijednosti ili referenci. Izvršenje počinje od main(). 6. Izvršne naredbe su if-else, switch/case, for, while, do-while, break i continue. Sintaksa ovih naredbi je kao u standardnom C/C++. Uvedene su konstrukcije za realizaciju konkurentosti 1. cobegin Lista procesa koji se konkurentno izvršavaju uokvirena je u cobegin blok. Takvi blokovi se ne mogu gnijezditi i moraju se nalaziti u glavnom programu. PCODE naredbe koje pripadaju nabrojanim procedurama se prepliću interpreterom u slučajnom redoslijedu, tako da višestruko izvršavanje istog programa koji ima cobegin blok će izgledati nedeterminističko. Glavni program se zaustavlja dok se svi procesi u cobegin bloku ne zaustave, nakon čega glavni program nastavlja izvršavanje naredbi iza bloka. Na primjer: cobegin { proc1(... ); proc2(... );... ; procn(... ); 2. semafori semaphore je predefinisana vrijednost u BACI. On je nenegativna varijabla kojoj se može pristupiti samo na ograničen način. BACI također ima podtip binarysem koji je binarni semafor koji samo pretpostavlja vrijednosti 0 i 1. Semaforske funkcije uključuju:

95 4.21.BACI Ben Ari Concurrent interpreter 95 initialsem ( semaphore, integer_expression ): Inicijalizira semafor na navedenu vrijednost. p ( semaphore) ili wait (semaphore): Ako je semaphore > 0 umanji semafor za 1 i vrati se, čime pozivalac može nastaviti izvršenje. Ako je semaphore = 0, pozivalac se prebacuje u čekanje. v ( semaphore) ili signal (semaphore): Ako je semaphore = 0 i jedan ili više procesa čekaju na semafor, slučajno probudi jedan od čekajućih procesa. Ako ni jedan proces ne čeka na semafor, uvećaj semafor za jedan. U svakom slučaju, pozivalac nastavlja s izvršenjem. 3. monitori BACI podržava i Hoareove monitore s nekim ograničenjima. Monitor je C blok s nekim dodatnim mogućnostima. Sve funkcije u monitorskim blokovima su vidljive spolja, ali monitorske varijable nisu pristupačne van bloka i mogu ih čitati samo monitorske funkcije. Monitor se može deklarisati samo na globalnom nivou i monitori se ne mogu gnijezditi. Samo jedna monitorska procedura se može izvršavati u jednom trenutku, pa se monitori mogu koristiti za uzajamno isključivanje. Tri konstrukcije se koriste za kontrolu konkurentnosti u monitoru condition varijable, waitc (wait on condition), i signalc (signal a condition). condition varijable su pristupačne samo u monitorskim funkcijama. Condition varijabla nikada nema vrijednost, ona je prosto nešto na šta se čeka i što se signalizira. void waitc (condition cond, int prio): monitorski proces je blokiran i dodijeljen mu je prioritet prio za ponovno buđenje. Ova akcija blokiranja omogućava izvršavanje drugih monitorskih procesa ako je neki spreman. void waitc (condition cond): ista semantika kao waitc, ali se dodjeljuje podrazumijevani prioritet 10. void signalc (condition cond): Probudi proces koji čeka na cond, inače ne radi ništa. void empty (condition cond): Vraća 1 ako nema procesa koji čekaju na condition cond a 0 ako ih ima. 4. Druge konkurentne konstrukcije atomic : Ako je funkcija definisana kao atomic, ona se neće prekidati. void suspend ( void ): smješta pozivaoca u stanje čekanja. void revive ( int process_id ): reaktivira proces s datom oznakom. int which_proc( void ): Vraća oznaku trenutnog procesa. int random (int range): vraća slučajan broj između 0 i range -1, uključivo. Kompajler, a zatim interpreter p-koda se pokreće iz komandne linije i svaki od primjera treba startati više puta, jer se svaki primjer ponaša drugačije pri drugom startu. Na primjer: edit haos.cm (ili drugi editor, npr kwrite program) bacc haos.cm bainterp haos.pco bainterp haos.pco bainterp haos.pco bainterp haos.pco

96 BACI Ben Ari Concurrent interpreter Sljedećih nekoliko primjera će ilustrovati načine upotrebe semafora, atomskih funkcija i monitora. Primjer 1: Haos Svako izvršavanje je različito. Nekada se prvo izvrši funkcija koja ispisuje slovo A, a nekada ona koja ispisuje slovo B ili C. I prekidi se dešavaju usred ispisa na ekran. Ovo ilustruje borbu za resurs, u ovom slučaju ekran. void HelloA () { cout << "Hello from A" <<endl; void HelloB () { cout << "Hello from B" <<endl; void HelloC () { cout << "Hello from C" <<endl; main () { cobegin { HelloA(); HelloB(); HelloC(); Primjer 2: Haos je veći sto su procesi duži Prekidanje programa je još uočljivije nego u prethodnom primjeru, jer su funkcije za prikaz duže. void HelloA () { int i,j; for (i=1;i<=5; i++) { for (j=1;j<=5; j++) cout << "A"; cout << endl; void HelloB () { int i,j; for (i=1;i<=5; i++) { for (j=1;j<=5; j++) cout << "B"; cout << endl; void HelloC () { int i,j; for (i=1;i<=5; i++) { for (j=1;j<=5; j++) cout << "C"; cout << endl; main () { cobegin { HelloA(); HelloB(); HelloC(); Primjer 3: Uzajamno isključivanje semaforima Redoslijed nije i dalje predvidljiv. Ali, više nema prekidanja ured ispisa. Semafori su realizovali uzajamno isključivanje. Semafor je inicijaliziran na 1. Krene li izvršenje bilo koje

97 4.21.BACI Ben Ari Concurrent interpreter 97 procedure, pokrene se wait. On umanji semafor na 0 i sprečava da wait nad istim semaforom nastavi izvršavanje. Tek kada je tekst ispisan, naredba signal inkrementira semafor za jedan i time se može nastaviti izvršavanje zaustavljenih rutina u wait.. semaphore mut; void HelloA () { wait(mut); cout << "Hello from A" <<endl; signal(mut); void HelloB () { wait(mut); cout << "Hello from B" <<endl; signal(mut); void HelloC () { wait(mut); cout << "Hello from C" <<endl; signal(mut); main () { initialsem(mut,1); cobegin { HelloA(); HelloB(); HelloC(); Primjer 4: Uzajamno iskljucivanje atomskim funkcijama Ključna riječ atomic sprječava prekidanje funkcije. Zašto postoje i semafori? Nekada je potrebno blokirati samo one procese koji pristupaju istim resursima, što se postiže semaforima, dok atomic prekida izvršenje svih ostalih procesa dok se on ne završi. atomic void HelloA () { cout << "Hello from A" <<endl; atomic void HelloB () { cout << "Hello from B" <<endl; atomic void HelloC () { cout << "Hello from C" <<endl; main () { cobegin { HelloA(); HelloB(); HelloC(); Primjer 5: Postavljanje redoslijeda izvršavanja semaforima Treba primijetiti da su semafori enda i endb postavljeni na 0, te da podprogram HelloC čeka da se završe i HelloA i HelloB. Tako se HelloC uvijek izvršava posljednji.

98 BACI Ben Ari Concurrent interpreter semaphore enda,endb,mut; void HelloA () { wait(mut); cout << "Hello from A" <<endl; signal(mut); signal(enda); void HelloB () { wait(mut); cout << "Hello from B" <<endl; signal(mut); signal(endb); void HelloC () { wait(enda); wait(endb); wait(mut); cout << "Hello from C" <<endl; signal(mut); main () { initialsem(enda,0); initialsem(endb,0); initialsem(mut,1); cobegin { HelloA(); HelloB(); HelloC(); Primjer 6: Limitiranje broja procesa semaforima Od pet procesa, dva se izvršavaju istovremeno, što je postignuto inicijalizacijom semafora na 2 semaphore limit; void HelloA () { int i,j; wait(limit); for (i=1;i<=5; i++) { for (j=1;j<=5; j++) cout << "A"; cout << endl; signal(limit); void HelloB () { int i,j; wait(limit); for (i=1;i<=5; i++) { for (j=1;j<=5; j++) cout << "B"; cout << endl; signal(limit);

99 void HelloC () { int i,j; wait(limit); for (i=1;i<=5; i++) { for (j=1;j<=5; j++) cout << "C"; cout << endl; signal(limit); void HelloD () { int i,j; wait(limit); for (i=1;i<=5; i++) { for (j=1;j<=5; j++) cout << "D"; cout << endl; signal(limit); void HelloE () { int i,j; wait(limit); for (i=1;i<=5; i++) { for (j=1;j<=5; j++) cout << "E"; cout << endl; signal(limit); 4.21.BACI Ben Ari Concurrent interpreter 99 main () { initialsem(limit,2); cobegin { HelloA(); HelloB(); HelloC(); HelloD(); HelloE(); Primjer 7: Limitiranje broja procesa semaforima s različitim prioritetom Uočava se da se D i E nikada ne razmjenjuju istovremeno, a ako su D ili E pokrenuti, da se tada mogu razmjenjivati sa najviše dva od tri procesa A,B,C. semaphore limit; void HelloA () { int i,j; wait(limit); for (i=1;i<=5; i++) { for (j=1;j<=5; j++) cout << "A"; cout << endl; signal(limit);

100 BACI Ben Ari Concurrent interpreter void HelloB () { int i,j; wait(limit); for (i=1;i<=5; i++) { for (j=1;j<=5; j++) cout << "B"; cout << endl; signal(limit); void HelloC () { int i,j; wait(limit); for (i=1;i<=5; i++) { for (j=1;j<=5; j++) cout << "C"; cout << endl; signal(limit); void HelloD () { int i,j; wait(limit); wait(limit); wait(limit); for (i=1;i<=5; i++) { for (j=1;j<=5; j++) cout << "D"; cout << endl; signal(limit); signal(limit); signal(limit); void HelloE () { int i,j; wait(limit); wait(limit); wait(limit); for (i=1;i<=5; i++) { for (j=1;j<=5; j++) cout << "E"; cout << endl; signal(limit); signal(limit); signal(limit); main () { initialsem(limit,5); cobegin { HelloA(); HelloB(); HelloC(); HelloD(); HelloE(); Primjer 8: Simulacija instrukcije TestAndSet TestAndSet je najprimitivnija potrebna mašinska instrukcija za realizaciju konkurentnosti. Ona daje kao rezultat prethodnu vrijednost memorijske lokacije i postavlja je na 1. Pazite na tačka-zarez iza naredbe

101 4.21.BACI Ben Ari Concurrent interpreter 101 while (test_and_set(lock)) /* wait */ ; Ukidanjem ove while petlje, procesi se razmjenjuju prilikom ispisa na ekran. sprobajte i verziju bez ove petlje. atomic int test_and_set(int& target) { int u; u = target; target = 1; return u; int lock = 0; void proc(int id) { int i = 0; int j; while(i < 10) { while (test_and_set(lock)) /* wait */ ; for (j=1;j<=50;j++) cout << id; lock = 0; i++; main() { cobegin { proc(1); proc(2); proc(3); Primjer 9: Monitori. Uzajamno isključivanje se može realizovati i smiještanjem procedura unutar monitora. monitor testmon { void HelloA () { cout << "Hello from A" <<endl; void HelloB () { cout << "Hello from B" <<endl; void HelloC () { cout << "Hello from C" <<endl; main () { cobegin { HelloA(); HelloB(); HelloC(); Primjer 10: Monitorske procedure WAITC i SIGNALC U ovom primjeru se vidi razlika između semaforskih wait/signal (koje se baziraju na vrijednostima semafora i čekanju ako je ona manja od 1) i monitorskih waitc i signalc (koje koriste condition varijable koje nemaju vrijednost u klasičnom smislu te riječi.

102 Među-procesna komunikacija monitor simple_monitor { int finish; condition Cwait; void say_hello (char id) { if ( id == 'C' ) { if ( finish!= 2 ) waitc( Cwait ); cout << "hello from process " << id << endl; if ( id!= 'C' ) { finish++; if ( finish == 2 ) signalc( Cwait ); // initialise the integer values to 0 init { finish = 0; void A(){ say_hello( 'A' ); void B(){ say_hello( 'B' ); void C() { say_hello( 'C' ); main() { cobegin { A(); B(); C(); cout << " all finished " << endl; 4.22.Među-procesna komunikacija Tehnike za među-procesnu komunikaciju obezbjeđuju metode pomoću kojih više procesa mogu da komuniciraju jedan sa drugim. Nabrojimo nekoliko tehnika za među-procesnu komunikaciju koje su na raspolaganju u Linuxu: Jednosmjerne UNIX cijevi (pipe) (neimenovani) Imenovane cijevi Redovi za poruke tipa SYSV Skup semafora tipa SYSV Dijeljena memorija tipa SYSV Mrežni socketi tipa Berkeley Dvosmjerne cijevi (STREAMS cijevi) Kada se koriste ove tehnike efikasno, obezbjeđuju dobru platformu za razvoj aplikacija tipa klijent / server na bilo kojem UNIX-u, uključujući i Linux Neimenovane UNIX cijevi Cijevi (pipe) predstavlja jednosmjeran komunikacioni kanal između dva procesa u UNIX-u. Bilo koja cijev ima dva kraja: jedan za pisanje i jedan za čitanje. Svaki od ovih krajeva ima odgovarajući cjelobrojni deskriptor koji je nešto slično kao datotečni deskriptor. Oba

103 4.23.Neimenovane UNIX cijevi 103 deskriptora su rezultat kreiranja cijevi sistemskim pozivom pipe(). Koristeći cijevi, jedan proces može puniti bajte na kraj za pisanja a neki drugi proces može preuzimati ovaj tok bajta na kraju za čitanje. Neimenovane cijevi se koriste uglavnom da se izmjene poruke između povezanih procesa (na primjer, između dva procesa dijete koji imaju isti proces roditelj). Cijev se može koristiti za međusobnu komunikaciju između procesa roditelj i njegove djece, kao i neku drugu kombinaciju procesa, recimo procesa djeda i unuka i sl. Sa logičke tačke gledišta, cijev je specijalna datoteka i ako ju je kreirao neki proces onda je mogu koristiti bilo koji par procesa uključujući proces kreator kao i sve procese koje je on kreirao. Neimenovana cijev se kreira korišćenjem sistemskog poziva pipe(): ret = pipe (fd); gdje ret predstavlja povratni kod tipa integer a fd predstavlja dvodimenzionalni niz int fd[2], koji dobija vrijednosti nakon izvršenja sistemskog poziva. Sistemski poziv pipe() vraća 0 ako je uspješan ili -1 u slučaju greške. Ako je sistemski poziv uspješan, onda prvi element fd[0] predstavlja datotečni deskriptor za čitanje a fd[1] predstavlja datotečni deskriptor za pisanje na kreiranoj cijevi. Izlaz iz ls Ulaz u sort ls cijev sort Dolazni tok do cijevi (za pisanje) Odlazni tok iz cijevi (za čitanje) Na ekran Slika 57 Komunikacija između aplikacija pomoću cijevi Neka, na primjer, proces roditelj na početku kreira cijev a zatim kreira dva procesa tipa dijete. Jedan od ovih dijete-procesa trebao bi da izvrši neke komande u komandnom jeziku ( recimo «ls») i da piše rezultat ove komande u cijev. Drugi proces dijete trebao bi da izvrši neku drugu komandu (na primjer, sort ) uzimajući njegov ulaz sa iste cijevi (Slika 57). Dakle, potpuni efekat izvršenja dva procesa dijete može se predstaviti kao niz od dvije komade u komandom jeziku ( shell ) ls sort, gdje znak predstavlja operaciju pipe u komandom jeziku (vidi sliku ispod). U nastavku je dat primjer programa koji se koristi za ove svrhe.

104 Windows API za komunikaciju cijevima i Mail slotovima /* Program sa neimenovanim pipe-ima */ #include <stdio.h> #include <unistd.h> main (){ int fd[2]; /* Niz od dva deskriptora za neimenovani pipe */ int pid; /* Variabla za identifikacu procesa */ /* Pipe treba kreirati prije bilo kojeg fork()-a */ if (pipe(fd) < 0){ perror ("PIPE greška u kreiranju "); exit (1); pid = fork (); /* Proces roditelj: kreira se prvo dijete*/ if (pid == 0) { /* prvi process dijete počinje ovdje */ dup2 (fd[0],0); /* Standarni ulaz će se uzeti sa pipe-a */ close (fd[1]); /* Drugi kraj pipe-a će se zatvoriti za */ /* ovaj proces jer se neće koristiti */ execlp ("sort", "sort", 0); /* Pokreni sort komandu pipe */ else /* Ovdje process roditelj nastavlja */ pid = fork (); /* Proces roditelj: kreira 2. proces dijete */ if (pid == 0) { /* Drugi process dijete počinje ovdje */ dup2 (fd[1],1); /* Standarni izlaz će biti na kraju pipe-a*/ close (fd[0]); /* Ulaz u pipe je zatvoren jer se ne koristi */ execlp ("who", "who", 0);/* Komanda who šalje izlaz na pip-e*/ else { /* Proces roditelj zatvara pipe i čeka da djeca završe */ close (fd[0]); close (fd[1]); wait (0); wait (0); Napomena: Bibliotečna funkcija dup2(fd1,fd2) obavlja dupliranje datotečnog deskriptora fd1 u fd2. Ako se fd2 odnosi na već otvorenu datoteku, onda se ova datoteka prvo zatvara. Da bi razumjeli ovu funkciju detaljnije, vidi komandu man dup Windows API za komunikaciju cijevima i Mail slotovima Cijevi u Windows-u služe za komunikaciju aplikacija koristeći funkcije za pisanje datoteka. Principjelno se koriste sličnu Unix cijevima, ali se koriste druge funkcije. Kreiraju se sljedećim funkcijama: CreatePipe(phReadPipe,phWritePipe,lpPipeAttributes,nSize) Kreira neimenovanu cijev CreateNamedPipe(lpName,dwOpenMode,dwPipeMode, nmaxinstances,noutbuffersize,ninbuffersize,ndefaulttimeout, lpsecurityattributes) Kreira imenovanu cijev ConnectNamedPipe(hNamedPipe,lpOverlapped); Postavlja server za imenovanu cijev Pored cijevi, komunikacija preko mailslot radi na isti način, samo se koriste druge virtualne datoteke. Mailslot je virtualna datoteka kojoj se šalju podaci koristeći funkcije za pristup datotekama. Takve datoteke se imenuju kao u sljedećem primjeru.

105 4.25.Prosljeđivanje poruka 105 LPTSTR SlotName = TEXT("\\\\.\\mailslot\\sample_mailslot"); 4.25.Prosljeđivanje poruka Jedna od popularnih metoda među-procesne komunikacije se naziva prosljeđivanje poruka. Pojam poruke je dovoljno apstraktan da se koristi, sa različitim načinima implementacije, između podsistema operativnih sistema na mikro-jezgru ili hibridnom jezgru, procesa ili niti na istom operativnom sistemu ili različitih računara na globalnim i lokalnim mrežama. Pristup se razlikuje od dijeljene memorije kao komunikacijskog mehanizma u tome što se podaci koji se prosljeđuju porukama ne moraju štititi semaforima, jer su realizovane smiještanjem kopije podatka u posebne redove čekanja. Poruke se razlikuju od cijevi po tome što se mogu dizajnirati i za više odredišta i više različitih prioriteta. Metoda koristi dvije funkcije, send i receive koje predstavljaju jezičke konstrukcije a ne sistemske pozive operativnom sistemu. Kao takve one se mogu ugraditi u bibliotečne funkcije, kao na primjer: send(odredište, &poruka); i receive(izvor, &popruka); Poziv send() šalje poruku ka datom odredištu dok poziv receive() prima poruku od odgovarajućeg pošiljaoca, ili od bilo koga, ako mu to nije važno. Ako nema poruke, proces koji prima poruke će se blokirati sve dok ne stigne neka poruka. Moguće je napisati alternativnu funkciju receive() koja završava odmah sa kodom greške (tipa nema poruka) Projektna pitanja za sistem prosljeđivanja poruka Sistem prosljeđivanja poruka ima više problema kod projektovanja nego što su to imali semafori i monitori, posebno ako su međusobno povezani procesi na različitim računarima u mreži. Na primjer, poruke mogu biti izgubljene u mreži. Da se osiguramo od gubitaka poruka, pošiljalac može poslati posebnu poruku potvrde uspješnog prijema. Ako pošiljalac ne primi poruku potvrde prijema unutar nekog vremenskog intervala, on vrši ponovno slanje poruke (retransmisija poruke). Razmotrimo šta će se desiti ako primalac primi korektno poruku, ali se potvrda o njenom prijemu zagubi. Pošiljalac će izvršiti retransmisiju poruku tako da će je primaoc dobiti dva puta. Izuzetno je važno da primalac može razlikovati novu poruku od prethodno primljene poruke. Ovakav problem se razrješava stavljanjem niza brojeva u svaku originalnu poruku. Ako primalac primi poruku koja ima isti broj kao već primljena poruka onda on zna da to predstavlja duplikat poruke i odbaciće je. Sistemi za prosljeđivanje poruka treba da se bave i pitanjem imenovanja poruka tako da procesi navedeni u operacijama send i receive ne budu nejasni. Autentičnost je takođe bitna u ovom sistemu prosljeđivanja poruka: kako pošiljalac može reći da komunicira sa pravim serverom a ne sa varalicom? Pored toga postoje i projektna pitanja kada pošiljalac i primalac nisu na istim računarima. Jedno od ovih su performanse. Kopiranje poruka od jednog procesa do drugog je uvijek sporije nego izvršavanje semaforskih operacija ili ulaska u monitor. Da bi se poboljšale performanse, jedno od rješenja bi moglo biti ograničenje veličine poruka koje bi mogle stati u registre a onda prosljeđivati poruke koristeći registre.

106 Problem proizvođač potrošač koristeći prosljeđivanje poruka 4.27.Problem proizvođač potrošač koristeći prosljeđivanje poruka Pogledajmo sada kako problem proizvođač potrošač može biti razriješen koristeći tehniku prosljeđivanja poruka. Rješenje je dato na slici ispod. Pretpostavimo da su sve poruke iste veličine i da su poslane, ali nepotvrđene, poruke baferovane od strane operativnog sistema. U ovom rješenju, ukupno se koristi N poruka. Potrošač počinje slanjem N praznih poruka pošiljaocu. Kada proizvođač ima potrebu da jedan element preda korisniku, on uzima praznu poruku, puni je i šalje primaocu. Na ovaj način, ukupan broj poruka u sistemu ostaje konstantan u vremenu, tako da u njih mogu smjestiti dati iznos memorije unaprijed. #define N 100 /* number of slots in the buffer */ void producer(void){ int item; message m; /* message buffer */ while (TRUE) { item = produce_item(); /* generate something to put buffer */ receive(consumer, &m); /* wait for an empty to arrive */ build_message(&m, item); /* construct a message to send */ send(consumer, &m); /* send item to consumer */ void consumer(void) { int item, i; message m; for (i = 0; i < N; i++) send(producer, &m); /* send N empties */ while (TRUE) { receive(producer, &m); /* get message containing item */ item = extract_item(&m); /* extract item from message */ send(producer, &m); /* send back empty reply */ consume_item(item); /* do some1thing with the item */ Ako proizvođač radi brže od potrošača, sve poruke će se napuniti. Proizvođač će se blokirati čekajući na jednu praznu poruku koja treba da dođe. Ako potrošač radi brže, onda će se slično desiti: sve poruke će biti prazne čekajući od proizvođača da ih napuni, dok će se potrošač blokirati čekajući na pune poruke. Mnoge varijante su moguće sa prosljeđivanjem poruka. Za početak, da vidimo kako se adresiraju poruke. Jedan način je da se pridruži svakom procesu jedinstvena adresa na koju bi se smiještala poruka. Drugi način je da se definiše struktura podataka, nazvana poštanski sandučić (engl. mailbox). Poštanski sandučić je mjesto u koje se smiješta jedan broj poruka, koji se navede kod kreiranja mailbox-a. Kada se koriste mailbox-i onda su adresni parametri u operacijama send i receive mailbox-i a ne procesi Kada jedan proces pokuša da pošalje u mailbox koji je pun, dolazi do blokiranja procesa sve dok se bar jedna poruka ne ukloni iz mailbox-a praveći prazan prostor za novu poruku.

107 4.28.Windows API, prosljeđivanje poruka 107 Za problem proizvođača i potrošača, i proizvođač i potrošač bi trebali kreirati mailbox-e dovoljne dužine da drže N poruka. Proizvođač će poslati poruke koje sadrže podatke u mailbox potrošača, a potrošač će poslati prazne poruke u mailbox proizvođača. Kada se koriste mailboxi mehanizam baferovanja je jasan: odredišni mailbox drži poruke koje su poslane ka procesu potrošač ali nisu još potvrđene. Drugi ekstrem, kod rada sa mailbox, je elimisanje baferovanja. Kod ovakvog pristupa imamo sljedeću situaciju. Ako je send izvršen prije receive, proces koji šalje se blokira dok se ne probudi potrošač i izda receive. U tom momentu se poruka kopira direktno od pošiljaoca ka primaocu bez baferovanja. Slično, ako je prvo receive izvršen, primalac se blokira dok se jedan send ne desi. Ova strategija je poznata pod nazivom randezvous. Lakša je za implementaciju od baferovanja poruka ali je manje fleksibilna pošto i pošiljaoc i primaoc su prinuđeni da se izvršavaju. Kod operativnog sistema MINIX 3, koristi se metoda rendezvous sa fiksnom veličinom poruka za za komunikaciju unutar operativnog sistema. Korisnički procesi, takođe koriste ovu metodu za komunikaciju sa komponentama operativnog sistema. Među-procesna komunikacija između korisničkih procesa u MINIX 3 ( i UNIX-u) se izvodi preko cijevi, koji u suštini predstavljaju mailbox-e. Jedina suštinska razlika između sistema za prosljeđivanje poruka i mehanizma cijevi je da cijevi ne čuvaju granice poruka. Drugim riječima, ako jedan proces piše 10 poruka od 100 bajta u pipe a drugi proces čita 1000 bajta iz pipe-a, proces koji čita dobiće svih 10 poruka odjednom. Kod sistema sa prosljeđivanjem poruka, svaka operacija read vraća samo jednu poruku. Međutim, ako se procesi unaprijed «dogovore» da da čitaju i šalju poruke fiksne dužine ili su poruke ograničene nekim «graničnikom» koji označava kraj poruke, problemi se neće desiti. Sistem za prosljeđivanje poruka se uglavnom koristi kod sistema sa paralelnim programiranjem. Jedan dobro poznati sistem za prosljeđivanje poruka je MPI (engl. Message Passing Interface). Ima široku primjenu u naučnim obradama Windows API, prosljeđivanje poruka Sve Windows aplikacije, osim nekih konzolnih, koriste poruke za komunikaciju između prozora. Neke funkcije za prosljeđivanje poruka su: GetMessage(lpMsg,hWnd, wmsgfiltermin, wmsgfiltermax) Preuzima sljedeću poruku u redu čekanja na sve poruke između prozora i čeka ako nema poruka PeekMessage(lpMsg,hWnd, wmsgfiltermin, wmsgfiltermax,wremovemsg) Preuzima sljedeću poruku u redu čekanja na sve poruke između prozora ali ne čeka ako nema poruka DispatchMessage(lpmsg) Šalje narednu poruku u redu čekanja, a Windows sam odredi kojem prozoru je namijenjena SendMessage (hwnd, Msg,wParam,lParam) Direktno šalje poruku navedenom prozoru Svaka poruka ima svoj kod. Za prebacivanje podataka opšte namjene se koriste poruke koda WM_COPYDATA, ili WM_DDE_DATA. Ako se koriste WM_DDE_DATA treba inicijalizacija komunikacije koristeći poruke WM_DDE_ADVISE, WM_DDE_INITIATE, inicijalizacija DDE prijenosa 4.29.Posix API za poruke U POSIX API poruke se prosljeđuju sljedećim funkcijama. mq_open(pcname, ioflag) Povezuje se na red poruka

108 Signali mq_close(mqdes) Završava konekciju s otvorenim redom poruka mq_unlink(pcname) Završava konekciju s otvorenim redom poruka i nakon zadnje poruke uklanja i red poruka mq_send(mqdes, pcmsg_ptr,imsg_len, uimsg_prio) Stavlja poruku u red poruka mq_receive(mqdes, pcmsg_ptr,imsg_len, pmsg_prio) Prima i uklanja najstariju najprioritetniju poruku mq_notify(mqdes, psevp) Izvještava proces ili nit da je poruka dostupna u redu čekanja mq_setattr(mqdes, pnewattr, poldattr) Postavlja atribute reda čekanja poruka mq_getattr(mqdes, struct mq_attr *attr) Čita atribute reda čekanja poruka 4.30.Signali Signali predstavljaju kompleksne operacije za upravljanje procesima. Signal je neka vrsta prekida programa. Na primjer, kada pritisnete CTRL^C onda šaljete signal SIGINT ka vašem programu. Kada napravite grešku kod pristupa nedozvoljenom segmentu onda se signal SIGSEGV šalje vašem programu. Vaš program ima više načina da radi sa signalima. Unaprijed su definisane određene akcije koje će se desiti na pojavu određenih signala. Na primjer, kada pritisnete CTRL^C program će obično završiti izvođenje. Ova akcija je predefinisana za signal SIGINT. Kada pritisnete CTRL^\ ili pristupite nedozvoljenom segmentu vaš program će napraviti sliku memorije kod pada (engl. dump core) i završiti izvođenje. Ovo su primjeri predefinisanih akcija za signale SIGQUIT i SIGSEGV. SIGALRM JEZGRO SIGPIPE Upravljanje memorijom Komanda školjke SIGKILL Proces SIGSEGV SIGWINCH SIGINT SIGUSR1 SIGQUITSIGHUP Drugi korisnički Terminal proces Window manager Slika 58 Signali Možete redefinisati akcije procesa kada dobijete signal i na taj način možete napisati vrlo fleksibilne programe. Kada se signal generiše, operativni sistem preuzima procesor od tekućeg procesa koji se izvršavao (Slika 58). On spašava tekuće stanje prekinutog procesa na stek i poziva obrađivač prekida za dati signal. Na primjer, predefinisani obrađivač prekida za SIGINT uzrokuje da program završi izvođenje. Predefinisani obrađivač prekida za SIGSEGV i SIGQUIT uzrokuje da program napravi sliku memorije kod pada i završi izvođenje. Po završetku izvođenja obrađivača prekida, operativni sistem preuzima kontrolu i vraća stanje prekinutog procesa sa stek (Slika 59). Program obično nastavlja na mjestu gdje je prekinuo ali u nekim slučajevima i ne. Može se koristiti funkcija signal() za definisanje obrađivača prekida. Za više informacija vidjeti komandu man 3v signal, ili sličnu u zavisnosti od sistema.

109 4.30.Signali 109 Primjer 1 - s1.c #include < signal.h > void cntl_c_obrađivač(int dummy) { printf("pritisnuli ste cntl-c\n"); signal(sigint, cntl_c_obrađivač); main() { int i, j; signal(sigint, cntl_c_obrađivač); for (j = 0; j < 40; j++) { for (i = 0; i < ; i++); Ovaj program postavlja obrađivač prekida za signal SIGINT. Kada korisnik pritisne CTRL^C, operativni sistem će spasiti stanje programa i izvršiti cntl_c_obrađivač. Po povratku iz obrađivača prekida, operativni sistem nastavlja izvršavanje programa od mjesta gdje je prekinut. Svaki put kad se pritisne CTRL^C izvršiće se cntl_c_obrađivač. Korisnički proces main() { signal(sigint,fun); fun() { SIGINT 3 Jezgro Slika 59: Reakcija na signal Takođe treba primijetiti u primjeru 1 da je napravljen ponovni signal() da bi se opet pozvao obrađivač prekida. Kod nekih sistema ako se ovo ne napravi, onda se instalira predefinisani obrađivač prekida za CTRL^C. Na nekim sistemima ne trebate raditi ponovni signal(). Može se raditi sa različitim signalima u programu. U primjeru 2 definišu se različiti obrađivači signala i to za CNTL-C (koji je SIGINT), i CNTL-\ (koji je SIGQUIT). Program štampa vrijednosti i i j kada se generiše signal. Primijetite da varijable i i j moraju biti globalne varijable. Ovo je primjer kada morate koristiti globalne varijable.

110 Alarmi Primjer 2 c2.c #include <signal.h> int i, j; void cntl_c_obrađivač(int dummy) { printf("pritisnuli ste cntl-c. j je %d - i je %d\n", j, i); signal(sigint, cntl_c_obrađivač); void cntl_bs_obrađivač(int dummy) { printf("pritisnuli ste cntl-\\. j je %d - i je %d\n", j, i); signal(sigquit, cntl_bs_obrađivač); main() { signal(sigint, cntl_c_obrađivač); signal(sigquit, cntl_bs_obrađivač); for (j = 0; j < 200; j++) { for (i = 0; i < ; i++); Poslije prevođenja i pokretanja programa i višestrukog pritiskanja CNTL^C i CNTL-\: UNIX> c2 ^CPritisnuli ste cntl-c. j je 2 - i je ^CPritisnuli ste cntl-c. j je 2 - i je ^\Pritisnuli ste cntl-\. j je 4 - i je ^CPritisnuli ste cntl-c. j je 5 - i je ^\Pritisnuli ste cntl-\. j je 6 - i je ^\Pritisnuli ste cntl-\. j je 6 - i je ^CPritisnuli ste cntl-c. j je 7 - i je ^CPritisnuli ste cntl-c. j je 13 - i je ^\Pritisnuli ste cntl-\. j je 14 - i je ^\Pritisnuli ste cntl-\. j je 16 - i je ^\Pritisnuli ste cntl-\. j je 16 - i je ^CPritisnuli ste cntl-c. j je 17 - i je ^\Pritisnuli ste cntl-\. j je 19 - i je UNIX> 4.31.Alarmi Drugi način korišćenja signalnih obrađivača je «sat sa alarmom». Funkcija alarm(n) po povratku poslije n sekundi će uzrokovati da se desi signal SIGALRM. Ako ste postavili obrađivač za ovaj signal onda ga možete «uhvatiti» i uraditi akciju po želji. Za više informacija vidi man stranice za funkciju alarm(). Primjer c3.c pokazuje upotrebu alarma koji se pokreće nakon tri sekunde.

111 4.31.Alarmi 111 #include <signal.h> int i, j; void alarm_obrađivač(int dummy) { printf("tri sekunde su prošle: j = %d. i = %d\n", j, i); signal(sigalrm, alarm_obrađivač); main() { signal(sigalrm, alarm_obrađivač); alarm(3); for (j = 0; j < 200; j++) { for (i = 0; i < ; i++); UNIX> c3 Tri sekunde su prošle: j = 26. i = UNIX> Na kraju, primjer c4.c pokazuje kako vam UNIX može slati alarm svake sekunde. Program - c4.c #include <signal.h> int i, j, seconds; void alarm_obrađivač(int dummy) { seconds++; printf("%d second%s just passed: j = %d. i = %d\n", seconds, (seconds == 1)? "" : "s", j, i); signal(sigalrm, alarm_obrađivač); alarm(1); main() { seconds = 0; signal(sigalrm, alarm_obrađivač); alarm(1); for (j = 0; j < 200; j++) { for (i = 0; i < ; i++); UNIX> c4 1 second just passed: j = 8. i = seconds just passed: j = 17. i = seconds just passed: j = 26. i = seconds just passed: j = 35. i = UNIX>

112 Zadaci 4.32.Zadaci Zadatak 1: I Linux ima semafore za komunikaciju između srodnih i različitih procesa. U ovom primjeru sukorištene funkcije sem_init, sem_wait i sem_post kako bi se omogućilo uzajamno isključivanje dva srodna procesa kreirana s fork. Unesite primjer linsemaphore.c #include <semaphore.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> int main(int argc, char **argv){ int fd, i,count=0,nloop=10,zero=0,*ptr; sem_t mutex; //mapiranje datoteke u memoriju fd = open("log.txt",o_rdwr O_CREAT,S_IRWXU); write(fd,&zero,sizeof(int)); ptr = mmap(null,sizeof(int),prot_read PROT_WRITE,MAP_SHARED,fd,0); close(fd); /* kreiranje i inicijalizacija semafora */ if( sem_init(&mutex,1,1) < 0) { perror("greška u inicijalizaciji semafora"); exit(0); if (fork() == 0) { /* dijete*/ for (i = 0; i < nloop; i++) { sem_wait(&mutex); printf("dijete: %d\n", (*ptr)++); usleep(10000); sem_post(&mutex); exit(0); for (i = 0; i < nloop; i++) { /* roditelj */ sem_wait(&mutex); printf("roditelj: %d\n", (*ptr)++); usleep(10000); sem_post(&mutex); exit(0); Ovaj primjer se prevodi sa gcc linsemaphore.c -o linsemaphore -lrt Pokrenite ga s

113 4.32.Zadaci 113./linsemaphore Roditelj i dijete dijele bafer, ali semafori postižu da se upis ne miješa. Kako izazvati deadlock u ovom primjeru? Kako izazvati međusobno miješanje? Zadatak 2. Isprobajte i objasnite sve primjere u BACI interpreteru iz ove skripte. Zadatak 3: Windows semafori. Unesite prvo sljedeći program pod imenom sem1.c, snimite ga #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> HANDLE hsemaphore; LONG cmax = 10; LONG cpreviouscount; int main(int argc,char *argv[]){ int broj; // Kreiranje semafora koji broji do 10 hsemaphore = CreateSemaphore( NULL, // nema sigurnosnih atributa 0, // početni brojač 10, // maksimalni brojač "DVADESETKA"); // imenovani semafor if (hsemaphore == NULL) { printf("greska"); // neuspjelo kreiranje do { scanf ("%d",&broj); while (broj!=20); if (!ReleaseSemaphore( hsemaphore, // oznaka semafora 1, // Uvećaj brojač za jedan NULL) ) { // Ne treba nam ranija vrijednost printf("nije uspio release"); return 0; i prevedite da dobijete sem1.exe Sada unesite drugi program pod imenom sem2.c

114 Zadaci #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> HANDLE hsemaphore; LONG cmax = 10; LONG cpreviouscount; int main(int argc,char *argv[]) { // Create a semaphore with initial and max. counts of 10. hsemaphore = CreateSemaphore( NULL, // no security attributes 0, // initial count 10, // maximum count "DVADESETKA"); // unnamed semaphore if (hsemaphore == NULL) { printf("greska"); // Check for error. WaitForSingleObject(hSemaphore,INFINITE); printf("konacno dvadeset \n"); /* The code of your application goes here */ return 0; Prevedite da dobijete sem2.exe. Otvorite dvije konzole. U prvoj konzoli pokrenite sem1.exe, a u drugoj konzoli pokrenite sem2.exe U primjeru sem1 unosite razne brojeve, ali tek kada unesete broj 20, primjer sem2 će se takođe završiti s porukom Konačno dvadeset. API funkcije CreateSemaphore, WaitForSingleObject i ReleaseSemaphore obavljaju klasičneoperacije InitialSem, wait i signal, ali imaju moćnije parametre. Tako na primjer CreateSemaphore ima posljednji parametar globalno ime semafora kako bi se prevazišla zatvorenost varijabli unutar procesa, a ReleaseSemaphore može da inkrementira semafor i za vrijednost veću od jedan. Potražite na Internetu o ovim API funkcijama. Zadatak 4: Većina Linux konzolnih aplikacija poznaje neimenovane cijevi. Sistem ih kreira kada u shellu koristimo operator. Na primjer ls sort grep a će učiniti da izlaz iz naredbe ls bude ulaz u naredbu sort a izlaz iz sort da bude ulaz u grep, pa je konačni rezultat sortirani spisak datoteka koje u sebi sadrže slovo a u imenu. Imenovane cijevi mogu ostati aktivne i kada je proces završen, a pogodnije su kada nam treba više vidova komunikacije između procesa. Cijevi se ponašaju kao datoteke sa sekvencijalnim pristupom. Unesite primjer pipesender.c

115 4.32.Zadaci 115 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #define MAX_LINE 80 int main(int argc, char** argv) { char line[max_line]; int pipe; pipe = open("/tmp/myfifo", O_WRONLY);// otvori cijev printf("unesi liniju: "); fgets(line, MAX_LINE, stdin); // unesi liniju write(pipe, line, strlen(line)); // ispisi podatak close(pipe); // zatvori cijev return 0; i prevedite ga s gcc pipesender.c -o pipesender Unesite primjer pipereceiver.c #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #define MAX_LINE 80 int main(int argc, char** argv) { char line[max_line]; int pipe; mkfifo("/tmp/myfifo", 0666); pipe = open("/tmp/myfifo", O_RDONLY); read(pipe, line, MAX_LINE); printf("primio %s",line); close(pipe); return 0; i prevedite ga s gcc pipereceiver.c -o pipereceiver Startajte u jednoj konzoli pipereceiver a u drugoj pipesender. U programu pipesender unesite liniju teksta, koju će primiti pipereceiver i prikazati. Provjerite da li je bitan redoslijed njihovog pokretanja.

116 Zadaci Zadatak 5: Proizvođač i potrošač, dijeljena memorija Klasični sinhronizacijski problem proizvođača i potrošača primjenom Windows API funkcija izgleda ovako: Program proizvođač: Unesite primjer proizvodjac.c /* Writer Code */ #include <windows.h> #include <assert.h> #include <stdio.h> #define BufferSize 100 #define Buffers 10 static const char MemoryName[]="Share Memory Name"; static char (* Memory) [Buffers][BufferSize] ; static const char WriterSemaphoreName[]="Writer Semaphore"; static const char ReaderSemaphoreName[]="Reader Semaphore"; static HANDLE hwritersemaphore; static HANDLE hreadersemaphore; static HANDLE hmemory; int main(void) { int i; hwritersemaphore= CreateSemaphore(NULL,Buffers,Buffers,WriterSemaphoreName); assert(hwritersemaphore!=null); hreadersemaphore= CreateSemaphore(NULL,0,Buffers,ReaderSemaphoreName); assert(hreadersemaphore!=null); hmemory= CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,sizeof(char [Buffers][BufferSize]),MemoryName); assert(hmemory!=null); Memory=(char (*)[Buffers][BufferSize])MapViewOfFile(hMemory,FILE_MAP_WRITE,0,0,sizeof(char [Buffers][BufferSize])); assert(memory!=null); for(i=0;;++i) { WaitForSingleObject(hWriterSemaphore,INFINITE); printf("writing to Buffer %i\n",i); wsprintf((*memory)[i%buffers],"this is the writer - %i\n",i); Sleep(1000); ReleaseSemaphore(hReaderSemaphore,1,NULL); UnmapViewOfFile(Memory); CloseHandle(hWriterSemaphore); CloseHandle(hReaderSemaphore); return 0; Prevedite program proizvodjac. Sada unesite primjer potrosac.c

117 4.32.Zadaci 117 // Reader Code #include <windows.h> #include <assert.h> #include <stdio.h> #define BufferSize 100 #define Buffers 10 static const char MemoryName[]="Share Memory Name"; static char (*Memory)[Buffers][BufferSize]; static const char WriterSemaphoreName[]="Writer Semaphore"; static const char ReaderSemaphoreName[]="Reader Semaphore"; static HANDLE hwritersemaphore; static HANDLE hreadersemaphore; static HANDLE hmemory; int main(void) { int i; hwritersemaphore= CreateSemaphore(NULL,Buffers,Buffers,WriterSemaphoreName); assert(hwritersemaphore!=null); hreadersemaphore= CreateSemaphore(NULL,0,Buffers,ReaderSemaphoreName); assert(hreadersemaphore!=null); hmemory= CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,sizeof(char [Buffers][BufferSize]),MemoryName); assert(hmemory!=null); Memory=(char (*)[Buffers][BufferSize]) MapViewOfFile(hMemory,FILE_MAP_WRITE,0,0,sizeof(char [Buffers][BufferSize])); assert(memory!=null); for( i=0;;++i) { WaitForSingleObject(hReaderSemaphore,INFINITE); puts((*memory)[i%10]); // Reader reads data ReleaseSemaphore(hWriterSemaphore,1,NULL); UnmapViewOfFile(Memory); CloseHandle(hWriterSemaphore); CloseHandle(hReaderSemaphore); return 0; Prevedite i primjer potrosac. Probajte razne kombinacije: pokrenut samo proizvođač, samo potrošač, prvo proizvođač pa potrošač i konačno prvo potrošač pa proizvođač. Primjetite da ovdje imamo semafore za kontrolu punog i praznog bafera. Ovdje imamo i memoriju koja se dijeli između dva procesa. Takva memorija se ne alocira C funkcijom memalloc ili API funkcijom VirtualAlloc, nego se pozovu funkcije CreateFileMapping i MapViewOfFile koje koriste keš i virtuelnu memoriju kako bi stvorile zajedničko područje u RAMu

118 Poptuni zastoji (engl. Deadlocks) 5.Upravljanje resursima i potpuni zastoji 5.1.Poptuni zastoji (engl. Deadlocks) Računarski sistemi sadrže veliki broj resursa čije je istovremeno korištenje ograničeno na samo jedan proces. Tipični primjeri su printeri, uređaji za trake, sistemske tabele. Operativni sistemi moraju imati mogućnost da u određenom vremenskom periodu dodijele odgovarajući resurs samo jednom procesu. Puno aplikacija postavlja zahtjev za samostalno korištenje više resursa odjednom. Uzmimo kao primjer dva procesa koji žele skenirati dokument i snimiti ga na CD. Proces A rezerviše skener, proces B radi nešto drugo i prvo zahtjeva CD pisač. U slijedećem koraku proces A pokušava dobiti pristup CD pisaču što ne uspijeva pošto ga proces B još nije pustio. Proces B zahtijeva skener umjesto da oslobodi CD pisač. U tom trenutku su oba procesa blokirana i ne mogu izaći iz ove situacije. Ovakva situacija se zove potpuni zastoj (engl. deadlock). Potpuni zastoji se mogu dešavati i na mreži, gdje se uređaji printer i skener dijele između korisnika. Kada ovi resursi mogu biti rezervisani sa bilo kog računara može doći do iste vrste zastoja. Još komplikovanija situacija se može desiti ukoliko je u igri više korisnika i više uređaja. Potpuni zastoji se mogu izazvati ne samo zbog U/I uređaja nego i zbog puno drugih situacija. Npr. u aplikacija sa bazom podataka može se desiti da program blokira dio podataka na kojima radi da ne bi došlo do preklapanja. Kad proces A blokira skup podataka R1 i proces B blokira skup podataka R2, i kad svaki pokušava doći do skupa podataka onog drugog imamo situaciju sa potpunim zastojem. Zaključak je da potpuni zastoji dolaze kako kroz hardverske, tako i kroz softverske resurse. Potpuni zastoj se može definisati na sljedeći način: Skup procesa se nalazi u stanju potpunog zastoja ako svaki proces u skupu čeka na neki događaj koji može proizvesti jedino neki proces iz tog skupa. S obzirom da svi procesi čekaju, ni jedan od njih neće izazvati neki od događaja koji mogu probuditi neki od procesa iz skupa, i svi procesi nastavljaju da čekaju zauvijek. Za ovaj model pretpostavljamo da procesi imaju samo jednu programsku nit i da nema mogućih prekida koji bi probudili blokirani proces. Stanje bez prekida sprečava npr. da neki alarm probudi proces koji bi mogao izazvati događaj koji bi opet oslobodio druge procese. U većini slučajeva, svaki član skupa čeka da oslobađanje resursa koje trenutno zauzima drugi proces. Drugim riječima, skup procesa u potpunom zastoju čeka na resurse koje posjeduje skup procesa u potpunom zastoju. Ni jedan proces se ne može aktivirati, ni jedan ne može osloboditi resurse i ni jedan ne može biti probuđen. Broj procesa i broj i vrsta resursa nisu važni. Ova izjava važi za bilo koju vrstu resursa, hardversku i softversku. 5.2.Resursi Rezervisane objekte nazivamo jednim opštim imenom resursi. Resurs može biti fizički uređaj ali i jedinica informacije. 5.3.Oduzivi i neoduzivi resesursi Postoje dvije vrste resursa: oduzivi i neoduzivi resursi. Oduzivi resurs (engl. preemptable) može biti oduzet procesu, koji ga posjeduje, bez loših posljedica. Jedan primjer za to je memorija.

119 5.4.Uslovi za pojavu potpnog zastoja 119 Primjer za ovo nalazimo u jednom sistemu sa 32MB memorije i jednim printerom. U sistemu su aktivna 2 procesa veličine 32MB koji žele nešto štampati. A rezerviše printer i počinje sa obradom podataka koji se trebaju odštampati. Prije nego što je završio biva prekinut pošto je prekoračio svoj dodijeljeni vremenski interval. Nakon toga se izvršava proces B koji bezuspješno pokušava rezervisati printer. Nalazimo se u jednoj mogućoj situaciji potpunog zastoja s obzirom da A posjeduje printer, a B memoriju, i ni jedan ne može dalje raditi bez resursa onog drugog. Na sreću, moguće je od procesa B oduzeti memoriju i dodijeliti je procesu A, sada A može završiti započeti posao, i ne dolazi do potpunog zastoja. Nasuprot tome, neoduzivi resursi (engl. nonpreemptable) ne mogu biti oduzeti vlasniku, a da ne dođe do greške. Oduzeti CD pisač procesu koji zapisuje podatke na CD značilo bi uništiti CD. Korištenje jednog resursa sastoji se iz tri sljedeća koraka: 1. zahtjev za resursom (engl. request), 2. korištenje resursa (engl. use), 3. oslobađanje resursa (engl. release). Ako je resurs zauzet, proces koji ga zahtijeva mora čekati. Neki operativni sistemi automatski blokiraju proces, ako dođe do neispunjenog zahtjeva za resursom i bude ga (aktiviraju) kad je resurs slobodan. Drugi javljaju grešku, a proces sam mora čekati i kasnije ponovo pokušati. Proces kome jedan zatraženi resurs nije dodijeljen nalazi se u jednoj petlji: zatraži resurs, kratko čeka i onda ponovo zatraži isti resurs. Iako ovakav proces nije blokiran, praktično se može smatrati blokiranim jer on ne radi ništa korisno. Kod nekih vrsta resursa, sam se proces brine za dodjelu resursa (npr. baze podataka). Jedna mogućnost upravljanja resursima je dodjela semafora svakom resursu. 5.4.Uslovi za pojavu potpnog zastoja Prema Coffman, sljedeći uslovi moraju biti ispunjeni za potpuni zastoj: 1. Uzajamno isključivanje. Svaki resurs ili je dodijeljen tačno jednom procesu ili je dostupan. Drugi proces koji zahtijeva taj isti resurs, mora čekati dok se resurs ne oslobodi. 2. Stanje prisvajanja resursa i čekanja na drugi (engl. hold and wait condition). Proces, koji trenutno drži resurse dodijeljene ranije, može zatražiti nove resurse. 3. Nema oduzivih resursa (engl. no preemption condition). Prethodno dodijeljeni resursi ne mogu biti nasilno oduzeti procesu. Proces ih mora samostalno osloboditi. 4. Kružno čekanje (engl. circular wait condition). Mora postojati kružni lanac dva ili više procesa, od kojih svi čekaju na resurs koji drži sljedeći član lanca. Ova sva četiri stanja moraju biti prisutna da bi došlo do potpunog zastoja. Ako je jedan odsutan, potpuni zastoj nije moguć. 5.5.Modeliranje potpunog zastoja (graf dodjele resursa) Ova četiri uslova se mogu modelirati uz pomoć grafova. Graf se sastoji od skupa objekata - čvorova i skupa strelica. Grafovi imaju dvije vrste čvorova. Procesi koji su predstavljeni kao krugovi i resursi predstavljeni kvadratom. Strelica od resurs-čvora ka jednom proces-čvoru znači da su resursi zatraženi od procesa i da ih on zauzima.

120 Modeliranje potpunog zastoja (graf dodjele resursa) Slika 60 prikazuje modeliranje potpunog zastoja pomoću grafova. Strelica od procesa ka resursu znači da proces čeka na resurs. Treća slika A S T prikazuje stanje potpunog zastoja: proces C čeka na resurs T koji je upravo zauzet C D od procesa D. Proces D ne pušta resurs T zato što čeka na resurs U koji je zauzet R B U od procesa C. Oba procesa će vječno čekati. Slika 60 Modeliranje zastoja pomoću grafova Sa grafa se može uočiti stanje zastoja: - ukoliko graf ne sadrži kružni tok, zastoja sigurno nema; - ako graf sadrži najmanje jedan kružni tok zastoj je moguć. Kad svi resursi koji pripadaju kružnom toku sadrže tačno jednu instancu, zastoj se dogodio. Ukoliko resursi u kružnom toku sadrže više instanci, može se desiti da zastoja nema. Pogledajmo sada primjer na slici Slika 61 gdje grafovi za modeliranje potpunog zastoja mogu biti korišteni. Imamo tri procesa A, B i C i tri resursa R, S i T. Neka se redom dodjeljuju ovi resursi datim procesima, kako je pokazano na prva tri dijela slike. Nakon četvrtog zahtjeva A blokira i čeka da se S oslobodi. U slijedeća dva koraka blokiraju B i C što na kraju vodi potpunom zastoju. A B C A B C A B C R S T R S T R S T A B C A B C A B C R S T R S T R S T A: Zahtijevaj R, Zahtijevaj S, radi, oslobodi R, oslobodi S B: Zahtijevaj S, Zahtijevaj T, radi, oslobodi S, oslobodi T C: Zahtijevaj T, Zahtijevaj R, radi, oslobodi T, oslobodi R Potpuni zastoj Slika 61 Nastanak potpunog zastoja Međutim operativni sistem može izabrati redosljed izvršavanja. On može odbiti dodjeljivanje resursa nekom procesu ako bi to vodilo potpunom zastoju i umjesto toga blokirati proces. Ako operativni sistem prepozna mogućnost potpunog zastoja može blokirati proces B umjesto da mu dodjeli resurs S. Situacija za zahtjevima i odobrenjima na slijedećoj slici Slika 62 ne vodi ka potpunom zastoju. Nakon zadnjeg koraka proces B može dobiti resurs S, jer je A gotov a C ima sve što mu je potrebno. Takođe ako B kasnije traži T i zatim bude blokiran ne dolazi do potpunog zastoja zato što C može završiti i onda osloboditi T.

121 5.6.Grafovi modeliranja zastoja sa više resursa iste vrste 121 A B C A B C A B C R S T R S T R S T A B C A B C A B C R S T R S T R S T A: Zahtijevaj R, Zahtijevaj S, radi, oslobodi R, oslobodi S B: Zahtijevaj S, Zahtijevaj T, radi, oslobodi S, oslobodi T C: Zahtijevaj T, Zahtijevaj R, radi, oslobodi T, oslobodi R Slika 62 Redoslijed zauzimanja resursa koji ne vodi do potpunog zastoja 5.6.Grafovi modeliranja zastoja sa više resursa iste vrste Kada postoji više primjeraka resursa iste vrste, u blokovima koji predstavljaju resurse koriste se tačke koje predstavljaju pojedinačni resurs. Slika 63 opisuje sistem kod koga skupovi procesa P, resursi R i strelica dodjele i zahtijeva E izgledaju ovako. P = {P1, P2, P3, P4 R = {R1, R2, R3, R4 E = {P1 R1, P2 R3, R1 P2, R2 P2, R2 P1, R3 P3 Postoje jedna instanca resursa R1, tri instance resursa R2, jedna instanca resursa R3 i dvije instance resursa R4. Proces P1 drži jednu instancu resursa R2 i čeka na resurs R1. Proces P2 drži resurs R1 i jednu instancu resursa R2, a čeka na resurs R3. Proces P3 drži resurs R3. P4 ne zahtijeva resurse. Slika 64 predstavlja potpuni zastoj. R1 P1 P2 P3 P4 R2 R3 R4 Slika 63 Modeliranje više resursa istog tipa

122 Strategije rješavanja potpunog zastoja R1 R3 Petlja 1: P1-R1-P2-R3-P3-R4-P1 P1 P2 P3 P4 Petlja 2: P2-R3-P3-R4-P2 R2 R4 Slika 64 Potpuni zastoj sa više vrsta resursa Sljedeći primjer (Slika 65) pokazuje da kada ima više resursa iste vrste da postojanje kružnog čekanja ne znači nužno potpuni zastoj. Kada proces P4 završi s radom, tada se može ispuniti zahtjev procesa P3, koji zatim svojim završetkom oslobađa i P1. Postoji i drugi način razrješenja. R1 P2 P1 P3 R2 P4 Slika 65Primjer petlje bez potpunog zastoja 5.7.Strategije rješavanja potpunog zastoja Kao što se medicina bavi različitim pravcima: normativi, preventiva, dijagnostika i liječenje, tako u osnovi postoje četiri strategije za rješavanje problema potpunog zastoja: 1. Ignorisati problem. 2. Prepoznati i otkloniti. Dozvoliti pojavu potpunog zastoja, prepoznati potpuni zastoj i nešto poduzeti protiv toga. 3. Dinamičko sprečavanje kroz pažljivo upravljanje resursima (Izbjegavanje potpunog zastoja). 4. Sprečavanje potpunog zastoja. Treba se pobrinuti da jedan od četiri uslova koji su neophodni za potpuni zastoj ne bude ispunjen. 5.8.Nojev algoritam - ignorisanje problema Najjednostavniji algoritam je nojev algoritam. Zavući glavu u pijesak i praviti se kao da problem ne postoji. Mišljenja o ovom algoritmu su podijeljena. Matematičari uglavnom misle da potpuni zastoji trebaju po svaku cijenu biti spriječeni. Inženjeri se pitaju koliko se često

123 5.9.Detekcija i otklanjanje potpunog zastoja 123 pojavljuje potpuni zastoj i koliko često sistem iz nekog drugog razloga ne funkcioniše. Ako se potpuni zastoj u prosjeku pojavi jednom u pet godina, a drugi hardverski ili softverski problemi se javljaju puno češće, čak sedmično, ulaganja u otklanjanje ili sprečavanje potpunog zastoja se ne isplate. Unix i Windows, ignorišu ovaj problem, jer većini korisnika povremeno pojavljivanje potpunog zastoja neće smetati. Ali u sistemima realnog vremena sama pomisao da se softverski sistem može zagušiti je alarmantna. 5.9.Detekcija i otklanjanje potpunog zastoja Drugi način je prepoznavanje i otklanjanje potpunog zastoja. Kod ove tehnike sistem ne pokušava da spriječi pojavljivanje potpunog zastoja. Umjesto toga, potpuni zastoji su dozvoljeni a sistem pokušava da ih prepozna i da učini nešto da ih otkloni. U ovom slučaju sistem mora obezbijediti: - algoritam za detekciju zastoja, koji ispituje da li je došlo do zastoja, - algoritam za oporavak od zastoja Detekcija potpunog zastoja sa jednim resursom svakog tipa Jedan sistem sa po jednim resursom svakog tipa možemo predstaviti grafom na slici Slika 66. Ako ovaj sistem sadrži jednu ili više petlji, nalazi se u stanju potpunog zastoja. R A B C S D T E UOČLJIVA ZATVORENA KONTURA F U V W G Slika 66 Detekcija potpunog zastoja grafovima 1. A zauzima R i zahtijeva S. 2. B ne zauzima ništa, zahtijeva T. 3. C ne zauzima ništa, zahtijeva S. 4. D zauzima U, zahtijeva S i T. 5. E zauzima T i zahtijeva V. 6. F zauzima W i zahtijeva S. 7. G zauzima V i zahtijeva U. Postavlja se pitanje je da li je ovaj sistem u potpunom zastoju i ako jeste, ko učestvuje u potpunom zastoju? Može se lako prepoznati da graf sadrži jednu petlju. Ova petlja odgovara potpunom zastoju u kome učestvuju procesi D, E i G. Procesi A, C i F ne učestvuju u petlji a resurs S se dodjeljuje procesima po redu, jedan za drugim. Iako je relativno jednostavno petlju, tj potpuni zastoj prepoznati koristeći grafički prikaz, u stvarnim sistemima su nam potrebni algoritmi.

124 Detekcija potpunog zastoja sa više resursa svakog tipa Slijedeći primjer algoritma je vrlo jednostavan. On se završava čim nađe petlju ili kad ne postoji nikakva petlja, od podataka koristi listu čvorova. Dok radi, algoritam označava pregledane čvorove da bi izbjegao ponovno pregledanje. Algoritam uzima svaki čvor iz grafa, i posmatra ga kao korijen stabla, koje se provjerava u dubinu, ukoliko naiđe na čvor koji je već provjeravao to znači da je pronašao potpuni zastoj. Ako su sve linije koje vode dalje od čvora već označene, skače na prethodni čvor. Kada dođe do startnog čvora i ne može ići dalje ovaj dio grafa je slobodan od petlje, ako ovo važi za čitav graf, sistem nema potpunog zastoja. Pokazaćemo to na datom primjeru. Redosljed je proizvoljan. -Uzmimo prvi čvor R i inicijaliziramo L kao praznu listu. Slijedimo jedini mogući put ka A, L=[R,A]. Od A idemo ka S, S je slijepi put pa se moramo vratiti na A, od A nemamo drugih linija i vraćamo se ka R. Sa ovim je naša obrada čvora R završena. -Sad pokrećemo algoritam od A i inicijaliziramo praznu listu i ova pretraga se brzo završava nastavljamo se B dalje. Sad lista sadrži B,T,E,V,G,U,D. Na ovom mjestu slučajno biramo jednu od linija koje vode od D. Ako biramo S nalazimo se u slijepom putu i vraćamo se na D i preostaje nam samo T. Tako da lista sadrži B,T,E,V,G,U,D,T. Našli smo petlju i algoritam završava svoj rad Detekcija potpunog zastoja sa više resursa svakog tipa Kada postoji više instanci jednog resursa, potreban je drugi pristup za detekciju potpunog zastoja. Ovo je algoritam baziran na matricama za prepoznavanje potpunog zastoja među procesima P 1 do P n. Broj klasa resursa je m, sa E i resursa klase i (1 i m ). E je vektor resursa i daje broj resursa koje od svake klase imamo na raspolaganju. U svakom trenutku su neki resursi zauzeti. Vektor resursa A sadrži za svaki resurs i broj slobodnih instanci. Potrebne su nam još dvije matrice, matrica alociranja C i matrica zahtjeva R. Red i matrice C sadrži broj resursa koje od svake klase zauzima proces P i. C ij je broj resursa klase j, koje proces i zauzima. Analogno je R ij broj resursa j koje bi proces i želio.. C11 C12... C1 m R11 R12... R1 m C C... C m R R... R m C =, R =, A = A Cn1 Cn2... Cnm Rn1 Rn2... Rnm Pošto je svaki resurs slobodan ili zauzet važi sljedeće n j= 1 C ij + A j = E j [ A... A ], E = [ E E... E ] Drugim riječima, za svaku klasu resursa je suma svih zauzetih resursa i svih slobodnih resursa jednaka ukupnom broju resursa. Algoritam za detekciju potpunog zastoja zasniva se na poređenju vektora. Definišemo relaciju tako da A B, kada je svaki element A, manji ili jednak odgovarajućem elementu B. Na početku algoritma je svaki proces neoznačen. Kada se jedan proces označi, to znači da on može do kraja završiti svoj rad i nije uključen u neki potpuni zastoj. Kada se algoritam završi, svaki neoznačeni proces učestvuje u nekom potpunom zastoju. Algoritam za detekciju potpunog zastoja glasi: 2 m 1 2 m

125 5.12.Oporavak od potpunog zastoja Traži jedan neoznačeni proces P i, za koji je i-ti red R manji ili jednak A. 2. Ako takav proces postoji, saberi i-ti red C sa A, označi proces i idi na korak U suprotnom završi algoritam C = , R =, E = [ ], A = [ ], Ako se neki procesi nikad ne mogu izvršiti, nalaze se u potpunom zastoju. U ovom primjeru imamo tri procesa i četiri klase resursa. Proces 1 zauzima jedan skener, proces 2 dvije trake i jedan CD. Proces 3 zauzima jedan ploter, i dva skenera. Matrica R pokazuje koji resursi svakom procesu još dodatno trebaju. Da bi smo izveli naš algoritam tražimo prvo proces čiji zahtjevi mogu biti ispunjeni. Treći proces traži resurse koji su još dostupni. On se izvršava i oslobađa svoje resurse, A=(2,2,2,0). Sad proces 2 može dalje raditi i nakon što je on oslobodio svoje resurse A=(4,2,2,1). Sad se može izvršiti zadnji proces tako da nema potpunog zastoja Oporavak od potpunog zastoja Pretpostavimo da je algoritam za detekciju potpunog zastoja bio uspješan i otkrio jedan potpuni zastoj. Šta se sad dešava? Postoji li mogućnost za otklanjanje potpunog zastoja i pokretanje sistema. Sada ćemo razmotriti mogućnosti za oporavak od potpunog zastoja Oporavak pomoću oduzimanja U neki slučajevima je moguće jednom procesu oduzeti neki resurs te ga dodijeliti drugom procesu. Često se ovo radi manuelno, naročito kod mainframe računara sa batch pogonom. Da li je moguće jednom procesu oduzeti resurs i staviti ga na raspolaganje drugom procesu i na kraju ga ponovo dati prvom procesu, a da on to ne primijeti, zavisi jako od vrste resursa. Otkloniti potpuni zastoj na ovaj način je često nemoguće. Izbor procesa koji se suspendira zavisi prvenstveno koje je resurse lako oduzeti i ponovo vratiti Oporavak pomoću povratka na staro stanje (engl. rollback) Kada sistem dizajner zna da su potpuni zastoji mogući, mogu se pobrinuti za to da stanja procesa budu u ravnomjernim razmacima (engl. checkpoint) zapisana tako da proces može kasnije nastaviti rad počev od te tačke. Checkpoint sadrži sadržaj memorije i pripadajuće resurse. Ovaj metod je najuspješniji kada novi checkpoint ne prepiše stari. Kada se primijeti potpuni zastoj, proces koji posjeduje potrebne resurse će se vratiti na tačku (checkpoint) u kojoj još nije rezervisao te resurse. Rad iza ove tačke će biti izgubljen. Oslobođeni resursi se dodjeljuju drugom procesu koji učestvuje u potpunom zastoju. Kada vraćeni proces pokušava dobiti resurse, mora čekati dok oni opet ne budu slobodni. Ovaj pristup se uglavnom koristi u sistemima za upravljanje bazama podataka, kao i žurnalskim datotečnim sistemima Oporavak ubijanjem procesa Najjednostavniji ali i najgrublji način otklanjanja potpunog zastoja je prekid rada jednog ili više procesa. Pri tome se može raditi o jednom procesu iz petlje. Sa malo sreće ostali procesi mogu dalje raditi. Ako ne, mogu se prekinuti i dalji procesi dok se ne prekine potpuni

126 Izbjegavanje potpunog zastoja zastoj. Alternativno, žrtva može biti i neki drugi proces koji ne učestvuje u petlji, i pri tome se veoma pažljivo mora izabrati proces koji zauzima resurse potrebne nekom procesu u petlji. Kada je to moguće treba prekinuti onaj proces koji se bez neugodnih pojava ponovo pokrenuti Izbjegavanje potpunog zastoja Izbjegavanje zastoja je moguće ukoliko operativni sistem ima informacije o procesima i resursima koje će oni zahtijevati prilikom svog izvršenja. Sistem koji zna šta proces želi, može napraviti redoslijed opsluživanja zahtjeva tako da izbjegne potpuni zastoj. Prilikom svakog novog zahtijeva za resursom, sistem analizira trenutno stanje resursa i nakon toga odlučuje da li će se resurs dodijeliti procesu koji je postavio zahtjev ili će se taj proces blokirati kako bi se izbjegao potpuni zastoj. Do sad smo pretpostavljali da jedan proces sve resurse zahtijeva odjednom što uglavnom nije slučaj. Sistem smije dodijeliti resurs procesu ukoliko je to bezopasno. Postavlja se pitanje može li se potpuni zastoj pouzdano spriječiti kroz donošenje pravih odluka prilikom dodjele resursa. Potpuni zastoj se može spriječiti, ali samo kad unaprijed posjedujemo potrebne informacije Sigurna i nesigurna stanja Stanje je sigurno kada ne postoji potpuni zastoj i postoji redoslijed raspoređivanja koji ne vodi u potpuni zastoj čak i kad svi procesi zatraže maksimalan broj resursa. Ovaj koncept se najbolje može pokazati na primjeru. Slika 67 prikazuje stanje u kome proces A zauzima tri instance resursa a kasnije će ukupno trebati 9. B zauzima 2 a trebaće ukupno 4. C ima takođe 2 ukupno treba 7. Ukupno postoji 10 instanci resursa, 7 su već zauzeti, a trenutno su još tri dostupna. a Ima Maks b Ima Maks c) Ima Maks d) Ima Maks e) Ima Maks A 3 9 A 3 9 A 3 9 A 3 9 A 3 9 B 2 4 B 4 4 B 0 0 B 0 0 B 0 0 C 2 7 C 2 7 C 2 7 C 7 7 C 0 0 Slobodno: 3 Slobodno: 1 Slobodno: 5 Slobodno: 0 Slobodno: 7 Slika 67Sigurno stanje Stanje na slici Slika 67 (a) je sigurno jer postoji redosljed dodjeljivanja takav da svi procesi mogu završiti svoj rad do kraja. Raspoređivač je rasporedio proces B koji je rezervisao dva dalja resursa (b). Čim je B završio nalazimo se u stanju na slici (c). Sada raspoređivač može izvršiti C (d). Kad je C završio imamo stanja kao na slici (e). Sada je 6 instanci koje su potrebne procesu A slobodno. Stanje na slici (e) je sigurno. Iz ovoga je jasno da sistem može kroz pažljivo raspoređivanje spriječiti potpuni zastoj. Sada ćemo poći od istog stanja kao na prethodnoj slici, s tom razlikom da A dobiva jedan dalji resurs što je prikazano na slici Slika 68(b). Možemo li ovdje pronaći redosljed dodjeljivanja resursa koji je siguran? Raspoređivač može odlučiti da se izvršiti B, (slika (c). Čim B završi imamo situaciju kao na slici (d). Imamo samo 4 slobodne instance resursa, a svaki proces treba 5. Redosljed dodjeljivanja koji bi garantovao izvršenje ne postoji. Ovo nesigurno stanje još uvijek nije potpuni zastoj, može se desiti da čak jedan proces završi svoj rad, da drugi oslobodi neke resurse prije nego što rezerviše nove, ali to se u nesigurnom stanju ne može garantovati.

127 5.18.Bankarski algoritam za jedan resurs 127 a Ima Maks b Ima Maks c) Ima Maks d) Ima Maks A 3 9 A 4 9 A 4 9 A 4 9 B 2 4 B 2 4 B 4 4 B 0 0 C 2 7 C 2 7 C 2 7 C 2 7 Slobodno: 3 Slobodno: 2 Slobodno: 0 Slobodno: 4 Slika 68Nesigurno stanje 5.18.Bankarski algoritam za jedan resurs Jedan poznati algoritam za izbjegavanje potpunog zastoja je bankarov algoritam (engl. Banker s Algorithm). Ovaj algoritam je proširenje algoritma za detekciju potpunog zastoja. On slijedi primjer kako bankar može zadovoljiti zahtjeve za kreditom jedne grupe ljudi. Algoritam provjerava kod svakog zahtjeva za kredit, da li kredit može voditi ka nesigurnom stanju. Ako kredit vodi ka sigurnom stanju, biće odobren, ako ne biće odbijen. Bankarski algoritam se može primijeniti ako su ispunjeni slijedeći uslovi: resursi imaju uglavnom više instanci; svaki proces mora unaprijed deklarisati najveći broj instanci svakog resursa koji želi da koristi; kad proces zahtijeva resurs, sistem procjenjuje da li će poslije toga ostati u sigurnom stanju. Ako ostaje u sigurnom stanju, proces će dobiti resurs, u protivnom, proces mora sačekati da drugi proces oslobodi neki resurs; proces koji dobije resurse mora ih vratiti u konačnom roku. a) Ima Maks b) Ima Maks c) Ima Maks A 0 6 A 1 6 A 1 6 B 0 5 B 1 5 B 2 5 C 0 4 C 2 4 C 2 4 D 0 7 D 4 7 D 4 7 Slobodno: 10 Slobodno: 2 Slobodno: 1 Slika 69Bankarov algoritam za jedan resurs Slika 69 prikazuje četiri korisnika od kojih svaki ima maksimalan broj kreditnih jedinica. Bankar zna da neće svi korisnici svoje maksimume odmah iskoristiti zato rezerviše 10 umjesto 22. U ovoj analogiji su korisnici procesi, kreditne jedinice resursi. Korisnici se brinu za svoj posao i povremeno zatraže kredit. U jednom trenutku imaćemo stanje kao na slici (b). Ovo stanje je sigurno zato što bankar može sve zahtjeve osim C odložiti. Nakon što C završi može se B ili D odobriti kredit. Šta bi bilo kad kada bi B tražio još jednu kreditnu jedinicu? Stigli bi smo u nesigurno stanje (c). Nesigurno stanje ne vodi neizbježno potpunom zastoju jer ne mora značiti da će svi korisnici iskoristiti maksimum. Bankarski algoritam ispituje svaki zahtjev čim on pristigne i zaključuje da li će rezultat biti sigurno stanje. Da bi utvrdio da li je stanje sigurno, algoritam ispituje da li još ima dovoljno preostalih resursa koji bi bili zadovoljavajući za drugog korisnika Bankarski algoritam za više resursa Bankarski algoritam se može uopštavati na više resursa, a to nam prikazuje sljedeća slika. Ovdje vidimo dvije matrice. Lijeva pokazuje koliko instanci iz svake klase resursa, svaki od pet procesa upravo zauzima. Desna pokazuje koliko resursa svaki proces još treba prije

128 Sprečavanje potpunog zastoja nego što završi. Tri vektora desno na slici Slika 70 prikazuju ukupan broj resursa E, zauzete resurse i dostupne resurse A. A A E=(6,4,3,2) B B C C P=(5,3,2,2) D D E E A=(1,0,2,0) Dodijeljeno Dodatno Potrebno Slika 70: Primjer matrice bankarovog algoritma za više resursa Sada možemo dati algoritam koji ispituje da li je stanje sigurno. 1. Traži jedan red u R koji je manji ili jednak A. Ako se takav ne može naći sistem ne može završiti ni jedan proces i nalazi se u potpunom zastoju. Pretpostavimo da proces koji odgovara ovom redu sve neophodne resurse rezerviše i završava svoje izvršenje. Proces se označi kao završen i njegovi resursi se dodaju vektoru A. 2. Koraci 1 i 2 se ponavljaju sve dok svi procesi ne budu označeni ili dok sistem ne završi u potpunom zastoju. U prvom slučaju stanje je sigurno a u drugom nesigurno. Ako u prvom koraku na raspolaganju stoji više procesa, nije značajno koji će se prvi izvršiti. Ovaj algoritam se koristi samo u veoma malom broju sistema jer je beskoristan u praksi za sisteme gdje broj procesa nije konstantan. Osim toga rijetko se unaprijed zna koliko će resursa neki proces trebati Sprečavanje potpunog zastoja Do zastoja dolazi samo ako su istovremeno ispunjena četiri uslova (navedena na početku teksta) za nastajanje potpunog zastoja. Ovaj metod podrazumijeva neispunjenje barem jednog od ova četiri uslova Napadanje uslova uzajamnog isključivanja Prvo ćemo se pozabaviti uslovom uzajamnog isključivanja. Kroz spooling može se više procesa istovremeno zadovoljiti. U ovom modelu samo printer demon rezerviše printer. S obzirom da on nikad ne zahtijeva neki drugi resurs, on nije uzrok potpunog zastoja. Na žalost spooling se ne može primijeniti za sve vrste resursa. U osnovi ovoga je ideja, resurse dodjeljivati samo kada je to neophodno, i pobrinuti se za to što je moguće manje procesa samostalno zahtijevaju resurse Napadanje stanja prisvajanja i čekanja Ako možemo spriječiti da proces čeka na resurse dok druge resurse drži zauzete možemo spriječiti potpuni zastoj. Mogući pristup je da svi procesi sve resurse unaprijed zahtijevaju. Ako su resursi dostupni, oni će mu se dodijeliti. Ako je jedan ili više resursa zauzet, neće se ni drugi resursi rezervisati i proces mora čekati. Jedan očigledan problem kod ovakvog pristupa je da većina procesa ne zna unaprijed koliko će resursa trebati. Kada bi znali mogao bi se primijeniti bankarski algoritam. Ovaj metod opterećuje i nerentabilno koristi resurse.

129 5.23.Napadanje uslova neoduzivih resursa Napadanje uslova neoduzivih resursa Napad na treći uslov (neoduzivi resursi), obećava još manje uspjeha. Nasilno oduzeti procesu printer na kome on upravo printa je prilično teško a u najgorem slučaju nemoguće Napadanje ciklusa čekanja Ostao nam je još jedan uslov. Jedna mogućnost ovdje je jednom procesu istovremeno dozvoliti samo jedan resurs. Ako mu je potreban još jedan mora prvo osloboditi prvi resurs. Za proces koji kopira podatke sa trake na disk ovo nije moguće. Druga mogućnost je resurse numerisati kao što je prikazano na slici Slika 71. Svaki proces može zatražiti resurse kad god želi ali to mora raditi po datom redosljedu. Sa ovim pravilom je graf zauzimanja i zahtjeva uvijek bez petlji. Druga varijanta je da svaki proces smije zahtijevati resurs koji ima veći broj od resursa koji je proces trenutno zauzima. Na slici Slika 72 dat tabelarni sažetak svih načina sprečavanja potpunog zastoja. Uslov Uzajamno isključenje Stanje zauzimanja i čekanja Nema oduzivih resursa Kružno čekanje 1. skener 2. crtač 3. modem 4. CD pisač 5. zvučnik Pristup Upotreba spulera Zahtjev svih resursa odjednom Oduzeti resurse prije početka rada Numerisanje resursa Slika 72 Načini sprečavanja potpunog zastoja 5.25.Dvofazno zaključavanje Iako ni sprečavanje ni otklanjanje potpunog zastoja ne obećava puno postoji mnogo odličnih algoritam za specijalne primjene. U bazama podataka, često se dešava da jedan proces blokira određene podatke da bi onda na njima radio. Ako više procesa pristupa bazi podataka opasnost da se pojavi potpuni zastoj je veća. U ovakvim slučajevima primjenjuje se dvofazno zaključavanje. U prvoj fazi proces pokušava deblokirati sve podatke koje želi obraditi. Ako je to uspio počinje sa drugom fazom gdje obrađuje ove podatke i onda ih oslobađa. U prvoj fazi nema pravog rada. Ako proces u prvoj fazi naiđe na blokirane podatke, on oslobađa sve podatke i počinje iz početka. Može se reći da je to slično situaciji gdje proces sve podatke unaprijed rezerviše. Postoje i varijante gdje proces ne počinje iz početka kad naiđe na blokadu, ovo može voditi u potpuni zastoj. Ova strategija se ne može uvijek primjenjivati, npr u real-time sistemima ne možemo prekinuti proces i početi iz početka samo zato što je naišao na blokiran resurs. Algoritam funkcioniše u situacijama gdje se programer pobrinuo za to da program u prvoj fazi može biti u svakom trenutku prekinut i ponovo pokrenut. A Slika 71 Numerisanje resursa i j B

130 Potpuni zastoji bez resursa 5.26.Potpuni zastoji bez resursa Do sad smo razmatrali potpune zastoje u vezi sa resursima. Procesi mogu doći u stanje potpunog zastoja gdje ne učestvuju nikakvi resursi. Npr. potpuni zastoj može nastati u situaciji u kojoj svaki od dva procesa čeka da onaj drugi poduzme nešto Izgladnjivanje - umiranje procesa Jedan problem usko povezan sa problemom potpunog zastoja je tzv. izgladnjivanje. U jednom dinamičkom sistemu stalno dolazi do zahtjeva za resursima. Sistem određuje prema određenoj strategiji koji proces u kome trenutku dobiva neki resurs. Može se desiti da ove procedure vode tome da neki proces nikad ne dođe u priliku da se aktivira iako se ni jednom nije našao u potpunom zastoju. Strategija FCFS (first come first served) se brine da proces koji najduže čeka bude poslužen Windows API za potpune zastoje Zaključno sa Windows XP, u Windows je korišten nojev algoritam. Samo za razvoj drajvera postojao je eksterni alat koji obavlja provjere da li potpuni zastoj može desiti (prevencija). Od Windows Vista uvedene su četiri funkcije za detekciju potpunog zastoja u višenitnim programima. I dalje ne postoji mogućnost detekcije potpunog zastoja koga su izazvali odvojeni procesi. OpenThreadWaitChainSession(dwFlags,pfCallback) Otvara sesiju za dobijanje liste niti koje su u čekanju GetThreadWaitChain(hWctHandle,pContext,dwFlags,dwThreadId,lpNodeCount,pNodeI nfoarray,lpiscycle) Dobavlja lanac čekanja na niti WaitChainCallback(hWctHandle, pcontext, dwcallbackstatus, lpnodecount, pnodeinfoarray, piscycle) Povratna korisnička funkcija CloseThreadWaitChainSession(hWctHandle) Zatvara sesiju za dobijanje liste niti koje su u čekanju 5.29.Zadaci Zadatak 1. Dato je 3 vrsta resursa i 4 procesa. Matrice alokacije (A), maksimalnih zahtjeva (M) i vektor raspoloživosti (R) su Pokazati da li je sistem u sigurnom stanju. A R1 R2 R3 M R1 R2 R3 p p p p p p p p R=(2, 1, 0)

131 5.29.Zadaci 131 Rješenje: Matrica potreba N se dobija oduzimanjem matrica maksimalnih zahtjeva i matrice alokacije. N=M-A N R1 R2 R3 P P P P Vidi se da se može izvršiti proces P2, i nakon njegovog završetka resurse možemo dodijeliti vektoru R koji sada iznosi R=(3,1,1). Ali nakon ovoga ni jedan proces ne može ispuniti zahtjev za R2, pa sistem nije u sigurnom stanju. Zadatak 2. Dato je 3 vrsta resursa i 4 procesa. Matrice alokacije (A), maksimalnih zahtjeva (M) i vektor raspoloživosti (R) su: R=(2, 1, 2) A R1 R2 R3 M R1 R2 R3 p p p p p p p p Pokazati da li je sistem u sigurnom stanju. Rješenje: Matrica potreba N se dobija oduzimanjem matrica maksimalnih zahtjeva i matrice alokacije. N=M-A N R1 R2 R3 P P P P Vidi se da se ne može izvršiti proces P1, ali može P2, i nakon njegovog završetka resurse iz matrice A možemo pridodati vektoru R. Nakon izvršenja P2, R=(8, 3, 4 ) Može se izvršiti P1 i nakon njega R=(9, 7, 4 ) Nakon P3, S=(14, 10, 9 ) Nakon P4, S=(20, 16, 10, ) Mogu se izvršiti sva četiri procesa. Sistem je u sigurnom stanju Zadatak 3. Neka postoje četiri procesa i tri vrste resursa. Resursi su dodijeljeni procesima kao u matrici A. Pored toga raspoloživo je još R=(1,2,1) resursa. Nacrtati dijagram dodjele resursa procesima. Zatim docrtati stanje ako proces p4 zatraži još 3 instance resursa R3.

132 Zadaci Rješenje: A R1 R2 R3 P P P P Već dodijeljeni resursi su prikazani punim, a naknadno zahtijevani isprekidanim linijama. Uočimo da se jedan dostupni resurs R3 dodijelio u naknadnom zahtjevu procesa P4, a ostala dva su na čekanju. R1 R2 P4 P1 P3 P2 R3

133 6.1.Osnove upravljanja memorijom Upravljanje memorijom, kontinualna alokacija 6.1.Osnove upravljanja memorijom Računarski sistem obično sadrži više vrsta memorije: primarna memorija, sekundarna memorija, tercijarna memorija, off-line memorija i mrežna memorija. Primarna memorija je povezana na centralnu procesorsku jedinicu računara. Primarna memorija se tipično sastoji od tri tipa memorije: procesorski registri, keš memorija (engl. cache) i glavna (interna) memorija. Procesorski registri sadrže informacije koje su potrebne aritmetičko logičkoj jedinici da izvršava trenutnu operaciju. To je najbrža vrsta memorije, integrisana u CPU. Keš memorija je specijalan tip interne memorije koja se koristi za poboljšanje performansi. Neke informacije iz glavne memorije nalaze se i u keš memoriji koja je manja ali brža od glavne memorije. Glavna memorija sadrži programe u izvršenju kao i podatke koje ovi programi koriste. Aritmetičko logička jedinica može brzo prenositi podatke između procesorskih registara i glavne memorije. Glavna memorija podijeljena je na lokacije od kojih je svaka određena memorijskom adresom. Ova memorija - RAM (engl. random access memory) povezana je sa CPU putem memorijske sabirnice (engl. memory bus). Sekundarna memorija za pristup informaciji, zahtijeva korištenje ulazno/izlaznih kanala a koristi se za dugotrajno smiještanje podataka. Većina računarskih sistema koristi ovu vrstu memorije kao virtualnu memoriju koja se koristi da prividno poveća veličinu glavne memorije računarskog sistema. Sekundarna memorija obično ima mnogo veći kapacitet u odnosu na glavnu memoriju, ali je i značajno sporija. Tvrdi diskovi (engl. hard disks) su tipičan primjer sekundarne memorije koja se koristi u računarskim sistemima. Tercijarna memorija je sistem memorije koji se koristi za specijalnu namjenu kod velikih računarskih sistema različite poslovne ili naučne namjene. Ova memorija se po potrebi, automatizirano konektuje ili diskonektuje. Off-line memorija je memorija koja se lako može diskonektovati a koristi se za arhiviranje podataka. Primjer ovakve memorije su diskete, optički diskovi, USB diskovi, ili magnetne trake. Mrežna memorija je bilo koji tip memorije koji uključuje pristup informaciji putem računarske mreže. Osim ove podjele postoje i drugi načini za podjelu memorije. Ovdje obrađujemo prvenstveno internu memoriju (operativnu memoriju) i njen odnos sa eksternom memorijom. Procesor može izvršavati samo procese koji su u internoj memoriji. 6.2.Dodjeljivanje memorije procesima. Memorija se dijeli na najmanje dvije particije od kojih je jedna particija namjenjena jezgru operativnog sistema (engl. kernel space) a druga particija, najčešće viši dijelovi, dodjeljena je korisničkim procesima (engl. user space). Uobičajeno je da se na najnižem dijelu memorije nalazi tabela prekidnih rutina. U korisničkom adresnom prostoru nalaze se procesi u redu čekanja na procesor. Pored tog reda čekanja postoje i procesi koji sa diska nastoje da uđu u red čekanja na procesor. Uslov za to je da se procesu prvo dodijeli potrebna memorija. Tehnika dodjele memorije može biti kontinualna ili diskontinualna alokacija. Kod kontinualne alokacije i logički i fizički adresni prostor se sastoje od kontinualnog niza memorijskih adresa. Memorijske particije dodijeljene procesima mogu biti jednake ili različite. Kod diskontinualne alokacije memorije fizički adresni prostor ne predstavlja kontinualni niz memorijskih adresa. Straničenje, segmentacija i straničenje sa segmentacijom spadaju u ovu vrstu dodjele memorije.

134 Razdvajanje fizičkog i logičkog adresnog prostora programa i vezivanje adresa. 6.3.Razdvajanje fizičkog i logičkog adresnog prostora programa i vezivanje adresa. Program sa diska mora biti učitan u memoriju unutar adresnog prostora novostvorenog procesa. Zavisno od metode upravljanja memorijom koja se koristi, proces se u toku izvršenja može više puta pomjeriti na relaciji disk-memorija. Korisnički program prolazi kroz više faza tokom kojih se memorijska adresa predstavlja na različite načine. Prevodilac (engl. compiler) prevodi izvorni kod programa i vezuje simboličke adrese iz izvornog koda za relativne adrese koje punilac (engl. loader) pretvara u apsolutne prilikom učitavanja programa u memoriju. Dio operativnog sistema koji upravlja korištenjem memorije zove se upravljač memorije (engl. memory manager). Njegov zadatak je da vodi računa o tome, koji dijelovi memorije su zauzeti, koji dijelovi su slobodni, da zauzme potrebnu količinu memorije za nove procese odnosno da oslobodi memoriju zauzetu od strane nekog procesa, i da upravlja prebacivanjem procesa iz interne u eksternu memoriju i obrnuto pri tome mora voditi računa o tome, da procesi ne štete jedni drugima, a ni operativnom sistemu. U slučaju kada nemamo dovoljno interne memorije, koriste se slijedeće tehnike: 1. SWAPPING (prebacivanje procesa) ako nemamo dovoljno mjesta u operativnoj memoriji za smiještanje svih spremnih procesa, neki se izbacuju na disk. Kada je potrebno, cijeli spremni procesi iz interne memorije se prebacuju na disk, odnosno spremni procesi sa diska se prebacuju u internu memoriju. 2. PAGING (straničenje) dijelove procesa držimo na disku, a učitavaju se po potrebi. Postoje dvije klase upravljanja memorijom: prva klasa koja prebacuje procese koji se izvršavaju između glavne memorije i diska (swapping i paging (straničenje)) i druga koja to ne radi. Druga klasa je jednostavnija i zato ćemo je prvo obrađivati. 6.4.Monoprogramiranje bez izbacivanja ili upravljanja stranicama Najjednostavnija strategija upravljanja memorijom u jednom trenutku dozvoljava rad samo jednom programu, u memoriji se u jednom trenutku može nalaziti samo jedan program. a) b) c) d) Korisničkl program u ROM Korisnički program u RAM OS u RAM Korisnički program u RAM OS u ROM Drajveri u ROM Korisnički program u RAM OS u RAM Slika 73 Konfiguracije memorije kod monoprogramiranja Najjednostavniji način je da u internoj memoriji imamo samo jedan proces (Slika 73 a): pustimo korisnika da učita program koji želi, i taj program tada dobija apsolutnu kontrolu nad računarom (radi šta hoće i gdje hoće, pristupa onim dijelovima memorije kojima želi i koristi one uređaje koje želi i kako želi). Kod ovog pristupa ne treba nam ni operativni sistem, ni

135 6.5.Multiprogramiranje sa fiksnim particijama 135 posebni drajveri za razne uređaje: program koji se učitava u memoriju je potpuno sam i oslanja se isključivo na sebe. Mora znati sve što mu je potrebno: kako da koristi memoriju, kako da koristi tastaturu, disk, štampač i sve ostalo što mu je potrebno da izvrši svoj zadatak. Kada taj program završi sa radom, može se učitati slijedeći program, koji isto tako mora znati da rukuje sa svim uređajima koje koristi. Primjer predstavlja konzola za igranje Atari 2060, kod koje su svi programi u ROM-u, koji se zamjenjivao za svaki program. Ova metoda je već davno napuštena, pošto je vrlo nepraktična programeri moraju ugraditi sve potrebne drajvere u svaki program. Ako nema dovoljno memorije, programer mora naći neko rješenje: optimizuje kod, ili će program razbiti na manje funkcionalne dijelove koji se mogu samostalno izvršavati ili nešto treće. Drugi način je da se memorija dijeli između operativnog sistema i jednog korisničkog programa. Kada se računar uključi, učitava se operativni sistem bez njega se računar ne može koristiti. Korisnik izdaje naredbe operativnom sistemu. Ako OS prepozna komandu, pokušava je izvršiti, ako ne, javlja grešku i čeka sljedeću naredbu. Korisnikov program se učitava u preostali dio memorije i tamo se izvršava. Više nije potrebno u svaki program ugraditi i sve potrebne drajvere, jer je OS zadužen da obezbijedi sve potrebne funkcije. Imamo više načina za raspodjelu memorije: 1. OS se učitava u donji dio RAM-a (Random Access Memory memorija koja se može i čitati i pisati), a ostatak memorije je na raspolaganju korisničkim programima (Slika 73 b): 2. OS se nalazi u ROM-u (Read Only Memory memorija koja se može samo čitati) na vrhu memorije a korisnički program ispod njega (Slika 73 c): 3. OS se nalazi u donjem delu RAM-a, drajveri u ROM-u na vrhu memorije a između korisnički program. Osnovni skup funkcija za rad sa uređajima može biti smješten u poseban dio ROM memorije koji se zove BIOS (Basic Input Output System). OS se oslanja na BIOS, a korisnički programi mogu pozivati i funkcije OS-a i funkcije BIOS-a. (Slika 73 d) Prvi model je bio upotrebljavan u mainframe mašinama i prvim mikroračunarima a danas se više ne upotrebljava. Problem pristupa je u unosu operativnog sistema nakon nestanka električne energije, jer ako nema ROM memorije, dobar dio operativnog sistema bi se morao unositi preko specijalne komandne ploče bit po bit u mašinskom jeziku. Drugi model se upotrebljava u embedded sistemima, kućnim računarima 80'ih (ZX Spectrum, C64), mnogim prenosnim računarima itd. Treći model je upotrebljavan prije u PC sistemima, sa CP/M ili MS DOS. Dio sistema u ROM-u se naziva BIOS (Basic Input Output System). U tako struktuiranom sistemu može istovremeno raditi samo jedan proces. 6.5.Multiprogramiranje sa fiksnim particijama Monoprogramiranje se danas može naći još samo u nekim ugrađenim sistemima. Većina modernih sistema može izvršavati više programa istovremeno. Kada je istovremeno aktivno više procesa, i jedan proces čeka na završetak neka U/I operacije u među-vremenu može neki drugi proces preuzeti CPU. Multiprogramiranje uvećava iskorištenost CPU. Na mrežnim serverima može istovremeno raditi više procesa, a i većina klijent mašina imaju danas tu karakteristiku. Multiprogramiranje znači da istovremeno imamo i više spremnih procesa u internoj memoriji. Multiprogramiranje pruža više prednosti. rad sa više korisnika, bolje iskorištenje procesorskog vremena (dok proces A čeka na podatke sa diska, procesor bi mogao izvršavati proces B),

136 Multiprogramiranje sa fiksnim particijama jednokorisnički sistemi: dok uređujemo tekst, želimo slušati muziku sa CD-a, a želimo da nam printer nešto odštampa. Kao što smo vidjeli, drugi način monoprogramiranja je podjela memorije na dva dijela jedan dio koristi OS, a drugi dio je namijenjen korisničkim programima. Ovdje bismo mogli ostvariti swapping: spremni procesi čekaju na disku, jedan odabrani proces se učitava u memoriju i izvršava se neko vrijeme, zatim se vraća na disk, pa biramo drugi itd. Jedan veliki nedostatak ove realizacije je sporost. Diskovi su mnogo sporiji od memorije, pa ćemo mnogo vremena izgubiti na mijenjanje procesa. Proširenje ove ideje je slijedeće: podijelimo memoriju na međusobno nezavisne i odvojene dijelove particije, ako je moguće različitih veličina. U svaku particiju ćemo učitati proces koji je spreman za izvršavanje. Taj proces vidi samo svoju particiju i misli da je sam u memoriji. Kada dođe zahtjev za pokretanje, može se postaviti na kraj reda za čekanje za najmanju particiju koja je za njega dovoljno velika. Imamo dva pristupa za određivanje veličine particija: 1. Neka su sve particije iste veličine. Relizacija ovog pristupa je jednostavna, jer se ne moraju čuvati tabele koje bi govorile o veličini i poziciji pojedine particije. Nedostatak se vidi na primjeru kada je particija veličine 1MB, a u njoj se izvršava proces veličine 100KB, cijela particija je zauzeta, a 90% raspoložive memorije u toj particiji je neiskorišteno 2. Neka su particije različitih veličina. U ovom slučaju imamo manje i veće particije, u svaku particiju stavljamo proces koji najbolje iskorištava raspoloživu memoriju. Više redova čekanja Particija 1 Particija 1 Particija 2 Particija 2 Particija 3 Particija 4 Particija 5 Jezgro Particija 3 Particija 4 Particija 5 Jezgro Slika 74 Redovi čekanja kod multiprogramiranja s fiksnim particijama Kako se vidi na slici Slika 74, za liste čekanja imamo dvije mogućnosti: 1. Svaka particija ima svoju listu čekanja. Novi proces se stavlja u listu najpogodnije particije (gledamo da imamo što manje neiskorištene memorije). Nedostatak ovog pristupa: može se desiti da na listama čekanja manjih particija čeka 100 procesa a lista neke veće particije je prazna. 2. Imamo jednu listu čekanja za sve particije. Kada neka particija postaje slobodna, upravljač memorije pregleda listu čekanja i bira slijedeći proces. U slučaju jedinstvene liste čekanja, izbor procesa može se vršiti na dva osnovna načina: 2.1. Biramo proces koji je najbliži u redu čekanja i može da stane u datu particiju. Nedostatak ovog pristupa: imamo na raspolaganju veliku particiju, ali je mali proces bliže nego veliki, pa će mali proces biti učitan u veliku particiju gubimo mnogo memorije na mali proces.

137 6.6.Relokacija Biramo najveći od svih onih procesa koji mogu stati u datu particiju. Nedostatak ovog pristupa je što su mali procesi diskriminisani, uvijek biramo procese koji zahtijevaju više memorije. 2.3 Evo rješenja za izbjegavanje navedenih nedostataka. Potrebno je definisati dovoljan broj dovoljno malih particija (u koje mogu stati samo mali procesi a ne i veliki). Tako se manji zahtjevi mogu zadovoljiti da ne zauzimaju veću particiju. 2.4 Može se uvesti slijedeće pravilo: ni jedan zahtjev ne smije biti preskočen više od k puta. Svaki zahtjev koji se preskoči dobiva jedan poen, i onaj zahtjev koji je skupio k poena ne smije se više preskakati. Ovaj model se zove MFT (multiprogramming with a fixed number of tasks) a danas ga podržava veoma malo sistema. 6.6.Relokacija Particionisanjem memorije dolazimo do situacije, da jedan isti proces može biti učitan i izvršavan u različitim particijama. To dovodi do problema relokacije, naime prilikom prevođenja programa kompajler (prevodilac) generiše objektne fajlove koji sadrže logičke adrese. Zatim dolazi linker (povezilac) i povezuje sve korištene (i prevedene) module u jedan izvršni fajl. Da bi to uradio, potrebno je da zna početnu fizičku adresu gde će program biti učitan i izvršavan. Pošto je to za vrijeme povezivanja nepoznato, i linker će morati da koristi logičke adrese. Znači sada imamo izvršni fajl sa logičkim adresama. Adresa koju generiše procesorska instrukcija je logička, a adresa same memorijske jedinice je fizička. Logičke i fizičke adrese su iste u fazi prevođenja i u fazi učitavanja programa ali se razlikuju u fazi izvršavanja. Logička adresa se u fazi izvršavanja naziva i virtualnom adresom. Skup svih logičkih adresa koje generiše program naziva se logički ili virtualni adresni prostor, a skup svih fizičkih adresa koje njima odgovaraju naziva se adresni prostor. Mapiranje virtualnog adresnog prostora u fizički obavlja hardverski uređaj koji se zove MMU jedinica za upravljanje memorijom (engl. Memory Management Unit). Najjednostavnija šema mapiranja je šema koja koristi relokacioni registar. Relokacioni registar definiše adresu fizičkog početka programa. Svaka logička adresa koju generiše program sabira se sa vrijednošću relokacionog registra i tako dobijamo fizičke adrese. Korisnički program počinje od nulte adrese. Ako se ograničimo na programe veličine 64K, Intel 8086 ima ovakvu mogućnost. Četiri segmentna registra CS, DS, SS i ES u suštini predstavljaju relokacione registre podijeljene s Zaštita Zaštita operativnog sistema od korisničkih procesa i međusobna zaštita korisničkih procesa po pitanju pristupa memorijskim sekcijama može se realizovati pomoću hardverske podrške. Procesor treba imati dva posebna registra: base register (bazni registar) i limit register (limit (granični) registar). Bazni registar čuva početnu adresu particije gde je proces učitan, a limit registar krajnju adresu te particije (ili veličinu particije). Punilac u ovom slučaju ne mijenja adrese procesa, jednostavno samo učita proces u particiju i postavi vrijednost baznog registra. Znači sada u memoriji imamo proces sa logičkim adresama. Svaki put prilikom adresiranja, uzima se logička adresa programa i sabira se sa sadržajem baznog registra i tako se dobija fizička adresa. Hardverska podrška rješava i problem zaštite: kada se izračunava fizička adresa memorije kojoj program želi pristupiti, jednostavno se upoređuje sa sadržajem limit registra. Korištenje baznog registra za relokaciju pruža još jednu mogućnost: program se može

138 Upravljanje memorijom sa swappingom pomijerati po memoriji za vrijeme izvršavanja - jer su sve adrese logičke, a fizičke se računaju na osnovu baznog registra. Program prebacimo na neku drugu početnu adresu, postavimo sadržaj baznog registra i izvršavanje se može nastaviti. 6.8.Upravljanje memorijom sa swappingom Kod batch sistema je jednostavno i efektivno memoriju podijeliti na fiksne particije. Svaki zadatak se puni u jednu particiju kada je na redu (u redu za čekanje) i ostaje u memoriji dok ne završi. Sve dok je u memoriji dovoljno zadataka koji CPU mogu držati zaposlenom nema razloga za komplikovanijim sistemom. Kod time-sharing sistema ili PC-a sa grafičkim interfejsom situacija je drugačija. Nekad nema dovoljno mjesta u memoriji za sve aktivne procese, pa zato se neki od njih moraju snimiti na disk i po potrebi dinamički ponovo pozvati u memoriju. Za ovakvo upravljanje memorijom postoje u osnovi dva pristupa. Za koje se odlučuje, zavisi djelimično i od hardvera. Najjednostavnija strategija je tzv. swapping kod koga se svaki proces kompletno poziva u memoriju, smije tamo biti neko određeno vrijeme i nakon toga se vraća na disk. Kod druge strategije, koja se zove virtualna memorija, programi mogu biti aktivni i kada se samo djelimično nalaze u memoriji. Tehnika razmjene zahtjeva (swap) zahtjeva postojanje tri komponente: - prostor na disku (engl. swap space), - mehanizam swap-out koji prebacuje procese iz memorije na disk, - mehanizam swap-in koji vraća uspavani proces sa diska u memoriju. Ovaj pristup upravljanja memorije je viđen npr. na Windows Multiprogramiranje sa promenljivim particijama Da bismo izbjegli problem unutrašnje fragmentacije (engl. internal fragmentation) uvodimo promjenljive particije: veličina pojedinih particija se određuje na osnovu procesa koji se učita u memoriju. Nemamo unaprijed određen broj particija sa unaprijed određenim veličinama. Kada se proces učita, zauzima onoliko memorije koliko mu je potrebno (ako imamo dovoljno memorije). Razlika između fiksnih i promjenljivih particija je slijedeća: kod fiksnih particija, broj, veličina, pa i lokacija svih particija su određeni unaprijed pri pokretanju sistema od strane sistem operatora. Kod promjenljivih particija ne znamo unaprijed ni broj, ni veličinu ni lokaciju particija ti parametri se određuju dinamički i zavise od procesa koji se izvršavaju. Flekisbilnost poboljšava iskorištenost memorije, ali je dodjeljivanje, oslobađanje i upravljanje memorijom komplikovanije. I fiksne i promjenjive particije imaju problem fragmentacije, tj. neiskorištenog dijela memorije koja bi se možda mogla dodijeliti nekom procesu kome je potrebna, ali se to ne može postići zbog prirode algoritma dodjele memorije. Interna fragmentacija se javlja ukoliko se procesu dodjeli dio memorije veći od memorije koju proces zahtjeva. Preostali dio memorije ostaje neiskorišten sve dok proces ne oslobodi svu memoriju koju je zauzeo. Ovakva fragmentacija se dešava u sistemima s fiksnim pariticijama. Eksterna fragmentacija je karakteristična za sisteme sa kontinualnom dodjelom memorije, a u ovom slučaju za sisteme s promjenjivim particijama. Procesu se ne može dodijeliti određena količina memorije jer na sistemu ne postoji dovoljno velik kontinualni memorijski blok (bez obzira što ukupna količina slobodne memorije premašuje zahtjeve procesa).

139 6.9.Multiprogramiranje sa promenljivim particijama 139 Na slici Slika 75 se vidi na nakon što su učitani procesi A, B i C, a zatim je B oslobodio svoju memoriju, slobodno područje memorije više nije kontinualno, što predstavlja eksternu fragmentaciju. Problem spoljašnje fragmentacije (engl. external fragmentation) mogli bismo rješiti tako što ćemo pomjerati sve procese tako da se sve slobodne particije nalaze na jednom mjestu kontinualno (to se zove kompakcija - compaction). Kompakcija memorije zahtjeva dosta CPU vremena pa se u normalnim uslovima ne koristi. D D C C C B A A A Kernel Kernel Kernel Kernel Slika 75 Pojava fragmentacije kod promjenjivih particija Značajno pitanje je koliko memorije treba rezervisati za proces koji se poziva u memoriju. Kada svaki proces ima fiksnu veličinu koja se nikad ne mijenja, to je jednostavno, operativni sistem mu dodjeljuje tačno koliko mu je potrebno. Drugi problem koji može nastati je kada procesi rastu. Ako postoji praznina u memoriji pored prostora koji okupira proces ta mu se praznina može dodjeliti. Ako proces leži direktno pored nekog drugog procesa, rastući proces se mora prebaciti u neki veći prazan prostor koji je dovoljno velik za njega ili se neki procesi moraju izbaciti da bi se stvorio dovoljno veliki prostor. Kada proces ne može dalje rasti proces mora čekati ili biti prekinut: 1. Procesi su dužni da prilikom učitavanja u memoriju jave maksimalnu veličinu. 2. Proces se ubija (prekida) uz poruku o grešci. 3. Proces se prebacuje na disk i čeka da se potrebna količina memorije oslobodi. Treći problem je to što treba voditi računa o tome, gdje se nalaze zauzete particije i koje su njihove veličine, odnosno gdje se nalaze prazne particije i koje su njihove veličine. Ako pođemo od pretpostavke da se većina procesa u periodu dok su aktivni povećava, nije loše rezervisati nešto više prostora u memoriji. Na slici Slika 76 sa lijeve strane vidimo konfiguraciju memorije kod koje je za dva procesa ostavljen prostor tako da se oni mogu povećavati. Na slici Slika 76 sa desne strane uzeta je u obzir struktura procesa koja uključuje njegova tri fundamentalna dijela, programski kod, područje podataka i područje steka. Područje podataka raste prema višim memorijskim adresama, a područje steka prema nižim memorijskim adresama. Zona između ova dva područja je rezervisana za širenje datog procesa.

140 Strukture podataka za upravljanje memorijom kod alokacije s promjenjivim particijama Prostor za širenje B Proces B Prostor za širenje A Proces A Jezgro Stek procesa A Prostor za širenje A Podaci procesa A Programski kod procesa A Jezgro Slika 76 Prostor za širenje, promjenjive particije 6.10.Strukture podataka za upravljanje memorijom kod alokacije s promjenjivim particijama Za vođenje evidencije o zauzetosti memorije (o zauzetim particijama) i o rupama između particija (slobodna memorija) možemo koristiti sljedeće strukture: 1. Bit mape (engl. bit maps), 2. Povezane liste (engl. linked lists), 3. Sistem udruženih parova - drugova (engl. buddy sistem) Upravljanje memorijom sa bit mapama Kod upravljanja memorijom pomoću bit mape, memorija se dijeli na dijelove iste veličine. Svakom dijelu odgovara jedan bitu u bit mapi pri čemu 0 znači ja je jedinica slobodna a 1 da je zauzeta (Slika 77). Tako dolazimo do niza nula i jedinica (bitova) koji se zove bit mapa memorije. A B C D Slika 77Upravljanje slobodnim prostorom s bitmapama Pitanje: koje veličine treba da budu ovi dijelovi memorije? Veličina alokacionih jedinica je značajno pitanje dizajna. Što su manje jedinice to je veća mapa bita. Glavni problem ovdje je da svaki put kad neki proces treba k jedinica, treba pretražiti bit mapu tražeći niz k 0-bita. Pošto ovo zahtijeva dosta vremena to je ozbiljan argument protiv bit mapa Upravljanje memorijom sa povezanim listama (linked lists) Memorija je ili zauzeta od strane nekog procesa (P) ili je slobodna (praznina, H hole). Povezane liste gradimo od slogova strukture prikazane na slici Slika 78 P ili H početna adresa veličina Slijedeći

141 6.13.Algoritmi za izbor prazne particije 141 Slika 78 Struktura sloga za upravljanje memorijom Prvo polje sloga označava tip memorije: P označava da se radi o procesu, H da se radi o slobodnoj memoriji. Drugo polje sadrži početnu adresu dijela memorije koju opisuje dati slog. Treće polje veličinu opisane memorije, a četvrto polje sadrži pokazivač na slijedeći slog. Pridruživanje zauzetih i slobodnih dijelova memorije ulančanoj listi izgleda kao na slici Slika 70. A B C D P 0 4 H 4 3 P 7 5 H 12 1 P 13 2 P 15 3 H 18 3 Slika 79 Upravljanje slobodnim prostorom preko ulančane liste Upravljanje memorijom se odvija na slijedeći način: Zauzimanje memorije: imamo proces, tražimo dovoljno veliku rupu u memoriji. Pretražujemo povezanu listu, tražimo slog tipa H (praznina) dovoljne veličine. Ako nađemo, umjesto H upišemo P, i eventualno ubacimo novi čvor tipa H (ako proces ne zauzima cijelu prazninu, ostaje nam neka manja praznina). Oslobađanje memorije: proces A završi Prije završetka P Nakon završetka P sa radom, oslobodimo zauzetu memoriju. Tada jednostavno stavimo H umjesto P, ako se i ispred i iza procesa A nalazi neki drugi proces (a ne slobodna memorija), inače vršimo ažuriranje liste. Jedan proces uglavnom ima dva susjeda, koji mogu biti ili proces ili praznina (procesi A A P P P P B B A A B B na rubu memorije imaju samo jednog susjeda). To su moguće kombinacije koje su Slika 80 Uređivanje ulančane liste predstavljene na slici Slika Algoritmi za izbor prazne particije Neka se koristi sistem za upravljanje slobodnom memorijom, sa promjenjivim particijama, preko povezane liste ili bitmape. Pretpostavka je da su liste sortirane na osnovu početnih adresa. 1. Prvo uklapanje (FIRST FIT) je najjednostavniji algoritam za rezervaciju memorije. Menadžer memorijom pretražuje povezanu listu od početka do kraja i novi proces stavlja u prvu prazninu koja je dovoljna velika. Ako je rupa iste veličine kao i sam proces, jednostavno mijenjamo tip sloga iz H (praznina) u P (proces), ako je rupa veća, mijenjamo tip iz H na P, postavimo veličinu, zatim iza tog sloga ubacimo još jedan koji će predstavljati prazninu koja preostaje. Ovo je najbolji algoritam. 2. Slijedeće uklapanje (NEXT FIT): radi na isti način kao first fit, samo ne kreće svaki put od početka liste, već od mjesta gdje je posljednji put stao. Pokazuje slične performanse kao first fit. Ovaj algoritam za razliku od prethodnog zapamti poziciju gdje je zadnji put našao

142 Sistem drugova (Buddy system) odgovarajuću prazninu te svoju sljedeće pretraživanje počinje od te pozicije. Ovaj algoritam se pokazao kao nešto brži nego prvo uklapanje. 3. Najbolje uklapanje (BEST FIT) je sljedeći poznati algoritam svaki put pretražuje cijelu listu i traži najmanju odgovarajuću prazninu u koju može stati dati proces. Sporiji je od prva dva algoritma jer mora svaki put preći cijelu listu. Pored toga dolazi do veće spoljašnje segmentacije (gubimo više memorije nego kod prethodna dva algoritma): pošto uvijek tražimo najmanju moguću praznina a mala je vjerovatnoća da će ta praznina biti po bajtu iste veličine kao proces, pa dobijamo mnoštvo malih praznina koja se ne mogu ni na šta iskoristiti (bez grupisanja na jedno mjesto a to je jako spora operacija i izbjegava se). 4. Najveća particija - najgore uklapanje (WORST FIT): radi na isti način kao best fit, samo što uvijek traži najveću moguću prazninu. Pretpostavka je slijedeća: ako proces stavimo u najveću moguću prazninu, imamo veću šansu da ostatak bude dovoljno veliko da u njega stane neki drugi proces. Simulacije su pokazale da je worst fit najlošiji algoritam. Do sada smo pretpostavili da koristimo jednu povezanu listu u kojoj se nalaze procesi i rupe sortirani po početnim adresama. Sada ćemo razmatrati neke moguće varijacije ovih algoritama: 1. Koristimo dvije liste jednu listu za procese i jednu listu za praznine. Dobra strana je brzina (ne treba preći i preko procesa). Loša strana je povećana kompleksnost ažuriranja: ako proces postaje praznina mora se izbaciti iz liste za procese a ubaciti u listu za praznine. Ako praznina postaje proces, mora se prebaciti iz liste za praznine u listu za procese pošto ćemo vjerovatno dobiti i novu prazninu, moramo zauzeti memoriju za novi slog i ubaciti u listu za praznine. 2. Ako koristimo dvije liste, mogli bismo listu za praznine sortirati po veličini tada best fit i worst fit veoma brzo rade (postaju efikasni kao i first fit). 3. Koristimo posebnu listu za procese i više lista za praznine. Formiramo liste praznine često korištenih veličina. Npr. 4KB, 8KB, 20KB itd. Neobične (praznine nepredviđene veličine) stavljamo u posebnu listu. Ovaj algoritam se zove quick fit dobra strana je brzina, loša strana je komplikovanost ažuriranja, naročito kada proces postaje praznina, pa treba vidjeti da li su susjedi praznine radi spajanja u veću praznine Sistem drugova (Buddy system) Jedan od načina za smanjenje eksterne fragmentacije i ubrzanje procesa kompakcije je sistem drugova (Buddy system). Metod kombinuje neke osobine alociranja po fiksnim i promjenjivim particijama, dok pretraživanje slobodnog bloka ide kroz strukturu stabla a ne ulančane liste, pa je stoga brže. Radi na sljedeći način. Neka je bio zahtjev veličine s. Čitav dostupni prostor se tretira kao jedan blok veličine 2 m U Ako je veličina zahtjeva s takva da je 2 m-1 < s 2 m, čitav blok se zauzima U suprotnom blok se dijeli na jednake dijelove (buddies). Postupak se nastavlja sve dok se ne nađe najmanji blok koji je veći ili jednak zahtjevu s. Upravljač memorije koristi po jednu listu za blokove slobodne memorije veličine 1,2,4,8,16,32,64, itd. bajtova sve do ukupne veličine memorije, po stepenima dvojke. Uzmimo na primjer, da imamo 1MB memorije, tada ćemo imati 21 listu (2^0=1... 2^20=1MB). Na početku cijela memorija je prazna, pa u listi za rupe od 1MB imamo jedan slog, a ostale liste su prazne. 1024KB

143 6.14.Sistem drugova (Buddy system) 143 Sada dolazi proces A veličine 70KB. Najmanja particija u koju može stati jeste ona od 128KB (mora biti stepen od 2). Na žalost, lista koja sadrži particije te veličine je prazna. Zato ćemo particiju od 1MB razbiti na dva dijela od 512KB (ovi dijelovi se zovu drugovi buddy), pa ćemo prvi razbiti na dva dijela od 256KB, i još jednom, prvi dijelimo na dva dijela od 128KB. U prvu particiju stavimo proces: A :128K 128K 256K 512K Sada lista od 128Kb sadrži dva čvora (jedan je zauzet P, a drugi je slobodan H), a liste od 256KB i 512KB sadrže po jedan slobodan čvor. Ovdje već vidimo nedostatak ovog sistema: za proces od 70KB zauzimamo čitavu particiju od 128KB, tj. gubimo 58KB memorije (interna fragmentacija). Neka sada dođe proces B veličine 35KB. Potrebno je zauzeti particiju veličine 64KB. Lista za takve particije je prazna. Zato dijelimo prvu slobodnu particiju od 128KB na dva dijela od 64KB, u jednu ubacimo proces B a druga ostaje prazna. Sada imamo po jedan čvor u listama za 128KB, 256KB i 512KB i dva čvora u listi za 64KB. A :128K B:64K 64K 256K 512K Novi proces C od 80KB ubacujemo tako što dijelimo 256KB na dva dijela od 128KB, u prvi ubacimo C a drugi ostaje prazan: A :128K B:64K 64K C:128K 128K 512K Posmatrajmo sada stanje memorije: zauzeli smo =320KB za tri procesa ukupne veličine =185KB. Ako neki proces završi sa radom, provjerimo veličinu praznine koja nastaje. Ako u susjedstvu ima druga, formiramo duplo veću prazninu od te dvije praznine. Važno je da veličina novoformirane praznine bude neki stepen od 2 ako to nije slučaj, odustajemo od spajanja. Na primjer, ako B završi: A :128K 128K C:128K 128K 512K Slika 81 Buddy sistem u formi stabla Particije buddy sistema se mogu prikazati u formi stabla (Slika 81). Čvorovi koji pokazuju na slobodne blokove mogu biti označeni drugačijom bojom od onih koji pokazuju na zauzete blokove. Stabla se pretražuju u vremenu koje je proporcionalno logaritmu broja njegovih

144 Windows API za upravljanje memorijom elemenata, što znači da je pretraživanje slobodnog mjesta u buddy sistemu brže nego kod ulančanih listi Windows API za upravljanje memorijom Za alokaciju i oslobađanje memorije dodijeljene procesu, Windows API pruža sljedeće funkcije: CopyMemory (pdestination,psource,ilength ) Kopira blok memorije s jednog mjesta na drugo FillMemory(pDestination,iLength,bFill); Puni memoriju istim bajtom GetProcessHeap() Dobavlja alokacijsko područje za proces VirtualAlloc(lpAddress,dwSize,dwAllocationType,dwProtect) Alocira dio virtualne memorije za proces (zaokruženo na veličinu stranice) VirtualFree(lpAddress,dwSize,dwFreeType); Oslobađa alociranu virtualnu memoriju HeapAlloc(hHeap,dwFlags,dwBytes) Alocira dio memorije unutar procesa HeapReAlloc(hHeap,dwFlags,lpMem,dwBytes) Mijenja veličinu memorije za proces HeapFree(hHeap,dwFlags,lpMem) Oslobađa memoriju alociranu za proces HeapSize(hHeap,dwFlags,lpMem) Dobavi veličinu alociranog memorijskog bloka 6.16.Posix API za upravljanje memorijom Svega dvije Posix funkcije za upravljanje memorijom su sistemski pozivi int brk(void *end_data_segment); Postavlja kraj područja memorije za proces void *sbrk(intptr_t increment); Uvećava kraj područja memorije za proces Aplikacije trebaju koristiti C funkcije calloc(), malloc(), realloc(), valloc(), memalign() 6.17.Dijeljene biblioteke Uvođenjem dinamičke relokacije, otvara se i mogućnost korištenja dijeljenih, zajedničkih biblioteka (shared library). Podprograme koje koriste skoro svi programi (npr. svi podprogrami iz standardne biblioteke jezika C, podprogrami za grafičko okruženje) nećemo ugraditi u svaki program posebno, već ćemo napraviti posebno područje memorije koje će svi programi dijeliti. Tako nema potrebe da te biblioteke učitamo u adresni prostor svakog procesa, već je dovoljna jedna kopija u memoriji svi će to koristiti (Slika 82). Proces P1 Dijeljena biblioteka Proces P2 Slika 82Dodjela memorije u dijeljenim bibliotekama Dijeljene biblioteke se mogu realizovati kroz linearnu alokaciju s promjenjivim particijama, kao i segmentima ili stranicama, o kojima će biti kasnije riječi. U slučaju linearne alokacije s

145 6.18.Windows API za dijeljene datoteke 145 promjenjivim particijama, u jezgru operativnog sistema treba dodati sistemski poziv koji omogućava pozive podprograma iz dijeljene biblioteke. Ovaj poziv iz korisničkog programa bi privremeno promijenio relokacioni registar da pokazuje na područje dijeljene biblioteke, i zatim pozvao odgovarajući podprogram Windows API za dijeljene datoteke Funkcije koje omogućavaju učitavanje dijeljenih datoteka na Windows su LoadLibrary(lpFileName) Učitava dinamičku biblioteku (.dll) u memoriju FreeLibrary(hModule) Oslobađa dinamičku biblioteku iz memorije GetModuleFileName(hModule,lpFilename,nSize) Dobavi puno ime biblioteke s stazom GetProcAddress(hModule,lpProcName) Traži adresu podprograma s datim imenom u dinamičkoj biblioteci DllMain (hinstdll,fdwreason, lpvreserved) Glavna rutina DLL podprograma 6.19.Posix API za dijeljene datoteke Funkcije su mprotect(paddr, ilen, iprot) Postavlja prava nad dijelom memorije mlock(paddr, ilen) munlock(paddr, ilen) Zaključava/otključava dio virtualnog prostora procesa mlockall(iflags) munlockall() Zaključava/otključava cijeli virtualni prostor procesa mincore(paddr, ilength, pvec) Informiše da li je taj dio adresnog prostora u RAM-u madvise(paddr, ilength, iadvice) Predlaže jezgru kako da mapira stranice procesa 6.20.Zadaci Zadatak 1: Ako imamo sistem s 8 memorijskih šupljina S1(20K), S2(6K), S3(8K), S4(30K), S5(27K), S6(9K), S7(29K), S8(20K), i želimo udovoljiti zahtjevima redom za 6, 11, 5 kilobajta, koje šupljine ce biti korištene za a)first fit b)best fit c)worst fit? a) First fit Zahtjev 1 (6K) šupljina S1 koja sada postaje 14K Zahtjev 2 (11K) šupljina S1 koja sada postaje 3K Zahtjev 3 (5K) šupljina S2 koja sada postaje 1K b) Best fit Zahtjev 1 (6K) šupljina S2 koja sada postaje 0K Zahtjev 2 (11K) šupljina S1 koja sada postaje 9K Zahtjev 3 (5K) šupljina S3 koja sada postaje 3K c) Worst fit Zahtjev 1 (6K) šupljina S4 koja sada postaje 24K Zahtjev 2 (11K) šupljina S7 koja sada postaje 18K Zahtjev 3 (5K) šupljina S5 koja sada postaje 22K Zadatak 2. Neka je memorija buddy sistema alokacije inicijalno prazna i iznosi K. Nacrtati kako izgleda memorija dodijeljena zahtjevima od redom 69246K, 26046K, 45033K. Rješenje: Prva veličina veća od a koja je stepen broja 2 je Prva veličina veća od a koja je stepen broja 2 je Prva veličina koja je veća od a koja je stepen broja 2 je Kako se zahtjevi trebaju smjestiti na adrese djeljive s veličinom bloka u koji se smiješta, adrese gdje će se smjestiti zahtjevi su :

146 Zadaci 0:69246, :26046, : Z1 free Z2 free Z3 free Zadatak 3: Oba posmatrana operativna sistema (Windows 32 bitni i Linux za i386) posmatraju svaki proces kao da ima adresni prostor od 4 gigabajta. Programeri u jeziku C kreiraju dinamičke strukture podataka koristeći funkciju malloc, programeri u jeziku C++ operator new. Principi realizacije ovih funkcija se razlikuju na ova dva operativna sistema. Primjer malloc i free kako se realizuju pod Linux sistemom. Ovaj alokator radi na principu sistemskog poziva sbrk. Ovaj poziv pomjera poziciju kraja programa. Na programeru biblioteke ostaje da realizuje algoritam unutar datog prostora za aplikaciju (u ovom primjeru first fit). Dovršite i kompajlirajte sljedeći program za Linux, dodajući main funkciju, koja poziva navedeni malloc (dakle, ne onaj iz sistemske biblioteke, nego ovaj koji slijedi) i koja će popuniti dinamički kreiran niz od n elemenata (n se unosi) vrijednostima kvadrata indeksa. /* Ukljuci the sbrk funkciju */ #include <unistd.h> int has_initialized = 0; void *managed_memory_start; void *last_valid_address; void malloc_init() { /* Dohvati zadnju vazecu adresu koju daje OS */ last_valid_address = sbrk(0); /*Jos ne upravljamo memorijom, pa postavi pocetak da bude last_valid_address*/ managed_memory_start = last_valid_address; /* Inicijaliziramo i spremni smo za dalje */ has_initialized = 1; struct mem_control_block { int is_available; int size; ; void free1(void *firstbyte) { struct mem_control_block *mcb; /* Kopiraj od trenutnog pointera da nadjes * mem_control_block */ mcb = firstbyte - sizeof(struct mem_control_block); /* Oznaci blok kao raspoloziv */ mcb->is_available = 1; /* To je to! Gotovi smo. */ return;

147 6.20.Zadaci 147 void *malloc1(long numbytes) { /* Drži gdje gledamo u memoriji */ void *current_location; /* Ovo je kao current_location, ali sa tipom memory_control_block */ struct mem_control_block *current_location_mcb; /* Memorijska lokacija koju ćemo vratiti ce biti privremeno postavljena na 0 */ void *memory_location; /* Inicijaliziraj ako vec nije */ if(! has_initialized) { malloc_init(); /* Trazena memorija će uključiti kontrolni blok, ali korisnik malloc to ne treba znati */ numbytes = numbytes + sizeof(struct mem_control_block); /* Privremeno memory_location na 0 */ memory_location = 0; /* Pocni traziti kroz upravljanu memoriju */ current_location = managed_memory_start; /* Nastavi dok ne pretrazimo alocirani prostor */ while(current_location!= last_valid_address) { /* current_location i current_location_mcb pokazuju na istu lokaciju */ current_location_mcb = (struct mem_control_block *)current_location; if(current_location_mcb->is_available) { if(current_location_mcb->size >= numbytes) { /* Nadjena lokacija, pa ona postaje zauzeta*/ current_location_mcb->is_available = 0; /* Mi je posjedujemo */ memory_location = current_location; /* Kraj petlje */ break;

148 Zadaci /* Trenutni blok ne odgovara, idemo na sljedeci */ current_location = current_location + current_location_mcb->size; /* I dalje nedovoljno, prosirujemo prostor aplikacije */ if(! memory_location) { /* Pomjeri kraj programa za numbytes */ sbrk(numbytes); /* Nova memorija je na zadnjoj vazecoj adresi */ memory_location = last_valid_address; /* Pomjeri zadnju vazecu adresu*/ last_valid_address = last_valid_address + numbytes; /* Inicijaliziraj mem_control_block */ current_location_mcb = memory_location; current_location_mcb->is_available = 0; current_location_mcb->size = numbytes; /* Pomjeri pointer iza mem_control_block */ memory_location = memory_location + sizeof(struct mem_control_block); /* Vrati pointer */ return memory_location; Zadatak 4. Primjer malloc i free kako se realizuju pod Windows sistemom. Windows ima veći broj funkcija za alociranje globalne i privatne memorije. Ovdje je korišten sistemski poziv HeapAlloc. Dovršite i prevedite sljedeći program za Windows pod Linux, dodajući main funkciju, koja poziva navedeni malloc (dakle, ne onaj iz sistemske biblioteke, nego ovaj koji slijedi) i koja će popuniti dinamički kreiran niz od n elemenata (n se unosi) vrijednostima kvadrata indeksa. #include <windows.h> #define heapnew GetProcessHeap() void *malloc1(size_t size){ if (heapnew) return HeapAlloc(heapNew, HEAP_ZERO_MEMORY, size); return NULL; void free1(void *block) { if (block!= NULL && heapnew) HeapFree(heapNew, 0, block);

149 7.1.Odvojen prostor instrukcija i prostor podataka Diskontinualna alokacija memorije i virtualna memorija Do sada smo koristili linearni adresni prostor: počinje od nule i ide do nekog maksimuma, cio proces se posmatra kao linearna struktura. Program smo razbijali na dijelove učitavali po potrebi da bismo mogli izvršavati programe koji su veći od raspoložive memorije. Neki nedostaci ovog pristupa: ako bilo koju proceduru izmijenimo, moramo prevoditi cio program jer je adresni prostor linearan, pa ako izmijenimo veličinu te procedure, mijenjaju se sve adrese iza nje, ili može doći do rasta steka za vreme izvršavanja programa tako da se stek napuni, pa se podaci pišu na dio gdje se nalazi kod programa. 7.1.Odvojen prostor instrukcija i prostor podataka Većina računara imaju zajednički adresni prostor koji sadrži i programe i podatke. Kada je adresni prostor dovoljno velik, ovo funkcioniše odlično (Slika 83 a). Na žalost ovaj prostor je često premalen Proces podaci Proces instrukcije OS podaci OS instrukcije Proces instrukcije Proces OS podaci instrukcije OS 0 0 podaci Jedinstveni adresni prostor Adresni prostor instrukcija Adresni prostor podataka Slika 83 Zajednički i odvojeni adresni prostori za programe i podatke Jedno moguće rješenje ovog problema su odvojen prostor za instrukcije i prostor za podatke. Slika 83 b) pokazuje odvojene adresne prostore. Ovdje algoritmi straničenja za odvojene prostore mogu biti nezavisni. Ovaj pristup se realizuje na dva osnovna načina. Jedan je sličan kontinualnoj alokaciji s relokacionim registrom, samo što postoje dva relokaciona registra, jedan koji u memoriji pokazuje početak koda, a drugi koji pokazuje početak podataka. Na taj način instrukcije JMP 1000 i MOV R1,(1000) pristupaju različitim fizičkim lokacijama, no promjenom vrijednosti relokacionih registara, može se i programu pristupiti kao da su u pitanju podaci. Ekstremniji pristup je Harvard arhitektura. Ona je starija od Von Neumanove, koja je prva predložila da su u istoj memoriji i program i podaci. U Harvard arhitekturi program i podaci su potpuno odvojeni. Isti procesor može na primjer imati 24 bitnu širinu riječi za instrukcije a 4-bitnu za podatke. Ovakva arhitektura je uobičajena u mikrokontrolerima i kalkulatorima koji ne mijenjaju svoj osnovni program u ROM, a koriste vrlo malo RAM memorije.

150 Virtualna memorija 7.2.Virtualna memorija Znamo da procesor može izvršavati samo procese koji su u internoj memoriji. Kako je operativna memorija relativno malog kapaciteta, dolazimo do sljedećih problema: 1. Proces je veći od interne memorije (problem se dešava i kod monoprogramiranja i kod multiprogramiranja), 2. Nemamo dovoljno memorije da učitamo sve spremne procese (problem se dešava kod multiprogramiranja). Virtualna memorija predstavlja posebnu memoriju i razlikuje se od fizičke memorije. Operativni sistem drži dijelove programa koji su u tom trenutku potrebni u glavnoj memoriji a ostatak na disku. Virtualna memorija funkcioniše i kod multiprogramiranja, pri tome dijelovi različitih programa mogu istovremeno biti u memoriji. Osnovna ideja je da programi mogu imati proizvoljnu veličinu a OS treba voditi računa o tome da u memoriji budu samo oni dijelovi procesa (i kod i podaci) koji su u datom trenutku potrebni, a ostatak neka čeka na disku. Znači jedan dio procesa je u internoj memoriji a drugi dio je u eksternoj memoriji, a sam proces ne zna ništa o tome njemu se čini da ima dovoljno operativne memorije i da se čitav proces nalazi u internoj memoriji. Drugim riječima: ako nema dovoljno memorije, uzećemo malo od diska procesi neće znati za to, možda korisnik primijeti usporavanje rada programa. 7.3.Segmentacija (segmentation) Virtualna memorija koju smo do sad razmatrali je jednodimenzionalna zato što virtualne adrese rastu linearno od 0 do određenog maksimuma. Za dosta problema bi bilo dobro imati dva ili više odvojenih adresnih prostora. Segmentacija je metoda upravljanja memorijom koja podržava logički korisnički pogled na memoriju. Logički adresni prostor sastoji se od kolekcije segmenata a svaki segment ima jedinstveno ime i dužinu. Kako segmenti predstavljaju vlastite prostore, oni mogu nezavisno mijenjati veličine. Kada neki stek u određenom segmentu treba više prostora može ga dobiti. Naravno može se desiti da segment ostane bez prostora ali to se veoma rijetko dešava. 30K Slike 18K Stek 25K Tekst 26K Podprogrami 28K Glavni Program S1 S2 S3 S4 S5 Slika 84 Segmentacija Adresa u ovom segmentiranom, dvodimenzionalnom prostoru sastoji se iz dva dijela: broja segmenta i adrese unutar segmenta. Slika 84pokazuje kako segmenti mogu biti izgrađeni. U ovom primjeru program koristi 5 segmenata. Segment gradi logičku cjelinu. Programer mora biti svjestan toga i koristiti ga kao cjelinu. Ideja segmentacije je da se svakom procesu dodijeli više linearnih adresnih prostora koji počinju od nule i idu do nekog maksimuma. Ti prostori ili dijelovi procesa se nazivaju

151 7.3.Segmentacija (segmentation) 151 segmentima. Svaki segment predstavlja linearnu memoriju. Segmenti predstavljaju funkcionalne dijelove programa kao što su: kod programa, stek, heap, ali segment može da sadrži i samo jednu proceduru ili niz ili nešto drugo. Veličina svakog segmenta može se mijenjati za vrijeme izvršavanja od nule do nekog maksimuma. Različiti segmenti mogu biti različitih veličina. Pošto svaki segment ima svoj adresni prostor (linearan), različiti segmenti nemaju uticaja jedan na drugi. Sa uvođenjem segmentacije adresiranje zahtijeva dvije adrese: jednu segmentnu adresu koja identifikuje segment i jednu ofset adresu koja daje adresu unutar tog segmenta. Znači adrese su oblika (segment, ofset). Neke pogodnosti segmentacije: Ako koristimo segmentaciju, i procedure stavimo u posebne segmente, ne moramo kao kod linearnog pristupa svaki put kad izmijenimo neku proceduru prevoditi cio program. Pošto je svaki segment nezavisan i ima svoj linearni adresni prostor, dovoljno je prevesti samo onu proceduru koju smo izmijenili. Pošto segmenti uglavnom sadrže samo jedan tip struktura: npr. samo stek, samo kod procedure, samo neki niz, razni segmenti mogu imati razne tipove zaštite. Npr. segment procedure može se samo izvršavati, u stek smijemo i pisati i čitati, elemente niza možemo samo čitati (konstantni niz) itd. Da bi OS mogao preuzeti brigu o segmentima, potrebno je da ima slijedeće informacije: početna adresa segmenta, veličina (dužina) segmenta, tip segmenta, bezbjednosni podaci. Ove informacije se čuvaju u tabeli segmenata. Segmenti se mogu koristiti i za virtualnu memoriju. Tablica koja opisuje koji segment počinje od koje fizičke adrese, može da ima i podatak da se segment ne nalazi u memoriji. U tom slučaju, pristup memorijskoj lokaciji iz tog segmenta bi forsirao hardverski prekid, nakon čega operativni sistem može da obavi zamjenu segmenta. Segm ent 4 (21K ) Segm ent 3 (24K ) Segm ent 2 (15K ) Segm ent 4 (21K ) Segm ent 3 (24K ) Segm ent 2 (15K ) Segm ent 1 (24K ) Segm ent 7 (15K ) Segm ent 0 Segm ent 0 (12K ) (12K ) a) b) Segm ent 5 (12K) Segment 5 (12K ) Segm ent 3 (24K) Segment 6 Segm ent 5 (12K ) (12K ) Segm ent 2 Segment 2 Segm ent 6 (15K) (15K ) (12K ) Segm ent 2 (15K ) Segm ent 7 Segment 7 Segm ent 7 (15K) (15K ) (15K ) Segm ent 0 Segment 0 Segm ent 0 (12K) (12K ) (12K ) c) d) e) Slika 85 Eksterna fragmentacija kod segmentacije Mana segmentacije je što programer aplikacija, pogotovo ako se pišu u asemblerskom jeziku treba biti njih svjestan. Ponekad i u višim programskim jezicima se uvode jezička proširenja koja kažu da li podatke držati u posebnim segmentima ili ne, jer je prebacivanje podataka između različitih segmenata ponekad sporije nego unutar istog segmenta. Druga mana se vidi na slici Slika 85. Slika prikazuje fizičku memoriju koja ima 5 segmenata. Kada se ukloni segement 1 i manji segment 7 dođe na njegovo mjesto nastaje situacija na slici (Slika 85b). Između segmenta 7 i 2 je nastaje neiskorišteno područje, jedna

152 Straničenje (paging) praznina. Nakon toga se segment 4 zamjenjuje segmentom 5 (Slika 85c), segment 3 segmentom 6 (Slika 85d). Nakon izvjesnog vremena rada sistema, memorija je podijeljena na na veliki broj blokova od kojih su neki segmenti a neki praznine. Ovaj fenomen se zove checkerboarding ili eksterno fragmentiranje. Windows 3.1 u standardnom režimu rada koristi pristup segmentacije. 7.4.Straničenje (paging) Većina sistema sa virtualnom memorijom primjenjuju tehniku koja se zove straničenje. Straničenje se koristi kao tehnika za realizaciju virtualne memorije. Kada se nema dovoljno interne memorije da bismo učitali cijeli proces, koristimo virtualnu memoriju memoriju koja je veća od fizičke interne memorije. Za realizaciju virtualne memorije potrebna pomoć hardvera. Memorijska adresa generisana od strane programa zove se virtualna adresa iz virtualnog adresnog prostora. Kod računara bez virtualne memorije, adresa generisana od strane procesa ide direktno od procesora ka memoriji. Ako koristimo virtualnu memoriju, virtualna memorija ide prvo do dijela procesora koji se zove jedinica za upravljanje memorijom (MMU Memory Managment Unit), koja virtualnu adresu pretvara u fizičku memorijsku adresu (Slika 86). Za svaki računar postoji veliki broj adresa koje programi mogu kreirati. One adrese koje generišu programi zovu se virtualne adrese i one grade virtualni adresni prostor (engl. virtual address space). Slika 87 pokazuje jednostavan primjer kako funkcioniše preslikavanje sa virtualne na fizičku adresu. Virtualni adresni prostor je podijeljen na jedinice, koje se zovu stranice (pages). Isto tako internu memoriju dijelimo na blokove iste veličine. Ova odgovarajuća jedinica u fizičkoj memoriji zove se okvir stranice (page frame). Stranice i okviri stranica imaju uvijek jednaku veličinu. Između memorije i diska se uvijek prenose čitave stranice. Memorija Sabirnica Između implementacije segmentacije i straničenja postoji velika razlika, stranice imaju fiksnu veličinu, segmenti ne. CPU MMU Ulazno- Izlazni uređaji Slika 86 Položaj MMU u računarskom sistemu Virtualni adresni prostor 60K-64K 56K-60K 52K-56K 48K-52K 44K-48K 40K-44K 36K-40K 32K-36K 28K-32K 24K-28K 20K-24K 16K-20K 12K-16K 8K-12K 4K-8K 0K-4K X 7 X 3 X 5 X X X 2 X 6 Fizički adresni prostor Slika 87 Preslikavanje virtuelne adrese u fizičku 28K-32K 24K-28K 20K-24K 16K-20K 12K-16K 8K-12K 4K-8K 0K-4K

153 7.5.Tabele stranica i greške stranica Tabele stranica i greške stranica Računanje fizičke adrese na osnovu virtualne adrese se radi na osnovu tabele stranica (page table) koja predstavlja preslikavanje virtualnih stranica u fizičke stranice. Ova tabela se dodjeljuje svakom procesu i mijenja se u toku izvršavanja procesa: ako proces želi pristupiti nekoj adresi koja se nalazi na virtualnoj stranici koja nije učitana u internu memoriju, moramo izbaciti neki okvir za stranice iz operativne memorije (ako je cijela operativna memorija već zauzeta) na eksternu memoriju a iz eksterne memorije moramo dovući traženu stranicu na mjesto izbačenog okvira za stranice. Ako jedan program želi pristupiti adresi 0, virtualna adresa 0 se šalje u MMU. MMU ustanovi da ova virtualna adresa pripada stranici 0. što opet odgovara okviru stranice sa brojem 6 (24576 do 28671). To znači da se virtualna adresa 0 preslika na fizičku adresu MMU preslika sve virtualne adrese od 0 do 4095 na fizičke adrese od do Kada tražena virtualna stranica nije učitana u internu memoriju, MMU ustanovi da se ova stranica ne nalazi u memoriji i pokreće jedan sistemski poziv. Ovaj sistemski poziv se zove greška stranice (page fault). Operativni sistem traži jedan okvir stranice koji je manje korišten piše njegov sadržaj nazad na disk. Poslije toga puni stranicu koja je prouzrokovala grešku stranice u upravo oslobođeni okvir stranice, prilagođava tabelu i ponovo izvršava prekinutu komandu. Neka CPU šalje adresu = (Slika 88). Tu adresu dijelimo na dva dijela: 4 najznačanija bita označavaju indeks unutar tabele stranica, a ostalih 12 bita relativnu adresu unutar date stranice. Tako možemo imati ukupno 16 virtualnih stranica (od 0 do 15), a sa 12 bita možemo adresirati ukupno 2^12 =4096 = 4KB memorije. (Zato smo adresni prostor dijelili na 4KB stranice.) Tabela stranica sadrži dakle 16 polja. Svako polje će biti predstavljeno pomoću 4 bita: 3 najznačajnija bita daju redni broj okvira stranica, a najmanje značajni bit informaciju o tome da li je data virtualna stranica učitana u internu memoriju (1 jeste, 0 nije). Taj bit se zove bit prisutnosti (present/absent bit). Fizičku adresu formiramo na sljedeći način: na osnovu 4 najznačajnija bita adrese dobijene od CPU-a (0101), uzmemo indeks okvira stranice (001), pogledamo da li je data stranica učitana u internu memoriju (1 jeste, ako nije, generišemo page fault prekid) i samo iza 001 dodajemo ostatak adrese ( ), pa dobijamo Prva 3 najznačajnija bita označavaju okvir stranice, a ostalih 12 bitova daju offset adresu unutar tog okvira. Kako Broj okvira Broj stranice Fizička adresa Pozicija u fizičkom okviru Tabela stranica Pozicija u stranici Bit prisustva Virtuelna adresa Slika 88 Binarna slika virtuelne i fizičke adrese imamo 3 bita za okvire, možemo imati ukupno 8 okvira. Vidimo da je dobijena fizička adresa petnaestobitna (15), to omogućava adresiranje do 32KB memorije. U najjednostavnijem slučaju preslikavanje iz virtualnih adresa u fizičke funkcioniše onako kako je upravo opisano. Virtualna adresa se djeli na virtualni broj stranice (biti visoke

154 Informacije u tabeli stranica vrijednosti) i offset (biti niske vrijednosti). Broj virtualne stranice se koristi kao indeks za pretraživanje tabele stranica. Informacija u tabeli stranica sadrži broj odgovarajućeg okvira stranice, kada je dostupan. Broj okvira stranice se stavlja na kraj offseta do bita višeg prioriteta i zamijeni broj virtualne stranice. Broj okvira stranice i offset daju fizičku adresu koja se šalje u memoriju. Svrha tabele stranica je preslikavanje virtualnih stranica u okvire stranica. Uvođenje straničenja stvara i nove probleme. Tabela stranica može postati ekstremno velika, a ako bi svaki pristup memoriji zahtijevao pogled u tabelu stranica, to bi bilo suviše sporo. Kasnije će biti riječi o načinima rješavanja ovih problema. 7.6.Informacije u tabeli stranica Prava Mijenjana M R Prisutna Broj fizičkog okvira Tačna organizacija podataka u tabeli stranica zavisi od mašine ali informacije koje su tu sadržane su kod skoro svih mašina iste. Slika 89 prikazuje primjer elementa tabele. Keširanje Pristupana Veličina se razlikuje od računara do Slika 89 Struktura elementa tablice stranica računara, ali su 32 bita tipična veličina. Najznačajnije polje je broj okvira stranice, čija je vrijednost u suštini i razlog pravljenja tabele. Pored toga imamo present/absent bit, koji pokazuje da li stranica trenutno leži u memoriji. Ukoliko je ova vrijednost 0, prilikom zahtjeva za stranicom nastaje greška stranice. Zaštitni biti upravljaju pristupom stranici, u najjednostavnijem slučaju ovo polje sadrži samo jedan bit 0 za pristup za čitanje i pisanje i 1 za čitanje. Modified bit (M-bit) i referenced bit (R-bit) protokolišu pristup stranici. Zadnji bit dozvoljava regulisanje keširanja. Ova osobina je značajna za stranice koje se preslikavaju u registre uređaja a ne u memoriju. Ako je operativni sistem poslao U/I instrukciju nekom uređaju i čeka u petlji na odgovor. Tu je značajno da hardver pri svakom prolasku kroz petlju pročita vrijednost registra a ne jednu te istu kopiju keša. Pomoću ovog bita se keširanje može isključiti. 7.7.Spremnik za prevođenje TLB Translation Lookaside Buffer U većini sistema sa straničenjem se tabele stranica drže u memoriji zbog njihovog obima. Zbog toga performanse sistema mogu biti oslabljene. Uzmimo kao primjer jednu instrukciju koja kopira jedan registar u drugi. Bez straničenja je ovdje potreban samo jedan pristup memoriji da se instrukcija uzme iz memorije. Sa straničenjem su potrebni dodatni pristupi memoriji da se uzme instrukcija iz tabele stranica. Kada je po jednom pristupu potrebno više pristupa tabeli stranica smanjuju se performanse. Da bi se izbjeglo pristupanje memoriji više puta za istu instrukciju, računari imaju jedan mali uređaj, koji virtualne adrese, bez zaobilaska preko tabele stranica, preslikava na fizičke adrese. To je skup povezanih registara građen od brze memorije, a zove se zove TLB (engl. translation lookside buffer). TLB se koristi sa tabelama stranica kao keš za najčešće korištene memorijske reference. Ukoliko se referenca pronađe u TLB, adresa okvira se dobija gotovo istovremeno i prelazi se na pravu memorijsku referencu. Ukoliko se dogodi promašaj tad se par vrijednosti za tekuću referencu mora dovesti u TLB. On je jedan dio MMU i sastoji se od malog broja unosa. U ovom slučaju je to 8, u stvarnosti rijetko više od 64. Svaka stavka TLB-a sadrži informaciju o jednoj stranici. Te informacije su virtualni broj stranice, bit koji se postavlja kad se stranica modificira, zaštitni bit i fizički okvir

155 7.8.Invertovana tabela stranica 155 stranice. Još jedan bit pokazuje da li je unos važeći. Kada se jedna virtualna adresa pošalje MMU, hardver prvo provjerava da li će odgovarajući unos pronaći u TLB. Kada se odgovarajući unos pronađe i pristup nije u suprotnosti sa bitom zaštite, primjenjuje se broj okvira stranice iz tabele. Kada virtualna stranica ne stoji u TLB MMU zaključuje da nema tog unosa, normalno pristupa tabeli stranica i upisuje u TLB pri čemu prepisuje neki stari unos. 7.8.Invertovana tabela stranica Kod velikih adresnih prostora, za uobičajene veličine stranica, ukupan broj fizičkih okvira postaje veliki i tabela stranica bi zauzela većinu fizičke memorije. Npr. za 64 bitni virtualni adresni prostor i 4 kilobajtnu stranicu, potrebna veličina tabele je 2 52 elemenata. Broj stranice Pomak Hash funkcija Broj stranice Broj okvira Broj stranice Broj okvira Broj stranice Broj okvira Smanjena tabela indeksirana Po hash funkciji Slika 90 Invertovana tabela stranica Jedno rješenje za veće sisteme je invertovana tabela stranica (engl. inverted page table). Kod ovog pristupa se u tabelu stranica snima jedna vrijednost po svakom fizičkom okviru stranice umjesto po svakoj stranici u virtualnom prostoru. Svaki unos u tabelu za odgovarajući okvir stranice sastoji se od informacije o virtualnoj adresi stranice smještene na tu memorijsku lokaciju sa informacijom o procesu koji posjeduje tu stranicu: odgovarajući par (proces, broj stranice). Invertovane tabele stranice štede memoriju, bar onda kada je virtualni adresni prostor značajno veći od fizičke memorije ali imaju jedan značajan nedostatak. Sad je značajno komplikovanije virtualnu adresu preslikati na jednu fizičku adresu. Kada proces n želi pristupiti virtualnoj stranici p, hardver ne može jednostavno naći fizički okvir stranice tako što koristi virtualni broj stranice kao indeks nego mora pretražiti čitavu tabelu tražeći unos (p,n). Osim toga je ova pretraga neophodna za svaki pristup memoriji a ne samo kod greške stranice. Rješenje za ovu dilemu je TLB. Kada sve stranice koje se puno koriste mogu stati u TLB, preračunavanje adresa je jednako brzo kao i preračunavanje sa tabelama stranica. Prilikom TLB greške mora invertovana tabela stranica biti softverski pretražena. Invertovana tabela stranica (engl. inverted page table (IPT)) kombinuje tabelu stranica i tabelu okvira u jednu strukturu podataka. U suštini je to jedna tabela fiksne veličine sa redovima koji su povezani sa okvirima stranice fizičke memorije. Za svaki red postoji jedno mjesto za broj virtualne stranice (virtual page number (VPN)) broj okvira stranice i još neki podaci. Jedna praktična metoda je korištenje hash-tabele sa hash vrijednostima. Sve virtualne stranice koje imaju istu hash vrijednost su povezane u listu kao na slici. Kada hash-tabela ima toliko unosa koliko sistem fizičkih stranica, svaki lanac ima jedan unos što ubrzava pretragu.

156 Hijerarhijsko straničenje Kada je broj stranice pronađen, novi par koji se sastoji od virtualne stranice i fizičkog okvira stranice se unese u TLB (Slika 90). 7.9.Hijerarhijsko straničenje Pored invertovane tabele stranica, drugi način za smanjenje veličine stranica je straničenje na dva ili više nivoa. Kod metoda straničenja na dva nivoa (Slika 91), logička adresa se dijeli na tri dijela: redni broj imenika stranica koja ukazuje na stranice u kojima su smještene prave tabele stranica, pozicija u tabeli stranica i pozicija unutar stranice. Neka je proces velik 6 M virtualne memorije, adresni prostor je 32 bitni, a veličina stranice 4K (12 bitna adresa). Sa straničenjem na jednom nivou, tablica bi morala imati odgovor na pristup bilo kojoj memorijskoj adresi, s to predstavlja 2 20, tj, preko milion elemenata, iako bi samo prvih 1536 zaista pokazivalo na fizičku memorijsku lokaciju, a ostale bi imale vrijednosti da stranica nije prisutna. Tada bi u memoriji tablica stranica bila četiri megabajta za proces. P2 P1 Pozicija u stranici Fizički okvir Pozicija u stranici Slika 91 Straničenje na dva nivoa Ako s druge strane logičku adresu podijelimo na dva nivoa straničenja, s deset bita za tablicu vanjskog nivoa, deset bita za tablicu stranica i dvanaest bita za adresu unutar stranice, za predstavljanje procesa veličine 6 M u memoriji bilo bi dovoljne tri dodatne memorijske stranice: stranica s imenikom čija dva elementa pokazuju na tabele stranica, a ostalih 510 su prazni, jedna stranica s tabelom stranica čiji svi elementi pokazuju na fizičke adrese i druga stranica s tabelom stranica čijih polovina elemenata pokazuju na fizičke adrese, a polovina na stranice koje nisu u memoriji. Na tablice stranica se u ovom slučaju troši 12 kilobajta. Za veće adresne prostore, može se ići i na više nivoa tablica stranica. Štaviše, samo tablica najvišeg nivoa mora stalno biti u memoriji. Tablice na nižim nivoima se mogu čuvati i izvan centralne memorije i učitavati u memoriju tek kada se zaista pristupi memorijskoj lokaciji na koju trebaju pokazivati.

157 7.10.Postupak kod greške stranice Postupak kod greške stranice Kada instrukcija pristupi memorijskoj lokaciji koja je u tabeli stranica označena kao nedodijeljena fizičkom okviru, dešava se sljedeći postupak. 1. Hardver upisuje stanje brojača i pokreće skok u kernel 2. Snimljeno stanje opštih registara 3. OS određuje koja virtualna stranica je potrebna 4. OS provjerava validnost adrese, traži okvir stranice 5. Ako je izabrani okvir modifikovan, zapiši na disk 6. OS puni novu stranicu sa diska 7. Aktuelizira se tabela stranica 8. Instrukcija koja je prouzrokovala grešku vraća se na prethodno stanje 9. Raspoređuje se proces koji je prouzrokovao grešku 10. Snimljeni registri se vraćaju 11. Program nastavlja Sa ovakvim postupkom postiže se efekat kao da je ta memorijska lokacija uvijek bila u fizičkoj memoriji, ali zahtijeva značajan vremenski period. Stoga su istraživani algoritmi da se to dešava što je moguće rjeđe. Na učestalost grešaka stranice utiču načini izbora stranice za učitavanje i izbora stranice za izbacivanje Izbor stranica za učitavanje (fetch-strategy) Za izbor trenutka kada će se stranica učitavati u memoriju, imamo dvije osnovne strategije: 1. Učitavanje po potrebi (engl. demand paging): učitavamo samo jednu stranicu onu koju traži MMU. Dobra strana je što u internoj memoriji držimo samo one stranice koje su stvarno potrebne. Loša strana je sporo pokretanje programa, jer će u ranoj fazi program zahtijevati više memorijskih lokacija, a ovim algoritmom će se puniti jedan po jedan memorijski okvir bez iskorištenja optimalnog trenutka rotacije diska. 2. Učitavanje sa predviđanjem (engl. anticipatory paging): OS pokuša predvidjeti, pogoditi koje stranice će biti potrebne za rad procesa i učitava te stranice ako baš nema šta da radi, a ni disk nije zauzet. Ako pogodi koje stranice treba učitati, smanjuje se broj grešaka (page fault) i izvršavanje procesa dobija na brzinu. Ako ne, od učitavanja nemamo nikakvu korist. Kako cijena interne memorije pada a kapacitet raste, ova strategija postaje sve popularnija Algoritmi za izbor stranice za zamjenu (page replacement algorithms) Kada dođe do prekida - page fault, koji javlja OS-u da MMU nije našao traženu virtualnu stranicu među okvirima unutar interne memorije, OS treba da odredi u koji će okvir učitati potrebnu stranicu, odnosno sadržaj kog okvira će izbaciti iz operativne memorije da napravi mjesta za stranicu koja stiže. Ako je sadržaj izabranog okvira modifikovan, OS ga mora prebaciti na disk s ciljem aktualiziranja kopije koja se nalazi na disku. Međutim ako se stranica nije mijenjala, kopija na disku je aktuelna, tako da aktueliziranje nije potrebno, a stranica koja se upisuje u operativnu memoriju jednostavno prepiše stranicu koju treba izbaciti. Iako bi bilo moguće izabrati slučajnu stranicu da se riješi problem greške stranice, performanse sistema su mnogo bolje ako se izabere stranica koja se ne koristi puno. Možemo pretpostaviti da će stranica koja se mnogo koristi vjerovatno vrlo brzo ponovo biti potrebna. Ako se ukloni takva stranica vrlo brzo ćemo u tom slučaju ponovo imati grešku stranice.

158 Optimalni algoritam (Optimal Page Replacement Algorithm) Dosta teoretskih i praktičnih istraživanja je urađeno na temu algoritama zamjene stranica. Algoritmi za izbor stranice za zamjenjivanje (page replacement algorithms) Objasnićemo neke od najvažnijih algoritama: 1. Optimalni algoritam 2. NRU (Not Recently Used): okvir koji nije skoro korišten 3. FIFO (First-In, First-Out algoritam): prvi učitani okvir 4. Druga šansa (Second Chance): varijanta FIFO algoritma 5. Satni (Clock page) algoritam 6. LRU (Least Recently Used): izbaciti onu stranicu koja u prošlosti nije najdulje upotrebljavana 7. NFU (Not Frequently Used): najrjeđe korišten okvir 8. NFU sa starenjem 9. Algoritam sa radnim skupom (Working Set Algoritam ) 10. WSClock algoritam zamjene stranica 7.13.Optimalni algoritam (Optimal Page Replacement Algorithm) Kada dođe do greške stranice, optimalni algoritam će se potruditi da izbaci onu stranicu za koju smatra da će najkasnije biti potrebna. Znači, ako vidimo da će stranica A biti potrebna nakon 100 instrukcija, a stranica B za 1000 instrukcija, onda je bolje da izbacimo stranicu B. Time ćemo pojavu slijedeće greške stranice odložiti najduže što možemo. MMU ne voli prekidati svoj rad i javljati OS-u da nije našla neku stranicu, zato se trudimo da odložimo prekide što duže. Ova je najbolja moguća strategija, ali nažalost ne može se implementirati. Ne postoji način da OS dođe do potrebne informacije o tome, kada će koja stranica biti potrebna. Trebalo bi na neki način predvidjeti rad procesa. Računari kao i ljudi pokušavaju da odgode neprijatne događaje što je moguće dalje u budućnost. Jedini problem sa ovim algoritmom je da ga nije moguće realizovati. U trenutku u kome se pojavljuje greška stranice, operativni sistem ne zna koja je stranica sljedeća. Ipak ako pokrenemo program na simulatoru moguće je implementirati optimalnu zamjenu stranica, iz drugog puta, korištenjem informacije koje su prikupljene prvi put. Na ovaj način je moguće uporediti performanse algoritma koji je moguće realizovati sa najboljim mogućim algoritmom. Ako operativni sistem postigne performanse samo 1% lošije nego optimalni algoritam napori uloženi za traženje boljeg algoritma će dati u najboljem slučaju 1% bolji rezultat. Treba naglasiti da se ovo odnosi samo na mjereni program sa specifičnim ulaznim podacima. Iako je ovaj metod koristan za procjenu algoritma zamjene stranica, nije od praktičnog značaja u realnim sistemima. Dalje ćemo razmatrati algoritma koji su korisni u realnim sistemima NRU (Not Recently Used): okvir koji nije skoro korišten Strategija ovog algoritma je sljedeća: izbacujemo onu stranicu kojoj nismo skoro pristupili. Da bi omogućili operativnom sistemu da prikupi korisnu statistiku o tome koje su stranice korištene a koje ne, većina računara sa virtualnom memorijom ima dva statusna bita koja su povezana sa svakom stranicom. Pretpostavimo da su svakom okviru pridružena dva bita: R (engl. Referenced) označava da li smo pristupili (čitali ili pisali) tom okviru, odnosno M

159 7.15.FIFO (First-In, First-Out algoritam): prvi učitani okvir 159 (engl. modified) da li smo mijenjali sadržaj tog okvira. Ako hardver računara ne podržava ove bitove, mogu se implementirati na nivou OS-a. R se postavlja svaki put kad se stranica koristi (čita ili piše). M se postavlja kada se na stranicu upisuje (modificira). Biti su sadržani u tabeli stranica. Značajno je da ovi biti moraju biti aktuelizirani prilikom svakog pristupa memoriji i moraju biti postavljeni od strane hardvera. Kad je bit postavljen na 1 on ostaje 1 sve dok ga operativni sistem ne resetuje na 0. Pri početku rada procesa svi R-biti i M-biti dobijaju vrijednost 0. Zatim pri svakom prekidu hardverskog sata OS briše vrijednost R-bita (stavlja R=0) da bi mogao razlikovati stranice koje su skoro korištene od onih koje nisu. Ako je R=1, to znači da je datom okviru pristupano u zadnjem vremenskom intervalu. Kada učitamo neku stranicu sa eksterne u internu memoriju stavimo M=0 (sadržaj okvira nije modificiran). Ako dođe do mijenjanja sadržaja stranice, stavimo M=1 to onda označava da ćemo morati sadržaj tog okvira prebaciti na disk, da bi smo sačuvali promjene, ako za izbacivanje izaberemo baš taj okvir. R i M biti se koristiti da formiraju jednostavan algoritam straničenja. Ukratko, kada je proces pokrenut, operativni sistem postavlja oba bita za sve njegove stranice na 0. Periodično, na svaki prekida sata, R bit se briše. Tako je R bit postavljen samo kod stranica koje su u zadnje vrijeme korištene. Kada se pojavi greška stranice operativni sistem pregleda sve stranice i dijeli ih na četiri kategorija na osnovu vrijednosti njihovih R i M bita: Klasa 0: nije referenciran, nije modifikovana (R=0, M=0). Klasa 1: nije referenciran, modificiran (R=0, M=1). Klasa 2: referenciran, nije modifikovan (R=1, M=0). Klasa 3: referenciran, modifikovan (R=1, M=1). Iako klasa 1 izgleda nemoguća, ona se pojavljuje kada je kod stranice klase 3 R bit modificiran na signal sata. Signal sata ne briše M bit jer je ovaj bit potreban da se zna da li se stranica mora aktuelizirati na disku. Brisanje R ali ne i M vodi ka stranicama klase 1. NRU (Not Recently Used) algoritam uklanja slučajnu stranicu iz najniže klase. Ovdje postoji pravilo da je bolje ukloniti modificiranu stranicu koja nije referencirana u bar jednom taktu sata nego čistu stranicu koje se često koristi. Glavna prednost NRU algoritma je da je jednostavan za razumijevanje, srednje efikasan za implementaciju i pruža performanse koje iako nisu optimalne mogu biti odgovarajuće FIFO (First-In, First-Out algoritam): prvi učitani okvir Drugi algoritam sa malim opterećenjem (overhead) je FIFO (First-In, First-Out) algoritam. Kao ilustraciju razmotrimo supermarket koji ima dovoljno polica da izloži tačno k različitih proizvoda. Ako želimo uvesti novi proizvod koji obećava uspjeh na tržištu a nemamo dovoljno prostora pretpostavimo da će se supermarket oslobodi nekog starog proizvoda da bi imao mjesta za novi. Jedna mogućnost je pronaći proizvod koji se nalazi u prodaju najduže i riješiti ga se uz pretpostavku da za njega nije više niko zainteresovan. Supermarket vodi listu proizvoda onim redom kojim su uvođeni u prodaju. Novi proizvod dolazi na kraj liste a prvi na listi je izbačen. Kod algoritma zamjene stranica može se primijeniti ista ideja. Operativni sistem održava listu svih stranica koje su trenutno u memoriji na čelu sa stranicom koja je najstarija i na kraju onom koja je zadnja stigla. Kod greške stranice, stranica sa vrha se uklanja a na kraj se dodaje nova stranica.

160 Druga šansa (Second Chance): varijanta FIFO algoritma Kada ovo primijenimo na supermarket, može se desiti da sa prodajne liste uklonimo neki zaista nepotreban proizvod ali isto tako i neki neophodan proizvod (brašno, so ili šećer). Isto važi i za računare te je zato FIFO algoritam rijetko korišten. Ovaj algoritam pretpostavlja da ako je neka stranica davno učitana, vjerovatno je već odradila svoj dio posla i da će u budućnosti manje biti potrebna od stranica koja su stigla posle nje. Nedostatak ovog pristupa je to što ćemo izbaciti stranicu čak i ako je često koristimo samo zato što je ostarila. Zbog ovog nedostatka ovaj algoritam se u ovoj verziji ne koristi Druga šansa (Second Chance): varijanta FIFO algoritma Jednostavna modifikacija FIFO algoritma koja sprečava odbacivanje stranica koje se često koriste ispituje R bit najstarije stranice. Ovaj algoritam sprečava odbacivanje stranica koje se često koriste tako što ispituje R bit najstarije stranice. Kao pomoć, koristimo vrijednost R (referenced) bitova (1 ako smo pristupili stranici, 0 ako nismo). Kada treba izbaciti stranicu, uzmemo zadnju iz reda čekanja, pogledamo R bit. Ako je R=0, to znači da je stranica dugo u memoriji a da joj nismo pristupili dakle, nije potrebna, može se izbaciti i učitati nova. Ako je R=1, to znači da je stranica dugo u memoriji, ali smo je nedavno koristili. Tada ćemo staviti R=0 a stranicu prebacimo na početak reda opsluživanja i gledamo slijedeću stranicu. Znači, ako je stranica korištena dobija još jednu šansu. Ako je R=0 stranica je i stara i neiskorištena zato se odmah zamjenjuje. Ako je R bit 1, bit je izbrisan, stranica se stavlja na kraj liste stranica i njeno vrijeme punjenja se aktuelizira tako da izgleda da je upravo stigla u memoriju. Nakon toga se traženje nastavlja. Ako su sve stranice korištene, algoritam će staviti R=0 za svaku, pa će početi ponovo od najstarije stranice. Sada je R=0, pa će najstarija stranica biti izbačena. Algoritam sigurno nalazi okvir za izbacivanje. Ako je R=0 za sve stranice, ovaj se algoritam ponaša isto kao i FIFO verzija. Rad ovog algoritma koji se zove second chance, je prikazan na slici. Na slici (Slika 92a) vidimo stranice čuvane u ulančanoj listi i sortirane prema vremenu kad su stigle u memoriju a) Slika 92 Second chance 21 2 b) Pretpostavimo da se greška stranice pojavi u trenutku 21. Najstarija stranica je 2, koja je stigla u trenutku 0 kada je proces počeo sa radom. Ako stranica 2 ima R=0, stranica se uklanja iz memorije ili pisanjem na disk (M-bit postavljen) ili samo prepisivanjem (M=0). S druge strane ako je R bit postavljen (R=1), stranica 2 se stavlja na drugi kraj liste (Slika 92b)i njeno vrijeme punjenja se postavlja na aktuelno vrijeme (21). R bit je izbrisan. Potraga za odgovarajućom stranicom nastavlja sa stranicom 5. To što second chance radi je traženje neke stare stranice koja nije pozivana u zadnjem vremenskom intervalu. Ako je stranica referencirana ovaj algoritam se svodi na prosti FIFO. Zamislimo da sve stranice sa slike (Slika 92a) imaju R bit postavljen. Operativni sistem ih jednu po jednu pomijera na kraj liste i briše R bit. Na kraju se vraća na stranicu broj 2 koja sad

161 7.17.Satni (Clock page) algoritam 161 ima R obrisan. U ovom trenutku se stranica 2 uklanja. Tako da se algoritam uvijek može završiti Satni (Clock page) algoritam Nepotrebno pomjeranje stranica čini ovaj algoritam druga šansa nedovoljno efikasnim. Satni algoritam je nadogradnja algoritma druga šansa. Pokazuje se da je bolji pristup čuvati okvire stranica u kružnoj listi u formi sata, kao što je prikazano na slici Slika 93. Pokazivač pokazuje na najstariju stranicu, tj. na stranicu koja je najranije učitana. Kada dođe do greške stranice, stranica na koju se pokazuje se pregleda, tj. provjeri se R bit stranice na koju pokazuje pokazivač. Ako je R=0 stranica se izbacuje a nova se ubacuje na njeno mjesto, pokazivač se pomjera za jedno mjesto. Ako je R =1 ovaj bit je obrisan (stavi se R=0) i kazaljka se pomijera na slijedeću stranicu, nastavljamo traženje. Na ovaj način izbjegavamo stalno pomjeranje opisa stranica sa početka reda opsluživanja na kraj, što se javlja kod algoritma druga šansa, a time poboljšavamo performanse. Ovaj proces se ponavlja dok se stranica za izbacivanje ne pronađe. Ovaj algoritam se od algoritma second chance razlikuje samo u implementaciji. Nedostatak satnog i prethodnog algoritma je u tome što ne vode računa o tome koliko puta smo pristupili pojedinim stranicama Least recently used (LRU) algoritam Dobra aproksimacija optimalnog algoritma se zasniva na razmatranju da će stranice koje su se puno koristile u zadnjih nekoliko instrukcija, biti vjerovatno korištene u nekoliko budućih instrukcija. S druge strane stranice koje nisu dugo korištene vjerovatno se i dalje neće dugo koristiti. Ova ideja predlaže algoritam koji se može realizovati: kada se pojavi greška stranice odbacuje se stranica koja se najduže nije koristila. Strategija se zove LRU (Least Recently Used) straničenje. Iako je LRU teoretski moguće realizovati, to nije jeftino. Ovaj algoritam radi jako dobro, ali se teško ostvaruje. Implementacija zahtijeva podršku od strane hardvera. Imamo nekoliko realizacija: 1. Pomću brojača (hardverska podrška): procesor ima brojač instrukcija. Ovo je načini implementacije LRU sa specijalnim hardverom. Ovaj metod podrazumijeva opremljenost hardvera jednim 64-bitnim brojačem C koji se automatski povećava poslije svake instrukcije. Svaki unos u tabelu stranica treba imati polje koje je dovoljno veliko da sadrži brojač. Kada se računar startuje, brojač se resetuje na nulu. Nakon svake instrukcije povećamo ga za jedan. Svaki okvir ima svoj interni brojač. Svaki put kada pristupimo okviru, prebacimo sadržaj brojača procesora u interni brojač okvira. Kada dođe do page fault prekida, upravljač memorijom pregleda sve interne brojače i bira stranicu čiji je brojač najmanji (to znači da je korištena najdavnije). Nedostatak: pri svakom pristupu memorije moramo izvršiti plus jedan pristup radi prebacivanja sadržaja glavnog brojača u lokalni Slika 93 Satni algoritam 2 5 8

162 NFU (Not Frequently Used): najrjeđe korišten okvir 2. Pomoću povezane liste (softversko rješenje): slično kao kod FIFO algoritma, stranice stavljamo u red opsluživanja. Za potpuno implementiran LRU je neophodno urediti povezanu listu svih stranica u memoriji, sa nedavno korištenom stranicom naprijed, i najdavnije korištenom stranicom na kraju. Kada se javlja page fault prekid, biramo prvu iz reda, novu stavljamo na kraj reda. Svaki put kada pristupimo nekoj stranici, ažuriramo listu: stranicu vadimo iz liste i prebacimo na kraj reda. Ova realizacija je jako spora: pri svakom pristupu memoriji moramo ažurirati listu. Pronalaženje stranice na listi, brisanje, i pomjeranje naprijed zahtjeva puno vremena, čak i u hardverskoj realizaciji uz pretpostavku da takav hardver može biti napravljen. 3. Pomoću dvodimenzionalnog niza (matrice hardverska podrška): Pogledajmo sada drugi hardverski algoritam. Imamo matricu formata NxN, gdje N označava broj okvira interne memorije. Matrica se inicijalizira na nulu (nula-matrica). Prilikom pristupa k-tom okviru, k-ti red matrice ispunimo sa jedinicama a k-tu kolonu sa nulama. Tada red označavaju mladost odgovarajuće stranice u binarnom zapisu (što je broj veći, stranica je korištena u bližoj prošlosti). Biramo stranicu sa najmanjim brojem. U svakom trenutku, red čija binarna vrijednost je najniža je najduže neiskorišten. Rad ovog algoritma je prikazan na slici Slika 94. sa okvirima stranica i redom pristupanja Nakon prvog pristupa stranici 0 imamo situaciju na slici (a). Nakon pristupa stranici 2 sliku (b) itd. a) b) c) d) Slika 94 Brojač vremena pristupa za hardversku realizaciju LRU preko matrica 7.19.NFU (Not Frequently Used): najrjeđe korišten okvir Još jedna mogućnost je NFU (Not Frequently Used) algoritam. Ovo rješenje za svaku stranicu ima jedan softverski brojač koji se na početku postavlja na 0. Biramo stranicu koja je najrjeđe (najmanji broj puta) korištena. Kod svakog prekida sata operativni sistem prekontroliše sve stranice u memoriji i dodaje svakom brojaču odgovarajuće stranice pripadajući R bit. Ovi brojači su pokušaj da se izbroji koliko se često pristupa jednoj stranici. Kod greške stranice stranica sa najnižom vrijednosti brojača će se odbaciti. U ovakvoj varijanti algoritma ima puno manje dodatnog pristupa memoriji od LRU, ali su uočljivi sljedeći problemi. 1. Algoritam sve pamti: stranice koje smo nekada često koristili ostaju u memoriji i pored toga što više nisu potrebne. 2. Nove stranice kreću od nule, stare imaju prednost, pa ćemo izbaciti tek učitanu stranicu. Problem je da ovaj algoritam nikad ne zaboravlja. Može se desiti da operativni sistem izbaci one stranice, zbog vrijednosti brojača, koje su nam potrebne NFU sa starenjem Potrebna je mala promjena koja će približiti ovaj aloritam LRU. Promjena se sastoji iz dva dijela. Brojači se pomjeraju desno prije dodavanja R bita, i ovaj bit se dodaje krajnjem lijevo bitu (najznačajnijem bitu). Kako ovaj poboljšani algoritam funkcioniše pokazuje Slika 95.

163 7.21.Algoritam sa radnim skupom (working set algoritam) 163 Ovaj algoritam je poznat pod imenom NFU sa starenjem (aging). U prvom intervalu R biti imaju vrijednost 1, 0, 0,..., 1.Nakon pomjeranja brojača za jedan bit na desno i dodavanja R bita krajnjem lijevom bitu imao situaciju sa druge kolone slike Slika 95. Ostale kolone pokazuju šta se dešava nakon sljedeća 2 intervala. Kod greške će se otkloniti stranica sa najnižom vrijednošću brojača. Ako dvije stranice imaju vrijednost brojača 0 možemo samo po slučajnom principu otkloniti jednu od njih. Pošto nemamo više od 8 bita, može se desiti da je jednoj stranici pristupano prije 9 intervala a drugoj prije 1000, nemamo načina da to ustanovimo. Vremenski prekid 0 Vremenski prekid 1 Vremenski prekid 2 Vremenski prekid 3 Strana Strana Strana Strana R bit Nedavna aktivmost Slika 95 NFU sa starenjem Ovaj algoritam (aging) pokušava izbjeći nedostatak NFU algoritma da ne bi sve pamtio uračunava i starost stranice: OS prilikom svakog prekida hardverskog sata pomjera bitove unutrašnji brojača prema desno (najmanje značajni bit se gubi), a vrijednost R bita se postavi na najznačajniju poziciju (prvi bit sa lijeve strane). Izbacujemo stranicu čiji brojač ima najmanju vrijednost Algoritam sa radnim skupom (working set algoritam) U najčistijoj formi straničenja proces počinje bez i jedne stranice u memoriji. Čim CPU pokušava pozvati prvu instrukciju dolazi do greške stranice i operativni sistem puni prvu stranicu. Nakon nekog vremena proces ima većinu stranica koje su mu potrebne na raspolaganju i radi dalje sa malim brojem grešaka. Stranice koje proces u jednom određenom trenutku koristi zovu se radni skup (engl. working set). Kada je čitav working set u memoriji proces radi bez puno grešaka stranice, do sljedeće faze rada. Kada memorija koja je na raspolaganju nije dovoljna za sve stranice u radnom skupu proces proizvodi mnogo grešaka stranice i radi sporo. Ovakvo ponašanje nativa se thrashing. Puno sistema zapamti radni skup procesa i pobrine se da ga napuni prije ponovnog pokretanja procesa. Ovaj pristup se zove model radnog skupa, i od njega se očekuje da značajno smanji broj grešaka stranice. Ne smije se zaboraviti da se radni skup s vremenom mijenja. Strategija koja puni stranice prije nego što su potrebne zove se predstraničenje (engl. prepaging).

164 Algoritam sa radnim skupom (working set algoritam) Već dugo je poznato da pristupi memoriji w(k,t) jednog programa nisu jednako podijeljeni preko adresnog prostora nego su koncentrisani na nekoliko stranica. Svaki pristup memoriji ili uzima jednu instrukciju, čita podatke iz memorije ili upisuje podatke u memoriju. U svakom trenutku t postoji veliki broj stranica kojima je pristupano u zadnjih k pristupa memoriji. Ova veličina: w(k,t) je radni skup. k Granična vrijednost w(k,t) je konačna zato što Slika 96 Radni skup jedan program ne može pristupiti više stranica nego što može stati u njegov adresni prostor. Slika 96 prikazuje radni skup u zavisnosti od k. Za implementaciju modela radnog skupa, operativni sistem mora u svakom trenutku znati, koje stranice su u radnom skupu jednog procesa. Iz ove informacije slijedi direktno algoritam straničenja: Kada se pojavi greška stranice, nađi stranicu koja ne pripada radnom skupu, i izbaci je. Vrijednost k mora se unaprijed utvrditi. PERIODIČNO POZIVANA RUTINA NE R=1 DA Age:=VrijemeZadnjegKor-Tren R:=0 VrijemeZadnjegKor=Tren Age>τ NE Zapamti najstariju stranu DA Označi stranu za brisanje Tablica stranica Fizički okvir Vrijeme zadnjeg korištenja R DA NE Još stranica Ništa za brisanje NE DA Označi najstariju stranu za brisanje Slika 97 Algoritam radnog skupa Osnovna ideja ovog algoritma je kad dođe do greške stranice, izbaciti stranicu koja ne pripada working setu. Slika 97 prikazuje isječak iz jedne tabele stranica i algoritam radnog

165 7.22.WSClock algoritam zamjene stranica 165 skupa. Svaki unos sadrži najmanje dvije informacije: približno vrijeme zadnjeg pristupa stranici i R bit. Kod svake greške stranice će tabela stranica biti pretražena u potrazi za stranicama koje se mogu izbaciti. Kod svakog unosa se prvo ispituje R bit. Ako je ovaj bit postavljen u polje za vrijeme zadnjeg pristupa se unosi aktuelno vrijeme, to znači da se stranica u vrijeme pojave greške koristila. S obzirom da je stranica korištena u aktuelnom vremenskom intervalu očigledno pripada u radni skup i ne treba je izbaciti. Kada je R=0 stranica je mogući kandidat za izbacivanje zato što joj nije pristupano u zadnjem vremenskom intervalu. Da se proračuna da li stranica pripada u radni skup izračunaće se njena starost, aktuelno vrijeme minus vrijeme zadnjeg pristupa i uporedi sa τ - uzma se da traje nekoliko intervala. Ako je starost veća od τ, ova stranica ne spada više u radni skup. Ako se nađe više stranica sa R=0, izbacuje se ona sa najvećom starošću WSClock algoritam zamjene stranica Osnovni algoritam radnog skupa je komplikovan, zato što kod svake greške stranice provjerava čitavu tabelu dok ne nađe odgovarajućeg kandidata. Jedan bolji algoritam koji je izgrađen na clock algoritmu zove se WSClock. Zahvaljujući njegovim dobrim karakteristikama i jednostavnoj implementaciji je u realnim sistemima veoma raširen. a) b) c) Vrijeme pristupa R bit d) Nova stranica Slika 98 Algoritam WSClock Jednako kao i clock algoritam i WSClock algoritam koristi prstenastu listu okvira stranica. (vidi sl.slika 93). Kada se prve stranice pozovu, ubacuju se u listu. S vremenom se unosi sve više stranica i lista postaje prsten. Svaki unos u listu sadrži R bit, M bit i polje za zadnji pristup stranici (iz jednostavnog working set algoritma). Kao i kod clock algoritma prvo će se pregledati stranica na koju pokazuje kazaljka. Ako je R bit postavljen stranica je korištena u zadnjem intervalu. Prema tome ona ne može biti kandidat za izbacivanje. R bit se postavlja na 0, kazaljka se pomjera ka sljedećoj stranici i algoritam se ponavlja za ovu stranicu. Slika (Slika 98b) pokazuje stanje nakon ovoga.

166 Pregled algoritama za zamjenu stranica Šta se dešava kad je R bit 0, kao na slici (Slika 98c). Ako je starost stranice veća od τ i ako ona nije promijenjena, ne pripada u radni skup i postoji njena važeća kopija na disku. Stranica će onda jednostavno, kako pokazuje slika (Slika 98d) obrisana i zamijenjena novom stranicom. Ako je sadržaj stranice promijenjen, ona ne može jednostavno biti obrisana jer se mora aktuelizirati na disku. Da bi se izbjegla promjena procesa, prelazak na drugi proces, zabilježi se da se sadržaj stranice treba prepisati na disk i radi se sa algoritmom dalje jer se možda dalje na listi nalazi jedna čista stranica koja se bez problema može izbaciti. U principu nakon jednog kompletnog prolaska listom sve stranice mogu biti označene za aktueliziranje na disk. Da bi se smanjilo opterećenje diska može se postaviti limit da se na disk može snimiti maksimalno n stranica. Kada kazaljka prođe čitavu listu i opet dođe na početak moramo razlikovati dva slučaja: 1. Bar jedna stranica je obilježena za pisanje (aktueliziranje) na disk 2. Nijedna stranica nije zabilježena. U prvom slučaju kazaljka jednostavno ide dalje i traži čistu stranicu. Prva čista stranica na koju algoritam naiđe se zamjenjuje. U drugom slučaju sve stranice pripadaju u radni skup, strategija je ovdje izabrati bilo koju stranicu izbaciti je, upisati na disk i ovaj okvir koristiti za novu stranicu Pregled algoritama za zamjenu stranica Optimalni algoritam zamjenjuje stranice koje će zadnje biti potrebne, na žalost je nemoguće znati koje su to stranice. Nije ga moguće implementirati ali je dobar za upoređenje i mjerenje performansi ostalih algoritama. NRU dijeli stranice na osnovu R i M bita na četiri klase i bira slučajnu stranicu iz najniže klase koja nije prazna. Vrlo jednostavan za primjenu ali i primitivan. Postoje bolji algoritmi. FIFO algoritam pamti redosljed kojim stranice pristižu u memoriju, tako što ih unosi u jednu ulančanu listu. Izabrati najstariju stranicu je trivijalno ali ona može još biti potrebna iako je dugo u memoriji. Zbog toga je FIFO loš izbor. Second chance je modifikovana verzija FIFO. On provjerava da li će se stranica koristiti prije nego je otkloni iz memorije. Ovaj pristup značajno poboljšava performanse. Clock algoritam je drugi način implementacije algoritma second chance. LRU je odličan algoritam, za koji nam je potreban specijalni hardver. NFU je pokušaj približavanja LRU algoritmu i nije naročito dobar algoritam. Nasuprot tome aging predstavlja značajno bolje rješenje. Dva zadnja algoritma koriste working set procesa. Working set pruža pristojne rezultate ali je komplikovan za implementaciju. WSClock je varijanta koja pruža dobre performanse i efikasnu implementaciju. Sve u svemu dva najbolja algoritma su NFU sa starenjem i WSClock. Oba su bazirana na LRU i working setu procesa. Oba imaju dobre rezultate i mogu se efikasno primjeniti. Postoje još neki algoritmi ali ova dva su u praksi najznačajnija Bélády anomalija Intuitivno možemo zaključiti da sistem sa više fizičkih okvira stranice proizvodi manje grešaka stranice. Na žalost to nije uvijek tačno. Bélády je (1969) otkrio da FIFO sa četiri okvira stranice proizvodi više grešaka nego sa tri okvira stranica. Ova čudna situacija se naziva Bélády anomalija. Slika 99 prikazuje situaciju za jedan program sa 5 virtualnih stranica, koje su numerisane od 0 do 4. Stranicama se pristupa u sljedećem nizu Na lijevoj strani

167 7.25.Raspodjela okvira 167 se vidi kako sa tri okvira stranica nastaje ukupno 9 grešaka. Na desnoj strani dobivamo 10 grešaka sa 4 okvira P P P P P P P P P P P P P P P P P P P Slika 99 Beladyjeva anomalija 7.25.Raspodjela okvira Najprostija strategija dodjeljivanja fizičke memorije koja se može primijeniti je kad god se pojavi potreba, stranica se učitava u memoriju. Postavlja se sljedeće pitanje. Kako rasporediti m okvira na n procesa? Maksimalan broj okvira koje proces može dobiti je ograničen fizičkom veličinom memorije. Prema metodi jednake raspodjele, svakom se procesu dodjeljuje jednaka količina okvira m/n. Prema metodi proporcionalne raspodjele, okviri se dodjeljuju procesima na osnovu osobina procesa. a i = Si, S = S n i= 1 Pri tome je m ukupan broj okvira fizičke memorije, a i -broj okvira koji pripada svakom procesu, S -ukupna virtualna memorija, S i -veličina procesa p i, a n broj procesa. Osnovni nedostatak ovih metoda jeste to što pri raspodjeli okvira ne uzimaju u obzir prioritet procesa Lokalne i globalne strategije straničenja Jedno značajno pitanje je kako se memorija dijeli među konkurentnim procesima. Pogledajmo sliku Slika 100. Neka je korišten algoritam LRU. Ako proces A proizvede grešku stranice, treba li algoritam zamjene u obzir uzeti samo njegove stranice ili treba pretražiti čitavu memoriju. U primjeru sa slike, ako se gledaju samo njegove stranice, kandidat za izbacivanje je stranica 2 procesa A, kao najranije zadnji put korištena stranica među stranicama ovog procesa. Ako je korištena lokalna strategija straničenja, kandidat za izbacivanje je stranica 2 procesa B, kao najranije zadnji put korištena stranica među svim stranicama. Prva strategija se zove lokalna strategija straničenja a druga je globalna strategija. Da uporedimo ove dvije strategije. 1. Lokalni pristup: svaki proces dobija određen broj okvira i taj broj se ne može mijenjati. Ako dođe do greške stranice, onda stranicu za bacanje biramo u skupu dodijeljenih okvira. Nedostatak: broj virtualnih stranica procesa je veći od dodijeljenog broja okvira u internoj memoriji, dobar dio memorije je slobodan, ali ne možemo učitati nove stranice bez izbacivanja već učitanih zbog fiksnog broja pridruženih okvira. Drugi nedostatak: proces prelazi u neko stanje u kome od pridruženih 100 okvira koristi samo 25 gubimo mnogo memorije, jer niko drugi ne može pristupiti tim neiskorištenim okvirima. 2. Globalni pristup: broj pridruženih okvira nije ograničen. Memoriju dijelimo na okvire, svaki proces uzima koliko može. Ako proces A generiše grešku stranice, tada za razliku od lokalnog pristupa, stranicu koja će biti izbačena nećemo tražiti samo u skupu okvira pridruženih i n i= 1 S i

168 Efekat zasićenja i kontrola opterećenja za taj proces, već u skupu svih okvira. Znači može se desiti, da OS odluči da izbaci neki okvir procesa B a na to mjesto ubaci traženu stranicu procesa A. Globalni pristup pokazuje bolje rezultate. Pri lokalnoj strategiji ispada ova stranica Pri globalnoj strategiji ispada ova stranica A7 T=22 Stranica A0 A1 A2 A3 A4 A5 A6 B0 B1 B2 B3 C1 C2 C3 Vrijeme zadnje upotrebe Slika 100 Lokalna i globalna strategija straničenja 7.27.Efekat zasićenja i kontrola opterećenja Proces zahtijeva radnu memoriju kao resurs. Ukoliko broj raspoloživih okvira padne ispod minimalne vrijednosti, proces se mora dovesti u stanje WAIT jer resurs nije slobodan pa proces ne može da se izvršava. Ako je broj okvira raspoloživih za proces veoma mali, proces se može izvršavati ali su veoma česte page fault greške. Pojava čestog zamjenjivanja stranica, koja nastaje kao posljedica visokog stepena multiprogramiranja, naziva se efekat zasićenja (engl. thrashing). To značajno pogoršava performanse sistema. Stepen iskorištenosti procesora raste s povećanjem broja procesa do kritične tačke u kojoj počne naglo da opada zbog učestalih swap-in i swap-out operacija. Zasićenje se može spriječiti smanjenjem stepena multiprogramiranja. Čak i sa najboljim algoritmom zamjene stranica može se desiti da sistem proizvodi mnogo grešaka stranice. Simptom ove situacije je da PFF algoritam (page fault frequency algoritam za nadgledanje) koji govori da više procesa imaju malo memorije a ni jedan previše. Rješenje je izbaciti neke procese na disk i osloboditi sve njihove stranice. Takođe treba ponovo razmotriti nivo multiprogramiranja Veličina stranice Postoje faktori koji govore u prilog maloj veličini stranica. Prednosti male veličine stranice (npr 256 bajta) su manje unutrašnje fragmentacije, bolje se uklapaju u različite strukture podataka, a ima manje nekorištenih programa u memoriji. Nedostaci male veličine stranice je što programima treba puno stranica, a to dovodi do velike tabele stranica. Koja je optimalna veličina stranice?

169 7.29.Dijeljene stranice 169 Neka je prosječna veličina procesa s bajta, stranice p bajta, a svaki unos u tabelu stranica s s e e bajta. Svaki proces pokriva onda u prosjeku stranica i time bajta u tabeli. Na internu p p fragmentaciju se gubi još 2 p bajta, tako da imamo ukupno na fragmentaciju i tabelu s e p overhead = +. Prvi dio je velik kad je stranica mala, drugi je velik kad je stranica velika, p 2 optimalno rješenje mora biti neki kompromis. Uzimajući prvi izvod po p i izjednačavanjem sa 0 dobivamo optimalnu veličinu stranice kad je p = 2 s e Dijeljene stranice Još jedna značajna tačka kod sistema straničenja su dijeljene stranice. U sistemu sa više korisnika često se dešava da više korisnika koriste jedan program. Očigledno je efikasnije stranice zajednički koristiti nego istovremeno imati više kopija iste stranice u memoriji. Problem pri tome je da sve stranice ne mogu istovremeno biti korištene. Stranice koje se samo čitaju (tekst programa) mogu biti korištene zajedno, one koje sadrže podatke ne mogu. Kada se koristi straničenje na jednom nivou, svaki proces ima pokazivač na svoju tablicu stranica, a svaki element ove tablice pokazuje na pojedinačni fizički okvir u memoriji. Tako mogu dva različita pokazivača iz tablica procesa pokazivati na one fizičke okviri koji imaju sadržaj zajednički za dva odvojena procesa. PCB procesa B PCB procesa A Tabela stranica procesa B Tabela stranica procesa A Slika 101 Dijeljena memorija Straničenje na dva nivoa omogućava da ne samo neki fizički okviri budu zajednički za dva procesa, nego i neki dijelovi tabele stranica. Neka je npr. 10 bita definisano za redni broj tabele stranica u imeniku stranica, 10 bita za redni broj stranice, a 12 bita virtualne adrese za poziciju u stranici. Ako se definiše da je memorijsko područje između 0 i 4 megabajta virtualne adrese samo za čitanje, nulti element imenika stranica svih procesa koji dijele isti programski kod mogu pokazivati na istu tabelu stranica na nižem nivou.

170 Memorijski mapirane datoteke 7.30.Memorijski mapirane datoteke Pošto virtualna memorija svakako sprema povremeno stranice u neku datoteku, malim izmjenama se može postići da se sadržaj te stranice smiješta u datoteku koju odabere korisnik. Na ovaj način se pristup podacima datoteke umjesto poziva za čitanje i pisanje dalje obavlja prostim upisom na memorijsku lokaciju. Ovo može znatno povećati brzinu nekih ulazno/izlaznih operacija. Ako dva procesa dijele istu datoteku, ovaj mehanizam se može koristiti za komunikaciju procesa preko dijeljene memorije. Mnogi programeri osjećaju da je pristup datotekama nepogodan, posebno kada se poredi sa pristupom memoriji. Iz ovih razloga, neki operativni sistemi, počevši od Multics-a, obezbjedili su način da se datoteke mapiraju u adresni prostor izvršnog procesa. Za ove svrhe postoje dva sistemska program kojim se datoteka mapira i mapiranje uklanja, mmap i unmap. Na primjer, pretpostavimo da je datoteka f velika 64 KB i mapirana je u virtualni adresni prostor počevši od 512 K. Kada bilo koja mašinska instrukcija čita sadržaj memorijske adrese na 512 K, tada ona dohvata bajt 0 datoteke. Slično, pisanje na adresu 512K modifikuje bajt datoteke. Kada proces završi izvođenje, modifikovana datoteka će ostati na disku kao da su promjene izvršene sistemskim pozivima seek i write. Interne sistemske tabele su promijenjene tako da datoteka postane rezervna memorija za region 512K do 576K. Dakle, čitanje sa 512 K uzrokuje grešku stranice dovodeći u stranicu 0 datoteke sadržaj. Slično, pisanje 512 K uzrokuje grešku stranice, dovodeći u stranicu koja sadrži tu adresu poslije čega se može obaviti pisanje. Ako se stranica ikada izbaci zbog algoritama zamjena stranica, on se zapisuje ponovno na odgovarajuće mjesto u datoteku. Kada proces završi izvođenje, svi mapirane, modifikovane stranice se pišu nazad u njihove odgovarajuće datoteke. U tom trenutku, proces može kopirati izvorni segment u odredišni segment koristeći običnu petlju za kopiranje. Nisu potrebni sistemski pozivi read i write. Kada se kopiranje završi, izvrši se sistemski poziv unmap, da bi se uklonile datoteke iz adresnog prostora i onda završi proces. Izlazna datoteka, xyz, će sada postojati kao da je bila kreirana na uobičajen način. Mada mapiranje datoteka eliminira potrebe za U/I i na taj način čini programiranje lakšim, ono uvodi nove probleme. Prvo, teško je da sistem zna tačno dužinu izlazne datoteke, xyz, u našem primjeru. On može reći broj najviše pisane stranice ali ne može da zna koliko ima bajta u stranici. Pretpostavimo da program koristi samo stranicu 0, i poslije izvršavanja se nalazi još na stranici 0. Možda datoteka xyz sadrži 10 nula, a možda ta datoteka ima 100 nula a možda i Ko zna? Operativni sistem ne može da zna. Sve što može da uradi je da kreira datoteku čije je dužina jednaka veličini stranice, u ovom primjeru. Bolja situacije je kod sistema koji podržavaju segmentaciju. U takvom sistemu, svaka datoteka se može mapirati u svoje sopstvene segmente tako da bajt k u datoteci predstavlja i bajt k u segmentu. Drugi problem može se desiti ako je datoteka mapirana od strane jednog procesa a otvorena za čitanje od drugog procesa. Ako prvi proces modifikuje stranicu, ova promjena se neće vidjeti na datoteci sve dok stranica ne bude zapisana. Sistem treba da preuzme veliku brigu da dva procesa ne vide nekonzistentnu verziju datoteke. Treći problem kod mapiranja datoteka je da datoteka može biti veća od segmenta, ili čak veća i od virtualnog adresnog prostora. Jedini način je da se uredi sistemski poziv mmap da može da mapira dio datoteke umjesto cijele datoteke. Mada ovo funkcioniše, predstavlja ograničenje u odnosu na mapiranje cijele datoteke.

171 7.31.Pozadinski program za brisanje stranica Pozadinski program za brisanje stranica Performanse straničenja se poboljšavaju ako uvijek ima dovoljno slobodnih stranica. Umjesto da se rjeđe korištena stranica izbaci tek kada dođe zahtjev za alokacijom memorije, može se koristiti pozadinski program koji određuje koje stranice izbaciti, i ranije, a ne kada procesu zatreba stranica. Taj program je uglavnom neaktivan, a onda izbaci stranice kada broj slobodnih stranica padne ispod nekog praga Windows API za upravljanje stranicama i dijeljenom memorijom Sljedećim funkcijama se može podešavati pristup memorijskim stranicama koristeći Windows. GetProcessWorkingSetSize(hProcess,lpMinimumWorkingSetSize,lpMaximumWorkingS etsize) Dobavlja veličinu radnog skupa u stranicama SetProcessWorkingSetSize(hProcess,dwMinimumWorkingSetSize,dwMaximumWorkin gsetsize) Postavlja veličinu radnog skupa u stranicama VirtualLock (lpaddress,dwsize) VirtualUnlock(lpAddress,dwSize) Fiksira virtualnu stranicu u memoriju ili je oslobađa VirtualProtect(lpAddress,dwSize,flNewProtect,lpflOldProtect) Mijenja prava čitanja, pisanja, izvršavanja nad stranicom CreateFileMapping(hFile,lpAttributes,flProtect,dwMaximumSizeHigh, dwmaximumsizelow, lpname) Priprema preslikavanje datoteke u RAM MapViewOfFileEx(hFileMappingObject,dwDesiredAccess,dwFileOffsetHigh,dwFileOff setlow,dwnumberofbytestomap) Privi dijeljenu stranicu koristeći preslikavanje datoteke u RAM 7.33.Posix API za upravljanje stranicama i dijeljenom memorijom Sljedećim funkcijama se može podešavati pristup memorijskim stranicama koristeći Posix kompatibilne operativne sisteme mprotect(paddr, ilen, iprot) Postavlja prava nad dijelom memorije mlock(paddr, ilen) munlock(paddr, ilen) Zaključava/otključava dio virtualnog prostora procesa mlockall(iflags) munlockall() Zaključava/otključava cijeli virtualni prostor procesa mincore(paddr, ilength, pvec) Informiše da li je taj dio adresnog prostora u RAM-u madvise(paddr, ilength, iadvice) Predlaže jezgru kako da mapira stranice procesa 7.34.Poređenje straničenja i segmentacije Straničenje i segmentacija su slični, ali imaju i međusobnih razlika. Najveća je da aplikativni programer nije svjestan straničenja. On piše programe kao da je memorija linearna, a operativni sistem i procesor brinu o njenoj podjeli i pretvaranju u virtualne adrese. Programer na sistemima s segmentacijom međutim, u svojim programima navodi dva dijela adrese, segment i stranicu. Sve stranice su iste veličine, a segmenti su različite. Segmentacija ima više

172 Segmentacija sa straničenjem linearnih adresnih prostora, a straničenje samo jedan. Segmenti omogućavaju logičku podjelu i zaštitu dijelova aplikacije, a stranice ne Segmentacija sa straničenjem I straničenje i segmentacija imaju svoje prednosti Straničenje, što je transparentno za programera, eliminira vanjske fragmentacije i na taj način osigurava efikasno korištenje glavne memorije. Komadi koji su preselili u i izvan glavne memorije su fiksne jednake veličine, moguće je razviti sofisticirane algoritme upravljanja memorijom koji iskorištavaju ponašanje programa. Segmentacija je vidljiva za programera i ima sposobnost da upravlja rastom strukture podataka, modularnost, i podrška za razmjenu i zaštitu. Za kombiniranje prednosti oba pristupa, neki sistemi su opremljeni hardverom procesora i operativnim sistemom. Segment Strana Pomak Tabela segmenta Tabela stranica za dati segment + Fizička adresa Slika 102 Segmentacija sa straničenjem U kombinovanom sistemu straničenje/segmentacija, korisnički adresni prostora je razbijen u niz segmenata po nahođenju programera (Slika 102). Svaki segment je dalje razbijen u niz stranica fiksne veličine koje su jednaki dužini okvira glavne memorije. Ako je segment manji od dužine stranice, segment zauzima samo jednu stranicu. Sa programerove tačke gledišta, logička adresa se još uvijek sastoji od niza segment i offset. Sa sistemske tačke gledišta, adresa se dobija iz segmenta, broja stranice i pozicije unutar stranice. Pristup je korišten u Multics, OS/2 i Windows 95 kada izvodi 16 bitne aplikacije i386 memorijska arhitektura Intelovi procesori su se razvijali evolutivno, nastojeći da nove generacije čuvaju kompatibilnost s prethodnim, s obzirom na ogromnu bazu softvera. Kroz tu evoluciju, došlo se do procesora koji je omogućio takav MMU da postaje moguće realizovati operativne sisteme po želji koji koriste linearnu jednoprocesnu memoriju, memoriju organizovanu po segmentima bez zaštite, memoriju organizovanu po segmentima sa zaštitom, memoriju sa razdvojenim adresnim prostorom za program i podatke, straničenje na dva nivoa, razdvojene prostore za program i podatke sa straničenjem, segmentaciju s straničenjem, sve prostom promjenom nekoliko registara i popunjavanjem tabela. Princip je toliko dobar da se vrlo malo kasnije mijenjao, iako je prošlo oko 30 godina. Srce virtualne memorije sadrži se od dvije tabele, LDT (Local Descriptor Table) i GDT (Global Descriptor Table). Svaki program ima svoju vlastitu LDT, doj postoji samo jedna GDT,

173 7.36.i386 memorijska arhitektura 173 koja se dijeli između svih programa na računaru. LDT opisuje segmente koji su lokalni svakom programu, uključujući njegov kod, podatke, stack, itd., dok GDT opisuje sistemske segmente, uključujući sam operativni sistem. Da bi pristupio segmentu, i386 program prvo učita selektor za taj segment u jedan od 6 registara segmenata mašine. Tokom izvršavanja, CS registar drži selektor za kod segment, a DS registar drži selektor za segment podataka. Ostali registri segmenata su manje važni. Svaki selektor je 16-bitni broj, kako je prikazano na slici Slika 103.Jedan od bita u selektoru (DT) govori da li je segment lokalni ili globalni (tj., da li je u LDT ili u GDT). Ostalih 13 bita specificiraju unosni broj LDT-a ili GDT-a, pa su te tabele ograničene na držanje 8K deskriptora segmenta. Preostala 2 bita određuju nivo privilegija između 0 i 3 koji određuje najmanji nivo prava koji aplikacija mora imati da izvrši podprogram iz drugog segmenta ili pristupi njegovim podacima. Deskriptor 0 je zabranjen. On se može upisati u registar segmenata da bi pokazao da registar segmenata trenutno nije dostupan. On izaziva prekid (trap) ako biva korišćen. Redni broj segmenta DT Privilegije Slika 103 Format selektora Kada se selektor učita u registre segmenata, odgovarajući deskriptor se uzima iz LDT ili GDT i pohranjuje u registre mikroprograma, da bi mu se brzo moglo pristupiti. Deskriptor se sastoji od 8 bajtova, uključujući baznu adresu segmenta, veličinu i druge informacije, prikazane na slici Slika 104. Poz Znacenje 0 Bitovi 0-7 limita segmenta 1 Bitovi 8-15 limita segmenta 2 Bitovi 0-7 početka segmenta 3 Bitovi 8-15 početka segmenta 4 Bitovi početka segmenta 5 P DPL Tip deskriptora 6 G X 0 AVL Bitovi 16 do 23 limita segmenta 7 Bitovi početka segmenta Slika 104 Format deskriptora U petom i šestom bajtu značenja bitova su sljedeća P: segment je u memoriji DPL: dva bita za nivo prava pristupa, koji određuju koje aplikacije mogu pristupiti segmentu G granularity bit za mjernu jedinicu limita (0 predstavlja bajt, 1 predstavlja 4 kilobajta) X zavisi od vrste deskriptora. Sa sistemske nema značenja, za izvršne određuje da li je u pitanju 16 bitni (0) ili 32 bitni kod (1), a za one s podacima se koristi samo kod segmenata koji se šire prema nižim adresama i služi za račun gornjeg limita. AVL je namijenjeno za dodatne podatke. Tip deskriptora: ovo polje od 5 bita ima tri različite interpretacije zavisno od vrste deskriptora (Slika 105): Vrsta deskriptora Sistemski 0 Specijalna vrsta Podaci 1 0 E W A

174 i386 memorijska arhitektura Izvršni 1 1 C R A Slika 105 Tipovi deskriptora E predstavlja da li segment raste prema višim (0) ili nižim adresama (1) A je 1 ako je segmentu pristupano W je 1 ako se u segment može pisati R je 1 ako se segment može čitati C je 1 ako skok u ovaj segment ne mijenja trenutni nivo privilegije Ispratimo sada korake po kojima se par (selektor, ofset) konvertuje u fizičku adresu (Slika 106). Čim mikroprogram sazna koji se registri segmenata koriste, on može pronaći čitav deskriptor koji odgovara tom selektoru u njegovim internim registrima. Ako segment ne postoji (selektor 0), ili je trenutno izbačen, dešava se prekid (trap). Selektor Pomak Linearna adresa + Dir Table Pomak LDT Segment 1 Početna adresa Limit Prava i tip Početna adresa Limit Prava i tip Adresa T0 Adresa T1 Adresa T2 T0 Adresa P0 Adresa P1 Adresa P2 LDT Segment 2 LDT Segment 8191 Početna adresa Limit Prava i tip Adresa T1023 T1 Adresa P1023 Adresa P0 Adresa P1 Adresa P2 Adresa P GDT Segment 1 Početna adresa Limit Prava i tip Fizička adresa Slika 106 Transformacija logičke adrese u fizičku na Intelovim procesorima On tada provjerava da li je ofset izvan kraja segmenta, u kom slučaju takođe dolazi do prekida (trap). Logično, trebalo bi jednostavno, postojati 32-bitno polje u deskriptoru koje bi davalo veličinu segmenta, ali dostupno je samo 20 bita, pa se koristi drugačija šema. Ako je polje G-bita (Granularity) 0, Limit polje daje tačnu veličinu segmenta, koja ide do 1MB. Ako je 1, Limit poljedaje veličinu segmenata izraženu u stranicama umjesto u bajtovima. Veličina stranice kod i386 je fiksna i iznosi 4KB, pa su 20 dovoljni za segmente do 2 32 bajtova. Od procesora Pentium Pro, stranice mogu biti i 4MB velike. Format selektora je odabran da bi se olakšalo pronalaženje deskriptora. Prvo se odabire ili LDT ili GDT, na osnovu bita 2 selektora. Tada se selektor kopira u interni scratch registar, i najniža 3 bita se postave na 0. Konačno, adresa ili LDT ili GDT tabele se doda na to, da bi dala direktni pokazivač na deskriptor. Na primjer, selektor 72 upućuje na unos 9 u GDT, koji je lociran na adresi GDT+72. Pretpostavimo da je segment u memoriji i da je ofset u okviru njega, Pentium tada dodaje 32-bitno Base polje u deskriptor ofseta da bi oformio ono što se zove

175 7.37.Zadaci 175 linearna adresa, kako je prikazano na slici. Base polje se dijeli na tri dijela i širi po deskriptoru radi kompatibilnosti sa 286, u kom slučaju je Base samo 24 bita. Odnosno, Base polje omogućava svakom segmentu da počne od proizvoljnog mjesta u okviru 32-bitnog linearnog adresnog prostora. Slika pokazuje konverziju para (selektor, ofset) u linearnu adresu. Ako je straničenje onemogućeno (globalnim registrom kontrole), linearna adresa se interpretira kao fizička i šalje u memoriju za čitanje ili upis. Prema tome, ako je straničenje onemogućeno imamo čistu segmentacionu šemu, gdje je svaka bazna adresa segmenta data u njegovom deskriptoru. Segmentima je dozvoljeno da se preklapaju, slučajno, vjerovatno zbog toga što bi trebalo previše vremena i muke da se provjeri da su svi odvojeni jedan od drugog. Sa druge strane, ako je straničenje omogućeno, linearna adresa se interpretira kao virtualna i mapira u fizičku adresu korištenjem tabela stranica, skoro kao i u prethodnim primjerima. Jedina prava poteškoća je to što sa 32-bitnom virtualnom adresom i 4-KB stranicom, segment može da sadrži 1 milion stranica, pa se koristi dvo-nivoovsko mapiranje, radi smanjenja veličine tabele stranica za male segmente. Svaki program koji se izvršava ima direktorij stranica (page directory) koji ima bitna unosa. Lociran je u adresi, a na njega pokazuje globalni registar. Svaki unos u ovaj direktorij pokazuje na tabelu stranica koja takođe ima bitna unosa. Unosi u tabelu stranica pokazuju na okvire stranica. Ova šema prikazana je na slici. Linearna adresa podijeljena je u tri polja, Dir, Page (stranica) i Offset (ofset). Dir polje se koristi kao indeks u direktoriju stranica da bi se pronašao pokazivač na odgovarajuću tabelu stranica. Page polje se koristi kao indeks u tabeli stranica da bi se pronašla fizička adresa okvira stranice. Konačno, Offset se dodaje na adrese okvira stranice da bi se dobila fizička adresa bajta ili riječi koja je potrebna. Unosi u tabelu stranica su 32-bitni, 20 bitova sadrži broj okvira stranice. Preostali bitovi sadrže pristupne (access) i prljave bitove, koje postavlja hardver, a koje koristi operativni sistem, bitove zaštite i druge korisne bitove. Svaka tabela stranica ima unose za KB okvira stranica, pa jedna tabela stranica koristi 4 megabajta memorije. Segment koji je manji od 4M imati će direktorij stranica sa samo jednim unosom, pokazivač na njegovu jednu jedinu tabelu stranica. Na ovaj način, za male segmente biti će dodatne samo dvije stranice, umjesto milion stranica koje bi bile potrebne u jedno-nivoovskoj tabeli stranica. Da bi se izbjeglo ponavljanje memorijskih referenci, i386 ima mali TLB koji direktno mapira većinu nedavno korištenih Dir-Page kombinacija u fizičke adrese okvira stranica. Samo kada trenutna kombinacija nije prisutna u TLB-u, odvija se mehanizam prikazan na slici, a TLB se ažurira. Sve dok su promašaji TLB-a rijetki, performanse su dobre. Vrijedno je spomenuti da nekim aplikacijama nije potrebno segmentiranje, nego je njihov sadržaj unutar jednog, straničenog adresnog prostora, a takav model je moguć. Svi registri segmenata se mogu postaviti istim selektorom, čiji deskriptor ima Base = 0 i Limit postavljen na maksimum. Ofset instrukcije će tada biti linearna adresa, sa samo jednim korištenim adresnim prostorom u stvari to je normalno straničenje Zadaci Zadatak 1: U sistemu se koristi straničenje s jednim nivoom. Veličina stranice je 2048 bajta. Logička adresa je velika 32 bita. Tabela stranica koja pretvara logičke u fizičke adrese izgleda ovako 0->47, 1->88, 2->36, 3->26, 4->49, 5->61, 6->68, 7->31, 8->10, 9->50

176 Zadaci a) Koja logička adresa odgovara fizičkoj adresi 20645? b) Koja fizička adresa odgovara logičkoj adresi 20337? c) Koliko se u prosjeku izgubi bajta zbog straničenja, ako element tablice zauzima potreban cijeli broj bajtova? Rješenje a) Fizička adresa kada se podijeli s veličinom stranice, dobije se 10 i 165 ostatka. Fizički okvir 10 odgovara logičkoj stranici 8. Stoga, logička adresa je 8x =16549 b) Logička adresa kada se podijeli s veličinom stranice dobije se 9 i 1905 ostatka. Logička stranica 9 odgovara fizičkom okviru 50. Stoga je fizička adresa 50x = c) Pošto je logička adresa velika 32 bita, a stranica 2048 bajta (11 bitna adresa), redni broj fizičkog okvira se može zapisati s 21 bitom. Prvi veći cijeli broj bajta je 3 bajta (24 bita). Posljednja stranica je u prosjeku 50% popunjena, a ova tabela ima 10 elemenata. Stoga se izgubi 10x3+0.5x2048=1054 bajta. Zadatak 2. U sistemu u kome je fizička memorija od 8192 bajtova podijeljena u stranice veličine 2048 bajtova, program je pristupao logičkim adresama 13326, 14388, 9875, 18868, 394, 14968, 6664, 12633, 4668, 6290, 14875, 16714, 1041, 14238, Izračunajte broj grešaka stranice za algoritme a) FIFO b) Second chance c) Optimalni d) LRU Rješenje: a) Nakon dijeljenja logičke adrese s veličinom stranice i uzimanja cijelog dijela količnika, dobija se referentni niz: 6, 7, 4, 9, 0, 7, 3, 6, 2, 3, 7, 8, 0, 6, 6. Fifo algoritam izbacuje stranicu koja je najduže bila u fizičkom okviru. Zahtjevi koji će rezultovati greškom stranice su označeni znakom P u donjem redu P P P P P P P P P P P P Grešaka stranice 12 b)second chance Kod ovog algoritma uz svaku stranicu se evidentira bit upotrebe (*). On se postavlja na 1 pri svakom pristupu stranici. Kada se treba stranica izbaciti, one koje imaju ovaj bit postavljen se neće izbaciti nego će se bit postaviti na 0, a vrijeme dolaska na trenutno vrijeme * 6* 6* 6* 0* 0* 0 0 2* 2* 2* 8* * 7* 7* 7 7* * 7 0* 0* 0* 2.. 4* 4* 4 4 3* 3* 3* 3* 3* * * 6* 6* 6* 6 6 6* 6* P P P P P P P P P P Grešaka stranice 10 c) Optimalni algoritam. Ovdje je kandidat za izbacivanje stranica koja će se najkasnije u budućnosti koristiti.

177 7.37.Zadaci 177 p P P P P P P P P P Grešaka stranice 9 d) LRU. Kandidat za izbacivanje je stranica koja je najranije zadnji put korištena. Grešaka stranice 11 p Zadatak 3: U sistemu se koristi segmentacija s tabelom segmenata Segment Poč. adresa 1A Dužina 04A0 0A50 02E5 2A30 Koju fizičku adresu imaju logičke adrese 1:3A5 i 2:30E? Kako će izgledati tablica nakon kompakcije? Odgovor: 3A5 pripada segmentu 1, pa je ta adresa jednaka ofsetu plus početak tog segmenta, tj A5=23A5. Adresa 30E je van segmenta 2, pa druga adresa izaziva grešku. Nakon kompakcije treba da početne adrese narednog segmenta budu jednake zbiru početne adrese i dužine prethodnog segmenta. Segment Poč. adresa 1A00 1EA0 28f0 2BD5 Dužina 04A0 0A50 02E5 2A30 Zadatak 4: Intelov MMU Sve vrijednosti u ovom zadatku su u heksadekadnom brojnom sistemu. Na Pentiumu u zaštićenom režimu trenutno stanje memorije, gledajući apsolutne adrese je CD 20 FF 9F 00 9A EE FE 1D F0 4F A D FF FF FF CA 20 FF 9F 00 9A E3 FE 1D F2 4F A D FF FA FF A A A E A A A E E A A E

178 Zadaci C E 1D E E A6 01 E8 FF E C AD 0A BA E E C6 06 1F B8 00 6C BE BB C6011D70 C E 1D E E8 C6011D80 A6 01 E8 FF E C AD 0A C6011D BA E E C6 06 1F Neka registri imaju sljedeću vrijednost: LDTR= , GDTR= , CR3= , DS=0014, CS=0034 CR0= Ako instrukcija (npr. MOV AL,[2A64]) pristupa logičkoj adresi 2A64, kojoj fizičkoj adresi ona pristupa? Koja je vrijednost na toj adresi. Rješenje: Prvo pogledamo najniži bit registra CR0. Ako je on jednak 0, radimo u realnom režimu rada i tada bi odgovor bio DS*10+2A64=00002BA4. Ali ovaj bit je 1, što predstavlja zaštićeni režim rada. Prvo je potrebno odrediti linearnu adresu. Kako je riječ o dohvatanju podatka iz memorije, u pitanju je segment podataka, DS. Format selektora segmenta, sa upisanom vrijednošću heksadekadno i binarno izgleda ovako: Redni broj segmenta u tabeli podataka TAB RPL Ovo znači da je u pitanju segment broj 0002 (binarno 10), a iz polja TAB koje ima vrijednost 1 saznajemo koju tablicu deskriptora gledamo. Vrijednost 0 znači GDTR, a 1 znači LDTR. Pošto je u pitanju 1, referentni registar je LDTR a on ima vrijednost LDTR= Svaki element deskriptor tabele zauzima 8 bajtova. Stoga naš deskriptor počinje na adresi LDTR+BrojSegmenta*8= Označimo kosim bajtove koji definišu početak segmenta, podvučenim limit segmenta a podebljano informacije D 04 Iz nibla s vrijednošću 0 saznajemo da je granularity jednak 0 Segment počinje na adresi , dugačak je D0522 bajtova (granularity bit je 0). Iz bajta sa vrijednošću 93 razloženoj binarno saznajemo da je u pitanju segment podataka koji je prisutan u memoriji, a za koga je nivo prava DPL=0, proširuje se prema višim adresama, upisiv je i pristupano mu je nedavno. Bit prisutnosi nam indicira da je ovaj segment valjan. Linearnu adresu dobijamo kao zbir početka segmenta i virtuelne adrese, tj A64=04222D7B P DPL 1 0 E W A Tip deskriptora Pogledajmo sada najviši bit registra CR0. Ako je on 0, linearna adresa je i fizička adresa. Međutim, on je 1, pa imamo daljnju fazu, straničenje. Napišimo linearnu adresu na 32 bita. Grupišimo po 4 bita, pa u tri grupe koje imaju redom 10, 10 i 12 bita, a zatim svaku grupu u heksadekadno.

179 7.37.Zadaci D 7 B D7B Ovo nam kaže da se linearna adresa transformiše u Tabela broj 010 Stranica broj 222 Adresa unutar stranice D7B Registar CR3 ima vrijednost i on pokazuje na imenik stranica. Svaki element ovog imenika se sastoji od 4 bajta sa sljedećim značenjem Poz. Značenje 0 Avail D A 0 0 U/S R/W P 1 Bitovi početka tabele stranica Avail 2 Bitovi početka tabele stranica 3 Bitovi početka tabele stranica Bitovi 0-11 početka tabele stranica su jednaki 0. Bitovi Avail su na raspolaganju programeru, P predstavlja da je stranica prisutna u memoriju, U/S da li je za obične korisnike (0) ili supervizorski rad (1), R/W da li je za čitanje (0) ili za pisanje (1), D ima vrijednost 1 ako je stranica mijenjana, a A ima vrijednost 1 ako je čitana. Kako imamo tabelu broj 010, a svaki element je dug 4 bajta, opis naše tabele stranica je na adresi CR0+BrojTabele*4= Pogledajmo četiri bajta na toj adresi Iz bajta s vrijednošću 23 iz njegovog najnižeg bita saznajemo da je ta tablica prisutna u memoriji. Iz niblova označenih podebljano zaključuje se da tabela stranica počinje na adresi (najniža tri nibla su nule). Na adresu početka tabele stranica ( ) pridodajemo redni broj stranice (222) pomnožen sa 4. i dobijamo da je opis naše stranice na adresi Struktura elementa tabele stranica je jednaka strukturi imenika stranica, osim što adresa početka tabele stranica predstavlja adresu početka stranice E C6 Poz. Značenje 0 Avail D A 0 0 U/S R/W P 1 Bitovi početka stranice Avail 2 Bitovi početka stranice 3 Bitovi početka stranice Stranica počinje na adresi C Iz bajta s vrijednošću E9 saznajemo da je ona prisutna u memoriji. Na ovu vrijednost dodajemo pomak, D7B. Konačno rješenje je Logička adresa 2A64 se transformiše u fizičku adresu C6011D7B. Na toj adresi se nalazi bajt sa vrijednošću 03. Komentar: Ovo je jedan od zadataka koji je ekstremno teško objasniti, ali ako se znaju detalji, posao se svodi na prepisivanje cifara i ponekad sabiranje heksadekadnih brojeva.

180 Klasificiranje uređaja 8.Ulazno-izlazni sistem računara Operativni sistem posjeduje podsistem koji obezbjeđuje komunikaciju sa ulazno-izlaznim uređajima. Uređaji koji se mogu priključiti na računar svrstavaju se prema nekim opštim kriterijima u različite kategorije. Kategorije se formiraju prema sljedećim kriterijima: - namjena uređaja, - smjer prenosa, - brzina prenosa podataka na relaciji računar-uređaj, - jedinična količina prenesenih podataka, - način pristupa podacima, - djeljivost uređaja, - mogućnost upisa. Ulazno-izlazni sistem računara obavlja dvije osnovne funkcije: upravljanje ulaznoizlaznim uređajima i operacijama koje ti uređaji izvršavaju, te obezbjeđivanje što jednostavnijeg interfejsa prema korisniku i ostatku sistema. Podrška za uređaje i grupe srodnih uređaja sadržana je u programima za upravljanje ulazno- izlaznim uređajima tj. drajverima (engl. drivers). Drajveri su jedinstveni interfejs ulazno- izlaznog sistema. Osnovni ciljevi razvoja ulazno-izlaznog sistema su nezavisnost uređaja, nezavisnost koda, efikasnost i uniforman interfejs ka aplikacijama i korisniku. Nezavisnost uređaja sastoji se u sljedećem. Različiti modeli uređaja istog tipa moraju se sa aspekta programa jednako posmatrati. Programi moraju biti nezavisni od konkretne vrste uređaja. Ulazno-izlazni sistem mora preuzeti brigu o poznavanju konkretnog koda i predstavljanju podataka korisniku u standardnom obliku, ne smije se zahtijevati od korisnika da poznaje kod korištenu u konkretnom uređaju. Ulazno-izlazni uređaji su značajno sporiji od radne memorije i procesora tako da se mora obezbijediti njihova efikasnost tj. ne smije se dozvoliti da postanu usko grlo računarskog sistema. Za pojednostavljen rad korisnicima poželjno je omogućiti uniformno rukovanje uređajima. 8.1.Klasificiranje uređaja Prema namjeni uređaji se smještaju u slijedeće opšte kategorije: - uređaji za dugotrajno smiještanje podataka (engl. storage devices), - uređaji za prenos podataka (engl. transmission devices), - uređaji koji obezbjeđuju interfejs ka korisniku (engl. human interface devices). Prema smijeru prenosa uređaje dijelimo na ulazne (npr. miš, skener), izlazne (npr. printer) i ulazno-izlazne (mrežna kartica). Prema jediničnoj količini prenesenih podataka uređaji se dijele na blokovske i znakovne uređaje. Izdvajamo mrežne uređaja kao specijalnu klasu. Ovakva podjela je uslovljena razlikama između ove dvije vrste ulaznih i izlaznih uređaja u pogledu: jedinice pristupa, načina pristupa i upravljanja. Tako je za blokovske uređaje jedinica pristupa blok, a za znakovne uređaje jedinica pristupa je znak. Dalje, dok značajan broj blokovskih uređaja dozvoljava direktan pristup, znakovni uređaji podržavaju samo sekvencijalni pristup. Na kraju, za razliku od blokovskih uređaja, znakovni uređaji dozvoljavaju dinamičko podešavanje njihovih pojedinih funkcionalnih karakteristika, kao što je, na primjer, brzina prenosa znakova od računara i ka

181 8.2.Hardverska struktura U/I sistema 181 računaru. Prethodne razlike utiču na oblikovanje drajvera, zaduženih za upravljanje kontrolerima. Važno je uočiti da klasifikacija uređaja na znakovne i blokovske ne obuhvata sve uređaje. Na primjer, sat ili miš ne spadaju ni u znakovne ni u blokovske uređaje. Zato se drajveri ovakvih uređaja razlikuju od drajvera znakovnih i blokovskih uređaja. Prema metodi pristupa uređaji se dijele na uređaje sa sekvencijalnim pristupom i uređaje sa direktnim ili slučajnim pristupom. Sekvencijalni uređaji prenose podatke fiksnim redosljedom koje određuje sam uređaj dok kod uređaja sa direktnim pristupom redosljed određuje aplikacija. Prema djeljivosti uređaji mogu biti djeljivi i nedjeljivi. Djeljive uređaje može koristiti više procesa istovremeno (npr. diskovi). Nedjeljive uređaje u jednom trenutku koristi samo jedan proces (npr. tastatura). Uređaji se dalje mogu klasificirati prema mogućnosti upisa na one koji služe za čitanje i pisanje, zatim isključivo za čitanje i isključivo za pisanje (npr. grafička kartica). Grubo gledano, prema brzini prijenosa uređaji se mogu klasifikovati na brze i spore. Ali je ovu podjelu teško izvršiti jer se razlikuju od najsporijeg do najbržeg i milijardama puta (Slika 107). Uređaj Brzina prijenosa: Bajta u sekundi Tastatura 10 Miš K modem Paralelni printer 10 5 IDE disk ISA sabirnica 1, PCI sabirnica 5, DDR3 RAM 8, Gb Ethernet 8, Slika 107 Razlike u brzinama uređaja 8.2.Hardverska struktura U/I sistema Vidjeli smo da se računarski sistem sastoji iz tri osnovna funkcionalna bloka: CPU, memorije i ulazno/izlaznog sistema (Input/output (I/O)). U/I dio računara se može rastaviti na dva dijela: - U/I uređaj (periferni uređaj). U/I uređaji imaju dvije komponente: mehaničku komponentu i elektronsku komponentu. Elektronska komponenta je kontroler uređaja i može upravljati sa više uređaja. Zadaci kontrolera na samom uređaju su konverzija serijskog niza bita u blokove bajta, provođenje korekture grešaka, po potrebi i prepisivanje u glavnu memoriju. Svaki kontroler ima jedan ili više registara. Upisom i čitanje vrijednosti ovih registara odvija se komunikacija između procesora i kontrolera. Ako su memorijski i ulaznoizlazni prostor odvojeni, procesor ima posebne instrukcije za pisanje i čitanje podataka sa određene adrese u kontroleru. Ako se ulazno-izlazni prostor može tretirati kao memorija, transferi se obavljaju običnim instrukcijama za rad sa memorijom. Tipično ulazno-izlazni sistem sadrži četiri vrste registara: Kontrolni registar postavljanje režima rada (procesor upisuje), Statusni registar opisuje status komande koja se izvršava (procesor čita),

182 Memorijski mapirani i U/I mapirani uređaji Registar podataka za ulazni režim za čitanje podataka iz ulaznih uređaja (procesor čita podatke), Registar podataka za izlazni režim rada (registar čita iz procesora). - U/I kontroler. Ulazno-izlazni uređaji komuniciraju sa računarskim sistemom putem sabirnica. Iz više razloga nije moguće jednostavno povezati U/I uređaj na sistemsku sabirnicu. Postoji veliki broj različitih tipova uređaja, svaki sa drugim metodom rada, npr. monitori, diskovi, tastature. Nije praktično za CPU da se bavi radom svakog tipa uređaja, posebno što novi uređaj može biti dizajniran nakon što je CPU proizvedena. Brzina prenosa podataka perifernih uređaja je puno sporija u odnosu na brzinu CPU. CPU ne može direktno komunicirati sa takvim uređajima bez usporavanja čitavog sistema. Periferni uređaji često koriste drugu veličinu riječi ili format. Zbog ovoga računarski sistemi moraju koristiti U/I kontrolere, komponente koje su interfejs između CPU i perifernih uređaja. Jedan U/I kontoler ima više funkcija: kontrolisanje periferija i njegova sinhronizacija sa CPU, komunikacija sa CPU kroz sistemsku sabirnicu, komunikacija sa perifernim uređajem kroz U/I interfejs, funkcija bafera, detekcija greške. Jedan U/I modul se sastoji od nekoliko dijelova: konekcija na sistemsku sabirnicu, neka kontrolna logika, bafer za podatke, interfejs prema periferijalu. Možemo razdvojiti dva glavna područja: Strategiju po kojoj U/I kontroleri komuniciraju sa CPU. Interfejs između U/I kontrolera i uređaja povezanog na njega. 8.3.Memorijski mapirani i U/I mapirani uređaji Bilo da sistem koristi programirane ili U/I sa prekidima mora periodično slati instrukcije U/I modulu. Svaki kontroler posjeduje registar koji je tu za komunikaciju sa procesorom. Kroz pisanje u taj registar operativni sistem može davati uređaju instrukcije, kao npr. čitanje i pisanje podataka, da se isključi ili uključi itd. Pored registra većina uređaja posjeduje bafer za podatke koji operativni sistem može čitati i pisati. Postavlja se pitanje kako procesor komunicira sa sa baferom podataka i registrom kontrolera. Postoje dvije alternative. Dvije metode se koriste za implementaciju: memorijski mapirani pristup i U/I mapirani pristup perifernim uređajima. Sa memorijski mapiranim pristupom, CPU vidi U/I kontroler kao običnu lokacija u memoriji, Da bi poslao podatke U/I kontroleru, CPU piše ili čita podatke iz ove lokaciju u memoriji. Ovo će smanjiti dostupan adresni prostor memorije. Na primjer, na računaru Amiga instrukcijom move.b #252,$BFE001 se postavlja audio filter. Instrukcija move.b se koristi i u normalnom pristupu memoriji Sa U/I mapiranim pristupom, čini se da U/I kontroler okupira svoj vlastiti adresni prostor i koriste se specijalne instrukcije za komunikaciju sa njim. Na primjer na PC računarima se izlaz na zvučnik šalje instrukcijom out 42h,al. Ovo daje više adresnog prostora i za memoriju i za U/I, ali će povećati ukupni broj instrukcija. Takođe može smanjiti fleksibilnost sa kojim CPU adresira U/I kontrolere. Mnogi računari koriste hibridnu šemu, jer je neke uređaje praktičnije programirati kada su memorijski mapirani (obično ekran), a neke kada su U/I mapirani (npr. serijski port).

183 8.4.Interfejs između U/I kontrolera i uređaja povezanog na njega 183 Pri projektovanju memorijski mapiranih uređaja mora se paziti na arhitekture s više sabirnica. Slika 108 prikazuje dvije arhitekture: single-bus arhitekturu i arhitekturu jednog modernog PC računara. Kod prve arhitekture sve adrese idu preko jedine sabirnice. Međutim, trend kod personalnih računara je arhitektura prikazana na donjem dijelu, gdje posjedujemo brzu sabirnicu za pristup CPU-a memoriji i više različitih sabirnica za pristup uređajima raznih brzina. Brza sistemska sabirnica je optimizirana na brzinu memorije i nisu pravljeni nikakvi kompromisi za ulazno-izlazne uređaje. Problem kod ovakve arhitekture je da U/I uređaji ne vide adrese na memorijskoj sabirnici i ne mogu na njih reagovati. CPU RAM U/I uređaj Zajednička sabirnica CPU RAM Grafička sabirnica (PCIe, AGP) Brza Sistemska sabirnica Northbridge kontroler Upravlja memorijom PCI express ili AGP Grafička ksrtica IDE SATA USB Ethernet Zvuk Interna sabirnica Southbridge kontroler Upravlja uređajima PCI sabirnica U/I uređaj Multi I/O Spora sabirnica (LPC, ISA) Tastatura Floppy Miš RS232 Printer Slika 108 Sistemi sa jednom i više sabirnica 8.4.Interfejs između U/I kontrolera i uređaja povezanog na njega Interfejs upravlja sinhronizacijom i kontrolom perifernih uređaja. Ovaj proces sinhronizacije poznat je pod nazivom handshaking. Interni bafer U/I kontrolera omogućava kompenzaciju razlika u brzini kojom interfejs može komunicirati sa perifernim i brzini sistemske sabirnice. U/I interfejsi mogu biti podijeljeni u dva tipa. Paralelni interfejsi: U/I kontroler je višežično povezan sa perifernim uređajem, a biti podataka se prenose simultano. Ovakvi tipovi interfejsa se koriste za periferne uređaje velikih brzina kao što su grafičke kartice, kao i stariji štampači i diskovi. Serijski interfejsi: U/I kontroler je jednožično povezan na periferni uređaj, a podaci se prenose bit po bit. Ovo se koristi za sporije periferne uređaje kao što je tastatura ili uređaje koji koriste infrastrukturu vezanu za dvožične vodove (modemi, ADSL). Kako su u novije vrijeme,

184 Programirani U/I porasle brzine kontrolera, serijski interfejsi poput SATA i USB su preuzeli i ulogu tradicionalno paralelnih interfejsa za štampače i diskove, jer su kablovi manji kao i zagrijavanje sistema. 8.5.Programirani U/I Najjednostavnija metoda za upravljanje komunikacijom između CPU i U/I modula je programirani U/I. Korištenjem ove strategije, CPU je odgovorna za svu komunikaciju sa U/I modulom pomoću postojećih instrukcija koje kontrolišu povezani uređaj ili prenos podataka. Na primjer, ako je CPU željela poslati podatke uređaju korištenjem programiranog U/I, prvo šalje instrukciju odgovarajućem U/I uređaju da očekuje podatke. CPU onda mora čekati dok kontroler ne odgovori prije slanja podataka. Ako je modul sporiji od CPU, onda CPU mora čekati dok se transfer ne završi. Ovo može biti veoma neefikasno. Postoji i drugi problem ako CPU mora čitati iz uređaja kao što je tastatura. S vremena na vrijeme, CPU mora dati instrukciju odgovarajućem U/I kontroleru da vidi da li je neka tipka pritisnuta. Ovo je takođe ekstremno neefikasno. S obzirom na to, ova strategija se koristi samo u veoma malim mikroprocesorskim uređajima. Ovakav način pristupa periferijskom uređaju će se ilustrovati sljedećim primjerom. Neka je potrebno implementirati sistemski poziv koji šalje podatke iz korisničkog prostora na štampač. Operativni sistem bi kopirao podatke iz korisničkog prostora u bafer, i gledajući znak po znak provjeravao da li je printer spreman i slao mu znakove. copy_from_user(buffer, p, count); /* p je bafer jezgra */ for (i = 0; i < count; i++) { /* petlja za svaki znak */ while (*printer_status_reg!= READY) ; /* ponovi dok nije spreman */ *printer_data_register = p[i]; /* pošalji jedan znak */ return_to_user(); U slučaju sporih uređaja, procesor ostaje zauzet čekanjem u krajnje dugačkim petljama, iako bi mogao raditi pametnije stvari. Nedostatak ove tehnike se može otkloniti uvođenjem hardverskog mehanizma koji omogućava uređaju da označi procesoru kad je komanda izvršena. Ovaj mehanizam se naziva prekid (engl. Interrupt). 8.6.U/I vođeni prekidima Ova strategija dozvoljava CPU da nastavi sa operacijama dok modul nije spreman da prenese podatke. Kada CPU želi da komunicira sa uređajem, on daje instrukciju odgovarajućem U/I kontroleru i nastavlja sa drugim operacijama. Kada je uređaj spreman, on će prekinuti CPU. CPU može nastaviti prenos podataka kao i u prethodnom slučaju. Ovo otklanja potrebu da CPU kontinualno provjerava ulazne uređaje da vidi ima li spremnih podataka. Kada ulazni uređaj ima podatke, odgovarajući U/I modul može prekinuti CPU da zahtjeva prenos podataka. U/I kontroler šalje signal prekida procesoru preko prekidne linije (engl. interrupt request line, IRQ). Procesor će završiti tekuću instrukciju, poslije čega se prekida sekvencijalno izvršavanje programa, kako bi se obradio prekid. Poslije obrade prekida CPU nastavlja sa izvršavanjem programa. Sekvenca događaja je kako slijedi: 1. U/I kontroler prekida CPU. 2. CPU završava izvršenje tekuće instrukcije. 3. CPU potvrđuje prekid. 4. CPU spašava svoje trenutno stanje

185 8.6.U/I vođeni prekidima CPU preskoči na sekvencu instrukcija koje se bave prekidom. Situacija je malo komplikovana s obzirom da većina računarskih sistema ima više perifernih uređaja povezanih na njega. Ovo znači da računar mora biti u mogućnosti da detektuje koji prekid dolazi od kog uređaja i može nastati problem ako se više prekida desi istovremeno. Odluka se donosi na bazi prioriteta prekida. Neki uređaji će zahtijevati odgovor CPU mnogo brže nego drugi, na primjer prekid diska se mora obraditi brže nego prekid tastature. Mnogi sistemi koriste višestruke prekidne linije. To dozvoljava brzo dodjeljivanje prioriteta, jer svaka linija prekida može imati drugi prioritet. Međutim vjerovatno ćemo imati više uređaja nego linija prekida tako da se mora koristiti neka druga metoda da se otkrije odakle dolazi koji prekid. Većina sistema koristi interapt vektor. Kada CPU potvrdi prekid relevantni uređaj postavlja podatke na sabirnicu (vektor). Vektor identifikuje uređaj koji zahtjeva pažnju i koristi se od strane CPU da se potraži adresa odgovarajuće rutine za obradu tog prekida. Prekidni sistem obično funkcioniše na sljedeći način. Za svaki od uređaja koji mogu postaviti prekidni signal postoji posebna prekidna rutina, koja se nalazi u memoriji. Informacije o adresama svih prekidnih rutina čuvaju se u tabeli prekidnih vektora (engl. interrupt vector table), gdje svaki ulaz sadrži adresu jedne prekidne rutine. Na ovaj način se smanjuje trajanje određivanja uređaja koji je postavio prekidni signal. Tačno se zna koja je klasa uređaja vezana za koju liniju PIC (engl. priority interrupt controlller) prioritetni prekidni kontroler. PIC okida procesor i daje mu informaciju u vidu vektora, tj. pokazivača na ulaz u tabelu prekidnih vektora. Na ovaj način izbjegava se prozivanje uređaja a sve informacije obezbjeđuje PIC. Primjer sa sistemskim pozivom za štampanje niza znakova bi sada izgledao ovako. Program pozivalac bi se blokirao dok se niz ne završi, a svaki put kada je štampač spreman za novi znak, generisao bi se interapt. U rutini za obradu interapta bi se poslao novi znak, a kada je poslan i posljednji, deblokira se korisnički proces. U sistemskom pozivu bi se nalazile naredbe slične ovim copy_from_user(buffer, p, count); enable_interrupts(); i=0; while(*printer_status_reg!= READY) ; *printer_data_register = p[i]; scheduler(); U interapt rutini bi bio sljedeći kod. if(count == 0) { unblock_user(); else { *printer_data_register = p[i]; count = count 1; i = i + 1; acknowledge_interrupt(); return_from_interrupt()

186 DMA (Direct Memory Access) Prekidni sistem primjenjuje prekidne nivoe. Kad naiđe prekid višeg prioriteta, prekida se opsluživanje prekida nižeg prioriteta. 8.7.DMA (Direct Memory Access) Iako su U/I vođeni prekidom efikasniji od programiranih U/I, podaci si u oba slučaja prenose preko CPU. Ovo će biti neefikasno kod prenosa velike količine podataka između perifernih uređaja i memorije. Prenos će biti sporiji nego što je nužno, a CPU će biti zauzeta i neće biti u mogućnosti da obavlja bilo koju drugu akciju dok se izvršava ovaj prenos. Mnogo sistema zbog toga koristi dodatnu strategiju poznatu kao direktan pristup memoriji (engl. direct memory access DMA). DMA koristi dodatni hardver DMA kontroler. DMA kontroler može preuzeti sistemsku sabirnicu i prenijeti podatke između U/I kontrolera i memorije bez miješanja CPU. Kad CPU želi prenijeti podatke, on da instrukcije DMA kontroleru o smijeru prenosa, U/I kontroleru koji je uključen, lokaciji podataka u memoriji i veličini bloka podataka koji se treba prenijeti. Nakon toga može nastaviti rad sa drugim instrukcijama, a DMA će je prekinuti kada se prenos završi. Protokol usaglašavanja između DMA i U/I kontrolera odvija se preko par linija, signalima DMA-request i DMA-acknowledge. Proces mora adresirati kontroler uređaja da bi sa njim razmjenio podatke. Operativni sistem može koristiti direktni pristup memoriji (DMA) kada hardver ima DMA kontroler na raspolaganju. Nekad je ovaj kontroler integrisan u kontroler diska ili u upravljačku jedinicu drugog uređaja, ali ovaj dizajn zahtjeva jedan DMA kontroler po uređaju. Bez obzira gdje je fizički smješten, DMA kontroler ima uvijek nezavisno od CPU pristup sistemskoj sabirnici. CPU i DMA kontroler ne mogu koristiti sistemsku sabirnicu u isto vrijeme tako da mora postojati način dijeljenja sabirnice između njih. Koristi se jedan od slijedeća dva metoda: Burst mode: DMA kontroler prenosi blokove podataka zaustavljanjem CPU za vrijeme transfera. Brzina transfera zavisi od slijedećeg lanca: U/I modul/sabirnica/memorija. Podaci ne prolaze kroz CPU, ali CPU se zaustavlja kod prenosa podataka. Krađa ciklusa - cycle stealing: DMA kontroler prenosi podatke riječ po riječ, korištenjem sabirnice kada je CPU ne koristi. Ovo može malo usporiti CPU ali je prilično efikasno Jednostavan prenos podataka na relaciji disk memorija preko DMA kontrolera se može objasniti kroz četiri koraka: 4. Ptvrdi prijenos i interapt 1.Pošalji adresu, broj i pravac 2. Aktiviraj prijenos 3. Prenosi podatke redom CPU DMA kontroler Disk kontroler Memorija Zajednička sabirnica Slika 109 Postupak rada DMA kontrolera

187 8.8.Ciljevi i funkcije U/I softvera 187 Prvo procesor programira registre DMA kontrolera, da bi on zna šta gdje treba transportovati (korak 1 na slici Slika 109). Uz to se daje komanda kontroleru diska, da pročita podatke u svoju internu memoriju i izvrši provjeru greške. Čim ispravni podaci leže u memoriji kontrolera diska, može početi prenos sa DMA. DMA upravlja prenosom podataka sa jednom instrukcijom za čitanje, preko sabirnice do kontrolera diska (korak 2). Pisanje u memoriju je jedan standardni ciklus sabirnice (korak 3). Čim je pisanje završeno, kontroler diska šalje signal DMA kontroleru (korak 4). DMA kontroler, povećava adresu memorije i smanjuje broj znakova koji se još moraju prenijeti. Sve dok je brojač veći od 0, koraci 2 do 4 se ponavljaju. Kada je brojač 0, DMA kontroler stvara prekid i javlja CPU da je prenos završen. Primjer sistemskog poziva za slanje na štampač, ako se koristi DMA izgleda jednostavnije. DMA radi kao programirani U/I, ali posao prozivanja uređaja obavlja ona sama. Interapt se dešava samo na kraju prijenosa. U sistemskom pozivu se piše nešto poput copy_from_user(buffer, p, count); set_up_dma_controller(); scheduler(); a u interapt rutini acknowledge_interrupt(); unblock_user(); return_from_interrupt(); DMA je obično sporija od procesora. Da li će najbrži pristup biti koristeći programirani ulaz/izlaz, interapt vođeni ili DMA zavisi od slučaja. DMA bi bila u prednosti ako bi interapt pristup generisao veliki broj prekida. 8.8.Ciljevi i funkcije U/I softvera Jedan od ciljeva koje treba postići pri projektovanju operativnog sistema je formiranje uniformnog interfejsa ka aplikacijama i korisniku. Problem uniformnosti se rješava metodama apstrakcije i višeslojnosti softvera u okviru ulazno-izlaznog sistema. Dio jezgra zadužen za rad sa ulazno-izlaznim uređajima koordinira širok spektar usluga: Upravljanje imenima datoteka i uređaja (engl. name space) Kontrola pristupa datotekama i uređajima, Kontrola operacija Dodjela uređaja procesima na korištenje, Raspoređivanje ulazno-izlaznih operacija, Baferovanje, keširanje i spuler, Kontrola statusa uređaja, Konfiguracija i inicijalizacija drajvera.

188 Struktura softvera U/I sistema 8.9.Struktura softvera U/I sistema Srodni uređaji grupišu se u opšte klase uređaja. Svakoj klasi uređaja pristupa se preko standardnog skupa funkcija. Razlike koje postoje među uređajima iste klase sakrivene su u specijalnim modulima jezgra operativnog sistema koji se nazivaju upravljački programi ili drajveri (engl. device drivers). Drajveri postoje za svaki uređaj, ali se korisniku predstavljaju kao jedan univerzalni interfejs. Iznad svih drajvera nalazi se Korisnicki proces U/I sistem u korisničkom prostoru Softver nezavisan od uredaja Drajveri uređaja Obrađivači interapta Hardver Slika 110 Komponente U/I sistema sloj ulazno-izlaznog sistema jezgra koji je praktično nezavisan od hardvera. Takođe, značajan dio ulazno/izlaznih operacija je realizovan i u korisničkom prostoru. Ova slojevita organizacija (Slika 110)olakšava posao projektantima operativnog sistema, a i projektantima uređaja i kontrolera Obrađivači interapta Kada se desi interapt, operativni sistem obično obavi sljedeće aktivnosti. 1. Snimi registre koje hardver već nije snimio 2. Postavi kontekst (prostor u memoriji i stanje registara) za interapt servisnu proceduru 3. Postavi stek za interapt servisnu proceduru 4. Pošalji signal potvrde interapt kontroleru, ako nema centralizovanog interapt kontrolera, ponovo uključi interapte 5. Kopiraj registre s mjesta gdje su snimljeni u tabelu procesa 6. Izvrši interapt servisnu proceduru 7. Odaberi sljedeći proces sa izvršavanje 8. Postavi MMU kontekst za sljedeći proces za izvršenje 9. Učitaj registre novog procesa 10. Pokreni novi proces 8.11.Drajveri Zajedničko svojstvo drajvera je da je svaki od njih namijenjen za upravljanje određenom klasom uređaja. Pri tome, obično, jedan drajver može da opsluži više primjeraka uređaja iste klase. Drajveri se nalaze u tijesnoj saradnji sa kontrolerima ulaznih i izlaznih uređaja i kriju sve detalje i posebnosti funkcionisanja ovih kontrolera. Van drajvera su vidljive samo operacije, kao što su, na primjer, operacije ulaza ili izlaza, koje omogućuju jednoobrazno korištenje ulaznih i izlaznih uređaja. Tipične operacije drajvera blokovskih uređaja su: 1. operacija inicijalizacije (koja se poziva samo u toku pokretanja operativnog sistema) i 2. operacije ulaza i izlaza blokova (koje koristi sloj za upravljanje datotekama). Tipične operacije drajvera znakovnih uređaja su: 1. operacija inicijalizacije (koja se poziva samo u toku pokretanja operativnog sistema), 2. operacije ulaza i izlaza znakova (koje koristi sloj za upravljanje datotekama), kao i 3. upravljačka operacija (koja omogućuje dinamičko podešavanje funkcionalnih karakteristika znakovnih uređaja, na primjer, njihove brzine prenosa znakova). Tabela drajvera nudi standardan način za povezivanje sloja za upravljanje datotekama i sloja za upravljanje ulaznim i izlaznim uređajima, radi vezivanja operacija običnih i specijalnih

189 8.12.Primjer drajvera za Linux 189 datoteka za operacije drajvera ulaznih i izlaznih uređaja. Zahvaljujući ovoj tabeli, moguće je u operativni sistem dodavati (statički i dinamički) nove drajvere. U sklopu opsluživanja kontrolera, drajveri moraju da reaguju i na prekide, koji stižu od kontrolera. Prekidi, na primjer, objavljuju da je završen prenos podataka ka kontroleru, ili od kontrolera. U ovakvom slučaju, obrada prekida obuhvata ili preuzimanje podatka, pristiglih od kontrolera, ili pripremu prenosa novih podataka ka kontroleru. Za ovakve obrade su zaduženi obrađivači prekida drajvera. Za razliku od operacija drajvera, koje se pozivaju iz slojeva iznad sloja za upravljanje ulaznim i izlaznim uređajima (pa zato predstavljaju gornji dio drajvera), obrađivače prekida poziva mehanizam prekida, znači hardver ispod operativnog sistema (pa zato oni predstavljaju donji dio drajvera) Primjer drajvera za Linux Kako drajveri izgledaju jako zavisi od operativnog sistema, pa i konkretne verzije operativnog sistema. Ipak, zajedničko pravilo za sve drajvere je da treba poštovati pravila. Obično postoji određeni predložak koda (najčešće u jezicima C, C++ ili asembler) za tu verziju jezgra, koji se onda prilagođava. Ovdje je dat primjer jednog drajvera za Linux, znakovnog uređaja koji prebacuje proslijeđene podatke na PC zvučnik kao Morzeovu azbuku. Kada je ovaj drajver instaliran, sljedeća naredba bi poslala tekst Zdravo na zvučnik. echo "Zdravo" > /dev/buzzer Prvi dio drajvera predstavljaju uključivanja zaglavlja i varijable korištene u drajveru #include <linux/module.h> #include <linux/version.h> #include <linux/kernel.h> #include <linux/types.h> #include <linux/kdev_t.h> #include <linux/fs.h> #include <linux/device.h> #include <linux/cdev.h> #include <asm/uaccess.h> #include <asm/io.h> #include <linux/timex.h> #include <linux/ioport.h> #define BUF_LEN 30 #define BIT_ARRAY_LEN 30 #define DUZINA 26 static dev_t first; // Broj uredjaja static struct cdev c_dev; // Struktura uredjaja static struct class *cl; // Klasa uredjaja static char Message[BUF_LEN]; // Tekst iz datoteke uredjaja static char *Message_Ptr; // Pomocni pokazivac za kretanje kroz Message static struct timer_list timer1;//tajmer za citanje znak po znak iz niza static struct timer_list timer2;//tajmer za sviranje ili ne duzina tacke

190 Primjer drajvera za Linux int duzina; // Duzina niza int duzina_biti = 0;//Duzina niza u kom su pretvoreni znakovi u morse kod char Biti[BIT_ARRAY_LEN]; //Niz u kom je morse kod npr. A -> int citanje_bita = 0; // Pozicija u kruznom baferu int pisanje_bita = 0; // Ovo oznacava poziciju u nizu na kojoj se pise int pocelo = 0; // Da li se ista upisalo u niz bita static int PERIOD = 1*HZ; // HZ = 1s; Ovo je period prvog tajmera static int PERIOD1 = 0.2*HZ; // Ovo je period drugog tajmera static void skiniznak(void); // Cita i skida po 1 znak iz Messaage niza static void probabeep(int); // Svira ton,prima kao parametar frekvenciju static int kod[] = {21, 1112, 1212, 112, 1, 1211, 122, 1111, 11,2221, 212, 1121, 22, 12, 222, 1221, 2122, 121, 111, 2, 211, 2111, 221, 2112, 2212, 1122; // Slova A-Z, 2 predstavlja crtu, 1 predstavlja tačku static int brojevi[] = {22222, 22221, 22211, 22111, 21111, 11111,11112, 11122, 11222, 12222; // Cifre 0-9 Sljedeća rutina konvertuje ASCII kod u niz vremenskih pauza. void dajkod(char znak, char* niz,int* len) { if(znak == 32) { niz[0] = niz[1] = niz[2] = niz[3] = 0; *len = 4; return; int pom, i=0, j; if(znak >= 65 && znak <= 90) pom = kod[znak - 65]; else if (znak >= 48 && znak <= 57) pom = brojevi[znak - 48]; else { *len = 0; return; while((j = pom % 10)!= 0) { niz[i++] = 1; if (j == 2) { niz[i++] = 1; niz[i++] = 1; niz[i++] = 0; pom /= 10; niz[i++] = 0; niz[i++] = 0; niz[i++] = 0; *len = i; return; U timer rutini se čita iz niza Bit i i ako je pročitana jedinica poziva se funkcija probabeep sa parametrom 500, koja svira ton u trajanju od 0.2 sekunde. Ako je pročitana nula onda se poziva funkcija probabeep sa parametrom 0 koja gasi pcspeaker ako je bio upaljen sa prethodnom jedinicom..

191 8.12.Primjer drajvera za Linux 191 // Funkcija za citanje iz niza Biti i sviranje tonova static void timer2_routine(unsigned long data){ if (citanje_bita == pisanje_bita duzina_biti == 0!pocelo) { mod_timer(&timer2, jiffies + PERIOD1); // Resetovanje tajmera return; if (Biti[citanje_bita] == 1) probabeep(500); else { probabeep(0); if (citanje_bita == BIT_ARRAY_LEN-1) citanje_bita = 0; else citanje_bita++; mod_timer(&timer2, jiffies + PERIOD1); // Resetovanje tajmera U timeru s periodom od 1 s se čita i skida prvi znak sa niza Message. Nakon toga se pretvara u niz nula i jedinica u funkciji dajkod iz morse.h. Taj niz se doda na kraj niza Biti. // Ucitavanje znakova u niz Biti static void timer1_routine(unsigned long data) { // Ako je niz Message prazan nema znakova za citanje if (duzina == 0) { mod_timer(&timer1, jiffies + PERIOD); // restarting timer return; char c = Message[0]; // Prazan niz koji popunjavam u funkciji dajkod iz morse.h int len; char niz[bit_array_len]; dajkod(c, niz, &len); int i = 0; // Zabrana pisanja preko bita koji jos nisu procitani if ((pisanje_bita < citanje_bita && pisanje_bita + len >= citanje_bita) (pisanje_bita > citanje_bita && ((pisanje_bita + len) % BIT_ARRAY_LEN >= citanje_bita) && (pisanje_bita + len >=BIT_ARRAY_LEN))) { mod_timer(&timer1, jiffies + PERIOD); // restarting timer return;

192 Primjer drajvera za Linux // niz prekopiram u Biti for (i = 0; i < len; i++) { Biti[pisanje_bita++] = niz[i]; duzina_biti++; if (pisanje_bita == BIT_ARRAY_LEN) { pisanje_bita = 0; // Uklanjam prvi znak iz niza Message skiniznak(); // Ovo sluzi da znam da li je ista upisano u niz Biti if (!pocelo) { pocelo = 1; // Restartovanje tajmera mod_timer(&timer1, jiffies + PERIOD); Skidanje prvog znaka iz niza Message i pomjeranje svih ostallih clanova lijevo za jedno mjesto obavlja se sljedećom funkcijom static void skiniznak(void) { int pom; for (pom = 1; pom < duzina; pom++) { Message[pom-1] = Message[pom]; duzina--; Message[duzina] = 0; PC speaker je jedan od najjednostavnijih periferijskih uređaja na IBM PC kompatibilnim računarima. Slanjem vrijednosti 0xB6 na port 0x43 kaže se timer čipu da pripremi postavljanje frekvencije oscilatora povezanog na zvučnik. Zatim se na port 0x42 pošalju niži i viši bajt vrijednosti Hz/f, gdje je f frekvencija tona. Postavljanjem trećeg bita porta 0x61 se uključuje zvučnik. // Funkcija za pristup pcspeakeru static void probabeep(int value) { long count = 0; if (value > 20 && value < 32767) count = PIT_TICK_RATE / value; if (count) { outb(0xb6, 0x43); outb(count & 0xff, 0x42); outb((count >> 8) & 0xff, 0x42); outb(inb(0x61) 3, 0x61); else { outb(inb(0x61) & 0xFC, 0x61); Naredne dvije funkcije se pozivaju kada se uređaj otvara ili zatvara. Često se koriste brojači referenci koji omogućavaju višestruko otvaranje istog uređaja.

193 8.12.Primjer drajvera za Linux 193 // Funkcija koja se poziva prilikom otvaranja datoteke uredjaja static int my_open(struct inode *i, struct file *f) { Message_Ptr = Message; return 0; // Funkcija koja se poziva prilikom zatvaranja datoteke uredjaja static int my_close(struct inode *i, struct file *f) { printk(kern_info "Driver: close()\n"); return 0; Kada dođe zahtjev za čitanjem ili pisanjem periferijskom uređaju, sada će operativni sistem pozvati odgovarajuće funkcije koje komuniciraju s baferom u korisničkom prostoru i prebaciti u bafer u jezgru. // Poziva se kod pisanja u datoteke uredjaja; Vraca broj upisanih bajta static ssize_t my_write(struct file *f, const char user *buffer, size_t length, loff_t *off) { int i; for(i=0; i<length && i<buf_len; i++) { get_user(message[i], buffer+i); duzina++; Message_Ptr = Message; return i; // Funkcija koja se poziva prilikom citanja iz datoteke uredjaja; Vraca broj procitanih bajta static ssize_t my_read(struct file *f, char user *buffer, size_t length, loff_t *off) { printk(kern_info "Driver: read()\n"); int procitano = 0; // Kada dodjemo na kraj niza vrati nulu if (*Message_Ptr == 0) return 0; // Stavljanje podataka u buffer while (length && *Message_Ptr) { put_user(*(message_ptr++), buffer++); length--; procitano++; return procitano; U operativnim sistemima sličnim Unix, drajveri se registruju pripremom strukture koja sadrži pointere na funkcije koje obavljaju aktivnosti drajvera. Za drajvere znakovnih uređaja to su funkcije read, write, open, ioctl itd. Kada dođe do trenutka da se šalje podatak periferijskom uređaju, ili prima od njega, pozvaće se neka od ovih funkcija.

194 Primjer drajvera za Linux // Povezivanje nasih funkcija za rad sa datotekom uredjaja static struct file_operations buz_fops = {.owner = THIS_MODULE,.open = my_open,.release = my_close,.read = my_read,.write = my_write ; Funkcija za inicijalizaciju uređaja se poziva kada se uključuje modul koristeći insmod naredbu ili kada se pokreće sistem ako je drajver statički uvezan. U okviru nje se poziva funkcija jezgra za registraciju drajvera, čiji je parametar opisana struktura. Linux određuje kojem drajveru će poslati zahtjev prepoznajući glavni i sporedni broj uređaja koji su navedeni u pseudo datoteci u dev direktoriju. U inicijalizaciji se uključe i tajmeri i drugi asinhroni dijelovi drajvera. // Konstruktor drajvera static int init buzzer_init(void) { int ret; struct device *dev_ret; printk(kern_info "Buzzer registrovan!"); duzina = 0; // Registracija glavnog i manjeg broja uredjaja if ((ret = alloc_chrdev_region(&first, 0, 1, "Buzzer")) < 0) { return ret; // Kreiranje klase uredjaja u nasem slucaju karakternog if (IS_ERR(cl = class_create(this_module, "chardrv"))) { unregister_chrdev_region(first, 1); return PTR_ERR(cl); // Kreiranje uredjaja i provjera uspjesnosti kreiranja if (IS_ERR(dev_ret = device_create(cl, NULL, first, NULL,"buzzer"))) { class_destroy(cl); unregister_chrdev_region(first, 1); return PTR_ERR(dev_ret); // Inicijalizacija karakternog uredjaja cdev_init(&c_dev, &buz_fops); if ((ret = cdev_add(&c_dev, first, 1)) < 0) { device_destroy(cl, first); class_destroy(cl); unregister_chrdev_region(first, 1); return ret;

195 8.13.Funkcije dijela U/I softvera nezavisnog od uređaja 195 // Postavljanje tajmera init_timer(&timer1); timer1.function = timer1_routine; timer1.data = 1; timer1.expires = jiffies + PERIOD; add_timer(&timer1); init_timer(&timer2); timer2.function = timer2_routine; timer2.data = 1; timer2.expires = jiffies + PERIOD1; add_timer(&timer2); return 0; Slično ovome, postoji i funkcija koja se poziva prilikom izbacivanja drajvera iz memorije. // Destruktor drajvera static void exit buzzer_exit(void) { cdev_del(&c_dev); device_destroy(cl, first); class_destroy(cl); unregister_chrdev_region(first, 1); del_timer_sync(&timer1); // Brisanje tajmera del_timer_sync(&timer2); // Brisanje tajmera probabeep(0); // Gasenje buzzera ako je ostao upaljen printk(kern_info "Uklanjanje buzzera!"); module_init(buzzer_init); module_exit(buzzer_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Mirhat Babic <mbabic1@etf.unsa.ba>"); MODULE_DESCRIPTION("Drajver za pcspeaker"); 8.13.Funkcije dijela U/I softvera nezavisnog od uređaja Tipični zadaci koje obavlja sloj U/I softver nezavisan od uređaja su 1. Postizanje uniformnog interfejsa za drajvere uređaja 2. Raspoređivaje U/I operacija 3. Baferovanje i keširanje 4. Prijava greške 5. Zauzimanje i oslobađanje dodijeljenog uređaja 8.14.Raspoređivanje ulazno-izlaznih operacija Raspoređivanje ulazno-izlaznih operacija (engl. I/O scheduling) podrazumjeva obezbjeđivanje dobrog poretka izvršavanja ulazno-izlaznih operacija. Raspoređivanje operacija se zasniva na redu čekanja koji se definiše za svaki uređaj ponaosob, a na osnovu nekog kriterijuma.

196 Baferovanje 8.15.Baferovanje Baferovanje je dio memorije a funkcioniše na principu proizvođač-potrošač i služi za čuvanje privremenih podataka prilikom prenosa podataka između dva uređaja ili između uređaja i aplikacije Razlozi za baferovanje (engl. buffering) su slijedeći: usklađivanje različitih brzina između potrošača i proizvođača, prilagođavanje različitih veličina transfera podataka, sprečavanje izmjene podataka tokom slanja. Za objašnjenje zašto se koristi baferovanje posmatrajmo jedan proces koji želi čitati podatke iz modema. Smiještanje podataka na njihovom putu do korisničkog prostora se može uraditi na četiri načina (Slika 111). (a) Prva mogućnost je da korisnički proces izvodi sistemski poziv read, onda se blokira i čeka dok dođe sljedeći znak. Rutina prekida daje znak dalje korisničkom programu i budi ga. Ovaj znak se obrađuje i čita se novi. Mana pristupa je u čestom prebacivanju iz korisničkog režima u režim jezgra. Korisnički proces je većinu vremena blokiran. (b) Neka korisnički proces stavlja na raspolaganje bafer. Rutina piše znakove u bafer dok se on ne napuni. I ovdje imamo dosta prebacivanja između režima rada. (c) Efikasniji pristup je stavljanje bafera u kernel. Kad je on pun, slijedi kopiranje u korisnički prostor. No, za vrijeme tog kopiranja mora se zaustaviti prijem novih znakova. (d) Najbolje performanse se postižu sa dva bafera u jezgru. Kada je jedan pun prelazi se na drugi. Za to vrijeme se prvi prebacuje u korisnički prostor i kopira. Korisnički proces Korisnički proces Korisnički proces Korisnički proces Obrađeni podatak Bafer Bafer Bafer Ulazni podaci Jezgro Drajver Jezgro Drajver a) b) Jezgro Dvostruki bafer koristi dva sistemska bafera umjesto jedan (Slika 112). Proces može prenijeti podatke u ili iz jednog bafera dok operativni sistem prazni ili puni drugi bafer. Ako je periferijski uređaj brz, može biti potrebno i više bafera. Kod cirkularnog bafera se koristi više od dva bafera. Svaki samostalni bafer je jedna jedinica u cirkularnom baferu. Bafer Drajver Slika 111 Komunikacija bez bafera, s baferima i dvostrukim baferima Jezgro Bafer Bafer Drajver c) d)

197 8.16.Keširanje 197 Korisnički proces Bafer Korisnički proces Bafer Jezgro Jezgro Bafer Bafer Dvostriki bafer Bafer Bafer Bafer Bafer Cirkularni bafer Slika 112 Dvostruki i cirkularni bafer 8.16.Keširanje Keš (engl. cache) predstavlja oblast brze sistemske memorije koja čuva kopiju podataka, najčešće sa diska. Pristup podacima u kešu znatno je brži od pristupa podacima na ulazno izlaznim uređajima. Keširanje je tehnika kopiranje dijelova u keš memoriju čime se značajno poboljšavaju performanse U/I sistema. Bafer sadrži trenutno aktuelne podatke a keš čuva bilo koju kopiju sa diska U/I sistem u korisničkom prostoru I u korisničkom prostoru se obavlja dio U/I operacija. Najvažnije su sistemske biblioteke za U/I, koje omogućavaju korisničkom procesu da pošalje zahtjeve periferijskom uređaju, poput rutina za pisanje datoteke ili grafički korisnički interfejs. Druga kategorija su pozadinski procesi kao što je onaj koji održava spuler za štampač. Spuler je bafer koji privremeno čuva podatke namijenjene nekom nedjeljivom uređaju. On omogućava istovremeni pristup nedjeljivim uređajima tako što proces upisuje podatke namijenjene uređaju na disku, a operativni sistem upravlja spulerom tako što opslužuje jedan po jedan zahtjev. Korištenjem spulera, proces može brzo postaviti zahtjev u bafer, a nakon toga nastaviti sa drugim aktivnostima. Ovo omogućava da se nedjeljivi uređaji koriste kao prividno djeljivi Windows API za pristup periferijskim uređajima Ako je potrebno iz Windows programa poslati podatak periferijskom uređaju poput serijskog porta, koriste se funkcije normalno namijenjene za rad s datotekama. U nekim slučajevima se može uređaju poslati i kontrolni kod. CreateFile(lpFileName, dwdesiredaccess,dwsharemode, lpsecurityattributes, dwcreationdisposition, dwflagsandattributes, htemplatefile) Otvara U/I uređaj ili datoteku WriteFile(hFile, lpbuffer, nnumberofbytestowrite, lpnumberofbyteswritten, lpoverlapped) Piše podatke na U/I uređaj ili datoteku ReadFile(hFile, lpbuffer, nnumberofbytestoread, lpnumberofbytesread, lpoverlapped) Čita podatke s U/I uređaja ili datoteke DeviceIoControl( hdevice, dwiocontrolcode, lpinbuffer,ninbuffersize, lpoutbuffer, noutbuffersize, lpbytesreturned, lpoverlapped) Šalje kontrolni kod direktno drajveru periferijskog uređaja

198 Posix API za pristup periferijskim uređajima SetCommTimeouts(hFile, lpcommtimeouts) Postavlja vremena isteka komunikacije 8.19.Posix API za pristup periferijskim uređajima open(lpathname,iflags, imode) Otvara periferijski uređaj read(ifd, pbuf, icount) write(ifd, pbuf, icount) Čita ili piše na periferijski uređaj ioctl(ifd,irequest pbuf) Šalje kod drajveru uređaja 8.20.Drajver sata U nadležnosti sloja za upravljanje kontrolerima se nalazi i praćenje protoka vremena. Praćenje protoka vremena se zasniva na brojanju periodičnih prekida (clock), koje u pravilnim vremenskim intervalima generiše sat (kristalni oscilator sa pravilnom frekvencijom i brojačem, koji se umanjuje u svakoj oscilaciji, a čije anuliranje izaziva prekid), Slika 113. Brojač Postavljanje vrijednosti Ulaz iz Kristala dekrementer Slika 113 Princip radar sata Obrađivač prekida sata broji prekide sata, a njihov zbir predstavlja sistemsko vrijeme (lokalno vrijeme u računaru). Ovaj obrađivač prekida predstavlja donji dio drajvera sata. Gornji dio ovog drajvera predstavljaju sistemske operacije za preuzimanje ili izmjenu sistemskog vremena i za uspavljivanje procesa (odnosno, za odlaganje njegove aktivnosti, dok ne istekne zadani vremenski interval). Sistemsko vrijeme se može predstaviti kao broj prekida sata ili kao broj sekundi i broj prekida sata u tekućoj sekundi (druga predstava zahtjeva manje prostora). Sistemsko vrijeme može da se računa u odnosu na neki nepromjenljivi trenutak u prošlosti, ili u odnosu na trenutak posljednjeg pokretanja operativnog sistema. Procesorsko vrijeme troši i obrađivač prekida sata, jer se u njegovoj nadležnosti nalazi više poslova, kao sto su: održavanje sistemskog vremena, praćenje isticanja kvantuma aktivnog procesa, praćenje ukupnog korištenja procesorskog vremena aktivnog procesa, provjera da li je nastupilo vrijeme buđenja uspavanog procesa (čija aktivnost se nastavlja tek kada istekne zadani vremenski interval), sakupljanje statistika o aktivnosti procesa (koje se svodi na registrovanje sadržaja programskog brojača, radi otkrivanja učestanosti izvršavanja pojedinih dijelova programa). Pored sistemskog sata, mnogi sistemi imaju još jedan koga postavljaju aplikativni programi. Primjeri takvih tajmera su spominjani u poglavlju o signalima. Ako je frekvencija interapta koju program postavi prevelika, dodatna potrošnja usljed obrade interapta zahtijeva više posla od programiranog U/I. Jedno od rješenja ovog problema su meki tajmeri. Kod ovih tajmera, ne okida se interapt i skok u jezgro u tačnim intervalima. Umjesto toga, kad je sistem već u jezgru zbog nekog drugog razloga (greške stranice, sistemski pozivi, drugi U/I događaji), prije povratka u korisnički režim rada provjeri se je li meki tajmer istekao i tada pokreće događaj.

199 8.21.Upravljanje napajanjem Upravljanje napajanjem Autonomni računari kao što su laptopi i tableti treba da brinu o potrošnji energije, s obzirom na ograničeni kapacitet baterija. Neki načini uštede energije su: Gašenje ekrana, kada nije bilo aktivnosti za određen broj minuta. Zaustavljanje motora hard diskova nakon perioda neaktivnosti Softversko prebacivanje procesora u režim spavanje, smanjujući potrošnju energije skoro na nulu. Potvrđivanje memorijskog keša, nakon čega slijedi njegovo isključenje. Podaci se uvijek mogu prebaciti iz glavne memorije bez gubitka informacija Drastičnija opcija je upisati sadržaj glavne memorije na disk, a zatim isključiti samu glavnu memoriju. Ovaj pristup se zove hibernacija. Kada je memorija isključena, CPU ili se mora isključiti ili izvršavati program iz ROM-a. Ako je procesor isključen, treba se desiti prekid da ga dovede na kod u ROM, tako da se memorija može učitati prije upotrebe. Ako je radio prijemnik uvijek uključen kako bi osluškivao za dolaznu e-pošte, baterija se može isprazniti vrlo brzo. S druge strane, ako je radio isključen nakon, recimo, 1 minutu u stanju mirovanja, dolazne poruke mogu biti izgubljene, što je nepoželjno. Jedno efikasno rješenje za ovaj problem je da mobilni računar pošalje poruku baznoj stanici kada želi da isključi radio. Od tog vremena, bazna stanica baferuje dolazne poruke na disku. Kad mobilni računar opet uključi radio, on pozove baznu stanicu koja mu pošalje akumulirane poruke. Nešto drugačije, ali ipak pitanje u vezi energije, je upravljanje toplotom. Moderni procesori mogu biti izuzetno vrući zbog svoje velike brzine. Desktop računari obično imaju interni ventilator koji puše vruć zrak iz kućišta. Budući da smanjenje potrošnje energije obično nije problem sa desktop računarima, ventilator je obično uključen cijelo vrijeme. Sa laptopom, situacija je drugačija. Operativni sistem mora da prati temperaturu u kontinuitetu. Kada se približi na maksimalno dozvoljenu temperaturu, operativni sistem može može uključiti ventilator, što čini buku i troši energiju. Alternativno, može smanjiti potrošnju energije smanjivanjem pozadinskog osvjetljenja ekrana, usporiti CPU, i tako dalje. Prijenosna računala koriste sada smart baterije, koje mogu komunicirati sa operativnim sistemom. Po želji se mogu prijaviti podaci o maksimalnom naponu ili struji. Većina laptop računala imaju programe koji se mogu izvoditi na upit i prikazati sve ove parametre. Smart bateriji može biti naloženo da promijeni različite operativne parametre pod kontrolom operativnog sistema. Windows sistem ima razrađen mehanizam za upravljanje potrošnjom energije zove ACPI ( Advanced Configuration and Power Interface ). Operativni sistem može poslati bilo kom kompatibilnom drajveru komande tražeći da se prijave sposobnosti svojih uređaja i njihovo trenutno stanje, da traži od uređaja da pređe u režim smanjenja potrošnje ili da prati kada su miš ili tastatura bili neaktivni ili prešli u režim aktivnosti.

200 Zadaci 8.22.Zadaci Zadatak 1: Napišite principijelni C kod sistemskog poziva za pisanje na šesnaestbitni U/I mapirani periferijski uređaj, čiji je izlazni registar smješten na adresu 1095, a statusni registar na adresi 1096 ima 3. bit postavljen na 1 kada je uređaj spreman. Koristi se prekidima vođen U/I. Rješenje: Dio koda koji se izvršava u samom sistemskom pozivu izgleda poput sljedećeg. int status=(int) 1096; int data=(int) 1095; copy_from_user (buffer,p,count); enable_interrupts(); while (!(inp(status) & (1 << 3))); out(data,p[i]); i=1; scheduler(); Dio koda koji se izvršava u interapt rutini izgleda slično ovom if (count==0) { unblock_user(); else { out(data,p[i]); count=count-1; i=i+1; acknowledge_interrupt(); return_from_interrupt(); Zadatak 2: Napišite principijelni C kod sistemskog poziva za čitanje sa šesnaestbitnog memorijski mapiranog periferijskog uređaja, čiji je ulazni registar smješten na adresu 1098, a statusni registar na adresi 1099 ima 3. bit postavljen na 1 kada je uređaj spreman. Koristi se programirani U/I. Rješenje: U sistemskom pozivu se izvršava kod sličan sljedećem. short int * status=(short int *) 1099; short int * data=(short int *) 1098; for (i=0; i<count; i++) { while (!(*status & (1 << 3))); p[i]=*data; copy_to_user (buffer,p,count); return_to_user();

201 8.22.Zadaci 201 Zadatak 3: Napišite principijelni C kod sistemskog poziva za pisanje na šesnaestbitni memorijski mapirani periferijski uređaj, čiji je izlazni registar smješten na adresu 1365, a statusni registar na adresi 1366 ima 5. bit postavljen na 1 kada je uređaj spreman. Koristi se DMA baziran U/I. Port za izbor DMA adrese je 474, port za dužinu DMA bloka je 475, inicijalizira se postavljanjem 5. bita porta 476 a port uređaja se šalje na 477. Rješenje: Dio koda koji se nalazi u interapt rutini principijelno izgleda ovako. acknowledge_interrupt(); unblock_user(); return_from_interrupt(); Dio koda koji se nalazi u sistemskom pozivu principijelno izgleda ovako. short int * dmaaddr=(short int *) 474; short int * dmalen=(short int *) 475; short int * dmaset=(short int *) 476; short int * dmaport=(short int *) 477; short int * status=(short int *) 1366; short int * data=(short int *) 1365; copy_from_user (buffer,p,count); *dmaaddr=buffer & 0xFFFF; *dmaaddr= buffer >> 16; *dmalen=count & 0xFFFF; *dmalen= count >> 16; *dmaport= &data; while (!(*status & (1 << 5))); *dmaset = (1 << 5); scheduler(); Zadatak 4: Koliko se procenata vremena potroši za obradu sata ako je frekvencija sata 140 Hz, a obrada pojedinog zahtjeva traje 1 ms? Rješenje: Potroši se 14% vremena Zadatak 5. Koristeći sistemske pozive read i write iz POSIX API napišite program u jeziku C koji kopira sadržaj diskete (uređaj fd0) u datoteku navedenu kao parametar.

202 Zadaci #include <sys/types.h> /* include necessary header files */ #include <fcntl.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]); /* ANSI prototype */ #define BUF_SIZE 4096 /* use a buffer size of 4096 bytes */ #define OUTPUT_MODE 0700 /* protection bits for output file */ int main(int argc, char *argv[]) { int in_fd, out_fd, rd_count, wt_count; char buffer[buf_size]; if (argc!= 2) exit(1); /* error if argc is not 2 */ /* Open the input file and create the output file */ in_fd = open("/dev/fd0", O_RDONLY); /* open the source file */ if (in_fd < 0) exit(2); /* if it cannot be opened, exit */ out_fd = creat(argv[1], OUTPUT_MODE); /* create the destination file */ if (out_fd < 0) exit(3); /* if it cannot be created, exit */ /* Copy loop */ while (TRUE) { rd_count = read(in_fd, buffer, BUF_SIZE); /* read a block of data */ if (rd_count <= 0) break; /* if end of file or error, exit loop */ wt_count = write(out_fd, buffer, rd_count); /* write data */ if (wt_count <= 0) exit(4); /* wt_count <= 0 is an error */ /* Close the files */ close(in_fd); close(out_fd); if (rd_count == 0) /* no error on last read */ exit(0); else exit(5); /* error on last read */

203 9.Uređaji razumljivi korisniku 9.1.Ulazni softver: tastatura 203 U ovom poglavlju će biti riječi o principima rada uređaja koji direktno komuniciraju sa korisnikom. Ovim uređajima se upravlja u korisničkom prostoru, kao i jezgru. Uz ovu temu je vezana oblast korisničkog interfejsa. 9.1.Ulazni softver: tastatura Tastature na PC računarima su uređaji koji imaju dva jednostavna kontrolera, od kojih je jedan na matičnoj ploči računara, a drugi na samoj tastaturi. Tastatura se može povezati s interapt pozivom koji se dešava na pritisnute ili otpuštene tastere. Tada se može očitati stanje ulaznog porta tastature i očitati koji je taster pritisnut i sačuvati u ulaznom baferu. Tasteri se označavaju sken kodovima koji zavise od pozicije tastera na tastaturi. Drajver tastature očitava sken kodove za znakove koji su se sakupili u baferu u međuvremenu. Treba ih konvertovati u razumljive znakove. Na primjer, kada se pritisne taster A, scan kod (30) se stavi u registar. Drajver treba da odredi, na bazi ranijeg pritiska ili otpuštanja tastera da li je to a, A, CTRL-A, ALT-A,... U tu svrhu se koristi ASCII tabela, prilagođena različitim nacionalnim jezicima koja se može eksterno učitati. Drajveri za tastaturu mogu da vraćaju samo unesene znakove (nekanonski ili sirovi režim) ili da prate razne kombinacije tastera sa specijalnim značenjem (kanonski ili kuhani režim). Na primjer u kanonskom režimu rada kombinacija CTRL-H briše prethodno uneseni znak. 9.2.Ulazni softver: miš Većina PC- ima miša, ili ponekad trackball, što je samo miš okrenut naopačke. Najčešći tip miša ima gumenu loptu koja viri kroz rupu na dnu i rotira kada miš ide preko grube površine. Kako lopta rotira, ona trlja gumene valjke stavljena na ortogonalna vratila. Zahtjev u pravcu lijevo-desno uzrokuje rotiranje valjka na y - osi, kretanje u smjeru naprijed-nazad uzrokuje rotiranje valjka na x - osi. Kad god miš pređe određenu minimalnu udaljenost u oba smjera, ili je taster je pritisnut ili pušten, poruka se šalje na računar. Minimalna udaljenost je oko 0,1 mm ( iako se može postaviti u softveru ) i ona se zove mickey. Miš može imati jednu, dvije, ili tri tipke. U novije vrijeme se zbog čestog valjaka vratila koriste miševi sa svjetlosnom diodom. Poruka za računar sadrži tri stavke : x, y, i dugmad. Prva stavka je promjena u x poziciji od posljednje poruke. Zatim dolazi promjena u y položaju u odnosu na prethodnu poruku. Konačno, proslijedi se status tipki. Format poruke ovisi o sistemu i broju tipki miša. Obično je potrebno 3 bajta. Miš pokazuje samo promjene u položaju, ne direktno apsolutnu poziciju. Ako se miš podigne i spusti lagano bez okretanja loptice poruka neće biti poslana. Neki GUI razlikuju između jednostrukih klikova i dvostrukih klikova na tipku miša. Ako su dva klika su dovoljno blizu u prostoru (mickey) i dovoljno blizu u vremenu (milisekundi), dvostruki klik se signalizira. Maksimum za "dovoljno blizu" je do softvera, koji sa parametrima obično bude korisnika podesiv 9.3.Ekranski hardver Prikazni uređaji mogu se podijeliti u dvije kategorije. Vektorski grafički uređaji mogu prihvatiti i izvršiti naredbe, kao što su crtanje tačaka, linije, geometrijskih figura, i teksta. Nasuprot tome, uređaji rasterske grafike predstavljaju izlazno području kao pravougaonu mrežu tačaka koje nazivamo pikselima, od kojih svaki ima neke nijanse sive vrijednosti ili malo boje.

204 Ekranski hardver Video RAM Kontr oler Analogni ili Digitalni signal Slika 114 Generisanje slike Raster grafika prikazuje se provodi hardverskim uređajem koji se zove grafički adapter. On sadrži posebnu memoriju zvanu video RAM, koji čini dio adresnog prostora računala i obraća se CPU na isti način kao i ostatak memorije (Slika 114). Slika ekrana je ovdje pohranjena u karakter modu ili bit mapa modu. U modu karaktera, svaki bajt ( ili 2 bajta ) video RAM-a sadrži jedan znak koji se prikazuje U bit mapa modu, svaki piksel na ekranu se predstavlja posebno u video RAM, sa 1 bit po pikselu za najjednostavniju crno-bijelu sliku do 24 ili više bita po pikselu za visoku kvalitetu prikaza boja. Također, dio grafičkog adaptera je čip koji se zove video kontroler. Ovaj čip uzima znakove ili bitove iz video RAM-a i generira video signal koji se koristi za pogon monitora. Monitor stvara snop elektrona koji ide horizontalno preko ekrana, prevlačeći linije na njemu. Tipično ekran ima linija od vrha do dna, s piksela po liniji. Signal video kontrolera modulira snop elektrona, utvrđivanje da li će piksel biti svijetao ili taman. Kolor monitori imaju tri barijere, za crvenu, zelenu i plavu komponentu boje, koje su samostalno modulirane. Ravni ekran također koristi piksele u tri boje, koristeći zakretanje kristala koji polarizuju svjetlost.. Na slici Slika 115 se vidi dio video RAM-a za prikaz u režimu karaktera. Svaki znak na ekranu na slici zauzima dva bajta u RAM. Prvi bajt po redu predstavlja ASCII kod za znak koji će biti prikazani. Naredni bajt je atribut bajt, koji se koristi za određivanje boje, inverznog znaka, treptanja, i tako dalje. B8000 B8002 B80A0 B80A2 B80A4 T e... D r u... Tekstualni ekran Drugi red Slika 115 Video memorija tekstualnog ekrana Rad u bit mapiranom modu koristi isti princip, osim što se svaki piksel na ekranu individualno kontroliše i predstavlja jedan ili više bitova u video RAM. U najjednostavnijoj konfiguraciji za jednobojni ekran, svakom ekranskom pikselu odgovara bit u video RAM. U drugoj krajnosti, svaki ekranski piksel predstavljena je 24 - bitnim brojem u video RAM-a, sa 8 bita za Red, Green i Blue intenzitet. Ova reprezentacija RGB se koristi jer su crvena, zelene i plave su primarne aditivne boje, iz kojih se sve druge boje mogu graditi sabiranjem različitih intenziteta tih boja.

205 9.4.Znakovni terminali 205 Veličine ekrana se razlikuju. Najčešće su 320x200, 640x480 (VGA), 800x600 (SVGA), 1024x768 ( XGA ), 1280x1024, i 1600x1200. Većina režima je u omjeru 4:3, što odgovara proporcijama NTSC televizora. Glavni nedostatak bit mapiranog pristupa je u velikoj količini memorije. Na primjer, prikaz 768 x 1024 u boji sa 24 bita po pikselu zahtijeva 2,25 MB RAM-a, samo da drži sliku. Ako se osvježava 75 puta u sekundi, video RAM mora biti sposoban za isporuku podataka kontinuirano na 169 MB/s. Da bi se izbjeglo upravljanje velikom ekranskom slikom, neki sistemi imaju sposobnost za smanjenje rezolucije u boji. U najjednostavnijoj šemi, svaki piksel je predstavljen 8 - bitnim brojem. Umjesto da ukazuje na boju, ova vrijednost je indeks u tablici od 256 elemenata, svaki ima 24 - bitne ( crvena, zelena, plava ) vrijednosti. Ova tabela, koja se zove paleta boja i često čuva u hardveru, omogućava da ekran sadrži proizvoljnih 256 boja u bilo kojem trenutku. Mijenjanje, recimo, unosa 7 u paleti boja, mijenja boju svih piksela na slici čija je vrijednost 7. Također je moguće koristiti paletu boja sa 16 bita po pikselu. U ovom slučaju paleta boja sadrži unosa, tako da se do 65,536 boja može koristiti odjednom. Međutim, ušteda u prostoru manja jer svaki piksel sada zahtijeva 2 bajta u video RAM. 9.4.Znakovni terminali Ranije su mnogo korišteni RS-232 terminali za komunikaciju s mainframe sistemima, bit po bit, preko serijske linije, između kojih se koristi eventualni telefonski modem. Kompjuter i terminal su potpuno odvojeni, ali terminal ima sposobnost prikaza teksta koji mu se pošalje. Pojeftinjenje personalnih računara je učinilo da se i oni mogu koristiti kao terminali. To je najprije išlo takođe preko RS-232 interfejsa, a nakon toga su računari opremljeni mrežnim karticama i protokolima, što je komunikaciju učinilo daleko bržom (Slika 116). Centralni račumar Terminali RAM TTY drajve CPU Ethernet kontroler Telnet proces RS232 interfejs PC Internet Slika 116 Pristup preko znakovnog terminala Iako je ovaj pristup danas rijedak, uticao je na principe drajvera tekstualnog ekrana. Drajveri, bilo da su realizovani kroz terminal ili kao lokalni ekran PC računara, mogu na izlazu da prepoznaju specijalne kombinacije bajtova koji se interpretiraju drugačije. Primjer takvih kombinacija su ANSI escape sekvence. Njih prihvata terminalski drajver, i imaju posebno ponašanje nakon ESC znaka. To je bajt s ASCII kodom 0x1B. Neke od ovih sekvenci mogu imati parametre (Slika 117).

206 Windows konzolne funkcije Escape sekvenca ESC [ n A ESC [ n B ESC [ n C ESC [ n D ESC [ m;n H ESC [ 0 J ESC [ 0 K ESC [ 4 m Značenje Pomjeri se n linija gore Pomjeri se n linija dolje Pomjeri se n znakova desno Pomjeri se n znakova lijevo Pomjeri kursor na poziciju (m,n) Obriši ekran od kursora do kraja Obriši liniju od kursora do kraja Režim podebljanih slova Slika 117 ANSI sekvence 9.5.Windows konzolne funkcije Iako se rjeđe koriste, Windows podržava nekoliko funkcija za ispis tekstualnih aplikacija, iz komandne linije. SetConsoleTitle( lpconsoletitle); Postavlja naslov konzolnog prozora WriteConsole(hConsoleOutput,lpBuffer,nNumberOfCharsToWrite,lpNumberOfCharsW ritten, lpreserved); Ispisuje tekst na konzolni ekran GetConsoleWindow() Dobavlja rukovatelj konzolnog prozora ReadConsole(hConsoleInput,lpBuffer,nNumberOfCharsToRead,pNumberOfCharsRead, lpreserved); Unosi tekst sa tastature na konzolnom ekranu WriteConsoleInput( hconsoleinput,lpbuffer,nlength,lpnumberofeventswritten); Šalje podatke na ulaz konzole 9.6.WINDOWS GDI Za crtanje likova pod Windows u grafici visoke rezolucije na ekranu koristi se više API grupacija, od kojih se najčešće koriste GDI funkcije. Ima ih oko 200, pa će ovdje biti spomenuto samo nekoliko njih. Skoro sve one koriste kontekst uređaja kao prvi parametar, koji se obično dobije funkcijom BeginPaint ili GetDC. On se najčešće odnosi na korisničko područje prozora, ali se iste funkcije mogu koristiti i za izlaz na štampač, EMF datoteku vektorske grafike, okvire prozora itd. HDC = GetDC ( hwnd ) ; TextOut ( HDC, x, y, pstext, ilength ) ; ReleaseDC ( hwnd, HDC ) ; U prvoj naredbi se dobija rukovatelj na kontekst uređaja, HDC. Druga koristi kontekst uređaja da napiše liniju teksta na ekranu, navodeći ( x, y ) koordinate gdje string počinje, pokazivač na sam string, i njegovu dužinu. Trećom linijom se oslobađa kontekst uređaja. Kada se HDC dobije na ovaj način, program može pisati samo na unutrašnjem području klijenta prozora, ne u traci naslova i drugim dijelovima. Međutim, postoji još jedan način da se dobije kontekst uređaja, GetWindowDC, koji omogućava crtanje na cijelom prozoru. Ostali pozivi ograničavaju region odsijecanja i na druge načine. To da više poziva da rade gotovo istu stvar je još jedna karakteristika Windows. Evo još jednog primjera. Da se iscrta pravougaonik na ekranu, poziva se Rectangle ( HDC, xleft, ytop, xright, ybottom ) ; Na primjer,

207 9.6.WINDOWS GDI 207 Rectangle ( hdc, 2, 1, 6, 4 ) ; GDI funkcije su primjeri vektorske grafike. One se koriste za postavljanje geometrijskih figura i teksta na ekranu. Zbirka poziva GDI procedura se može sastaviti u datoteku koja može opisati složen crtež. Takva datoteka se zove Windows Metafile, i široko se koristi za prijenos crteža iz jednog Windows programa u drugi. Takve datoteke imaju ekstenziju WMF. Fotografije i video zapisi ne koriste vektorsku grafiku. Pamti se vrijednost crvene, zelene i plave komponente svakog kvadratića slike i čuvaju kao vrijednost jednog piksela. Takva datoteka se zove bitmapa. Jedan načina za korištenje bitmape je kroz funkciju BitBlt. Ona se poziva sa sljedećim parametrima: BitBlt ( dsthdc, dx, dy, wid, HT, srchdc, SX, sy, rasterop ) ; Slika 118 Efekat BitBlt funkcije U svom najjednostavnijem obliku, ova funkcija kopira bit mapu iz pravougaonika u jednom prozoru na pravougaonik u drugom prozoru ( ili istom ). Prva tri parametra odrede prozor i položaj odredišta. Zatim dolaze širina i visina. Nakon toga se navode prozor i položaj izvora. Svaki prozor ima svoj koordinatni sistem, sa ( 0, 0 ) u gornjem lijevom uglu prozora. Posljednji parametar omogućava efekte pri kopiranju slike, obično logičku funkciju. BitBlt ( hdc2, 1, 2, 5, 7, hdc1, 2, 2, SRCCOPY ) ; Možemo spomenuti još neke zanimljivije GDI funkcije. AlphaBlend Prikazuje bitmapu s transparentnim ili polutransparentnim tačkama BitBlt Kopira bitmapu s mjesta na mjesto. CreateBitmap Kreira bitmapu. GetPixel Vraća boju tačke na datoj koordinati. LoadBitmap Učitava bitmapu iz izvršnog programa. SetPixel Postavlja boju tačke. StretchBlt Kopira bitmapu, uz raširenje ili smanjenje. CreateHatchBrush Kreira četku s šrafiranim uzorkom i bojom. CreateSolidBrush Kreira četku s punom bojom. CreatePen Kreira logičko pero s navedenim stilom, bojom i uzorkom CreatePalette Kreira logičku paletu. GetWindowExtEx Vraća dimenzije prozora za kontekst uređaja. GetDC Vraća oznaku konteksta uređaja za klijentski prostor prozora ili cijelog ekrana. ReleaseDC Oslobađa kontekst uređaja. CopyIcon Kopira ikonu iz drugog programa. DrawIcon Iscrtava ikonu. Chord Iscrtava odsječak elipse.

208 Posix terminal api Ellipse Iscrtava elipsu. FillRect Puni pravougaonik navedenom četkom. Pie Iscrtava torta isječak. Polygon Iscrtava poligon. Rectangle Iscrtava pravougaonik. RoundRect Iscrtava zaobljeni pravougaonik. Arc Iscrtava eliptički luk LineTo Iscrtava liniju od trenutne pozicije do navedene tačke. PolyBezier Iscrtava Bezierovu krivu. Polyline Iscrtava izlomljenu liniju. CreateFont Kreira logički font. DrawText Iscrtava tekst u pravougaoniku. EnumFontFamiliesEx Prolazi kroz sve fontove u sistemu. ExtTextOut Iscrtava niz znakova. TextOut Piše niz znakova na lokaciji. BeginPaint Priprema prozor za crtanje. InvalidateRect Dodaje pravougaonig u region koji se treba ponovo iscrtati. SetBkColor Postavlja boju pozadine. UpdateWindow Ažurira klijentsko područje prozora. CreatePolyPolygonRgn Kreira region od više poligona. FillRgn Puni region koristeći navedenu četku Posix terminal api Za tekstualni ispis i očitavanje tastature se koriste standardne read i write funkcije, pri čemu je datotečni deskriptor STDIN i STDOUT. One se koriste kod PC ekrana i terminala. Za priključenje znakovnih terminala postoji više funkcija za podešavanje parametara terminala: termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed, cfsetspeed 9.8.Štampači Dvije osnovne vrste štampača su udarni štampači i bezkontaktni štampači. Udarni printeri su najstarija tehnologija štampe koja je još uvijek u aktivnoj proizvodnji. Udarni printeri su najfunkcionalniji u specijaliziranim okruženjima gdje je niska cijena štampe od suštinskog značaja. Tri najčešća oblika su matrični, lepezni i linijski štampači. Tehnologija iza matričnih štampača je vrlo jednostavna. U radu se pritisne bubanj (gumirani cilindar) i povremeno povuče prema naprijed kao ispis napreduje. U elektromagnetskom pogonu glava štampača se kreće preko papira i udara iglicama vrpcu štampača koja se nalazi između papira i glava štampača. Glava štampača na traci tiska tačkice tinte na papiru koje čine ljudski - čitljive znakove. Matrični štampači se razlikuju u rezoluciji štampe i ukupne kvalitete i imaju obično 9 ili 24 iglice na glavi štampača. Budući da glava štampača mora udariti površinu papira sa dovoljno snage za prijenos tinte sa trakom na stranici, oni su idealni za okruženja koja moraju proizvesti karbon kopije kroz upotrebu posebnih višedijelnih dokumenata.

209 9.8.Štampači 209 Štampači s lepezom su slični pisaćim mašinama. Glava štampača sastoji se od metalnog ili plastičnog točka isječenog po laticama. Svaka latica ima određen broj slova ( velikih i malih slova ), brojeva ili interpunkcijskih znakova na njemu. Kada latica je pogodi vrpcu štampača ovo rezultira ispisom tinte na papir. Ovi printeri su glasni i spori. Oni ne mogu ispisati grafiku, a ne mogu promijeniti fontove osim ako je točak štampača fizički zamijenjen. Pojavom laserskih štampača, ovi printeri se obično ne koriste u modernim računarskim okruženjima. Linijski štampači imaju mehanizam koji omogućava više znakova da se istovremeno štampa na istoj liniji. Mehanizam može koristiti veliki rotirajući bubanj ili papir u lancu petlje. Kada se bubanj ili lanac rotira preko površini papira, elektromehanički čekići iza papira gurnu papir (zajedno sa trakom) na površinu bubnja ili lanca, iscrtavajući lik na površini bubnja ili lanca. Zbog prirode mehanizma ovi štampači su vrlo brzi ali vrlo bučni i lošijeg kvaliteta otiska. Kod bezkontaktnih štampača, s papirom ne dolaze u dodir metalni dijelovi štampača nego samo boja. Ovakvi štampači su znatno tiši od udarnih i omogućuju bolji kvalitet štampe. Njihovi predstavnici su termalni, inkjet, laserski, sa sublimacijom boje, termalnog voska i čvrste tinte. Termalni štampači koriste specijalni papir osjetljiv na temperaturu ili električni naboj. Glava štampača na pojedinoj tački papira zagrije to mjesto grijačem ili električnom varnicom, nakon čega papir na tom mjestu blago izgori. Danas se najčešće koriste u registar kasama za štampanje računa. Inkjet štampač koristi jednu od najpopularnijih štampe tehnologije danas. Relativno niske cijene i višenamjenski ispis čine da su inkjet štampači dobar izbor za male biznise i kućne urede. Inkjet printeri koriste boje na bazi vode koje se brzo suše i glavu štampača s nizom malih mlaznica koja rasprskava tintu na površini papira. Inkjet štampači su prvobitno proizvedeni za crno-bijeli ispis. Međutim, glava štampača od tada je proširena i mlaznice povećane za smještaj cijan, magenta, žuta i crna. Ova kombinacija boja (naziva CMYK) omogućava ispis slika gotovo iste kvalitete kao razvoj u foto laboratoriju (kada se koristi papir određene vrste.) Laserski štampači su poznati po velikim mogućnostima izlaza i niskim troškovima po stranici. Laserski printeri dijele mnogo istih tehnologija kao foto-kopirni aparat. Valjci povuku list papira iz ladice za papir i kroz valjak, što daje papiru elektrostatički naboj. U isto vrijeme ispisni bubanj ima suprotno naelektrisanje. Površina bubnja se zatim skenira laserom, isprazni površina bubnja i ostave samo one tačke koje odgovaraju željenom tekstu i slikama. Ovaj naboj se zatim koristi da prisili toner da se zadrži na površini bubnja. Papir i bubanj se zatim dovode u kontakt; njihovo različito naelektrisanje uzrokuje da se toner tada zadrži za papir. Konačno, papir putuje između valjaka, koji griju papir i tope toner, spajajući ga na površini papira. Laserski štampač u boji temelji se na tradicionalnom laserskom monohromatskom štampanju, ali koristi dodatne komponente za stvaranje slike u boji i dokumenata. Umjesto korištenja samo crnog tonera, laserski printeri u boji koriste CMYK toner kombinaciju. Bubanj za ispis ili rotira svake boje i postavlja toner sjednu po jednu boju, ili leži sve četiri boje, a zatim prolazi papir kroz bubanj, prenošenjem kompletne slike na papir. Kolor laserski printeri i dodaju grijač ulja za dodatno vezanje boje na papir što može dati različite stepene sjaja na gotovoj slici. Za postizanje visokog kvaliteta u boji rjeđe se koriste još neke tehnologije. Štampači termalnog voska imaju pojas za pogon CMYK trake veličine lista papira i specijalno - premazani papir ili folije. Glava štampača sadrži grijače kojim se topi vosak boja na papir, dok on ide kroz štampač. Štampači s sublimacijom boje su slični štampačima termalnog voska, osim što koriste film boje difuzne plastike umjesto obojenog voska. Glava štampača zagrijava

210 Štampači film u boji i isparava sliku na posebno premazani papir. Štampači čvrste boje su cijenjeni zbog svoje sposobnosti za ispis na raznim vrstama papira, što se koristi za izradu prototipova ambalaža. Ovi printeri koriste tvrdu tintu koja se istopi i prska kroz male mlaznice na glavama štampača. Papir se zatim šalje prema valjku grijaču što dodatno tjera tintu na papir. Prije pojave laserske i inkjet tehnologije, udarni printeri su mogli samo ispisati standardni tekst bez razlike u veličini slova ili stilu fonta. Danas, štampači su u mogućnosti da obrađuju složene dokumente sa ugrađenim slikama, grafikonima i formulama na nekoliko jezika, sve na jednoj stranici. Zato su razvijeni jezici za opis stranice (Pager Description Language - PDL ) - specijalizirani jezik za formatiranje dokumenta specijalno napravljen za komunikaciju računara sa štampačem. Tokom godina, proizvođači štampača su razvili vlastite jezike za opisivanje formata dokumenata. Međutim, takvi jezici su primjenjivi samo na štampače koji su proizvođači stvorili sami. Ako bi, na primjer, poslali datoteku spremnu za štampu pripremljenu u PDL Epson štampača u profesionalnu štampariju, nema garancije da će datoteke biti kompatibilne sa štamparskom mašinom. U firmi Adobe, je razvijen PDL zvani PostScript, koji koristi jezik za opisivanje i oblikovanje teksta i slika koje može obraditi printer. U isto vrijeme, Hewlett - Packard je razvio Printer Control Language ( ili PCL ) za upotrebu u svojim laserskim i inkjet štampačima. PostScript i PCL su sada široko prihvaćeni PDL-ovi i podržava ih većina proizvođača štampača. PDL rade na istom principu kao i programski jezici. Kada je dokument spreman za ispis, PC ili radna stanicu uzima slike, tipografske informacije i raspored dokumenta, i koristi ih kao objekte koje šalje štampaču za obradu. Štampač potom prevodi ove predmete u rastere, niz skeniranih linija koje čine sliku dokumenta (tzv. Raster Image Processing ili RIP ), i ispisuje izlaz na stranicu kao jednu sliku, zajedno sa tekstom i bilo grafike uključene. Sljedeći primjer predstavlja PostScript program koji se šalje štampaču da nacrta trougao na stranici. %!PS newpath moveto lineto lineto closepath stroke arc fill showpage Sljedeći primjer u PCL crta pravougaonik, gdje <esc> predstavlja bajt s vrijednošću 27. <esc>&u300d<esc>*t300r<esc>*p300x300y <esc>*r3u<esc>*v2s<esc>*c300a300b5p U zavisnosti od organizacionih potreba, može biti nepotrebno dodijeliti jedan štampač za svakog člana organizacije. Dok je lokalni štampač priključen preko paralelnog ili USB kabel za svaku radnu stanicu idealno rješenje za korisnika, to je obično nije ekonomski isplativo. Proizvođači printera su za ovo razvili grupne printere. Ove mašine su obično izdržljive, brze, i imaju dug životni vijek potrošnog materijala. Grupni printeri obično su vezani za server štampe, samostalni uređaj koji se bavi poslovima štampe i preusmjerava izlaz na odgovarajući štampač kada je dostupan.

211 9.9.Štampanje u Windows Štampanje u Windows Na Windows gotovo sve aplikacije koriste GDI, koji se može koristiti i za štampače, tako da je generisanje izgleda stranice na štampaču jednostavno. Kontekst uređaja štampača se dobije API pozivom StartDoc i koriste se pozivi za crtanje. Slika se ispisuje u metadatoteku ili direktno prema drajveru, koji onda konvertuje to u format štampača. Podaci koji se šalju štampaču se pošalju programu spuleru (spoolsv.exe). Vrlo često se kompletna konverzija u raster oblik obavlja na računaru, a ne na štampaču. To je omogućilo pojavu jeftinih štampača za Windows, zvanih GDI štampači, pored štampača s standarnim PCL. API pozivi za generisanje štampe dati su u sljedećoj listi. AbortDoc(hdc); Prekida trenutnu pripremu štampe započetu s StartDoc DeviceCapabilities(pDevice, pport,fwcapability,poutput,*pdevmode); Vraća mogućnosti drajvera za štampač EndDoc(hdc); Završava pripremu štampe EndPage(hdc); Označava kraj stranice StartDoc(hdc,*lpdi) Počinje pripremu štampe StartPage(hDC); Označava početak strane EnumPrinters( Flags, Name, Level, pprinterenum, cbbuf, pcbneeded, pcreturned ); Prolazi kroz listu printera i printer servera GetDefaultPrinter( pszbuffer,pcchbuffer); Vraća ime podrazumijevanog štampača GetPrinter( hprinter,level, pprinter,cbbuf,pcbneeded) Vraća informaciju o navedenom štampaču PrinterProperties( hwnd, hprinter); Prikazuje dijaloški prozor o svojstvima štampača SetPrinter( hprinter, Level,pPrinter,Command) Postavlja podatke za navedeni printer ili njegovo stanje 9.10.Linux/Unix štampanje Unix arhitektura je starija od grafički orijentisanih štampača. Originalno,Unix nije imao spooler, nego se datoteka direktno slala na uređaj štampača naredbom poput. cat file > /dev/lp1 U kasnijim verzijama je uveden lpd printer spuler, ali je imao nekih nekompatibilnosti. Većina Unix alata za štampu je prilagođena linijskim štampačima, a ne pametnim štampačima. To znači da nema standardnog interfejsa za programski izlaz. Mora se kreirati privremena datoteka i štampati iz linijskog režima Situacija se promijenila uvođenjem CUPS. CUPS je više od spool programa. To je kompletan sistem za upravljanje štampačima. Poznaje novi Internet Printing Protocol (IPP). Može mu se pristupiti web, GUI i komandnim interfejsima. Opremljen je programima filterima koji prevode različite tekstualne i grafičke formate u PostScript jezik, koji se može direktno slati takvim štampačima. Ako štampač nije PostScript tipa, programima CUPS-raster se konvertuje PostScript u format prilagođen štampaču, a zatim backend programima šalje kroz odgovarajući fizički interfejs ili mrežni protokol prema štampaču ili udaljenom serveru. Kada se koristi CUPS iz komandne linije se pripremljena datoteka zatim štampa programom lpr. Npr, ako se želi poslati datoteka na podrazumijevani štampač, koristi se lpr test.pdf Arhitektura CUPS sistema prikazana je na slici Slika 119.

212 Dodirni ekrani Linux aplikativni program Ulazni formati za spooler: Tekst, PDF, HPGL Slike Predfilteri: Text-to-ps, pdf-to-ps Konverzija u Postscript Konverzija u raster Postscript format ps-to-raster Raster format Konverzija u jezik štampača Raster-to-pcl, raster-to-escp, raster-to-dymo... Transfer (serijski, paralelni, USB, računarska mreža) Slika 119 CUPS sistem štampanja 9.11.Dodirni ekrani U novije vrijeme, sve popularniji ulazno/izlazni uređaj je dodirni ekran. Dodirni ekran je računarski monitor koji reaguje na dodir olovkom ili prstom. Koriste se četiri tipa principa rezistivni, kapacitivni, infracrveni i površinski akustični talas (SAW) Kod rezistivnog dodirnog ekrana, ekran je napravljen od dva sloja provodnog materijala. Jedan sloj ima vertikalne, drugi horizontalne linije. Kada se pritisne gornji sloj on dođe u kontakt s drugim koji dopusti tok struji. Odgovarajuće horizontalne i vertikalne linnije određuju poziciju na ekranu koja je dodirnuta. Kapacitivni dodirni ekran je napravljen od laminata preko cijelog staklenog ekrana. Laminat provodi struju u svim pravcima, a vrlo mala struja ide iz sva četiri ugla. Kada se ekran dodirne, struja teče u prst ili olovku. Lokacija dodira se odredi poređenjem koliko je jak tok elektriciteta iz svakog ugla Infracrveni dodirni ekran je ekran s unakrsnim horizontalnim i vertikalnim zracima IC svjetla. Senzori suprotnih strana ekrana detektuju zraku. Kada korisnik prekine zraku dodirom ekrana, može se odrediti lokacija prekida. Akustički površinski val (SAW) je ekran s visoko frekventnim zvučnim talasima horizontalno i vertikalno. Kada prst dodirne površinu, senzor prepozna prekid I odredi lokaciju dodira.

213 9.12.Tekstualni korisnički interfejs 213 Najčešći način programiranja ulaza s ovim uređajem je da se za njih napišu drajveri slični drajveru za miša, pa da se uređaj ponaša kao miš. Tableti su mali računari bez tastature kojima je dodirni ekran glavni ulazni uređaj. Jedan od načina da se prevaziđe nedostatak tastature su gesture. To su pokreti prstima preko dodirnog ekrana s posebnim značenjem (Slika 120). Izbor Uvećanje Slika 120 Gesture Pomijeranje 9.12.Tekstualni korisnički interfejs Obično izvan jezgra se izvršava aplikacija namijenjena korisnicima i to je ono što većina ljudi vidi kada se govori o operativnom sistemu. Ta aplikacija omogućava korisnicima da unose i pokreću programe. Prvi kućni računari, kao i današnji programabilni kalkulatori, nisu imali operativne sisteme u smislu u kome se govori u ovom kursu. Umjesto toga koristi se interpreter za programski jezik u ROMu (kao što su BASIC, Forth). Na slici je prikazan izgled ekrana starog računara Commodore 64, kod koga BASIC interpreter ima ulogu komandne školjke (Slika 121). Slika 121 Izgled ekrana računra C64 sa BASIC-om Prednost pristupa je u izuzetno brzom pokretanju računara, i mogućnosti da se odmah piše korisnički program, ali je mana u maloj fleksibilnosti. Druga varijanta tekstualnog korisničkog interfejsa je primijenjena u operativnim sistemima kao što su CP/M, DOS, Unix ili VMS. Umjesto generalnog programskog jezika, kao što je BASIC, računar je opremljen specijaliziranim jezikom namijenjenim za pokretanje drugih aplikacija i manipulaciju datotekama. Ovakvi jezici se zovu skriptni jezici ili komandni

214 Skriptni jezici u DOS i Windows interpreteri. Većina komandnih interpretera radi tako što ispiše kratku poruku koja se zove prompt. Korisnik tada otkuca komandu sljedećeg oblika: Naredba parametar1 parametar2 parametar3... Naredbe su obično jedna od tri klase : 1. Interna prepoznaje i obrađuje sam interpreter komandne linije sebe i ne ovisi o bilo kojoj vanjskoj izvršnoj datoteci 2. Uključena - Izdvojena izvršna datoteka koja se općenito smatra dijelom operativnog okruženja i uvijek uključena u OS. 3. Vanjska - Vanjske izvršne datoteke nisu dio osnovnog OS, ali su dodane naknadno od strane korisnika. Parametri parametar1... parametarn se prosljeđuju naredbi, odnosno eksternom programu. Parametri mogu biti argumenti (npr. Imena datoteka koje se obrađuju naredbom) ili opcije (dodatno definišu naredbu). Ispred opcija se stavlja neki standardizovani simbol poput crtice ili kose crte Skriptni jezici u DOS i Windows Već od prve verzije MSDOS, pa sve do današnjeg Windows 8.1, postoji komandni interpreter koji se zove COMMAND.COM. U MS DOS, koji gotovo da nema upravljanje procesima, COMMAND.COM se naizmjenično učitava s aplikativnim programom. U DOS memoriji, kao i kod Windows 95 se čuva u dva dijela. Tranzijentni dio interpretira komande i briše se iz memorije kada se učita pozvani program. Rezidentni dio ostaje u memoriji i nakon završetka pozvanog programa ponovo učita tranzijentni COMMAND.COM dio s diska. Interne komande su date u tabeli na slici Slika 122. cd Promjena radnog direktorija time Prikaz sistemskog vremena chcp Promjena kodne stranice type Prikaz sadržaja tekstualne datoteke cls Brisanje ekrana unlock Oktljučava disk copy Kopiranje ili spajanje datoteka ver Verzija Windows-a ctty Izmjena vrste terminala vol Prikaz imena diska date Prikaz ili postavljanje datuma break Uključuje ili gasi provjeru CTRL+C del Brisanje datoteke call Poziva batch program iz drugog dir Listing direktorija echo Prikazuje poruke na ekranu exit Napušta komandni interpreter for Izvršava komandu za svaku datoteku u skupu Skok na labelu u batch programima. lock Zaključava disk, za direktni pristup aplikaciji goto md Kreiranje direktorija if Obavlja uslovnu obradu u batch programima path Postavljanje staze programa lfnfor O(ne)mogućava duga imena u FOR naredbi prompt Promjena Windows prompta lh Učitava program u područje iznad 640K rd Brisanje direktorija pause Prikazuje poruku u batch programima ren Preimenovanje direktorija rem Komentar set verify Prikaz Windows varijabli okruženja Uključuje provjeru ispravnosti nakon kopiranja datoteka shift Mijenja poziciju parametara u batch datoteci. Slika 122 Interne komande Command.com u MS DOS i Windows Ostale komande kao što su FORMAT, DISKCOPY, EDLIN, XCOPY, MEM, MOVE, START, PING, NET,... se učitavaju s diska

215 9.14.Unix Shell 215 Naredbe je moguće spajati u programe koji se zovu batch datoteke. Pored naredbi, batch datoteke u COMMAND.COM mogu imati četiri vrste varijabli : ERORLEVEL - sadrži povratni kod posljednjeg pokrenutog programa koji postavlja vrijednost ( cijeli broj između 0 i 255 ). Većina programa imaju određeni konvenciju za njihove povratne kodove Varijable okruženja imaju formu %PROMENLJIVA%, a postavljaju se SET naredbom. Komandni parametri imaju oblik %0, %1,...%9, u početku sadrže naziv komande i prvih devet parametara komandne linije. Parametri desno od devetog se mogu dosegnuti pomoću SHIFT naredbe " for" varijable se koriste u petljama i imaju format %%a kada se radi u batch datotekama Postoji mogućnost preusmjeravanja ulaza ili izlaza komande u datoteku ili drugu komandu, sintaksom iz sljedeće tabele na slici Slika 123. naredba < datoteka Preusmjeravanje standardnog ulaza iz datoteke ili uređaja naredba > datoteka Preusmjeravanje standardnog izlaza, prebriše ciljnu datoteku ako postoji. naredba >> datoteka Preusmjeravanje standardnog izlaza, dodavanjem na ciljnu datoteku ako ona postoji. naredba1 naredba2 Proslijedi standardni izlaz iz naredbe1 standardnom ulazu naredba2 naredba1 & naredba2 Komande razdvojene i izvršavaju se u sekvenci Slika 123 Redirekcija u COMMAND.COM Od Windows NT, COMMAND.COM je ostavljen za izvršavanje 16 bitnih DOS aplikacija, a uveden je CMD.COM. On je kompatibilan sa COMMAND.COM, ali ima više memorije na raspolaganju, naredbe SETLOCAL/ENDLOCAL za ograničenje područja varijabli okruženja, interne CALL i GOTO labele, izraze u SET i IF, poboljšanu FOR naredbu, historiju naredbi, dovršavanje naredbi uz pomoć TAB, i naredbe za pamćenje direktorija PUSHD, POPD POWERSHELL se instalira na nekim serverskim verzijama Windows. Puno je moćniji kao jezik. Koristi.NET klase, i aplikacije koje se zovu Cmdleti a koji se pokreću i obavljaju funkcije. Svaki cmdlet ima alias koji liči na DOS ili Unix komande. Npr. aliasi za Remove-Item su ri, del, rmdir, rd, rm 9.14.Unix Shell Pod Unix sistemima nastalo je više različitih komandnih jezika. Izvršavaju se u korisničkom prostoru memorije. Prva grupa je nastala od najranijeg. Oni se mogu podijeliti u dvije kategorije. Odlikuje se jezikom sličnim Algol 68, i ovu grupaciju sačinjavaju Bourne shell (sh najraniji), Almquist shell (ash - malo zahtjevan ), Bourne-Again shell (bash najpopularniji ), Debian Almquist shell (dash verzija ash za distribuciju Debian), Korn shell (ksh čiji je autor David Korn), Z shell (zsh najkompletniji od svih), Busybox (u jednom programu su Shell i mali programi) Drugu kategoriju predstavljaju C shell (csh) i TENEX C shell (tcsh). Njihov skriptni jezik podsjeća na C. Grafička okruženja su danas dosta napredovala u odnosu na rane Linux dane, ali je komandna linija i dalje popularna na Unix baziranim sistemima. Razlog je u velikoj fleksibilnosti, univerzalnosti i brzini komandnog okruženja. Aktivnosti iz komandne linije se mogu automatizovati, tako da na primjer pripremite skup komandi koje će kopirati veliki broj datoteka i zatim radite nešto drugo, što jeste teže naučiti od kopiranja mišem, ali će vam na duži rok uštedjeti dosta vremena. Komandna linija se još zove i terminal, konzola, XTerm, shell, školjka, ljuska, naredbena linija, naredbeni redak, komandni prompt (mada svi ovi izrazi nisu potpuni sinonimi).

216 Osnovne Unix/Linux naredbe komandne linije Naredbe se kucaju tako što imate jednu aktivnu liniju u koju upisujete naredbe. Naredbu pokrećete pritiskom na taster Enter. Kad se naredba izvrši i ispiše se rezultat (ako naredba daje kakav ispis) pojavi se nova aktivna linija, a stara se pomakla prema gore. Krivo napisana naredba se može korigovati s tasterima Delete i Backspace. Taster Tab služi za dopunjavanje naredbe. Često je dovoljno otkucati prvih nekoliko slova naredbe ili njenog parametra, a zatim pritisnuti taster Tab Osnovne Unix/Linux naredbe komandne linije Za početak je korisno dobiti informacije gdje smo, ko smo i kada smo na sistemu. Kao odgovor na prvo pitanje pogledajte kako se zove trenutni direktorij. Otkucajte pwd i pritisnite Enter. Računar će vam javiti kako se zove direktorij u kome se trenutno nalazimo. Naše korisničko ime pod ovom sesijom saznajemo naredbom whoami Ime računara se dobija naredbom hostname, a verzija jezgra Linuxa naredbom uname hostname uname -a Trenutno vrijeme i datum se saznaju naredbom date, a detaljniji kalendar dobijate naredbom cal Ako želite pogledati spisak svih datoteka u tekućem direktoriju, otkucajte komandu ls Naredbe mogu imati i parametre. ls -lr Prethodni primjer daje spisak svih datoteka u tekućem direktoriju i njegovim poddirektorijima sa detaljima o pravima, veličini, vlasništvu i vremenu kreiranja, dok se spisak svih datoteka uključujući i skrivene dobija sa ls -a Svaka komanda ima parametar -? ili --help koji daje kratko uputstvo. Tako na primjer, parametre naredbe ls možete saznati sa ls --help Detaljniji opis svake naredbe možete dobiti koristeći komandu man. Ova komanda kao parametar ima ime komande o kojoj se traži uputstvo. man date Prethodni primjer će dati sve parametre naredbe date i način njihovog korištenja. Kroz ovaj priručnik krećete se strelicama gore/dolje ili PageUp/PageDown, a izlazite pritiskom na taster Q. Za prelazak u drugi direktorij koristite komandu cd, čiji je parametar ime direktorija, na primjer za prelazak u direktorij /etc/apt otkucajte cd /etc/apt Nekoliko direktorija imaju specijalna imena.. Trenutni direktorij.. Direktorij koji se u hijerarhiji nalazi tačno iznad trenutnog ~ Početni direktorij za trenutnog korisnika / Korijenski direktorij cijelog datotečnog sistema Tako na primjer, sljedeća komanda vas prebacuje direktorij iznad trenutnog.

217 9.15.Osnovne Unix/Linux naredbe komandne linije 217 cd.. Specijalni znak kose crte okrenut na lijevo (\) se koristi za unos znakova u komandnoj liniji koji mogu praviti probleme. Na primjer, razmak normalno razdvaja parametre i ako želite pristupiti direktoriju koji ima razmak u imenu (npr /mnt/sda1/program Files), ispred razmaka trebate staviti ovu kosu crtu, tj cd /mnt/sda1/program\ Files Ako se cd navede bez parametara, prelazi se u polazni direktorij. Novi direktorij se kreira naredbom mkdir, koja kao parametar ima ime direktorija, npr mkdir testni Uz dodatni parametar -p ovom komandom kreirate i sve poddirektorije u navedenoj stazi ako ne postoje npr mkdir -p testni/pod1/pod2/pod3 Da obrišete datoteku koristite komandu rm, na primjer rm poruka.txt Ako uz ovu naredbu dodate parametar -r, njom se mogu brisati i direktoriji rm testni -r Datoteku možete iskopirati u drugu datoteku ili direktorij naredbom cp. Ova naredba ima dva parametra, od kojih je prvi izvor, a drugi odredište. Na primjer, ako želite iskopirati datoteku prva.txt u direktorij /tmp otkucajte: cp prva.txt /tmp Istom naredbom možete napraviti drugu kopiju datoteke, npr. cp prva.txt druga.txt Ako želite da pri tome nestane njena originalna kopija, dakle ne da je kopirate nego da je premjestite (ili preimenujete) koristite komandu mv. mv prva.txt /tmp Unix/Linux poznaje i veze na datoteke koje omogućavaju više kopija iste datoteke, ali da na disku koristi samo jedan prostor. To se zove simbolička veza. Simboličke veze se kreiraju komandom ln. Sljedećim primjerom će se kreirati datoteka kopirana.txt koja je identična naredbi prva.txt. Primijetite da ako nakon ove naredbe mijenjate sadržaj datoteke prva.txt, da će se promjene odraziti i na datoteku kopirana.txt ln prva.txt kopirana.txt Da pronađete neku datoteku u dubokom stablu direktorija koristite naredbu find, na primjer find /home -name naziv.txt Naredba find pruža širok izbor mogućih načina pretraga. Iza parametra --name se navodi regularni izraz s opisom imena datoteka koje se pretražuju, a iza parametra --exec možete navesti komandu koja se izvrši svaki put kada se pronađe datoteka čije ime zadovoljava dati uslov. Unutar parametra exec, ime nađene datoteke se označava s otvorenom i zatvorenom vitičastom zagradom, a naredba završava znakovima naopake kose crte i tačka-zareza. Sljedeći primjer će iskopirati sve.c i.h datoteke iz svih poddirektorija direktorija /home/student u direktorij /tmp/arhiva find /home/student -name *.[hc] -exec cp { /tmp/arhiva \; Naredbom which saznajemo gdje se nalazi pojedina izvršna naredba. Tako, na primjer da saznamo u kom direktoriju se nalazi program sort, otkucajte which sort Za prikaz datoteke na ekranu koristite naredbu cat

218 Osnovne Unix/Linux naredbe komandne linije cat prva.txt Ova naredba može da ima više parametara, koji predstavljaju datoteke koje se redom ispisuju cat prva.txt druga.txt treca.txt Pošto veće datoteke prebrzo prelete na ekranu, prilikom ispisa, uvedene su komande more i less. Komandom more se prikazuje datoteka navedena kao njen parametar, praveći pauzu nakon svakog ispunjenog ekrana teksta, i čeka da pritisnete taster za razmak. Tasterom Q možete izaći iz programa more more prva.txt Naredba less predstavlja unapređenje naredbe more i omogućava kretanje strelicama unazad kako bi se vidio već pregledani tekst. less prva.txt Da vidite samo prvih deset linija datoteke, koristi se naredba head, na primjer head prva.txt Da obrišete konzolni prozor koristite clear Da obnovite ispravno funkcionisanje konzolnog prozora ako počne prikazivati čudne znakove umjesto slova koristite reset Ako želite izlaz iz neke komande umjesto na ekran proslijediti u datoteku, koristite znak za redirekciju >, na primjer ls > spisak.txt Ako se znak za redirekciju udupla, izlaz se nadovezuje na postojeću datoteku, na primjer ls /etc >> spisak.txt A ako želite izlaz iz jedne komande proslijediti kao ulaz u drugu komandu koristi se znak uspravne crte, na primjer, da se datoteka spisak.txt prikaže sortirano sa pauzom nakon svake strane, koristite: cat spisak.txt sort more Ako komanda prihvata ulaz sa tastature, tada možete čitati podatke iz datoteke, npr: fdisk <priprema.txt Ako je izlazni tekst takav da staje u jedan red, on može postati argument neke naredbe. Na primjer, da vidite zauzeće prostora trenutnog direktorija otkucajte: du `pwd` Naredba tar spaja više datoteke u jednu ili raspakuje iz nje. To je korisno za arhiviranje i prenošenje preko Interneta. Kada se naredba tar koristi s parametrom -c tada se spaja više datoteka u jednu, a s parametrom -x se ovakva datoteka raspakuje. Izlaz iz naredbe tar se često prosljeđuje komandama gzip, compress ili bzip2 koje zbirnu datoteku kompresuju. Sljedeći primjer kompresuje direktorij home u datoteku home.tar.bz2 tar -c /home/ bzip2 > home.tar.bz2 Datoteka kreirana na prethodni način se može dekompresovati i raspakovati sljedećom naredbom bzip2 -dc home.tar.bz2 tar -x Za pretraživanje podataka unutar tekstualne datoteke možete koristiti komandu grep. Ovoj komandi prvi glavni parametar predstavlja traženi niz znakova a drugi je datoteka u kojoj se on traži. Na primjer, da nađete pojavu teksta proizvod u datoteci spisak.txt koristite:

219 9.15.Osnovne Unix/Linux naredbe komandne linije 219 grep proizvod spisak.txt Naredba grep je veoma moćna, jer omogućava pretraživanje složenijih izraza. Specijalni simboli ^ i $ predstavljaju početak i kraj linije. Tako se riječ root, ako je na početku reda u datoteci /etc/passwd traži s grep ^root /etc/passwd Pretraga za redovima koji završavaju znakom dvotačke u datoteci /etc/passwd se obavlja sa grep :$ /etc/passwd Posebno je korisna mogućnost složenih izraza. Unutar uglastih zagrada se može navesti skup znakova koji mogu doći na datom mjestu, dok znak tačke predstavlja bilo koji znak. Sljedeći primjer će prikazati sve redove gdje se javljaju prezimena poput Milić, Mašić, Mišić, Mešić, Molać iz datoteke imenik.txt grep M.[lš].ć imenik.txt Ako iza znaka tačke slijedi zvjezdica, ona se može više puta ponavljati. Tako, ukoliko pored prezimena navedenih u prethodnom primjeru želite izdvojiti prezimena Milanković, Malenković, Milanović, Mišanović itd iz datoteke imenik.txt koristit ćete grep M.[lš].*ć imenik.txt Izlaz iz naredbe cat se može proslijediti naredbi sed koja obavlja zamjene, brisanje i filtriranje linija. Najčešće korišteni parametar ove naredbe je komanda s koja vrši zamjenu. Tako na primjer za prikaz datoteke upute.txt tako da se riječ kompjuter zamijeni riječju računar otkucajte: cat upute.txt sed 's/kompjuter/računar/g' Naredbom sed je veoma moćna iako zna biti dosta nepregledna. Sljedeći primjer koji uklanja komentare i prazne redove iz datoteke s.txt najbolje ilustruje ta svojstva ove naredbe: cat s.txt sed '/ *#/d; /^ *$/d' Naredba sort sortira tekstualnu datoteku, dok uniq izbacuje ponovljene redove iz sortirane datoteke. Sljedeći primjer će napraviti uniju dvije datoteke: cat skup1.txt skup2.txt sort uniq Da dobijete informacije o broju linija, riječi i znakova u nekoj datoteci koristi se naredba wc, kao u sljedećem primjeru: wc skup1.txt Komande koje zahtijevaju veća prava možete pozvati s prefiksom sudo, na primjer da dodate novog korisnika otkucajte sudo adduser nakon čega trebate odgovoriti na pitanja. Nad svakom datotekom su definisani vlasnik, grupa i ostali korisnici, te njihova prava. Da bi korisnik safet dobio vlasništvo nad datotekom m.txt koristi se komanda chown. sudo chown safet m.txt Pripadnost datoteke grupi određuje se komandom chgrp. Da bi grupa studenti dobila vlasništvo nad datotekom m.txt koristi se komanda chgrp. sudo chgrp studenti m.txt Komanda chmod dodjeljuje prava vlasniku, članovima grupe i ostalim korisnicima. Svakom od njih u navedenom redu odgovara jedna oktalna cifra prava. Najčešće se koriste cifre 0 (nikakva prava), 4 (samo za čitanje), 5 (čitanje i izvršenje), 6 (čitanje i pisanje), 7 (puna prava). Tako se vlasniku datoteke m.txt dodjeljuju puna prava (7), grupi prava čitanja i izvršenja (5), a ostalim samo čitanja (4) nad datotekom m.txt sljedećom komandom

220 Osnovne Unix/Linux naredbe komandne linije sudo chmod 764 m.txt Spisak aktivnih programa možete dobiti komandom: sudo ps -A Komanda ps će vam za svaki od procesa dati njegov identifikacioni broj. Taj broj možete koristiti da nasilno prekinete zaglavljeni proces, na primjer, da prekinete proces s identifikacionim brojem 2212 sudo kill 2212 Ako iza komande slijedi znak &, ta komanda se izvršava bez komunikacije preko tastature, na primjer: cp velika odrediste & Prelazak na drugog korisnika obavlja se komandom su. Ako ova komanda nema parametra podrazumijeva se prelazak na korisnika root. U nekim Linux sistemima koristi se program sudo koji daje pojedinim korisnicima (zabilježeno u bazi podataka kojim) pravo da postanu root, bez poznavanja lozinke korisnika root. sudo su sudo su mirko Iz promijenjenog korisnika izlazite sa exit. Ponavljanje ove komande napušta komandnu školjku. exit Naredbama du i df možete vidjeti zauzeće trenutnog direktorija i svih montiranih particija. Naredba dd se koristi za kopiranje koje uključuje i uređaje koji nisu prave datoteke. Njeni parametri if, of, bs i count redom predstavljaju ulaznu datoteku, izlaznu datoteku, veličinu blokova i broj blokova koji se koristi. Tako na primjer, cijeli sadržaj CD-a u ISO datoteku se kopira sa sudo dd if=/dev/cdrom of=snimak.iso Da pristupite podacima na disk particijama koje nisu korištene u Linux datotečnom sistemu. Tako se particija treća particija prvog hard diska (/dev/sda3) povezuje s direktorijem /mnt/disk sljedećom komandom. sudo mount /dev/sda3 /mnt/disk Naredbom export možete dodijeliti vrijednost promjenjivoj okruženja. Toj promjenjivoj se kasnije pristupa s znakom dolar ispred njenog imena. Sljedeće dvije naredbe će dodijeliti vrijednost varijabli TESTNI i prikazati je. export IME=testni echo $IME Naredba wget preuzima datoteku s http sajta. Ona se najčešće koristi s jednim parametrom, URL koji predstavlja ime datoteke na udaljenom računaru. Uz parametar -c može se nastaviti prekinupto preuzimanje datoteke, a uz parametar -limit-rate može se ograničiti zauzeće mrežnih resursa. Sljedeći primjer koristi ove parametre. wget -c limit-rate=20k Da prikažete stanje mrežnih interfejsa koristite komande ethtool (za žičane) i iwconfig (za bežične uređaje) ili ifconfig (za sve uređaje) ethtool eth0 iwconfig eth1 ifconfig Da aktivirate, odnosno deaktivirate mrežni interfejs, koristite

221 9.16.Programiranje Unix školjke 221 sudo ip link set dev eth0 up sudo ip link set dev eth0 down Spisak IP adresa se dobija sa ip addr show Da pristupite dijeljenom direktoriju share na računaru //windows_box koji radi pod operativnim sistemom Windows otkucajte kao root sljedeću komandu, sudo mount -t smbfs -o fmask=666,guest //windows_box/share /mnt/w Gašenje računara iz komandne linije obavlja se komandom shutdown now. shutdown now Programiranje Unix školjke U BASH je manji broj komande interni: echo, printf, read, cd, pwd, pushd, popd, dirs, eval, set, unset, export, declare, typeset, readonly, getopts, source,., exit, exec, shopt, caller, true, false, type, hash, bind, help, a sve ostale su eksterne. Shell skripte služe za automatizaciju čestih zadataka koji se inače ne mogu obaviti jednom prostom naredbom iz komandne linije Da se pročitaju argumenti iz komandne linije, mogu se koristiti sljedeći specijalni skupovi znakova, Slika 124 $0 ime datoteke s skriptom $# ukupan broj argumenata (>=0) $1 1. argument $2 2. argument itd $* svi argumenti s kojim je skripta pozvana $@ slično kao $*, s time da "$@" ima isti efekt kao i "$1" "$2"... $$ procesni identifikator (PID) shella koji izvršava skriptu Slika 124: Bash, specijalni paametri Naredba shift pomjera argumente skripte: $1 postaje raniji $2, itd. a $# se smanjuje za jedan (naravno, ako je bilo argumenata). Bash skriptni jezik poznaje osnovne jezičke strukture. Najvažnija je if, koja uslovno izvršava dio koda. Njena struktura se sastoji if sekcije, obavezne then sekcije i opcionalnih else i elif sekcija.

222 Programiranje Unix školjke if naredba1 then naredba2 naredba3... fi if naredba1 then naredba2 naredba3... else naredba4 naredba5... fi if naredba1 then naredba2 naredba3... elif naredba4 naredba5... else naredba6 naredba7... fi Naredba if izvršava zadatu naredbu i ako je ona vratila izlazni status 0 (logička vrijednost "tačno") izvršava se niz naredbi iza then. Možete navesti i jednu ili više naredbi elif koje testiraju dodatne uslove ukoliko raniji testovi nisu uspjeli. Na kraju, možete dodati naredbu else koja izvršava niz naredbi koje iza nje slijede ako su sva ispitivanja uslova u if/elif klauzulama bila neuspješna. Kontrolna struktura if se završava ključnom riječju fi. U Bash skriptama se mogu naredbe razdvajati novim redovima ili znakom tačka/zarez. Na primjer if [ podjela == 0 ] then echo $t else ((t=$t/1024)) echo $t K fi se može pisati i kao if [ podjela == 0 ] ; then ; echo $t ; else ; ((t=$t/1024)) echo $t K ;fi Uloga tačka/zareza je drugačija nego u Pascalu ili C-u. Ona znači da želimo još naredbi u istom redu. Kontrolnom strukturom while možete ponavljati niz naredbi dokle god je neki uslov zadovoljen, dok kontrolna struktura until ponavlja niz naredbi sve dok uslov nije ispunjen. Sintaksa ovih naredbi je while naredba; do niz naredbi done odnosno: until naredba; do niz naredbi done Kontrolna struktura case omogućuje poređenje neke riječi i obradu pojedinih slučajeva. Opšti format je:

223 9.16.Programiranje Unix školjke 223 case riječ in slucaj1) lista naredbi 1 ;; slucaj2) lista naredbi 2 ;;... esac Naredba for se koristi za ponavljanje akcije nad skupom riječi ili datoteka: for ime_promjenljive [in lista_riječi] do niz naredbi done Varijablama u shell programima dodjeljuju se vrijednosti tako što se odmah iza njenog imena dopiše bez razmaka između znak "jednako", a sa desne strane znaka jednakosti varijabli se pristupa znakom $ ispred njenog imena. Naredba test je interna naredba koja se često koristi za ispitivanje uslova u kontrolnim strukturama. Argumenti naredbe test određuju vrstu testa. Izlazni status je 0 ako je test uspješan, a različit od nule ako je neuspješan. Naredba test se može i skraćeno zapisati uz pomoć uglastih zagrada. Npr. test $x -gt 2 se može zapisati kao [ $x -gt 2 ]. Obratite pažnju na razmake kojima su uglaste zagrade odvojene od susjednih riječi. Slika 125 prikazuje sve moguće kombinacije uslova u naredbi test. -e f da li postoji datoteka/direktorij s imenom f -f f da li je f obična datoteka -d f da li je f direktorij -r f da li skripta može čitati datoteku ili direktorij f -w f da li skripta može pisati datoteku ili direktorij f -x f da li skripta može izvršavati datoteku ili direktorij f -z str da li je string str prazan -n str da li je string str neprazan str1 = str2 jednakost stringova str1 i str2 str1!= str2 različitost stringova str1 i str2 str1 < str2 da li je str1 ispred str2 u abecednom redu str1 > str2 da li je str1 iza str2 u abecednom redu n1 -eq n2 da li su n1 i n2 jednaki n1 -ne n2 da li su n1 i n2 različiti n1 -lt n2 da li je n1 manji od n2 kao broj n1 -le n2 da li je n1 manji ili jednak n2 kao broj n1 -gt n2 da li je n1 veći n2 kao broj n1 -ge n2 da li je n1 veći ili jednak od n2 kao broj uslov1 -o uslov2 da li je zadovoljen bilo uslov1 bilo uslov2 uslov1 -a uslov2 testira da li je zadovoljen i uslov1 uslov2! uslov logička negacija zadovoljenosti uslova Slika 125: Poređenja, parametri test naredbe

224 Programiranje Unix školjke. Shell programi mogu uključivati funkcije koje se pozivaju kao da su skripte u posebnoj datoteci. Definicija shell funkcije ima sljedeći oblik: ime_funkcije () { niz naredbi Parametrima funkcije se može pristupati na isti način kao parametrima same skripte, npr. $2 predstavlja drugi parametar funkcije. Da budete upoznatiji s Bash programiranjem unesite sljedeći program u tekstualnu datoteku i snimite ga pod imenom testif. #!/bin/bash # Declare variable choice and assign value 4 choice=4 # Print to stdout echo "1. Bash" echo "2. Scripting" echo "3. Tutorial" echo -n "Molim odaberite riječ [1,2 ili 3]? " # Loop while the variable choice is equal 4 # bash while loop while [ $choice -eq 4 ]; do # read user input read choice # bash nested if/else if [ $choice -eq 1 ] ; then echo "Odabrali ste: Bash" else if [ $choice -eq 2 ] ; then echo "Odabrali ste: Scripting" else if [ $choice -eq 3 ] ; then echo "Odabrali ste: Tutorial" else echo "Odaberite riječi 1-3!" echo "1. Bash" echo "2. Scripting" echo "3. Tutorial" echo -n "Odaberite [1,2 ili 3]? " choice=4 fi fi fi done Kada ste otkucali i snimili datoteku testif, postavićete pravo izvršavanja nad tom datotekom za korisnika koji ju je kreirao chmod 755 testif Primjer isprobajte sa

225 ./testif 9.17.GUI GUI Većina operativnih sistema namijenjenim stonim računarima i laptopima danas koristi grafičko okruženje za rad, GUI. Prvi GUI je nastao u XEROX laboratoriji Palo Alto, a ostali popularni su oni koji su sastavni dio operativnih sistema Apple Lisa i Macintosh, Microsoft Windows i UNIX X. Ovakav korisnički interfejs lakši je za učenje od komandne linije, iako se ne mogu automatizovati određene aktivnosti koje pružaju skriptni jezici. Kao glavni ulazni interfejs koristi se miš uz tastaturu, a kod mobilnih uređaja dodirni ekran. Slika 126 Neka grafička okruženja raznih generacija Na slici Slika 126 dato je više GUI sistema, prvi Macintosh i novija verzija, rani Windows i noviji, te minimalistički TWM Window manager za Unix sisteme i napredni KDE, za Unix sisteme.

226 WINDOWS API GUI PROGRAM 9.18.WINDOWS API GUI PROGRAM Za ilustraciju GUI programiranja, ovdje će se uzeti Win32 API, koji je podržan od strane svih 32 - bitnih verzijawindowsa. Osnovni objekt na ekranu je pravougaono područje koje se zove prozor. Položaj i veličina prozora su jedinstveno određeni davanjem koordinata (u pikselima ) dva dijagonalno suprotna ugla. Prozor može sadržavati naslov, meni, alatnu traku, vertikalnu kliznu traku i horizontalnu kliznu traku. Windows koordinatni sistem stavlja ishodište u gornjem lijevom uglu i y povećava prema dolje, što se razlikuje od Dekartovih koordinata koje se koriste u matematici. Kada se stvara prozor, parametri određuju da li prozor može biti premješten od strane korisnika, mijenjati veličinu od strane korisnika, ili se pomicati. Programi moraju biti obaviješteni o promjenama u veličini njihovih prozora i moraju biti spremni na ponovno iscrtavanje sadržaja njihovih prozora u bilo koje vrijeme, čak i kad to najmanje očekuju. Kao posljedica toga, Windows programi su orijentisani na poruke. Korisničke akcije koje uključuju tastaturu ili miša su zarobljene od strane Windows-a i pretvore u poruke programu koje posjeduje prozor. Svaki program ima red poruka kome se šalju sve poruke koje se odnose na njega. Petlja glavnog programa lovi narednu poruku i pozove interni podprogram tu vrstu poruke. U nekim slučajevima, sam Windows može pozvati ove procedure direktno, zaobilazeći red poruka. Sljedeći primjer pokazuje program u C koristeći Windows API koji prikazuje osnovni prozor na ekranu. On se sastoji od četiri osnovna dijela: registracija prozorske klase, kreiranje i prikaz prozora, petlje koja prosljeđuje poruke i prozorske procedure koja ih obrađuje. Glavni program počinje funkcijom WinMain. Prvi parametar je identifikacija programa za ostatak sistema. Drugi parametar je prisutan samo zbog kompatibilnosti i više se ne koristi. Treći parametar, szcmd, je nulom završen niz koji sadrži komandnu liniju kojom je pokrenut program, čak i ako nije počeo od komandne linije. Četvrti parametar, icmdshow, govori da li početni prozor programa treba zauzimati cijeli ekran, dio ekrana, ili samo traku zadataka. #include <windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); const char g_szclassname[] = "mywindowclass"; int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX wc; HWND hwnd; MSG Msg; Svaki prozor mora imati povezani objekt klase koja definira njegova svojstva. Objekat tipa WNDCLASS ima 10 polja. Najvažnije polje je lpfnwndproc, koje je dugi ( tj., 32 - bitni ) pokazivač na funkciju koja upravlja porukama usmjerenim na ovaj prozor. Polje lpszclassname sadrži tekstualno ime klase prozora. U drugim poljima koja su ovdje inicijalizovana može se reći koje ime i ikonu koristiti u naslovnoj traci, a koji simbol će se koristiti za kursor miša. Nakon što je WNDCLASS inicijaliziran, RegisterClass je pozvan da Windows zna koji podprogram pozvati za smiještanje raznih događaja kroz red poruka.

227 9.18.WINDOWS API GUI PROGRAM 227 //Step 1: Registering the Window Class wc.cbsize = sizeof(wndclassex); wc.style = 0; wc.lpfnwndproc = WndProc; wc.cbclsextra = 0; wc.cbwndextra = 0; wc.hinstance = hinstance; wc.hicon = LoadIcon(NULL, IDI_APPLICATION); wc.hcursor = LoadCursor(NULL, IDC_ARROW); wc.hbrbackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszmenuname = NULL; wc.lpszclassname = g_szclassname; wc.hiconsm = LoadIcon(NULL, IDI_APPLICATION); if(!registerclassex(&wc)) { MessageBox(NULL, "Neuspjela registracija!", "Greska!", MB_ICONEXCLAMATION MB_OK); return 0; Drugi glavni dio Windows programa je kreiranje i prikaz prozora. Sljedeći poziv, CreateWindow, alocira memoriju za strukturu podataka prozora i vraća rukovatelj za referenciranje kasnije. Program zatim obavi još dva poziva u nizu, obavi prikaz prozora na ekranu, i na kraju ga popuni u potpunosti. // Step 2: Creating the Window hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, g_szclassname, "The title of my window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hinstance, NULL); if(hwnd == NULL) { MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION MB_OK); return 0; ShowWindow(hwnd, ncmdshow); UpdateWindow(hwnd); U ovom trenutku dolazimo do glavne petlje programa, koji se sastoji od dobavljanja poruke, njene konverzije u drugu poruku, a zatim prolazi natrag u Windows da Windows pozove proceduru za obradu. Ova procedura je ranije definisana kao polje u klasi prozora. // Step 3: The Message Loop while(getmessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); return Msg.wParam; Pri slanju poruke se pozove podprogram WNDPROC, koji upravlja raznim porukama koje se mogu poslati do prozora. Prvi parametar je oznaka prozora koji se koristi. Drugi parametar

228 X Window sistem je vrsta poruke. Treći i četvrti parametri mogu se koristiti za pružanje dodatnih informacija kada je to potrebno. Vrste poruka WM_CREATE i WM_DESTROY se šalju na početku i na kraju programa, respektivno. One daju programu priliku, na primjer, da se izdvoji memorija za strukture podataka, a zatim oslobodi. Treći tip poruke, WM_PAINT, je instrukcija programu da popuni prozor. Za razliku od tekst - baziranog sistema, u Windows programu se ne može pretpostaviti da sve što se nacrta na ekranu da će tamo ostati dok se ne obriše. Ostali prozori mogu biti prevučeni preko njega, meniji iscrtavati, pojavljivati iskočni prozori itd. Da Windows obavijesti program da mora ponovo iscrtati, on pošalje WM_PAINT poruku, koja također pruža informacije o tome koji dio prozora je prepisan, u slučaju da je lakše generisati taj dio prozora umjesto cijelog. Postoji mnogo više vrsta poruka. Da biste izbjegli nestabilno ponašanje kada neočekivane poruke stignu, najbolje je pozvati DefWindowProc na kraju WNDPROC da se pozove podrazumijevana obrada. // Step 4: the Window Procedure LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch(msg) { case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wparam, lparam); return 0; 9.19.X Window sistem U Unix sistemima se za grafiku koristi X terminal, koji vodi System X Window ( često je upravo zvao X ), razvijen na MIT-u kao dio projekta Athena. Jedan X terminal je računar koje radi na X softveru, a koji stupa u interakciju sa programima koji rade na udaljenom računaru. Program unutar X terminala koji prikuplja unos sa tastature ili miša i prihvata komande sa udaljenog računara naziva se X server. On komunicira preko mreže sa X klijentom koji rade na nekom udaljenom računaru. On im šalje poruke tastature i miša i prihvata komande ekrana od njih. Može izgledati čudno da se X server izvršava unutar terminala a klijenti na udaljenom računaru, ali posao je X servera da prikazuje sliku, tako da ima smisla da bude u blizini korisnika. Također je moguće pokrenuti X Window System na vrhu UNIX ili nekog drugog operativnog sistema. U stvari, mnogi UNIX sistemi pokreću X kao svoj standardni sistem prozora, čak i na samostalnoj mašina ili za pristup udaljenih računara preko Interneta. Protokol i rad sistema je identičan u svim slučajevima.

229 9.19.X Window sistem 229 Window menadžer Aplikativni program GTK+ QT Fltk XForms Athena Motif X toolkit XServer X klijentska bliblioteka (Xlib, XCB) Mreža ili isti računar Slika 127 X Window sistem X je samo sistem crtanja. To nije potpuni GUI. Da biste dobili potpuni GUI, drugi sloj softvera drže na vrhu. Jedan sloj je Xlib, što je skup biblioteka procedura za pristup funkcionalnost X (Slika 127) Ovaj primjer pokazuje kako izgleda osnovni X Window program koristeći Xlib. Njegov zadatak je da iscrta nekoliko pravougaonika na ekranu. Funkcijom XOpenDisplay se uspostavlja veza s X serverom. Njen parametar je ime servera i broj ekrana, a ako je NULL, preuzima se iz varijable okruženja DISPLAY. Ime je u formatu ime_računara:broj_servera.broj_ekrana, npr: video:0.1. Kao rezultat funkcije vrati se displej. Parametri funkcije XcreateSimpleWindow, koja kreira pravougaono područje su redom: displej, oznaka roditeljskog prozora, x i y koordinata gornjeg lijevog ugla područja, širina i visina područja, boja ivice (RGB) i boja područja. Funkcijom XMapWindow prozor postaje vidljiv na ekranu. Parametri koji opisuju ponašanje likova (boja, tekstura) koji se iscrtavaju na ekranu opisuju se grafičkim kontekstom. On je uveden radi smanjenja saobraćaja prema Xlib biblioteci, jer se čuva na serveru. Grafički kontekst se kreira s XCreateGC, čiji su parametri oznaka displeja, površine za crtanje (prozor), te konstante kojima se postavlja inicijalno stanje grafičkog konteksta. Mnoge funkcije kao parametre imaju displej, oznaku prozora, grafički kontekst ili kombinaciju ovih parametara. Tako npr. funkcijom XSetForeground se postavi boja, a s XDrawRectangle iscrta pravougaonik unutar prozora. I X sistem, slično Win32 API je upravljan događajima. Funkcijom XselectInput se određuje skup događaja na koje će prozor odgovarati. Tada ih je moguće raspoređivati u petlji koja poziva XNextEvent funkciju, koja kupi događaje iz reda čekanja.

230 Window manager, Display manager, Session manager i Desktop #include <X11/Xutil.h> #include <X11/Xos.h> #include <X11/Xatom.h> #include <X11/keysym.h> Display *dis; Window win; XEvent report; GC gc; int main() { int i; dis = XOpenDisplay(NULL); win = XCreateSimpleWindow(dis, RootWindow(dis, 0), 1, 1, 500, 500, 0, 0x00FF00L, 0x00FF00L); XMapWindow(dis, win); gc = XCreateGC(dis, win, 0, 0); XSetForeground(dis, gc, 0xFF0000L); XSelectInput(dis, win, ExposureMask KeyPressMask ButtonPressMask); while (1) { XNextEvent(dis, &report); switch (report.type) { case Expose: for ( i=1; i<200 ; i+=30) XDrawRectangle(dis, win, gc, i,i, i,i); XFlush(dis); break; case KeyPress: if (XLookupKeysym(&report.xkey, 0) == XK_q) { return 0; break; return 0; Pošto Xlib pruža samo osnovne mogućnosti iscrtavanja likova, on se dopunjuje sa još dvije grupe biblioteka. Jedna grupa se zove X-toolkit ili intrisic i pruža podršku da se iscrtaju elementi korisničkog interfejsa koji se zovu widget, (meniji, dugmad) ali ih još ne iscrtava. Druga grupa zaista iscrtava te komponente i zovu se toolkit. Ima više toolkita (GTK, QT, Motif, FLTK, OpenLook...) Window manager, Display manager, Session manager i Desktop Sam X Sistem u kombinaciji s toolkitima iscrtava elemente grafičkog interfejsa, ali je potreban i softver koji će crtati ukrase oko prozora, omogućiti njihovo pomjeranje, širenje, maksimiziranje uz dodatke elemenata kao što je Start dugme, ikona s značenjem i slično. Taj program se zove Window manager, koji je promjenjiv u toku rada. Postoji više njih, kao što su minimalistički twm, Metacity, Compiz, kwm itd. Razlikuju se u izgledu i memorijskim

231 9.21.Zadaci 231 zahtjevima. Window menadžer je obični pozadinski proces i registruje se s X serverom da se pokrene zajedno s njim. Da bi korisnici mogli da se prijave na računarski sistem već u startu u grafičkom režimu rada, koristi se Display manager. On može raditi lokalno ili preko mreže. Kada je display manager aktivan, ovi korisnici startuju sesiju navodeći važeću kombinaciju korisničkog imena i lozinke. Display manager također brine o pokretanju X servera pri podizanju ili eventualnom padu. Session manager čuva stanje aplikacije, tj. položaje i sadržaj svih otvorenih prozora. Korisnik može da se odjavi i ponovo prijavi s sačuvanim položajem prozora. Postoji poseban protokol za komunikaciju između window managera i session manager-a. Ova tri menadžera se mogu pisati odvojeno. Ali, ako se pišu sa zajedničkim ciljem da čine jedinstvenu cjelinu, dobija se Desktop okruženje. U njemu sve aplikacije imaju isti izgled. Na primjer prozori za izbor datoteke ili štampača su jedinstveni, kao i načini iscrtavanja prozora. Pokretanje pojedinačnih programa (ali samo onih specijalno pisanih za to desktop okruženje ili bar toolkit na kom je njegov window manager zasnovan) je takođe ubrzano, jer su dinamičke biblioteke, koje oni koriste, već u memoriji dok traje sesija. Primjeri desktopa su KDE, CDE, LXDE, EDE, Gnome itd Zadaci Zadatak 1: Napisati BASH shell program koji kao parametar prima ime direktorija, prijavi grešku ako parametar nije direktorij. Ako je sve u redu, kopira sve datoteke u tom direktoriju na štampač (uređaj /dev/lp0). Rješenje: #!/bin/bash if [ -d $1 ] then for i in $1 do if [ -f $i ] ; then cp $i /dev/lp0 fi done else echo $1 nije direktorij exit 1 fi

232 Magnetni diskovi 10.Sekundarna memorija Sadržaj sekundarnih memorija se za razliku od interne radne memorije, ne gubi nakon isključivanja napajanja. Sekundarne memorije služe za smiještanje operativnog sistema, podataka i programa. Magnetni disk je najznačajnija komponenta eksterne memorije. Da bi se postigle bolje performanse i veća dostupnost za servere i veće sisteme se koristi RAID disk tehnologija. RAID predstavlja familiju tehnika koja koristi višestruke diskove kao paralelni niz za trajno smiještanje podataka sa ugrađenom redundansom a za kompenziranje mogućih grešaka. Osim sekundarne memorije, značajna komponenta računarskih sistema je eksterna optička memorija. Koriste se i sistemi sa magnetnim trakama u svrhu arhiviranja podataka. Procesor računara i disk komuniciraju putem kontrolera diska. Kontroleri različitih diskova pružaju isti interfejs ka ostatku računara Magnetni diskovi Hard disk (ili tvrdi disk) je uređaj koji piše i čita podatke i služi za trajno smiještanje podataka i nakon gašenja računara. On se sastoji od elektroničkog i mehaničkog dijela. Mehanički dio se sastoji od 5 glavnih dijelova (Slika 128): 1. Magnetna ploča 2. Glava za čitanje/pisanje 3. Pobuđivačka kazaljka 4. Pobuđivač 5. Osovina Većina sistema imaju glavu za čitanje i glavu za pisanje. Tokom operacija čitanja i pisanja glava miruje dok ploča rotira ispod glave. Mehanizam pisanja zasnovan je na principu magnetnog uzorka Organizacija diska Podaci se zapisuju u koncentrične krugove na disku koji se zovu staze ili trake (Slika 129). Slika prikazuje raspored podataka. Susjedne staze su odvojene međuprostorom. Ovo sprečava ili minimizira greške nastale zbog pogrešnog poravnanja glave ili interferenciju magnetnog polja. Staze su podijeljene na sektore. Trake sadrže veliki broj sektora a oni mogu biti fiksne ili varijabilne veličine. Uobičajeni su sektori fiksne veličine 512 bajta. Da bi se izbjegli zahtjevi na sistem za nerealnom preciznošću, uvode se međuprostor između sektora. Trake su imenovane od vanjske strane diska (sektor 0) prema centru. S obzirom da se u pojedinom uređaju nalazi više ploča, uvodi se i pojam cilindra. Skup svih traka jednako udaljenih od osovine na svim pločama čine jedan cilindar. Ploča Kazaljka Pobuđivač Staza Sektor Slika 128 Hard disk Osovina Glava za ćitanje i pisanje Cilindar Slika 129 Geometrijski elementi diska

233 10.3.Klasteri i zone Pojedini sektori grupisani i iskorišteni za zapis podataka nazivaju se klasteri (clusters). Kako pokazuje Slika 130 klasteri se sastoje od više susjednih sektora lociranih na istoj stazi. Operativni sistem se brine o iskorištavanju sektora i njihovom grupisanju u klastere. U idealnom slučaju pojedine datoteke će biti zapisane u jednom kontinuiranom klasteru, u stvarnosti s 10.3.Klasteri i zone 233 obzirom da se datoteke s vremenom povećavaju, smanjuju, brišu i dodaju datoteke će biti više manje razbacane u više klastera na disku. Ova pojava se naziva fragmentacija i dovodi do smanjivanja brzine pristupa datotekama. (obično OS ima alat za preslaganje datoteka u kontinuirane klastere što se naziva defragmentacijom). Magnetna tehnologija stalno napreduje, pa je gustina staza sve veća, što iskazuje efikasnije korištenje magneta. Prvi hard disk za personalne računare, proizveden 1980, ST-506 imao je kapacitet od 5 megabajta, sa 4 glave, 153 cilindra i 17 sektora po stazi, uz brzinu pritupa 85 ms. U godini, ST-1000NM0021 dostiže kapacitet od 1TB, uz brzinu pristupa 8,5 ms, a imao je takođe 4 glave, ali cilindara i u prosjeku 1977 sektora po stazi. Kaže se u prosjeku, jer je u međuvremenu uočeno da unutrašnje staze, odnosno staze bliže centru, imaju manju površinu pa samim tim i manje magneta, a na spoljnje staze stoga možemo smjestiti više sektora nego na unutrašnje. Zbog toga Prostor između sektora Klaster od četiri sektora Pojedinačni sektor Slika 130 Grupisanje sektora u klastere Slika 131 Zonski zapis se uvodi tehnika zona na disku gdje se cilindri grupišu u zone iste gustine (ZBR - zone recording) (Slika 131). Na taj način povećava se i kapacitet diska i brzina čitanja sa medijuma ali kontrolna elektronika ima složeniji zadatak. Od godine gustina zapisa je povećana uvođenjem zapisa oblika crijepa (SMR - Shingled magnetic recording) kod kojih se upis u jednu stazu preklapa dijelom i na dvije susjedne. To bi normalno usporavalo upis, jer se pri ažuriranju jedne staze moraju pročitati i obije susjedne staze, pa zatim upisati sve tri. No, pošto moderni diskovi imaju i veliku količinu RAM-a u kome će se nalaziti nedavno čitani podaci i specijalni softver, ovo usporenje se neće primijetiti. Kapacitet diska predstavlja količinu podataka koja stane na disk. Mjeri se u bajtima. Računamo ga kao proizvod broja glava, cilindara (staza po ploči), prosječnog broja sektora po stazi i broja bajtova po sektoru. Najvažnije tehničke karakteristike magnetskih diskova omogućavaju podjele diskova u razne kategorije. Prema načinu kretanja glave diskove dijelimo na one sa fiksnom glavom (jedna po stazi) i sa pokretnom glavom (jedna po površini). Diskovi sa fiksnom glavom se odavno ne proizvode, zbog vrlo visoke cijene, ali postižu daleko veće performanse.

234 Parametri koji određuju performanse diska Po zamjenjivosti diskovi mogu biti uklonjivi i neuklonjivi. U pojedinim slučajevima se može ukloniti sadržaj bez uklanjanja samog uređaja (diskete), a u nekim slučajevima se može ukloniti uređaj bez prekida rada računara (USB diskove). Mehanizam glave omogućava klasifikaciju diskova na dva tipa. U prvom slučaju, mehanizam dolazi u fizički kontakt sa površinom diska tokom operacija čitanja i pisanja. Ovaj slučaj se koristi kod disketa (floppy disk). U drugom slučaju (Winchester disk), glava za čitanje/pisanje je postavljena na fiksnu udaljenost iznad površine diska dozvoljavajući međuprostor ispunjen zrakom. Kod tog tipa diska je značajno uočiti odnos gustine podataka i zračnog međuprostora. Što je uža glava za čitanje/pisanje, to njena udaljenost od površine treba biti manja kako bi ispravno čitala i pisala. Uska glava povlači za sobom usku stazu a samim tim veću gustinu podataka a to je poželjno. S druge strane, što je glava bliže površini diska veća je mogućnost greške zbog nečistoća i nesavršenosti. Winchester glave su hermetički zatvorene i gotovo potpuno bez prisustva nečistoća. Glave za čitanje/pisanje su dizajnirane tako da mogu raditi bliže površini diska nego konvencionalne rigid disk glave, i zato dozvoljavaju veliku gustinu podataka. Diskovi se mogu dijeliti i po broju ploča na diskove s jednom ili više ploča. Diskovi često sadrže više ploča koje se nalaze jedna iznad druge a sadrže i više ručica sa glavama za čitanje odnosno pisanje. Pored ovoga, diskovi se mogu dijeliti i po broju iskorištenih strana svake ploče. Za većinu diskova magnetni omotač se nalazi sa obje strane diska tada je disk dvostrani (engl. double sided). Neki jeftiniji diskovi se koriste single-sided diskove. Geometrija diska je u opštem slučaju određena brojem magnetnih površina odnosno glava za čitanje i pisanje, brojem cilindara i sektora, a taj podatak se čuva na posebnoj memorijskoj lokaciji sa baterijskim napajanjem - CMOS RAM. Sa trodimenzionim adresiranjem «glava, cilindar, sektor» (engl. head, cylinder, sector) se može pristupiti svim dijelovima diska. U novijim hard diskovima, sa ZBR, SMR i većim fizičkim sektorima, ovi podaci služe samo kao spoljna informacija operativnom sistemu i nemaju veze s stvarnim brojem glava, cilindara i bajtova po sektoru, ali omogućavaju korištenje novijih diskova i na starijih operativnim sistemima koji nemaju pripremljene strukture podataka u memoriji za rad s diskovima većih kapaciteta Parametri koji određuju performanse diska Kada disk uređaj radi, disk rotira konstantnom brzinom. Za čitanje i pisanje glava mora biti pozicionirana na željenu stazu na početak željenog sektora na toj stazi. Za izbor staze glava se pokreće na pokretnom sistemu dok ne dođe na željeni sektor od ruba diska ka sredini i obrnuto. Na sistemu sa pokretnom glavom vrijeme potrebno da se glava pozicionira na željenu stazu naziva se vrijeme traženja (engl. seek time). Nakon toga disk rotira dok se željeni sektor ne nađe ispod glave. Vrijeme potrebno da se početak željenog sektora poravna sa glavom naziva se rotaciono kašenjenje (engl. rotational delay). Vrijeme traženja i rotaciono kašnjenje čine vrijeme pristupa. Kad se glava nalazi na ispravnoj poziciji nastupa prenos podataka i vrijeme koje je za to potrebno naziva se vrijeme prenosa (engl. transfer time). Pored vremena pristupa i vremena prenosa podataka, postoji nekoliko vremena kašnjenja (queuing delays) povezana sa U/I operacijama. Kada proces pokrene jedan U/I zahtjev, mora prvo čekati u redu na uređaj sve dok taj uređaj ne bude dostupan. U trenutku kada je uređaj dodijeljen, počinje vrijeme traženja.

235 10.5.Formatiranje diska i pravljenje particija 235 Vrijeme traženja je vrijeme potrebno da se ručica diska pomjeri na zahtijevanu stazu. Ovo vrijeme se sastoji od dvije ključne komponente: inicijalno vrijeme uspostavljanja i vrijeme koje je potrebno za prelazak do željene staze. Na žalost, vrijeme prelaska nije linearna funkcija broja staza i uključuje i vrijeme od pozicioniranja ručice iznad željene staze sve dok se ne potvrdi identifikacija staze. Rotaciono kašnjenje: Diskovi rotiraju brzinom koja se kreće od 3600 rpm (Revolutions Per Minute) do 15,000 rpm. Floppy diskovi rotiraju sa b r z i n a m a tipično između 300 i 600 rpm. U najgorem slučaju, glava se mora pomjeriti od staze 0 do staze najbliže centru, a u prosjeku pola rotacije. Za minifloppy koji rotira sa 300rpm, srednje rotaciono kašnjenje je 100ms, a za hard disk koji rotira sa 3600rpm ono se smanjuje na 8,3ms. Vrijeme prenosa podataka na disk i sa diska zavisi od rotacione brzine diska na slijedeći način: b T = rn gdje je T - vrijeme prenosa, b - broj bajta koji trebaju biti preneseni, N - broj bajta na stazi, r - rotaciona brzina, rpm. Tako da ukupno prosječno vrijeme pristupa može biti izraženo sa: 1 b Ta = Ts+ + 2r rn gdje je T s prosječno vrijeme traženja. Kod tehnologije zona broj bajta po stazi je varijabilan a to komplikuje računanje. Generalni vremenski dijagram dat je na slici Slika 132. Uređaj zauzet Čekanje da uređaj bude spreman Čekanje na kanal Vrijeme pristupa Rotaciono kašnjenje Prijenos podataka Slika 132 Vremenski dijagram pristupa disku 10.5.Formatiranje diska i pravljenje particija Formatiranje diska je proces kod koga se na magnetni medij upisuju oznake koje predstavljaju granice staza i sektora, a neformatiran disk se ne može koristiti. Prva vrsta formatiranja je formatiranje diska na niskom nivou. Na nekim diskovima (MFM, raniji SCSI) može ga raditi korisnik, ali se danas uglavnom radi fabrički. Suština ovog formatiranja je da se pripreme se signali za prepoznavanje (Preamble) i korekciju grešaka sektora (ECC).(Slika 133) Preambula Podaci ECC Slika 133 Sektor formatiran na niskom nivou sa redundantnim podacima Druga vrsta formatiranja je tzv. formatiranje visokog nivoa (eng. high level formating) DOS/Windows operativnih sistema što predstavlja formatiranje datotečnog sistema. Ovim se ne formatira disk na niskom nivou, nego se dodjeljuje uloga postojećim sektorima. Kod formatiranja na visokom nivou, često se ne formatira cijeli disk, nego samo jedan njegov dio (particija). Za dalje korištenje pod operativnim sistemom, nakon formatiranja na niskom nivou, disk se priprema u dvije faze.

236 Transformacija logičkih sektora u fizičke Prva faza predstavlja dijeljenje diska na particije. Na disku se može napraviti samo jedna particija ili se prema potrebi može napraviti nekoliko particija koje se ponašaju kao zasebni diskovi. Više particija je potrebno kad želimo instalirati više operativnih sistema. Disk se često dijeli na particije i kada je instaliran samo jedan operativni sistem, na ovaj način je lako razdvojiti sistemske fajlove od korisničkih.informacije o svim particijama diska su zapisane u nultom logičkom sektoru, nulti sektor, nulte staze na nultoj površini diska. Ovaj sektor se naziva glavni startni zapis (engl. Master Boot Record). BIOS pristupa MBR-u kod svakog pokretanja računara. MBR sadrži program koji očitava particionu tabelu, provjerava koja je particija aktivna i očitava prvi sektor aktivne particije - startni sektor (engl. boot sector). U startnom sektoru se nalazi mali program čijim pokretanjem započinje bootstrap rutina odnosno učitavanje operativnog sistema u memoriju. Druga faza pripreme diska je formatiranje visokog nivoa, kada se particije popune datotečnim sistemom Transformacija logičkih sektora u fizičke Radi praktičnijeg računanja, tri koordinate (glava, sektor, cilindar) se transformišu u jednu, logički broj sektora. Moderni diskovi u svojim kontrolerima imaju čak mogućnost da se disku pristupa navodeći direktno taj jedan logički broj, a da se ta konverzija u tri koordinate obavi interno. Sistem se zove LBA (logical block access). Ima više načina da se obavi ova transformacija, na primjer da se poredaju u jedan niz od logičkog sektora 0 svi sektori nulte staze, pa svi sektori prve staze itd. sve do zadnjeg sektora zadnje staze (Slika 134a). No, ponekad se radi poboljšanja performansi sekvencijalnog čitanja ova transformacija obavlja i drugačije. a) b) c) Slika 134 Prosta transformacija, preplitanje i zakretanje Na sporijim računarima, može se desiti da je disk rotacijom došao na naredni sektor prije nego je završen prijenos prethodnog sektora u bafere. Kada dođe zahtjev za čitanje narednog sektora, moralo bi se sačekati cijela rotacija diska. Da bi se to izbjeglo, koristi se preplitanje (Slika 134b). Logički sektori se ne redaju sekvencijalno u fizičke, nego se preskače po jedan ili dva sektora. Na primjer, za disk čija staza ima 40 sektora, ako logički sektor broj 80 treba da se nalazi na fizičkom sektoru 0, glave 0, cilindra 2, logički sektor broj 81 će se smjestiti na fizički sektor 2, glave 0, cilindra 2,... logički sektor broj 99 će se smjestiti na fizički sektor 38, glave 0, cilindra 2, nakon čega se popunjavaju preskočeni sektori, pa će se logički sektor 100 smjestiti na fizički sektor 1, glave 0, cilindra 2, logički sektor 101 smjestiti na fizički sektor 3 glave 0, cilindra 2, itd. Moderni diskovi imaju dovoljno veliku brzinu pa preplitanje nije potrebno.

237 10.7.Raspoređivanje zahtjeva za rad sa diskom 237 Nekada se koristi i zakretanje (skew). Da bi se ubrzalo sekvencijalno logičkih čitanje sektora koji se nalaze na različitim stazama, brojanje logičkog sektora po završetku staze se ne treba nastaviti od nultog sektora sljedeće staze, jer bi dok glava pređe na narednu stazu zbog rotacije diska potrebni sektor već prošao i morao bi se sačekati cijeli krug. Umjesto toga naredni logički sektor se nastavlja od onog fizičkog sektora koji bi bio na poziciji glave nakon pređenog vremena u njenom pozicioniranju na sljedeću stazu (Slika 134b) Raspoređivanje zahtjeva za rad sa diskom U višeprocesnom okruženju, u jednom trenutku postoji veliki broj zahtjeva za rad sa diskom. Pravilnim raspoređivanja ovih zahtjev (engl. disk scheduling) može se skratiti ukupno vrijeme pozicioniranja ili rotaciono kašnjenje. Svaki zahtjev sadrži informacije o tome da li je u pitanju operacija čitanja ili pisanja, adresu bloka na disku, adresu memorijskog bafera i broj bajtova koje treba prenijeti. Više zahtjeva može stići istovremeno a u jednom trenutku može biti obrađen samo jedan zahtjev. Za raspoređivanje pristiglih zahtjeva za rad sa diskom postoji više algoritama: FCFS, SSTF, SCAN, C-SCAN, LOOK i C-LOOK FCFS FCFS (first come, first served) je najjednostavniji algoritam kod koga se zahtjevi opslužuju onako kako pristižu. Ovaj algoritam iako ravnopravno tretira sve zahtjeve daje slabije performanse. Performanse zavise od pokretanja glave za čitanje i pisanje a performanse će slabiti sa većim pomjeranjem. Zahtjevi: 105, 45, 60, 20, 82, 150, 12, Početni cilindar = Slika 135 Algoritam FCFS Razmotrimo sljedeći primjer. Pretpostavimo da disk ima 160 staza i da imamo sekvencu zahtjeva: 105, 45, 60, 20, 82, 150, 12. Pretpostavimo da je glava za čitanje/pisanje inicijalno postavljena na stazi 50. Slika 135 prikazuje kojim redom će glava preći cilindre. U ovom primjeru glava za čitanje/pisanje će preći 438 cilindara SSTF SSTF algoritam (shortest seek time first) kod opsluživanja zahtjeva od pristiglih zahtjeva bira onaj koji će izazvati najmanje pomjeranje glave od date tačke. Algoritam ima

238 SCAN sličnosti sa SJF algoritmom raspoređivanja procesa i ima optimalno vrijeme pozicioniranja. Za isti primjer kao kod FCFS, pređeni put je 248 cilindara (Slika 136). Korištenje ovog algoritma, međutim, može dovesti do problema izgladnjivanja(engl. starvation). Glave se mogu zadržati dugo u jednoj zoni opslužujući zahtjeve za koje je potrebno malo pomjeranja tako da se može desiti da udaljeni zahtjevi veoma dugo čekaju. Zahtjevi: 105, 45, 60, 20, 82, 150, 12, Početni cilindar = Slika 136 Algoritam SSTF SCAN SCAN algoritam ili kako se još često naziva, elevator algoritam naizmjenično pomjera glave do kraja diska i nazad pri tome opslužuje zahtjeve na koje nailazi na tekućem cilindru. Zahtjevi: 105, 45, 60, 20, 82, 150, 12, Početni cilindar = Slika 137 Elevator ili SCAN algoritam Ovaj algoritam rješava problem izgladnjivanja. Za spomenuti primjer, pređeni put je 256 cilindara (Slika 137).

239 10.11.C-SCAN C-SCAN Kružni SCAN algoritam (C-SCAN, circular SCAN), je varijanta algoritma SCAN i on razrješava problem favorizovanja unutrašnjih cilindara. Razlika u odnosu na SCAN je u tome što se zahtjevi opslužuju samo u jednom smjeru, kad glava dođe do posljednjeg cilindra, pomjera se na početak a pri povratku na početak ne opslužuje zahtjeve. Uz raniji primjer, ako se povratni put ne računa (ima logike, jer se glava u toj fazi može kretati brže), pređeno je 154 cilindra (Slika 138). Zahtjevi: 105, 45, 60, 20, 82, 150, 12, Početni cilindar = Slika 138 Algoritam C-SCAN LOOK i C-LOOK Algoritmi LOOK i C-LOOK su modifikacija algoritama SCAN. Glave se ovdje ne pomijeraju od početka do kraja diska nego do posljednjeg zahtjeva koji se nalazi u tom smjeru. LOOK opslužuje zahtjeve u oba smjera, dok C-LOOK samo u rastućem smjeru do posljednjeg zahtjeva u tom smjeru. Zahtjevi: 105, 45, 60, 20, 82, 150, 12, Početni cilindar = Slika 139 Algoritam LOOK Za navedeni primjer LOOK algoritma, pređeni put je 243 cilindara (Slika 139). Ako se povratni put ne računa, CLOOK algoritam ima najkraći pređeni put (133 cilindra).

240 Raspoređivanje diska u multimedijalnim sistemima Zahtjevi: 105, 45, 60, 20, 82, 150, 12, Početni cilindar = Slika 140 Algoritam C-LOOK Raspoređivanje diska u multimedijalnim sistemima Da se izbjegnu trzaji u audio/video datotekama, postoje i posebni algoritmi za raspoređivanje u multimedijalnim sistemima. Ovi algoritmi su potrebni i kod nemehaničkih diskova. Jedan algoritam je najraniji rok prvo, Earliest-Deadline-First (EDF). Uz blokove, koji predstavljaju dio neke video datoteke se evidentira i u kojem trenutku je potrebno učitati taj blok. Redoslijed očitavanja blokova se određuje prema roku kada je traženi blok potrebno učitati, tj. da se ranije potrebni blokovi ranije učitavaju. Drugi algoritam je SCAN-EDF, koji je kao EDF, ali se blokovi s jednakim rokom trebaju očitavati po SCAN algoritmu Povećanje pouzdanosti Na povećanje pouzdanosti diskova može se uticati na više načina, kao što su korekcioni kodovi u formatu niskog nivoa, mapiranje loših sektora, uvođenje RAID struktura itd. Korekcioni kodovi (ECC) omogućavaju da se u slučaju neispravnosti jednog bita i dalje dobijaju ispravni podaci, odgovarajućim računom. Oni su najčešće ugrađeni u sastavni dio sektora formatiranog na niskom nivou i nevidljivi su za operativni sistem R R R R R R R R R R Ispravna staza s rezervnim blokovima Prepoznat defekt u sektoru 9 Razrješenje premoštenjem Razrješenje relokacijom Slika 141 Rezervni sektori Veći defekti se prepoznaju razlikovanjem upisane i naknadno pročitane vrijednosti. Ako se uoči takva razlika, sektor se proglašava neispravnim i treba ga izbaciti iz upotrebe. Loše sektore može obraditi disk kontroler ili OS. U slučaju da to radi kontroler, on ima tablicu kojom

241 10.15.RAID strukture 241 zamijeni blokove na logičkoj poziciji rezervnim blokovima. To može uraditi i operativni sistem, praveći drugačije tablice, često definisane datotečnim sistemom. Sljedeći primjer na slici Slika 141pokazuje dva načina mapiranja lošeg sektora, prvi je njegovo smiještanje u odvojeni rezervni sektor, a drugi je jedno preskakanje mjesta RAID strukture RAID strukture se koriste za realizaciju stabilnih sistema i koriste princip ogledala. Brzina rada sa sekundarnom memorijom je značajno manja od brzine procesora i interne memorije. Zbog ove razlike sistemi sekundarne memorije postaju glavni fokus rada na poboljšanju ukupnih performansi računarskog sistema. Uočeno je da se poboljšanje performansi postiže korištenjem višestrukih paralelnih sistema. To vodi i razvoju niza diskova koji rade nezavisno i paralelno. Sa više diskova, odvojeni U/I zahtjevi se mogu obraditi paralelno, sve dok podaci koji se zahtijevaju leže na odvojenim diskovima. Osim toga jedan U/I zahtjev može biti obrađen paralelno ako podaci kojima se pristupa leže distribuirano na više diskova. Pored performansi, višestruki diskovi su bitni i radi pouzdanosti. Kada se koriste višestruki diskovi postoji različiti načini za organizaciju podataka kao industrijski standardi poznati pod nazivom RAID (Redundant Array of Independent Disks). D1 D2 D3 D4 D5 D6 Raid 0: Odsječci bez redundancije D1 D2 D3 C1 C2 C3 Raid 1: Kopirani diskovi D1 D2 D3 P P P Raid 2: Korekcioni kodovi D1 D2 D3 D4 D5 P Raid 3: Paritet po bajtovima D1 D2 D3 D4 D5 P Raid 4: Paritet po blokovima D1/P D2/P D3/P D4/P D5/P D6/P Raid 5: Distribuirani paritet po blokovima D1/P/Q D1/P/Q D1/P/Q D1/P/Q D1/P/Q D1/P/Q Raid 6: Dvostruki paritet Slika 142 RAID sistemi RAID šema se sastoji od 7 nivoa (od nivoa 0 do nivoa 6). Ovi nivoi ne predstavljaju hijerarhijski odnos nego različite arhitekturalne dizajne koji dijele tri osnovne zajedničke karakteristike (Slika 142). RAID je skup fizičkih diskova koje operativni sistem vidi kao jedan logički disk. Podaci su raspoređeni preko niza fizičkih diskova.

242 RAID nivo 0 Redudantni kapacitet se koristi za smiještanje paritetne informacije koja garantuje oporavak u slučaju ispada diska (osim kod RAID 0). Detalji druge i treće karakteristike razlikuju se za različite RAID nivoe. RAID 0 ne podržava treću karakteristiku. Slijedi pregled svih RAID nivoa. Tabela daje podatke za 7 RAID nivoa. Nivo 2 i 4 se rijetko koriste RAID nivo 0 RAID nivo 0 nije pravi član RAID familije s obzirom da ne uključuje redundansu. Međutim, postoji nekoliko područja primjene gdje su performanse i kapacitet te niža cijena prioritet u odnosu na pouzdanost. Kod RAID 0 sistema korisnici i sistemski podaci su distribuirani preko cijelih diskova u nizu. Ovo ima uočljive prednosti u odnosu na korištenje jednog velikog diska. Ako U/I zahtjevi čekaju na dva različita bloka podataka postoji velika šansa da su ti blokovi na različitim diskovima. Zato ti zahtjevi mogu biti obrađeni paralelno. Osim jednostavnog distribuiranja podataka preko niza diskova, podaci su podijeljeni na trake (striped) što se najbolje može shvatiti posmatranjem slike. Svi korisnici i podaci se posmatraju kao da su smješteni na jedan veliki logički disk. Disk je podijeljen na trake, koje mogu biti fizički blokovi, sektori ili neke druge jedinice. Ove trake su po round robin metodi mapirane na sve članove niza. Prednost ove šeme je da ako se jedan U/I zahtjev sastoji od zahtjeva ka više traka one mogu biti obrađene u paraleli. RAID 0 je veoma brza konfiguracija i ima najbolje performanse čitanja i upisa, ali pošto nema nikakvu redundansu, otkaz bilo kog diska znači gubitak svih podataka RAID nivo 1 RAID 1 se razlikuje od ostalih RAID nivoa (2 do 6) po načinu na koji je postignuta redundansa U ovim ostalim RAID šemama neka forma računanja parnosti se uvodi u cilju uvođenja redundanse. Kod RAID 1 nivoa redundansa se postiže prostim dupliciranjem svih podataka. Kao što se može vidjeti na slici, podaci se dijele na trake kao kod RAID 0 nivoa, samo u ovom slučaju svaka logička traka se mapira na dva odvojena fizička diska. Svaki disk ima svoj disk ogledalo (engl. mirror disk). Koji sadrži iste podatke. Postoji veći broj pozitivnih aspekata RAID 1 organizacije: Zahtjev za čitanje može se uslužiti sa bilo kog od dva diska koji sadrže iste podatke, a nastoji se da se smanji vrijeme traženja i rotaciono kašnjenje. Zahtjev za pisanje treba da se uradi na oba diska koji sadrže te podatke ali to se može učiniti paralelno. Osnovna mana RAID 1 nivoa je cijena jer zahtjeva dvostruki prostor logičkog diska koji podržava RAID nivo 2 RAID nivoi 2 i 3 koriste tehnike paralelnog pristupa. Kod paralelnog pristupa svi diskovi učestvuju u izvršenju svakog U/I zahtjeva. Kao i kod ostalih RAID šema, koristi se dijeljenje podataka na trake. Kod RAID 2 i 3 nivoa, trake su male, često veličine bajta ili riječi. ECC (error-correcting code) se koristi za računanje greške. Bez obzira na broj diskova podataka, potrebna su još 3 diska za ECC koja mogu sačuvati podatke u slučaju otkaza bilo kog diska. RAID 2 nije praktično implementiran.

243 10.19.RAID nivo RAID nivo 3 RAID 3 je organizovan na sličan način kao RAID 2. Razlika je jedino u tome da RAID 3 zahtjeva jedan redundantni disk, bez obzira koliko ima diskova s podacima. Ova konfiguracija organizuje podatke na nivou bit ili bajta, a po pitanju redundanse prvi put se uvodi paritet diskova (engl. bit-interleaved parity). Kod diskova se tačno zna gdje je nastupila greška. U slučaju greške pristupa se disku pariteta i podaci se rekonstruišu na bazi pariteta. Za sve diskove podataka dovoljan je jedan bit pariteta. S obzirom da su podaci podijeljeni u male trake RAID 3 može postići velike brzine prenosa podataka. Bilo koji U/I zahtjev uključuje paralelni prenos podataka sa svih diskova s podacima. Za veće prenose poboljšanje performansi je uočljivo. S druge strane samo jedan U/I može biti izvršen u jednom trenutku. Ovakav sistem bi imao loše preformanse u sistemu sa velikim brojem transakcija RAID nivo 4 RAID nivo 4 konfiguracija ima organizaciju dijeljenja podataka na nivou bloka, a po pitanju redundanse koristi paritet za diskove na nivou bloka (engl. block-interleaved parity). Za N blokova, sa N diskova, dovoljan je jedan blok pariteta koji je jednak veličini trake diska. U svakom ciklusu upisa učestvuje i diska pariteta a to dovodi do preopterećenja ovog diska koji može postati usko grlo sistema RAID nivo 5 RAID 5 je organizovan na sličan način kao RAID 4. Razlika je u tome da RAID 5 distribuira trake pariteta preko svih diskova (Slika 143). Tipično se koristi round-robin šema alokacije. Od osnovnih struktura RAID 5 predstavlja najbolju kombinaciju: posjeduje paralelizam, konkurentnost, dobar za velike upise, a svi diskovi su ravnomjerno opterećeni. D1 D2 D3 P(1-3) RAID 4 D4 D5 D6 P(4-6) D7 D8 D9 P(7-9) D1 D4 D2 D5 D3 P(4-6) P(1-3) D6 RAID 5 D7 P(7-9) D8 D9 Slika 143 RAID 4 i RAID 5, redoslijed odsječaka s paritetima

244 RAID nivo RAID nivo 6 RAID 6 predstavlja jedinu RAID šemu koja može razriješiti problem u slučaju otkaza više od jednog diska (ukoliko se koriste prethodne šeme, osim RAID 1, svi podaci se gube ako istovremeno otkažu dva ili više diskova). Kod RAID 6 šeme koristi se računanje dvije različite parnosti koje se smještaju u blokove na različite diskove. RAID 6 šema koja ima podatke za N diskova zahtjeva ukupno N+2 diska Hibridni RAID 0+1 i 10 Padom cijena diskova postaju popularne kombinovane RAID šeme. Najčešće se kombinuju RAID 0 i RAID 1 sa dva različita redoslijeda ovih šema. RAID 0+1 najprije razdvoji podatke na odsječke na različitim diskovima bez redundanse, kao što radi RAID 0, u cilju postizanja potrebnog kapaciteta i brzine. Zatim se cijeli skup diskova umnoži u dvije kopije kao što radi RAID 1 (Slika 144). S0 S3 S1 S4 S2 S5 S0 S3 S1 S4 S2 S5 S6 S9 S12 S15 S7 S10 S13 S16 S8 S11 S14 S17 S6 S9 S12 S15 S7 S10 S13 S16 S8 S11 S14 S17 S18 S19 S20 S18 S19 S20 Diskovi podataka Kopije Slika 144 RAID 0+1 U RAID 1+0 ili RAID 10 radi se obrnutim redoslijedom. Ovdje se najprije naprave kopije diskova, a zatim kopije podijele na odsječke (Slika 145). Sistem se odlikuje velikom pouzdanošću, jer dopušta ispad više diskova pod uslovom da ostane bar jedna kopija. S0 S3 S0 S3 S1 S4 S1 S4 S2 S5 S2 S5 S6 S9 S12 S15 S6 S9 S12 S15 S7 S10 S13 S16 S7 S10 S13 S16 S8 S11 S14 S17 S8 S11 S14 S17 S18 S18 S19 S19 S20 S20 Par 1 Par 2 Par 3 Slika 145 RAID 10

245 10.24.SSD diskovi SSD diskovi Klasični tvrdi disk se sastoji od jedne ili više magnetnih ploča diskova, koje rotiraju oko vertikalne osi, a pomična glava čita i piše podatke koji su zapisani na magnetnom premazu tih ploča. Mehanička komponenta je najuže grlo performansi modernih računarskih sistema. Stoga se u novije vrijeme magnetni diskovi zamjenjuju poluprovodničkim. SSD je skraćenica od Solid-State Drive i ti uređaji, za razliku od tvrdog diska, nemaju pokretnih dijelova. Time izostaju vibracije i buka, a odlikuje ih i mala potrošnja energije, a s time i manje zagrijavanje. Pojam solid-state označava upotrebu isključivo elektronskih elemenata i sklopova, a time je i način zapisa na ovim uređajima potpuno drugačiji od onog na klasičnim tvrdim diskovima. Za zapis informacija se koriste dvije vrste memorija, NAND flash i DRAM. Princip NAND flash je MOSFET s 2 gate, od kojih je jedan izolovan pa čuva podatke godinama. Algoritmi za optimizaciju kretanja glave kao što su elevator, ili preplitanje su potpuno irelevantni, jer je vrijeme pristupa jednako, bez obzira kojem se sektoru pristupa. Interni RAM NAND blok Interfejs ka sabirnici Upravljač baferima Procesor Kontrolor flash memorije NAND stranica Flash paket NAND string... MOS ćelija s 2 gate Slika 146 Struktura SSD diska SSD pohranjuju podatke u flash memorijske ćelije koje su raspoređene u nizove po bita. Nizovi se smiještaju u stranicama obično od 4 do 16 kb. Stranice se dalje grupišu u blokove obično 128 do 512 stranica, npr, 512 kb po bloku. Blokovi se dalje grupišu u pakete. NAND memorijske ćelije mogu se direktno upisati samo kada su prazne(slika 146). Ako one sadrže podatke, sadržaj mora biti izbrisan prije pisanja. Operacija SSD pisanja može se učiniti na jednoj stranici, ali zbog hardverskih ograničenja, naredbe brisanja (tj. postavljanja svih bitova na 1) uvijek utiču na cijeli blok. Stoga je pisanje podataka na prazne stranice na SSD vrlo brzo, ali znatno usporava nakon prethodno napisane stranice trebate biti izbrisane Zbog načina kako datotečni sistemi obrađuju operacije brisanja, označavanjem blokova podataka kao neupotrebljenih, SSD sam po sebi ne zna koji su sektori doista u upotrebi a koji se mogu smatrati slobodnim prostorom. Za mehaničke diskove nema razlike u pisanju preko praznog sektora ili sektora u kome se nalaze neki podaci, premda nekorišteni. Kod SSD diskova

246 Upravljanje Swap prostorom proces pisanja bi zahtijevao ciklus čitanja bloka u interni RAM keš, brisanja bloka u fleš memoriji, izmjene podataka u RAM kešu i upisa novih podataka. Ova se operacija mora obavljati nad cijelim blokom, iako je mijenjana samo jedna stranica. Optimizacija operacije upisa je uvedena naredbom trim, koju drajver operativnog sistema šalje SSD kontroleru, obavještava SSD kontroler da određene stranice nisu u upotrebi, na primjer nakon brisanja datoteke. Kada kontroler zaključi da cijeli blok nije u upotrebi u budućim operacijama pisanja on ne mora da čita sadržaj tog bloka prije njegovog pisanja. Kod hard diskova na vrijeme života utiče uglavnom mehaničko habanje, kod SSD diskova vrijeme života se mjeri se brojem ciklusa brisanja. Stoga drajveri u samom disku ili na operativnom sistemu, treba i da paze da je broj brisanja na svakom bloku uravnotežen da se uređaj ne pokvari prerano. Na primjer, datoteke povremeno prebacivati s jednog mjesta na disku na drugo, a posebno pažnju obratiti da se ne fiksira datoteka koja realizuje virtualnu memoriju na isto fizičko mjesto. Pošto su magnetni diskovi su još uvijek jeftiniji, a SSD diskovi imaju daleko brže vrijeme pristupa, prave se i hibridni diskovi. Hibridni disk koristi mali SSD kao bafer za veći magnetni disk. Izmijenjeni blokovi unutar SSD diska se upisuju na magnetni disk na bazi vremena koliko su dugo na SSD dijelu diska i kada se najavljuje gašenje sistema Upravljanje Swap prostorom Virtualna memorija koristi disk prostor kao proširenje glavne memorije. Ovaj prostor se naziva Swap-prostor i može se čuvati u datotečnom prostoru ili biti na posebnoj disk particiji. Swap particija ili datoteka P80 P602 P731 Mapa upotrebe Slika 147 Mapa swap prostora Prilikom pokretanja procesa treba unutar datoteke za čuvanje stranica dodijeliti onoliko prostora koliko zauzima programski segment i segment podataka. Taj prostor treba osloboditi pri završetku procesa. Ako se koriste dijeljene stranice između više procesa, tada kernel koristi swap mape za praćenje upotrebe (koliko korisnika koristi tu stranicu) i samo umanjuje brojače upotrebe kada se proces završava. Slika 147 prikazuje datoteku (ili particiju) za swap prostor s pridruženom swap mapom Priključivanje diskova Diskovima se pristupa na tri osnovna načina. Prvi način su diskovi priključeni na računar i pristupa im se koristeći hardversku sabirnicu (npr., IDE, ATA, SATA, FireWire, USB, SCSI, FC Fiber Channel). Kada operativni sistem želi da čita ili piše podatke na ovako priključenim diskovima, on izvršava uobičajene instrukcije za ulaz/izlaz kao što je out za U/I mapirane periferijske uređaje. Koje vrijednosti slati na koji port u kojem vremenskom trenutku zavisi od vrste diska.

247 10.27.Izmjenjivi mediji 247 Proces 3 Proces 3 Proces 2 Proces 2 READFILE(file1,5000) Proces 1 Kernel Proces 1 Kernel Serverski Proces Kernel Slika 148 Mrežni priključak Mrežni priključak omogućava da klijentski računar pristupa disku drugog računara koristeći RPC (poziv udaljene procedure) baziran protokol. Na klijentskom računaru izvršava se program za preusmjeravanje (redirector) koji kada očekuje pristup dijelu datoteke, pakuje zahtjev u mrežni paket i pošalje ga programu na drugom računaru koji se zove server. Server pronađe na svom lokalnom disku dio te datoteke i šalje ga nazad klijentu (Slika 148). Postoje posebni protokoli za ovu svrhu, kao što su NFS za Unix sisteme ili CIFS (ranije SMB) za Windows sisteme. Mrežno dijeljenje diskova omogućava da više korisnika na različitim računarima pristupa zajedničkim podacima, ali na svakom od njih mora postojati operativni sistem s realizovanim datotečnim sistemom. Ukoliko je potrebno dijeljenje smještaja između više računara, ali da se podacima na takvim diskovima pristupa na nivou bloka, a ne da se oslanja na postojeći datotečni sistem, koristi se treći pristup, mreže za smještaj (storage networks). Riječ je o posebnim, autonomnim diskovima koji se priključuju na računarsku mrežu, a ne ugrađuju ni u jedan računar. Koristeći posebne adaptere, pristup mrežnom disku je sličan pristupu lokalnom disku. Ovakva konfiguracija se koristi kada se želi smanjiti obim posla na administriranju pojedinačnih računara i datotečnih sistema na njima. Na primjer, ovako postaje moguće podići operativni sistem sa diska u mreži, pa se on ne mora instalirati na svaku radnu stanicu. Takođe, u slučaju kvara serverskog računara, drugi računar može preuzeti njegovu funkciju bez otvaranja računara i prebacivanja diska u njega Izmjenjivi mediji Za razliku od fiksnih diskova, izmjenjivi mediji zahtijevaju ljudsku intervenciju da bi se pristupilo podacima. Podaci se nalaze na mediju koji se može izvaditi iz uređaja i tako postići praktično neograničen kapacitet i prebacivost između različitih računara. Mogu biti realizovani na četiri principa materijala: magnetni (trake, diskete, izmjenjivi tvrdi diskovi), papirni (optički prepoznatljiv tekst, bušene kartice i bušene trake), poluprovodnički (stikovi, SD kartice) i optički (CD, DVD) Kada se ovi mediji koriste za pisanje, operativni sistem treba paziti da korisnik može da ih iskopča iz računara kada to poželi. Većina modernih operativnih sistema ne upisuje podatke odmah na diskove, nego ih čuva u memoriji, a zatim primjenjuje neki od algoritama za pristup disku kada je procesor manje opterećen. Ako se podaci namijenjeni izlazu nisu na vrijeme upisali, nego na primjer čuvali u baferima, podaci će biti izgubljeni kada se medij izvadi. Stoga, operativni sistem treba na izmjenjive medije da piše podatke što prije moguće. Ako to ne može biti slučaj, jer bi to drastično usporilo operativni sistem, treba tražiti od korisnika da najavi vađenje izmjenjivog uređaja (demontiranje ili bezbjedno uklanjanje).

248 Magnetni izmjenjivi mediji Magnetni izmjenjivi mediji Magnetne trake se koriste kao jeftini medij velikog kapaciteta. Dva tipa ovog medija su koturasti (koji se koristi na mainframe računarima) i kertridž (traka je u kaseti poput standarda QUIC, DAT, VHS) (Slika 149). Na današnjim kertridžima postižu se kapaciteti od više terabajta. Pristup podacima je isključivo sekvencijalni, pri čemu neki formati na isto mjesto na magnetnoj traci smiještaju jedan bit ili po devet bita istovremeno. Slika 149 Magnetna traka u koturu i kaseti Drugi izmjenjivi magnetni medij je flopi disk. Sve do oko godine bili su dominantni izmjenjivi medij na personalnim računarima. Zbog malog kapaciteta (varirao od 75K do 240 M) na današnjim personalnim računarima se rijetko ugrađuju, a jedina preostala namjena im je za podizanje operativnog sistema u situaciji kada to nije moguće uraditi s drugog uređaja zbog nedostatka drajvera. Flopi diskovi su se proizvodili u raznim veličinama, mjerenim u inčima: 2, 2.5, 3, 3.5, 5.25 i 8. Glava 0 Struja Oksidni sloj Poliesterska baza Upravljač sklop Fluks Struja Glava 1 Slika 150 Princip rada flopi diska Jedna ili dvije glave diska upisuju podatke koristeći modifikovanu frekventnu modulaciju. Ovo kodiranje se bazira na kombinacijama jačeg (s) i slabijeg (w) magnetnog fluksa. Na taj način, binarno 1 se kodira kao WS, dok se binarno 0 kodira na jedan od dva načina: kao SW (ako je prethodni bit bio 0) ili kao WW (ako je prethodni bit bio 1)(Slika 150) Optički mediji CD, CDROM, DVD CD je inicijalno dizajniran za čuvanje digitalizovane muzike i zamijenio je analognu gramofonsku ploču. Kasnije je upotrebljen i u računarima za čuvanje podataka koji se ne

249 10.30.USB uređaji 249 mijenjaju. Za razliku od tvrdih diskova, on nije podijeljen na staze i sektore, nego se sektori redaju sekvencijalno u jednu spiralu, pri čemu je njihova veličina 2352 bajta. Obični CD se priprema tako što laser buši rupe na master disku pravljenom od specijalnog stakla. Kalup je napravljen sa zaprekama gdje su rupe. Smola izlivena unutra ima isti uzorak rupe kao stakleni disk. Na vrh smole se stavi aluminijum. Rupice (udubljenja) i ravnine (neizgorenog područje) su raspoređeni u spiralama (Slika 151). Laser se koristi za čitanje rupica i ravnina i pretvori ih u bitove (0 i 1). Pošto je na malu površinu nabijeno puno podataka, potrebno je poboljšati mogućnost korekcije grešaka na CD. Svaki bajt (8 bita) se na ovom disku čuva kao 14 bitni simbol sa 6 bita za Rupice Slika 151 Struktura CD-a korekciju greške. 42 simbola čine okvir, a grupa od 98 okvira čini CD-ROM sektor. Na kraju svakog sektora se nalazi dodatni kod za ispravljanje grešaka, a na njegovom početku preambula za prepoznavanje početka sektora. Logička struktura CD sektora prikazana je na slici Slika 152. B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 Simbol S0 S1 S2... S23 Okvir Preambula Okvir 0 Okvir 1 Okvir 2... Okvir 95 ECC Sektor Slika 152 Struktura sektora na CD Početni trošak pravljenja CD-a je visok zbog potrebe za pravljenjem master CD-a, ali su kasniji štampani CD-ovi relativno jeftini. Za pravljenje manjih serija, pogodniji su upisivi CD. Mogu se praviti s jednim ili više upisivanja. Prilikom upisa laser spaljuje tačke na sloju iznad reflektivnog zlatnog ili aluminijskog sloja. Pri kasnijem čitanju laserski zrak se reflektuje samo na nezatamnjenim mjestima i tako se razlikuju 0 i 1. DVD ima isti dizajn kao CD sa poboljšanjima. Inicijalno je namijenjen za čuvanje digitalizovanih filmova. Veći kapacitet u odnosu na CD postignut je manjim rupama, užom spiralom i upotrebom crvenog lasera. Izrađuje se u četiri varijante: jednostrani - jednoslojni (4.7 GB), jednostrani - dvoslojni (8.5 GB), dvostrani jednoslojni (9.4 GB) i dvostrani - dvoslojni Prelaskom na još manje rupe, širinu spirale i laser ljubičaste svjetlosti, pojavio se optički uređaj s još većim kapacitetom. To je Blu Ray. Na jedan ovakav disk staje normalno 25 gigabajta, a kada se koriste četiri sloja, kapacitet raste sve do 128 gigabajta USB uređaji USB je uveden kao standard za priključivanje širokog broja uređaja uz vrlo mali broj žica. Konkretno koriste se samo četiri žice, napajanje, uzemljenje, napon signala i negirani napon signala. Prijemnik oduzme napon i negirani napon signala čime se eliminišu šumovi u signalu.

250 Windows i Posix API za disk kao fizički uređaj SYNC 8/32 PID 8 ADDRESS 7 ENDPOINT 4 CRC5 5 EOP 3 Token paket SYNC 8/32 PID 8 DATA CRC16 16 EOP 3 Data paket SYNC 8/32 PID 8 EOP 3 Handshake paket SYNC 8/32 PID 8 FRAME 11 CRC5 5 EOP 3 Start of frame paket Slika 153 Struktura USB paketa Podaci se prenose serijski u paketima, standardizovanim brzinama (Slow speed, 1.5Mbps, Full Speed 12Mbps ili i brže). Postoji četiri vrste paketa (Slika 153). Token paketi omogućavaju pristup korektnoj adresi na krajnjoj tački. Data paketi su promjenjive veličine i sadrže podatke. Handshake paketi se koriste za signalizaciju uspjeha ili neuspjeha transakcije. Start of frame paket predstavlja početak grupisanja paketa u okvire. Podržano mnogo uređaja, svaki sa svojom internom adresom (miševi, tastature, diskovi). Paketi se šalju redoslijedom prvo najmanje značajan bajt i grupišu se u okvire. Mogu se sastojati od sljedećih polja: 1. Sync polje: služi za sinhronizaciju brzina između uređaja koji koriste USB protokol. Njegova zadnja dva bita određuju gdje PID polje počinje 2. PID polje određuje vrstu paketa koji se šalje. Vrsta paketa se odnosi na to da li je paket namijenjen uspostavljanju veze, prenosu podataka, početku okvira 3. ADDR polje određuje uređaj za koga je namijenjen paket. Kako je polje 7 bitno, može se imati u USB mreži do 127 uređaja. 4. ENDP polje određuje oznaku veze prema odredišnom uređaju, može ih biti do CRC polje sadrži kontrolnu provjeru paketa 6. EOP polje predstavlja kraj paketa 7. FRAME polje predstavlja oznaku okvira U okviru ovih paketa se mogu nalaziti podaci namijenjeni bilo kojem uređaju. Za uređaje masovne memorije koristi se unutar ovih paketa protokol sličan komunikaciji s SCSI diskovima. Tehnološki preko USB se priključuju stikovi (diskovi na bazi Flash memorije), tvrdi diskovi, flopi ili optički diskovi Windows i Posix API za disk kao fizički uređaj Kada je potrebno pristupiti fizičkim sektorima diskova pod Windows ili Linux mogu se također koristiti sistemski pozivi kao što su read pod Linux ili ReadFile pod Windows. Imena uređaja kojima se pristupa u ovim sistemima su na primjer \\.\PhysicalDrive0 (Fizički disk 0, Windows), /dev/fd0 (Fizički prvi flopi disk, Linux) /dev/cdrom (CD ROM, Linux), /dev/sda1 (Prva particija prvog SCSI diska, Linux), /dev/hda (Cijeli prvi IDE disk, ranije verzije Linux)

251 10.32.Zadaci Zadaci Zadatak 1. Klasični disk se sastoji od 6 glava, 1360 cilindara po ploči i 128 sektora po traci. Formula za IDE diskove za konverziju iz CHS u LBA glasi LBA = ( C HPC + H ) SPT + S 1 Koja će LBA biti za cilindar 20, glavu 3, sektor 100? Izvedite formulu za konverziju iz LBA u CHS. Rješenje: LBA=(20 6+3) =15843 LBA C= (SPT HPC),H=(LBA SPT )modhpc,s=(lbamodspt)+1 Zadatak 2. Disk koristi zonski zapis. Sastoji se od 6 glava i 1360 staza po glavi. Staze imaju po 111 sektora, staze imaju po 113 sektora, staze imaju po 115 sektora, staze imaju po 117 sektora. Koju glavu, cilindar i sektor unutar staze će zauzeti logički sektor , uz pretpostavku da se broji po glavama, pa cilindrima pa sektorima? Koliki je kapacitet ovog diska ako je sektor velik 512 bajta? Rješenje: Svaka ploča ima četiri zone. Množeći broj staza u zoni sa brojem sektora u stazi dobijemo da zone imaju redom Z0=37740, Z1=38420, Z2=39100, z3=39780 sektora. Ukupno na svakoj ploči ima Kada se podijeli s dobije se 1 i ostatka. Dakle glava je 1. Pošto je Z0+Z1< 98157<Z0+Z1+Z2, sektor pripada zoni Z2. Relativna pozicija staze od početka zone se dobija kada se od broja sektora unutar ploče oduzme veličina prethodnih zona, tj Z1-Z0= Kada ovaj broj podijelimo s brojem sektora po stazi za zonu Z2 dobijemo 21997/115=191 i 32 ostatka. Zona Z2 počinje od staze 680, pa je staza = =871, a sektor 32. Ukupni kapacitet je jednak umnošku broja glava i veličine ploče= = sektora, što daje kapacitet , tj 454M. Zadatak 3. Glava diska čija ploča ima 908 cilindara (početni je 0, krajnji 907) se nalazila na cilindru 156, krećući se ka većim brojevima cilindra i pristizali su zahtjevi za cilindrima 28, 23, 778, 601, 435, 725, 705, 707, 203, 225, 428. Izračunati ukupni pređeni put glave diska za različite algoritme i nacrtajte dijagrame kretanja glave diska. a) FCFS b)sstf c) SCAN d) LOOK e) C-SCAN f) C-LOOK. Kod C-SCAN i C-LOOK ne računati povratak. Rješenje a) FCFS Glava je prešla (156-28) +(28-23)+ (778-23) + ( ) + ( ) + ( ) + ( ) + ( ) + ( ) + ( ) + ( ) = 2272 cilindra

252 Zadaci b)sstf Glava je prešla ( )+(225-23)+(778-23)=1026 cilindara c) SCAN Glava je prešla ( )+(907-23)=1635 cilindara

253 10.32.Zadaci 253 d) LOOK Glava je prešla ( )+(778-23)=1377 cilindara e) C-SCAN Glava je prešla ( )+(28-0)=779 cilindara f) C-LOOK Glava je prešla ( )+(28-23)=627 cilindara.

254 Zadaci Zadatak 4. Neka je dat niz bajtova u heksadekadnim vrijednostima 2A 70 3E 41 6A B 3F E. Rasporedite ove bajtove na tri diska koristeći odsječke veličine 4 bajta (gdje je primjenjivo) i strukture a) RAID 0, b) RAID 1, c) RAID 2, d) RAID 3 e) RAID 4 f) RAID 5 Rješenje: a) RAID 0, Odsječci se raspoređuju po svim diskovima 2A 70 3E 41 6A B 3F E b) RAID 1, sadržaj se kopira na sve diskove 2A 70 3E 41 6A B 3F E 2A 70 3E 41 6A B 3F E 2A 70 3E 41 6A B 3F E c) RAID 2 Nije izvodiv s ovim brojem diskova, potrebno 11 diskova: po 1 za svaki bit i 3 za paritete d) RAID 3 Raspoređuje se bajt po bajt, na treći disk ide paritet (XOR) između pojdinih bajtova 2A 3E 6A 18 3F B 22 3E 5A 7F 4A 53 1D 26 e) Raid 4 Odsječci se redaju na prva dva diska, treći je paritet između odsječaka. Drugi se dopunjava nulama. 2A 70 3E 41 3F E 6A B E 0A 3F E f) Raid 5, odsječci se redaju na sva tri diska, paritet putuje 2A 70 3E 41 3F E 6A B 3F E E 0A

255 11.Datotečni sistemi 11.1.Zadaci i problemi razvoja datotečnog sistema Zadaci i problemi razvoja datotečnog sistema Gotovo sve računarske aplikacije imaju potrebu da smještaju i izdaju podatke. Dok se proces izvršava, unutar adresnog prostora je moguće smjestiti ograničen skup informacija. To znači da je smještajni kapacitet ograničen na veličinu virtualnog adresnog prostora. Za neke aplikacije ova veličina je dovoljna dok za neke dati prostor nije dovoljan (kao na primjer, sistem za rezervaciju avionskih karata, bankarske aplikacije kao i vođenje zapisa za velike firme). Drugi problem, kod čuvanja podataka unutar adresnog prostora, je njihov nestanak ukoliko proces završi izvođenje. Za mnoge aplikacije, recimo za baze podataka, informacije se moraju održavati duži vremenski period. Nestanak podataka nakon završetka procesa je neprihvatljiv pogotovo ako dođe do nasilnog završetka aplikacije. Treći problem predstavlja potreba da višestruki procesi pristupe dijelovima podataka u isto vrijeme. Ako je, recimo telefonski imenik, smješten unutar adresnog prostora procesa tada samo taj proces može mu pristupiti. Način da se razriješi problem je da se podaci načine nezavisnim od bilo kojeg procesa. Dakle, postoje tri suštinska zahtjeva za dugoročno čuvanje podataka: 1. Mora se biti u stanju smjestiti veliki skup podataka. 2. Podaci moraju preživjeti nasilni prekid procesa koji ih koristi. 3. Višestruki procesi moraju biti u stanju da pristupe informacijama konkurentno Uobičajeno rješenje svih navedenih problema predstavlja smiještanje podataka na disk ili druge eksterne medije u organizovane smještajne jedinice koje se zovu datoteke. Tada ih procesi mogu čitati ili pisati u njih. Podaci smješteni u datoteke moraju biti stalni i ne smiju zavisiti od toga da li će se proces završiti i kako će se završiti. Datoteka se može pobrisati samo ako je njen vlasnik pobriše. Dio operativnog sistema koji se bavi poslovima vezanim za datoteke se naziva datotečni sistem. Glavne teme u projektovanju datotečnog sistema predstavljaju: 1. Organizacija smještajnog prostora, 2. Imenovanje datoteka, 3. Načini pristupa 4. Načini korišćenja 5. Zaštita datoteka 6. Implementacija. Sa korisničke tačke gledišta, najvažnije karakteristike datotečnog sistema predstavljaju: kako se datoteke predstavljaju korisnicima, šta čini datoteku, kako se datoteke imenuju i štite, koje operacije su dozvoljene nad datotekam i sl. Za korisnika su manje važni detalji koji se odnose na povezane liste ili bitmape, koje se koriste za vođenje evidencije o slobodnom smještajnom prostoru, i koliko fizičkih sektora se nalazi u logičkom sektoru. Međutim, ovi podaci su izuzetno važni za projektante operativnih sistema Datoteke U ovom djelu posmatraćemo datoteke sa korisničke tačke gledišta a to su: kako se koriste i koje karakteristike imaju.

256 Imenovanje datoteka 11.3.Imenovanje datoteka Datoteke predstavljaju apstraktne mehanizme koji obezbjeđuju način smiještanja podataka na disk i njihovog kasnijeg čitanja. Korisnika ne interesuju detalji gdje su smješteni podaci i kako se to radi. Vjerovatno najvažnija karakteristika apstraktnih objekata je njihovo imenovanje. Znači, govorimo o imenovanju datoteka pri čemu ime predstavlja ime objekta nad kojim radimo. Kada proces napravi datoteku, on joj daje ime. Kada proces završi svoje izvođenje, datoteka ostane pod tim imenom da postoji na disku i može joj pristupiti drugi proces koristeći to ime. Pravila za imenovanje datoteke su različita od sistema do sistema, ali svi operativni sistemi dozvoljavaju niz od 1 do 8 znakova kao važeće ime datoteke. Često su cifre i specijalni znaci dozvoljeni da se kombinuju sa slovima. Mnogi sistemi dozvoljavaju da dužina imena datoteke bude do 255 znakova. Neki sistemi razlikuju mala i velika slova (kao u UNIX-u) dok drugi ne (kao u MS-DOS-u). Mnogi datotečni sistemi podržavaju imena datoteka sa dva dijela međusobno odvojena tačkom, recimo prog.c. Dio koji se nalazi iza tačke se naziva nastavak (ekstenzija) i obično ukazuje na tip datoteke (u ovom slučaju kaže da datoteka predstavlja izvorni kod napisan u C jeziku). Nastavak je fiksan u MS-DOS-u i iznosi 3 znaka dok kod Unix-a može postojati više nastavaka (prog.c.bz2, gdje bz2 označava da je datoteka prog.c kompresovana). U tabeli na slici Slika 154, dati su neki uobičajeni nastavci datoteke. Nastavak Značenje file.bak Backup datoteka file.c izvorni program u C-u file.gif Slika u formatu gif (engl. Graphical Interchange Format) file.html Web document file.iso ISO image CD-ROM-a (za zapis na CD) file.jpg Slika kodirana u skladu sa JPEG standardom file.mp3 Muzička datoteka kodirana u MPEG layer 3 audio formatu file.mpg Film kodiran sa MPEG standardom file.o Objektna datoteka (izlaz iz kompajlera) file.pdf Datoteka tipa Portable Document Format file.ps Datoteka tipa PostScript file.tex Datoteka kao ulaz za TEX formatting program file.txt Tekst datoteka file.zip Kompresovana arhiva Slika 154 Neki nastavci imena datoteka 11.4.Datotečni atributi Svaka datoteka ima ime i svoje podatke predstavljene sadržajem. Kao dodatak ovome, operativni sistem dodaje nove informacije svakoj datoteci koje mu služe da bi sa njima kvalitetnije upravljalo datotekom, a to su: datum i vrijeme kreiranja datoteke, veličina datoteke i sl. Ove dodatne parametre zvaćemo atributima datoteke, mada ih neki nazivaju i meta podacima. Lista atributa značajno varira od sistema do sistema. U tabeli na slici Slika 155 prikazane su samo neki od atributa ali treba znati da se tu mogu dodati i oni koji su određenim projektantima potrebni.

257 Atributi Zaštita Lozinka Kreator Vlasnik Read-only flag Hidden flag System flag Archive flag ASCII/binary flag Random access flag Temporary flag Lock flags Record length Key position Key length Creation time Time of last access Time of last change Current size Maximum size 11.5.Struktura datoteke 257 Značenje Ko može pristupati datoteci i na koji način Lozinka s kojom se pristupa datoteci ID lica koji je kreirao datoteku Tekući vlasnik 0 za read/write; 1 za read only 0 za obične; 1 ako se ne želi prikazivati u listing-u 0 za obične datoteke; 1 za sistemske datoteke 0 za backup datoteke; 1 za potrebu da se backup-ira 0 za ASCII datoteke; 1 za binarne datoteke 0 samo za sekvencijalni pristup; 1 za slučajan pristup 0 za obične dat.; 1 za brisanje datoteke kad proces završi 0 za otključavanje; <>0 za zaključavanje Broj bajta u slogu Pomjeraj ključa unutar svakog sloga Broj bajta u polju ključa Datum i vrijeme kreiranja datoteke Datum i vrijeme posljednjeg pristupa datoteci Datum i vrijeme posljednje promjene datoteke Broj bajta u datoteci Broj bajta u datoteci može rasti do Maximum size Slika 155 Atributi datoteka Prva četiri atributa se odnose na zaštitu datoteke i govore ko može pristupiti datoteci. Zastavice predstavljaju bite koji služe za upravljanje ili omogućavanje nekih akcija. Na primjer, datoteke koje su označene kao sakrivene se ne izlistavaju. Zastavica arhiviranja nam govori da li je datoteka backup-irana. Backup program čisti bit a operativni sistem ga postavlja kod promjene datoteke. Na ovaj način, backup program zna koje datoteke treba backup-irati. Zastavica koja označava privremenu datoteku omogućuju automatsko brisanje datoteke nakon završetka procesa koji ju je kreirao. Polja dužine sloga, pozicija ključa i dužine ključa su prisutna samo u onim datotekama u kojima je moguće pretraživanje pomoću ključa. Ona obezbjeđuju informacije potrebne za pronalaženje ključeva. Različita vremena služe da ukažu na vrijeme kreiranja datoteke, posljednjeg modifikovanja i posljednjeg pristupa datotekama. Ona su korisna za različite svrhe. Na primjer, ako je izvorna datoteka modifikovana poslije kreiranja objektne datoteke daje nam informaciju da je treba ponovno kompajlirati (make program). Veličina datoteke govori koliko je velika tekuća datoteka. U nekim starijim operativnim sistemima bila je potrebna maksimalna veličina datoteke da se upiše kod kreiranja nove datoteke kako bi operativni sistem rezervisao unaprijed maksimalni iznos smještajnog prostora za datoteku. Moderni operativni sistem su dovoljno «pametni» da mogu raditi bez ove vrijednosti Struktura datoteke Datoteke mogu biti struktuirane na jedan od nekoliko načina. Uobičajeni načini su prikazani na slici Slika 156. Datoteka, na slici Slika 156a, predstavljena je sa nestruktuiranim nizom

258 Struktura datoteke bajta. U ovom slučaju, operativni sistem ne zna ili ne brine o sadržaju unutar datoteke, koji u suštini predstavlja samo niz bajta. Neko značenje ovih bajta se koristi od strane korisničkih programa a ne od operativnog sistema. Većina operativnih sistema opšte namjene datoteke organizuje na ovaj način. a) Niz bajtova b) Niz slogova Abid Kata Pero Duje Fata Ibro Luka Nina Olga Riki Sejo Zula c) Indeksno stablo Gile Hani Huse d) Više tokova Slika 156 Fizičke organizacje datoteka Prvi korak u struktuiranju datoteka je prikazan na slici Slika 156b. U ovom modelu, datoteka predstavlja niz slogova fiksne veličine, od koji svaki ima svoju internu strukturu. Osnovna ideja ovakve strukture podataka je da operacija čitanja vraća jedan slog i da operacija pisanja prepisuje ili dodaje jedan slog (primjer, čitanje programa sa 80 kolonski kartica i štampanje istih na štampač sa širinom od 132 znaka). Ovakav pogled na datoteke je primijenjen u operativnim sistemima poput Michigan Terminal System, Pick Operating System. Treća vrsta struktuiranja datoteke je prikazana na slici Slika 156c. U ovoj organizaciji, datoteka se sastoji od slogova organizovanih u drvo pri čemu nisu svi iste dužine, i svaki sadrži polje ključa na fiksnoj poziciji u slogu. Primjer je datotečni sistem IBM VSAM na operativnom sistemu z/vse. Drvo je sortirano po polju ključa da dozvoli brzo pretraživanje po pojedinačnom polju ključa. Osnovna operacija, ovdje predstavlja čitanje sljedećeg sloga, mada je moguće čitati i slog sa navedenim ključem. Na slici Slika 156c, može se tražiti od sistema da se pročita slog čiji je ključ Nina, bez brige o poziciji sloga u datoteci. Pored toga, novi slog može biti dodan u datoteku od strane operativnog sistema a ne korisnika. Operativni sistem odlučuje gdje da stavi slog i kako da ga poveže da bi se mogao pronaći sa ključem. Ovi tipovi datoteka su sasvim različiti od nestruktuiranih tipova datoteka korišćenih kod Unix-a i Windows 98 operativnih sistema, i koriste se na mainframe računarima u nekim komercijalnim aplikacijama. Moderni operativni sistemi poznaju i smiještanje različitih tokova, nezavisnih nizova bajtova u jednu datoteku Slika 156d. Na primjer, Mac OS-X je razvijan za dva vrlo različita tipa procesora: Power PC i Intel Pentium. Stoga se u izvršnim datotekama nalaze dvije odvojene kopije izvršnog programa unutar jedne datoteke, od kojih svaka predstavlja sekvencu bajtova a vidljiva je na instalaciji operativnog sistema za jedan od ovih procesora. Na

259 11.6.Tipovi datoteka 259 datotečnom sistemu NTFS za Windows NT datoteke su sastavljene od tokova koji se zovu atributi (konfuzija s istoimenim pojmom) tako da je moguće u istu datoteku smjestiti više nizova podataka, kao i informacija o samoj datoteci. Ipak, većina operativnih sistema datoteke vide kao prosti niz bajtova. To ne znači da se aplikacije kojima je potreban neki od pogleda poput niza slogova ili indeksne organizacije ne mogu napisati, nego je potrebno te poglede realizovati logički, kroz korisničke aplikacije Tipovi datoteka Mnogi operativni sistemi podržavaju nekoliko tipova datoteka. UNIX i Widows, na primjer, imaju obične datoteke (engl. regular files, u daljem tekstu datoteka) i direktorije. UNIX ima i specijalne datoteke tipa karakter i blok. Windows XP koristi metadata datoteke. Datoteke su one koje sadrže korisničke informacije. Direktoriji su sistemske datoteke koje služe za održavanje struktura datotečnog sistema. O njima ćemo govoriti kasnije. Specijalne datoteke tipa karakter su povezane na ulaz / izlaz i koriste se za serijske U/I uređaje, kao što su terminali, štampači i mreže. Specijalne datoteke tipa blok se koriste za ulazno izlazne operacije sa blok orijentisanim uređajima ( disk i sl). U ovom dijelu primarno ćemo se baviti običnim datotekama. Obične datoteke su ili ASCII datoteke ili binarne datoteke. ASCII datoteke se sastoje od linija teksta ( na nekim sistemima terminator je CR dok kod nekih drugi je LF, Windows koristi oba). Linije ne moraju biti iste veličine. Binarne datoteke predstavljaju niz bajta i nisu pogodne za štampanje. Obično su to izvršne datoteke koje služe za formiranje procesa. Zaglavlje Flegovi text sekcija data sekcija Relokacija Tabela simbola Unix a.out format Magični broj Vel. text sekcije Vel. data sekcije Vel. bss sekcije Vel. tabele simbola Ulazna tačka Datotečno zaglavlje Info zaglavlje Tablica boja Tablica piksela Windows BMP format Slika 157 Neki binarni formati Signatura Veličina datoteke Pozicija tab. piksela Širina slike Visina slike Broj bitnih ravni Bita po pikselu Vrsta kompresije X piksela po metru Y piksela po metru Korišteno boja Značajnih boja Na slici Slika 157 može se vidjeti struktura izvršne datoteke definisana još u ranim verzijama UNIX-a. Mada je, tehnički, datoteka niz bajta, operativni sistem će izvršiti samo datoteku koja ima odgovarajući format. Ovaj format zvani a.out (prema podrazumijevanom imenu izlazne datoteke iz kompajlera gcc) sastoji se od 5 sekcija: zaglavlje datoteke, tekst sekcija predstavlja kod programa, data sekcija koja predstavlja statičke podatke, relokacioni biti potrebni za izračunavanje fizičke adrese i tabela simbola. Zaglavlje datoteke sadrži magični broj koji identificira izvršnu datoteku (da bi spriječio izvršavanje datoteka koje nisu iz tog sistema). Zatim dolaze veličine raznih dijelova datoteke (gore spomenutih sekcija), adresa početka izvršavanja i neki biti koji označavaju zastavice. Iza zaglavlja datoteke se nalaze dijelovi datoteke koji se zovu text sekcija i data sekcija. Kada se ovi pune u memoriju,

260 Pristup datotekama relokacioni biti se koriste da bi se formirala fizička adresa. Tabela simbola se koristi za debuggiranje. Pošto je ovaj format neproširljiv, zamijenjen je sličnim ali varijabilnim ELF formatom (Linux), odnosno PE formatom (Windows) kod kojih redoslijed sekcija nije fiksan. Drugi primjer binarne datoteke predstavlja BMP, datoteka grafičkih slika u Windows sistemu. Ove datoteke se sastoje od četiri osnovna dijela, prvo zaglavlje koje objašnjava gdje su ostali dijelovi, zaglavlje slike koje opisuje njene dimenzije i značenje bajtova koji predstavljaju piksele, bitove palete boja i bitove piksela Pristup datotekama Rani operativni sistemi su obezbjeđivali samo jednu vrstu pristupa datotekama, tzv. sekvencijalni pristup. U ovim sistemima, proces je mogao pročitati sve bajte ili slogove fiksnim redoslijedom od početka. Nije bilo dozvoljeno čitanje od neke pozicije niti preskakanje određenog broja slogova. Jedino se moglo postaviti na početak datoteke (Slika 158). Ovaj pristup je bio veoma pogodan za magnetne trake, ali nije optimalan za diskove. Pozicija Premotavanje Čitanje i pisanje Slika 158 Sekvencijalni pristup datotekama Kod diska je postao moguć zapis datoteka kod koje su se mogli čitati ili pisati slogovi izvan nekog redosljeda, kažemo mogli smo pristupati slogovima sa ključem a ne njegovom pozicijom. Datoteke, čiji bajti ili slogovi se mogu čitati u bio kojem redosljedu se nazivaju datoteke sa slučajnim pristupom (engl. random access files). Datoteke sa direktnim pristupom (Slika 159) su važne za mnoge aplikacije, na primjer sisteme baza podataka. Ako kupac pozove sistem za rezervaciju karata za određeni avion, program mora biti u mogućnosti da pristupi slogovima za taj let bez potrebe da čita podatke od početka za sve druge letove aviona. Poč. Kraj Pozicija se računa iz ključa Slika 159 Direktni pristup datotekama Dvije metode se koriste da bi se navelo gdje da se počne sa čitanjem. U prvoj metodi, svaka operacija čitanja zahtijeva kao parametar poziciju u datoteci da bi počelo čitanje. U drugoj metodi, posebna operacija, nazvana seek, se koristi da se izvrši postavljanje na tekuću poziciju. Poslije izvršavanje seek operacije, datoteka može biti čitana i sekvencijalno od date tekuće pozicije (ovo je veoma često u upotrebi kod sortiranih datoteka). U modernim operativnim sistemima ne pravi se razlika između ovih datoteka i sve datoteke se kreiraju kao datoteke sa slučajnim pristupom.

261 11.8.Datotečne operacije 261 Multimedijalne datoteke (Slika 160), tj. datoteke s filmom i zvukom kombinuju sekvencijalni i direktni pristup. Većinu vremena im se pristupa sekvencijalno. Filmovi su kodirani na način da se jedan za drugim navode elementi slike trenutnog kadra i zvučni elementi, kadar za kadrom. Ali, većina njih ima i mogućnost premotavanja na pojedini kadar filma. Zaglavlje Video zapis Audio zapis Titl Video zapis Audio zapis Titl Kadar 1 Kadar 2 Slika 160 Struktura multimedijalne datoteke Indeksna organizacija datoteka (Slika 161) se zasniva na posebnom području (indeks) u kome se čuvaju pokazivači na pojedini dio datoteke prema navedenom ključu. Ovakve datoteke se koriste u bazama podataka jer se odlikuju brzom mogućnosti pretrage. Područje indeksa se organizuje u osnovi na dva načina. Indeks-sekvencijalna organizacija datoteke uvodi tri zone: primarnu zonu (ili zonu podataka), zonu indeksa i zonu prekoračenja. Zbog poboljšanja performansi indeks-sekvencijalne datoteke se periodično reorganizuju. Indeks Zona podataka Zona prekoračenja Ključ Pozicija Pozicija se dobije iz indeksa Slika 161 Indeks-sekvencijalna datoteka Ovaj nedostatak je otklonjen kod indeksne organizacije sa B-stablima koja ima primarnu zonu i zonu indeksa. Osnovna karakteristika indeksne organizacije sa B-stablima je da postoji automatska reorganizacija po potrebi. Datoteke sa više ključeva su najčešće indeksne datoteke sa B-stablom ili nekom varijantom B-stabla. Za svaki ključ postoji po jedna zona indeksa Datotečne operacije Datoteke postoje da bi se u njih trajno smjestili podaci i kasnije koristili. Različiti datotečni sistemi obezbjeđuju različit skup operacija koje omogućuju smiještanje i izdavanje podataka. U nastavku je prikazana većina sistemskih poziva koji se koriste za rad sa datotekama. Kreiranje, «Create» : ovim sistemskom pozivom se vrši kreiranje datoteke bez podataka. Svrha sistemskog poziva je da se nova datoteka kreira i da joj se postave određeni atributi. Brisanje, «Delete»: Kada datoteka nije više potrebna, treba da se pobriše da bi oslobodila prostor na disku. Otvaranje datoteke, «open»: Prije korišćenja datoteke, proces je mora otvoriti. Svrha sistemskog poziva «open» je da dozvoli sistemu da preuzme atribute datoteke kao i listu adresa diska u memoriju radi bržeg pristupa kod kasnijih poziva.

262 Datotečni deskriptor Zatvaranje datoteke, «close»: Kada je završeno sa svim pristupima datoteci, kada atributi datoteke kao i adrese diska više nisu potrebne, vrši se zatvaranje datoteke kako bi se oslobodio prostor u memoriji za neke nove datoteke koje mogu trebati. Mnogi sistemi imaju parametar koji se zove maksimalni broj otvorenih datoteka po procesu. Podaci se pišu u blokovima i zatvaranje datoteke forsira operativni sistem da upiše blokove koji se još nalaze u memoriji. Čitaj, «Read»: Podaci se čitaju iz datoteke. Obično, čitaju se bajti od tekuće pozicije u datoteci. Pozivaoc mora navesti koliko je podataka potrebno pročitati kao i memorijsko područje u koje će ih upisati. Piši, «Write»: Podaci se pišu u datoteku, obično na tekuću poziciju. Ako je tekuća pozicija kraj datoteke, onda se povećava veličina datoteke. Ako je pozicija u sredini datoteke, postojeći podaci se prepisuju i gube zauvijek. Dodavanje (operacija append ): ovaj sistemski poziv predstavlja ograničeni oblik operacija write. Sa njim se podaci samo dodaju na kraj datoteke. Datotečni sistemi koji obezbjeđuju minimalan skup sistemskih poziva, nemaju operaciju append, dok neki drugi sistemi koji imaju višestruke načine izvršavanja sličnih operacija, imaju operaciju append. Pozicioniranje (operacija seek): kod operacija sa slučajnim pristupom, potreban je sistemski poziv kojim se pozicionira na podatke koje treba čitati. Uobičajeni pristup je sistemski poziv seek kojim se datotečni pokazivač postavlja na specifično mjesto u datoteci. Kada se ovaj sistemski poziv završi, onda se podaci mogu čitati sa te pozicije ili pisati na tu poziciju. Preuzmi atribute: procesi često treba da čitaju datotečne atribute da bi ih koristili u svom poslu. Na primjer, UNIX-ov make program često se koristi za upravljanje razvojem softverskih projekata koji se sastoji od više datoteka. Kada se pokrene make program, on ispituje vremena modifikacije datoteka svih izvornih i objektnih datoteka i dolazi do saznanja koji minimalni skup datoteka je potrebno prevesti da bi se došlo do cilja (da bude sve kako treba ažurirano). Da bi ovo radilo, potrebno je imati atribute datoteka i koristiti atribut koji se zove vrijeme modifikacije. Postavi atribute: Neke atribute može postaviti korisnik i mogu se promijeniti poslije kreiranja datoteke. Ovaj sistemski poziv omogućava takve intervencije. Jedan upečatljiv primjer predstavlja zaštita datoteke. Većina zastavica, takođe, spada u ovu kategoriju. Preimenovanje (operacija «rename»): kada korisnik želi da promijeni ime datoteke, koristi se ovaj sistemski poziv. Može se izvesti sa kopiranjem datoteke u novu datoteku sa željenim imenom i brisanje stare datoteke. Međutim, ova operacija nekada može biti veoma duga, čak i neizvodljiva, dok je operacija preimenovanja brza operacija i izvodi se samo nad imenom datoteke. Zaključavanje, «Lock»: zaključavanje datoteke ili dijela datoteke predstavlja sprečavanje višestrukih procesa da pristupe simultano datoteci ili dijelu datoteke. Kod sistema za rezervaciju karata za avion, zaključavanje baze podataka sprečava rezervaciju karata za dva različita korisnika u isto vrijeme Datotečni deskriptor Većina operativnih sistema (Unix, Windows, MS DOS), pa i korisnički programi pisani u jeziku C, bez obzira u kojem operativnom sistemu su pokrenuti, se referenciraju na otvorenu datoteku koristeći jedan cjelobrojni ili pointerski identifikator datoteke, koji se zove datotečni deskriptor (fd). On je uveden umjesto stalnog prosljeđivanja sistemskim pozivima imena

263 11.10.Operacije nad datotekom -C funkcije 263 datoteke iz dva razloga. Jedan razlog je u brzini samog sistemskog poziva, jer je manje zahtjevno proslijediti jedan cijeli broj nego, npr 30 znakova imena. Drugi razlog je što je mnogim programima potrebno otvoriti istu datoteku više puta istovremeno, na primjer prilikom njenog sortiranja praktično je kretati se kroz datoteku s dva različita pokazivača. Korisnički program prilikom početka rada s datotekom pozove npr. sistemski poziv open (ime_datoteke, način). Način može biti r, rw, w,..., zavisno od toga da li je u pitanju čitanje, čitanje i pisanje, pisanje itd. Operativni sistem provjerava da li takva datoteka postoji, i ako je sve u redu, rezultat ove funkcije je datotečni deskriptor fd. Korisnički proces treba da koristi deskriptor za sve buduće operacije nad datotekom, na primjer read(fd, buff,num) ili write(fd, buff,num). Kada proces završi sa tom datotekom, on poziva operaciju close(fd) da izvrši zatvaranje datoteke. Datotečni deskriptori Tabela otvorenih datoteka Strukture datotečnih sistema Disk P1 P2 Režim: w Pozicija: 3000 Ime: aa.txt Režim: rw Pozicija: 0 Ime: baa1.txt Režim: r Pozicija: 150 Ime: aa.dbf Indeksni Čvor u memoriji FAT element direktorija u memoriji $MFT podaci u NTFS Slika 162 Tablice datotečnih deskriptora Sa strane operativnog sistema, datotečni sistem održava jednu internu strukturu za svaku otvorenu datoteku, t.j., za svaki važeći datotečni deskriptor. U toj internoj strukturi se čuva trenutna pozicija u datoteci, njeno ime, a ako novi kreirani procesi nasljeđuju i otvorene datoteke, čuva se i podatak koliko procesa drži tu datoteku otvorenom na ovoj poziciji. Ova se struktura kreira prilikom otvaranja datoteke i briše se kod zatvaranja close). Datotečni deskriptor, zavisno od implementacije, je pokazivač na ovu strukturu, indeks u tabeli otvorenih datoteka ili totalno nevezani podatak. Više struktura koje predstavljaju otvorene datoteke se spajaju u tabelu otvorenih datoteka (engl. Open file table) koje predstavljaju sistemsku listu datotečnih deskriptora u upotrebi (Slika 162) Operacije nad datotekom -C funkcije U stvarnoj implementaciji sistemskih poziva, najčešće se koriste oni ugrađeni u standardnu biblioteku jezika C. Neki od tih poziva su: FILE * fopen ( const char * filename, const char * mode ) Kreiranje datoteke size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ) Piši u datoteku implicitno napreduje datotečni pokazivač size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ) Čitaj datoteku implicitno napreduje datotečni pokazivač

264 Windows API datotečni sistem int fseek ( FILE * stream, long int offset, int origin ); Repozicioniranje u datoteci Windows API datotečni sistem Funkcije iz C biblioteke na nižem nivou pozivaju API operativnog sistema. Te funkcije su na raspolaganju i programeru, ako C biblioteka nije dovoljna. To su: CopyFile(lpExistingFileName,lpNewFileName,FailIfExists) Kopira datoteku CloseHandle( hobject) Zatvara otvoreni objekt (npr. Datoteku) CreateDirectory(lpPathName,lpSecurityAttributes) Kreira direktorij CreateFile(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreatio ndisposition,dwflagsandattributes,htemplatefile) Kreira ili otvara datoteku DeleteFile(lpFileName) Briše datoteku FindClose(hFindFile) Završava pretragu datoteka FindFirstFile(lpFileName, lpfindfiledata) Traži prvu datoteku FindNextFile(lpFileName, lpfindfiledata) Traži sljedeću datoteku FlushFileBuffers(hfile) Forsira upis bafera GetDiskFreeSpace(lpRootPathName, lpsectorspercluster, lpbytespersector, lpnumberoffreeclusters, lptotalnumberofclusters) Očitava slobodan prostor i druge informacije o strukturi datoteka GetFileAttributes(lpFileName) Čita atribute datoteke GetFileInformationByHandle(hFile,lpFileInformation) Uzima informaciju o datoteci GetFileSize( hfile,lpfilesizehigh) Dobavlja veličinu datoteke GetTempFileName(lpPathName,lpPrefixString,uUnique,lpTempFileName) Sastavlja ime privremene datoteke GetTempPath(nBufferLength,lpBuffer) Vraća ime direktorija za privremene datoteke LockFileEx(hFile,dwFlags,dwReserved,nNumberOfBytesToLockLow,nNumberOfBytes ToLockHigh,lpOverlapped) Zaključava dio datoteke od istovremenog pristupa MoveFile(lpExistingFileName,lpNewFileName) Premješta datoteku ReadFile(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped ) Čita datoteku RemoveDirectory(lpPathName) Briše datoteku SetEndOfFile(hFile) Postavlja kraj datoteke SetFileAttributes(lpFileName,dwFileAttributes) Postavlja atribute datoteke SetFilePointer(hFile,lDistanceToMove,lpDistanceToMoveHigh,dwMoveMethod) Postavlja trenutnu poziciju u datoteci UnlockFileEx ( hfile, dwreserved, nnumberofbytestounlocklow, nnumberofbytestounlockhigh, lpoverlapped) Otključava dio datoteke WriteFile(hFile,lpBuffer,nNumberOfBytesToWrite,lpNumberOfBytesWritten,lpOverlap ped) Piše podatke u datoteku POSIX API DATOTEČNI SISTEM Posix kompatibilni operativni sistemi koriste sljedeće funkcije: getcwd(pbuf, isize); očitaj trenutni direktorij mkdir(ppathname, imode); kreira direktori rmdir(ppathname); briše direktorij chdir(const char *path); mijenja trenutni direktorij

265 11.13.Primjer pristupa datotekama s Unix sistemskim pozivima 265 link(poldpath, pnewpath); još jedno ime datoteke unlink(const char *pathname); ukloni dodatno ime a možda i datoteku rename(poldpath, pnewpath) promijeni ime ili lokaciju datoteke stat(pfile_name, pbuf); provjeri status datoteke chmod(ppath, imode); Promijeni prava datoteke chown(ipath, owner, group); Promijeni vlasništvo datpteke utime(pfilename, pbuf); Promijeni vremena datoteke opendir(pname); otvori direktorij readdir(dir *dir); čitaj element datoteke closedir(dir *dir); zatvori direktorij rewinddir(dir *dir) reset direktorijskog prikaza access(ppathname, imode); Provjeri prava nad datotekom open(ppathname, iflags); creat(ppathname, imode); otvori i eventualno kreiraj datoteku close(fd); zatvori datoteku read(fd, pbuf, icount); Čitanje datoteke write(fd, pbuf, icount); pisanje u datoteku fcntl(fd, icmd); upravljaj deksriptorom fstat(fd, pbuf); datotečni status lseek(fd, ioffset, iwhence); pozicija datoteke dup( oldfd); dup2(oldfd, newfd); duplicira deskriptor datoteke pipe(int filedes[2]); kreira cijev mkfifo (ppathname, mode ); kreira imenovanu cijev umask(mask); maske za kreiranje *fdopen (fd, pmode); povezivanje toka s deskriptorom fileno( FILE *stream); deskriptor toka Primjer pristupa datotekama s Unix sistemskim pozivima Sljedeći primjer ilustruje upotrebu sistemskih poziva read i write. On u petlji preuzima blokove iz jedne datoteke i kopira ih u drugu.

266 Direktoriji /* Kopira blokove od 4K iz oldfile u bafer, i smiješta ih u newfile sekvencijalno */ #include <sys/types.h> /* Zaglavlja */ #include <fcntl.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]); /* ANSI prototip */ #define BUF_SIZE 4096 /* 4 kilobajtni bafer */ #define OUTPUT_MODE 0700 /* zaštitni biti izlazne datoteke */ int main(int argc, char *argv[]){ int in_fd, out_fd, rd_count, wt_count; char buffer[buf_size]; if (argc!= 3) exit(1); /* greška ako argc nije 3 */ /* Otvori ulaznu i kreiraj izlaznu datoteku */ in_fd = open(argv[1], O_RDONLY); /* Ulazna datoteka */ if (in_fd < 0) exit(2); /* ako se ne može otvoriti, izlaz */ out_fd = creat(argv[2], OUTPUT_MODE); /* izlazna datoteka */ if (out_fd < 0) exit(3); /* ako se ne može kreirati, izlaz */ /* Petlja */ while (TRUE) { rd_count = read(in_fd, buffer, BUF_SIZE); /* učitaj blok*/ if (rd_count <= 0) break; /* na kraju datoteke izlaz */ wt_count = write(out_fd, buffer, rd_count); /* upis */ if (wt_count <= 0) exit(4); /* wt_count <= 0 je greška */ /* Zatvori datoteke */ close(in_fd); close(out_fd); if (rd_count == 0) /* nije bilo greške pri zadnjem čitanju */ exit(0); else exit(5); /* greška pri zadnjem čitanju */ Direktoriji Da bi vodili evidenciju o datotekama, datotečni sistem ima direktorije (ili foldere, ili mape) koji u mnogim sistemima sami predstavljaju datoteke. U ovom dijelu, pozabavićemo se direktorijima, njihovom organizacijom, njihovim karakteristikama i operacijama koje se izvršavaju nad njima Jednostavan direktorij Direktorij tipično sadrži jedan broj elemenata, po jedan za svaku datoteku. Jedna mogućnost je prikazana na slici Slika 163a ) u kojem svaki element sadrži ime datoteke, datotečne atribute i adrese na disku smještenih podataka. Druga mogućnost je prikazana na

267 11.16.Jedan direktorij po korisniku 267 slici b gdje jedan element direktorija sadrži ime datoteke i pokazivač na drugu strukturu podataka gdje se mogu naći atributi datoteke i adrese na disku. Oba ova sistema se koriste. a.dat r/w 23-jul bytes Cluster 60 a) b.dat w 20-jun bytes Cluster 65 a.dat r 06-jul bytes Cluster 80 r/w 23-jul bytes Cluster 60 Slika 163 Organizacije direktorija a.dat b.dat c.dat w 20-jun bytes Cluster 65 b) r 06-jul bytes Cluster 80 Kada se zatraži otvaranje datoteke, operativni sistem pretražuje odgovarajući direktorij sve dok ne nađe njeno ime. On tada vadi atribute datoteka kao i adrese na disku iz elementa direktorija(slučaj Slika 163a ), ili iz strukture podataka na koju pokazuje polje u elementu direktorija, (slučaj Slika 163b), i stavlja ih u tabelu u glavnu memoriju. Sve sljedeće reference na datoteku koriste informacije zapisane u glavnoj memoriji. Broj direktorija varira od sistema do sistema. Najjednostavniji oblik direktorija je jedan direktorij koji sadrži sve datoteke za sve korisnike, kao što je to pokazano na slici Slika 164. Kod ranih personalnih računara to je bila uobičajena praksa, jer je postojao samo jedan korisnik. Ovakva organizacija direktorija je primijenjena npr. u Apple DOS za računare Apple II. Ime datoteke Ime datoteke Ime datoteke Slika 164 Direktorij na jednom nivou Problemi sa jednim direktorijem u sistemu sa više korisnika je da različiti korisnici mogu slučajno dovesti do brisanja datoteka. Na primjer, kada korisnik A kreira datoteku mailbox, a kasnije korisnik B kreira istu datoteku, doći će do uništenja sadržaja datoteke mailbox korisnika A Jedan direktorij po korisniku Da bi izbjegli ovakva ponašanja, sljedeći korak bio je da se svakom korisniku dodijeli direktorij u okviru koga može kreirati svoje datoteke. Na ovaj način imena izabrana od strane jednog korisnika ne utiču na imena koja je izabrao drugi korisnik. Ovaj pristup je prikazan na slici Slika 165. Ovakav pristup bi se mogao koristiti na računaru sa više korisnika ili jednostavnoj mreži personalnih računara koji koriste dijeljeni datotečni server kroz lokalnu mrežu. Pristup je korišten na operativnom sistemu CP/M. Tu je prosti jednonivovski direktorij

268 Hijerarhijski sistem direktorija proširen pomoću naredbe USER n, gdje je n broj između 0 i 15 i u suštini predstavlja jedan od 16 poddirektorija. Kod projektovanja ovakvog sistema, kada korisnik pokuša da otvori datoteku, operativni sistem zna koji je to korisnik i za njega zna koji direktorij da pretražuje. Kao posljedica ovog, korisnici se trebaju prijaviti na sistem sa imenom i lozinkom i na taj način se pridružuje određeni direktorij kao prostor u kome korisnik može da formira svoje datoteke. Ime direktorija Korijenski direktorij Ime direktorija Korisnički direktorij Ime datoteke Ime datoteke Ime datoteke Ime datoteke Ime datoteke Sadržaj datoteka na disku Slika 165 Dvonivovski (korisnički) direktorij Hijerarhijski sistem direktorija Hijerarhija u dva nivoa eliminiše konflikt između korisnika. Pojavljuje se drugi problem, kada jedan korisnik ima veliki broj datoteka, koje nije moguće lako organizovati unutar jednog (čitaj svog) direktorija. Pojavljuje se potreba grupisanja datoteka u manje grupe, recimo, profesor želi da studentske domaće zadaće grupiše u jedan direktorij, a predavanja da čuva u drugom direktoriju. Ime direktorija Ime datoteke Korijenski direktorij Ime direktorija Direktorij Direktorij Ime datoteke Ime direktorija Ime datoteke Ime datoteke Ime datoteke Direktorij Ime datoteke Ime datoteke Sadržaj datoteka na disku Slika 166 Hijerarhijski direktorij Za ovakav pristup je potrebno imati hijerarhijsku strukturu direktorija, koju nekada nazivamo i strukturom drveta. Kod ovog pristupa, svaki korisnik može imati direktorija

269 11.18.Aciklični graf i dijeljene datoteke 269 koliko mu treba tako da datoteke može grupisati na prirodniji način. Ovaj pristup je prikazan na slici Slika 166. Koristi se u MSDOS i Windows do verzije XP. U hijerarhijskim direktorijima imena datoteka se obično navode na tri načina. Prvi način je prosto navođenje njenog imena, pri čemu se za pojedini proces u izvršenju odredi jedan direktorij da bude tzv. radni direktorij. Na ovaj način se može pristupati samo datotekama koje se nalaze u radnom direktoriju. Drugi način je navođenje uz imena datoteke i svih direktorija kojem ona pripada. Taj način se zove apsolutna staza. Na primjer, u Unix sistemima datoteka /home/mitar/dokumenti/prijava.txt se odnosi na datoteku prijava.txt lociranu u direktoriju Dokumenti, koji je lociran u direktoriju mitar. Direktorij mitar je lociran u direktoriju home, a taj direktorij je u korijenskom direktoriju. Na Windows i MS DOS sistemima se apsolutna staza navodi razdvajajući direktorije tupouglom kosom crtom (backslash) pri čemu svaka disk particija ima odvojen korijenski direktorij, npr C:\windows\system32\ntdll.dll. Treći način se zove relativno ime datoteke. Kod ovog pristupa se ne polazi od korijenskog direktorija, nego od radnog, a za ispomoć se koriste u većini operativnih sistema i specijalna imena direktorija... koji predstavljaju trenutni direktorij u hijerarhiji, odnosno jedan iznad. Npr. ako je u Unix sistemu radni direktorij /home/mitar tada je datoteka Dokumenti/prijava.txt drugi način pristupa datoteci /home/mitar/dokumenti/prijava.txt, dok bi se datoteci /bin/ls u ovom slučaju moglo pristupiti i navodeći../../bin/ls Aciklični graf i dijeljene datoteke Neki datotečni sistemi dopuštaju da se datoteka istovremeno nalazi u više direktorija. U Unix sistemima ovo se postiže komandom ln. Ovakav model pruža najviše mogućnosti, ali i stvara određene poteškoće prilikom pravljenja rezervnih kopija sistema., jer se mora evidentirati da li je datoteka već bila kopirana. Ime direktorija Ime datoteke Korijenski direktorij Ime direktorija Direktorij Direktorij Ime datoteke Ime direktorija Ime datoteke Ime direktorija Ime datoteke Direktorij Ime datoteke Ime datoteke Sadržaj datoteka na disku Slika 167 Aciklični graf Datotečni sistemi koji imaju strukturu acikličnog grafa direktorija omogućavaju dijeljene datoteke između direktorija. Na slici Slika 167 se vidi datoteka označena šrafurom čiji sadržaj istovremeno pripada u dva direktorija.

270 Opšti graf direktorija Kod Unix-a, korišćenje indeksnih čvorova za smiještanje datotečnih atributa čini dijeljenje datoteka jednostavnijim. Bilo koji broj u elementu direktorija može pokazivati na jedan indeksni čvor. Indeksni čvor sadrži polje koje se uveća za jedan kada se nova veza na istu datoteku dodaje i umanji za jedan kada se izbriše. Samo kada taj brojač dostigne nulu, tada se označava da su datoteka i njen indeksni čvor obrisani. Ova veza se ponekad zove i čvrstom vezom. Dijeljenje datoteke koja koristi čvrste veze nije uvijek moguće. Glavno ograničenje je da su direktoriji i indeksni čvorovi strukture podataka jednog datotečnog sistema (tj. u okviru jedne particije), tako da direktorij iz jednog datotečnog sistema ne može pokazivati na indeksni čvor drugog datotečnog sistema. Takođe, datoteka može imati jednog vlasnika i jedan skup prava pristupa. Ako vlasnik dijeljene datoteke izbriše svoju sopstveni element direktorija za datoteku, drugi korisnik bi mogao imati problem da pobriše datoteku jer nema prava pristupa. Alternativni način za dijeljenje datoteka predstavlja kreiranje nove vrste datoteke čiji sadržaj predstavlja puno ime datoteke. Ova vrsta datoteke treba da radi kroz datotečne sisteme koji se mogu montirati (različiti datotečni sistemi). U stvari ako je ime datoteke takvo da se sa njim može stići na drugi računar, tada to označava takvu vrstu datoteka. Ova vrsta veze na datoteku se naziva simbolička veza u Unix-u, shortcut u Windows-u, i alias u Apple's Mac OS. Simboličke veze se mogu koristiti na sistemima gdje su atributi smješteni u elementu direktorija. Mane simboličkih veza su kada se datoteka pobriše ili čak i preimenuje, veza na datoteku postane nevažeća Opšti graf direktorija Ime direktorija Ime datoteke Korijenski direktorij Ime direktorija Direktorij Direktorij Ime datoteke Ime direktorija Ime datoteke Ime direktorija Ime direktorija Direktorij Ime datoteke Ime datoteke Sadržaj datoteka na disku Slika 168 Opšti graf direktorija Neki datotečni sistemi nemaju nikakva ograničenja na pripadnost datoteka direktorijima. Direktorij može pokazivati i na druge direktorije, koji su u hijerarhiji inače iznad njega. Neki Linux datotečni sistemi, npr. UnionFS koriste ovu mogućnost kod operativnih sistema koji se pokreću s CD-a (Slika 168). Ovaj pristup je najfleksibilniji, ali i najopasniji, jer bi postupak brisanja svih datoteka u poddirektoriju mogao potencijalno uništiti sve datoteke u datotečnom sistemu. Preporučljivo je izbjegavanje ovakve strukture direktorija.

271 11.20.Čuvanje i pretraživanje direktorija Čuvanje i pretraživanje direktorija Direktoriji se mogu čuvati u datotečnom sistemu na isti način kao datoteke, samo imaju specijalne atribute. Alternativno, mogu se nalaziti u potpuno odvojenom području datotečnog sistema (CP/M). U Unix sistemima smješteni su kao obične datoteke ali sa definisanom strukturom. Njihov sadržaj je skup slogova koji se sastoji od broja indeksnog čvora i imena datoteke. Imena se završavaju sa \0, a indeksni čvorovi se koriste za pretraživanje meta informacija o datotekama, i za lokaciju samog sadržaja datoteke. Na taj način jedna datoteka se može pojaviti u više direktorija. Datoteka koja predstavlja direktorij može svoje elemente (opise datoteka) organizovati na više načina. Koristeći linearni niz ili listu što omogućava brzo dodavanje, ali sporu pretragu kod velikih direktorija (FAT) Koristeći B* stabla čime je postignuta brza pretraga uz komplikovano ažuriranje(ntfs, Mac HFS), Preko hash tabela gdje se pozicija u tabeli se računa iz imena, što omogućava brzo nalaženje jedne datoteke, ali ne i datoteka s džoker znakovima (Ext2FS) Operacija nad direktorijima Sistemski pozivi za rad sa direktorijima prikazuju znatne varijacije od sistema do sistema. Da bi ih objasnili, uzećemo primjer iz Unix-a. Kreiraj direktorij, «create»: ovim sistemskim programom se kreira prazan direktorij, mada sadrži dva elementa, ona koji se odnose na pojmove. i.. Kreira se komandom mkdir. Pobriši direktorij, «delete»: ovim sistemskim pozivom se briše direktorij i samo prazan direktorij može biti obrisan. Direktorij koji sadrži samo. i.. smatra se praznim. Pojedinačno elementi. i.. se ne mogu pobrisati jer služe u sistemske svrhe. Otvori direktorij: Direktorij se može čitati. Na primjer, da bi izlistali sadržaj direktorija, program za listanje direktorija mora otvoriti direktorij za čitanje, analogno otvaranju datoteke. Zatvori direktorij: Kada se završi pisanje direktorija, on mora biti zatvoren da bi se oslobodio prostor u internim tabelama. Čitaj direktorij: ovaj poziv vraća sljedeći element u otvorenom direktoriju. Preimenuj direktorij: s obzirom da su direktoriji kao datoteke, oni mogu biti preimenovani. Link: ovim pozivom dozvoljavamo da se jedna datoteka pojavljuje u više od jednog direktorija. U sistemskom pozivu se navodi postojeća datoteka i staza, i kreira se veza od postojeće datoteke u ime navedeno u stazi. Na ovaj način, ista datoteka se može pojaviti u višestrukim direktorijima. Ovakva veza, koja uveća za jedan brojač datoteka jednog indeksnog čvora ( a cilj joj je da vodi evidenciju o broju ulaza u datoteku) se ponekad naziva i čvrstom vezom (engl. hard link). Raskini vezu (engl. unlink). Brisanje elementa direktorija. Ako se ovom komandom briše datoteka koja postoji samo u jednom direktoriju, onda se datoteka uklanja iz datotečnog sistema. Ako se datoteka nalazi u više direktorija onda se uklanja veza na koju pokazuje i smanjuje se referentni brojač na indeksnom čvoru datoteke. Gornji sistemski pozivi predstavljaju skup važnijih poziva, ali postoje i neki drugi, kao na primjer, za upravljanje informacijama zaštite a pridružena su direktoriju.

272 Implementacija datotečnog sistema Implementacija datotečnog sistema Sada je vrijeme da pređemo sa korisničkog pogleda na datotečni sistem na pogled projektanata datotečnih sistema. Korisnici brinu o tome kako da daju imena datoteka i koje operacije da primjene nad njima i kako da im izgleda struktura direktorija. Oni koji implementiraju datotečni sistem, brinu o načinu smiještanja datoteka i direktorija, kako upravljaju prostorom na disku, te kako da naprave da sve radi pouzdani i efikasno. U sljedećem dijelu pozabavićemo se ovim pitanjima MBR i particiona tabela Datotečni sistemi se obično smještaju na disk. Većina diskova je podijeljena u particije pri čemu na svakoj particiji može da postoji nezavisan datotečni sistem. Prvi sektor na disku se naziva MBR (engl. master boot record) i koristi se za svrhe operacija punjenja operativnog sistema (engl. booting). Na kraju MBR se nalazi tabela particija. Ova tabela daje početnu i krajnju adresu svake particije. Jedna od particija u tabelu može biti označena kao aktivna. Kod punjenja operativnog sistema, BIOS čita prvi sektor, koji predstavlja MBR, i izvršava programski kod koji se nalazi u MBR-u. Prva stvar koju program u MBR-u treba da uradi je da pronađe aktivnu particiju, pročita njen prvi blok, koji se naziva boot blok i počne izvršavati program u njemu. Program u boot bloku puni operativni sistem koji je sadržan u toj particiji. Radi uniformnosti, svaka particija počinje sa boot blokom čak i kad nema na sebi operativni sistem. Međutim, možda će particija u budućnosti imati operativni sistem pa nije loša ideja da se taj blok zadrži. Gornji opis mora biti tačan, bez obzira koji operativni sistem se koristi, za bilo koju hardversku platformu, na kojoj BIOS može pokrenuti više od jednog operativnog sistema. Može biti razlika u terminologiji kod različitih operativnih sistema, na primjer, MBR se ponekad naziva i IPL (engl. Initial Program Loader), dok Volume Boot Code predstavlja programski kod u MBR-u. Kada je BIOS napunio MBR ili boot sektor akcije mogu biti različite. Na BIOS se može računati samo da napuni jedan blok automatski, a onda boot program će obezbijediti punjenje dodatnih blokova ako je potrebno. Na PC kompatibilnim računarima ne može biti više od 4 primarne particije jer ne postoji više praznog prostora u tabeli (ona se nalazi između MBR program i kraja bloka veličine 512 bajta). Neki operativni sistemi dozvoljavaju da jedan element tabele particija bude tzv. proširena particija koja ukazuje na povezanu listu logičkih particija. Na ovaj način moguće je da imamo bilo koji broj dodatnih particija. BIOS ne može pokrenuti operativni sistem sa logičke particije, tako da se zahtijeva od inicijalnog koda iz primarne particije da napuni kod kojim bi se moglo upravljati logičkim particijama. Evidencija o particijama se vodi u tabeli particija koja se nalazi u MBR-u na adresi 0x1BE. Svaki element tabele particija ima strukturu prikazanu ispod.

273 11.24.Proces podizanja sistema na PC računarima 273 Struct partition { unsigned char boot_ind;/* 0x80 aktivna unsigned char head;/* početna glava unsigned char sector;/* početni sektor unsigned char cyl;/* početni cilidar unsigned char sys_ind;/* koji tip particije unsigned char end_head;/* zadnje glava unsigned char end_sector;/* zadnji sektor unsigned char end_cyl;/* zadnji cilidar unsigned short start_sectlo;/* početna pozicija sektora od 0 unsigned short start_secthi;/* početni sektor se broji od 0 unsigned short nr_sectslo;/* broj sektora u particiji unsigned short nr_sectshi;/* broj sektora u particiji Nisu svi diskovi podijeljeni na particije. Disketa obično počinje sa boot blokom u prvom sektoru. BIOS čita prvi sektor diska i gleda koji je magični broj. On identificira važeći kod i na taj način sprečava da pokuša izvršiti kod koji nije odgovarajući. MBR i boot blok koriste isti magični broj tako da kod mora biti isti jer je vezan za isti datotečni sistem Proces podizanja sistema na PC računarima Na slici Slika 169 je prikazan proces pokretanja PC računara do trenutka učitavanja boot sektora. Svi IBM PC kompatibilni računari započinju svoj rad tako što se procesor uključi u realnom režimu rada. U ovom režimu, mikroprocesor je kompatibilan sa starim 8086 i koristi šesnaestbitne registre i segmente. Početna adresa je podijeljena u dva dijela, registar CS (Code segment) ima vrijednost 0xFFFF, a registar IP (Instruction pointer) ima vrijednost U ovoj fazi se greške javljaju zvučnikom. Kada je prepoznat BIOS video kartice (adresa C000:0000) i utvrđeno da je u pitanju puno podizanje procesora, slijedi test BIOS ROMA, test RAM memorije i inicijalizacija nekih periferijskih uređaja. Kada je prepoznato da postoji flopi ili hard disk, sa njega se učita njegov početni sektor na adresu 0000:7C00. BIOS obavi skok na navedenu adresu koja u slučaju hard disk-a sadrži program koji očita aktivnu particiju i učita početni sektor te particije ponovo na istu adresu, i ponovi se skok u program koji započinje učitavanje cijelog operativnog sistema. U slučaju flopi diska, već prvi skok na 0000:7C00 započinje učitavanje operativnog sistema.

274 Proces podizanja sistema na PC računarima Napon sabilan Timer prekida reset Disketa DA JMP FFFF:0000 Nađi MBR, sektor 0, glava 0, cil. 0 Nađi booi, sektor 0, glava 0, cil. 0 Greške DA Beep Učitaj MBR na 0000:7C00 Traži BIOS na C000:0000 i C780:0000 Greške DA C000 ROM ERROR 5AAA na kraju MBR DA Skoči na 0:7C00 Nađi akt. particiju IBM DA No ROM System BASIC Startaj BASIC u ROM-u 0000:0472 sadrži 1234 DA WARM Učitaj boot sektor Init video BIOS Signatura OK? Disketa DA General failure error poruka Test BIOS-a DA Disk boot failure Warm boot? Poruka:Nonsystem disk or disk errror Test memorije PNP BIOS? Stavi podatke u RAM o svim uređajima Omogući sve uređaje Učitaj CMOSRAM Isključi konflikte Postavi IRQ adrese DOS, Win 3 Win NT Bez OS Slika 169 Proces podizanja PC računara do učitavanja boot sektora

275 11.25.Raspored unutar particije Raspored unutar particije Osim što svi diskovi počinju sa boot blokom, organizacija datotečnog sistema varira značajno od jednog do drugog datotečnog sistema. Unix-ova organizacija datotečnog sistema, koji je smješten u particiju, bi se mogao prikazati kao na slici Slika 170. MBR i part. tabela Particija 1 Particija 2 Particija 3 Boot blok Superblok Bitmapa Indeksni čvorovi Korijenski direktorij Datoteke i direktoriji Slika 170 Tipična struktura datotečnog sistema Prvi je boot blok. Zatim dolazi super blok. On sadrži sve ključne parametre o datotečnom sistemu i u cijelosti se drži u memoriji poslije punjenja operativnog sistema ili poslije prvog pristupa datotečnom sistemu. Sljedeće polje predstavlja informacije o slobodnim blokovima u datotečnom sistemu. Iza njega se nalazi skup indeksnih čvorova, niz struktura podataka, od kojih je jedan vezan za jednu datoteku i govori sve o toj datoteci, i gdje je smještena i sve njene atribute. Poslije toga dolazi prostor za korijenski direktorij koji sadrži datoteke i direktorije definisane na najvišem nivou datotečnog sistema. Na kraju se nalazi prazan prostor koji služi za definisanje svih ostalih datoteka i direktorija. struct SUPER { ushort nodesnum; //ukupan br. indexnih cvorova ushort zonenum; //ukupan br. zona ushort imap; //br. blokova bit mape indexne cvorove ushort zmap; //br. blokova bit mape zona ushort dataz; // short log2bz; //Ignorisi ovo polje long filesize; //maksimalna velicina int magic; //Magicni broj ; Vjerovatno najvažnije pitanje u implementaciji smještajnog prostora za datoteke je vođenje evidencije o blokovima koji pripadaju datoteci. Različite metode se koriste u različitim operativnim sistemima. U ovom dijelu razmotrićemo neke od njih Struktura direktorija Prije nego što se datoteka pročita, ona mora biti otvorena. Kada se datoteka otvori, operativni sistem koristi ime staze koju je obezbijedio korisnik da bi pronašao element direktorija koji se odnosi na tu datoteku. Nalaženje direktorija znači da smo pronašli prvo korijenski direktorij. Korijenski direktorij je na fiksnoj poziciji u odnosu na početak particije, mada se ova pozicija može odrediti i pomoću nekih drugih podataka, recimo superbloka, koji sadrži informaciju o veličini sistemske strukture podataka koja prethodi djelu sa podacima. Iz superbloka može biti nađena lokacija indeksnog čvora. Prvi indeksni čvor će pokazivati na početak korijenskog direktorija koji je kreiran kada je Unix formirao datotečni sistem na disku. Kod Windows XP-a, informacije u boot sektoru (koji je znatno veći od jednog sektora) pokazuje na MFT pomoću koga lociramo ostale dijelove datotečnog sistema.

276 Kontinualna alokacija datoteka Kada se pronađe korijenski direktorij, pretraživanjem drveta direktorija se nalazi željeni element direktorija. Element direktorija sadrži informacije potrebne da se pronađu blokovi diska. U zavisnosti od datotečnog sistema, informacije mogu biti disk adresa cijele datoteke ( kao kod kontinualne alokacije), broj prvog bloka datoteke ( za sheme ulančanih lista) ili jedan broj koji predstavlja broj indeksnog čvora (za alokaciju sa indeksnim čvorom). U svim slučajevima, osnovna funkcija elementa direktorija je da uspostavi vezu između imena datoteke sa njegovim informacijama potrebnim da se pronađu podaci datoteka na disku. Gdje su smješteni atributi datoteke? Svaki datotečni sistem održava atribute datoteke, takve kao što su: vlasnik datoteke, vremena kreiranja, posljednji pristup i modifikacija datoteke. Jedna očigledna mogućnost je da se smjesti u element direktorija. U najjednostavnijem slučaju, direktorij se sastoji od elemenata fiksne veličine, po jedan po datoteci, koji sadrže ime datoteke fiksne veličine i strukturu atributa datoteke i jednu ili više adresa na disku koje govore gdje su blokovi diska datoteke smješteni. Za sisteme koji koriste indeksne čvorove, druga mogućnost je smiještanje atributa datoteke u indeksni čvor umjesto u element direktorija. U ovom slučaju element direktorija može biti znatno kraći, samo ime datoteke i broj indeksnog čvora Kontinualna alokacija datoteka Najjednostavnija šema alokacije je smiještanje svake datoteke u niz susjednih blokova diska. Dakle, na disku sa 1 KB blokovima, 50 KB datoteka će zauzeti 50 susjednih blokova diska. Alokacija kontinualnog prostora diska ima dvije značajne prednosti. Prva, jednostavna je za implementaciju, jer vođenje evidencije o smještenim blokovima se redukuje na zapisivanje samo dva broja: adresa na disku prvog bloka datoteke i broj blokova u datoteci. Pomoću broja prvog bloka u datoteci, jednostavnim operacijama se može doći na adresu željenog bloka. A A A A A B B B B B C C C C D D D D E E E a) A A A A A C C C C E E E b) Slika 171 Kontinualna alokacija Druga prednost predstavlja performanse kod čitanja koje su izuzetno dobre jer cijela datoteka može biti pročitana u samo jednoj operaciji čitanja. Pri čitanju je potrebna samo jedna seek operacija kojom se postavimo na prvi blok. Poslije toga nema gubljenja vremena ni na rotaciono kašnjenje niti na dodatne operacije postavljanja na sektore (čitaj seek operacije), tako da se podaci iz datoteke mogu prenositi maksimalnom propusnošću koja je definisana za neki disk. Dakle ova kontinualna alokacija je jednostavna za implementaciju i ima visoke performanse. Nažalost, kontinualna alokacija ima i svoje nedostatke: u toku rada disk postane fragmentiran, i sastoji se od datoteka i šupljina na disku. U početku, ova tehnika alokacije ne predstavlja problem jer se datoteke uvijek pišu na početku praznog prostora za disk(slika 171a). Međutim, poslije punjenje diska i brisanja datoteka dolazimo u situaciju kada veliki procenat diska nije iskorišćen a neka veća datoteka se ne može zapisati (Slika 171b). U tom slučaju se pribjegava kompakciji diska ali je ta operacija veoma duga i nepoželjna. Na

277 11.28.ISO 9960 FS 277 takvom disku, slobodni prostor se održava sa listom šupljina i kada je potrebno dodati novu datoteku, potrebno je proći kroz listu i naći pogodan dio šupljine na disku gdje bi se mogao smjestiti sadržaj datoteke. Mada ova tehnika ima mana ona se opet aktuelizirala sa pojavom CD i DVD uređaja na kojima se koristi ova tehnika alokacije, ponajviše zbog njenih performansi jer se sadržaj datoteke veoma brzo čita ISO 9960 FS Kao primjer datotečnog sistema s kontinualnom alokacijom opisaće se ovaj sistem koji se koristi na CD ROM uređajima. CD je svakako uređaj kod koga proširivanje veličine datoteke nije moguće, pa prednosti kontinualne alokacije u brzini pristupa daleko premašuju eventualne mane. CD-ROM se sastoji od više staza (track) od kojih svaka može imati različit datotečni sistem, pa i miješati datotečne sisteme namijenjene za čuvanje datoteka i one za audio zapise. Prazno (32K) Deskriptor Sadržaja (2K) Terminalni deskriptor(2k ) Tablica staza Direktorij Direktorij Sadržaj datoteka Tip(boot, primarni, dodatni, term), Signature Za primarni: identfikatori, veličina bloka, vršni element direktorija, veličina i pozicija tablice staza, broj diska, datumi i vremena, kopirajt Poz.direktorija Dužina Dužina dodatnih iimena atributa direktorija Ime direktorija Roditelj Bajta Dužina. imena Pozicija datoteke Veličina datoteke Vrijeme i dan Br. CD-a Ime datoteke Praznina Sys Dužina dodatnih atributa Dužina elementa direktorija Flegovi Preplitanje Bazno ime. eks ; ver Slika 172 Struktura ISO 9960 Zapis u formatu ISO 9960 se sastoji od sektora velikih 2352 bajta, od kojih su 2048 namijenjeni za podatke, a ostatak su zaglavlja i korekcija grešaka. Početni dio od 16 sektora se ne koristi. Zatim slijede deskriptori sadržaja, veliki po jedan sektor. Od njih je najvažniji deskriptor primarnog sadržaja (tip 1) koji sadrži podatke o veličini logičkih blokova, autorskim pravima na CD, verziji datotečnog sistema, datumu i vremenu kreiranja CD-a itd. Jedan od deskriptora (tip 0) može sadržati boot program. Posljednji deskriptor koji se navodi je terminator skupa deskriptora (tip 255). U deskriptoru primarnog sadržaja se nalaze i podaci o lokaciji sadržaja direktorija. Svaki element direktorija ima strukturu kao na slici Slika 172. Prva dva polja definišu veličinu elementa direktorija i veličinu dodatnih atributa. Zanimljivo je da se podaci o lokaciji datoteke i njenoj veličini na CD-u čuvaju i u Big Endian i u Little Endian formatu. Nakon toga se u odvojenim bajtima čuvaju dan, mjesec, godina, sat, minuta, sekunda i vremenska zona kreiranja datoteke. Zatim slijedi indikator bajt čiji pojedini bitovi govore da li je datoteka

278 Alokacija datoteka ulančanim listama skrivena, koristi dodatne atribute ili je zadnja datoteka u direktoriju. Polje preplitanja omogućava da se kontinualna alokacija zamijeni ekstentnom koja se sastoji od više kontinualnih dijelova. Naredno polje omogućava da se navede oznaka CD-a kome pripada data datoteka (ako nije na istom CD-u). Na samom kraju je ime datoteke sa dužinom ispred imena i oznakom verzije iza tačka/zareza Alokacija datoteka ulančanim listama Druga metoda za smiještanje datoteka se izvodi vođenjem evidencije za njene diskovne blokove koristeći ulančanu listu, kao što je to prikazano na slici Slika 173. Prva riječ svakog bloka se koristi kao pokazivač na sljedeći blok. U odnosu na kontinualnu alokaciju, u ovoj alokacionoj tehnici se može koristiti svaki blok na disku i na taj način nema gubitka diskovnog prostora zbog fragmentacije, diska izuzev interne fragmentacije koja se javlja u zadnjem bloku svake datoteke. Dovoljno je da u elementu direktorija smjestite samo diskovnu adresu početnog bloka a da se ostalim blokovima može prići koristeći listu. Pristup datotekama se obavlja sekvencijalno, a u slučaju da pristupamo datoteci slučajnim pristupom, pristup je izuzetno spor jer je potrebno pročitati sve blokove ispred da bi se došlo na željeni blok. a.txt, blok 0 b.txt blok 0 a.txt, blok 1 a.txt, blok 3 a.txt,blok 2 b.txt,blok Slika 173 Alokacija ulančanom listom Kod ove alokacione tehnike, veličina bloka nije više jednaka stepenu broja 2 jer na početku ima pokazivač koji pokazuje na sljedeći blok. Rad sa ovakvim blokovima je manje efikasan jer je potrebno uložiti dodatni, interni, rad kako bi se, recimo, dva bloka spojila a da se eliminišu pokazivači (možda je potrebno izvršiti i kopiranje što utiče na performanse programa koji koristi takve blokove podataka). Primjer ovakve alokacije je na Commodore 64. Na 18. traci njegove diskete je direktorij s imenima datoteka i početnom trakom i sektorom svakog programa, a na početku svakog sektora je pokazivač na narednu traku i sektor (2 bajta) nakon čega slijedi 254 bajta podataka Alokacija sa ulančanim listama koje koriste memoriju Obije mane alokacione tehnike sa ulančanim listama mogu se razriješiti uklanjanjem pokazivača iz svakog diskovnog bloka i premještanjem u memoriju. Na slici je prikazan mogući izgled tabele. Imamo dvije datoteke. Datoteka A koristi diskovne blokove u redosljedu 4,7,2,10 i 12, dok datoteka B koristi blokove diska u redosljedu 6,3,11 i 14. Koristeći tabelu, možemo početi sa blokom 4, čiji sadržaj predstavlja indeks sljedećeg bloka koga treba koristiti, pa sve do kraja datoteke koja je označena specijalnim znakom, recimo 1, kako je prikazano na slici. Ovakva tabela u memoriji se naziva FAT tabela (engl. File Allocation Table).

279 11.31.DOS/Windows FAT 279 U ovoj organizaciji, slučajni pristup datoteka je omogućen jer se diskovnom bloku može prići brzo s obzirom da se pretražuje tabela u memoriji, a ne čitanjem diskovnih blokova što uzrokuje sporost u pretraživanju. Kao u prethodnoj alokacionoj tehnici, dovoljno je imati pokazivač na prvi blok datoteke koji se drži u elementu direktorija bez obzira koliko velika datoteka može biti. Osnovna mana, kod ove alokacione tehnike, je što cijela tabela mora biti u memoriji cijelo vrijeme. Kod 20 GB diskova i 1KB veličine bloka, tabela će imati 20 miliona elemenata za svaki od 20 miliona diskovnih blokova. Svaki element treba da ima minimalno 3 bajta. Radi brzine u izvršavanju ova veličina bi trebala biti jednaka 4 bajta. Dakle, tabela će biti velika 60 MB ili 80 MB glavne memorije cijelo vrijeme, u zavisnosti da li je sistem optimiziran za prostor (60MB) ili vrijeme pretraživanja (80MB). Razumljivo da bi se ovakva tabela mogla staviti u virtualnu memoriju ali bi i tada zauzimala značajan dio virtualne memoriji i povećala promet između glavne i virtualne memorije. Ipak, pristup je veoma popularan. MS-DOS i Windows 98 koriste FAT datotečni sistem i kasnije Windows verzije ga podržavaju. Zbog jednostavnosti strukture, to je standardni datotečni sistem na USB prenosnim medijima DOS/Windows FAT Najpoznatija realizacija datotečnog sistema sa FAT tablicama je ona korištena u MSDOS i Windows. FAT tablica se sastoji od elemenata velikih 12, 16 ili 32 bita. Boot sektor i BIOS parametar blok FAT 1. kopija FAT 2. kopija Korijenski direktorij (samo FAT12 i FAT 16) Sadržaj datoteka i ostali direktorija Ime datoteke Ne koristi se u MS DOS Atributi Ekst. imena Datum pristupa Vrijeme i datum kreiranja Slika 174 Struktura FAT particije Prvi klaster 7 Vrijeme i datum zadnjeg upisa Veličina Slika 174 prikazuje osnovnu strukturu FAT particije. Particija (ili disketa) s FAT datotečnim sistemom počinje boot blokom čiji se početni dio zove BIOS parameter block. U njemu se nalazi opis strukture datotečnog sistema, prije svega parametri o veličini blokova i potrebnih tablica. Nakon boot bloka, OS čuva na disku dvije kopije ove tabele pokazivača (File Allocation Table). U verzijama FAT 12 i FAT 16 iza ovih tabela se nalazi korijenski direktorij,

280 DOS/Windows FAT pa područje podataka a u FAT 32 može stojati bit mapa slobodnih blokova ili odmah započeti područje podataka. Svaki element FAT tabele je broj u little endian koji pokazuje na naredni član u lancu. U slučaju FAT 12 se dva pokazivača pakuju u 3 bajta. Neka element s rednim brojem 0x38 pokazuje na element s rednim brojem 0x39, a on na element s rednim brojem 0x3A. Tada bi bajtovi koji odgovaraju elementima 0x38 i 0x39 imali vrijednosti kao na slici Slika 175: Format Adresa od početka FAT tabele Vrijednosti FAT A0 03 FAT A 00 FAT E A Slika 175 Raspored bajtova u FAT tabeli Element korijenskog direktorija u MS DOS predstavljen je sljedećom strukturom. Ostali direktoriji su smješteni unutar datoteka. BYTE Name[8]; /* Ime datoteke, sa velikim slovima nadopunjen sa praznim znakovima */ BYTE Extension[3]; /* Proširenje velikim slovima. Nadopunjen sa znakom prazno. Ne postoji separator '.'. Separator se dodaje zbog čitljivosti kada se imena datoteka ispisuju */ BYTE Attributes; /* Sadrži kod atributa */ BYTE Reserved[10]; /* Reservisano za Windows NT. Postavljase na nulu kada se kreirajudatoteke/direktoriji.*/ WORD Time; /* Vrijeme poslednjeg pisanja (recimo kreiranje datoteke/direktorija) */ WORD Date; /* Datum poslednjeg pisanja */ WORD startcluster; /* Pokazivač na prvi klaster datoteke*/ DWORD filesize; /* Veličina datoteke u bajtima. Kod modifikacije datoteke ovo polje treba ažurirati*/ Od Windows 95 i 98 struktura direktorija je proširena, dodavanjem je podrške za duga imena datoteka. Postoje dva tipa elementa direktorija u Windows 98 datotečnom sistemu. Prvi od njih zvaćemo osnovnim elementom i prikazan je u navedenoj struktuir. Osnovni element direktorija ima sve informacije koje su postojale u elementu direktorija starijih Windows sistema, i više od toga. Deset bajta koja počinju koristiti kod NT polja su dodana na starije verzije Windows 95 struktura, koja nisu ranije bila korišćena (označena sivom bojom). Najvažnije poboljšanje polja je da povećava broj diskovnih blokova kojima se može pristupiti sa 2 16 na Ova struktura obezbjeđuje ime u starom stilu, znaka koje je preuzeto od DOS- a. Šta ćemo sa dugim imenima datoteka? Odgovor na ovaj problem je da se mora zadržati ova struktura zbog datoteka koje treba podržati, dok za duga imena će se koristiti druga struktura elementa direktorija. Slika 177 prikazuje alternativni oblik elementa direktorija koji može sadržati do 13 znakova dugog imena datoteke.

281 11.32.Indeksni čvorovi (engl. I-Nodes) znakova imena 0 6 znakova imena 0 2 znaka Redni broj dijela imena Atributi Kontrolna suma Slika 176 Element direktorija dugog imena datoteka Da bi se dobilo dugo ime potrebno je je bilo zapisati ga u strukturu datu na slici ispred osnovnog imena u obrnutom redosljedu (Slika 177). Pri tome se kod imena koristi Unicode, kako bi se omogućila i nacionalna slova u imenima. Polje atributa svakog elementa sa dugim imenom je sadržalo vrijednost 0x0f, koji je za prethodne sisteme nečitljiv i biće ignorisan ako se čita sa starim sistemima ( na disketi na primjer). Bit u polju sekvenca kaže sistemu koji je posljednji element. 43 f t e. d A 0 C o c x p r o i z A 0 C v o d n j i 0 0 N a 1 I s t r a A 0 C 7E 1 i v a n j 0 0 e U I S T R A I ~ 1 D O C A 0 S Vrijeme i dan Dan MSB Vrijeme i dan LSB Veličina Kreiranja pristu 1.blok pisanja 1.blok datoteke Slika 177 Dugo ime datoteke, položaj u tabeli direktorija Mada izgleda veoma kompleksno, potrebno je bilo obezbijediti kompatibilnost sa starim sistemima. Fiksna veličina tablica u FAT sistemu dovodi do bitnih ograničenja u maksimalnoj veličini datotečnog sistema. Što je klaster veći, veći je i maksimalni kapacitet, ali je slabije iskorišten zbog interne fragmentacije (Slika 178). Veličina klastera FAT 12 FAT 16 (alokacija po sektorima) FAT 16 (alokacija po klasterima) FAT bajta 2 MB 32 MB 1 KB 4 MB 32 MB 2 KB 8 MB 32 MB 128 MB 4 KB 16 MB 32 MB 256 MB 1 TB 8 KB 32 MB 512 MB 2 TB 16 KB 32 MB 1 GB 4 TB 32 KB 2 GB 8 TB 64 KB 4 GB 16 TB Slika 178 Maksimalni kapacitet FAT particije u zavisnosti od veličine klastera Treba reći da maksimalni kapaciteti FAT 32 particija se mogu realizovati samo posebnim softverom, jer Windows 98 može formatirati FAT 32 particiju na maksimalno 2 TB, a noviji Windows 7 na daleko manjih 32 GB Indeksni čvorovi (engl. I-Nodes) Naša naredna tehnika kojom se vodi evidencija o diskovnim blokovima datoteke se naziva alokacija diskovnog prostora pomoću indeksnih čvorova. Indeksni čvor predstavlja strukturu podataka pridruženu jednoj datoteci na disku. Ova struktura podataka se sastoji od atributa datoteke i pokazivača na blokove datoteke ili blokove sa diskovnim adresama, tj. indeksne blokove. Velika prednost ove sheme u odnosu na ulančanu listu blokova datoteke u memoriji je da indeksni čvor treba da bude u memoriji samo kada se odgovarajuća datoteka otvori. Za

282 CP/M datotečni sistem svaki indeksni čvor koji zauzima n bajta i maksimalno je moguće otvoriti k datoteka, ukupan memorijski prostor koji je potrebno imati za odgovarajuće indeksne čvorove jednak je n*k bajta. Samo ovoliki indeksni prostor treba rezervisati unaprijed. Ovakav niz indeksnih čvorova je obično znatno manji nego tabela prikazana u prethodnoj alokacionoj tehnici (FAT pristup). Razlog je jednostavan. Tabela iz prethodnog primjera sadrži povezanu listu svih diskovnih blokova i proporcionalna je veličini diska (čitaj svih datoteka, i otvorenih i nekorišćenih). Ako disk ima n blokova, tabela treba n elemenata. Ako veličina diska raste, i broj elemenata u tabeli raste. Nasuprot tome, shema alokacije koja koristi indeksne čvorove treba jedan niz u memoriji čija je veličina proporcionalna maksimalnom broju datoteka koje mogu biti otvorene u jednom trenutku. To znači da nije važno da li je disk velik 1 GB ili 10 GB ili 100 GB CP/M datotečni sistem Ime datoteke ekstenzija Oznaka korisničkog direktorija Komad Ukupno blokova Pokazivači na disk blokove Slika 179 Struktura CP/M direktorija Jedan od prvih operativnih sistema za mikroračunare, CP/M koristio je indeksne čvorove s jednim nivoom. Tablica elemenata direktorija, pored imena datoteka i polja user code (koje predstavlja redni broj direktorija) sadrži šesnaest pokazivača na blokove od po 128 bajta do 32K i brojač koji kaže koliko blokova je iskorišteno (Slika 179). Ako je datoteka duža od 16 blokova, ponavlja se isti element u strukturi direktorija sa rednim brojem ekstenta. Ovakav datotečni sistem ima ozbiljna ograničenja na maksimalne veličine datoteka, ali je zadovoljavao za tadašnje kapacitete disketa Indeksni čvorovi s više nivoa Jedan od problema kod indeksnih čvorova što ima fiksan broj direktnih diskovnih adresa blokova. Šta će se desiti ako veličina datoteke zahtjeva dodatne diskovne adrese? Jedno od rješenja je da se rezerviše posljednja diskovna adresa za jedan blok koji sadrži dodatne diskovne adrese i često se zove indirektni blokom ili adresnim blokom. To znači da njegov sadržaj ne predstavlja podatke datoteke već adrese preko kojih se dolazi do blokova podataka. Njegov sadržaj predstavljaju direktne diskovne adrese poput onih koje se mogu naći u indeksnom čvoru (obično je 10 direktnih pokazivača i 11 pokazivač na prvi indirektni blok). Ideja se može proširiti da se koriste dvostruko indirektni blokovi i trostruko indirektni blokovi, kao što je prikazano na slici Unix datotečni sistem Pristup preko indeksnih čvorova na više nivoa primijenjen je u datotečnim sistemima kod većine operativnih sistema nastalih od Unix sistema. Jedno područje diska sadrži indeksne čvorove, relativno male veličine, po jedan za svaku datoteku. Unutar indeksnog čvora se ne čuva ime datoteke, ali se čuvaju podaci o njenoj veličini, vremenima kreiranja i pokazivačima na blokove. Zavisno od podvarijanti datotečnog

283 Unix datotečni sistem 283 sistema, zaglavlje datoteke sadrži više pokazivača na blokove podataka (npr 10), te pokazivače na jednostruko, dvostruko indirektne blokove i eventualno trostruko indirektne blokove (na primjer po jedan za svaki od njih), Slika 180. Atributi Blok podataka Blok podataka Blok podataka Direktni pokazivači Indirektni pokazivači jednostruko dvostruko trostruko Blok podataka Blok podataka Blok podataka Blok podataka Blok podataka Blok podataka Blok podataka Blok podataka Blok podataka Slika 180 Unix datotečni sistem, indeksna alokacija na 1,2,3 i 4 nivoa Neka je n broj pokazivača koji se mogu smjestiti u blok podataka. U ovom primjeru, za pristup blokovima između 0 i 9, njihovu poziciju čitamo iz direktnog pokazivača. Za pristup blokovima između 10 i 10+(n-1), njihove pozicije saznajemo iz pokazivača koji su smješteni

284 Unix datotečni sistem u bloku na koji pokazuje jednostruko indirektni pokazivač. Za pristup blokovima između 10+n i 10+n+n 2-1 najprije preko dvostruko indirektnog bloka pokazivača se nađe pokazivački blok prvog nivoa, u njemu pokazivački blok drugog nivoa, a iz pokazivačkog bloka drugog nivoa dođe do podataka. Za pristup podacima između bloka 10+n+n 2 i 10+n+n 2 +n 3-1 se koriste tri nivoa indirekcije. Prema tome, u ovakvim datotečnim sistemima, gornja granica veličine datoteke je određena s dva faktora, zbog načina alokacije i veličine pokazivača, od kojih se uzima manji od njih. Ako je p veličina pokazivača, b veličina bloka, n=b/p broj pokazivača u bloku, D broj direktnih pokazivača u indeksnom čvoru, I broj indirektnih pokazivača u indeksnom čvoru, V broj dvostruko indirektnih pokazivača u indeksnom čvoru, T broj trostruko indirektnih pokazivača u indeksnom čvoru, maksimalna veličina datoteke zbog načina alokacije je M=b(D+In+Vn 2 +Tn 3 ). Maksimalna veličina datoteke zbog veličine pokazivača je M=2pb. Ovakav način alokacije datoteka se odlikuje dobrom skalabilnošću jer je zadovoljavajući i za male i za velike datoteke. Blokovi se alociraju dinamički i indirektni blokovi postoje samo za velike datoteke. Pristup malim datotekama je jako brz. Mana pristupa je što velike datoteke zahtijevaju puno pretraživanje da bi se pristupilo indirektnim blokovima. Jednom kada se nađe indeksni čvor, možete se pristupiti svim blokovima datoteke. Kako naći indeksni čvor? U nekim Unix sistemima indeksni čvor je u rezervisanom dijelu diska, pa se datotekama pristupa interno navodeći poziciju indeksa. Mana ovog pristupa je što indeksni čvor nije blizu podacima (i to zahtijeva kretanje glave diska) i što je broj indeksnih čvorova unaprijed određen u vrijeme formatiranja diska. U kasnijim verzijama kao što su Berkeley fast file system (FFS) ili Ext2 (linux) indeksni čvorovi su raspoređeni po disku na različitim mjestima, ali se njihova pozicija opet može izračunati iz njegovog broja. Kako nalazimo broj indeksnog čvora za datoteku? On je naveden u strukturi datoteke koja predstavlja direktorij. Struktura direktorija u tradicionalnom Unix sistemu je izuzetno jednostavna i prikazana je na slici Slika 181. Svaki element direktorija sadrži ime datoteke i broj indeksnog čvora vezanog za datu datoteku. Sve dodatne informacije o tipu, veličini, vremenima i vlasništvu kao i diskovnim blokovima sadržaja datoteke su sadržane u indeksnom čvoru. Neki Unix sistemi imaju drugačiji raspored datotečnog sistema, ali element direktorija je obavezno jednostavan i sastoji se samo od dva polja, imena datoteke i njenog broja indeksnog čvora Broj indeksnog čvora Ime datoteke Slika 181 Element Unix direktorija Kada se datoteka otvori, datotečni sistem mora uzeti ime datoteke da bi pronašao njene blokove podataka. Pogledajmo u primjeru ispod, kako se pretražuje datoteka /usr/bin/wget. Ovdje koristimo Unix kao primjer, ali je algoritam pretraživanje u osnovi isti za sve hijerarhijske datotečne sisteme. Prvo se locira korijenski direktorij. Indeksni čvorovi formiraju jednostavan niz koji se pretražuje na osnovu informacija koje se nalaze u super-bloku. Prvi element u ovom nizu predstavlja indeksni čvor korijenskog direktorija. Datotečni sistem pretražuje unutar bloka podataka korijenskog direktorija ime «usr» da bi našao, pored njega, njegov broj indeksnog čvora (npr. 60). Zatim se pristupa indeksnom čvoru broj 60 (koji može biti u memoriji ili na disku) u okviru koga se na prvom mjestu direktnih pokazivača, nalazi pokazivač koji kaže da se sadržaj direktorija /usr nalazi u diskovnom bloku

285 11.36.Ekstentna alokacija datoteka Čitanjem diskovnog bloka broj 102 dobijamo sadržaj direktorija /usr u kome pokušavamo da pronađemo direktorij /usr/bin. Kada pronađemo direktorij bin čitamo njegov indeksni čvor u memoriju koji je jednak 105 i čitamo njegov sadržaj koji se nalazi na bloku broj 436. Na njega pokazuje prvi direktni pokazivač u indeksnom čvoru. Sadržaj bloka broj 436 predstavlja sadržaj direktorija /usr/bin i u njemu pretražujemo ime za datoteku wget sa indeksnim čvorom koji je jednak 150. Relativna imena datoteke se pretražuju na isti način kao i apsolutna samo je startna tačka pretraživanja radni direktorij umjesto korijenskog direktorija. Svaki direktorij ima. i.. koji se formiraju po kreiranju direktorija. Element. ima indeksni čvor tekućeg direktorija, a.. indeksni čvor direktorija roditelja. Dakle procedura pretraživanja datoteke../etf/prog.c jednostavno pretražuje u radnom direktoriju, nalazi broj indeksnog čvora direktorija roditelja. Zatim čita dati indeksni čvor u memoriju i preko njega stiže do sadržaja tog direktorija u kome pretražuje datoteku prog.c. Ne postoji poseban mehanizam za ovo pretraživanje. Imena su data u ASCII formatu. Postoje određene konvencije za imena direktorija. Na primjer, u Linux sistemima: /bin direktorij sadrži komande i alate koje koriste korisnici iz komandne školjke. /boot direktorij sadrži potrebne datoteke za podizanje sistema. /dev direktorij sadrži virtualne datoteke koje predstavljaju periferijske uređaje koji su prikopčani na sistem. /etc direktorij sadrži konfiguracijske datoteke svega što se nalazi na tom računaru. /home direktorij sadrži direktorije za korisničke podatke svakog korisnika na sistemu pri čemu direktorij dobiva ime prema imenu korisnika, npr. /home/ana/. Sve datoteke koje kreira korisnik, kao i njegove konfiguracijske datoteke, se smještaju u ovaj direktorij. /lib direktorij treba sadržavati samo one statičke i dinamičke biblioteke koji su potrebni za izvršavanje binarnih datoteka u direktorijima /bin/ i /sbin/. /mnt direktorij sadrži privremeno montirane datotečne sisteme kao CD-ROM, Floppy uređaj ili neke druge particije. /opt direktorij obezbjeđuje skladištenje velikih, statičkih aplikacijskih paketa. /proc direktorij sadrži specijalne virtualne datoteke koji ili izvlače informacije ili ih šalju jezgru. /root direktorij je privatni direktorij sistemskog administratora. /sbin direktorij sadrži izvršne datoteke koje koristi samo root korisnik (admin, superuser). /tmp direktorij sadrži privremene (temporary) fajlove. /usr direktorij sadrži datoteke kojima svatko u sistemu može pristupiti. Njegov poddirektorij /usr/bin/ sadrži komande koje pokreću različite aplikativne programe, u direktoriju /usr/games se nalaze igre, u /usr/src izvorni kod programa, u /usr/local programi koji se instaliraju na neuobičajen način itd. /var direktorij sadrži promjenjive ili variable datoteke. To su datoteke koje se stalno mijenjaju bez intervencije korisnika kao npr. log datoteke (/var/log/) ili printer spool datoteke (/var/spool/) Ekstentna alokacija datoteka Porastom kapaciteta diskova i potrebom za većim datotekama zbog predstavljanja video sadržaja, uočava se nedostatak indeksne u odnosu na kontinualnu alokaciju. Pristup velikoj datoteci koristeći indeksne čvorove s tri nivoa, često zahtijeva čitanje četiri bloka da bi se pročitao jedan, dok se kod kontinualne alokacije tom bloku može direktno pristupiti. Stoga,

286 NTFS neki datotečni sistemi kombinuju indeksnu alokaciju na jednom nivou i kontinualnu alokaciju. Umjesto da pokazivači indeksnog čvora pokazuju na blokove fiksne veličine, oni pokazuju na kontinualne blokove promjenjive veličine, koji se zovu ekstenti. Tako se u području indeksa čuva za svaki ekstent početni klaster i koliko klastera on zauzima. Na primjer, u području direktorija se uz datoteku može navesti sljedeća tabela kao na slici Slika 182, koja će značiti da ova datoteka zauzima klastere 12,13,100,101,102,103,104,105,1200,1201 Početni klaster Veličina Slika 182 Primjer ekstentne alokacije Postojanje velikih kontinualnih blokova predstavlja malu fragmentaciju u smislu fizičke pozicije klastera. Mana ove alokacije je potencijalna eksterna fragmentacija kada disk postane skoro pun, pa se ne može pronaći dovoljno veliki kontinualni blok NTFS NTFS (engl. New Technology File System) je standardni Microsoft-ov datotečni sistem. Ovaj datotečni sistem je jedan od najpoznatijih predstavnika ekstentne alokacije. Ovdje će se prikazati kratak opis ovog sistema sa nekim od problema sa kojima se suočava kao i rješenja koja koristi. NTFS je dizajniran za pouzdanost, sigurnost i podršku velikim uređajima. Skalabilnost je postignuta upotrebom generičnih struktura podataka koje se umotaju oko struktura podataka specifičnog sadržaja. Za razliku od većine datotečnih sistema u NTFS je sve datoteka (i bit mape, indeksi, direktorij) i može biti bilo gdje na disku. Samo boot sektor je na fiksnom mjestu i pokazuje na $MFT datoteku. Druga specifičnost je struktura same datoteke. U Unixu, datoteka se predstavlja nizom bajta, dok je kod NTFS-, datoteka skup atributa i svaki atribut predstavlja niz bajta. Poz Ime Opis 0 $MFT Sama MFT 1 $MFTMirr Kopija prvih elemenata MFT 2 $LogFile Žurnal koji prati izmjene metapodataka 3 $Volume Informacije o disku 4 $AttrDef Opisi svih atributa: indentifikatori, imena i veličine 5. Korijenski direktorij 6 $Bitmap Alokacijski status svakog klastera 7 $Boot Boot sektor 8 $BadClus Klasteri s lošim sektorima 9 $Secure Informacije o pravima nad datotekama 10 $Upcase Verzija velikim slovima svakog Unicode znaka 11 $Extend Direktorij s datotekama s opcionim proširenjima Slika 183 Sadržaj datoteke $MFT Najvažnija datoteka u NTFS-a je $MFT (engl. Master File Table). U njoj su opisane ostale datoteke, pri čemu opis svake zauzima po 1 KB u $MTF-u i sastoji se od zaglavlja (42 bajta) i atributa. Dvanaest prvih datoteka u MFT su specijalne datoteke navedene u tabeli, na slici Slika 183

287 11.37.NTFS 287 Struktura zaglavlja je prikazana na slici Slika 184. Pozicija Značenje Bitno 0-3 Oznaka FILE za datoteku ili BAAD za loš blok Ne 4-5 Pozicija u nizu popravki Da 6-7 Broj elemenata u nizu popravki Da 8-15 $Logfile LSN Ne Broj sekvence Ne Broj logičkih veza Ne Pozicija prvog atributa Da Flegovi (u upotrebi, direktorij) Da Korištena veličina MFT elementa Da Alocirana veličina MFT elementa Da Veza datoteke na bazni slog Ne ID sljedećeg atributa Ne Atributi i područje za popravke Da Slika 184 Struktura zaglavlja opisa datoteke u MFT Nakon zaglavlja MFT elementa preostalih bajta popunjavaju njegovi atributi. Kako pokazuje Slika 185, svaki atribut ima dalje zaglavlje i sadržaj bajta Zaglavlje elementa Zaglavlje atributa Sadržaj atributa Zaglavlje atributa Sadržaj atributa Neiskorišteno Slika 185 Struktura elementa MFT tabele Zaglavlje atributa određuje njegov tip (numerički identifikator), veličinu i ime (Unicode UTF 16), flegove da li je kompresovan i šifrovan. Neki važniji atributi s navedenim identifikatorom su: $FILE_NAME (48) za ime datoteke, $BITMAP (176) za slobodne blokove, $DATA (128) sa sadržajem, $INDEX_ROOT (144) za opis direktorijske strukture, $INDEX_ALLOCATION (160) za elemente direktorijske strukture. Ako za opis neke datoteke nije dovoljno 1024 bajta, atribut unutar MFT-a može biti zaglavlje koje ukazuje na dodatnu datoteku čiji je nastavak tipa atributa. Ovakav oblik atributa je poznat pod nazivom nerezidentni atribut. Tijelo atributa se može smjestiti u samu MFT datoteku ili biti eksterni atribut (pokazuje na klaster). Tijelo atributa može biti i sam sadržaj datoteke. Za kratke datoteke (do 700 bajta) podaci se mogu staviti i u sam MFT. Za duže datoteke, u zaglavlju $DATA (tip 128) atributa polje runlist pokazuje na listu ekstenta. Kako se u opisu datoteke može nalaziti više $DATA atributa, NTFS datoteka može da ima više od jednog toka podataka. Višestruki tokovi podataka imaju svoju upotrebu, na primjer, velike grafičke slike mogu imati i male grafičke slike smještene u istoj datoteci (engl. thumbnail). Tok podataka može sadržati do 264 bajta. Kada je $DATA atribut nerezidentni, on pokazuje na seriju kontinualnih blokova memorije, pa se zato ovaj datotečni sistem ubraja u ekstentne sisteme, pri čemu se ovdje koristi terminologija data-run za svaki kontinualni niz sektora.

288 Upravljanje diskovnim prostorom To važi i za samu $MFT. S obzirom na velike datoteke, odnosno velik porast datotečnog sistema, inicijalno se rezerviše 12,2% prostora na particiji za rast MFT-a. Dakle, on može rasti bez fragmentiranja sve dok se inicijalno pridružen prostor ne ispuni, poslije čega se rezerviše drugi veliki prostor. Dakle, ako MFT postane fragmentiran on će se sastojati od malog broja vrlo velikih fragmenata. Direktoriji su organizovani kao balansirano B stablo u atributima $INDEX_ROOT (rezidentni) i $INDEX_ALLOCATION (nerezidentni) koji sadrže $FILE_NAME atribute. Ovakva struktura omogućava brzo nalaženje datoteka i ta lista se automatski sortira pri dodavanju datoteke. Samo smo pomenuli neke od načina kako NTFS rješava probleme koji su vezani za stare i jednostavne datotečne sisteme. NTFS obezbjeđuje dodatne karakteristike kao što su: složeni sistem zaštite, šifrovanje i kompresija podatka. Opisujući sve ove karakteristike i njihovu implementaciju bi zahtijevalo mnogo više prostora nego što ga možemo dati ovdje Upravljanje diskovnim prostorom S obzirom da se datoteke smiještaju na disk, upravljanje diskovnim prostorom predstavlja osnovnu brigu projektantima datotečnog sistema. Za smiještanje n bajta u datoteku, postoje dvije osnovne strategije: alociranjem n susjednih bajta diskovnog prostora i podjelom datoteke u jedan broj diskovnih blokova. Kao što smo vidjeli, smiještanje datoteke kao kontinualnog niza bajta ima očigledan problem ako datoteka počne da raste, tako da će se vjerovatno morati premjestiti na drugo mjesto na disku. Isti problem postoji za segmente u memoriji, osim što je premještanje segmenata u memoriji relativno brza operacija u poređenju sa premještanjem datoteke sa jednog mjesta na drugo. Zbog ovih razloga, gotovo u svim datotečnim sistemima, datoteke se dijele u blokove fiksne veličine, kako bih lakše mogli smjestiti na disk bez potrebe da se nalazi dovoljan prostor za cijelu datoteku Veličina bloka Nakon odluke da datoteku treba smjestiti u blokovima iste veličine, trebalo je odgovoriti na pitanje, kolike veličine bi trebao da bude blok? S obzirom na organizaciju diska sa sektorima, stazama (čitaj, skup sektora) i cilindrima (čitaj, veći skup sektora), izgleda da su oni očigledni kandidati da budu alokaciona jedinica mada su zavisni od uređaja što im predstavlja veliki minus. Na primjer, ako je alokaciona jedinica jednaka veličini cilindra, tada to znači da svaka datoteka, čak i ona koja zauzima samo jedan bajt će zauzeti cijeli cilindar. S druge strane, korišćenje malih alokacionih jedinica ima za posljedicu da će se svaka datoteka sastojati od mnogo blokova. Čitanje svakog bloka zahtjeva kašnjenje kod pozicioniranja na stazu kao i rotaciono kašnjenje tako da će čitanje datoteke, koja se sastoji od mnogo malih blokova biti prilično sporo. Na primjer, pogledajmo disk koji ima bajta/stazi, rotaciono kašnjenje od 8,33 msec i srednje vrijeme pozicioniranja od 10 msec. Vrijeme da se pročita blok od k bajta se onda izračunava kao suma kašnjenja kod pozicioniranja na stazu, rotacionog kašnjenja i vremena prijenosa podataka: ,165 + (k / )x 8,33. Mali blokovi su, stoga, loši za performanse ali dobri za iskorišćenost diskovnog prostora. Potrebno je pronaći neku veličinu bloka koja predstavlja kompromis. Veličina bloka od 4 KB predstavlja dobar izbor, ali su neki operativni sistemi napravili ovaj izbor davno prije, kada su diskovni parametri i datoteke bile različite. Kod Unix-a, veličina blokova od 1 KB se najčešće koristi. Kod MS-DOS-a, mogla je biti od 512 do 32 KB.

289 11.40.Vođenje evidencije o slobodnim blokovima 289 Pojavom većih diskova i velikih datoteka brzina pristupa je važnija od iskorištenja prostora. Za diskove čije su dimenzije u terabajtima, preporučljiva veličina bloka je 64 kilobajta Vođenje evidencije o slobodnim blokovima Kada smo izabrali veličinu bloka, sljedeće važno pitanje predstavlja vođenje evidencije o slobodnim blokovima. Pet metoda se koristi, od kojih su dvije prikazane na slici. Prva se sastoji od korišćenja ulančane liste diskovnih blokova (Slika 186, lijevo), pri čemu svaki blok drži brojeve slobodnih diskovnih blokova. Sa 1 KB blokom i 32 bitnim brojem diskovnog bloka, svaki blok može držati brojeve 255 slobodnih blokova, pri čemu je jedno mjesto potrebno za pokazivač na sljedeći blok. Jedan 256 GB disk treba listu slobodnih blokova od maksimalno 1,052,689 blokova da bi držao svih 2 28 brojeva diskovnih blokova. Često se slobodni blokovi koriste da bi držali listu slobodnih blokova. Blok 40 Blok 72 Blok Bitmapa slobodnih blokova Indeksni čvor datoteke s obrisanim blokovima Prazan blok Prazan blok Blok pokaziva ča Prazan blok Prazan blok Ulančana lista slobodnih blokova Slika 186 Upravljanje slobodnim prostorom Druga tehnika za upravljanje slobodnim prostorom na disku je bit mapa (Slika 186, centar). Jedan disk sa n blokova zahtjeva mapu sa n bita. Slobodni blokovi su predstavljeni sa 1 u mapama, a alocirani blokovi sa o (ili obrnuto). Jedan 256 GB disk ima 228 blokova od 1 KB i zahtjeva 228 bita za mapu, koja zahtjeva 32,768 blokova. Nije iznenađenje da bit mapa zahtjeva manje prostora pošto koristi 1 bit po bloku prema 32 bita kod modela sa ulančanim listama. Samo ako je disk gotovo pun (t.j. ima nekoliko slobodnih blokova) će model sa ulančanim listama zahtijevati manje blokova nego bit mapa. S druge strane, ako ima jako puno slobodnih blokova, neki od njih mogu se koristiti da drže listu slobodnih blokova bez gubitaka diskovnog kapaciteta. Kada se koristi metoda sa ulančanim listama, samo jedan blok pokazivača se drži u glavnoj memoriji. Kada se datoteka kreira, potrebni blokovi se uzimaju iz liste blokova sa pokazivačima. Kada se završi sa korišćenjem datoteke, čitaju se novi blokovi pokazivača u memoriju sa diska. Slično, kada se pobriše datoteka, blokovi se oslobađaju i dodaju u blok pokazivača na slobodne blokove. Kada se ovaj blok popuni, piše se na disk.

290 Kvote Treća metoda je uvezana lista indeksnih blokova (Slika 186, desno). Koriste se specijalni indeksni čvorovi koji pokazuju na slobodne blokove. Svaki indeksni blok sadrži adrese slobodnih blokova i pokazivač na sljedeći indeksni blok. Veliki broj slobodnih blokova se može naći veoma brzo. Četvrta metoda je korištenje podataka iz druge strukture za opis datoteka da se zaključi koji su blokovi slobodni. Na primjer, u FAT datotečnom sistemu FAT tablica navodi za svaki blok (klaster) njegovog sljedbenika u lancu datoteke. No, ista tablica se može koristiti i za informaciju da li je neki blok slobodan ili neispravan, npr. ukoliko se neki blokovi ne mogu pojaviti u lancu, njihovi brojevi mogu se koristiti u FAT tabeli za oznaku slobodnog bloka. Peta metoda je vezana za ekstentnu i kontinualnu alokaciju. Neki datotečni sistemi, kao što je NTFS rezervišu slobodni prostor za konkretnu datoteku određene veličine (npr 64K za NTFS), čak i ako je ona kraća. Prilikom širenja datoteke, prvo se gleda da li ona ima slobodnog prostora ranije dodijeljenog za nju, a tek ako nema, gledaju se slobodni blokovi predstavljeni bitmapama Kvote Mnogi višekorisnički operativni sistemi ograničavaju korisniku broj datoteka i blokova diska koji mogu zauzeti, u cilju pravilnog upravljanja slobodnim prostorom. Kvote se realizuju tako što se u tabeli otvorenih datoteka postavi pokazivač na tablicu ograničenja blokova i datoteka. Ograničenja se dijele na čvrsta i meka. Kada korisnik pređe meki limit, operativni sistem treba da mu pošalje upozorenje. Prekoračenje čvrstog ograničenja rezultuje zabranom daljnje prijave tog korisnika i on mora tražiti od administratora da mu poveća kvotu ili obriše nepotrebne datoteke Pouzdanost datotečnog sistema Uništenje datotečnog sistema je često teže nego uništenje cijelog računara. Ako se računar uništi vatrom, kafom koja se izlila na tastaturu i sl., zamjena pojedinih dijelova se može obaviti dosta brzo i sa manje ili više novaca. Međutim, ako je datotečni sistem izgubljen na disku, kao rezultat hardverske pogreške ili rezultat lošeg funkcionisanja softvera, rada virusa i sl., vraćanje informacija će biti izuzetno teško, gotovo nemoguće. Za ljude, čije informacije mogu predstavljati programe, dokumente, korisničke datoteke, baze podataka ili radne planove, gubitak podataka dovešće do katastrofalnih posljedica. Kako datotečni sistem ne može nuditi neku vrstu zaštite od fizičkog uništenja opreme ili medija, on bi mogao pomoći u zaštiti informacija. U ovom djelu pozabavićemo se nekim pitanjima koja uključuju mjere zaštite datotečnog sistema. Diskete su ispravne kada napuštaju proizvodne fabrike ali mogu proizvesti «loše» blokove u toku upotrebe. Uređaj za diskete koji se manje koristi ima manju vjerovatnoću da uništi disketni medij. Diskovi često imaju neispravne blokove (engl. bad blocks) i proizvođaču je vrlo teško da ih potpuno eliminiše. Sa ovakvim blokovima na disku radi kontroler diska koji zamjenjuje neispravne blokove sa rezervnim koji su obezbijeđeni za te svrhe. Na ovim diskovima, staze su bar jedan sektor duže nego što je potrebno, tako da bar jedan neispravan blok može biti preskočen i zamjenjujući ga sa praznim prostorom između dva susjedna sektora. Nekoliko rezervnih sektora je obezbijeđeno na svakom cilindru tako da kontroler može automatski uraditi uređivanje ako primijeti da sektor traži više pokušaja čitanja ili pisanja. Dakle, korisnik nije svjestan neispravnih blokova i upravljanja sa njima. I pored toga, kada se na modernim IDE ili SCSI diskovima desi neispravan blok, to će obično završiti katastrofalno

291 11.43.Spašavanje podataka (engl. Backups) 291 jer je ostao bez rezervnih blokova. SCSI obezbjeđuju oporavak od greške poslije uspostavljanja rezervnog bloka umjesto neispravnog bloka. Ako drajver primijeti ovo i prikaže poruku na monitoru, onda korisnik zna da je vrijeme da kupi novi disk kada ova poruka počne da se pojavljuje često. Jednostavno softversko rješenje postoji za problem neispravnih blokova i pogodno je za korišćenje na starim diskovima. Ovaj pristup zahtjeva od korisnika ili datotečnog sistema da pažljivo konstruiše datoteku koja sadrži sve ove neispravne blokove. Ova tehnika ih uklanja iz liste svih slobodnih blokova, tako da se više nikad neće pojaviti u podacima datoteka. Sve dok se datoteka neispravnih blokova ne čita ili piše, problemi ove vrste neće postojati u ostalim datotekama. Treba paziti kod spašavanje podataka (engl. backup) da se ta datoteka ne čita koja bi prouzrokovala zastoj usljed nemogućnosti da se pročitaju njeni blokovi Spašavanje podataka (engl. Backups) Većina korisnika ne pravi spašavanje svojih datoteka jer misle da nije vrijedno utrošenog vremena i uloženog truda oko toga. Međutim, kada se desi uništenje podataka, oni postanu svjesni potrebe za čuvanjem svojih podataka. U firmama, korisnici su svjesni vrijednosti podataka koji se nalaze na medijima i obično vrše spašavanje podataka jedanput dnevno, obično na trake. Moderne trake mogu čuvati desetine ili čak i stotine GB a koštaju 1 KM/GB. Međutim, spašavanje podataka nije jednostavno kako to izgleda te u tom smislu pozabavimo se nekim pitanjima koja se odnose na spašavanje podataka. Spašavanje podataka na trake se izvodi da bi se radilo sa jednim od dva moguća problema: o Oporavak od katastrofalnog događaja o Oporavak zbog nepažnje U prvom slučaju, radi se o oporavku računarskog sistema kome se desilo uništenje diska, požar, poplava ili drugi katastrofalan događaj. U praksi se ove stvari ne dešavaju često, što predstavlja razlog nekim korisnicima da se ne uhvate u koštac sa ovim problemom. Isti ovi korisnici nemaju osiguranje od požara iz istih ili sličnih razloga. Drugi razlog predstavlja brisanje podataka, uslijed nepažnje, koji će kasnije trebati. Ovakav problem se često dešava. Kod Windows-a, datoteka se ne pobriše nego se premjesti u poseban direktorij, nazvan «recycle bin», i mogu se vratiti na mjesto gdje su potrebne. Spašavanje podataka omogućuje korisnicima da vrate datoteke koje su pobrisane nekoliko dana ili sedmica, prije. Pravljenje ovih datoteka kada se vrši spašavanje podatka, predstavlja proces koji traje i zahtjeva dodatni smještajni prostor. Veoma je važno ovo raditi efikasno jer će nam omogućiti vraćanje podataka kasnije u slučaju gubitka podataka. Ova razmatranja dovode do sljedećih pitanja. Prvo, da li treba cijeli datotečni sistem spasiti ili samo njegov dio? U mnogim instalacijama, izvršni programi se drže u ograničenom djelu datotečnog sistema. Nije potrebno spašavati datoteke koje se mogu ponovno instalirati sa CD-a proizvođača. Takođe, većina sistema ima direktorij za privremene datoteke. I njega ne treba spašavati jer mu ime kaže da služi za privremene operacije. U operativnom sistemu UNIX, specijalne datoteke (U/I uređaji) se čuvaju u direktoriju /dev/. Ne samo da spašavanje datoteka ovog direktorija nije potreban, nego je vrlo opasno jer će program za spašavanje «zaglaviti» ako se pokuša sa čitanjem ovih datoteka. Kratko, obično je poželjno da spašavamo samo određene direktorije i sve u njima nego da spašavamo cijeli datotečni sistem. Drugo, spašavanje podataka koji se nisu mijenjali od posljednjeg spašavanje podataka predstavlja samo gubitak smještajnog prostora. Ovakav pristup vodi inkrementalnim sigurnosnim kopijama. Najjednostavniji oblik inkrementalnog čuvanja sigurnosnih kopija je

292 Spašavanje podataka (engl. Backups) da se napravi periodično potpuno spašavanje podatka (puni backup), recimo sedmično ili mjesečno, a zatim se pravi dnevno čuvanje podataka samo onih datoteka koje su modifikovane od posljednje promjene u odnosu na puni backup. Još bolje je, ako se naprave sigurnosne kopije samo onih datoteka koje su modifikovane u odnosu na posljednje spašavanje sigurnosnih kopija, a ne punog backup-a. Ovakvim pristupom se smanjuje vrijeme izrade backup-a ali se usložnjava oporavak od greške, jer je potrebno vratiti posljednji snimljeni puni backup a na njega dodati sve inkrementalne sigurnosne kopije u ispravnom redosljedu, prvo najstarija do najkasnije. Da bi oporavak bio jednostavniji, često se koriste složenije sheme inkrementalnog čuvanja sigurnosnih kopija. Treće, pošto se enormno veliki iznos podataka spašava, poželjno je komprimovati podatke prije pisanja na trake. Međutim, kod mnogih kompresionih algoritama, samo jedan neispravan blok na traci može dovesti kod algoritma za dekompresiju da cijela datoteka ili čak i cijela traka postanu nečitljivi. Dakle, pitanje kompresije podataka mora se pažljivo razmotriti. Četvrto, teško je izvršiti spašavanje podataka na aktivnom datotečnom sistemu. Ako se datoteke i direktoriji dodaju, brišu i modifikuju u toku procesa spašavanja podataka, spašeni podaci mogli bi biti nekozistentni. S obzirom da spašavanje datotečnog sistema traje nekoliko sati, potrebno je ovu operaciju raditi u toku noći kada je datotečni sistem neaktivan. Iz ovih razloga, algoritmi su osmišljeni za pravljenje brzog snimka stanja (engl. snapshot) datotečnog sistema kopiranjem kritičnih struktura podataka, a onda zahtjevajući da buduće izmjene datoteka i direktorija budu kopirane u blokovima a ne ažuriranjem datoteka. Na ovaj način, datotečni sistem je u suštini «zaleđen» na momenat, tako da može biti spašen poslije u slobodnije vrijeme. Peto, provođenje čuvanja podataka dovodi do mnogih netehničkih problema u radnoj organizaciji. Najbolji sigurnosni sistem na svijetu mogao bi biti nekoristan ako administrator sistema čuva sve backup trake u svojoj kancelariji i ostavlja ih otvorenim i nečuvanim kad god napusti radno mjesto. Špijun treba da uđe u sobu i stavi jednu traku u džep i izađe s pozdravom i smiješkom. Takođe, izvođenje dnevnih backup-a nije korisno ako dođe do požara koji će zapaliti i trake. Iz ovih razloga, trake bi trebale biti držane izvan prostorije ali i to uvodi nove sigurnosne rizike. Mogu se koristiti dvije strategije za spašavanje diska na trake: fizički prepis i logički prepis. Fizički prepis počinje sa blokom 0 na disku, zatim piše sve blokove na traku u redosljedu i završava kad zapiše posljednji blok na traku. Takav program je veoma jednostavan i može biti vjerovatno bez grešaka, takav da ne treba pričati o drugom takvom programu. Napišimo nekoliko komentara na fizički zapis sigurnosnih kopija. Ovdje ne postoje vrijednosti koje ukazuju na neiskorištene diskovne blokove. Ako program za spašavanje može pristupiti strukturi bit mapa diska onda bi mogao i spriječiti zapis neiskorištenih blokova. Međutim, potrebno je usaglasiti takvo pisanje jer nije više blok broj k na traci jednak bloku broj k na disku. Druga briga predstavlja zapis neispravnih blokova. Ukoliko su svi neispravni blokovi zamijenjeni sa rezervnim blokovima i kontroler ih sakriva od operativnog sistema, fizički zapis sigurnosnih kopija će raditi dobro. S druge strane, ako su vidljivi operativnom sistemu i održavani u datotekama neispravnih blokova ili bit mapama, izuzetno je važno da program za fizički zapis pristupi ovim informacijama i spriječi njihov zapis kako bi spriječio beskrajne disk greške koje bi se javljale u toku ovog procesa. Glavna prednost fizičkog zapisa je jednostavnost i velika brzina ( u suštini se može obavljati brzinom diska). Glavna mana je nemogućnost da se ne uključuju neki direktoriji, da se napravi inkrementalni backup i da se izvrši povrat

293 11.44.Konzistentnost datotečnog sistema 293 pojedinačnih datoteka na zahtjev. Iz ovih razloga, većina instalacija se izvodi logičkim zapisom sigurnosnih kopija. Logički zapis sigurnosnih kopija počinje na jednom ili više direktorija i rekurzivno zapisuje sve datoteke koje nađe u njima i koje imaju promjene od nekog datuma, t.j. posljednjeg inkrementalnog zapisa ili punog backup-a. Dakle, u logičkom zapisu, zapis na traku ima niz pažljivo odabranih direktorija i datoteka koje su jednostavnije za proces vraćanja datoteka ili direktorija na zahtjev. U cilju da se može vratiti čak i jedna datoteka korektno, sve informacije za ponovno kreiranje datoteke su potrebne, uključujući i stazu datoteke. Dakle, prvi korak u radu sa logičkim zapisom je analiza stabla direktorija. Jasno je da treba da spasimo bilo koju datoteku ili direktorij koji su bili modifikovani. Ali za tačniji oporavak trebaju se provjeriti svi direktoriji, čak i oni koji nisu modifikovani ali možda pokazuju na direktorij ili datoteku koja je modifikovana (prisjetite se komande link). Ovo znači da spašavamo, ne samo podatke (imena datoteka u pokazivače na indeksne čvorova), već i svi atributi direktorija moraju biti spašeni tako da se mogu vratiti sa originalnim dozvolama (engl. permissions). Direktoriji sa njihovim atributima se prvo pišu na trake a onda se spašavaju modifikovane datoteke sa njihovim atributima. Ovi podaci su dovoljni da se vrati datoteka i direktorij u datotečni sistem na različitim računarima. Na ovaj način, operacija spašavanja i vraćanja programa mogu se koristiti za prijenos cijelog datotečnog sistema između računara. Vraćanje datotečnog sistema sa zapisanih traka je prilično jasno. Da bi počeli sa ovim, na disku se kreira prazan datotečni sistem. Onda se vrati posljednji zapisani puni zapis. Pošto se direktoriji pojavljuju prvi na traci, oni se prvi i vrate i na taj način daju kostur datotečnog sistema. Zatim se vraćaju pojedine datoteke. Ovaj proces se zatim ponavlja sa prvim inkrementalnim zapisom napravljenim poslije punog zapisa, a zatim sljedeći itd. Mada je logički zapis prilično jasan, postoje neka interesantna zapažanja. Kao prvo, pošto lista slobodnih blokova nije datoteka, ona se ne zapisuje i ponovno se pravi u toku operacije vraćanja datoteka i direktorija. Skup slobodnih blokova predstavlja samo komplement zauzetih blokova za jedan medij. Drugačije su veze na datoteke. Ako je datoteka povezana na dva ili više direktorija, važno je da datoteka, koja se vraća, samo jedanput ažurira pokazivače na direktorije kojima pripada. Na kraju, specijalne datoteke, imenovani pipe-ovi, i sl. ne bi trebalo nikada da se zapisuju, bez obzira u kom direktoriju se nalaze (ne moraju biti zatvorene u /dev/) Konzistentnost datotečnog sistema Konzistentnost datotečnog sistema predstavlja drugu oblast pouzdanosti datotečnog sistema. Mnogi datotečni sistemi čitaju blokove, mijenjaju ih i kasnije ih zapisuju. Ako datotečni sistem «padne» prije nego što su svi izmijenjeni blokovi zapisani, datotečni sistem će doći u nekonzistentno stanje. Problem je posebno težak u slučaju da se indeksni blokovi ne zapišu, ili blokovi direktorija ili blokovi koji sadrže listu slobodnih blokova. Za borbu sa problemom nekonzistentnosti datotečnog sistema, većina računara imaju program koji kontroliše konzistentnost datotečnog sistema. Na primjer, Unix ima fsfck ( file systems check), dok Windows ima chkdsk (check disk), ili scandisk u ranijim verzijama. Ovaj program se može pokrenuti kad god je potrebno, posebno kod pada računara. U nastavku će biti dat opis rada programa fsck. Chkdsk je nešto različit jer radi sa različitim datotečnim sistemom, ali je u suštini isti sa prethodnikom jer koristi redundantne informacije. Svi programi kontrolišu svaki datotečni sistem datotečnu particiju, nezavisno jedan od drugog.

294 Konzistentnost datotečnog sistema Dvije vrste kontrole konzistentnosti mogu biti: koja koristi blokove i koja koristi datoteke. Za kontrolu konzistentnosti blokova, program pravi dvije tabele, od kojih svaka sadrži brojač za svaki blok, u početku postavljen na 0. Brojač u prvoj tabeli vodi evidenciju koliko puta je svaki blok prisutan u datoteci. Brojač u drugoj tabeli zapisuje koliko često svaki blok je prisutan u listi slobodnih blokova. Program, zatim, čita sve indeksne čvorove. Počevši od indeksnog čvora, moguće je napraviti listu svih brojeva blokova korištenih u odgovarajućoj datoteci. Čim se pročita broj bloka, njegov brojač, u prvoj tabeli se poveća za jedan. Program zatim ispituje listu slobodnih blokova ili bit mapu, da pronađe sve blokove koji nisu u upotrebi. Svaka pojava bloka u listi slobodnih blokova dovodi do povećanja za jedan njegov brojač u drugoj tabeli. a) Konzistentan sistem Blokovi u upotrebi Slobodni blokovi b) Nedostajući blok Blokovi u upotrebi Slobodni blokovi c) Dvostruko slobodni blok Blokovi u upotrebi Slobodni blokovi d) Dvostruko dodijeljen blok Blokovi u upotrebi Slobodni blokovi Slika 187 Provjera konzistentnosti datotećnog sistema Ako je datotečni sistem konzistentan, svaki blok će imati jednu jedinicu u prvoj ili u drugoj tabeli, kao što je to prikazano na slici Slika 187a. Međutim, kao rezultat «pada», tabele mogu izgledati kao na slici Slika 187b, na kojoj se blok broj 2 ne pojavljuje ni u jednoj tabeli. On će biti označen kao nedostajući blok. Nedostajući blokovi ne prave štetu podacima, ali takvi blokovi troše prostor diska i na taj način redukuju kapacitet diska. Rješenje problema nedostajućih blokova je prilično jasno: program za kontrolu konzistentnosti datotečnog sistema samo ih dodaje u listu slobodnih blokova. Sljedeća situacija, koja se može desiti je prikazana na slici Slika 187c. Ako pogledamo na blok broj 4, primijetićemo da postoji dva puta u listi slobodnih blokova (dupliciranje se može desiti samo ako je lista slobodnih blokova organizovana kao lista, kod bitmapa to je nemoguće). Rješenje je jednostavno, treba napraviti listu slobodnih blokova ponovo. Najgori slučaj koji se može desiti je da je jedan te isti blok prisutan u dvije ili više datoteka, kao što je prikazano na slici Slika 187d sa blokom broj 5. Ako dođe do brisanja ovih datoteka, blok broj 5 se stavlja u listu slobodnih blokova, dovodeći do slučaja da je slobodan i zauzet u isto vrijeme. Ako se pobrišu obje datoteke, slobodan blok će biti smješten u listu slobodnih blokova dva puta. Odgovarajuća akcija za program za kontrolu konzistentnosti datotečnog sistema je da alocira jedan slobodan diskovni blok, kopira sadržaj diskovnog bloka 5 u njega i ubaci kopiju u jednu od datoteka. Na ovaj način, sadržaj informacija u datotekama je ostao neizmjenjen (mada gotovo sigurno da je jedan uništen), ali je datotečni sistem bar konzistentan. Greška se može prikazati koja će omogućiti korisniku da istraži eventualnu štetu. Program za kontrolu konzistentnosti kontrolira i sistem direktorija kako bi korektno uradio kontrolu pojedinačnih datoteka. Pri ovome koristi tabele brojača za datoteke a ne za blokove.

295 11.45.Žurnalski datotečni sistemi 295 Počinje od korijenskog direktorija i rekurzivno silazi kroz drvo ispitujući svaki direktorij u datotečnom sistemu. Za svaku datoteku, u svakom direktoriju, povećava brojač za datoteku. Prisjetimo se zbog čvrstih veza, datoteka se može pojaviti u dva ili više direktorija. Simboličke veze se ne računaju i ne povećavaju brojač za datoteke. Kada se sve završi, postoji lista, indeksirana sa indeksnim čvorovima, koja kaže koliko direktorija sadrži svaka datoteka. Onda se poredi ove brojeve sa brojačem veza koji je smješten u samom indeksnom čvoru. Ovaj brojač počinje sa 1 kod kreiranja datoteke i povećava se za 1 svaki put kada se napravi jedna čvrsta veza na datoteku. U jednom, konzistentnom, datotečnom sistemu, oba brojača će biti isti. Međutim, dvije vrste grešaka se mogu desiti: brojač veza u indeksnom čvoru može biti isuviše veliki ili veoma mali. Ako je broj veza veći od broja elemenata direktorija, onda iako se sve datoteke uklone iz direktorija, brojač može biti različit od nule i indeksni čvor se ne može pobrisati. Ova greška nije ozbiljna, ali troši diskovni prostor sa datotekama koje nisu ni u jednom direktoriju. Ovo se može srediti postavljajući brojač veza u indeksnom čvoru na korektnu vrijednost. Druge greške mogu proizvesti katastrofalne rezultate. Ako su dva elementa direktorija povezani u jednu datoteku, ali indeksni čvor kaže da ima samo jedna datoteka, onda je uklonjen element direktorija ili indeksni čvor je dostigao vrijednost 0. Kada brojač u indeksnom čvoru dosegne 0, datotečni sistem označava ga kao neiskorišćen i oslobađa sve njegove blokove. Ova akcija može proizvesti da jedan od direktorija sada pokazuje na jedan neiskorišćen indeksni čvor, čiji blokovi bi uskoro mogli biti dodijeljeni nekoj drugoj datoteci. Rješenje je da se prisilno postavi brojač veza u indeksnom čvoru na stvarnu vrijednost elemenata direktorija. Ove dvije operacije, kontrola blokova i kontrola direktorija, su često integrisane zbog efikasnosti (t.j. zahtijeva se samo jedan prolaz kroz sve indeksne čvorove). Moguće su i neke druge kontrole. Na primjer, direktoriji imaju definisan format sa brojevima indeksnih čvorova i ascii imenima datoteka. Ako je broj indeksnog čvora veći od broja indeksnih čvorova na disku, to znači da je direktorij oštećen Žurnalski datotečni sistemi Mnoge aktivnosti datotečnih sistema zahtijevaju više izmjena na sistemu. Na primjer brisanje datoteke tipično uklanja element iz direktorija, oslobađa prostor rezervisan za datoteku i oslobađa njen indeksni čvor. Ako se desi krah između ovih faza, sistem ostaje nekonzistentan. Povremeno je potrebno provjeriti konzistentnost sistema, ali kako je to opisano u prethodnom poglavlju to je duga aktivnost. Da se izbjegne test cijelog sistema na nekonzistentnost, uvodi se poseban dio datotečnog sistema ili specijalna datoteka koji se zove žurnal. Kada se da zahtjev za višefaznom akcijom nad datotečnim sistemom, u žurnal se zabilježe unaprijed sve promjene koje se trebaju uraditi. U slučaju kraha, prilikom novog podizanja operativnog sistema, samo se pročita žurnal i ponove planirane aktivnosti. Promjene su atomske pa ili će se obaviti u cijelosti ili neće biti uopšte započete, jer nisu ni upisane u žurnal. Primjeri ovakvih datotečnih sistema su NTFS i Ext3FS Performanse datotečnog sistema Pristup disku je mnogo sporiji nego pristup memoriji. Čitanje memorijske riječi se može obaviti za 10 nsec. Čitanje sa diska se obavlja brzinom od 10MB/sec što je 40 puta sporije po 32 bitnoj riječi. Ovome je potrebno dodati i 510 msec vremena pozicioniranje na staze i vrijeme potrebno da dati sektor stigne ispod glave diska. Ako je samo jedna riječ potrebna, onda je

296 Keširanje pristup memoriji milion puta brži nego pristup disku. Kao posljedicu ovako različitog ponašanja, mnogi datotečni sistemi su projektovani sa raznim optimizacionim tehnikama kako bi poboljšali performanse datotečnog sistema. U ovom djelu, diskutovaćemo detaljnije o tri takve tehnike Keširanje Najčešća tehnika koja se koristi da redukuje diskovni pristup je keširanje blokova. (keš dolazi od francuske riječi cache a znači sakriti). U ovom kontekstu, keš predstavlja skup blokova koji logički pripadaju disku ali se drže u memoriji iz razloga povećanja performasi. Različiti algoritmi se koriste za upravljanje kešom, ali najčešći je onaj kojim se provjeravaju svi zahtjevi za čitanje da bi se vidjelo da li su potrebni blokovi u kešu. Ako jesu, zahtjev za čitanje može se uraditi bez diskovnog pristupa. Ako blok nije u kešu, prvo ga je potrebno pročitati u keš a onda kopirati tamo gdje je potrebno, recimo, u korisnički bafer. Sljedeći zahtjevi koji se obavljaju nad istim blokom mogu se izvršiti iz keša. Operacije nad kešom su prikazane na slici. Pošto u kešu ima puno blokova, često i hiljadama, potrebno je imati način da se brzo provjeri da li je blok prisutan u kešu. Uobičajen način je da se napravi hash tabela za diskovni uređaj sa diskovnim adresama i da se brzo pretražuje hash tabela. Svi blokovi da istom hash vrijednošću se smještaju u povezanu listu tako da u slučaju kolizije se pretražuje samo pridružena lista. Kada jedan blok treba da se napuni u keš koji je pun, neke blokove iz keša bi trebalo izvaditi (i zapisati na disk ako je došlo do promjena na bloku od njegovog zadnjeg punjenja). Ovaj postupak je vrlo sličan straničenju i na njega se mogu odnositi svi algoritmi, takvi kao FIFO, druga šansa i LRU. Jedna prijatna razlika između straničenja i keširanja je da se keš koristi prilično rijetko, tako da je moguće održavati sve blokove u LRU redosljedu pomoću povezane liste. Hash 1 Hash 2 Hash 3 Hash 4... Naredni blok po upotrebi Prethodni blok po upotrebi Naredni blok sa istim hash Kopija disk podataka Naredni blok po upotrebi Prethodni blok po upotrebi Naredni blok sa istim hash Kopija disk podataka Naredni blok po upotrebi Prethodni blok po upotrebi Naredni blok sa istim hash Kopija disk podataka Naredni blok po upotrebi Prethodni blok po upotrebi Naredni blok sa istim hash Kopija disk podataka... Slika 188 LRU struktura za pamćenje disk keša Na slici Slika 188 LRU struktura za pamćenje disk kešavidi se da, ako se kolizija desi, postoji dvostruko spregnuta lista koja vezuje sve blokove u redosljedu njihovog korišćenja, tako da su blokovi koji su nedavno korišćeni na vrhu liste a oni koji su skoro korišćeni na kraju liste. Kada se blok referencira, on se uklanja sa svoje pozicije i smiješta na kraj liste. Na ovaj način se održava ispravan LRU redosljed. Nažalost, ovdje postoji problem. Šta će se desiti kod pada sistema i da li će nam datotečni sistem biti konzistentan? Ako se kritični blok, takav kao blok indeksnih čvorova, čita u keš i

297 11.48.Čitanje blokova unaprijed 297 modifikuje, a ne zapiše na disk, pad sistema bi mogao dovesti datotečni sistem u nekonzistentno stanje. Ako je blok stavljen na kraj LRU liste, može se ne koristiti jedno vrijeme prije nego što dođe na vrh liste. Dakle, neki blokovi, takvi kao blokovi indeksnih čvorova, se rijetko referenciraju unutar nekog intervala. Ova razmatranja vode do modifikovane sheme LRU, koja uzima u obzir sljedeća dva faktora: Da li će blok biti vjerovatno potreban ponovno, uskoro? Da li je blok važan za konzistentnost datotečnog sistema? Za oba razloga, blokovi mogu biti podijeljeni u kategorije takve kao blokovi indeksnih čvorova, indirektni blokovi, blokovi direktorija, puni blokovi podataka i blokovi podataka djelomično popunjeni. Blokovi koji, vjerovatno, neće biti potrebni skoro se stavljaju na vrh liste a ne na kraj liste tako da će njihovi baferi brzo biti korišćeni. Blokovi koji su djelomično popunjeni i u njih se može pisati veoma brzo se stavljaju na kraj liste tako da tamo ostaju duže vrijeme. Drugo pitanje, koje je nezavisno od prvog se odnosi na blokove koji su važni za konzistentnost datotečnog sistema (u suštini, svi izuzev blokova podataka). Ako se oni modifikuju, trebalo bi ih odmah pisati na disk, bez obzira na kojem se kraju liste nalaze. Brzim pisanjem kritičnih sektora značajno smanjujemo vjerovatnoću da će pad sistema uništiti datotečni sistem. Mada korisnik može biti nezadovoljan ako se neka njegova datoteka pokvari, bio bi nezadovoljniji ako se uništi datotečni sistem. Postoje dva pristupa u radu sa ovim. Unix ima sistemski poziv, sync, koji prinuđuje operativni sistem da odmah izvrši zapis svih modifikovanih slogova na disk. Windows piše sve modifikovane blokove na disk čim se promjeni njihov sadržaj. Keš u kojima se pišu odmah svi izmijenjeni blokovi na disk se naziva write-through keš. Razlika u ova dva pristupa se vidi u slučaju kada program piše 1 KB blok pun na disk, pri čemu dolaze znakovi u bafer vremenski raspodjeljeni. Kod Unixa, skupiće sve znakove u bafer i pisati blok svakih 30 sec ili kada se blok ukloni iz keša. Windows će pristupati disku na svaki pisani znak. Naravno, većina programa rade interno baferovanje, tako da Windows ne piše znak na disk nego liniju, ili veću jedinicu kod svakog pisanja na disk. Kao posljedica ovakvih pristupa u strategiji keširanja je, kod Unixa, ako uklonimo disketu bez izvršavanja sync komande, gotovo uvijek će rezultat biti izgubljeni podaci i često će imati posljedice na datotečni sistem. Kod Windows-a ovih problema nema. Strategije se razlikuju zato što je Unix počeo sa razvojem na fiksnim diskovima a ne izmjenjivim, dok je Windows počeo sa disketom Čitanje blokova unaprijed Druga tehnika za poboljšanje performansi datotečnog sistema je pokušaj dovlačenja blokova u keš prije nego što su potrebni da bi se povećao intenzitet nalazaka bloka u kešu. Da pojasnimo, mnoge datoteke se čitaju sekvencijalno. Kada se traži od datotečnog sistema da izda blok k neke datoteke, on uradi to čitanje i provjeri da li ima sljedećeg bloka u kešu, k+1. Ako ga nema, on izdaje zahtjev za čitanje bloka broj k+1 u nadi da će trebati brzo, i kada zatreba, nalaziće se u kešu. Naravno, ova strategija, (engl. read ahead strategy) radi dobro samo za datoteke koje se čitaju sekvencijalno. Ako je pristup datotekama random, ova strategija ne daje dobre rezultate. U stvari, ovim se sužava diskovna propusnost čitajući nekorisne blokove i uklanjanjem iz keša možda korisnih blokova. Čak, ako su blokovi koje izbacujemo modifikovani, potrebno ih je zapisati na disk a tim još sužavamo diskovnu propusnost. Da bi se pratilo da li ova tehnika loše

298 Smanjenje kretanja glave diska radi, datotečni sistem može voditi evidenciju o pristupima svakoj otvorenoj datoteci. Na primjer, po jedan bit se može pridružiti svakoj datoteci da se vodi evidencija da li je datoteka u sekvencijalnom načinu rada ili ima slučajan pristup. Sve se datoteke označe u početku kao da su u sekvencijalnom načinu rada. Međutim, kada se izvrši operacija seek, bit se očisti, a ako ponovno počinje sekvencijalni način pristupa, bit se postavi. Na ovaj način, datotečni sistem može napraviti realne pretpostavke da li da se koristi ova tehnika ili ne Smanjenje kretanja glave diska Keširanje i čitanje blokova unaprijed nisu jedine tehnike za povećanje performansi datotečnog sistema. Jedna od važnih tehnika je smanjenje kretanja glave diska uređenjem zahtjeva za diskovne blokove kojima će se pristupati u redosljedu, blizak jedan drugom, po mogućnosti i u istom cilindru. Kada se piše datoteka, datotečni sistem treba da alocira po jedan blok u jedinici vremena, kada su potrebni. Ako su slobodni blokovi zapisani u bitmapi u glavnoj memoriji, dovoljno je izabrati slobodan blok dovoljno blizak jednom prethodno traženom. Sa listama slobodnih blokova, čiji se dio nalazi na disku, mnogo je teže alocirati blokove da budu jedan pored drugog. Međutim, čak i kod liste slobodnih blokova može se izvršiti grupisanje blokova. To se evidentira na način da se smještajni prostor na disku vodi u grupama susjednih blokova. Ako sektor sadrži 512 bajta, sistem bi mogao koristiti 1 KB blokove ( po 2 sektora), a alocirati diskovni prostor u jedinicama od 2 bloka ( 4 sektora). Ovo nije isto kao da imamo 2 KB diskovne blokove, pošto će keš koristiti 1 KB blokove i prenos sa diska će biti sa 1KB blokovima, dok će sekvencijalno čitanje datoteka redukovati broj pozicioniranja na stazu sa faktorom 2, i na taj način značajno povećati performanse. Varijacija na temu je da se uzme u obzir rotaciono kašnjenje. Kada alociramo blokove, sistem će pokušati da stavi susjedne blokove u datoteku u isti cilindar. Drugo usko grlo za performase u sistemu koji koristi indeksne čvorove ili neki ekvivalent indeksnim čvorovima je da čitanje čak i kratkih datoteka zahtijeva dva pristupa disku: jedan za indeksni čvor datoteke i jedan za njen blok podataka. Uobičajeno smiještanje indeksnih čvorova na disk je prikazano na slici Slika 189a. Ovdje su svi indeksni čvorovi blizu početka diska, tako da će srednje rastojanje između indeksnog čvora i njegovih blokova biti oko ½ broja diskovnih cilindara, što zahtijeva duža vremena pozicioniranja. Jedno blago poboljšanje performansi je stavljanje indeksnih čvorova u sredini diska umjesto na početak diska (Slika 189b) pri čemu se smanjuje srednje vrijeme pozicioniranja između indeksnih čvorova i njihovih blokova za faktor 2. Druga ideja, prikazana na slici Slika 189c) je da se podjeli disk u cilindrične grupe pri čemu svaka grupa ima svoje sopstvene indeksne čvorove, blokove podataka i listu slobodnih blokova. Kada se formira nova datoteka, bilo koji indeksni čvor može biti izabran, mada se pokušava da se nađu blokovi i indeksni čvor u istoj cilindričnoj grupi. Ako to nije moguće, onda se koriste blokovi iz susjedne cilindrične grupe (njegova blizina uzrokuje manje vremena za pozicioniranje)

299 11.50.Log-Structured File Systems 299 a) Indeksni čvorovi na krajnjoj stazi b) Indeksni čvorovi na srednjoj stazi Slika 189 Optimizacija lokacije indeksnih čvorova c) Indeksni čvorovi na svim stazama Log-Structured File Systems Promjene u tehnologiji vrše pritisak na tekuće datotečne sisteme. Procesori postaju sve brži, diskovi postaju sve veći i jeftiniji ( ali ne i puno brži), a veličina memorije raste eksponencijalno. Jedan parametar koji nije značajno poboljšan je vrijeme pozicioniranja na traku (engl. seek time). Ako se pogledaju ova zapažanja može se primijetiti da će se usko grlo performansi sistema desiti kod mnogih datotečnih sistema. Istraživanje izvršeno na Berkeley univerzitetu dovelo je do razvoja potpuno nove vrste datotečnog sistema, LFS (Log-structured File System). U ovom dijelu, prikazan je kratak opis funkcionalnosti LFS-a. Osnovna ideja koja je vodila projektante LFS-a je što procesori postaju brži i RAM memorija postaje sve veća, tako da bi se i keš mogao značajno proširiti. Kao posljedica toga, sada je moguće ispuniti značajno veliki broj zahtjeva za čitanje direktno iz keša, bez pristupa disku. Prateći ova razmatranja, budući diskovi će imati većinu diskovnih pristupa za pisanje, tako da mehanizam za dovlačenje blokova unaprijed, jer će skoro trebati, neće doprinijeti mnogo performansama sistema. Da stvar postane gora, u većini datotečnih sistema, pisanje se izvodi na vrlo malim dijelovima. Pisanje malih djelova je vrlo neefikasno pošto je potrebno 50 µs za pisanje na disk ali je za pisanje potrebno čekati 10 ms za pozicioniranje i 4 ms za rotaciono kašnjenje. Sa ovim parametrima efikasnost pada na 1%. Da shvatimo odakle dolaze ova mala kašnjenja, pogledajmo kako se izvodi kreiranje nove datoteke u Unix-u. Da bi zapisali ovu datoteku, potrebno je zapisati sljedeće: indeksni čvor za direktorij, blok podataka za direktorij, indeksni čvor za datoteku i blok podataka za datoteku (ova prva dva zato što je potrebno u tim blokovima popraviti pojedine atribute direktorija, recimo, broj datoteka povećati za jedan, označiti vremena izmjene u indeksnom čvoru direktorija, označiti broj indeksnog čvora nove datoteke u direktoriju, i sl.). Ova pisanja bi mogla biti odložena, ali u slučaju pada sistema, datotečni sistem bi došao u nekonzistentno stanje. Iz ovih razloga, potrebno je indeksne čvorove odmah zapisati. Iz ovih razloga, projektanti LFS-a odlučili su da izgrade datotečni sistem na takav način da postignu punu propusnost diska suočavajući se sa sistemom sa mnogo pisanja malih dijelova na disk. Osnovna ideja je da se cijeli disk struktuira kao log. Periodično, i kada postoji potreba sa pisanjem, svako pisanje na disk koje je čekalo u baferima, se skuplja u jedan segment i piše na disk kao jedan kontinualan segment na kraju loga. Taj jedan segment može sadržati indeksne čvorove, blokove direktorija, blokove podataka i druge vrste blokova, sve pomiješane zajedno. Na početku svakog segmenta se nalaze informacije koje govore šta se može naći u segmentu. Ako je srednja veličina segmenta oko 1 MB, gotovo puna propusnost diska se može koristiti. Kod ovog pristupa, indeksni čvorovi još postoje i imaju istu strukturu kao u Unix-u, ali su sada razbacani kroz cijeli log, umjesto da budu na jednoj poziciji na disku. Pored toga, kada se

300 Zadaci pronađe jedan indeksni čvor, pronalaženje njegovih blokova podataka se radi na uobičajen način. Treba primjetiti da je sada nalaženje indeksnih čvorova mnogo teže, pošto se adresa ne može jednostavno izračunati iz broja indeksnog čvora, kao u Unix-u. Da bi bilo moguće da se nađu svi indeksni čvorovi, održava se jedan indeksni čvor za mapu koji se indeksira sa brojem indeksnog čvora. Element i u ovoj mapi pokazuje na indeksni čvor na disku. Mapa se održava na disku ali se jedan dio može i keširati, tako da će većina intenzivno korišćenih dijelova u memoriji većinom vremena, u cilju da poveća performanse. Da sumiramo, šta smo rekli do sada, sva pisanja na disk se baferuju u memoriju i periodično sva baferovana pisanja se pišu na disk u jednom segmentu, na kraju loga (čitaj na kraju diska, kontinulano). Za otvaranje datoteke koristi se mapa da bi se pronašao indeksni čvor datoteke. Kada se pronađe indeksni čvor, u njemu se nalaze adrese blokova koji se odnose na datoteku (adresni blokovi i blokovi podataka). Svi blokovi će biti u jednom segmentu negdje u logu. Ako su diskovi beskonačne veličine tada bi gornji opis bio dovoljan. Međutim, stvarni diskovi su konačne veličine, tako da log može zauzeti cijeli disk i u tom momentu novi segment se ne može pisati u log. Tako mnogi postojeći segmenti mogu imati blokove koji više ne trebaju, recimo. Ako je jedna datoteka prepisana, njeni indeksni blokovi će sada pokazivati na nove blokove dok će stari blokovi još zauzimati prostor u prethodno napisanom segmentu. Da bi pomogao kod ovog problema, LFS ima programsku nit čistač, koji provodi vrijeme skenirajući cirkularno log i praveći njegovu kompakciju. Počinje čitanje informacije u prvom segmentu u logu da vidi koje su datoteke i indeksni čvorovi u njemu. Zatim provjerava mapu indeksnih čvorova da vidi da li su indeksni čvorovi i blokovi podataka u upotrebi. Ako nisu, te informacije se odbacuju, proglašavaju slobodnim. Oni koji su u upotrebi, čitaju se u memoriju da bi ih ponovno zapisali na disk u sljedećem segmentu. Segment koji smo pretraživali se proglašava slobodnim, tako da se može koristiti za sljedeće pisanje segmenta. Kao posljedica ovog, disk je postao veliki cirkularni bafer sa sa programskom niti pisac koji dodaje segment na početak bafera i programskom niti čistač koji uklanja stare segmente sa kraja bafera Zadaci Zadatak 1. Data je datoteka koja ima 100 blokova. Pretpostavimo da je kontrolni blok datoteke ( indeksni blok, u slučaju indeksne alokacije) već u memoriji. Izračunati koliko se U/I operacija zahtijeva kod čitanja jednog bloka za sljedeće alokacione strategije: kontinualna postoji prostor da datoteka raste samo na kraju datoteke., povezana listama indeksna (samo na prvom nivou, ne koristit indirektne pokazivače) pri čemu važi: u slučaju kontinualne alokacije Pretpostavim da blok informacija koje je potrebno dodati u datoteku je smješten u memoriji. Operacije koje treba uraditi su: a. Blok se dodaje na početak datoteke b. Blok se dodaje u sredinu datoteke b. Blok se dodaje na kraj datoteke d. Blok se uklanja sa početka datoteke e. Blok se uklanja iz sredine datoteke f. Blok se uklanja s kraja datoteke Odgovor: ( za datoteku sa 100 blokova)

301 11.51.Zadaci 301 Kontinualna Povezane liste Indeksna a b c d e f Zadatak 2. Pretpostavimo da želimo da otvorimo datoteku /tmp/file1 u datotečnom sistemu UNIX-a. Koliko disk blokova treba pročitati u memoriju i koji su to blokovi? Radi jednostavnosti pretpostavimo da se podaci direktorija uvijek nalaze u jednom bloku i da prije otvaranja, nikakva struktura datotečnog sistema se nije nalazila u memoriji. Odgovor: 1. Čita se blok gdje se nalazi indeksni čvor korijenskog direktorija i u njemu se nalazi diskovna adresa ( broj bloka ) bloka podataka korijenskog direktorija. 2. Čita se blok podataka korijenskog direktorija; U njemu se nalazi indeksni čvor direktorija tmp. 3. Čita se indeksni čvor direktorija tmp, u kome se nalazi diskovna adresa bloka podataka direktorija tmp. 4. Čita se blok podataka direktorija tmp, u kome se nalazi indeksni čvor datoteke file1. 5. Čita se indeksni čvor datoteke file1 u memoriju. Dakle, imamo čitanja 5 diskovnih blokova (ili manje ako se indeksni čvorovi nalaze u istom bloku). Zadatak 3. Koliko je potrebno čitati blokova da bi se otvorila datoteka /home/ri/zule/skripta.txt? Direktorij ri zauzima dva bloka, a ostali po jedan. Nacrtati sliku na kojoj se vide svi blokovi kao i njihov sadržaj (indeksni čvor ili blok podataka). Rješenje: Ukupno se čita do 9 blokova, prikazanih na slici. Brojevi blokova i indeksnih čvorova su odabrani proizvoljno u primjeru, pazeći na jedinstvenost i aliase. Direktorij / bin 6 home 7 dev Blok 130 /home admin 20 ae 24 ri Blok 180 ri aco 88 koja Blok 181 ri 65 luka 102 zaim 105 zena 77 zule Blok 402 zule pismo 132 skripta.txt 135 savings Inode 6 za home veličina i vrijeme Inode 24 za ri veličina i vrijeme Inode 77 za zule veličina i vrijeme In 132 skripta.txt veličina i vrijeme Zadatak 5. Razmotrimo indeksne čvorove kod UNIX-a sa 9 direktnih pokazivača, jednog indirektnog i jednog duplo indirektnog pokazivača. Pretpostavimo da je veličina bloka jednaka

302 Zadaci 8 KB i da je veličina pokazivača 4 bajta. Koristeći ovakav datotečni sistem, kolika je maksimalna veličina datoteke u ovom sistemu? Odgovor: (8 1024/4) (8 1024)+(8 1024/4) 2 (8 1024) bajta = 32G+16M+72K Zadatak 6. Dat je indeksni čvor veličine 64 bajta koji sadrži 6 direktnih pokazivača na blokove, 2 indirektna pokazivača i 2 duplo indirektna pokazivača. Svaki pokazivač ukazuje na blok od 4kbajta koji sadrži podatke ili listu 4-bajtnih pokazivača. a) Nacrtati shematski sistemske i blokove podataka datoteke koja je velika 27K. Datoteka od 27KB koristi 6 direktna pokazivača u indeksnom čvoru (6x4=24KB) i jedan indirektni pokazivač koji ukazuje na blok disk adresa. Prva 4 bajta u bloku diskovnih adresa ukazuju na blok podataka u kome se nalazi preostala 3KB datoteke. b) Koliko iznose meta podaci za ovu datoteku? Rješenje: a) Podaci o vremenu kreiranja, pravima i veličini datoteke Blok podataka 0 Blok podataka 1 Blok podataka 2 Blok podataka 3 Blok podataka 4 D0 D1 D2 D3 D4 D5 I0 I1 DI0 DI2 P0 P1 P2 P1022 P1023 Blok pokazivača Blok podataka 5 Blok podataka 6 b) Meta podatke predstavljaju: indeksni čvor datoteke, 1 indirektni blok pokazivača, što ukupno čini 4K+64bajta=4160 bajta Zadatak 7: Na particiju veličine 40M, treba smjestiti 80 datoteka od 100 bajta, 10 datoteka od bajtova u korijenski direktorij koji ima mjesta za 128 datoteka. Klaster zauzima 4 sektora. Koliko je zauzetih podataka na ovoj particiji ako je datotečni sistem a) FAT 12, b) FAT 16, c) FAT 32 Ukoliko na nekom datotečnom sistemu nije moguće formatirati s ovom veličinom klastera, odrediti minimalnu veličinu klastera. Rješenje: Ukupno ima 40*1024*1024/512 sektora. FatEntries*ClusterSize=UkupnoSektora-2*FATentries*FATEntrySize-RootDirSize a) FAT12: Sektor je 512 bajta, pa je klaster velik 2K. Ukupno ima 40*1024*1024/(2*1024)=20*1024=20480 klastera. To je više od 4095 koliko je maksimalno moguće sa 12 bita da se predstavi. Stoga se ova particija ne može formatirati s FAT 12. Da bi se smjestilo 4096 klastera u 40M, jedan klaster mora biti velik najmanje 10K, tj. 20 sektora. Ukupno ima 40*1024*1024/(10*1024)=4096 klastera (to je za 1 više od limita, ali se

303 11.51.Zadaci 303 blokovi u rezervisanom području ne moraju adresirati. Jedan sektor je boot blok, 512 bajta. Postoje 2 FAT tabele koje opisuju 4096 klastera, svaki element po 12 bita, dakle svaka je velika 6144 bajta. Korijenski direktorij je fiksan i zauzima 128*32=4096 bajta. Datoteke zauzimaju cijeli broj klastera, tako da datoteke od 100 bajta zauzimaju po 1 klaster svaka, a datoteke od bajta po 2 klastera svaka. Stoga, datoteke zauzimaju 80* * Prema tome, potrošeno je 512+2* * *20480= bajta. b) FAT16: Sektor je 512 bajta, pa je klaster velik 2K. Ukupno ima 40*1024*1024/(2*1024)=20*1024=20480 klastera, što je manje od 65535, limit za FAT 16. Jedan sektor je boot sektor, tj 512 bajta. Postoje 2 FAT tabele, a svaki element je po 16 bita, stoga svaka od njih zauzima po bajta. Korijenski direktorij je fiksan i zauzima 128*32=4096 bajta. Datoteke zauzimaju cijeli broj klastera, tako da datoteke od 100 bajta zauzimaju po 1 klaster svaka, a datoteke od bajta po 10 klastera svaka. Stoga, datoteke zauzimaju 80* * Zaključuje se da je potrošeno je 512+2* * *20480= bajta c) FAT 32: Sektor je 512 bajta, pa je klaster velik 2K. Ukupno ima 40*1024*1024/(2*1024)=20*1024=20480 klastera, što je manje od , limit za FAT32. Jedan sektor je boot sektor, tj 512 bajta. Postoje 2 FAT tabele, a svaki element je po 32 bita, stoga svaka od njih zauzima po bajta. Korijenski direktorij u FAT 32 nije fiksan, ali zauzima najmanje jedan klaster, ili više zavisno od broja datoteka. Ukoliko datoteke nemaju duga imena, svaki element direktorija zauzima po 32 bajta, pa nam treba 2880 bajta, što je više od jednog klastera, stoga se korijenski direktorij smiješta u dva klastera. Prema tome, potrošeno je 512+2* * *20480= bajta Zadatak 8.Prazna particija je formatirana s blokovima velikim 1K. Na početku particije se nalaze Boot(BT), superblok(sb), bitmapa(bm) i zauzimaju po jedan blok. Nakon toga se nalazi eventualni blok s potrebnim tabelama za ovu vrstu alokacije. Prvi blok s podacima sadrži korijenski direktorij(rd) i u njega su redom stavljene datoteke d1.txt (5K), d2.txt(6k), d3.txt(2k). Nakon toga je d1.txt uvećana za 2K. Nacrtati strukturu ove particije, prikazavši sadržaj blokova s metapodacima koji opisuju ove datoteke i pripadnost blokova datotekama. Koristi se a) kontinualna alokacija, b) ekstentna alokacija, c) spregnuta alokacija s pokazvačima u blokovima, d)fat, e) indeksna s jednim nivoom, 5 pokazivača u direktoriju, f) indeksna s više nivoa, 3 direktna, 1 indirektni pokazivač u indeksnom čvoru Rješenje: a) kontinualna alokacija, Raspored blokova na disku je naveden na sljedećoj slici bt sb bm rd d2 d2 d2 d2 d2 d2 d3 d3 d1 d1 d1 d1 d1 d1 d1 Sadržaj korijenskog direktorija d1.txt, početni blok 17 dužina 7, d2.txt početni blok 9, dužina 6 d3.txt početni blok 15, dužina 2 Specifičnost alokacije: produženje datoteke znači njeno kopiranje b) ekstentna alokacija bt sb bm rd d1 d1 d1 d1 d1 d2 d2 d2 d2 d2 d2 d3 d3 d1 d1 Sadržaj korijenskog direktorija

304 Zadaci d1.txt, početni blok 4 dužina 5 i početni blok 17 dužina 2 d2.txt početni blok 9, dužina 6 d3.txt početni blok 15, dužina 2 Specifičnost alokacije: u korijenskom direktoriju se navodi više dijelova c) spregnuta alokacija s pokazivačima u blokovima bt sb bm rd d1 d1 d1 d1 d1 d1 d2 d2 d2 d2 d2 d2 d2 d3 d3 d3 d1 d1 Sadržaj korijenskog direktorija d1.txt, početni blok 4 (dužina 8) d2.txt početni blok 10, (dužina 7) d3.txt početni blok 17, (dužina 3) Specifičnost alokacije: Blokovi su u lancu, kako pokazivači takođe troše 2-4 bajta svakog bloka, svaka datoteka ima još po jedan blok, jer datoteka od 4K zauzima na disku 4K i 16 bajtova. d)fat bt sb bm ft Rd d1 d1 d1 d1 d1 d2 d2 d2 d2 d2 d2 d3 d3 d1 d1 Sadržaj korijenskog direktorija d1.txt, početni blok 5 (dužina 7) d2.txt početni blok 10, (dužina 6) d3.txt početni blok 16, (dužina 2) Sadržaj FAT tabele Specifičnost alokacije: Blokovi su u lancu, ali su pokazivači u posebnom bloku e) indeksna s jednim nivoom bt sb bm rd d1 d1 d1 d1 d1 d2 d2 d2 d2 d2 d2 d3 d3 d1 d1 Sadržaj korijenskog direktorija d1.txt, Blokovi 4,5,6,7,8 (dužina 7) d1.txt, Blokovi 17,18 (dužina 7) d2.txt Blokovi 9,10,11,12,13, (dužina 6) d2.txt Blokovi 14, (dužina 6) d3.txt Blokovi 15, 16, (dužina 2) Specifičnost alokacije: Ako je nedovoljno linkova u elementu direktorija, on se ponavlja. f) indeksna s više nivoa bt sb bm in Rd i1 d1 d1 d1 d1 d1 i2 d2 d2 d2 d2 d2 d2 d3 d3 d1 d1 d1.txt, Indeksni čvor 1 d2.txt Indeksni čvor 2 d3.txt Indeksni čvor 3 Indeksni čvor 1: Direktni pokazivači 6,7,8, indirektni pokazivač 5 Indeksni čvor 2: Direktni pokazivači 12,13,14, indirektni pokazivač 11 Indeksni čvor 3: Direktni pokazivači 18,19 Blok pokazivača 5: Pokazivači 9,10,20,21 Blok pokazivača 11: Pokazivači 15,16,17 Zadatak 9. FAT datotečni sistem

305 11.51.Zadaci 305 FAT je najjednostavniji datotečni sistem koji je danas u upotrebi na personalnim računarima. Kako ga podržavaju svi operativni sistemi, u upotrebi je u tri verzije FAT 12 za diskete, FAT 16 za manje hard diskove i FAT 32 za veće diskove i džepne uređaje. U ovoj vježbi će se, slično uputstvima pokušati doći do sadržaja vaše datoteke na USB stiku. Kao primjer operativnog sistema na kome će se analizirati sadržaj FAT particije uzet je Linux, distribucija BHLD. Alat kojim se kopira sirovi sadržaj particije je dd, dok se heksadekadni editor zove khexedit. Moguće su drugačije izvedbe ako se koristi drugi alat. 1. Ubacite vaš USB stik 2. Kada Linux prepozna vaš USB stik, kroz grafičko okruženje napravite tekstualnu datoteku u korijenskom direktoriju USB stika 3. Nazovite je fattest.txt (nemojte davati ime duže od 8 slova, za ovu vježbu) 4. Otvorite tekstualnim editorom tu datoteku i napunite je tekstom s nekih web stranica, tako da bude velika bar 20 kilobajta 5. Otvorite konzolu 6. Otkucajte u konzoli df Po veličini koju je df vratio, zaključite kojem disku pripada vaš USB stik. Npr. Ako je vratio Fajl sistem 1K-blokova Zauzeto Dostupno Procentualno Prikačen na... /dev/sdc % /media/disk a znamo da je naš disk upravo te veličine, on je vjerovatno /dev/sdc1 Kopirajte sektor 0 sadržaja USB stika u privremenu datoteku komandom iz konzole. DOBRO PROVJERITE OVU KOMANDU: ZAMIJENITE LI PARAMETRE UPROPASTIĆETE PODATKE NA VAŠEM USB STIKU. TO VAŽI I ZA OSTALE SUDO DD KOMANDE sudo dd if=/dev/sdc1 of=image.img bs=512 skip=0 count=1 (ako bude tražio lozinku ukucajte je, ne zbunjujte se što se kursor ne pomijera dok je kucate) 9. Pokrenite heks editor (okteta ili khexedit) da s njim pregledate ovu datoteku khexedit image.img 10. Na samom početku se nalazi nulti sektor particije U nultom sektoru se nalazi opis diskete koji se zove BIOS parametar blok. Neka je njegov izgled kao na sljedećoj slici 0000:0000 eb d f e b X.MSDOS : f f 00 ff 00 3f ?..? :0020 c1 50 ea a P.u: : : f e 4f 20 4e 41 4d ).u0NO NAME 0000: eb d f e FX.MSDOS5.0.. Značenje bajtova na određenim pozicijama su

306 Zadaci Od Do Značenje Heks vrijednost Interpretacija vrijednosti 0 2 Asemblerska instrukcija JMP za skok EB JMP 60 i NOP 3 A Ime proizvođača 4d f MSDOS e 30 B C Koliko ima bajtova u sektoru h = 512 bajta u sektoru D D Koliko ima sektora u klasteru 08 8 E F Koliko sektora je u rezervisanom području 16 0b 0B16 = 2838 sektora Koliko ima FAT tabela FAT tabele Koliko ima datoteka u korijenskom direktoriju FAT 32 ne koristi ovaj podatak Koliko ima sektora u datotečnom sistemu (16 bitno) FAT 32 ne koristi ovaj podatak F8 za hard diskove, F0 za diskete i druge F8 Stik se smatra hard diskom iako je promjenjive uređaje on sam uklonjiv, sadržaj nije Veličina FAT tabele FAT 32 ne koristi ovaj podatak Koliko sektora u stazi 3f F = sektora u stazi 1A 1B Koliko glava na disku ff FF = 255 Fiktivnih 255 glava, samo za račun, USB nema glave 1C 1F Koliko sektora prije početka particije 3f F=63 63 sektora Koliko sektora u datotečnom sistemu, samo FAT 32 c1 50 ea 00 00EA50C1= Što daje kapacitet Za FAT32 koliko sektora zauzima FAT tabela Za FAT 32 Bit 0-3: Broj aktivne FAT particije FAT. Bit 7: 0 FAT kopira u druge FAT tabele, 1 samo jedan aktivan. Biti8-15 rezervisani 75 3a A 2B Verzija FAT C 2F Broj prvog klastera korijenskog direktorija bajta 003A75 = Aktivna tabela br 0, kopira se u ostale Korijenski direktorij je u klasteru Filesystem info Ova vrijednost je obično Ako nije nula, pozicija kopije BOOT sektora 34 3f Rezervisano Broj diska Rezervisano Boot signatura Volume ID 03 f Tekst imena diska 4e 4f 20 4e 41 4d Volume ID 46 eb d f 5A Dalje slobodno Na FAT12 i FAT 16 sljedeći dio ima drugačije značenje Kopija BOOT sektora ASCII NO NAME

307 11.51.Zadaci BIOS INT 13h broj diska Nekorišteno BOOT signatura A Serijski broj diskete 2B 35 Ime disk volumena 36 3D System ID 3D Dalje slobodno Popunite tablicu BIOS Parametar block za vaš USB stik. 11. Izađite iz khexedit 12. Treba pokupiti korijenski direktorij. Izračunajte KorijenskiDirektorij=VelicinaRezervisanogPodrucja+BrojFATTabela*VeličinaFATTabele= *14965=32768 Izračunajte ovaj podatak i za vaš stick. Da se preuzme korijenski direktorij na sektoru od početka diska, njegovih prvih 10 sektora, otkucati u komandnoj liniji sudo dd if=/dev/sdc1 of=rootdir.img bs=512 skip=32768 count=10 i editujte sada novu datoteku khexedit rootdir.img 13. U meniju Izmijeni, opcija Nađi, odaberite Format Običan tekst i u traženju velikim slovima otkucajte FATTEST. Heks editor bi trebao da vas pozicionira na element korijenskog direktorija za tu datoteku. Ako se s desne strane ne vide imena datoteka, znači da ste pogriješili u računu početne pozicije korijenskog direktorija. Vratite se na korak Svaki element tablice korijenskog direktorija zauzima 32 bajtova. Pogledajmo detaljnije našu datoteku

308 Zadaci Njihovo značenje je sljedeće: Od Do Značenje 0 A Ime i ekstenzija, prvo slovo imena ako je 5E datoteka je obrisana Heksadekadna Interpretacija vrijednost vrijednosti ASCII FATTEXT TXT B B Atribut datoteke 20 Postavljen samo arhivni atribut C C Rezervisano 00 D D Vrijeme kreiranja desetinke E F Vrijeme kreiranja sati, minute sekunde C : Datum kreiranja Datum pristupa Viših 2 bajta adrese klastera (za FAT 32) Vidi dolje s (*) Vrijeme pisanja sati, minute sekunde C : Datum pisanja A 1B Nižih 2 bajta adrese klastera A2 24 (*)000824A2= C 1F Dužina datoteke C C7=14791 Datumi i vremena se pakuju na sljedeći način sati minute Intervala od 2 sekunde Godina od 1980 mjesec dan Dakle sada znamo da datoteka počinje od klastera i da je dugačka bajta. Popunite ovu tabelu i za vaš stik. Ne morate dekodirati datum i vrijeme datoteke. 15. Fizička pozicija prvog sektora datoteke se dobija kao FizičkaPozicija= PocetniKlaster * VeličinaKlastera + BrojFatTabela * VeličinaFATTabele + VeličinaRezervisanogPodručja 2 * VeličinaKlastera = *8+2* = Dakle, kupi se dio od sektora sudo dd if=/dev/sdc1 of=mojadat.img bs=512 skip= count=10000 i

309 11.51.Zadaci 309 khexedit mojadat.img URA! Sa desne strane se vidi ASCII tekst naše datoteke. Našli smo njen prvi klaster. Ako stik nije bio skroz pun prije pravljenja datoteke vjerovatno se ostatak datoteke i nalazi u susjednim sektorima. Ipak, u to se treba uvjeriti pogledom u FAT32 lanac. Sada će se pročitati FAT tabela. Prva od njih je iza rezervisanog područja (pozicija 2838) i dugačka je sektora. Ona se može preuzeti u ovom slučaju ovako. sudo dd if=/dev/sdc1 of=fat.img bs=512 skip=2838 count=14965 i khexedit fat.img Podsjetimo se da je prvi klaster bio na A2= Pošto u FAT32 svaki element lanca zauzima 4 bajta, pozicija drugog klastera se može naći čitanjem lokacije A2*4= Tu vidimo ostatak lanca

310 Zadaci Uočite da se lanac nastavlja na klasterima A3, A4, A5 koji predstavlja zadnji klaster FAT32 lanca. 17. Sada se vratite na pregled datoteke rootdir.img. Kako se smiještaju imena datoteka koja su duža od 8+3 znakova? Ako na stiku ima takvih imena, ona u više elemenata direktorija. Imena se grupišu u dijelovima po trinaest znakova i to krajnja, pa predzadnja,..., pa prva, svaka u posebni element direktorija, a zatim slijedi standardni 8.3 element sa objašnjenom strukturom koji sadrži i kratko ime datoteke. Elementi koji čuvaju duga imena izgledaju ovako. Od Do Vrijednost 0 0 Redni broj dijela imena, unazad, ako je zadnji dio imena ima i šesti bit postavljen na Unicode znak Unicode znak Unicode znak Unicode znak 4 9 A Unicode znak 5 B B Atribut 0F: readonly, hidden, system, volume label C C Tip, uvijek 0' D D Kontrolna suma kratkog imena kome ovo dugo ime odgovara For (sum = i = 0; i < 11; i++) { sum = (((sum & 1) << 7) ((sum & 0xfe) >> 1)) + name[i]; E E Unicode znak Unicode znak Unicode znak Unicode znak Unicode znak Unicode znak 11 1A 1B Cluster (unused; always 0) 1C 1D Unicode znak 12 1E 1F Unicode znak 13 Zanimljiv hack. Kako volume label nije datoteka, pogled na direktorije i pod starom verzijom DOS-a koji imaju duga imena će ignorisati te elemente. A šta je s datotekama koje su u poddirektorijima? Direktoriji su organizovani kao obične datoteke (u klasterima) čija struktura odgovara korijenskom direktoriju.

311 12.Sigurnost računarskih sistema 12.1.Sigurnosna okolina 311 Datotečni sistemi sadrže informacije koje su izuzetno vrijedne svojim korisnicima. Zaštita ovih informacija od neautorizovanog pristupa je, dakle, osnovna briga svih datotečnih sistema. U sljedećim dijelovima pogledajmo na različita pitanja koja se odnose na sigurnost i zaštitu. Ova pitanja se podjednako odnose na sisteme u dijeljenom vremenu kao i mrežu personalnih računara koji su spojeni na dijeljene servere preko lokalne računarske mreže Sigurnosna okolina Ljudi često koriste termine «sigurnost» i «zaštita». Često je korisno napraviti razliku da se između procesa da se osiguraju datoteke da nisu čitane ili modifikovane od neautorizovanog korisnika, koji uključuje tehnička, administrativna, pravna i politička pitanja s jedne strane i specifičnih mehanizama operativnih sistema korišćenih da se obezbijedi sigurnost, s druge strane. Da bi izbjegli konfuziju, koristićemo termin sigurnost kada se odnosi na cjelokupan problem, a termin zaštitni mehanizmi kada se odnosi na pojedinačan mehanizam operativnog sistema koji se koristi za čuvanje informacije na računaru. Međutim, granica među njima nije jasno definisana. Prvo ćemo se pozabaviti sigurnošću, da bi shvatili šta je priroda problema. Kasnije, pogledajmo na zaštitne mehanizme i raspoložive modele koji nam pomažu da sačuvamo informacije na računaru. Sigurnost je suočena sa više izazova. Tri važnija predstavljaju: prirodu prijetnji, priroda «uljeza» i slučajni gubitak podataka Prijetnje Sa sigurnosnog stanovišta, računarski sistemi imaju tri opšta cilja sa odgovarajućim prijetnjama ka njima, kao što je prikazano na slici Slika 190. Prvi cilj je povjerljivost podataka, pri čemu se mora obezbijediti da tajni podaci ostanu tajni. To znači, da ako vlasnik nekih podataka odluči da dozvoli pristup svojim podacima nekoj grupi korisnika a ne drugim, sistem bi trebao garantovati da neautorizivani korisnici ne mogu pristupiti tim podacima. Vlasnik bi trebao bar da može specificirati ko može pristupiti podacima i sistem bi morao da provodi ovu specifikaciju. Cilj Prijetnja Povjerljivost podataka Integritet podataka Raspoloživost sistema Izlaganje podataka Učiniti ih «raskidivim» Odbijanje servisa Slika 190 Sigurnosni ciljevi i prijetnje Drugi cilj, integritet podataka, znači da neautorizovani korisnici ne bi trebali biti u stanju da modifikuju bilo kakve podatke bez vlasnikove dozvole. Modifikacija podataka, u ovom značenju, uključuje ne samo promjenu podataka već i brisanje i dodavanje lažnih podatka. Ako sistem ne može garantirati da smješteni podaci ostanu neizmijenjeni dok vlasnik ne odluči da ih izmjeni, onda ovakav pristup nije vrijedan za informacioni sistem. Integritet podataka je obično važniji od povjerljivosti podataka. Treći cilj, raspoloživost sistema, znači da niko ne može uticati na sistem da dođe u nestabilno stanje. Na primjer, ako računar predstavlja Internet server, slanje previše zahtjeva ka njemu moglo bi ga onesposobiti uzimanjem njegovom procesorskog vremena i to ako ih samo prihvata, ispituje i odbacuje. Ako ova obrada traje, recimo, 100 µs, onda onaj koji pošalje

312 Uljezi zahtjeva mogao bi dovesti server u nestabilno stanje (kada ne može da izvršava svoje servise onako kako bi trebalo). Modeli i tehnologije za rad sa napadom na povjerljivost i integritet podataka postoje dok je za odbijanje servisa (engl. denial service) borba prilično teška Uljezi Većina ljudi se ponaša u skladu sa zakonom i često postavljamo pitanje zašto se brinemo o sigurnosti. Brinemo se zato što postoji skupina ljudi koji bi željeli da naprave probleme (možda za svoje komercijalne svrhe). U literaturi, oni koji pokušavaju provaliti na sistem gdje oni nemaju pravo pristupa se nazivaju uljezima (engl. intruders) ili ponekad i suparnicima (engl. adversary). Uljezi rade na dva različita načina. Pasivni uljezi žele samo da čitaju datoteke za koje nisu autorizovani. Aktivni uljezi su zlonamjerni i žele da naprave izmjene za koje nisu autorizovani. Kada se projektuje operativni sistem, i kada je potrebno da se osiguramo od uljeza, veoma važno je znati o vrsti uljeza koji pokušavaju da pristupe sistemu. Neke kategorije su: Slučajno radoznao netehnički korisnik: Mnogi ljudi imaju personalne računare na svojim stolovima i spojeni su na dijeljene datotečne servere. U prirodi nekih ljudi je da pokušaju čitati datoteke ili elektronsku poštu drugih ljudi ako ne postoji zapreka za njihovo čitanje. Kod većine UNIX sistema, na primjer, svaka novoformirana datoteka je čitljiva za svakog. Krađa iznutra (engl. Snooping by insiders): Studenti, sistem programeri, operatori i neko netehničko osoblje često razmatra kao lični izazov da razbije sigurnost na lokalnom računarskom sistemu. Oni su, često, vrlo vješti i željni da posvete značajno vrijeme svojim naporima (možda bi određeni pokušaji mogli napraviti novac). Neki programeri u bankama su pokušavali da ukradu novac u svojim bankama. Različite sheme postoje, od izmjene softvera tako da promjeni način zaokruživanja iznosa i da decimalni dio odlaže na svoj račun, do ucjena tipa «plati mi ili ću uništiti sve bankarske slogove». Komercijalna i vojna špijunaža: Špijunaža se odnosi na ozbiljne i dobro podržane napade od konkurencije ili stranih zemalja da bi ukrali programe, poslovne tajne, patentirane ideje, tehnologije, projekte kola, poslovne planove i sl. Često ovi pokušaji će uključiti ožičavanje ili pravljenje usmjerenih antena ka računaru da bi pokupile njegovo elektromagnetno zračenje Zlonamjerni programi Druga kategorija sigurnosne prijetnje su zlonamjerni programi. Pisac ovakvih programa je uljez, često sa veoma visokim tehničkim vještinama. Razlika između običnog uljeza od zlonamjernog programa je što se prvi odnosi na lice koji lično pokušava da probije sistem da bi uzrokovao štetu, dok drugi predstavlja program, napisan da bi uzrokovao štetu i navođen je ciljano na sistem Virus Većinu poznatih vrsta zlonamjernih programa predstavljaju virusi. Virus predstavlja dio koda koji se može reprodukovati, pišući svoj kod kao dodatak nekoj datoteci (što liči na sličan proces reprodukcije bioloških virusa). Pored vlastite reprodukcije, virusi mogu raditi i druge stvari. Na primjer, može štampati poruke, prikazati sliku na ekran, izvoditi muziku ili nešto, drugo, bezopasno. Nažalost, može i modifikovati datoteke, uništiti ih ili krasti datoteke slanjem elektronskom poštom.

313 12.6.Crv 313 Virus može raditi i druge stvari, recimo, da učini da je računar neupotrebljiv dok on radi. Ovo se naziva DOS napadom (engl. Denial Of Service). Uobičajeni pristup je da se koriste računarski resursi, takvi ka što je procesor, ili da se disk puni datotekom bezvrijednog sadržaja. Virusi kao i drugi programi mogu uzrokovati DDOS napad (engl. Distributed Denial Of Service). U ovom slučaju virusi ne rade ništa po instalaciji na na računar. U predefinisano vrijeme i datum, hiljade kopija virusa na računarima širom svijeta počnu otvarati web stranice ili počnu koristiti druge mrežne servise od ciljnog računara, na primjer Web servera političke partije ili neke složene organizacije. Ovo dovodi do preopterećenje ciljnog servera ili mrežnih servisa. Zlonamjerni programi se često kreiraju zbog zarade. Većina neželjene elektronske pošte («spam») je povezana sa konačnim odredištima preko mreže računara koji su zaraženi sa virusima ili drugim oblicima zlonamjernim programima. Računar zaražen sa ovakvim programom postaje rob i izvještava status svojem gospodaru što je veoma često na Internetu (odnos master slave). Master šalje spam svim adresama na slave računarima. Druga vrsta zlonamjernog programa instalira proces za prijavu korisnika na zaraženi računar. Ovaj proces zapisuje sve što se zapisuje na tastaturi. Na taj način dolazi do korisničkih imena i lozinki, brojeva kreditnih kartica kao i datuma njihovog važenja. Takve informacije se šalju ka master računaru i onda mogu biti korišćene ili prodane za kriminalne radnje Crv Dok se virus širi lijepljenjem na drugi program i izvršava se kada se program na koji je zalijepljen izvršava, crv predstavlja neovisan program. Crvi se šire korišćenjem mreže za prenos sopstvenih kopija na druge računare. Windows sistemi uvijek imaju startup direktorij za svakog korisnika. Bilo koji program koji se nalazi u tom direktoriju će se izvršiti kada se korisnik prijavi. Ono što treba da crvi urade je da stave svoj kod u taj Startup direktorij (ili kraticu na njega) na udaljenom računaru. Efekat crva može biti isti kao kod virusa. I zaista, razlika između crva i virusa često nije jasna. Neki zlonamjerni programi koriste obje metode da se prošire Trojanac Druga kategorija zlonamjernih programa predstavlja trojanac. Ovo je program koji izgleda da izvršava važeće funkcije neke igre ili «poboljšane» verzije nekog korisničkog programa. Ali kada se trojanac izvršava onda se izvršavaju i neke druge funkcije, možda se pokreće crv ili virus ili izvršava neku od zlonamjenih stvari koje se zahtjeva. Efekti trojanskog konja treba da budu tihi i nečujni. Nasuprot crvima i virusima, trojance skidaju korisnici sa Interneta i čim se prepoznaju, biće izbrisani Logička bomba Još jedna vrsta zlonamjernih programa predstavlja logička bomba. Ona predstavlja dio koda napisan od nekog programera iz firme u kojoj je zaposlen, i tajno unesen u operativni sistem. Svaki put kada se programer prijavi na računar on ne radi ništa. Međutim, ako je programer slučajno otpušten iz firme i fizički mu prava pristupa uklonjena bez najave, sljedeći dan, kada se korisnik ne prijavi, aktivira se logička bomba koja može uključivati brisanje diska, brisanje datoteka, enkripcija važnih datoteka. Firma je u situaciji ili da zove policiju ili da zove bivšeg programera kao «konsultanta» dajući mu astronomski iznos da bi riješio problem (u nadi da ne planira instalirati novu logičku bombu).

314 Spyware 12.9.Spyware Daljnji oblik zlonamjernih programa predstavlja spyware. Obično se dobija posjećivanjem web stranica. U najjednostavnijoj formi, spyware može biti cookie. To su male datoteke koje se izmjenjuju između web browser-a i web servera. One sadrže neke informacije koje dozvoljavaju Web stranici da vas identificira. To je nešto kao tiket koji dobijete kada ostavite bicikl da vam se popravi. Kada se vratite u radnju, vaša polovina tiketa služi da se pronađe bicikl koje ste ostavili. Web konekcije nisu stalne, tako, na primjer, ako ste zainteresovani da kupovinu knjige pri posjeti nekoj online knjižari, ona traži od vašeg browsera da prihvati cookie. Kada završite sa pregledavanjem i drugi put odlučite da izaberete drugu knjigu, onda se od browsera traži da vrati informacije smještene ranije kako bi generisao listu onoga što je nekad bilo traženo. Ono što je ružno, je što postoji način da web stranica može biti u stanju da pokupi izvršni program na vašem računaru. Mnogi browseri prihvataju plug-ins da bi dodali neke funkcije takvih kao prikazivanje novih vrsta datoteka. Korisnici često prihvataju nove plug-in-e bez dovoljnog znanja šta oni rade. Jedna greška u browseru može dozvoliti udaljenom računaru da instalira neželjeni program, možda poslije «mamljenja» korisnika na stranicu koja je pažljivo konstruisana i ranjiva. U bilo koje vrijeme ako korisnik prihvati pristup takvoj stranici, dobrovoljno ili ne, postoji rizik da taj pristup sadrži kod koji bi mogao nanijeti štetu Slučajan gubitak podataka Kao dodatak prijetnjama uzrokovanih od nepoželjnih uljeza, vrijedni podaci mogu se izgubiti i slučajno. Neki od uobičajenih uzroka gubitka podataka predstavljaju: vatra, poplava, zemljotres, ratovi, ili miševi koju su stigli do traka i disketa. Hardversko softverske greške: procesor ne funkcionira, nečitljivi diskovi ili trake, greške na telekomunikacijama, programske greške. Vrlo česta grupa softverskih grešaka je prekoračenje bafera. Ona se pored ovoga, može iskoristiti od strane napadača na sistem. U sljedećem primjeru: char A[8] = {; unsigned short B = 1979; strcpy(a, "excessive"); neće biti promijenjena samo varijabla A, nego i varijabla B. Sličnim principom se mogu mijenjati i povratne adrese iz podprograma i tako forsirati izvršenje koda na inače nedostupnom mjestu Da se ne ostave ovakve sigurnosne rupe, uvijek koristiti sistemske pozive koji provjeravaju dužine nizova, npr strncopy. Ljudske greške: nekorektan unos podataka, montiranje pogrešne trake ili diska, loše izvođenje programa, izgubljena traka ili disk, ili neka druga greška. Većina ovih problema se mogu riješiti sa adekvatnim backup-om, koji je dovoljno udaljen od originalnih podataka Uobičajeni sigurnosni napadi Nalaženje sigurnosnih šupljina nije jednostavno. Uobičajen način za testiranje sigurnosti sistema je da se iznajmi grupa eksperata, poznatih kao tim za pronalaženje sigurnosnih rupa (engl. penetration team, ili tigers team), da bi se vidjelo da li su oni u stanju da izvrše proboj u sistem. Hebbard i ostali (1980) su pokušali da sa studentima postdiplomcima. Ovi timovi su otkrili jedan broj oblasti u kojima će sistemi vjerovatno biti slabi. U nastavku su nabrojani neki

315 12.12.Principi projektovanja sigurnosti 315 od uobičajenih napada koji su često uspješni. Kada projektujete sistem, potrebno je da se osigurate da sistem može odoljeti napadima kao što je ovaj. U nastavku su navedeni problemi na koje treba obratiti pažnju: 1. Zahtjev za čitanjem memorijskih stranica, diskovnog prostora ili traka. Mnogi sistemi ih ne brišu prije alokacije i oni mogu biti interesantni nekome a predstavljaju informacije od prethodnog korisnika. 2. Pokušaj sa ilegalnim sistemskim pozivom, ili legalan sistemski poziv sa nelegalnim parametrima, ili legalan sistemski poziv sa legalnim ali neočekivanim vrijednostima parametara. Mnogi sistemi mogu doći u prilično zbunjujuće stanje. 3. Počni prijavu korisnika i pritisni DEL, RUBOUT ili BREAK u toku sekvence prijave korisnika. U nekim sistemima, program za kontrolu lozinke će biti uništen i prijava će biti uspješna. 4. Pokušaj mijenjati kompleksne strukture operativnog sistema koje se čuvaju u korisničkom adresnom prostoru. U nekim sistemima ( posebno na velikim mašinama, mainframes), kod otvaranja datoteke, program pravi velike strukture podataka koje sadrže ime datoteke i mnoge druge parametre i proslijeđuje ih sistemu. Čim se datoteka pročita, ili piše, sistem sam ažurira strukturu podataka. Promjene ovih polja bi mogle da promjene ponašanje programa u izvođenju i na taj način stvoriti šupljinu u sigurnosti sistema. 5. Ometanje korisnika pisanjem programa koji štampa "login:" na ekranu i slično. Mnogi korisnici će unijeti ime i lozinku i šalje onom kome treba. 6. Pogledaj u korisnička uputstva i dijelove koji kažu "Nemoj uraditi X." Pokušaj sa mnogim varijacijama X. 7. Ubijedi sistemskog programera da promjeni pristup sistemu kako bi zaobišao izvjesne ključne sigurnosne prepreke za sve korisnike sa vašim imenom. Ovaj napad je poznat kao «trap door». 8. Ako je sve u redu, onaj koji probija u sistem može naći sekretaricu direktora računarskog centra i ponuditi joj veliki novac. Sekretarice često imaju pristup svim vrstama korisnih informacija i obično su slabo plaćene. Nemojte podcijeniti ovaj problem koji dolazi od osoblja Principi projektovanja sigurnosti Saltzer i Schroeder (1975) su identificirali nekoliko opštih principa koji se mogu koristiti kao vodič za projektovanje sigurnosnih sistema. Kratak sadržaj njihovih ideja baziranih na iskustvu sa MULTICS-om je prikazano u nastavku. 1. Projektovanje sistema bi trebalo biti javno. Pretpostavka da uljez ne zna kako sistem radi služi samo da se zavedu projektanti. 2. Pristup ne bi smio biti definisan unaprijed (kao default). Na taj način, greške koje se pojavljuju kod prijave legalnog korisnika, a odbijen je, će biti uočene znatno brže nego greške koje se pojave kod prijave neautorizovanih korisnika. 3. Provjera tekuće autorizacije. Sistem ne bi trebao kontrolisati permisije da bi odredio da je pristup dozvoljen, i onda skloni ove informacije za sljedeće upotrebe. Mnogi sistemi kontrolišu permisije kada se otvara datoteka a ne poslije. Ovo znači da korisnik koji je otvorio datoteku i drži je otvorenom sedmicama će imati i dalje stare permisije čak iako je vlasnik davno promjenio permisije datoteke. 4. Dati svakom procesu najmanje moguće privilegija. Ako editor ima samo prava za pristup datoteci koju obrađuje (koja se navodi po pozivu editora), editori sa trojancem neće biti u stanju da naprave mnogo štete. Ovaj princip predstavlja zaštitnu shemu fine granulacije.

316 Autentifikacija korisnika 5. Zaštitni mehanizmi bi trebali biti jednostavni, uniformni i ugrađeni u najniže nivoe sistema. Pokušavajući da podesimo sigurnost na postojećem nesigurnom sistemu je skoro nemoguće. Sigurnost nije karakteristika koja se postiže dodavanjem zakrpa. 6. Izabrana shema mora biti prihvatljiva. Ako korisnici osjete da zaštita njihovih datoteka predstavlja puno rada, oni je neće ni raditi. Šta više, oni će se glasno žaliti ako se nešto loše desi. Odgovori tipa To je tvoja greška neće biti dobro primljeni Autentifikacija korisnika Mnoge zaštitne sheme su bazirane na pretpostavkama da sistem zna identitet svakog korisnika. Problem identifikacije korisnika kada se prijavljuju na sistem se naziva autentifikacija korisnika. Većina autentifikacionih metoda su bazirane na identifikaciji nečeg što korisnik zna, nečeg što korisnik ima ili nečeg što je korisnik Lozinke Većina, široko korišćenih, oblika autentifikacije zahtijeva od korisnika da unese lozinku. Zaštita lozinkom je jednostavna za shvatiti a i jednostavna za implementaciju. U Unix-u se izvodi ovako: program za prijavu traži od korisnika da unese svoje ime i lozinku. Lozinka se odmah šifrira. Zatim program za prijavu čita datoteku lozinki u kojoj se nalazi niz ASCII linija, po jedna za korisnika, dok ne nađe liniju koja sadrži ime korisnika. Ako je šifrirana lozinka ista sa šifriranom lozinkom kod prijave, pristup je dozvoljen inače se odbija. Lozinke se lako probijaju. Često ste čuli priču u kojoj studenti ili čak i srednjoškolci na svojim računarima izvršavaju proboje u neke sisteme sa vrhunskim tajnama velikih korporacija ili vladinih agencija. U suštini, proboj se sastoji od pogađanja kombinacije korisničkog imena i lozinke. Jedan od načina proboja je prikupljanje liste vjerovatnih lozinki: prvo i posljednje ime, imena ulica, imena gradova, fudbalskih klubova, riječi iz rječnika srednje veličine zajedno sa verzijama tih riječi čitanih unazad. Ako se sve lozinke sastoje od 7 znakova izabranih slučajno od 95 ASCII znakova, prostor za pretraživanje postaje 957 što je 7x Vršeći 1000 kriptiranja u sekundi, trebaće 2000 godina da se napravi potpuna lista i iskontroliraju sve. Ako se pak zahtjeva od lozinki da sadrže bar jedno malo slovo, bar jedno veliko slovo i jedan specijalan znak i da bude bar 7 znakova duga lozinka će biti osnovno poboljšanje kod davanja lozinki. Danas se koristi sličan kriterij kompleksnosti kod Windows-a, s tim da je lozinka valjana ako ima u sebi bar tri vrste znakova od mogućih 4 skupina znakova: brojevi, mala slova, velika slova i specijalni znaci. Čak iako se smatra nemogućim da se zahtjeva od korisnika da uzimaju korektne lozinke, Morris i Tompson su opisali tehniku koja će učiniti njihov sopstveni napad (enkripcijom velikog broja lozinki unaprijed) gotovo nekorisnim. Ideja je da se pridruži slučajan broj dužine n bita svakoj lozinki. Slučajan broj se mijenja kad god se lozinka mjenja. Slučajan broj se smiješta u datoteku u nekriptiranom obliku, tako da ga svako može pročitati. Umjesto da se kriptirane lozinke smiještaju u datoteku lozinki, prvo se lozinika i slučajan broj spoje i onda kriptiraju zajedno i kao takav se smiješta u datoteku lozinki. Sada razmotrimo posljedicu da uljez želi da napravi listu vjerovatnih lozinki, koje će šifrirati i sačuvati u datoteku f, tako da bilo koja kriptirana lozinka može se brzo naći. Ako uljez sumnja da bi lozinika mogla biti Marilyn, više nije dovoljno da tu lozinku kriptira i stavi je u datoteku f. On treba da kriptira 2 n lozinki takvih kao što su Marilyn0000, Marilyn0001, Marilyn0002 i dalje i sve ih stavi u datoteku f. Ova tehnika povećava veličinu datoteke f sa 2 n. UNIX koristi metodu sa n=12. Neke verzije Unixa čine da je datoteka lozinki nečitljiva ali

317 12.15.Fizička identifikacija 317 obezbjeđuje program da pretraži elemente po zahtjevu, dodavajući malo kašnjenje koje značajno usporava bilo kojeg uljeza. Mada ova metoda nudi zaštitu od uljeza koji pokušavaju da dobiju lozinke iz velike liste kriptiranih lozinki, ne radi se ništa da se zaštiti korisnik David čija je lozinka David. Jedan od načina je da ohrabrite ljude da izabiraju bolje lozinke je da imate ponudu od računara unaprijed. Neki računari imaju programe koji generišu slučajno riječi koje se jednostavno izgovaraju koje se mogu koristiti kao lozinke (poželjno bi bilo da imaju i velika slova i neki specijalni znak). Drugi računari zahtijevaju od korisnika da promjene svoje lozinke da bi se zaštitili od prouzrokovane isticanjem važnosti lozinke. Najekstremniji oblik ovog pristupa su jednovremene lozinke. Kada se koriste jednovremene lozinke, tada se koristi lista lozinki. Svaki korisnik koristi sljedeću lozinku u listi. Ako uljez ikada otkrije lozinku, neće mu biti od koristi jer se kod sljedeće prijave mora koristiti druga lozinka. Ovdje je opasno da se ne izgubi lista lozinki. U toku unošenje lozinke ne dolazi do prikazivanja znakova na ekranu, da bi zaštitio od radoznalih koji se nalaze blizu terminala. Lozinke ne bi trebalo nikada smiještati u nekriptiranom obliku. Šta više, ni uprava računarskog centra ne bi imala nekriptirane lozinke. Držanje nekriptiranih lozinki je opasno i može prouzročiti nevolje. Jedna varijacija kod izdavanja lozinki je da svaki korisnik ima dužu listu pitanja i odgovora koji se smještaju u kriptiranom obliku. Pitanja bi bila takva da imaju jasne odgovore. Tipična pitanja su: Kako se zove tvoja sestra? U kojoj ulici se nalazi osnovna škola? Da li je gospodin X.Z profesor? Kod logiranja, računar postavlja pitanja po slučajnom izboru i provjerava odgovore. Jedna varijacija na ova pitanja je postavljanje pitanja koja u sebi imaju formulu, recimo x 2. Kada se korisnik prijavljuje i računar odštampa, recimo 7, tada korisnik treba da napiše 49. Ovaj algoritam može biti različit prije podne i poslije podne, u različite dane u sedmici, sa različitih terminala i sl Fizička identifikacija Potpuno različit pristup kod autorizacije je da se provjeri kako bi se vidjelo da li korisnik ima neki element, plastičnu karticu sa magnetnom trakom na njoj. Kartica se ubaci u terminal koji onda kontroliše čija je kartica. Ova metoda se kombinuje sa lozinkom tako da se korisnik može prijaviti samo a) ako ima karticu i b) zna lozinku. Automatske mašine za izdavanja novca, obično, rade na ovom principu. Još jedan pristup je da se mjere fizičke karakteristike koje je teško krivotvoriti. Na primjer, otisak prsta ili čitač zapisa glasa na terminalu bi mogao provjeriti korisnički identitet. Još jedna tehnika se naziva analiza potpisa. Korisnik se potpisuje sa specijalnim perom spojenim na terminal i računar provjerava sa zapisanim primjerkom potpisa. Čak bolje je da se ne provjerava potpis nego da se provjeravaju kretnje pera koje se prave kod potpisivanja. Dobar falsifikator bi mogao kopirati potpis ali ne bi imao osjećaj o tačnim pokretima koje izvodi. Analiza dužine prsta je iznenađujuće praktična. Kada se koristi, svaki terminal ima uređaj Korisnik ubaci svoju ruku i tada se mjeri dužina svakog od njegovih prstiju i porede sa onim zapisanim u bazi podataka. Metode kao analiza krvi i analiza mokraće, nisu prihvatljive za korisnika.

318 Protumjere Protumjere Računarske instalacije koje su ozbiljne u vezi sigurnosti preduzimaju korake kako bi autorizacija korisnika postala složenija. Na primjer, svakom korisniku bi moglo biti dozvoljeno da se prijavi samo sa određenog terminala i samo u toku nekih dana u sedmici i sati u danu. Rad sa telefonskim linijama bi trebao da izgleda ovako. Ako se neko pokuša prijaviti putem telefonske linije, poslije uspješne prijave, sistem bi trebao odmah prekinuti vezu i pozvati korisnika po dogovoru koristeći njegov broj. Ova mjera znači da uljez ne može pokušavati proboj sa različitih linija, nego samo sa korisničkog telefona bi se moglo prijaviti. U bilo kojem događaju, sa ili bez poziva korisnika koji je zvao, sistem bi trebao bar 10 sec da provjeri neku lozinku i trebao bi povećati ovo vrijeme poslije nekoliko neuspješnih pokušaja u cilju da smanji intenzitet pokušaja uljeza. Poslije tri neuspješna pokušaja, liniju bi trebalo prekinuti na 10 minuta i o tome obavijestiti osoblje sigurnosti. Sve prijave bi trebalo zapisivati. Kada se korisnik prijavi, sistem bi trebao ispisati vrijeme i terminal predhodne prijave tako da se može detektovati moguće probijanje sistema. Sljedeći korak je postavljanje zamke kako bi se uhvatili uljezi. Najjednostavnija shema je da se ima posebno ime za prijavu sa jednom jednostavnom lozinkom (t.j. korisničko ima: gost, Lozinka: gost). Kada se neko prijavi koristeći ovaj račun (korisničko ime i lozinka), specijalisti sigurnosnog sistema su odmah obaviješteni Zaštitni mehanizmi U sljedećem dijelu koncentrisaćemo se na detaljne tehničke specifikacije koje se koriste u operativnim sistemima da bi se zaštitile datoteke. Sve ove tehnike prave jasnu razliku između politika (čije podatke treba štititi i od koga) i mehanizama (kako sistem provodi politiku). Pristup u ovom djelu biće na mehanizmima a ne na politikama. U nekim sistemima, zaštita se provodi sa programom nazvanim monitor referenci. Svaki put kada se pokuša pristup ka možda zaštićenom resursu, sistem prvo pita referentni monitor da provjeri legalnost pristupa. Monitor referenci onda pregleda tabele politika i pravi odluke. U nastavku, opišimo okolinu u kojoj monitor referenci funkcioniše Zaštitni domeni Računarski sistem sadrži mnoge objekte koji treba da budu zaštićeni. Ovi objekti mogu da budu hardver (t.j. procesori, memorijski segmenti, disk uređaji, ili štampači), ili mogu da budu i softver (t.j. procesi, datoteke, baze podataka, ili semafori). Svaki objekt ima jedinstveno ime preko koga mu se pristupa, i konačan skup operacija kojima im proces može pristupati. Operacije read i write su odgovarajuće operacije za datoteke, operacije up() i down() su za semafore. Jasno je da je potreban način da se zabrani pristup procesa objektima za koje nije autorizovan. Šta više, mehanizam mora napraviti mogućnost da se ograniče procesi na skup legalnih operacija kada je potrebno. Na primjer, proces A može biti namijenjen za čitanje datoteke F a ne i za pisanje. U cilju da diskutujemo o različitim zaštitnim mehanizmima, korisno je da se uvede koncept domena. Domen je skup parova ( objekata, prava). Svaki par specificira objekt i jedan podskup operacija koje se mogu izvršiti na njemu. Pravo u ovom kontekstu, znači dozvolu da se izvrši jedna od operacija. Često jedan domen odgovara jednom korisniku, koji govori šta korisnik može a šta ne može da uradi, mada domen može biti opštiji nego samo za jednog korisnika. Slika 191 prikazuje četiri domena, pokazujući objekte u svakom domenu i prava [Read, Write, execute] raspoloživa za svaki objekt. Primijetimo da se Port1 nalazi u dva domena u isto

319 12.18.Zaštitni domeni 319 vrijeme, sa istim pravima. Moguće je da isti objekat bude u više domena, sa različitim pravima u svakom domenu (u ovom primjeru datoteka 3). Domen 1 Domen 2 Domen 3 Domen 4 Dat1 [R] Dat2 [RW] Dat3 [RW] Dat3 [R] Dat4 [RX] Dat5 [R] Port1 [R] Dat6 [RX] Dat7 [RW] Port2 [W] Dat8 [R] Dat9 [RX] Slika 191 Objekti u domenama U svakom trenutku vremena, svaki proces se izvršava u nekom zaštitnom domenu. Drugim riječima, postoji neki skup objekata kojima može pristupiti, i za svaki objekt ima neki skup prava. Procesi mogu izmijeniti domen u toku izvršavanja. Pravila za izmjenu domena su jako zavisna od sistema. Da bi učinili ideju zaštitnih domena konkretnijom, pogledajmo što imamo u Unixu. U Unixu, domen procesa je definisan sa njegovim UID i GID. Dajući bilo koju kombinaciju (UID, GID), moguće je napraviti potpunu listu svih objekata (datoteka, uključujući i U/I uređaje predstavljene sa specijalnim datotekama, i sl. ) kojima se može pristupiti, i njima se može pristupiti za pisanje, čitanje ili izvršavanje. Dva procesa sa istom kombinacijom (UID, GID) će imati pristup istom skupu objekata. Procesi sa različitim parom (UID, GID) će imati pristup različitom skupu datoteka, mada se mogu značajno poklapati u većini slučajeva. Dakle, svaki proces u UNIX-u ima dvije polovine: korisnički dio i sistemski dio. Kada proces izvrši sistemski poziv, on vrši izmjenu domena iz korisničkog u sistemski dio. Sistemski dio ima pristup različitom skupu objekata od korisničkog dijela. Na primjer, sistem može pristupati svim stranicama u sistemskoj memoriji, cijelom disku i svim drugim zaštićenim objektima. Dakle. Sistemski poziv uzrokuje izmjenu domena. Kada jedan proces uradi exec nad datotekom sa SETUID ili SETGID bitom postavljenim, on dobija nove stvarne UID ili GID. Sa različitom kombinacijom (UID,GID), on ima različit skup datoteka i raspoloživih operacija. Izvršavanje programa sa SETUID ili SETGID takođe predstavlja izmjenu domena, pošto se raspoloživa prava mijenjaju. Važno pitanje je kako sistem održava evidenciju koji objekt pripada kojem domenu. Održava se sa matricom, sa vrstama koje predstavljaju domene i kolonama koje predstavljaju objekte. U svakom elementu matrice se nalaze prava pristupa, ako postoje, za dati objekt i domen. Matrica za sliku Slika 191 je prikazana na slici Slika 192. Sa ovom matricom i tekućim brojem domena sistem može kazati kakav je pristup dozvoljen navedenom objektu. Dat1 Dat2 Dat3 Dat4 Dat5 Dat6 Dat7 Dat8 Dat9 Port1 Port2 Domen1 R RW RW Domen2 R RX R R Domen3 RX RW R W Domen4 R RX Slika 192 Matrica domena i objekata Sama izmjena domena može se lako uključiti u model matrice tako što će sam domen predstavljati objekt, sa operacijom ulazak u domen. Na slici Slika 193 se vidi ranije pomenuta matrica, ali sada sa tri domena i samim objektima. Proces u domenu 1 može preći u domen 2,

320 Liste kontrola pristupa ali poslije toga se ne može vratiti. S druge strane, između domena 3 i 4 se može obostrano ulaziti i izlaziti. Ova situacija modelira izvršenje jednog SETUID programa u UNIX-u. Ostale izmjene domena nisu dozvoljene u ovom primjeru. Dat1 Dat2 Dat3 Dat4 Dat5 Dat6 Dat7 Dat8 Dat9 Port1 Port2 D1 D2 D3 D4 Domen1 R RW RW E Domen2 R RX R R Domen3 RX RW R W E Domen4 R RX E Slika 193 Zaštitna matrica sa domenima kao objektima Liste kontrola pristupa U praksi, smiještanje matrice prava pristupa predstavlja smiještanje rijetke matrice jer je velika i nepopunjena. Većina domena nema pristupa većini objekata, tako da smiještanje vrlo velike, gotovo prazne matrice predstavlja gubitak smještajnog prostora. Dvije praktične metode se koriste za smiještanje matrice, smiještanje nepraznih elemenata po vrstama i po kolonama. Prva tehnika se sastoji od pridruživanja svakog objekta jedne uređene liste koja sadrži sve domene koji mogu pristupiti objektu i kako. Ova lista se naziva kontrolnom listom pristupa ili ACL i prikazana je na slici Slika 194. Ovdje se vide sedam procesa, od kojih svaki pripada različitom domenu, A, B i C i šest datoteka F1, F2, F3, F4, F5 i F6. Radi jednostavnosti, pretpostavimo da svaki domen odgovara po jednom korisniku, u ovom slučaju, korisnicima A, B i C. A B C B Proces Vlasnik B A B Korisnički prostor F1 A:RW; B:A F4 A:RW; C:R F2 A:R; B:RW C:R F5 C:RX ACL F3 A:RX C:RX Datoteka F6 B:RW; C:RW Jezgro Slika 194 Korišćenje liste kontrole pristupa Svaka datoteka ima jednu ACL kojoj joj je pridružena. Datoteka F1 ima dva elementa u svojoj ACL (odvojene sa ;). Prvi element kaže da bilo koji proces čiji je vlasnik A može čitati i pisati datoteku. Drugi element kaže da bilo koji proces korisnika B može čitati datoteku. Svi drugi pristupi od strane ovih korisnika i svi drugi pristupi od drugih korisnika su zabranjeni. Primijetimo da su prava dodijeljena od strane korisnika a ne od procesa. Nije važno da li korisnik ima jedan ili sto procesa, posmatra se vlasnik a ne ID procesa. Datoteka F2 ima tri elementa u svojoj ACL: A, B i C mogu čitati datoteku pri čemu B je može i pisati. Drugi pristupi nisu dozvoljeni. Datoteka F3 je očigledno jedna izvršna datoteka, pošto B i C mogu i čitati i izvršavati datoteku. Pored toga B je može i pisati.

321 12.19.Liste kontrola pristupa 321 Ovaj primjer ilustrira većinu osnovnih oblika zaštite koristeći ACL. Složenije sheme se često koriste u praksi. Da bi počeli sa ovim, za sada imamo tri prava pristupa: čitanje, pisanje i izvršavanje. Pored njih mogu postojati i dodatna prava. Neka od njih mogu biti opšta, i koja se primjenjuju na sve objekte, a neka mogu biti specifična objektima. Primjeri opštih prava su uništi objekt i kopiraj objekt. Oni bi se mogli održavati za svaki objekt bez obzira kojeg su tipa. Prava specifična objektima mogu uključivati dodavanje poruke u mailbox objekt i alfabetsko sortiranje objekta direktorij. Za sada, naši ACL elementi su predstavljeni za pojedinačnog korisnika. Mnogi sistemi podržavaju koncept grupe korisnika. Grupe korisnika imaju imena i mogu se uključiti u ACL. Moguće su dvije varijacije u značenju grupe. U nekim sistemima, svaki proces ima korisničku identifikaciju, ID (UID) i identifikaciju grupa GID. U takvim sistemima, element ACL sadrži elemente oblika UID1, GID1: pravo_pristupa1; UID2, GID2: pravo_pristupa2;... Pod ovim uslovima, kada se napravi zahtjev za pristup objektu, provjera se vrši koristeći UID i GID pozivaoca. Ako su prisutni u ACL, navedena prava pristupa su na raspolaganju. Ako par (UID, GID) nije u listi, pristup nije dozvoljen. Koristeći grupe na ovaj način, u suštini se uvodi koncept svojstva. Razmotrimo jednu instalaciju u kojoj je Tanja administrator sistema i na taj način je u grupi sysadm. Međutim, pretpostavimo da firma ima i neke klubove za zaposlene i da je Tanja član i kluba grafika i ima pristup podacima koji se nalaze u bazi grafika za klub. Dio ACL bi mogao izgledati kao što je prikazano na slici Slika 195. Datoteka passwd Lista kontrole pristupa tanja, sysadm: RW grafika_d1 emin, grafika: RW; tanja, grafika: RW;... Slika 195 ACL sa korisnikom koji pripada dvije grupe Ako Tana pokušava da pristupi jednoj od ovih datoteka, rezultat zavisi u kojoj grupi je trenutno prijavljena. Kada se prijavljuje, sistem je može da pita koju grupu će koristiti, pri čemu različite grupe mogu imati različite parove (korisničko ime, lozinka). Suština ovakve sheme je da se spriječi Tanja da pristupa datoteci lozinki kada se nalazi prijavljena na klub grafika. Ona to može raditi samo ako se prijavi kao administrator sistema. U nekim sistemima, korisnik smije imati pristup nekim datotekama nezavisno kojoj grupi pripada i kako je prijavljen. Ovaj slučaj može se označiti sa *, koja znači sve pristupe. Na primjer tanja, *: RW će za datoteku lozinki dati Tanji pristup bez obzira na koju je grupu trenutno prijavljena. Još jedna mogućnost je da ako korisnik pripada bilo kojoj grupi koje imaju neka prava, kod prijave korisnika prava su mu dozvoljena. U ovom slučaju, korisnik koji pripada u više grupa ne mora navoditi grupu u kojoj treba da radi pri čemu su njegova sva prava pristupa dozvoljena. Mana ovakvog pristupa je što obezbjeđuje manju zaštitu podataka: Tanja bi mogla editovati datoteku lozinki na sastanku kluba grafika. Korišćenje grupa i * uvodi mogućnost odabranog blokiranja specifičnih korisnika da pristupi datoteci. Na primjer, element vucko, *: (none); *, *: RW daje svima pristup za čitanje i pisanje, osim Vučku. Ovo funkcionira zato što se elementi liste skeniraju u redosljedu i kada se prvi primjeni postaje važeći i sljedeći se ne ispituju. Čim

322 Liste mogućnosti se pronađe Vučko na prvom elementu liste i njegova prava pristupa, u ovom primjeru nikakva, odmah se primjenjuju. Pretraživanje se obustavlja u ovoj tački. Činjenica da svi ostali imaju pristup nikada se nije tražila. Drugim rječima pri radu sa grupama nije dovoljno da imamo elemente ACL koji imaju parove (UID, GID), već da imamo da svaki element se nađe u UID ili GID. Na primjer, za element grafika_d1 mogla bi biti duje: RW; fikret: RW; grafika: RW što znači da Duje i Fikret, i svi članovi grafika grupe imaju pristupe za čitanje i pisanje nad datotekom. Ako se nekada desi da korisnik ili grupa ima neke dozvole pristupa s obzirom na datoteku koje vlasnik datoteke želi da poništi. Sa listom kontrole pristupa, relativno je jasno da se ponište prethodno dodijeljena prava. Sve što treba uraditi je da se naprave izmjene u ACL. Međutim, ako se lista kontrolira samo kod otvaranja, mnoge promjene će se reflektovati kasnije kod ponovnog otvaranja, čak i u slučajevima kada korisnik više nije autorizovan da pristupi datoteci Liste mogućnosti Drugačiji način pogleda na matricu prava je preko redova. Kada se ova metoda koristi, svakom procesu se pridružuje lista objekata kojima se može pristupiti zajedno sa indikacijom koje operacije su dozvoljene na svakom objektu, drugim riječima u njihovim domenima. Ova lista se naziva listom mogućnosti (engl. capabilities) ili C- lista a pojedini elementi u listi se nazivaju mogućnostima. Slika 196 prikazuje skup od sedam procesa i njihove C-liste. A B C B Proces Vlasnik B A B Korisnički prostor F1 F2 F3 F4 F5 F6 Datoteka F1:R F2:R F3:RX F4:RW F1:R F2:RW F6:RW F2:RW F3:RX F4:R F5:RW F6:RW Jezgro Slika 196 Liste mogućnosti Svaka C-lista daje vlasniku neka prava na nekom objektu. Proces čiji je vlasnik korisnik A može čitati datoteke F1, F2, F3 i F4, pisati u F4 i izvršavati F3. Obično se mogućnosti odnose na identifikator datoteke (kada uopšteno kažemo objekat) i bitmapu koja se odnosi na različita prava pristupa. U Unix sistemima, identifikator datoteke bi vjerovatno mogao biti broj indeksnog čvora. C-liste predstavljaju objekte i na njih se može pokazivati iz drugih C-lista i na taj se način postiže dijeljenje pod-domena. Potpuno je jasno da C-liste moraju biti zaštićene od neovlašćenog pristupa korisnika. Poznate su tri metode za zaštitu.

323 12.20.Liste mogućnosti zahtijeva se da računar ima označenu arhitekturu (engl. Tagged architecture), hardver je projektovan na takav način da svaka memorijska riječ ima jedan dodatni bit koji kaže da li riječ sadrži mogućnost ili ne. Ovaj bit se ne koristi u aritmetičkim operacijama, kao i operacijama poređenja i običnim instrukcijama i može se promijeniti samo sa programima koji se izvršavaju u sistemskom načinu rada (t.j. operativnim sistemom). Računari sa ovakvom arhitekturom su izgrađeni i mogu se napraviti da rade dobro. Popularni primjer ovakve arhitekture predstavlja računar IBM AS/ drugi način predstavlja držanje C-liste unutar operativnog sistema. Mogućnosti se onda odnose na poziciju u C-listi. Proces može izdati komandu «Čitaj 1 KB iz datoteke na koju pokazuje mogućnost 2». Ovaj oblik adresiranja je sličan korišćenju datotečnih deskriptora u Unix-u. Hydra radi na ovaj način. 3. Ovaj način podrazumijeva držanje C-liste u korisničkom adresnom prostoru, ali se upravlja sa C-listom koja je kriptirana tako da joj korisnik ne može prići i mjenjati je. Ovakav pristup je posebno pogodan za distribuirane sisteme i radi na sljedeći način. Kada proces klijent pošalje poruku udaljenom serveru, na primjer, datotečnom serveru, da bi kreirao jedan objekt za njega, server kreira traženi objekt i generiše slučajan broj tipa long i kontrolno polje koje ide sa njim. U tabeli datoteka na serveru se vrši rezervacija ovog objekta zajedno sa ovim kontrolnim poljem i adresama diskovnih blokova i sl. Kod Unix-a, ovo kontrolno polje se smiješta u indeksni čvor datoteke na serveru. Ono se ne šalje nazad korisniku i nikada se šalje na mrežu. Server zatim generiše mogućnost za tu datoteku ka korisniku. Mogućnost koja se vrati korisniku sadrži identifikator servera, broj objekta (indeks u tabelu datoteka na serveru, u stvari broj indeksnog čvora), njegova prava pristupa smještena kao bit mapa. Za novi objekat, sva prava pristupa će se postaviti. Posljednje polje se sastoji od spajanja objekta, prava pristupa i pomoćnog polja koristeći jednosmjernu funkciju f nad kriptiranim poljima. Kada korisnik želi da pristupi objektu, on šalje u svom zahtjevu serveru i njegove mogućnosti pristupa objektu. Server iz poruke izvadi broj objekta koji mu služi da pronađe objekat u tabeli objekata. On onda izvršava funkciju f(objekat, Prava_pristupa, kontrolno_polje) uzimajući prva dva parametra iz poslane mogućnosti i treći iz svoje sopstvene tabele. Ako se rezultat poklapa sa četvrtim poljem u mogućnosti, zahtjev se odobrava, inače se odbija. Ako korisnik pokuša da pristupi nekom drugom objektu na serveru, s obzirom da ne može da napravi četvrto polje korektno pošto ne zna kontrolno polje, zahtjev će se odbiti. Korisnik može tražiti od servera da omogući slabiji pristup, na primjer «samo za čitanje». Prvo što radi server je da provjerava da li odgovarajuće pravo pristupa postoji. Ako postoji, on izračunava f(objekat, Nova_prava_pristupa, kontrolno_polje) i generiše nove mogućnosti za objekt i smiješta ih u četvrto polje. Primijetimo da se kontrolno polje koristi jer realizacija dolazećih zahtjeva zavise od njega. Ova novogenerisana mogućnost pristupa objektu se vraća procesu koji je tražio pristup. Korisnik sada može dati ovu mogućnost drugom korisniku slanjem u poruci. Ako drugi korisnik postavi sve bite koji bi trebali da budu spušteni, server će detektovati jer funkcija f daće rezultat koji nije jednak polju prava pristupa objektu. Ova shema je razvijena za Amoeba distribuirani sistem. Kao dodatak pravima pristupa specifičnog objekta, takvim kao što su read i execute, mogućnosti ( i kernel i korisničke) obično imaju definisana prava pristupa koja su primjenljiva za sve objekte. Primjeri ovakvih prava su: Kopiraj mogućnost: kreiraj novu mogućnost za isti objekat Kopiraj objekat: kreiraj duplikat objekat sa novim mogućnost

324 Tajni kanali (engl. Covert Channels) Ukloni mogućnost: pobriši element iz C-liste; ne utiče na objekat Uništi objekat: trajno ukloni objekat i njegova prava pristupa objektu Ukoliko želimo da ponovno dodijelimo prava pristupa objektu koji smo izmijenili ili pobrisali, to će biti veoma teško ukoliko se odnosi na kernel pristup. Teško je za sistem da nađe sve mogućnosti za bilo koji objekat i vrati ih nazad u stanje kakve su bile, jer one mogu biti smještene u C-liste po cijelom disku. Jedan pristup ovom problemu je da postoje pokazivač na indirektni objekat prije nego na sam objekat. Ovaj indirektni objekat predstavlja pokazivaće na stvarne objekte, sistem bi mogao uvijek da prekine vezu ka klijentu, i na taj način da ne dozvoli pristup tom objektu. U shemi Amoebe, davanje ranijih prava pristupa se izvodi jednostavno. Sve što je potrebno uraditi je promjena kontrolnog polja smještenog sa objektom. Jednim potezom sve mogućnosti mogu biti nevažeće. Međutim, nijedna shema ne dozvoljava selektivnu revokaciju, takvu kao što bi bilo za vraćanje prava pristupa samo Jonu i nikom više. Ovo je uočeno i predstavlja problem za sve sisteme koji koriste mogućnost Tajni kanali (engl. Covert Channels) Čak i sa listom kontrole pristupa i mogućnostima, može se desiti da sigurnost nije dobra. U ovom dijelu pozabavićemo se sa problemom curenja informacija čak i u slučajevima kada je to curenje informacije tehnički nemoguće, kao što je pokazao Lampson god. kolakoka tepsi inspektor Tajni kanal Slika 197 Tajni kanal Zamislimo da se na zajedničkom računaru izvršavaju programi koji ne vjeruju jedan drugom, npr. poslovni programi firmi Kolakoka i Tepsi. Neka je finansijski inspektor tražio instalaciju programa koji ima uvid u neke poslovne podatke firme Kolakoka. Administrator sistema ne želi da ovaj program zapravo pošalje poslovne tajne procesu firme Tepsi. U tu svrhu je, pomoću listi pristupa, spriječeno da programi inspektora i Tepsi pristupaju istim datotekama, zabranio im pristup računarskim mrežama i isključio svu interprocesnu komunikaciju između njih. Nažalost, suptilniji komunikacioni kanali mogu biti na raspolaganju. Na primjer, inspektorov program može da komunicira na sljedeći način: Da bi poslao 1 bit, on izvršava intenzivna izračunavanja fiksan period vremena ili proizvodi mnogo grešaka stranica. Da bi poslao 0, on se blokira isti vremenski period. Program firme Tepsi tada može nešto zaključiti mjeiti brzinu vlastitog rada. U ovom slučaju, sistem bi imao brži odgovor kada inspektorov program šalje 0 nego kada šalje 1. Ovaj komunikacioni kanal je poznat kao tajni kanal (Slika 197). Mogućnosti za tajne kanale su razne. Jedan način je da se rezerviše neki nedjeljivi resurs koji je potreban svim procesima, na primjer RS232 port terminala u određenim trenucima. Kada

325 12.22.Sigurnost u Unix sistemima 325 inspektorov program želi da pošalje logičko 1, on zauzima RS232 tokom prvih 10 milisekundi svake cijele sekunde, a za logičku nulu zauzima ga tokom zadnjih 10 milisekundi cijele sekunde. Program firme Tepsi pokušava da pristupa RS232 u istim vremenskim trenucima i zavisno od trenutka kada nije uspio zaključuje šta mu inspektorov program šalje. Ovaj model nije vezan samo za procese. Neka sada Kolakoka, inspektor i Tepsi komuniciraju elektronskom poštom, a cenzor u formi programa ili čovjeka kontroliše svu komunikaciju između njih. U ovom slučaju najpoznatiji tajni kanal se zove steganografija. Neka inspektor pošalje firmi Tepsi datoteku slike koja na prvi pogled nema nikakve veze s poslovnom tajnom, na primjer poreski formular u BMP formatu. Svaki piksel ovog formulara zauzima tri bajta, po jedan za crvenu, zelenu i plavu komponentu. Ljudsko oko ne primjećuje male promjene vrijednosti ovih bajtova, na primjer njihovog najmanje značajnog bita. Ali u te bite se mogu upisati tajne informacije bilo kog tipa i posebnim programom rekonstruisati Sigurnost u Unix sistemima Sigurnosni model u Unix sistemima je usko vezan s pravilom da su gotovo svi objekti datoteke u jednom virtualnom korijenskom direktoriju. Stoga se pravila koja se odnose na datoteke mogu primijeniti i na direktorije, mrežne sokete, znakovne uređaje, blok uređaje, cijevi, a u nekim sistemima i na procese i parametre jezgra. Svi ovi objekti se identifikuju imenom koje može imati stazu sa poddirektorijima, npr /usr/bin/wget ili /dev/lp0. Dok jedno ime predstavlja samo jedan objekt, obrnuto ne važi. Objekt može imati istovremeno više imena, što je postignuto linkovima u datotečnom sistemu kroz ln komandu. Za razliku od obavezne kontrole pristupa (MAC) kod koje prava nad objektima određuje isključivo sistemski administrator, Unix koristi diskrecijsku kontrolu pristupa (DAC). Kod ove kontrole pristupa svaki objekat (npr. datoteka) ima vlasnika koji odlučuje kakva prava nad objektom mogu da imaju korisnici. Vlasnik je također jedan od korisnika. Pri pokretanju procesa, procesi pripadaju onom korisniku koji ga je pokrenuo. Stoga, kada proces pristupi nekom objektu, proces ima iste privilegije nad tim objektom kao njegov kreator. Korisnici su definisani numeričkim korisničkim identifikatorom (UID). Taj identifikator je obično šesnaestbitni ili tridesetdvobitni broj. Posebni korisnik se zove root. Njegov UID je 0 i kada on pokreće procese, kontrola pristupa se zaobilazi. Ovaj korisnik ima posebna prava u cijelom sistemu. On može promijeniti vlasništvo nad datotekama, konfigurisati uređaje, dijelove mreže, instalirati i mijenjati softver, pristupati svim datotekama. Može kreirati i brisati sve datoteke, korisnike i grupe korisnika, pa i mijenjati vlasništvo procesa koji se trenutno izvršava. Unix je odavno zamišljen kao višekorisnički sistem, i upotrebu root korisnika treba svesti na najmanju moguću mjeru. Ovaj korisnik je česta meta napadača sistema. Napadači traže način kako obični korisnici mogu da dobiju privilegije koji ima root, kroz sigurnosne rupe. Problem je što običnim korisnicima ponekad zatreba root pravo. Na primjer, na Unix sistemima sadržaj diskete treba montirati u datotečni sistem, a to je isključivo administratorsko pravo. Ili korisnik želi da promijeni vlastitu lozinku za prijavu na sistem, što također nije moguće jer prava čitanja i pisanja datoteka lozinki ima samo root. Stoga postoji nekoliko sistemskih alata da korisnik privremeno promijeni svoja prava. Oni se moraju koristiti s velikom pažnjom. Jedan takav alat su setuid i setgid programi. Normalno proces nasljeđuje prava i UID korisnika koji ga je pokrenuo, ali uz pomoć setuid programa se

326 Sigurnost u Unix sistemima može navesti da pokretanje datog procesa nasljeđuje prava i UID koji imajuvlasnik datoteke s izvršnim programom procesa. Drugi alat je naredba su. Korištenjem ove naredbe korisnik može da promijeni svoj identitet i UID u drugog korisnika (podrazumijevano root) broj navodeći kao parametar lozinku tog drugog korisnika. Da bi se izbjeglo širenje administratorske lozinke, postoji i treći alat sudo. Za pristup administratorskim pravima korisnik navodi kroz ovaj alat svoju lozinku, ali postoji datoteka koja dalje govori koji korisnici mogu dobiti administratorska prava i za izvršenje kojih naredbi. Unix bazirani sistemi poznaju tri vrste prava i tri vrste korisnika. Stoga se prava pristupa definišu sa devet bita ili 12 bita. Da se za svaku datoteku ne bi evidentirala prava pristupa za svakog korisnika pojedinačno, korisno je sve korisnike razvrstati u klase i za svaku od njih vezati pomenuta prava pristupa. Unix sistemi poznaje tri klase korisnika. Jednoj pripada vlasnik datoteke, drugoj članovi grupe korisnika vezanih uz datoteku, a trećoj ostali korisnici. Za svaku vrstu korisnika se navode pravo čitanja, pravo pisanja i pravo izvršavanja. Primjer nekih kombinacija prava dat je na slici Slika 198. Binarno Oktalno Simbolički Prava s pristupom datoteka rwx Samo vlasnik može čitati pisati i izvršavati rw-rw-rw- Svi mogu čitati i pisati Niko nema pristupa rw-r--r-- Vlasnik može čitati i pisati, ostali samo čitati r--r----- Vlasnik i grupa imaju pravo čitanja r-sr-xr-x Svi imaju pravo čitanja i izvršenja, pri izvršenju privremeno postaju vlasnici (setuid) Slika 198 Neka prava nad Unix datotekama U zadnjem redu se vidi element liste prava pristupa u verziji s 12 bita. Tri dodatna bita su s lijeva na desno setuid, setgid i sticky bit. Setuid i setgid omogućavaju da objekat kome je pridružen element liste prava pristupa bude pokrenut s pravima vlasnika odnosno pripadne grupe, a ne pokretača programa. Stoga proces ima dva UID-a i dva GID-a. Stvarni UID (GID) je onaj identifikator korisnika (grupe) koji je dodijeljen programu. Efektivni UID (GID) je u većini slučaja jednak stvarnom, osim ako je setuid (setgid) bit postavljen, kada efektivnu UID (GID) dobija identifikator vlasnika datoteke (njegove grupe). Sticky bit nad datotekom forsira njeno držanje u RAM-u, a nad direktorijem zaključava datoteke u njemu da samo njen vlasnik može da je mijenja. Nedostatak Unix mehanizma pristupa je u nemogućnosti definisanja složenijih pravila. Recimo da nekoj datoteci koja je rezultat kompajliranja programa treba dodijeliti ACL element tako da članovi grupe programeri mogu da je mijenjaju, članovi grupe bekap operatora da je čitaju ali ne mijenjaju, a testeri da je izvršavaju. Osnovni mehanizam autentifikacije poznaje samo jednu grupu pridruženu datoteci, pa ovo nije moguće. Da se ovaj nedostatak prevaziđe, neki Unix sistemi imaju setfacl komandu kojom se mogu praviti fleksibilnije liste kontrole pristupa, navodeći pojedina prava nad datotekom za različite grupe ili korisnike. Da bi se pročitala ili postavila prava nad datotekama i srodnim objektima, postoje određene funkcije za očitavanje i postavljanje prava. Parametri ovih funkcija su specijalni brojevi UID koji je identifikator korisnika i GID, identifikator grupe. chmod(path,mode) promjena režima datoteke access(path,mode) Provjera pristupa koristeći UID i GID getuid() vraća stvarni UID

327 12.23.Sigurnost u Windows sistemima 327 geteuid() vraća efektivni UID getgid() vraća stvarni GID getegid() vraća efektivni GID chown(path,owner,group) mijenja vlasnika i grupu setuid(uid) postavlja UID setgid(gid) postavlja GID Sigurnost u Windows sistemima Malo koji podsistem Windows-a kroz njegove razvojne generacije se toliko promijenio kao sigurnosni podsistem. Generacije Windows 1-3 i Windows 9x su kao podlogu koristile MS DOS, operativni sistem dizajniran za samo jednog korisnika, tako da nije bilo nikakve kontrole pristupa datotekama, izuzev kada se koriste lokalne mreže. S druge strane, serija Windows NT je uvela izuzetno sofisticiran sistem listi pristupa, tokena, domena korisnika i aktivnog direktorija (od Windows 2000), koji pruža puno veće mogućnosti u odnosu na Unix sistem. Nažalost, u međuvremenu su nastale aplikacije za starije verzije Windows-a koje su zahtijevale često instaliranje i međuzavisnost komponenti, pa su na Windows XP korisnici imali administratorska prava, što je bila prilična rupa za pojavu virusa. Od Windows Vista korisnicima su prava smanjena i prije pokretanja aplikacije koja zahtijeva veća prava, korisnik je upozoravan na to. Same aplikacije su instalirane u stvarne direktorije, dok su naknadna upisivanja u njihove direktorije koje bi aplikacije obavile u toku rada obavljana u korisničke direktorije vezane simboličkom vezom s aplikacijom. Taj pristup je ostao i u kasnijim verzijama Windows-a uz nešto rjeđe upozoravanje korisnika. Svaki subjekt u sistemu, a to su korisnici, grupe i kompjuteri u mreži imaju sigurnosne identifikatore (SID). Windows NT i kasniji poznaje dvije vrste grupa, lokalne (koje predstavljaju više korisnika na jednom računaru) i globalne (svi korisnici u računarskoj mreži koji se mogu prijaviti na računare koji pripadaju toj mreži). SID je broj koji ima 128 bita i predstavlja se odvojenim grupama, tako neki od subjekata može imati oznaku S Podsistem Security Account Manager, čuva listu svih korisnika i obavi prijavu. Kada se korisnik prijavi, pokupe se SID-ovi korisnika i svih grupa kojima on pripada i sastavi lista koja se pridruži procesu. Ta lista zajedno s još nekim podacima prikazanim na slici Slika 199 se upakuje u pristupni token procesa. Ako proces kreira nove procese, njegovi sigurnosni tokeni se inicijalno nasljeđuju. No, niti koje kreira proces mogu imati i sasvim druge sigurnosne tokene, ukoliko je potrebno da se izvršavaju pod pravima udaljenih korisnika za lokalne servise.

328 Sigurnost u Windows sistemima Polje Značenje User SID korisnika uzet iz lokalne baze ili aktivnog direktorija. Groups Lista SID-ova grupa koje uključuju tog korisnika Privileges Lista privilegija na lokalnom kompjuteru za korisnika i njegove sigurnosne grupe Default Owner SID korisnika ili sigurnosne grupe koji podrazumijevano postaje vlasnik objekta kreiranog od strane korisnika pridruženog ovom Primary Group SID korisnikove primarne grupe, korišteno samo u POSIX podsistemu Default DACL Ugrađeni skup dopuštenja koja će biti nad objektima kreiranim od strane ovog korisnika ako nema nikakvih drugih informacija o kontroli pristupa Source Proces koji je kreirao pristupni token Type Da li je token primarni ili personizirajuči Impersonation Level Do kojeg nivoa se može primiti sigurnosni kontekst klijenta predstavljenog ovim pristupnim tokenom. Statistics Informacija o samom pristupnom tokenu Restricting SIDs Opciona lista SID koji se dodaju pristupnom tokenu da kreirane niti imaju manja prava nego što je korisnik dopustio. TS Session ID Da li je token pridružen Terminal Services klijentskoj sesiji. Session Reference Za internu upotrebu. SandBox Inert Token uključuje SANDBOX_INERT flag. Audit Policy Od Windows Server 2003, za praćenje po korisniku. Origin Od Windows Server 2003, sadrži oznaku sesije prijave na lokalnoj mašini ili 0 ako je prijavljen preko mreže. Slika 199 Struktura pristupnog tokena S druge strane, svaki imenovani objekat (datoteka, direktorij, proces, semafor, imenovana cijev...) ima drugu strukturu njemu pridruženu, koja se zove sigurnosni deskriptor. Sigurnosni deskriptor opisuje sigurnosne atribute svakog objekta. Informacija u sigurnosnom deskriptoru uključuje vlasnika objekta i DACL, diskrecionu listu kontrole pristupa. Svaki element ove liste (ACE) definiše prava pristupa za pojedinog korisnika ili grupu korisnika. Vlasnik objekta kontroliše DACL i koristi je da odredi ko treba, a ko ne treba da pristupi objektu i s kojim pravima. Unutar sigurnosnog deskriptora je i kontrolna lista sistemskog pristupa (SACL) koju kontrolišu administratori sistema. Administratori koriste SACL da navedu zahtjeve praćenja za pristup objektu. Na primjer, administrator može postaviti SACL koji će generisati događaj u zabilješkama svaki put kada se pokuša obrisati datoteka. Ako liste kontrole pristupa nema, smatra se da svi korisnici imaju puna prava nad objektom. Ako je ima, ali je prazna, to znači da niko nema prava pristupa. U listu se stavlja spisak korisnika i prava nad objektom. Pošto korisnik može da pripada u više grupa, prava korisnika se sabiraju. Na primjer, ako članovi grupe Inspektori imaju pravo čitanja datoteke, a članovi grupe Cistaci imaju pravo brisanja, korisnik koji je uključen u obije grupe moći će tu datoteku i da čita i da briše. Korisnik koji po bilo kom osnovu nad objektom ima negativno pravo No access neće moći pristupiti datoteci čak i ako po svim ostalim pravima može. Da bi se izbjeglo pravljenje liste pristupa za svaki objekt, uveden je fleg nasljeđivanja. Tako datoteke u direktoriju imaju podrazumijevano liste pristupa koje su date za cijeli direktorij. Kada se korisnik prijavi, unese korisničko ime i mjesto gdje će se obaviti provjera (lokalna mašina, kontroler domene ili aktivnog direktorija). Korisnik se može prijaviti lozinkom ali se mogu tražiti i opcioni akreditivi, poput certifikata i pametnih kartica. Windows korisnik može biti lokalni na računaru, poznat na NT domeni ili Aktivnom direktoriju. Na NT domeni evidentiraju se korisničko ime, lozinka i grupe kojima pripada, dok Aktivni direktorij sadrži i kontaktne informacije, organizacione podatke i certifikate. Ako se korisnik uspješno prijavio, sistem kreira sesiju prijave koja predstavlja sigurnosni kontekst korisnika. Svaki novi proces, počevši od školjke Explorer, sadrži pristupni token i novokreiranim procesima prosljeđuje njegovu kopiju. No, nekad je potrebno kreirati niti pod drugim korisničkim pravima. Na

329 12.23.Sigurnost u Windows sistemima 329 primjer, server za bazu podataka treba da obradi korisničke zahtjeve izvršajući nit sa pravima tog korisnika, a ne pravima administratora servera koji je pokrenuo serversku aplikaciju. Ta aktivnost se zove impersonizacija. Za vrijeme njenog trajanja, nit dobija privremeni pristupni token s pravima drugog korisnika, i po završetku niti, prava se vraćaju na podrazumijevana prava procesa. Kada proces pokuša otvoriti osigurani objekt, na primjer, prilikom poziva CreateFile funkcije, proces navodi skup prava pristupa potrebnih da se pozove CreateFile. Sigurnosni sistem tada pogleda sigurnosni deskriptor sistema i provjeri elemente u listi pristupa da nađe onaj SID koji odgovara grupi ili korisniku tako da on odgovara pristupnom tokenu procesa. Kada je zadatak završen, korisniku se zabranjuje pristup objektu (ako je nađen element DACL liste koji to zabranjuje) ili se korisniku dodijeli odgovarajući skup prava pristupa. On može biti traženi ili njegov podskup. Na primjer, korisnik je pozvao CreateFile s zahtjevom za čitanje i pisanje, ali mu je nakon uvida u liste pristupa bilo moguće dodijeliti samo pravo čitanja. Prema načinu provjere prijave, računarske mreže se organizuju u tri oblika. Prvi su radne grupe. Kod radne grupe, svi računari u mreži su ravnopravni i na svakom od njih se nalazi spisak korisnika i lokalnih grupa koje se mogu na njega prijaviti. Korisnici mogu dijeliti diskove, ali je broj korisnika koji mogu istovremeno pristupiti ograničen. Postavljanje radne grupe je jednostavno, ali je održavanje otežano, jer korisnik mora imati svoja imena na svim računarima na kojim namjerava raditi. U slučaju promjene lozinke, ona se mora obaviti na svim računarima. U drugom obliku, NT domena, u lokalnoj mreži postoji jedan računar koji obavlja poslove prijave i on se zove kontroler domene. Domenu predstavljajuju svi računari čiji se korisnici prijavljuju preko istog kontrolera. Nakon što se korisnik prijavi sa radne stanice, kontroler domene provjeri kojoj grupi on pripada i vrati odgovarajuće liste pristupa. Ovdje se korisnička imena i lozinke čuvaju centralizovano, pa se promjena lozinki i dodavanje novih korisnika rade na samo jednom mjestu. Kod većih mreža domenski kontroler postaje usko grlo, jer se svi korisnici prijavljuju preko njega. Često i organizaciona šema firmi ima hijerarhiju koja se ne može uklopiti u linearnu šemu jednog domen kontrolera i mnogo računara povezanog na njega. Stoga je od Windows 2000 uveden aktivni direktorij, imentski servis koji čuva informacije o objektima. Ti objekti su korisnici, računari, printeri i domene. Podaci u njima se čuvaju kroz hijerarhijski prostor imena, u odvojenim serverima za pojedine dijelove mreže, ali koji i dalje mogu da sarađuju po potrebi. Od ove verzije Windows unaprijeđeni su i kriptografski protokoli prijave, Kerberos i TSL (Transport Layer Security). Zbog opasnosti koje prijete s Interneta, sigurnosni sistem u Windows je dalje proširen od verzije Vista uvođenjem nivoa integriteta. Ovo je djelomično uvođenje MACL, obavezne kontrole pristupa. Kako korisnik može da pokrene više procesa, različitog nivoa opasnosti (neki od njih su i virusi, za koje korisnik ne zna, ali se pokreću pod njegovim imenom) treba spriječiti interakciju između nekih njegovih procesa. Procesima se dodjeljuju nivoi povjerenja, redom od najmanjeg ka najvišem: nepovjerljiv, nizak, srednji, visok, sistemski i instalator. Objekti (datoteke, ključevi registry, prozori) imaju nivoe integriteta koji predstavljaju najniži nivo povjerenja procesa. Ako proces nižeg nivoa povjerenja od datog nivoa integriteta pokuša da pristupi navedenom objektu, čak i ako njegov vlasnik ima puna prava nad njim, neće mu biti dopušteno. Tako se može spriječiti da na primjer Internet Explorer pristupa lokalnoj bazi u MS Access-u. Neke API funkcije vezane za sigurnost i prijavu su LogonUser( lpszusername, lpszdomain, lpszpassword, dwlogontype, dwlogonprovider, phtoken); Prijavljuje korisnika i dodjeljuje mu pristupni token

330 Zadaci DeleteAce(pAcl, dwaceindex); Briše element liste pristupa AddAccessAllowedAce(pAcl, dwacerevision, AccessMask, psid); Dodaje pravo pristupa u listi pristupa AddAccessDeniedAce(pAcl, dwacerevision, AccessMask, psid); Dodaje zabranu u listu pristupa InitializeAcl(pAcl, nacllength, dwaclrevision); Kreira novu listu pristupa Zadaci Zadatak 1. U Unix sistemu, rezultat ls -l komande je sljedeći. -rwxr-xr-x 1 kemo uprava 4096 Nov sample.txt Ako je sejo član grupe uprava, koja će on imati prava nad ovom datotekom? Odgovor: Ako podijelimo -rwxr-xr-x na sljedećih 10 simbola, smatrajući da crtica znači da to pravo nije doijeljeno: Obična Da da da da ne da da ne da Vrsta Vlasnik Vlasnik Vlasnik Grupa Grupa Grupa Ostali Ostali Ostali Datoteke Čitanje pisanje izvršenje čitanje pisanje izvršenje čitanje pisanje izvršenje Vlasnik je kemo, a grupa pridružena uz ovu datoteku je uprava. Stoga, sejo ima čitanje i izvršavanje.

331 13.1.Osmobitni operativni sistemi Arhitektura Microsoft-ovih operativnih sistema Ogromnu većinu personalnih računara i laptopa, kao i dobar dio serverskih računara pogoni neka od verzija Windows operativnog sistema. U ovom poglavlju daće se osvrt na istorijat i arhitekturu Microsoft-ovih operativnih sistema Osmobitni operativni sistemi U januaru firma MITS objavila projekt prvog kućnog računara, koji je postigao značajniji uspjeh, Altair Programirao se na ekstremno težak način: prekidačima u mašinskom jeziku, u binarnom sistemu. Prva verzija ovog računara je mogla samo da prikazuje izlaz na lampicama, ali su se zatim pojavili priključci za jedinicu papirne trake, RS232 veza na teleprinter, dodatni RAM, osmoinčni flopi itd. Za samo mjesec dana od pojave tog računara, Bill Gates i Paul Alen realizuju interpreter za BASIC prvo na papirnoj traci, kasnije u ROMu, te osnivaju firmu Microsoft. Microsoft BASIC interpreter uspješno radi kao neka vrsta jednoprocesnog operativnog sistema. Realizovane su verzije za različite procesore: Intel8080, Zilog Z80, Motorola 6800, Motorola 6809, MOS 6502, Intel Mnogi računari iz ovog doba nisu morali koristiti diskove kao jedinice spoljnje memorije, nego jeftinije, ali i znatno sporije, kasetofone. U isto vrijeme Garry Kendall razvija CP/M, za Intel 8080, mali disk bazirani operativni sistem, ali nevezan za programski jezik. Ideje od ovog operativnog sistema će uticati i na nastanak MS DOS za 16 bitne računare. Microsoft je napravio i dva osmobitna disk operativna sistema: MIDAS za 8080 i MSX-DOS korišten na japanskim računarima sa Z80 procesorom MS DOS MS DOS osnovni interfejs DOS Shell Slika 200 MS DOS, osnovni interfejs i DOS Shell (MS DOS 5.0) Nakon uspjeha tada manjih kompanija Apple, Microsoft, Commodore, Tandy i Atari, i IBM je odlučio da napravi svoj prvi personalni računar, IBM PC 5150, koristeći Intel 8088 procesor. Nakon neuspjelog dogovora sa Digital Research (vlasnicima CP/M) za razvoj operativnog sistema, Microsoft preuzima razvoj operativnog sistema. Tim Paterson iz firme Seatle Computers prelazi u Microsoft i dovršava svoj raniji operativni sistem QDOS u MSDOS, odnosno u IBM verziji PC DOS. MSDOS je jedan od najjednostavnijih operativnih sistema koji se i danas ponegdje koristi. Prva verzija MS DOSa je bila veoma primitivna, ali nakon nekoliko promjena omogućila je sve neophodne funkcije koje pruža operativni sistem. MS DOS je prošao kroz više promjena tokom godina da bi omogućio bolju funkcionalnost. MS-DOS je jednozadaćni operativni sistem, što znači da može da izvršava samo jedan program u isto vrijeme, što znači da korisnik mora kucati tekstualne komande i odgovore kada komunicira sa

332 MS DOS operatvinim sistemom (Slika 200, lijevo). Kasniije verzije uključuju dodatni program DOSSHELL koji omogućava pokretanje programaiz menija (Slika 200, desno). MS DOS smatra svaki odvojeni program i podatke individualnom datotekom. Svaka datoteka ima ime, koje je podijeljeno u dva dijela, ime datoteke i ekstenziju. Ime datoteke može biti do osam karaktera dugačko, a ekstenzija može biti do tri karaktera. DOS je između 1980 i prošao kroz 17 verzija navedenih u tabeli na slici Slika 201. Verzija Osobine 1.0 Prva verzija, nema poddirektorije, diskete od 180 K 1.1 Podrška za diskete od 320 K 2.0 Poddirektoriji, podrška za hard disk 2.11 Podrška za neke međunarodne znakove na ekranu 3.0 Podrška za 1.2 M diskete 3.2 Podrška za 3.5 inčne diskete 3.3 Kodne stranice za međunarodnu podršku 4.0 Particije za 504 megabajta 4.01 Ispravka bagova za 4.01, tekstualni DOS SHELL 5.0 Podrška za visoku memoriju, grafički DOSSHELL, novi QBASIC, tekst editor 6.0 Kompresor diska DBLSPACE, MOVE, memmaker i antivirus 6.2 Scandisk za provjeru diskova, popravka grešaka 6.21 Uklonjen DBLSPACE za kompresiju 6.22 Uveden DRVSPACE za kompresiju. Posljednji samostalni MS DOS 7.0 Dio Windows 95, podrška za duga imena datoteka, svo jezgro u IO.SYS 7.1 Dio Windows 95B i Windows 98, podrška za FAT Boot disketa kreirana u Windows ME i XP, integrisani drajveri, limitiran Slika 201 Verzije MS DOS-a Još narednih sedam godina bio je dio arhitekture Windows sistema, sve do Windows ME. Za MS DOS je napisan ogroman broj programa, pa i nakon što je Microsoft prestao s podrškom za ovaj operativni sistem, njegovi kasniji sistemi su čuvali kompatibilnost s MS DOS sistemom. DOS cijeli memorijski prostor vidi kao područje od jednog megabajta memorije (Slika 202), pri čemu se na nižim adresama od adrese 0 nalaze interapt vektori, zatim određeni prostor zauzima jezgro sistema, nakon koga slijedi prostor za korisnički program. Od 640-g kilobajta smješteni su video memorija, nakon nje ROM video kartice, mali prostor za proširenje RAM-a i na vrhu memorije ROM BIOS. Memorijskim lokacijama se ne pristupa linearno, nego koristeći segmentni i ofsetni dio adrese, ali su u ovoj tabeli date apsolutne adrese. No, kako ovaj operativni sistem većinu vremena provodi u realnom režimu rada, apsolutna adresa se dobija zbirom ofsetnog dijela adrese i segmentnog dijela pomnoženog s 16.

333 13.2.MS DOS 333 Adresa heks Područje Interapt vektori ROM BIOS područje DOS parametarsko područje IO.SYS (u PC DOS IBMBIO.COM) Promjenjivo MSDOS.SYS (u PC DOS IBMDOS.COM ) Promjenjivo Prostor koji je rezervisao CONFIG.SYS za drajvere i bafere Promjenjivo Rezidentni dio COMMAND.COM Promjenjivo Pokazivač na varijable okruženja Promjenjivo Blok varijabli okruženja rezidentnog programa Promjenjivo Rezidentni program Promjenjivo Blok varijabli okruženja trenutnog programa Promjenjivo Trenutni program Promjenjivo Tranzijentni dio COMMAND.COM 8FFFF Kraj konvencionalnog memorijskog područja (640 K) A0000 Video memorija C0000 ROM video kartica E0000 Memorijska proširenja EMS (proširena memorija) F0000 ROM BIOS Visoka memorija od DOS 5.0 tu se prebaci MSDOS.SYS Produžena memorija preko ekstendera VCPI ili DPMI FFFFFF Krajnja adresa dostupna preko ekstendera (32 M) Slika 202 MS DOS, memorijska mapa Neophodni dio MS DOS, koji se stalno nalazi u memoriji, se sastoji od tri datoteke. IO.SYS, koji sadrži osnovne drajvere periferijskih uređaja i učitava u memoriju glavni dio DOS-a MSDOS.SYS. U PC DOS on se zove IBMBIO.COM MSDOS.SYS, je jezgro operativnog sistema i sadrži implementaciju sistemskih poziva MSDOS-a, kroz softverske trap-ove između INT 20h i INT 2Fh, od kojih je posebno značajan INT 21h. U PC DOS on se zove IBMDOS.COM COMMAND.COM je interpreter komandne linije, koji od korisnika očekuje unos komande s parametrima i izvršava komandu ugrađenu u njega ili eksterni program. Ova datoteka se ne čuva cijelo vrijeme u RAMu u potpunosti, ali je jedan njen dio uvijek prisutan. On ima mali skriptni jezik koji omogućava pokretanje programa s ekstenzijom.bat. Jedan od njih AUTOEXEC.BAT se pokreće pri svakom podizanju MSDOS. Ostatak MSDOSa se tipično čuva na disketu ili fiksnom disku, u direktoriju sa imenom C:\DOS. Datoteke smještene u tom direktoriju obavljaju rutine operativnog sistema kao što je program za formatiranje disketa i hard diskova, ali nisu neophodne za normalni rad operativnog sistema. Ograničenja DOS-a na jedan program u jednom trenutku i limit na 640 K memorije, dovelo je do nekoliko načina za njihovo ublažavanje. Uvođenje sistemskog poziva INT 27h (Terminate and Stay Resident, TSR) je omogućilo da program ostane u memoriji i nakon njegovog završetka, a za nove aplikativne programe ostaje prostor iza posljednjeg bajta koji je zaustavljeni program iskoristio. Ta se osobina koristila uglavnom za drajvere, a zaustavljenom programu se onda pristupa preusmjeravajući interapte. Nedovoljan memorijski prostor od 640 K tzv. konvencionalne memorije se prevazilazio jednom od sljedećih tehnika:

334 Xenix i OS 2 Overlay: Dijelovi programa se nalaze u eksternoj datoteci na disku, slično mehanizmu swapping, ali bez spašavanja trenutnog stanja. Svaki mogući podprogram se prevede kao kratka rutina od nekoliko bajtova koja preusmjeri poziv podprograma na prebacivanje podprograma iz datoteke u memoriju ili na njegov stvarni programski kod. Expanded memorija: Neiskorišteni memorijski prostor između apsolutnih adresa E0000 i F0000 se popunjavao RAM memorijom podijeljenom u stranice po 16 K. U jednom trenutku u memoriji mogu biti četiri takve stranice, ali ukupni broj raspoloživih stranica iz kojih se te stranice biraju nije ograničen. Extended memorija: Dodatnim programima se procesor prebacuje u zaštićeni režim rada, čime mu postaje dostupna memorija i iznad 1M, prebaci dijelove memorije aplikativnom programu koji se nalazi u dijelu memorije dostupnom pod MS DOS i vraća u realni režim rada Xenix i OS 2 Bilo je jasno da sa pojavom moćnijih procesora, kao što su i 80386, jedan jednokorisnički operativni sistem kao što je MS DOS ograničen u području memorije na 1M nije adekvatan. Zato su u Microsoftu krenuli u više projekata moćnijih operativnih sistema, ali nakon uspjeha Windows, napušteni su. Xenix: Microsoft je uzeo 1979 licencu od AT&T da napravi UNIX kompatibilan operativni sistem, i angažujući druge kompanije Altos, Tandy i SCO napravljene su verzije za PDP-11, Zilog Z8001, i Intel , prava potpuno predana firmi SCO. OS /2: Zamišljen kao multitasking i grafički nasljednik DOSa, pojavio se u doba kada mašine nisu bile dovoljno jeftine. Razvijan zajedno s firmom IBM. Nakon razlaza 1990, nastavljen je razvoj od strane IBM-a, do 2005, kada i ova firma prestaje s razvojem OS/2. Arhitektura je dijelom iskorištena za arhitekturu Windows NT. Dizajner: Michael S. Kogan 13.4.Šesnaestbitne verzije Windows Nakon uspjeha Apple Macintosh, Microsoft-ov odgovor je bio u okruženju Windows. Prve verzije Microsoft Windows su zapravo samo dodatak grafičkog okruženja u MS DOS. U ranim verzijama, Windows 1.0 i 2.0 bio je moguć samo rad u realnom režimu na 8086 procesoru, ali sa mogućnošću prebacivanja između procesa. To je značilo i dalje ograničenje adresnog prostora na 1M i nikakva zaštita između aplikacija. Ni raspoređivanje nije bilo preemptivno, nego se zasnivalo na uredno pisanim petljama poruka, opisano u poglavlju o Windows GUI. Windows 1.0 nije imao preklapanje prozora a Windows 2.0 jeste. Ove verzije Windowsa su sličnije DOSShellu nego Windowsu 3.1. Budućnost je još uvijek gledana u OS/2. Razvojem ovih verzija rukovodili su Russ Werner, Steve Balmer i Tandy Trower. Prve dvije verzije Windows-a su uglavnom ignorisane, jer je malo aplikacija pisano za njih. Međutim, verzije Windows 3.0, 3.1 i 3.11 for workgroups su preokrenule sofverski svijet mikroračunara. Iako se za 3.x seriju još uvijek može reći da nisu operativni sistem nego samo grafički korisnički interfejs koji ne radi ništa drugo nego translaciju manipulacija ikonama u komande koje može da razumije operativni sistem. Dakle, MS-DOS je primarni operativni sistem, a Windows 3.x omogućava GUI. Kada se podiže kompjuter, MSDOS se mora prvi učitati, a Windows se pokreće komandom WIN. Nakon što je GUI pokrenut, vidi se školjka Windowsa 3.x, Program Manager, umjesto prethodne Executive (Slika 203 ).

335 13.4.Šesnaestbitne verzije Windows 335 Windows 1.0 Windows 2.0 Windows 2.1 Windows 3.0 Windows 3.1 Windows 3.11 for workgroups Slika bitni Windows, MS DOS bazirani Šesnaestbitni Windows rade u tri režima rada, ali ne podržavaju sve verzije svaki od ovih režima, u tabeli na slici Slika 204 je navedeno koji režim postoji u kojem Windows-u.

336 Šesnaestbitne verzije Windows FWG Realni Standardni Prošireni Posebna verzija Slika 204 Režimi rada 16 bitnih windows-a Realni režim: Windows 3.x startovan kao obični GUI za MS-DOS. Ova verzija Windowsa nije imala nikakvo upravljanje memorijom, niti je bila sposobna za multitasking. Samo je jedva sposobna za startanje aplikacija i upravljanje fajlovima. Ova verzija je radila u limitu MS- DOSa od 1 MB. Standardni režim, radi u 286 zaštićenom modu, dala je Windowsu mogućnost adresiranja do 16 M RAMa. Ta mogućnost je pravila probleme sa programima koji rade u MSDOS realnom režimu. Windows je omogućio standardizovanu grafiku, fontove, I/O uređaje i memoriju. Programi se dijele na segmente različite veličine. 386 prošireni režim, Windows u 386 proširenom - zaštićenom modu adresira do 4 GB memorije, podržava virtualnu memoriju i pušta više MS DOS programa da se istovremeno izvršavaju. Kako pokazuje Slika 205, arhitektura Windows 3.x je relativno jednostavna. Pored 3 datoteke potrebne za pokretanje MS-DOS, za pokretanje Windows u 16 bitnom režimu potrebne su datoteke koje sadrže sistemske pozive. Za razliku od MSDOS, sistemski pozivi se ne pozivaju interaptima nego kao obični podprogrami, ali smješteni u dijeljene datoteke. KERNEL.EXE ili KRNL386.EXE: Alocira i prati sistemske resurse, koordinira U/I zahtjeve prema hardveru, odgovoran za upravljanje memorijom i pokretanje programa. Windows aplikacija Program manager MS DOS aplikacija MMSYSTEM COMDLG COMDLG OLE KERNEL USER GDI SHELLEM87 Drajveri MSDOS.SYS IO.SYS Slika 205 Arhitektura DOS+Windows 3 DOS komandni interpreter USER.EXE obrađuje U/I zahtjeve, odgovoran za tastaturu, miša, zvuk, komunikacijski hardver i tajmer. GDI.EXE Graphic Driver Interface, sarađuje s USER. EXE i KERNEL.EXE, odgovoran za grafičko iscrtavanje i štampanje SHELL.DLL API za pristup korisničkoj školjci (od 3.0) MMSYSTEM.DLL Funkcije za multimediju (od 3.1) COMMDLG.DLL Standardni dijaloški prozori (od verzije 3.1) COMMCTRL.DLL Napredniji elementi korisničkog interfejsa: kartice, potenciometri, indikatori napretka.. (od 3.11) PROGMAN.EXE, WINFILE.EXE, MSDOS.EXE Korisničke školjke program manager (od 3.0), file manager (od 3.0) i MSDOS executive (od 2.0) Pored njih bitne su *.DRV datoteke sa drajverima za periferijske uređaje 386spart.par Datoteka za izmjenjivanje (swap file) je virtualna memorija, što je napredna funkcija 386 zaštićenog režima koja omogućava da na procesoru dio hard diska radi kao RAM. Mnogo je sporija od RAMa ali dopušta sistemima sa ograničenim RAMom da izvršavaju više aplikacija. Virtualna memorija se upravlja iz specijalne skrivene datoteke.

337 13.5.Windows 95, 98, ME 337 Konfiguracione datoteke Windows 3.x Control.ini postavlja boje, pozadinu, printere i instalabilne drajvere. Mouse.ini kontroliše hardverske postavke miša. Program.ini definiše koje su grupe u Program Manageru i ima puno postavki da se ograniči pristup korisnicima. Sadrži informacije o lokaciji programskih datoteka sa grupama i veličini Protocol.ini definiše komponente u mrežnom okruženju System.ini kontroliše i inicijalizira sve resurse za PC. Kontroliše sistemski hardver i povezane informacije. Prikazuje drajvere za hardver(kao Config.sys za MS-DOS.) Win.ini definiše korisnički specifične postavke za Windows okruženje - screen savere, boje, fontove, pridruživanja i odnos resursa i aplikacija. (kao Autoexec.bat za MS-DOS.) 13.5.Windows 95, 98, ME Windows 95 Windows 98 Windows 98 Second Edition Windows Millenium Edition Slika 206 Serija Windows 9x Veliki broj programa za MS DOS, i Windows 3.1, kao i mali hardverski zahtjevi ovih operativnih sistema, naveli su Microsoft da razvije seriju Windows koja se često naziva 9x i uključuje Windows 95, Windows 98, Windows 98SE i Windows ME. One se odlikuju 32 bitnim grafičkim okruženjem, ali velikom kompatibilnošću s starijim aplikacijama, i manjim hardverskim zahtjevima od NT serije, po cijenu manje sigurnosti i prenosivosti. Jezgro je

338 Windows 95, 98, ME modifikovani MS DOS, ali je u pitanju veliko poboljšanje MSDOSa jer se dobijaju dva proizvoda u jednom. Windows 95 ima MS-DOS interfejs za zaštićeni režim DPMI i GUI u zaštićenom režimu. DPMI režim je unapređena verzija MSDOSa koja podržava upotrebu produžene memorije, ali nema multitasking. Windows 95 prvo starta DPMI, a zatim učita GUI. Ne mora se imati GUI za podizanje Windowsa 95. To je važan koncept jer se mnogo funkcija obavlja u C: promptu. Product manager Windows 95 je Yusuf Mehdi. DPMI zahtijeva iste tri datoteke kao i MS-DOS: Io.sys, Msdos.sys, i Command.com. Ove datoteke su različite u odnosu na istoimene u ranijim verzijama, podržavaju duga imena datoteka, a Msdos.sys je sada tekstualna datoteka koja sadrži konfiguracijske postavke, dok io.sys sadrži pored drajvera uređaja i implementaciju sistemskih poziva. Kada se pokrene GUI on preklapa DPMI i učitava vlastite drajvere za sve, što znači da Config.sys nije potreban za učitavanje device drajvera. Neki drajveri, kao što je MSCDEX za CD i podrška mišu se učitaju u zaštićenom režimu, te ne zauzimaju konvencionalnu memoriju. Windows 95 se pojavio u više izdanja, od početnog na 15 disketa, do posljednjeg OSR 2.5 na CD sa podrškom za USB i FAT 32. DOS program COMMAND Win 32 program DOS drajver Win 16 program 32 bitna školjka Explorer Internet explorer Korisnički režim MS DOS DOS virtualna mašina Kernel User GDI Sistemska virtuelna mašina Registry VMM- menadžer virtualnih mašina IFS- menadžer datotečnih sistema Konfiguracijski menadžer Maper realnog režima Ulazno/izlazni supervizor Port drajver VFAT CDFS Mrežni redirektor SCSI sloj Miniport drajver VXD drajveri NET BIOS NetBEUI TCP/IP IPX Ndis interfejs Drajver mrežnog adaptera Enumerator Arbitar Menadžer WDM drajvera Režim jezgra 95,98 95, 98, ME 98, ME Slika 207 Arhitektura Windows 9x Arhitektura Windows 95 (Slika 207) zbog kompatibilnosti s MS DOS je dosta miješana. Postoje dvije vrste drajvera. Drajveri u realnom režimu se učitavaju iz Config.sys (linije device=sxss) i Autoexec.bat (TSR programi). Drajveri u zaštićenom režimu se učitavaju iz GUI-a, pri čemu oni najčešći su u datoteci VMM386.VXD, ali se mogu zamijeniti drugom datotekom. Upravljač virtualnom memorijom VMM podržava upotrebu memorije na nivou DPMI i GUI.VMM može kreirati virtualne mašine (VM), područja memorije u kojima se

339 13.5.Windows 95, 98, ME 339 aplikacije izvršavaju. Upotreba više virtualnih mašina omogućava MSDOS programima da se izvršavaju u vlastitom memorijskom prostoru, poboljšavajući perfomanse operativnog sistema. Kada se radi u GUI režimu, DOS interapt pozivi (npr INT 21h) se preusmjeravaju na odgovarajuće drajvere unutar VMM. Uz VMM je instalabilni datotečni sistem (IFS) koji pruža podršku za hard diskove, CDROM-ove i mrežne diskove. IFS pruža podršku za duga imena datoteka. IFS podržava i DPMI i GUI režim. U GUI režimu se nalazi srce Windowsa 95: Kernel, GDI i USER. Ove komponente održavaju sve glavne funkcije unutar Windowsa 95. Windows 95 ima preemptivni multitasking (svaki program ima određeno vrijeme procesora) za razliku od Windowsa 3.x koji ima kooperativni multitasking (vrijeme koje program ima bazirano je na načinu kako je aplikacija pisana). Ove tri komponente imaju potpuno istu funkciju kao kod Windows 3.1 kernel32.dll je 32 bitna verzija kernel.exe, gdi32.dll je 32 verzija gdi.exe a user32.dll je 32 bitna verzija user.exe. Na vrhu arhitekture Windowsa 95 je korisnički interfejs sa ikonama, prozorima i alatkama. Kako su INI datoteke postale mnogobrojne, zamijenjene su Registry bazom. To je centralizovana konfiguraciona baza za softverske postavke i hardverske postavke. Svi konfiguracijski parametri su smješteni u datoteke User.dat i System.dat, pri čemu operativni sistem pravi njihove kopije kao User.da0 i System.da0, uz obezbjeđenje editora regedit.exe za ručno mijenjanje sadržaja registry. Datotečna struktura za Windows 95 je veoma unapređena u odnosu na Windows 3.x. Windows 95 podržava duga imena fajlova (LFN) prevazilazeći 8.3 limite. Imena Windows 95 datoteka sadrže do 255 znakova uključujući razmake i tačke. O načinu kako se ona čuvaju u memoriji, pisalo je u poglavlju 0. Svako dugačko ime datoteke ima ekvivalentno kratko ime This is a really really really long file name.txt thisis~1.txt Microsoft Windows 98 je 32 bitni operativni sistem koji uključuje ugrađenu vezu s Internetom, Plug and Play podršku, visoke performance, robustnost i kompatibilnost sa Windowsom 95.Windows 98 uključuje sofisticiranije upravljanje napajanjem, podršku za više monitora i integrisanu podršku za najnoviji hardver. Takođe je uključena podrška za novi Win32 Driver Model (WDM), koji dopušta WDM uređaju da radi i pod Windowsom 98, kao i budućim verzijama Windowsa NT koristeći isti drajver.napravljena i Windows 98 Second edition. Product manager ove verzije je Nicolas Coudière. Arhitektura Windows 98 je očito slična arhitekturu Windows 95, uz novu vrstu drajvera WDM, koja omogućava upotrebu istih drajvera u 9x i NT seriji. Posljednji Windows iz 9x serije je Windows ME, (Millenium Edition) i on je i posljednja inkarnacija MS DOS, iako je ovog puta DOS dobro sakriven. Windows ME je Windows 4.90 iznad MSDOS-a Urađene su sljedeće izmjene. Dodani System Restore, Windows File Protection, Windows Image Acquisition, Automatic Updates. Izbačen command prompt iz startnog menija koji se dobija s F8 i ukinuta Exit to DOS opcija u Windows shutdown. Windows ME sprječava aplikacije koje žele izaći iz Windowsa u DOS. Config.sys se automatski briše da se ne bi učitali DOS drajveri. SYS komanda sprečava SYS bilo čega osim diska C: kada se koristi boot disketa, a izbačena opcija FORMAT /S. Po riječima Microsofta, ovo je urađeno radi povećanja brzine i stabilnosti sistema, no upravo su mogućnost izvršavanja široke baze DOS programa kojima smeta zaštićeni režim rada i manji hardverski zahtjevi bile glavne prednosti Windows 9x serije u odnosu na Windows NT seriju. S druge strane,

340 Windows NT serija zadržavanje DOS jezgra, dizajniranog za jednoprocesni rad nije moglo ukloniti nestabilnost sistema, tako da je ova verzija obrzala tranziciju i kućnih korisnika na NT jezgro Windows NT serija U toku razvoja OS/2 3.0, kao stabilnog, portabilnog, višeprocesnog operativnog sistema angažovan je David Neil Cutler kao prvi glavni projektant (ranije projektovao RSX 11 i VMS). Operativni sistem je dizajniran sa razdvojenim API od jezgra operativnog sistema. Nakon uspjeha Windows 3.0, odlučeno je da se umjesto OS/2 API, primarno razvija 32 bitna verzija Windows API. Tako je 1993 nastao Windows NT. Nasljednici Windows NT su i danas aktuelne verzije Windows-a i dijele zajednički osnovni dizajn jezgra, više od 20 godina, i uz manje razlike koje će biti kasnije objašnjene, opis je relevantan za većinu verzija Windows. Sve verzije Windows, koje pripadaju NT seriji su date na slici Slika 208, a na narednim stranama su prikazane kako izgledaju (Slika 209 i Slika 210). Ime Izdanja Datum Windows NT 3.1 Windows NT, Advanced Server Windows NT 3.5 Workstation, Server Windows NT 3.51 Workstation, Server Windows NT 4.0 Workstation, Server, Server Enterprise Edition, Terminal Server, Embedded Windows 2000 Professional, Server, Advanced Server, Datacenter Server , Windows XP Home, Professional, Media Center (original, 2003, 2004 & 2005), Tablet PC (original i 2005), Starter, Embedded, Home N, Professional N Windows Fundamentals for Legacy PCs Windows XP 64-bit Edition Version Windows Server 2003 Standard, Enterprise, Datacenter, Web, Storage, Small Business Server, Compute Cluster Windows XP Professional x64 Edition Windows Server 2003 R2 Standard, Enterprise, Datacenter, Web, Storage, Small Business Server, Compute Cluster Windows Home Server Windows Vista Starter, Home Basic, Home Premium, Business, Enterprise, Ultimate, Home Basic N, Business N Windows Server 2008 Foundation, Standard, Enterprise, Datacenter, Web Server, HPC Server, Itanium-Based Systems Windows 7 Starter, Home Basic, Home Premium, Professional, Enterprise, Ultimate Windows Server 2008 R2 Foundation, Standard, Enterprise, Datacenter, Web Server, HPC Server, Itanium-Based Systems Windows Home Server Windows 8 8, Pro, Enterprise, RT Windows Server 2012 Foundation, Essentials, Standard, Datacenter Windows , Pro, Enterprise, RT Windows Server 2012 R2 Foundation, Essentials, Standard, Datacenter Windows 10 Home, Pro, Enterprise, LTSB, Education, Mobile, Mobile Enterprise Windows Server 2016?? Slika 208 Sve verzije i izdanja sa Windows NT jezgrom

341 13.6.Windows NT serija 341 Windows NT 3.1 Windows NT 3.5 Windows NT 3.51 Windows NT 4.0 Windows 2000 Windows XP Windows Server 2003 Windows Vista Slika 209 Windows sa NT jezgrom, do 2007

342 Windows NT serija Windows server 2008 Windows 7 Windows server 2008 R2 Windows 8 Windows 8.1 Windows server 2012 Windows 10 Windows Server 2016 Slika 210 Windows sa NT jezgrom između 2007 i 2016

343 13.7.Windows NT Arhitektura 13.7.Windows NT Arhitektura 343 Winlogon Lokalni sig. atutoritet Lokalni mgr sesija Menadžer sesija Menadžer servisa WinInit Sistemski procesi Metro program Win32 program Jezička projekcija Imenski prostori Java app.net program.net bazne klase CLR biblioteka Media player Control panel MS manag. console cmd konzola Internet explorer. Explorer, dwm Alati i školjka Posix prog. Mrežni servisi Svchost servisi Spooler Posix podsistem server Servisi NT API program Transaction manager Transakcijski kordinator Windows runtime Direct 2D Media foundation WDF drajveri DirectX OLE Auto, ActiveX COM, DCOM WIN 32 i COM API Sistemske niti MS JVM Multimedia, MCI RichEdit Winsock,HTML TAPI, NetAPI, RAS GDI+ CORE, USER, GDI NTDLL.DLL Win 32 podsistem server Dispečer sistemskih servisa Win16 program WOW NTVDM OS/2 podsist. server MS DOS program OS/2 program USR KERNEL SMB SMB Datotečni sistem NTFS VFAT CDFS severr redirector Transport driver iface Drajveri NetBt Nwlin uređaja IP NetBeui IPX Mrežni drajveri VDM Cache manager I/O manager Local procedure call Security ref. monitor Object manager Executive Kernel (raspoređivač i interapti) Hardver HAL Win32 u jezgru. Configuration mgr. Process manager Virtual memory mgr Power manager PnP manager GDI Window manager Video drajveri Uvedeno od: NT 3.5 NT XP Vista Ukinuto od: NT 3.5 NT XP Vista Slika 211Arhitektura Windows sa NT jezgrom (32 bitna verzija) Šematski prikaz arhitekture Windows NT dat je na slici Slika 211. NT koristi modifikovani mikrokernel koji je između čistog mikrokernela i monolitnog dizajna. U NT-ovom modifikovanom mikrokernelskom dizajnu, okruženja operativnih sistema se izvršavaju u korisničkom režimu kao diskretni procesi, uključujući DOS, WIN 16, Win32, OS/2, and POSIX.

344 Komunikacija između jezgra i korisničkog režima Osnovni podsistemi operativnog sistema, uključujući Process Manager i Virtual Memory Manager, izvršavaju se u kernel modu i kompajlirani su u jednoj datoteci. NTOSKRNL.EXE Ovi podsistemi u kernel modu nisu odvojeni procesi i međusobno komuniciraju pozivom funkcija radi maksimalnih perfomansi. Svaki od ovih operativnih sistema ima svoje API-je, ali je nivo implementiranosti različit. DOS aplikacije su ograničene na one koje ne pristupaju direktno hardveru, POSIX i OS/2 imaju minimalan skup funkcija, dok se WIN32 stalno unapređuje i on je zvanični jezik NT linije. Okruženja operativnih sistema se baziraju na servisima koje kernel mod eksportuje da izvršava usluge koje oni ne mogu izvršavati u user modu. Te usluge pozvane u kernel modu su poznate kao NT-jev prirodni API. Ovaj API ima oko 250 funkcija koji se pozivaju koristeći softverske izuzetke. Softverski izuzetak je hardverski podpomognuti način da se prelazi između kernel i user moda. Zahtjeve za prirodnim API-jem izvršavaju funkcije u kernel modu koje se zovu sistemski servisi. Da bi se podržao rad sistemski servisi pozivaju komponente NT Executive-a:I/O Manager, Object Manager, Security Reference Monitor, Process Manager, Local Procedure Call Facility, i Virtual Memory Manager. Sa I/O managerom blisko sarađuju drajveri uređaja koji omogućuju pristup uređajima poput diskova i tastature Komunikacija između jezgra i korisničkog režima Okruženja operativnih sistema su implementirana kao klijent/server. Kao dio procesa kompajliranja,aplikacije se u toku linkovanja vežu za API operativnog sistema koji eksportuje okruženje operativnog sistema. U trenutku linkovanja aplikacija se povezuje sa klijentskim DLL-ovima koji eksportuju API. Na primjer WIN32 program je klijent okruženja operativnog sistema Win32. Stoga se on povezuje sa klijentskim DLL-ovima, Kernel32.dll, gdi32.dll, i user32.dll. POSIX program seveže za psxdll.dll U nekim slučajevima klijentski DLL može u potpunosti implementirati API bez poziva servera, u drugim slučajevima server mora pomoći. Serverska pomoć je potrebna obično samo kada se trebaju ažurirati globalne informacije o sistemu. Na primjer, za CreateProcess funkciju, mora se pozivati server, jer on poziva prirodnu NT funkciju, dok za čitanje datoteke ne mora se zvati server jer se ta akcija može implementirati unutar DLLa (Slika 212). Sistemski servisi prirodnog API-ja su napravljeni da ih dijelovi NTa u user modu mogu koristiti. Prirodni API mogu zvati i aplikacije, ali neće dobiti ništa više što ne bi mogle dobiti Win32 API-jem. Imena sistemskih servisa počinju sa Nt. Na primjer Program Klijentski DLL Poruka Prirodni sistemski servis Server okruženja Win32 funckija CreateProces poziva ntcreateproces, a ovaj poziva pscreateprocess iz Process Managera. Prirodni API se nalazi u ntdll.dll U cilju ubrzanja grafičkog korisničkog interfejsa, za razliku od NT 3.51 USER i GDI dio Win32 je prebačen u kernel. Prebacivanje je ubrzalo NT4.0 ali su njegove rane verzije postale nestabilne u slučaju loše napisanog grafičkog drajvera. Jezgro Slika 212 Klijent server model u jezgru

345 13.9.NT Executive NT Executive NT Executive upravlja resursima u operativnom sistemu. Sastoji se od sljedećih dijelova: Object Manager, Security Reference Monitor, Virtual Memory Manager, I/O Manager, Cache Manager, Local Procedure Call (LPC) Facility, Configuration Manager, Process Manager, Win32 (od NT 4.0), Plug-and-Play Manager (od Windows 2000) i Power Manager (od Windows 2000) Object manager Osnovna uloga operativnog sistema je da upravlja logičkim i fizičkim resursima računara. Svi drugi podsistemi Executivea koriste Object Manager da definišu objekte i upravljaju objektima koji predstavljaju resurse. Na primjer, kroz Object manager, Process manager definiše objekt "proces" kojim prati aktivne procese Objekti su Adapter, Callback, Controller, DebugObject, Desktop, Device,,Directory, Driver, Event, EventPair, File, IoCompletion, Job, Key, KeyedEvent, Mutant, Port, Process, Profile, Section, Semaphore, SymbolicLink, Thread, Timer, Token, Type, WaitablePort, WindowsStation, WMIGuid Object Manager obavlja zadatke upravljanja objektima koje uključuju identifikaciju i brojanje referenci. Kada aplikacija otvori resurs, OM locira objekt ili kreira novi. Objekti se označavaju identifikatorima koji se zovu handle. Oni su jedinstveni na nivou aplikacije, ali ne i između aplikacija. Referencni brojač prati koliko je procesa pristupilo resursu. Identifikacija objekta se nalazi u NT-jevom prostoru za imena. Svi djeljivi resursi imaju imena, kao što su imena fajlova, registry ključeva ili semafora. Skoro svi servisi pozivaju Object Manager Security Reference Monitor Security Reference Monitor je vezan s Object Managerom. Object Manager poziva Security Reference Monitor koji provjerava prava pristupa prije nego dopusti aplikaciji da otvori objekt. Object manager takođe zove Security Reference Monitor prije nego da aplikaciji da obavlja druge operacije nad objektima, kao što su čitanje i pisanje. SRM implementira sigurnosni model baziran na sigurnosnim identifikatorima (SID) i Diskrecionim listama za kontrolu pristupa (DACL). Pristupni token Marko Administrators Objekt Deny Marko Read Allow Administrators Delete, Read Svaki proces u NT-u ima pridruženi token pristupa koji sadrži SID korisnika, a koji posjeduje proces i SIDove grupa kojima on pripada. Na slici Slika 213j e DACL koji ne da vlasniku procesa, Mark, da čita objekt, premda dopušta njegovoj grupi (Administrators) ACE Slika 213 Pristupni token DACL ACE

346 Virtual Memory Manager Virtual Memory Manager Virtual Memory Manager ima dva zadatka: Da kreira i upravlja adresne mape za procese i kontroliše alokaciju fizičke memorije Windows NT implementira 32 bitni prostor, ali aplikacije mogu pristupiti prva 2G (user mode polovina, koja se mijenja kako se pokreću novi procesi). Druga polovina je (2-4G) je kernel polovina i ona se ne mijenja (Slika 214). Virtual Memory Manager implementira virtualnu memoriju preko stranica, velikih 4 K na Intel arhitekturi ili 8K na Alpha arhitekturi. Ako procesi zahtijevaju više memorije nego što je fizički ima, višak se nalazi u zamjenskoj datoteci. Napredne mogućnosti VMM su memorijsko mapiranje datoteka, dijeljenje memorije i zaštita pri pisanju strane I/O manager I/O manager integriše dodatne drajvere za uređaje sa NT-om. Drajver uređaja prevodi komande koje NT i aplikacije šalju uređaju i prosljeđuju zahtjeve hardveru. Ako Microsoft nije isporučio drajver, proizvođač hardvera jeste. I/O manager podržava asinhroni paketni I/O prijenos. Npr, ako MS Word čita iz fajla, servis NtReadFile alocira I/O request packet (IRP) koji ima informacije o adresi gdje se smještaju podaci, objektu koji predstavlja datoteku, poziciji u datoteci, količini podataka itd. IRP se zatim proslijedi drajveru fajl sistema. Kada drajveri prime IRP oni rade svoje a aplikacija nastavlja sa izvršenjem. Pošto to može biti teško za programiranje, standardni Win32 API ubacuje potrebna čekanja, ali je moguće pozivati i napredne funkcije koje koriste ovu asinhronost. NOTEPAD KERNEL32.DLL USER32.DLL GDI32.DLL SHELL.DLL KERNEL EXECUTIVE HAL DRAJVERI I/O manager podržava 64 bitne pozicije u datotekama i višeslojne drajvere uređaja. Npr, NTFS drajver je iznad fault tolerant drajvera koji je iznad standardnog drajvera (Slika 215) Cache manager Cache manager sarađuje sa VMM i drajverima za datotečni sistem. Cache manager održava NT globalni (dijeljen od svih fajl sistema) keš za datoteke. NT keš je datotečno orijentisan (za razliku od 95 koji je blokovno). Fizičku memoriju kešu dodjeljuje Working-set tuner. Kada on izbacuje memoriju iz prostora predviđenog za keš, fajl sistem snima datoteku na disk Poziv lokalne procedure NT-ov Poziv lokalne procedure (LPC) optimizira komunikaciju između aplikcija uključujući i okruženja operativnih sistema. LPC funkcija je bazirana na dva tipa port objekata: konekcijski portovi i komunikacioni portovi. Server kreira konekcijski port na koji se klijent kači. Nakon što klijent uspostavi tu komunikaciju, server kreira komunikacioni port kroz koji server i klijent prenose podatke. 0 1M 2G 4G Slika 214 Proces u memoriji I/O manager NTFS Drajver otporan na pad Drajver diska Slika 215 I/O manager i drajveri

347 13.16.Configuration manager 347 Postoje 3 tipa LPC, kopiranje podataka, dijeljena memorija i dijeljena memorija sa parovima događaja (Quick LPC). NT koristi kopiranje podataka za male poruke (do 256 bajtova). Jedna strana ( Klijent ili server) kopira poruku na port Dijeljena memorija se koristi za poruke preko 256 bajtova. U LPC-u dijeljenom memorijom klijent i server dijele region memorije. Šalje se samo kratka poruka sa informacijom o adresi dijeljene memorije. Win32 pod NT 3.51 koristi Quick-LPC. Win32 ne šalje poruke kroz portove. Umjesto toga, jedna strana koristi sinhronizacijski objekt Eventpair da informiše drugu. Ovaj metod izbjegava opterećenja zbog komunikacije kroz port ali troši više resursa Configuration manager Configuration Manager upravlja Registry-jem i Win32 Registry funkcije se zasnivaju na Configuration manageru. Njegove usluge koristi i IO manager radi dodjeljivanja resursa drajverima uređaja Process manager Process Manager radi sa kernelom da definiše objekte procesa i tredova. Process Manager uokviruje kernelov objekt proces i dodaje mu identifikator procesa PID, pristupni token, adresnu mapu i tabelu hendlova. Slično radi i sa threadovima dodajući im TID identifikator i statistiku koja uključuje kada se proces i thread startovali i određene brojače virtualne memorije. Process Manager izvozi interfejs koji omogućava da ostali podsistemi Executivea i korisničke aplikacije manipulišu procesima i nitima. Na primjer, aplikacije mogu pristupati funkcijama Process Managera da kreiraju procese, brišu ih i modifikuju njihove karakteristike (kao što su njihovi prioriteti) WIN 32 u kernel dijelu Win32 se sastoji od funkcija za poruke i crtanje Win32 API-ja. U NT 3.51 ti su moduli bili u user režimu kao dio Win32 okruženja. Od NT 4, GDI32.dll i user32.dll pozivaju funkcije implementirane u win32.sys datoteci jezgra, Kernel NT NT kernel (zovu ga i mikrokernel, mada se razlikuje od uobičajenog značenja ovog pojma, pošto nije jedini softver u adresnom prostoru jezgra) radi bliže sa hardverom nego Executive i sadrži kod ovisan od procesora. Obavlja dvije funkcije: raspoređivanje niti i procesa, te upravljanje interaptima. NT raspoređivač niti, koji se zove dispečer, nalazi se u Kernelu. Dispečer implementira 32 nivoa prioriteta. Prioritet 0 je rezervisan za sistemski thread koji briše memorijske stranice. Programi se izvršavaju u nivoima prioriteta 1 do 15, dok nivoima 16 do 31 mogu pristupiti samo administratori. NT dispečer je preemptivni raspoređivač. Procesorsko vrijeme je podijeljeno u dijelove koji se zovu kvantumi. Kada thread dođe do kraja svog kvantuma i dispečer predaje zadatak threadu istog prioriteta koji čeka. Sinhronizaciju omogućavaju mutexi, semafori, eventi, i spinlockovi. Objekte kernela mapira Executive kroz Object Manager i Process Manager, i oni su takvi vidljivi aplikacijama. Kernel upravlja interapt vektorima. NT definiše i implementira IRQ nivoe u Kernelu.

348 Hardware Abstraction Layer Hardware Abstraction Layer HAL je NT-ov interfejs prema samom procesoru. NT je portabilan između različitih procesora. Stvari specifične za pojedini procesor pišu se u ovom modulu. HAL eksportuje standardni procesor i drajveri se pišu za njega. Čak i na pločama sa istim procesorom može biti razlika, recimo ako su jedno i višeprocesorske. Postoje tri verzije HAL.DLL-a, jednoprocesorska, višeprocesorska i debug verzija Windows 2000 Kako se vidi na slici, dva nova podsistema u jezgru uvedena s Windows 2000 su Plug and Play i Power Manager Plug and play,uveden sa Windows 95,sada je dio Windows Kompatibilni uređaji se mogu uvesti i Windows će konfigurisati uređaj. To će možda zahtijevati rekonfigurisanje drugih uređaja. Poboljšano je upravljanje napajanjem radi podrške prenosnim računarima. Manager napajanja upravlja promjenama statusa napajanja za sve uređaje koji podržavaju te. To se često radi kroz složeni niz uređaja za kontrolu drugih uređaja. Svaki uređaj koji kontroliše se zove čvor i mora imati drajver koji omogućava komunikaciju tokom promjena stanja kroz hrpu uređaja. Drajveri treba da reaguju na sljedeće informacije: Nivo aktivnosti sistema, nivo baterije, trenutni zahtjevi na zatvaranje, spavanje ili hibernacije, korisničke akcije kao što je pritisak na dugme napajanja, postavke Control panel, kao što je automatsko gašenje na 10 posto baterije... Serverska verzija Windows 2000 je uvela novi način grupisanja računara i prava. Umjesto dotadašnjeg sistema domena koje su predstavljale skup korisnika i računara, uveden je hijerarhijski organizovani aktivni direktorij Windows XP i Windows.NET server 2003 Windows XP je vjerovatno najpopularnija verzija Windows svih vremena i najduže u upotrebi, jer je period podrške bio od 2001 do godine. Pored vizuelnih promjena u izgledu prozora, napravljeno je i više, ne mnogo revolucionarnih, ali dosta korisnih promjena u jezgru. Od Windows 2000 kernela Microsoft je dodao široku podršku za uređaje i Plug and play. Promijenjen je kernel da se ubrza dizanje sistema. Plavi ekran krahiranja su često izazivali nekompatibilni drajveri za uređaje. Windows XP provjerava da li je drajver certificiran u Windows Hardware Quality Lab (WHQL). Necertificirani drajveri mogu i dalje raditi na korisnikov zahtjev, ali postoji i crna lista drajvera koji definitivno krahiraju. Windows XP uključuje System Restore koji vraća sistem u stanje prije instalacije problematičnog drajvera. Poboljšana je podrška DLL-ovima. Dopušteno je da se u memoriji nalazi više različitih verzija DLLova kako bi aplikacije koje su ovisne o specifičnoj verziji DLLa radile. Slabo upravljanje memorijom ranije je bilo uzrok nestabilnosti. Više se ne događa da drajver uređaja alocira memoriju koja ne postoji. Može se mapirati duplo više stranica memorije nego sa Win2000. Stabilnost je povećana kad je nedovoljno memorije. Operativni sistem tada smanjuje vlastite zahtjeve. Registry je optimizovan da što manje bude fragmentiran, i prebačen iz

349 13.23.Windows Vista i Windows Server kernelske u straničenu memoriju. Njegov sadržaj se smiješta u memoriju pri dizanju sistema radi boljih perfomansi. Ubrzano vrijeme podizanja operativnog sistema uz pomoć Simple Boot Flag (SBF) specifikacije. Jezgro bazirano na kodu Windows XP korišteno je u serverskoj verziji, Windows Server Window Server 2003 je dizajniran kao nastavak Windows 2000 servera. Windows 2003 server uključuje.net Framework 1.1 i XML Web Services. Jedno vrijeme se zvao i Windows 2003.NET server. Omogućeno je brže i lakše upravljanje Aktivnim direktorijem. Domain Controller (DC) Upgrade Wizard omogućava čitanje podaataka o Domain Controleru sa Cda. Uključen Internet Information Server (IIS) 6, 64 bitna verzija Windows Server 2003 predviđena je za Intel 64-bit Itanium 2, ostale verzije su za 32 bitni Pentium Windows Vista i Windows Server 2008 Microsoft je počeo planirati Vistu ("Longhorn") godine, odmah nakon izlaska XPa. Bio je očekivan krajem kao korak između Windows XPa i "Blackcomba" (sada znanog pod imenom Windows "Vienna"). "Longhorn" je trebao uključiti mnogo novih značajki i tehnologija planiranih za "Blackcomb". Orginalni "Longhorn", zasnovan na XP-ovom izvornom kodu je odbačen i krenulo se otpočetka, izradom na bazi sistema Windows Server Neki najavljeni noviteti kao što je WinFSsu odbačeni ili odgođeni. Vista se pokazala kao imunija na viruse, manje stabilna od XP, manje kompatibilna s DOS-om, jer više ne rade DOS aplikacije u grafičkom režimu. Windows Vista je uveo dosta novosti u korisnčkom režimu rada, kao što su grafički interfejs Aero sa novom školjkom, prepoznavanje govora, Internet explorer 7, Media player 11, Mail, Calendar, Photo Gallery, DVD maker, direktoriji koji koriste simboličke linkove, veća sigurnost, alat za prijavu problema i Windows update Što se tiče jezgra, promijenjen je boot loader i radi druge arhitekture drajvera, Windows Driver Foundation (umjesto dotadašnjeg WDM) manje drajvera je u kernelu. Napravljene su određene promjene u algoritmima. U algoritmu za mjerenje procesorskog vremena, jezgro koristi i precizne tajmere ugrađene u procesor. Time kvantumi postaju precizniji. Pri raspoređivanju niti, Vista ne uzima u vrijeme proteklo pri izvršenju niti vrijeme koje je potrošio neki interapt pokrenut usred te niti. Podsistem za lokalni poziv procedure je ponovo napisan, i sada se zove ALPC: Advanced Lightweight Procedure Calls jer je to bilo potrebno zbog prebacivanja nekih drajvera u korisnički režim rada. U U/I podsistemu uklonjena je izmjena konteksta u trenutku završetka ulaza/izlaza na portovima i poboljšano otkazivanje ulaza/izlaza. Upravljanje memorijom je promijenjeno tako da se programi mogu učitavati na nepredvidive, slučajne lokacije, kako bi se prevarili virusi. Serverski ekvivalent za Windows Vista je Windows Server 2008 (radno ime Longhorn Server). Ova serverska verzija ima široku podršku virtualizaciji, aktivnom direktoriju (mreži računara s zajedničkom prijavom) i naprednom komandnom interpreteru PowerShell. Windows server 2008 R2 koristi isto jezgro kao Windows Windows 7 Windows 7 (Product manager Steven Sinofsky) je prvenstveno namijenjen da bude inkrementalna nadogradnja na operativni sistem, s namjerom da odgovori na kritike s kojima se suočio njegov prethodnik, Windows Vista (kao što je poboljšanje performansi), uz zadržavanje kompatibilnosti sa hardverom i softverom dizajniranim za Vista. Zadržavajući

350 Windows 8, Windows 8.1 i Windows Server 2012 sličan izgled kao Vista, u Windows 7 interfejs je pojednostavljen, uz dodatak redizajniranog taskbara koji omogućava aplikacijama da se prikače na njega, i nove funkcije upravljanja prozorima. Ostale nove mogućnosti su dodane u operativni sistem, uključujući biblioteke, novi sistem dijeljenja datoteka HomeGroup, i podrška za multitouch unos. "Action Center" pruža pregled sigurnosti sistema i informacije o održavanju, a podešavanja su napravljena u kontroli korisničkih naloga da bi bio manje nametljiv. Windows 7 se također isporučuje s ažuriranim verzijama nekoliko standardnih aplikacija: Internet Explorer, Windows Media Player i Windows Media Center. Od NT 4,. sve veća integracija Win32 u jezgro, učinila udaljavanje od originalne ideje o fleksibilnom NT jezgru sa proizvoljnim podsistemima. Stoga se dosadašnje verzije Windowsa nisu mogle koristiti bez grafičkog okruženja, koje je nepotrebno na serverima i ugrađenim uređajima. Zato se krenulo u redizajn, napravljen je MinWin, minimum da se Windows 7 pokrene (bez GUI, sa mrežnim servisima, ukupno 25 M). To je zahtijevalo redizajn sistemskih biblioteka Win32 podsistema, pa su neke funkcije iz Kernel32.dll i Advapi32.dll prebačene u manji Kernelbase.dll, a dinamičke biblioteke se mogu dijeliti u više virtualnih biblioteka, što se zove API skupovi. (Slika 216).Obrada konzole prebačena is csrss u conhost.exe Virtualni DLL 1 Virtualni DLL 2 Apisetschema.dll Logički DLL Slika 216 Virtualni DLL Učinjene su određene memorijske optimizacije: smanjuje se zauzeće memorije po prozoru za 50%, registry se učita u skup strana (prije bio u memoriji), a brojač starenja radnog skupa je četverobitni (prije bio trobitni). Fault tolerant heap (FTH), omogućava da kada se primijeti čest pad procesa zbog upotrebe heap memorije, mijenjaju se algoritmi provjere. Vezano za raspoređivanje procesora, izmijenjeno je sljedeće. Ranije se svaki procesor predstavljao jednim bitom da li je aktivan, pa je Windows podržavao 32 ili 64 procesora, taj broj je povećan na 256. Ranije je raspoređivano ravnomijerno po jezgrama, čak i ako se malo koristi. Tehnika Core Parking pokušava rasporediti opterećenje na što manje logičkih i fizičkih procesora radi smanjenja potrošnje. Na neaktivne procesore se ne šalje ni tajmer interapt. Uveden je User mode scheduling (UMS) za realizaciju niti u korisničkom prostoru. Procesi se mogu pokretati po događajima: UBPM (Unified Background Process Manager) je Unificirani način za pokretanje procesa po događajima. Realizovan u Service Control Manager. Po pitanju sigurnosti, uvedeni su virtualni korisnički nalozi (potrebni servisima) i uvijek se kreiraju BitLocker, šifrovane skrivene particije, koje omogućavaju i lozinku nad pomjerljivim medijem Windows 8, Windows 8.1 i Windows Server 2012 Windows 8 je verzija Windows-a (Manager: Julie Larson-Green) s najdrastičnijom promjenom korisničkog interfejsa još od Windows 95. Umjesto start menija uvedeno je novo okruženje prilagođeno tablet računarima. Novije aplikacije se sada prikazuju punom ekranu, umjesto rada u prozoru, za koje je rezervisan Desktop režim. Verzije Windows 8, Windows 8 professional, Windows 8 enterprise i Windows RT (za ARM).

351 13.26.Windows Nakon Win32 i.net API, uvodi se novi API zvani Windows Runtime, a glavni razvojni jezici postaju HTML 5 i JavaScript. Distribucija softvera se pomjera prema centralizovanom serverskom sistemu: Windows Store. Glavne izmjene u jezgru su učinjene s podizanjem sistema. Secure boot, sa javnim ključem koristi nove verzije BIOS-a i pazi na eventualne viruse prilikom podizanja sistema. Pri podizanju sistem koristi djelomičnu hibernaciju, radi ubrzanja podizanja, Dodjela tačne lokacije fizičke memorije aplikacijama je manje deterministička, u cilju smanjenja vjerovatnoće napada. U Windows 8.1 (manager Chaitanya Sareen) u Desktop režimu je vraćeno Start dugme, dodana podrška za 3D štampače i šifrovanje uređaja Windows 10 Windows 10, iz godine, omogućava da i RT aplikacije po želji rade u prozoru ili punom ekranu, a Start meni je bliži klasičnom iz verzije 7, ali uključuje u polovini i start ekran iz Windows 8. Windows korisnički interfejs je revidiran da omogući prelaz između mišorijentiranog i touchscreen-optimizovanog interfejsa na osnovu dostupnih ulaznih uređajaposebno na 2-u-1 PC-u. Windows 10 i uvodi sistem virtualnih desktopa, mogućnost upravljanja prozrima i desktopom pod nazivom Task View, Microsoft Edge web preglednik kao zamjena za Internet Exploerr, podršku za prepoznavanje otiska prsta i izgleda lica prilikom prijava, nove sigurnosne osobine za poslovna okruženja, i DirectX 12 i WDDM 2.0 za poboljšanje grafičkih mogućnosti operativnog sistema za igre. Postoji i verzija za Rapsbery Pi Specijalne verzije s Windows NT jezgrom Windows NT jezgro se koristi u još nekim sistemima, manje poznatim. Windows Embedded, predstavljaju skraćene i konfigurabilne verzije Windows-a za ugradnju u različite uređaje (npr POS kase, bankomate...) Igraće konzole XBOX i XBOX-360 imaju operativne sisteme sa jezgrom preuzetim od Windows 2000, ali drugačijim ostatkom operativnog sistema Windows Home server i Windows Home server 2011 predstavljaju smanjenu verziju Windows server 2008 Windows fundamentals for legacy PC je smanjena verzija XP, koja sadrži samo terminalski softver Windows Thin PC je smanjena verzija Windows 7,koja sadrži samo terminalski softver Windows CE, Windows Phone, Mobile i Pocket PC U Windows CE sistemima cijeli operativni sistem je u ROMu kao i aplikacije koje dolaze sa sistemom. Ako programski modul nije kompresovan, ROM programi se izvršavaju na lokaciji u ROM-u gdje se već nalaze. Ako je modul u ROMu kompresovan, dekompresuje se i prebaci u RAM. Upisivi podaci se smještaju u RAM. Windows CE je operativni sistem dijeljenog izvornog koda, proizvođači uređaja licenciraju izvorni kod. Na raspolaganju je nekoliko arhitektura. Nije kompatibilan s WIN32, a (za razliku od XP embedded koji zahtijeva bar 8 megabajta) CE 5 može se smjesiti u 350 kilobajta.

352 Windows CE, Windows Phone, Mobile i Pocket PC Windows CE 1.0 Windows CE 3.0 Windows CE 2.0 Windows CE 4.0 Windows CE 5.0 Windows Embedded CE 6.0 Windows Embedded Compact 7 Slika 217 Windows CE verzije Windows CE je izašao u sljedećim verzijama (Slika 217) Namijenjen uređajima "handheld PC" (HPC) Uređaji "Palm-sized PC". Omogućava raspoređivanje u realnom vremenu. Podržane arhitekture ARM, MIPS, PowerPC, StrongARM, SuperH i x86. Podržava kriptografske algoritme SSL 2.0 i SSL Raspoređivanje u realnom vremenu do mikrosekunde. Ova verzija je i baza za Pocket PC 2000, Handheld PC 2000, Pocket PC 2002 i Smartphone Povećano nivoa prioriteta s 8 na 256. Broj objekata povećan s 65,536 na 4.19 miliona. Zaštita kritičnih dijelova registry baze.

SIMPLE PAST TENSE (prosto prošlo vreme) Građenje prostog prošlog vremena zavisi od toga da li je glagol koji ga gradi pravilan ili nepravilan.

SIMPLE PAST TENSE (prosto prošlo vreme) Građenje prostog prošlog vremena zavisi od toga da li je glagol koji ga gradi pravilan ili nepravilan. SIMPLE PAST TENSE (prosto prošlo vreme) Građenje prostog prošlog vremena zavisi od toga da li je glagol koji ga gradi pravilan ili nepravilan. 1) Kod pravilnih glagola, prosto prošlo vreme se gradi tako

More information

IZDAVANJE SERTIFIKATA NA WINDOWS 10 PLATFORMI

IZDAVANJE SERTIFIKATA NA WINDOWS 10 PLATFORMI IZDAVANJE SERTIFIKATA NA WINDOWS 10 PLATFORMI Za pomoć oko izdavanja sertifikata na Windows 10 operativnom sistemu možete se obratiti na e-mejl adresu esupport@eurobank.rs ili pozivom na telefonski broj

More information

AMRES eduroam update, CAT alat za kreiranje instalera za korisničke uređaje. Marko Eremija Sastanak administratora, Beograd,

AMRES eduroam update, CAT alat za kreiranje instalera za korisničke uređaje. Marko Eremija Sastanak administratora, Beograd, AMRES eduroam update, CAT alat za kreiranje instalera za korisničke uređaje Marko Eremija Sastanak administratora, Beograd, 12.12.2013. Sadržaj eduroam - uvod AMRES eduroam statistika Novine u okviru eduroam

More information

Podešavanje za eduroam ios

Podešavanje za eduroam ios Copyright by AMRES Ovo uputstvo se odnosi na Apple mobilne uređaje: ipad, iphone, ipod Touch. Konfiguracija podrazumeva podešavanja koja se vrše na računaru i podešavanja na mobilnom uređaju. Podešavanja

More information

SAS On Demand. Video: Upute za registraciju:

SAS On Demand. Video:  Upute za registraciju: SAS On Demand Video: http://www.sas.com/apps/webnet/video-sharing.html?bcid=3794695462001 Upute za registraciju: 1. Registracija na stranici: https://odamid.oda.sas.com/sasodaregistration/index.html U

More information

Ulazne promenljive se nazivaju argumenti ili fiktivni parametri. Potprogram se poziva u okviru programa, kada se pri pozivu navode stvarni parametri.

Ulazne promenljive se nazivaju argumenti ili fiktivni parametri. Potprogram se poziva u okviru programa, kada se pri pozivu navode stvarni parametri. Potprogrami su delovi programa. Često se delovi koda ponavljaju u okviru nekog programa. Logično je da se ta grupa komandi izdvoji u potprogram, i da se po želji poziva u okviru programa tamo gde je potrebno.

More information

Biznis scenario: sekcije pk * id_sekcije * naziv. projekti pk * id_projekta * naziv ꓳ profesor fk * id_sekcije

Biznis scenario: sekcije pk * id_sekcije * naziv. projekti pk * id_projekta * naziv ꓳ profesor fk * id_sekcije Biznis scenario: U školi postoje četiri sekcije sportska, dramska, likovna i novinarska. Svaka sekcija ima nekoliko aktuelnih projekata. Likovna ima četiri projekta. Za projekte Pikaso, Rubens i Rembrant

More information

Eduroam O Eduroam servisu edu roam Uputstvo za podešavanje Eduroam konekcije NAPOMENA: Microsoft Windows XP Change advanced settings

Eduroam O Eduroam servisu edu roam Uputstvo za podešavanje Eduroam konekcije NAPOMENA: Microsoft Windows XP Change advanced settings Eduroam O Eduroam servisu Eduroam - educational roaming je besplatan servis za pristup Internetu. Svojim korisnicima omogućava bezbedan, brz i jednostavan pristup Internetu širom sveta, bez potrebe za

More information

CJENOVNIK KABLOVSKA TV DIGITALNA TV INTERNET USLUGE

CJENOVNIK KABLOVSKA TV DIGITALNA TV INTERNET USLUGE CJENOVNIK KABLOVSKA TV Za zasnivanje pretplatničkog odnosa za korištenje usluga kablovske televizije potrebno je da je tehnički izvodljivo (mogude) priključenje na mrežu Kablovskih televizija HS i HKBnet

More information

Port Community System

Port Community System Port Community System Konferencija o jedinstvenom pomorskom sučelju i digitalizaciji u pomorskom prometu 17. Siječanj 2018. godine, Zagreb Darko Plećaš Voditelj Odsjeka IS-a 1 Sadržaj Razvoj lokalnog PCS

More information

GUI Layout Manager-i. Bojan Tomić Branislav Vidojević

GUI Layout Manager-i. Bojan Tomić Branislav Vidojević GUI Layout Manager-i Bojan Tomić Branislav Vidojević Layout Manager-i ContentPane Centralni deo prozora Na njega se dodaju ostale komponente (dugmići, polja za unos...) To je objekat klase javax.swing.jpanel

More information

Tutorijal za Štefice za upload slika na forum.

Tutorijal za Štefice za upload slika na forum. Tutorijal za Štefice za upload slika na forum. Postoje dvije jednostavne metode za upload slika na forum. Prva metoda: Otvoriti nova tema ili odgovori ili citiraj već prema želji. U donjem dijelu obrasca

More information

1. Instalacija programske podrške

1. Instalacija programske podrške U ovom dokumentu opisana je instalacija PBZ USB PKI uređaja na računala korisnika PBZCOM@NET internetskog bankarstva. Uputa je podijeljena na sljedeće cjeline: 1. Instalacija programske podrške 2. Promjena

More information

PROJEKTNI PRORAČUN 1

PROJEKTNI PRORAČUN 1 PROJEKTNI PRORAČUN 1 Programski period 2014. 2020. Kategorije troškova Pojednostavlj ene opcije troškova (flat rate, lump sum) Radni paketi Pripremni troškovi, troškovi zatvaranja projekta Stope financiranja

More information

KAPACITET USB GB. Laserska gravura. po jednoj strani. Digitalna štampa, pun kolor, po jednoj strani USB GB 8 GB 16 GB.

KAPACITET USB GB. Laserska gravura. po jednoj strani. Digitalna štampa, pun kolor, po jednoj strani USB GB 8 GB 16 GB. 9.72 8.24 6.75 6.55 6.13 po 9.30 7.89 5.86 10.48 8.89 7.30 7.06 6.61 11.51 9.75 8.00 7.75 7.25 po 0.38 10.21 8.66 7.11 6.89 6.44 11.40 9.66 9.73 7.69 7.19 12.43 1 8.38 7.83 po 0.55 0.48 0.37 11.76 9.98

More information

3. Obavljanje ulazno-izlaznih operacija, prekidni rad

3. Obavljanje ulazno-izlaznih operacija, prekidni rad 3. Obavljanje ulazno-izlaznih operacija, prekidni rad 3.1. Spajanje naprava u ra unalo Slika 3.1. Spajanje UI naprava na sabirnicu 3.2. Kori²tenje UI naprava radnim ekanjem Slika 3.2. Pristupni sklop UI

More information

CJENIK APLIKACIJE CERAMIC PRO PROIZVODA STAKLO PLASTIKA AUTO LAK KOŽA I TEKSTIL ALU FELGE SVJETLA

CJENIK APLIKACIJE CERAMIC PRO PROIZVODA STAKLO PLASTIKA AUTO LAK KOŽA I TEKSTIL ALU FELGE SVJETLA KOŽA I TEKSTIL ALU FELGE CJENIK APLIKACIJE CERAMIC PRO PROIZVODA Radovi prije aplikacije: Prije nanošenja Ceramic Pro premaza površina vozila na koju se nanosi mora bi dovedena u korektno stanje. Proces

More information

11 Analiza i dizajn informacionih sistema

11 Analiza i dizajn informacionih sistema 11 Analiza i dizajn informacionih sistema Informatika V.Prof.dr Kemal Hajdarević dipl.ing.el 25.4.2014 11:58:28 1 1. Kompjuter, Internet, i mrežne osnove 2. Kompjuterska industrija Informatika u stomatologiji

More information

Windows Easy Transfer

Windows Easy Transfer čet, 2014-04-17 12:21 - Goran Šljivić U članku o skorom isteku Windows XP podrške [1] koja prestaje 8. travnja 2014. spomenuli smo PCmover Express i PCmover Professional kao rješenja za preseljenje korisničkih

More information

Upute za korištenje makronaredbi gml2dwg i gml2dgn

Upute za korištenje makronaredbi gml2dwg i gml2dgn SVEUČILIŠTE U ZAGREBU - GEODETSKI FAKULTET UNIVERSITY OF ZAGREB - FACULTY OF GEODESY Zavod za primijenjenu geodeziju; Katedra za upravljanje prostornim informacijama Institute of Applied Geodesy; Chair

More information

KONFIGURACIJA MODEMA. ZyXEL Prestige 660RU

KONFIGURACIJA MODEMA. ZyXEL Prestige 660RU KONFIGURACIJA MODEMA ZyXEL Prestige 660RU Sadržaj Funkcionalnost lampica... 3 Priključci na stražnjoj strani modema... 4 Proces konfiguracije... 5 Vraćanje modema na tvorničke postavke... 5 Konfiguracija

More information

STRUČNA PRAKSA B-PRO TEMA 13

STRUČNA PRAKSA B-PRO TEMA 13 MAŠINSKI FAKULTET U BEOGRADU Katedra za proizvodno mašinstvo STRUČNA PRAKSA B-PRO TEMA 13 MONTAŽA I SISTEM KVALITETA MONTAŽA Kratak opis montže i ispitivanja gotovog proizvoda. Dati izgled i sadržaj tehnološkog

More information

BENCHMARKING HOSTELA

BENCHMARKING HOSTELA BENCHMARKING HOSTELA IZVJEŠTAJ ZA SVIBANJ. BENCHMARKING HOSTELA 1. DEFINIRANJE UZORKA Tablica 1. Struktura uzorka 1 BROJ HOSTELA BROJ KREVETA Ukupno 1016 643 1971 Regije Istra 2 227 Kvarner 4 5 245 991

More information

Univerzitet u Novom Sadu. Fakultet tehničkih nauka. Odsek za računarsku tehniku i računarske komunikacije. Uvod u GIT

Univerzitet u Novom Sadu. Fakultet tehničkih nauka. Odsek za računarsku tehniku i računarske komunikacije. Uvod u GIT Univerzitet u Novom Sadu Fakultet tehničkih nauka Odsek za računarsku tehniku i računarske komunikacije Uvod u GIT Šta je git? Sistem za verzionisanje softvera kao i CVS, SVN, Perforce ili ClearCase Orginalno

More information

Otpremanje video snimka na YouTube

Otpremanje video snimka na YouTube Otpremanje video snimka na YouTube Korak br. 1 priprema snimka za otpremanje Da biste mogli da otpremite video snimak na YouTube, potrebno je da imate kreiran nalog na gmailu i da video snimak bude u nekom

More information

INSTALIRANJE SOFTVERSKOG SISTEMA SURVEY

INSTALIRANJE SOFTVERSKOG SISTEMA SURVEY INSTALIRANJE SOFTVERSKOG SISTEMA SURVEY Softverski sistem Survey za geodeziju, digitalnu topografiju i projektovanje u niskogradnji instalira se na sledeći način: 1. Instalirati grafičko okruženje pod

More information

JEDINSTVENI PORTAL POREZNE UPRAVE. Priručnik za instalaciju Google Chrome dodatka. (Opera preglednik)

JEDINSTVENI PORTAL POREZNE UPRAVE. Priručnik za instalaciju Google Chrome dodatka. (Opera preglednik) JEDINSTVENI PORTAL POREZNE UPRAVE Priručnik za instalaciju Google Chrome dodatka (Opera preglednik) V1 OPERA PREGLEDNIK Opera preglednik s verzijom 32 na dalje ima tehnološke promjene zbog kojih nije moguće

More information

PROGRAMSKI JEZIK VISUAL BASIC ZBIRKA ZADATAKA

PROGRAMSKI JEZIK VISUAL BASIC ZBIRKA ZADATAKA Dr Srđan Damjanović Dr Predrag Katanić PROGRAMSKI JEZIK VISUAL BASIC ZBIRKA ZADATAKA FAKULTET POSLOVNE EKONOMIJE BIJELJINA, 2014. Recenzenti: Prof. dr Rade Stankić Prof. dr Slobodan Obradović Izdaje: FAKULTET

More information

TRAJANJE AKCIJE ILI PRETHODNOG ISTEKA ZALIHA ZELENI ALAT

TRAJANJE AKCIJE ILI PRETHODNOG ISTEKA ZALIHA ZELENI ALAT TRAJANJE AKCIJE 16.01.2019-28.02.2019 ILI PRETHODNOG ISTEKA ZALIHA ZELENI ALAT Akcija sa poklonima Digitally signed by pki, pki, BOSCH, EMEA, BOSCH, EMEA, R, A, radivoje.stevanovic R, A, 2019.01.15 11:41:02

More information

Slobodni softver za digitalne arhive: EPrints u Knjižnici Filozofskog fakulteta u Zagrebu

Slobodni softver za digitalne arhive: EPrints u Knjižnici Filozofskog fakulteta u Zagrebu Slobodni softver za digitalne arhive: EPrints u Knjižnici Filozofskog fakulteta u Zagrebu Marijana Glavica Dobrica Pavlinušić http://bit.ly/ffzg-eprints Definicija

More information

Office 365, upute za korištenje elektroničke pošte

Office 365, upute za korištenje elektroničke pošte Office 365, upute za korištenje elektroničke pošte Naša ustanova koristi uslugu elektroničke pošte u oblaku, u sklopu usluge Office 365. To znači da elektronička pošta više nije pohranjena na našem serveru

More information

21. Paralelizam na nivou zadataka

21. Paralelizam na nivou zadataka 21. Paralelizam na nivou zadataka Na nivou zadataka razlukujemo dve kategorije paralelizma. Ove kategorije se razlikuju po tome kakav odnos postoji izmedju zadataka. Odnos može biti: peer-to-peer (ravnoprvan

More information

Bušilice nove generacije. ImpactDrill

Bušilice nove generacije. ImpactDrill NOVITET Bušilice nove generacije ImpactDrill Nove udarne bušilice od Bosch-a EasyImpact 550 EasyImpact 570 UniversalImpact 700 UniversalImpact 800 AdvancedImpact 900 Dostupna od 01.05.2017 2 Logika iza

More information

ARHITEKTURA RAČUNARA

ARHITEKTURA RAČUNARA J. ĐORĐEVIĆ, D. MILIĆEV, D. BOJIĆ, A. MILENKOVIĆ, B. NIKOLIĆ, Z. RADIVOJEVIĆ, M. OBRADOVIĆ ARHITEKTURA RAČUNARA ZBIRKA REŠENIH ZADATAKA Beograd 2005. 1.1 ZADATAK 1 PREKIDI Posmatra se procesor sa vektorisanim

More information

Uvod u relacione baze podataka

Uvod u relacione baze podataka Uvod u relacione baze podataka 25. novembar 2011. godine 7. čas SQL skalarne funkcije, operatori ANY (SOME) i ALL 1. Za svakog studenta izdvojiti ime i prezime i broj različitih ispita koje je pao (ako

More information

Struktura indeksa: B-stablo. ls/swd/btree/btree.html

Struktura indeksa: B-stablo.   ls/swd/btree/btree.html Struktura indeksa: B-stablo http://cis.stvincent.edu/html/tutoria ls/swd/btree/btree.html Uvod ISAM (Index-Sequential Access Method, IBM sredina 60-tih godina 20. veka) Nedostaci: sekvencijalno pretraživanje

More information

Rešavanje problema pomoću računara

Rešavanje problema pomoću računara Rešavanje problema pomoću računara Vladimir Filipović vladaf@matf.bg.ac.rs Softversko inženjerstvo Šta podrazumevamo pod softverskim inženjerstvom? vladaf@matf.bg.ac.rs 2/16 Konstrukcija prevodilaca Prevođenje

More information

CRNA GORA

CRNA GORA HOTEL PARK 4* POLOŽAJ: uz more u Boki kotorskoj, 12 km od Herceg-Novog. SADRŽAJI: 252 sobe, recepcija, bar, restoran, besplatno parkiralište, unutarnji i vanjski bazen s terasom za sunčanje, fitnes i SPA

More information

INTEGRISANO RAZVOJNO OKRUŽENJE VISUAL STUDIO 2013

INTEGRISANO RAZVOJNO OKRUŽENJE VISUAL STUDIO 2013 Dr Srđan Damjanović Dr Predrag Katanić INTEGRISANO RAZVOJNO OKRUŽENJE VISUAL STUDIO 2013 FAKULTET POSLOVNE EKONOMIJE BIJELJINA, 2017. INTEGRISANO RAZVOJNO OKRUŽENJE VISUAL STUDIO 2013 Autori: Prof. dr

More information

NIS PETROL. Uputstvo za deaktiviranje/aktiviranje stranice Veleprodajnog cenovnika na sajtu NIS Petrol-a

NIS PETROL. Uputstvo za deaktiviranje/aktiviranje stranice Veleprodajnog cenovnika na sajtu NIS Petrol-a NIS PETROL Uputstvo za deaktiviranje/aktiviranje stranice Veleprodajnog cenovnika na sajtu NIS Petrol-a Beograd, 2018. Copyright Belit Sadržaj Disable... 2 Komentar na PHP kod... 4 Prava pristupa... 6

More information

Mindomo online aplikacija za izradu umnih mapa

Mindomo online aplikacija za izradu umnih mapa Mindomo online aplikacija za izradu umnih mapa Mindomo je online aplikacija za izradu umnih mapa (vrsta dijagrama specifične forme koji prikazuje ideje ili razmišljanja na svojevrstan način) koja omogućuje

More information

Advertising on the Web

Advertising on the Web Advertising on the Web On-line algoritmi Off-line algoritam: ulazni podaci su dostupni na početku, algoritam može pristupati podacima u bilo kom redosljedu, na kraju se saopštava rezultat obrade On-line

More information

DEFINISANJE TURISTIČKE TRAŽNJE

DEFINISANJE TURISTIČKE TRAŽNJE DEFINISANJE TURISTIČKE TRAŽNJE Tražnja se može definisati kao spremnost kupaca da pri različitom nivou cena kupuju različite količine jedne robe na određenom tržištu i u određenom vremenu (Veselinović

More information

Programiranje III razred

Programiranje III razred Tehnička škola 9. maj Bačka Palanka Programiranje III razred Istorijat programskih jezika Programski jezici Programski jezici su veštački jezici koji se mogu koristiti za kontrolu ponašanja mašine, naročito

More information

Cloud kompjuting ačunarstvo u oblaku) Amijeve nove tehnologije. Računarstvo u oblaku

Cloud kompjuting ačunarstvo u oblaku) Amijeve nove tehnologije. Računarstvo u oblaku Cloud kompjuting (Ra ačunarstvo u oblaku) Cloud kompjuting - sadržaj Uvod... 4 Historija... 5 Slični sistemi i koncepti... 7 Karakteristike... 7 Pet osnovnih karakteristika... 9 Samousluga na zahtjev...

More information

Idejno rješenje: Dubrovnik Vizualni identitet kandidature Dubrovnika za Europsku prijestolnicu kulture 2020.

Idejno rješenje: Dubrovnik Vizualni identitet kandidature Dubrovnika za Europsku prijestolnicu kulture 2020. Idejno rješenje: Dubrovnik 2020. Vizualni identitet kandidature Dubrovnika za Europsku prijestolnicu kulture 2020. vizualni identitet kandidature dubrovnika za europsku prijestolnicu kulture 2020. visual

More information

Novica Nosović i Željko Jurić

Novica Nosović i Željko Jurić Novica Nosović i Željko Jurić OSNOVE RAČUNARSKIH ARHITEKTURA Naslov Osnove računarskih arhitektura Za izdavača Prof.dr.sc. Narcis Behlilović Recenzenti Prof.dr.sc. Slavko Marić, Univerzitet u Banja Luci,

More information

12.1 Print servis WEB servis 12.3 Terminal servis

12.1 Print servis WEB servis 12.3 Terminal servis XII Organizacija mrežnih usluga S A D R Ž A J 12.1 Print servis 12.1.1 Print server 12.1.2 Postupak štampanja 12.1.3 Elementi Print servisa 12.1.4 Print servis-fizičko okruženje 12.1.5 Strategija usluga

More information

Trening: Obzor financijsko izvještavanje i osnovne ugovorne obveze

Trening: Obzor financijsko izvještavanje i osnovne ugovorne obveze Trening: Obzor 2020. - financijsko izvještavanje i osnovne ugovorne obveze Ana Ključarić, Obzor 2020. nacionalna osoba za kontakt za financijska pitanja PROGRAM DOGAĐANJA (9:30-15:00) 9:30 10:00 Registracija

More information

Osn s ovn v i i k o k nce c p e ti oper e a r c a i c j i sk s i k h i s u s st s av a a Uvodna razmatranja

Osn s ovn v i i k o k nce c p e ti oper e a r c a i c j i sk s i k h i s u s st s av a a Uvodna razmatranja Osnovni koncepti operacijskih sustava Uvodna razmatranja Uvod Što je to: operacijski sustav? podrška izvođenju raznim primjenskim programima skup programa koji omogućuju provođenje radnih zahvata na računalu:

More information

3D GRAFIKA I ANIMACIJA

3D GRAFIKA I ANIMACIJA 1 3D GRAFIKA I ANIMACIJA Uvod u Flash CS3 Šta će se raditi? 2 Upoznavanje interfejsa Osnovne osobine Definisanje osnovnih entiteta Rad sa bojama Rad sa linijama Definisanje i podešavanje ispuna Pregled

More information

STRUKTURNO KABLIRANJE

STRUKTURNO KABLIRANJE STRUKTURNO KABLIRANJE Sistematski pristup kabliranju Kreiranje hijerarhijski organizirane kabelske infrastrukture Za strukturno kabliranje potrebno je ispuniti: Generalnost ožičenja Zasidenost radnog područja

More information

Nejednakosti s faktorijelima

Nejednakosti s faktorijelima Osječki matematički list 7007, 8 87 8 Nejedakosti s faktorijelima Ilija Ilišević Sažetak Opisae su tehike kako se mogu dokazati ejedakosti koje sadrže faktorijele Spomeute tehike su ilustrirae a izu zaimljivih

More information

ZBIRKA ZADATAKA IZ POSLOVNE INFORMATIKE

ZBIRKA ZADATAKA IZ POSLOVNE INFORMATIKE Dr Srđan Damjanović Predrag Katanić Borislav Drakul ZBIRKA ZADATAKA IZ POSLOVNE INFORMATIKE FAKULTET SPOLJNE TRGOVINE BIJELJINA, 2OO8. ZBIRKA ZADATAKA IZ POSLOVNE INFORMATIKE 2 Recenzent: Prof.dr Branko

More information

3. OPEARATIVNI SISTEMI

3. OPEARATIVNI SISTEMI 3. OPEARATIVNI SISTEMI Operativni sistem je uopšten poznat pojam asocirajući na programski paket koji omogućuje ispravan rad računarskog sitema. Uglavnom se pod računarski sistem podrazuemva desktop i

More information

РАЧУНАРСТВО И ИНФОРМАТИКА СКРИПТА

РАЧУНАРСТВО И ИНФОРМАТИКА СКРИПТА РАЧУНАРСТВО И ИНФОРМАТИКА СКРИПТА (без Паскала) аутор: Милош Кујовић Istorijat razvoja racunara U razvoju racunara su znacajna cetiri momenta Pamcenje rezultata Mehanizacija procesa racunanja Odvajanje

More information

MINISTRY OF THE SEA, TRANSPORT AND INFRASTRUCTURE

MINISTRY OF THE SEA, TRANSPORT AND INFRASTRUCTURE MINISTRY OF THE SEA, TRANSPORT AND INFRASTRUCTURE 3309 Pursuant to Article 1021 paragraph 3 subparagraph 5 of the Maritime Code ("Official Gazette" No. 181/04 and 76/07) the Minister of the Sea, Transport

More information

Uputstva za upotrebu štampača CITIZEN S310II

Uputstva za upotrebu štampača CITIZEN S310II Upravljanje sistemom COBISS Uputstva za upotrebu štampača CITIZEN S310II V1.0 VIF-NA-27-XX IZUM, 2015. COBISS, COMARC, COBIB, COLIB, IZUM su zaštićeni znaci u posedu javnog zavoda IZUM. SADRŽAJ 1 Uvod...

More information

Direktan link ka kursu:

Direktan link ka kursu: Alat Alice može da se preuzme sa sledeće adrese: www.alice.org Kratka video uputstva posvećena alatu Alice: https://youtu.be/eq120m-_4ua https://youtu.be/tkbucu71lfk Kurs (engleski) posvećen uvodu u Java

More information

Mobilno računarstvo. Mobilni uređaji i njihove karakteristike

Mobilno računarstvo. Mobilni uređaji i njihove karakteristike Mobilno računarstvo Mobilni uređaji i njihove karakteristike Poslednjih godina svedoci smo izuzetnog razvoja i popularnosti različitih vrsta mobilnih uređaja. Pod mobilnim uređajem u širem smislu podrazumeva

More information

UPUTSTVO. za ruter TP-LINK TD-854W/ TD-W8951NB

UPUTSTVO. za ruter TP-LINK TD-854W/ TD-W8951NB UPUTSTVO za ruter TP-LINK TD-854W/ TD-W8951NB Uputstvo za ruter TP-Link TD-854W / TD-W8951NB 2 PRAVILNO POVEZIVANJE ADSL RUTERA...4 PODEŠAVANJE KONEKCIJE PREKO MREŽNE KARTE ETHERNET-a...5 PODEŠAVANJE INTERNET

More information

TRENING I RAZVOJ VEŽBE 4 JELENA ANĐELKOVIĆ LABROVIĆ

TRENING I RAZVOJ VEŽBE 4 JELENA ANĐELKOVIĆ LABROVIĆ TRENING I RAZVOJ VEŽBE 4 JELENA ANĐELKOVIĆ LABROVIĆ DIZAJN TRENINGA Model trening procesa FAZA DIZAJNA CILJEVI TRENINGA Vrste ciljeva treninga 1. Ciljevi učesnika u treningu 2. Ciljevi učenja Opisuju željene

More information

Programiranje. Nastava: prof.dr.sc. Dražena Gašpar. Datum:

Programiranje. Nastava: prof.dr.sc. Dražena Gašpar. Datum: Programiranje Nastava: prof.dr.sc. Dražena Gašpar Datum: 21.03.2017. 1 Pripremiti za sljedeće predavanje Sljedeće predavanje: 21.03.2017. Napraviti program koji koristi sve tipove podataka, osnovne operatore

More information

TEHNIKA I INFORMATIKA U OBRAZOVANJU 3. Internacionalna Konferencija, Tehnički fakultet Čačak, 7 9. maj 2010.

TEHNIKA I INFORMATIKA U OBRAZOVANJU 3. Internacionalna Konferencija, Tehnički fakultet Čačak, 7 9. maj 2010. TEHNIKA I INFORMATIKA U OBRAZOVANJU 3. Internacionalna Konferencija, Tehnički fakultet Čačak, 7 9. maj 2010. TECHNICS AND INFORMATICS IN EDUCATION 3 rd International Conference, Technical Faculty Čačak,

More information

Informacijski sustav primarne zdravstvene zaštite Republike Hrvatske

Informacijski sustav primarne zdravstvene zaštite Republike Hrvatske 2/153 21-FAP 901 0481 Uhr Rev A Informacijski sustav primarne zdravstvene zaštite Republike Hrvatske Ispitni slučajevi ispitivanja prihvaćanja korisnika G1 sustava 2/153 21-FAP 901 0481 Uhr Rev A Sadržaj

More information

ENR 1.4 OPIS I KLASIFIKACIJA VAZDUŠNOG PROSTORA U KOME SE PRUŽAJU ATS USLUGE ENR 1.4 ATS AIRSPACE CLASSIFICATION AND DESCRIPTION

ENR 1.4 OPIS I KLASIFIKACIJA VAZDUŠNOG PROSTORA U KOME SE PRUŽAJU ATS USLUGE ENR 1.4 ATS AIRSPACE CLASSIFICATION AND DESCRIPTION VFR AIP Srbija / Crna Gora ENR 1.4 1 ENR 1.4 OPIS I KLASIFIKACIJA VAZDUŠNOG PROSTORA U KOME SE PRUŽAJU ATS USLUGE ENR 1.4 ATS AIRSPACE CLASSIFICATION AND DESCRIPTION 1. KLASIFIKACIJA VAZDUŠNOG PROSTORA

More information

Sl.1.Razvojna ploča-interfejs

Sl.1.Razvojna ploča-interfejs Nastavna jedinica: Praktični primeri upravljanja pomoću računara Predmet: Tehničko i informatičko obrazovanje Razred: VIII Tip časa: Obrada,Vežba Obrazovni cilj/ishod: Upravljanje raznim uređajima pomoću

More information

- Vežba 1 (dodatan materijal) - Kreiranje Web šablona (template) pomoću softvera Adobe Photoshop CS

- Vežba 1 (dodatan materijal) - Kreiranje Web šablona (template) pomoću softvera Adobe Photoshop CS - Vežba 1 (dodatan materijal) - Kreiranje Web šablona (template) pomoću softvera Adobe Photoshop CS 1. Pokrenite Adobe Photoshop CS i otvorite novi dokument sa komandom File / New 2. Otvoriće se dijalog

More information

VIŠEKORISNIČKA IGRA POGAĐANJA ZA OPERACIJSKI SUSTAV ANDROID

VIŠEKORISNIČKA IGRA POGAĐANJA ZA OPERACIJSKI SUSTAV ANDROID SVEUČ ILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA ZAVRŠNI RAD br. 5158 VIŠEKORISNIČKA IGRA POGAĐANJA ZA OPERACIJSKI SUSTAV ANDROID Lovro Pejić Zagreb, lipanj 2017. Hvala svima koji su bili

More information

DOSTAVUANJE PONUDA ZA WIMAX MONTENEGRO DOO PODGORICA

DOSTAVUANJE PONUDA ZA WIMAX MONTENEGRO DOO PODGORICA CRNA GORA (1}(02.17&r/4 Ver. O;:, fjr}/ ~ AGENCUA ZA ELEKTRONSKE KOM~~IKACUE J.O.O "\\ L\lax Montenegro" BrOJ o/-lj Podoor'ca.d:ioL 20/1g0d I POSTANSKU DEJATELNOST DOSTAVUANJE PONUDA ZA WIMAX MONTENEGRO

More information

Upotreba selektora. June 04

Upotreba selektora. June 04 Upotreba selektora programa KRONOS 1 Kronos sistem - razina 1 Podešavanje vremena LAMPEGGIANTI 1. Kada je pećnica uključena prvi put, ili u slučaju kvara ili prekida u napajanju, simbol SATA i odgovarajuća

More information

Pravljenje Screenshota. 1. Korak

Pravljenje Screenshota. 1. Korak Prvo i osnovno, da biste uspesno odradili ovaj tutorijal, morate imati instaliran GOM Player. Instalacija je vrlo jednostavna, i ovaj player u sebi sadrzi sve neophodne kodeke za pustanje video zapisa,

More information

Uvod u programske pakete

Uvod u programske pakete Predavanje 1 PROGRAMSKI PAKETI 2007/2008 Uvod u programske pakete Tajna privlačnosti kompjuterske tehnologije leži u programskom - korisničkom sadržaju. Programi su neizmerno bogatstvo ljudskog znanja

More information

RANI BOOKING TURSKA LJETO 2017

RANI BOOKING TURSKA LJETO 2017 PUTNIČKA AGENCIJA FIBULA AIR TRAVEL AGENCY D.O.O. UL. FERHADIJA 24; 71000 SARAJEVO; BIH TEL:033/232523; 033/570700; E-MAIL: INFO@FIBULA.BA; FIBULA@BIH.NET.BA; WEB: WWW.FIBULA.BA SUDSKI REGISTAR: UF/I-1769/02,

More information

PLAN RADA. 1. Počnimo sa primerom! 2. Kako i zašto? 3. Pejzaž višestruke upotrebe softvera 4. Frameworks 5. Proizvodne linije softvera 6.

PLAN RADA. 1. Počnimo sa primerom! 2. Kako i zašto? 3. Pejzaž višestruke upotrebe softvera 4. Frameworks 5. Proizvodne linije softvera 6. KOREKTAN PREVOD? - Reupotrebljiv softver? ( ne postoji prefiks RE u srpskom jeziku ) - Ponovo upotrebljiv softver? ( totalno bezveze ) - Upotrebljiv više puta? - Itd. PLAN RADA 1. Počnimo sa primerom!

More information

INTEGRACIJA MOBILNIH UREĐAJA U KORPORATIVNI SISTEM

INTEGRACIJA MOBILNIH UREĐAJA U KORPORATIVNI SISTEM ELEKTROTEHNIČKI FAKULTET UNIVERZITETA U BEOGRADU INTEGRACIJA MOBILNIH UREĐAJA U KORPORATIVNI SISTEM Master rad Kandidat: Mladen Steljić 2012/3260 Mentor: doc. dr Zoran Čiča Beograd, Septembar 2015. SADRŽAJ

More information

VxWORKS i VIŠEJEZGRENI PROCESORI

VxWORKS i VIŠEJEZGRENI PROCESORI VIŠE JEZGRENI PROCESORI I VxWorks SMP Multiprocesiranje je upotreba dva ili više procesora u sistemu u kojem procesori saraďuju i izmeďu sebe distribuiraju ukupni posao. Multiprocesiranje nije novo. Serveri,

More information

UPUTE ZA INSTALACIJU PROGRAMA FINBOLT 2007 tvrtke BOLTANO d.o.o.

UPUTE ZA INSTALACIJU PROGRAMA FINBOLT 2007 tvrtke BOLTANO d.o.o. UPUTE ZA INSTALACIJU PROGRAMA FINBOLT 2007 tvrtke BOLTANO d.o.o. Šta je potrebno za ispravan rad programa? Da bi program FINBOLT 2007 ispravno i kvalitetno izvršavao zadaću koja je postavljena pred njega

More information

WELLNESS & SPA YOUR SERENITY IS OUR PRIORITY. VAŠ MIR JE NAŠ PRIORITET!

WELLNESS & SPA YOUR SERENITY IS OUR PRIORITY. VAŠ MIR JE NAŠ PRIORITET! WELLNESS & SPA YOUR SERENITY IS OUR PRIORITY. VAŠ MIR JE NAŠ PRIORITET! WELLNESS & SPA DNEVNA KARTA DAILY TICKET 35 BAM / 3h / person RADNO VRIJEME OPENING HOURS 08:00-21:00 Besplatno za djecu do 6 godina

More information

PODRŠKA ZA PROFA JLIRANJE SOFTVERA UREÐA JA SA UGRAÐENIM RAČUNAROM

PODRŠKA ZA PROFA JLIRANJE SOFTVERA UREÐA JA SA UGRAÐENIM RAČUNAROM UNIVERZITET U BEOGRADU MATEMATIČKI FAKULTET Nikola B. Prica PODRŠKA ZA PROFA JLIRANJE SOFTVERA UREÐA JA SA UGRAÐENIM RAČUNAROM master rad Beograd, 2018. Mentor: dr Milena Vujošević Janičić, docent Univerzitet

More information

UNIVERZITET U BEOGRADU RUDARSKO GEOLOŠKI FAKULTET DEPARTMAN ZA HIDROGEOLOGIJU ZBORNIK RADOVA. ZLATIBOR maj godine

UNIVERZITET U BEOGRADU RUDARSKO GEOLOŠKI FAKULTET DEPARTMAN ZA HIDROGEOLOGIJU ZBORNIK RADOVA. ZLATIBOR maj godine UNIVERZITETUBEOGRADU RUDARSKOGEOLOŠKIFAKULTET DEPARTMANZAHIDROGEOLOGIJU ZBORNIKRADOVA ZLATIBOR 1720.maj2012.godine XIVSRPSKISIMPOZIJUMOHIDROGEOLOGIJI ZBORNIKRADOVA IZDAVA: ZAIZDAVAA: TEHNIKIUREDNICI: TIRAŽ:

More information

Prvi koraci u razvoju bankarskog on-line sistema u Japanu napravljeni su sredinom 60-tih godina prošlog veka i to najpre za on-line, real-time obradu

Prvi koraci u razvoju bankarskog on-line sistema u Japanu napravljeni su sredinom 60-tih godina prošlog veka i to najpre za on-line, real-time obradu JAPAN Japan, kao zemlja napredne tehnologije, elektronike i telekomunikacija, je zemlja koja je u samom svetskom vrhu po razvoju i usavršavanju bankarskog poslovanja i spada među vodećim zemljama sveta

More information

Kako instalirati Apache/PHP/MySQL na lokalnom kompjuteru pod Windowsima

Kako instalirati Apache/PHP/MySQL na lokalnom kompjuteru pod Windowsima Kako instalirati Apache/PHP/MySQL na lokalnom kompjuteru pod Windowsima 1. Uvod 2. Preuzimanje programa i stvaranje mapa 3. Instalacija Apachea 4. Konfiguracija Apachea 5. Instalacija PHP-a 6. Konfiguracija

More information

Upravljanje kvalitetom usluga. doc.dr.sc. Ines Dužević

Upravljanje kvalitetom usluga. doc.dr.sc. Ines Dužević Upravljanje kvalitetom usluga doc.dr.sc. Ines Dužević Specifičnosti usluga Odnos prema korisnicima U prosjeku, lojalan korisnik vrijedi deset puta više nego što je vrijedio u trenutku prve kupnje. Koncept

More information

TEHNOLOGIJA, INFORMATIKA I OBRAZOVANJE ZA DRUŠTVO UČENJA I ZNANJA 6. Međunarodni Simpozijum, Tehnički fakultet Čačak, 3 5. jun 2011.

TEHNOLOGIJA, INFORMATIKA I OBRAZOVANJE ZA DRUŠTVO UČENJA I ZNANJA 6. Međunarodni Simpozijum, Tehnički fakultet Čačak, 3 5. jun 2011. TEHNOLOGIJA, INFORMATIKA I OBRAZOVANJE ZA DRUŠTVO UČENJA I ZNANJA 6. Međunarodni Simpozijum, Tehnički fakultet Čačak, 3 5. jun 2011. TECHNOLOGY, INFORMATICS AND EDUCATION FOR LEARNING AND KNOWLEDGE SOCIETY

More information

DIPLOMSKI RAD iz predmetа Razvoj veb aplikacija

DIPLOMSKI RAD iz predmetа Razvoj veb aplikacija UNIVERZITET U NOVOM PAZARU DEPARTMAN ZA RAČUNARSKE NAUKE STUDIJSKI PROGRAM: INFORMATIKA DIPLOMSKI RAD iz predmetа Razvoj veb aplikacija Mentor: Dr Muzafer Saračević, docent Student: Ervin Pepić Br. indeksа:

More information

Iz predmeta " Osnovi kompjuterske tehnologije Hardver (mikro)procesor operativna (radna) memorija spoljna (masovna, diskovna) memorija Softver

Iz predmeta  Osnovi kompjuterske tehnologije Hardver (mikro)procesor operativna (radna) memorija spoljna (masovna, diskovna) memorija Softver Iz predmeta "Osnovi kompjuterske tehnologije" Računarski sistem kao svoju glavnu ulogu ima obradu (procesiranje) podataka. Da bi svoj zadatak uspešno izvršio, računarski sistem se sastoji od dve grupe

More information

APLIKACIJA ZA ŠIFROVANJE FAJLOVA NA WEB-U

APLIKACIJA ZA ŠIFROVANJE FAJLOVA NA WEB-U Departman za poslediplomske studije SAVREMENE INFORMACIONE TEHNOLOGIJE MASTER STUDIJE - Master rad - APLIKACIJA ZA ŠIFROVANJE FAJLOVA NA WEB-U Mentor: Prof.dr. Mladen Veinović Kandidat: Nebojša Asenijević

More information

1. Prelazak sa RISC na CISC koncept

1. Prelazak sa RISC na CISC koncept 1. Prelazak sa RISC na CISC koncept Zadnjih 25 godina prelazak sa CISC na RISC koncept doveo je do radikalnih promena kod ISA (Instruction Set Architecture). U cilju boljeg sagledavanja ove problematike

More information

СТРУКТУРА СТАНДАРДА СИСТЕМАМЕНАЏМЕНТАКВАЛИТЕТОМ

СТРУКТУРА СТАНДАРДА СИСТЕМАМЕНАЏМЕНТАКВАЛИТЕТОМ 1 СТРУКТУРА СТАНДАРДА СИСТЕМАМЕНАЏМЕНТАКВАЛИТЕТОМ 2 ПРИНЦИПИ МЕНАЏМЕНТА КВАЛИТЕТОМ 3 ПРИНЦИПИ МЕНАЏМЕНТА КВАЛИТЕТОМ 4 ПРИНЦИПИ МЕНАЏМЕНТА КВАЛИТЕТОМ Edwards Deming Не морате то чинити, преживљавање фирми

More information

Prikaz korištenja HMI i PLC u upravljanju tehnološkim procesima

Prikaz korištenja HMI i PLC u upravljanju tehnološkim procesima INFOTEH-JAHORINA Vol. 12, March 2013. Prikaz korištenja HMI i PLC u upravljanju tehnološkim procesima Olivera Janković ORAO a.d. Bijeljina, BiH janolja@yahoo.com Ratko Janković Bijeljina, BiH jratko@yahoo.com

More information

SVEUČILIŠTE U ZAGREBU FAKULTET PROMETNIH ZNANOSTI RAČUNALSTVO. Edouard Ivanjko, Mario Muštra. Zagreb, 2016.

SVEUČILIŠTE U ZAGREBU FAKULTET PROMETNIH ZNANOSTI RAČUNALSTVO. Edouard Ivanjko, Mario Muštra. Zagreb, 2016. SVEUČILIŠTE U ZAGREBU FAKULTET PROMETNIH ZNANOSTI RAČUNALSTVO Edouard Ivanjko, Mario Muštra Zagreb, 2016. Ovu skriptu posvećujemo svim ljudima željnih stalnog usavršavanja i napredovanja u životu. Zahvala

More information

Mogudnosti za prilagođavanje

Mogudnosti za prilagođavanje Mogudnosti za prilagođavanje Shaun Martin World Wildlife Fund, Inc. 2012 All rights reserved. Mogudnosti za prilagođavanje Za koje ste primere aktivnosti prilagođavanja čuli, pročitali, ili iskusili? Mogudnosti

More information

Dr Smiljan Vukanović, dis

Dr Smiljan Vukanović, dis NAPREDNI SISTEMI UPRAVLJANJA SAOBRAĆAJEM SVETLOSNIM SIGNALIMA SU DEO ITS-A. DA ILI NE? ADVANCED TRAFFIC SIGNAL CONTROL SYSTEMS ARE A PART OF ITS. YES OR NO? Dr Smiljan Vukanović, dis Rezultat rada na projektu

More information

5.2.4 Podržani štampači Podržani skeneri Modeli licenciranja BusinessWare softvera BusinessWare Enterprise

5.2.4 Podržani štampači Podržani skeneri Modeli licenciranja BusinessWare softvera BusinessWare Enterprise Sadržaj 1 Program za kurs BusinessWare Administrator...5 2 Pogrlavlje...6 2.1 Hardverske osnove računara...6 2.1.1 Tipovi računara (PC, Apple Mac...)...6 2.1.2 Ulazne jedinice...6 2.1.3 Izlazne jedinice...7

More information

Cvija. Skripta za prvi deo(teorija+urađeni zadaci) 1.14.Slika 1.9

Cvija. Skripta za prvi deo(teorija+urađeni zadaci) 1.14.Slika 1.9 1.1.Osnovna podela ili klasifikacija softvera ja na aplikativni i sistemski. 1.2.Aplikativni softver se projektuje za rešavanje konkretnih problema,kao sto su na primer:placanje preko Interneta, rezervacija

More information

FAKULTET ZA POSLOVNU INFORMATIKU

FAKULTET ZA POSLOVNU INFORMATIKU FAKULTET ZA POSLOVNU INFORMATIKU Prof. dr Mladen Veinović Igor Franc Aleksandar Jevremović BAZE PODATAKA - PRAKTIKUM - Prvo izdanje Beograd 2006. Autori: Prof. dr Mladen Veinović Igor Franc Aleksandar

More information

KABUPLAST, AGROPLAST, AGROSIL 2500

KABUPLAST, AGROPLAST, AGROSIL 2500 KABUPLAST, AGROPLAST, AGROSIL 2500 kabuplast - dvoslojne rebraste cijevi iz polietilena visoke gustoće (PEHD) za kabelsku zaštitu - proizvedene u skladu sa ÖVE/ÖNORM EN 61386-24:2011 - stijenka izvana

More information

Da bi se napravio izvještaj u Accessu potrebno je na izborniku Create odabrati karticu naredbi Reports.

Da bi se napravio izvještaj u Accessu potrebno je na izborniku Create odabrati karticu naredbi Reports. IZVJEŠTAJI U MICROSOFT ACCESS-u (eng. reports) su dijelovi baze podataka koji omogućavaju definiranje i opisivanje načina ispisa podataka iz baze podataka na papir (ili PDF dokument). Način izrade identičan

More information

Osigurajte si bolji uvid u poslovanje

Osigurajte si bolji uvid u poslovanje Osigurajte si bolji uvid u poslovanje Mario Jurić Megatrend poslovna rješenja d.o.o. 1 / 23 Megatrend poslovna rješenja 25 + godina na IT tržištu 40 M kn prihoda 50 zaposlenih 60% usluge Zagreb i Split

More information