Ispit 1.(3) Šta označava termin multiprogramiranje, a šta termin multiprocesiranje? 2.(3) Korišćenjem funkcija setjmp() i longjmp() iz standardne C biblioteke, realizovati operaciju yield(jmp_buf old, jmp_buf new) koja čuva kontekst niti čiji je jmp_buf dat kao prvi argument, oduzima joj procesor i restaurira kontekst niti čiji je jmp_buf dat kao drugi argument, kojoj predaje procesor. 3.(3) Na programskom jeziku Java implementirati nit (thread) koja izvršava praznu petlju sve dok joj se pozivom operacije ne kaže da stane. Napisati i kod koji pravi i pokreće N takvih uporednih niti. 4.(3) Korišćenjem standardnih brojačkih semafora napisati kod za uslovnu sinhronizaciju dva uporedna procesa od kojih jedan ispunjava neki logički uslov, a drugi ne sme da prođe određenu tačku ako taj uslov nije ispunjen. 5.(3) Ako tokom svog prvog prolaza linker u svojoj tabeli pronađe prethodno definisan simbol koji je definisan u tekućem fajlu (izvozi se), da li će prijaviti grešku? Obrazložiti. 6.(3) Šta je interna fragmentacija kod alokacije memorije? Da li je ona moguća kod kontinualne alokacije memorije? 7.(3) U nekom sistemu sa straničnom organizacijom virtuelne memorije virtuelna adresa je 64-bitna. Posmatraju se dva (teorijska) granična slučaja: a) neki proces koristi ceo svoj virtuelni prostor; b) neki proces koristi samo nekoliko susednih stranica svog virtuelnog prostora. Koji pristup organizacije PMT zauzima manje memorije za PMT za svaki od ova dva slučaja: PMT organizovana u jednom nivou (linearno) ili PMT organizovana u više nivoa? Kratko obrazložiti. 8.(3) Kojom tehnikom se može blokovski orijentisani ulazni uređaj koristiti kao znakovno orijentisani ulazni tok? Kratko objasniti kako. 9.(3) Neki proces izvršava redom sledeće sistemske pozive. Pod pretpostavkom da korisnik u čije ime se izvršava ovaj proces ima pravo pristupa do oba fajla i na čitanje i na upis, i da oba poziva za otvaranje fajlova uspevaju, navesti koji od preostalih poziva će biti uspešan, a koji neuspešan (upisati na liniji pored poziva). FHANDLE f1 = fopen(“x.doc”,read); FHANDLE f2 = fopen(“y.doc”,read|write); fread(f1,buffer1,n1);
_____________
fwrite(f1,buffer2,n2);
_____________
fread(f2,buffer1,n1);
_____________
fwrite(f2,buffer2,n2);
____________
1/91
10.(3) Predložiti i ukratko objasniti neki način vođenja evidencije slobodnih blokova na disku koji ne koristi nikakav dodatni prostor za tu evidenciju (osim tih slobodnih blokova). 1.(3) Ukratko objasniti osnovni motiv nastanka koncepta raspodele vremena (time sharing). 2.(3) Objasniti semantiku mašinske instrukcije test & set i način njene upotrebe za međusobno isključenje kritičnih sekcija kod miltiprocesorskih sistema. 3.(3) Na jeziku C, korišćenjem sistemskih poziva fork() i execlp() za Unix, napisati program koji pokreće drugi program iz fajla čiji je naziv zadat kao parametar komandne linije prvog programa. 4.(3) Napisati kod jednog od dva procesa sa međusobnim isključenjem kritične sekcije korišćenjem Petersonovog rešenja. 5.(3) Zašto preklopi (overlays) ne mogu da se koriste ako program ima više niti koje obezbeđuje operativni sistem? Precizno objasniti. 6.(3) Potrebno je u nekoj strukturi podataka voditi evidenciju o slobodnim fragmentima memorije kod kontinualne alokacije sa best fit algoritmom. Koja struktura podataka je efikasnija za implementaciju operacije dealokacije segmenta memorije koju je zauzimao ugašeni proces: a) dvostruko ulančana lista slobodnih fragmenata uređenih po veličini ili b) dvostruko ulančana lista slobodnih fragmenata uređenih po poziciji u memoriji? Kratko obrazložiti. 7.(3) U nekom sistemu sa straničnom organizacijom virtuelne memorije virtuelna i fizička adresa su 32-bitne, adresibilna jedinica je bajt, a stranica je veličine 64 KB. PMT je organizovana u dva nivoa i jedan ulaz u PMT oba nivoa zauzima po jednu 32-bitnu reč. PMT oba nivoa su iste veličine. Koliko ukupno zauzimaju PMT za proces koji je alocirao samo svoju prvu i poslednju stranicu? Odgovor: _________________________ 8.(3) Kojom tehnikom se nedeljivi uređaj može učiniti virtuelno deljivim? Odgovor: _________________________ 9.(3) U fajl podsistemu nekog operativnog sistema nema koncepta kurzora (pokazivača) trenutne lokacije za čitanje i upis sadržaja u fajl. Čime se može nadomestiti ovaj nedostatak u sistemskim pozivima za čitanje i upis u fajl? Precizno objasniti i ilustrovati potpisom funkcija za ove pozive. 10.(3) Neki fajl sistem koristi indeksirani pristup alokaciji fajlova sa indeksima u dva nivoa, blokom veličine 512B i 32-bitnim adresama fizičkih blokova. Kolika je maksimalna veličina sadržaja fajla u ovom sistemu? 1.(3) Šta je bio osnovni motiv za uvođenje raspodele vremena (engl. timesharing) kod interaktivnih sistema? Objasniti.
2/91
2.(3) Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati prevod sledeće rekurzivne funkcije: int fib (int n) { if (n<=1) return 1; else return fib(n-1)+fib(n-2); } 3.(3) Ukoliko su svi sistemski pozivi izvršeni uspešno, koliko procesa se ukupno kreira kada se nad sledećim programom kreira jedan proces (računajući i taj jedan)? void main () { for (int i=0; i<7; i++) if (fork()==0) return; } Odgovor: __________________________ 4.(3) Korišćenjem standardnih brojačkih semafora napisati kod tri uporedna procesa koji sarađuju na sledeći način. Proces A upisuje jednu vrednost u deljenu promenljivu x, a nezavisni proces B uporedo upisuje jednu vrednost u deljenu promenljivu y. Proces C potom čita x i y da bi izračunao njihov zbir. Tek kada je C pročitao vrednost x, proces A upisuje novu vrednost u x; tek kada je C pročitao vrednost y, proces B upisuje novu vrednost u y, i tako ciklično. 5.(3) Neki program koristi dve velike strukture podataka naizmenično: najpre za neku složenu obradu koristi samo prvu strukturu, pa onda za neku drugu obradu koristi samo drugu strukturu, pa onda ponovo prvu, pa drugu itd. Ako se ove dve strukture učitavaju dinamički i preklapaju se (kod korišćenja preklopa, overlays), u kom slučaju će izvršavanje tog programa trajati duže, a u kom će koristiti više memorije: kada se koristi samo dinamičko učitavanje, ili kada se koriste preklopi? Kratko obrazložiti. 6.(3) Neki sistem primenjuje kontinualnu alokaciju memorije. Kakva je hardverska podrška potrebna za ovaj pristup da bi se obezbedila: a) relokatibilnost procesa, b) zaštita memorijskog prostora jednog procesa od drugih procesa? 7.(3) Učestanost pogotka u TLB je 90%, a PMT je organizovana u tri nivoa. TLB je 10 puta brža nego operativna memorija. Za koliko procenata je efektivan pristup memoriji sporiji od pristupa fizičkoj memoriji? Odgovor: ________________ 8.(3) Navesti osnovne operacije klase znakovno-orijentisanih ulazno/izlaznih uređaja (tokova). 9.(3) Neki fajl sistem pruža sledeće operacije u svom API za tekstualne fajlove:
3/91
int size(FHANDLE) Vraća trenutnu veličinu sadržaja fajla u znakovima. void append(FHANDLE,int) Proširuje sadržaj fajla za dati broj znakova na kraju. void seek(FHANDLE,int) Postavlja kurzor datog fajla na datu poziciju (redni broj znaka počev od 0). void write(FHANDLE,char*,int size) Na poziciju kurzora datog fajla upisuje dati niz znakova zadate dužine, i pomera kurzor iza upisanog niza znakova.
Operacije seek i write rade samo u opsegu trenutne veličine sadržaja fajla (ne pomeraju kurzor i ne upisuju iza kraja sadržaja fajla). Napisati operaciju write(FHANDLE,int position,char*,int size); koja na zadatu poziciju upisuje zadati niz znakova date veličine, pri čemu se fajl implicitno najpre proširuje na potrebnu veličinu ukoliko bi zadata pozicija ili zadati upis prekoračio trenutnu veličinu sadržaja fajla. Zanemariti sve moguće greške u ulazu/izlazu. 10.(3) Objasniti kako se u fajl sistemu tipa FAT vodi evidencija o slobnom prostoru. 1.(3) Šta je multiprocesorski, a šta distribuirani računarski sistem? 2.(3) Na asembleru nekog zamišljenog dvoadresnog RISC procesora sa load/store arhitekturom napisati prevod sledeće rekurzivne C funkcije: int f (int n) { if (n<=1) return 1; else return f(n-1)+f(n-2); } 3.(3) Korišćenjem školskog jezgra napisati kod koji omogućava da se kreira nit sa celobrojnim parametrom n. Ako je n manje ili jednako 0, ova nit samo ispisuje pozdravnu poruku i završava se. U suprotnom, ova nit će (rekurzivno) kreirati istu takvu nit, ali sa parametrom n-1. 4.(3) Navesti koja su to dva osnovna modela (paradigme) međuprocesne komunikacije. Odgovor: ________________________________________________________________ 5.(3) Navesti bar jednu razliku u načinu funkcionisanja linkera kada kao svoj rezultat pravi .exe i kada pravi .lib. 6.(3) Koja dva parametra procesa čine sastavni deo njegovog memorijskog konteksta, a koristi ih hardver pri preslikavanju adresa kod kontinualne alokacije memorije? Ukratko objasniti njihovo značenje. 7.(3) Virtuelna memorija organizovana je stranično, sa straničenjem u tri nivoa. Vreme pristupa operativnoj memoriji je 50 ns, a TLB-u 10 ns. Procenat pogotka u TLB je 90%. Koliko je efektivno vreme pristupa memoriji?
4/91
8.(3) Navesti bar tri vrste usluga vezanih za realno vreme koje uobičajeno nude operativni sistemi. 9.(3) Izvod iz jednog uputstva za Unix fajl sistem i dodelu prava pristupa fajlu iz komandne linije: To change the mode of a file, use the chmod command. The general form is chmod X@Y file1 file2 ... where: X is any combination of the letters 'u' (for owner), 'g' (for group), 'o' (for others), 'a' (for all; that is, for 'ugo'); @ is either '+' to add permissions, '-' to remove permissions, or '=' to assign permissions absolutely; and Y is any combination of 'r', 'w', 'x'. Na primer, komanda chmod u=rx file daje vlasniku prava rx, ali ne i pravo w. Napisati komande koje za dati fajl postavljaju prava na sledeći način: a) grupi i ostalima dodaju prava na rw, ali ne i na x: _______________________________ b) svima oduzimaju pravo na upis: _____________________________________________ 10.(3) Neki fajl sistem podržava kombinovano indeksiran pristup alokaciji fajlova, pri čemu FCB sadrži 512 ulaza sa direktnim indeksom (sadrže brojeve blokova za podatke). Ako sadržaj fajla preraste veličinu koju podržava ovaj indeks nultog nivoa, za blokove preko te veličine postoji indeks prvog nivoa sa 512 ulaza u FCB; svaki od tih ulaza sadrži pokazivač na indeks drugog nivoa u kome je po 512 ulaza sa pokazivačima na blokove sa sadržajem. Koliki je maksimalni kapacitet fajla u blokovima? (Odgovor dati kao izraz.) Odgovor: __________________________ 1.(3) Ukratko objasniti zna č enje pojmova multiprogramiranje i multiprocesiranje. 2.(3) Korišć enjem standardnih bibliote č nih funkcija setjmp() i longjmp() implementirati funkciju void yield(jmp_buf old, jmp_buf new) koja vrši promenu konteksta procesora. 3.(3) Korišć enjem niti u školskom jezgru (klasa Thread) napisati kod koji konkurentno i rekurzivno obilazi binarno stablo tako što teku ć a nit nastavlja da obilazi levo podstablo, a kreira novu nit koja će obić i desno podstablo. Struktura Node {Node *left, *right} predstavlja č vor stabla. 4.(3) Korišć enjem standardnih broja č kih semafora napisati kod za kontrolu kriti č ne sekcije koju uporedo sme da izvršava najviše N procesa. 5.(3) Šta je osnovni razlog toga (osnovni problem koji se rešava time) što linker svoj posao obavlja u dva prolaza? Precizno i kratko objasniti. 6.(3) Objasniti kako se kod kontinua lne alokacije memorije obezbeđuje zaštita memorijskog prostora drugih procesa od ilega lnog adresiranja jednog procesa.
5/91
7.(3) U nekom sistemu sa strani č nom organizacijom virtuelne memorije virtuelna i fizi č ka adresa su 32-bitne, adresibilna jedinica je bajt, a stranica je velič ine 64 KB. PMT je organizovana u dva nivoa i jedan ulaz u PMT oba ni voa zauzima po jednu 32-bitnu reč . PMT oba nivoa su iste veli čine. Koliko ukupno zauzimaju PMT za proc es koji je alocirao samo svoju prvu i poslednju stranicu? 8.(3) Ukratko objasniti tehniku dvostrukog baferisanja. 9.(3) Neki fajl sistem koristi dve vrste klju č eva za fajlove, deljene i ekskluzivne, i fajlove zaklju č ava prilikom otvaranja fajla, u zavisnosti od najavljenog na č ina koriš ć enja fajla. Procesi A, B, C i D izvršavaju sistemske pozive otvaranja i zatvaranja istog fajla u slede ćem redosledu (neki proces izvršava poziv zatvaranja fajl a samo ako ga je uspešno otvorio): 1) A: open(READ), 2) B: open( WRITE), 3) C: open(READ), 4) A: close, 5) C: close, 6) D: open(WRITE). Koje od ovih operacija ć e se izvršiti uspešno, a koje neuspešno? 10.(3) Koliko pristupa blokovima na di sku treba izvršiti za pristup n-tom logi č kom bloku sadržaja fajla ako je alokacija fajla a) indeksna, pri čemu je indeks fajla uvek u dva nivoa, a na blok sa indeksom prvog nivoa ukazuje polje u FCB, b) ulan č ana lista, pri č emu je glava liste u FCB? FCB fajla je u memoriji. 1.(3) Koje od navedenih karakteristika imaju savremeni operativni sistemi opšte namene za personalne računare? a) interaktivni
b) monoprogramski
e) multiprocesni
f) višekorisnički
c) multiprogramski d) monoprocesni
2.(3) Koje od sledećih radnji operativni sistem vrši prilikom promene konteksta niti? a) promena sadržaja PC i SP b) promena sadržaja ostalih programski dostupnih registara c) promena sadržaja registra PMTP d) brisanje TLB e) promena sadržaja IVT 3.(3) Korišćenjem Unix sistemskih poziva fork() i execv() napisati program run koji kreira proces nad programom koji je zadat kao prvi argument programa run i prosleđuje mu sve preostale argumente. Na primer, komanda run myprog a1 a2 a3 kreira proces nad programom myprog sa argumentima a1, a2, a3. Sistemski poziv execv u argumentu argv prima argumente iz komandne linije koji će proslediti imenovanom programu preko argumenta argv funkcije main; poslednji element ovog niza treba da bude null (kao što je uobičajeno, argument argv[0] treba da sadrži naziv programa, odnosno prvi string iz komandne linije): int execv(char const *file, char const *argv[]); 4.(3) Napisati kod ograničenog bafera korišćenjem brojačkih semafora.
6/91
5.(3) Ukoliko se dati parametri izvršavanja istog programa koji je na isti način podeljen na module koji se mogu dinamički učitavati razlikuju značajno, upisati + u polje one tehnike koja ima veći dati parametar: Parametar Dinamičko učitavanje Preklopi (overlays) Veće vreme izvršavanja Veće zauzeće memorije 6.(3) U nekom sistemu primenjuje se segmentna organizacija memorije. Dati su podaci za nekoliko segmenata i po jedna operacija nad virtuelnom adresom u tom segmentu (R – čitanje, W - upis, broj označava pomeraj unutar segmenta). U poslednju kolonu tabele upisati: fizičku adresu ukoliko su i operacija i pomeraj ispravni (dozvoljeni), X ukoliko je operacija nedozvoljena, a L ukoliko je virtuelna adresa nedozvoljena. Sve vrednosti su heksadecimalne. Segment 1 2 3 4
Base address 2A402 5F00 8D50 A0F0
Limit
RWX
Operation
F00 F10 E45 F10
100 100 110 110
R: E70 W: E70 W: E70 W: E70
Result
7.(3) Virtuelna memorija organizovana je stranično, a adresibilna jedinica je bajt. Virtuelna adresa je 32-bitna, stranica je veličine 16KB, deskriptor stranice je 32bitni, a PMT je organizovana u dva nivoa, pri čemu je polje za straničenje prvog nivoa veličine 8 bita. Koliki prostor bi ukupno zauzimala PMT nekog procesa kada bi: a) proces koristio ceo svoj virtuelni adresni prostor? Odgovor: ________________ b) proces koristio samo dve stranice, prvu i poslednju u adr. prostoru? Odgovor: _______________ 8.(3) U nekom sistemu postoje sledeći sistemski pozivi: int async_write (char* buffer); void wait (int request_id); Operacija async_write asinhrono zadaje operaciju izlaza datog niza znakova na neki izlazni uređaj i vraća interni sistemski identifikator tog zahteva (veći od 0), odnosno kod greške (manji od nula). Operacija wait suspenduje pozivajući proces sve dok operacija sa datim identifikatorom nije završena. Korišćenjem ovih sistemskih poziva, realizovati sinhroni izlaz: int sync_write (char* buffer); 9.(3) Šta znači termin „presna particija“ (raw partition)? 10.(3) Neki fajl sistem koristi FAT za alokaciju fajlova. FAT je keširana u memoriji u nizu fat čiji su elementi tipa int. Vrednost 0 u elementu ovog niza znači null (blok broj 0 na disku se ne koristi za fajlove). U strukturi FCB polje firstBlock tipa int sadrži indeks prvog logičkog bloka sa sadržajem fajla. Implementirati
7/91
funkciju getBlockNo() koja vraća broj bloka na disku u kome je alociran traženi logički blok datog fajla. U slučaju greške vratiti -1. int getBlockNo(FCB* fcb, int logicalBlockNo); 1.(3) Koja je razlika između multiprocesorskih i distribuiranih rač unarskih sistema? 2.(3) Korišć enjem operacije yield(jmp_buf old, jmp_buf new) koja č uva kontekst niti č iji je jmp_buf dat kao prvi argument, oduzima joj procesor i restaurira kontekst niti č iji je jmp_buf dat kao drugi argument, kojoj predaje procesor, realizovati operaciju Semaphore::wait() u školskom jezgru. 3.(3) Koja je razlika između (teškog) procesa i niti (thread )? 4.(3) Korišć enjem standardnih brojačkih semafora, napisati kod za inicijalizaciju i potrebnu sinhronizaciju kriti č ne sekcije u koju može u ć i najviše N uporednih procesa. 5.(3) Ako tokom svog prvog prolaza li nker u svojoj tabeli ne prona đe simbol koji je definisan u teku ćem fajlu (izvozi se), da li ć e prijaviti grešku? Obrazložiti. 6.(3) Koja je razlika između best fit i worst fit algoritma kontinualne alokacije memorije? 7.(3) U nekom sistemu sa virtuelnom memorijom broj stranice u virtue lnoj adresi je velič ine 48 bita. Da bi č uvanje PMT u činio izvodljivim, sistem koristi hash tabelu sa 64K ulaza za smešanje PMT svakog procesa. Hash funkcija je prosta modulo funkcija: ulaz u tabelu odre đuje se pomo ć u 16 najnižih bita broja stranice. U svakom ulazu hash tabele nalazi se 64-bitna glava ulan č ane liste zapisa za alocirane stranice koje se preslikavaju u ta j ulaz. Svaki zapis sadrži viših 32 bita broja stranice, broj okvira u koj i je ta stranica preslikana (32 bita, vrednost 0 označ ava da stranica ne može da se preslika) i pokazivač na slede ć i zapis (64 bita, vrednost 0 ozna č ava kraj liste). Neki proces je alocirao 256 najnižih i 256 najviš ih stranica svog virt uelnog adresnog prostora. Koliko prostora (u bajtovima) ukupno zauzima PMT ovog procesa? Odgovor: ___________ 8.(3) U nekom sistemu podržan je samo asinhroni izlaz na izlazni ure đaj pomoću slede ć e funkcije IOReqID output (IODevID deviceID, IOReq* request); koja zadaje (asinhrono) izlaznu operaciju specifikovanu drugim argumentom na uređaju identifikovanom prvim argumento m. Ova funkcija odmah vrać a kontrolu pozivaocu, uz identifikaciju zadate operacije (rezultat tipa IOReqID je ve ć i od 0 u slu č aju ispravno zadatog zahteva). Funkcija void ioWait (IOReqID); blokira pozivajući proces sve dok operacija identifikovana argumentom nije završena u potpunosti. Pomoću ovih funkcija realizovati funkciju koja, u odnos u na jedan argument, može zadati operaciju sinhrono ili asinhrono, prema želji pozivaoca. 9.(3) Šta označ ava skraćenica FTP? Ukratko objasniti čemu služi ovaj protokol.
8/91
10.(3) Koja metoda alokacije fajlova je efikasnija za direktni pristup, ulanč ana ili indeksirana i zašto? 1.(3) Šta je bio osnovni motiv za uvođenje multiprogramiranja u računarske sisteme? 2.(3) Korišćenjem standardnih bibliotečnih operacija setjmp i longjmp, implementirati operaciju wait na binarnom semaforu koji je realizovan klasom Event poput one u školskom jezgru. 3.(3) Na jeziku C, korišćenjem sistemskog poziva fork() za Unix, napisati program koji prihvata celobrojni argument n i koji, kada se nad njim pokrene proces, pokreće jedan proces-dete i završava se, ovaj proces-dete pokreće svoje dete, itd, tako da ukupno bude n procesa u relaciji roditelj-dete (n „generacija“). 4.(3) Korišćenjem standardnih brojačkih semafora u školskom jezgru, na jeziku C++ napisati kod za ograničeni bafer (bounded buffer). 5.(3) Koja je osnovna razlika između tehnika dinamičkog učitavanja i preklopa (overlays)? 6.(3) Ko i kada upisuje vrednosti u registar bazne adrese i registar ograničenja procesora kod kontinualne alokacije memorije? Ukratko objasniti svrhu ovih registara. 7.(3) Primenom tehnike copy-on-write kod virtuelne memorije, hardver je generisao izuzetak tipa „nedozvoljen upis u adresiranu stranicu“. Precizno objasniti šta dalje radi operativni sistem. 8.(3) Navesti tipične operacije apstrakcije blokovski orijentisanog izlaznog uređaja sa sekvencijalnim pristupom. 9.(3) Neki proces izvršava sistemski poziv za upis u fajl koji je prethodno uspešno otvorio i sistem mu to ne dozvoljava, sa porukom da tom procesu nije dozvoljena ta operacija, iako je korisniku u čije ime se taj proces izvršava dozvoljena operacija upisa u taj fajl. Objasnite kako i zašto se ovo dogodilo. 10.(3) Koliko pristupa blokovima na disku treba izvršiti za pristup n-tom logičkom bloku sadržaja fajla ako je alokacija fajla a) FAT, pri čemu je cela FAT u memoriji b) kontinualna? Odgovor: a) ____________ b) ______________ 1.(3) Objasniti pojam raspodele vremena ( time sharing) kod multiprocesnih sistema. 2.(3) Data je pogrešna implementacija operacije yield() za neki troadresni procesor. Ova operacija bi trebalo da izvrši pr euzimanje procesora od niti na č iji vrh steka ukazuje vrednost sa č uvana na lokaciji na koju ukazuje argument cur , i predaju procesora niti na č iji vrh steka ukazuje vrednost sa č uvana na lokaciji
9/91
na koju ukazuje argument next. Objasniti zašto ova implementacija nije ispravna i korigovati je. void yield (void* cur, void* next) { asm { push r0 push r1 ... push r n add
r0,sp,#cur
mov
[r0],sp
add
r0,sp,#next
mov
sp,[r0]
pop
rn
... pop
r1
pop
r0
pop
pc ; return
} } 3.(3) Korišćenjem sistemskog poziva fork(), napisati program koji, ka da se pokrene kao proces, kreira onoliko procesa-dece, koli ko je dato argumentom tog programa. Ni taj proces, ni njegova deca ne treba da rade ništa više. 4.(3) Data dva procesa međusobno se isključuju pri ulazu u dve kritične sekcije pomoću semafora čija je inicijalna vrednost 1. Objasniti šta je problem ove implementacije. process P1;
process P2:
wait(S1);
wait(S2);
wait(S2);
wait(S1);
...
...
signal(S2);
signal(S1);
signal(S1);
signal(S2);
10/91
end P1;
end P2;
5.(3) Koju uslugu operativni sistem treba da ob ezbedi procesima da bi oni koristili dinamič ko uč itavanje modula (dynamic loading )? 6.(3) Data je definicija strukture FreeSegment koja predstavlja jedan segment slobodne memorije. Ove strukture uvezane su u dvostruko ulanč anu, neure đenu listu čija je glava freeSegHead. Implementirati funkciju getWorstFit(size_t) koja treba da pronađe i vrati (ali ne menja ni njega ni listu) segment slobodne memorije u koji se može smestiti blok date velič ine, po worst fit algoritmu. struct FreeSegment { size_t size; FreeSegment *prev, *next; }; 7.(3) Neki računar podržava segmentno-straničnu organizaciju virtuelne memorije, pri čemu je virtuelna adresa 16-bitna, fizički adresni prostor je veli č ine 8GB, a adresibilna jedinica je 16-bitna reč . Stranica je veli č ine 512B. Maksimalan broj segmenata u virtuelnom adresnom prostoru je 4. Prikazati logič ku strukturu virtuelne i fizi č ke adrese i navesti širinu svakog polja. 8.(3) Kojom tehnikom se fizi čki nedeljiv izlazni ure đaj može uč initi logi č ki (virtuelno) deljivim izme đu procesa koji ga uporedo koriste? Odgovor: _________________________ 9.(3) Napisati punu stazu (path ) do fajla resenja.doc koji se nalazi u direktorijumu d:/nastava/os/ispiti/jul2013 na uređaju d: posle sledeće operacije montiranja (prvi argument je fajl sistem koji montira, drugi je odredište montaže): mount d: /etf/rti Odgovor: ______________________________________________________________________ 10.(3) Neki fajl sistem koristi indeksiranu alokaciju fajlova na disku sa jednostrukim indeksom. Ako se pretpostavlja da je prostor za smeštanje fajlova (uklju čujuć i i njihove indekse) na disku veli č ine 32 GB, veli č ina klastera (jedine jedinice alokaci je) 2 KB, i ceo prostor potpuno ispunjen fajlovima, gde je svaki fajl maksimalne veli č ine i ima samo jedan indeksni klaster, koliki procenat ukupnog prostora za smeštanje fajlova na ovom disku zauzimaju indeksi? Odgovor: 100/__________% (odgovor izraziti u procentima, kao razlomak sa brojiocem 100) 1.(3) Šta su multiprocesorski, a šta distribuirani sistemi? 2.(3) Ako se nad sledećim programom kreira jedan proces, koliko će ukupno biti elemenata sa vrednošću različitom od 0 u nizovima pid svih kreiranih procesa
11/91
(uključujući i taj jedan početni) kada svi ti procesi izađu iz petlje, pod pretpostavkom da su svi sistemski pozivi uspeli? const int N=2; int pid[N]; void main () { for (int i=0; i
12/91
FHANDLE f2 = fopen(“y.doc”,read|write); fread(f1,buffer1,n1);
_____________
fwrite(f1,buffer2,n2);
_____________
fread(f2,buffer1,n1);
_____________
fwrite(f2,buffer2,n2);
_____________
10.(3) Neki fajl sistem koristi bit vektor za evidenciju slobodnih blokova na disku. Kolika je veličina ovog vektora u bajtovima, za disk veličine 256 GB sa blokom veličine 512B. 1.(3) Neki interaktivni višeprocesni i višekorisnički sistem ne podržava raspodelu vremena (time sharing). Šta je njegov osnovni problem? 2.(3) Ako se nad sledećim programom kreira jedan proces, koliko će ukupno biti elemenata sa vrednošću 0 u nizovima pid svih kreiranih procesa (uključujući i taj jedan početni) kada svi ti procesi izađu iz petlje, pod pretpostavkom da su svi sistemski pozivi uspeli? const int N=2; int pid[N]; void main () { for (int i=0; i
(* Critical section *)
flag1 := false;
(* Exit protocol *)
end end P1;
13/91
process P2 loop while flag1 = true do null end; (* Busy wait *) flag2 := true;
(* Critical section *)
flag2 := false;
(* Exit protocol *)
end end P2; 4.(3) Dva procesa X i Y "proizvode" cele brojeve uporedo, nezavisnim i promenljivim brzinama. Proces Z treba da uzima po dva proizvedena broja, i to uvek tačno jedan koji je proizveo X i jedan koji je proizveo Y, i njihov zbir ispisuje na standardni izlaz. Važno je obezbediti da proces Z uvek uzima samo "sveže" proizvedene brojeve, tj. nikada ne uzme više puta isti proizvedeni broj. Korišćenjem deljenih promenljivih i klasičnih brojačkih semafora, napisati sve potrebne deklaracije i kod procesa X i Z. 5.(3) U prvom prolazu kroz ulazne .obj fajlove, linker nailazi na izvezeni simbol koji se već nalazi u njegovoj tabeli simbola. Da li će to prijaviti kao grešku? 6.(3) Da li kod stranične organizacije virtuelne memorije ima smisla hardverski vršiti proveru prekoračenja granice opsega dozvoljenih adresa unutar stranice radi zaštite od nedozvoljenog pristupa fizičkim adresama koje koriste drugi procesi? Kratko obrazložiti. 7.(3) U nekom sistemu postoje sledeći sistemski pozivi: int async_write (char* buffer); void wait (int request_id); Operacija async_write asinhrono zadaje operaciju izlaza datog niza znakova na neki izlazni uređaj i vraća interni sistemski identifikator tog zahteva (veći od 0), odnosno kod greške (manji od nula). Operacija wait suspenduje pozivajući proces sve dok operacija sa datim identifikatorom nije završena. Korišćenjem ovih sistemskih poziva, realizovati sinhroni izlaz: int sync_write (char* buffer); 8.(3) Ukratko objasniti šta je spooling. 9.(3) Neki fajl sistem podržava implicitno zaključavanje fajla prilikom njegovog otvaranja. Postoje dve vrste ključa: deljeni (shared), koji se traži prilikom otvaranja fajla samo za čitanje (proces koji je tako otvorio fajl ima pravo samo da čita iz fajla) i ekskluzivni (exclusive), koji se traži prilikom otvaranja fajla i za upis (proces koji je otvorio fajl ima pravo upisa). Popuniti sledeću tabelu
14/91
upisivanjem oznaka onih procesa čiji će zahtev za otvaranjem istog fajla biti ispunjen, za svaki od dva data slučaja. Procesi postavljaju zahteve redom navedenim u drugoj koloni, pri čemu oznaka npr. A-Rd označava da proces A postavlja zahtev za otvaranjem fajla za čitanje, a B-Wr da proces B postavlja zahtev za otvaranjem fajla za upis. Slučaj
Zahtevi za otvaranje fajla
1
A-Rd, B-Wr, C-Rd, D-Rd, EWr A-Wr, B-Rd, C-Wr, D-Rd, ERd
2
Procesi koji su uspeli da otvore fajl
10.(3) Neki fajl sistem koristi indeksirani pristup alokaciji blokova za fajlove sa indeksima u dva nivoa. Prvi nivo indeksa smešten je u sam FCB (file control block) i ima 256 ulaza koji direktno referenciraju blokove sa podacima, a još jedan ulaz u FCB ukazuje na jedan blok sa indeksom drugog nivoa čiji ulazi takođe ukazuju na blokove sa podacima. Veličina ulaza u indeksnom bloku (reference na blok diska) je 8 bajtova, a veličina bloka na disku je 512KB. Kolika je maksimalna veličina fajla u ovom fajl sistemu? 1.(3) Objasniti zašto je i kako uvo đenje magnetnih diskova bilo od klju čnog znač aja kod prelaska sa paketnih sistema na sist eme sa multiprogramiranjem. 2.(3) Objasniti kako se me đusobno isključenje kriti č nih sekcija jezgra operativnog sistema može obezbediti kod jednosprocesorskih, a kako kod višeprocesorskih sistema. 3.(3) Korišć enjem standardnih sistemskih poziva fork() i wait() napisati C program koji kreira tač no N procesa svoje dece, gde je N parametar programa, a potom čeka da se sva deca završe. Procesi-deca samo ispišu neku poruku na standardni izlaz i potom se završavaju. 4.(3) Korišć enjem standardnih broja č kih semafora napisati kod za sinhronizaciju proizvođač a i potroša č a sa neograni č enim baferom. (Kod za smeštanje i uzimanje elemenata ne treba pisati, već samo nazna čiti njegovo mesto.) 5.(3) Ukratko objasniti osnovnu razliku izme đ u tehnika dinami č kog uč itavanja ( dynamic loading ) i preklopa ( overlays). 6.(3) Šta je eksterna fragmentacija kod alokacije memorije? Da li je ona mogu ć a kod segmentno-stranične alokacije memorije? 7.(3) U nekom sistemu sa strani č nom organizacijom virtuelne memorije virtuelna i fizi č ka adresa su 32-bitne, adresibilna jedinica je bajt, a stranica je velič ine 64 KB. PMT je organizovana u dva nivoa i jedan ulaz u PMT oba ni voa zauzima po jednu 32-bitnu reč . PMT oba nivoa su iste veli čine. Koliko ukupno zauzimaju PMT za proc es koji je alocirao samo svoju prvu i poslednju stranicu?
15/91
8.(3) Ukratko objasniti tehniku spooling. 9.(3) Dati procenu kompleksnosti u najgorem slu č aju slede ć ih operacija sa direktorijumom uodnosu na broj postojeć ih fajlova n u direktorijumu, za navedene implementacije direktorijuma. Hash tabela sa jednostruko ulan č anim listama za rešavanje kolizija
Dvostruko ulanč ana lista sa pokaziva čima na glavu i rep liste
Pronalaženje ulaza sa datim Imenom Brisanje prona đenog ulaza (ne ra č unajuć i pronalaženje po imenu) 10.(3) Koliko pristupa blokovima na di sku treba izvršiti za pristup n-tom logi č kom bloku sadržaja fajla ako je alokacija fajla a) indeksna, pri čemu je indeks fajla uvek u dva nivoa, a na blok sa indeksom prvog nivoa ukazuje polje u FCB, b) FAT, pri čemu je cela FAT u memoriji? FCB fajla je u memoriji. Odgovor: a) ____________ b) ______________ 1.(3) Ukratko objasniti osnovni motiv uvođenja multiprogramiranja u računarske sisteme. 2.(3) Na asembleru nekog zamišljenog dvoadresnog RISC procesora sa load/store arhitekturom napisati program koji vrši prenos bloka podataka iz memorije na izlazni uređaj tehnikom programiranog izlaza korišćenjem prekida. Samostalno usvojiti potrebne detaljne pretpostavke. 3.(3) Korišćenjem Unix sistemskih poziva fork() i execlp() napisati program koji prima jedan celobrojni argument i koji, ukoliko se proces pokrene sa parametrom -c, kreira još jedan isti takav proces, samo bez parametra, a u suprotnom se samo završava. Sistemski poziv execlp prima argumente komandne linije: int execlp(char const *file, char const *arg0, ...); 4.(3) Napisati kod za međusobno isključenje kritične sekcije korišćenjem binarnih semafora. 5.(3) Objasniti zašto linkeru ne predstavlja nikakav problem prilikom povezivanja to što fajl a.obj uvozi simbol koji je definisan u b.obj, a b.obj uvozi simbol koji je definisan u a.obj. Kako se ova situacija rešava? 6.(3) U nekom sistemu primenjuje se best-fit algoritam kontinualne alokacije memorije. Inicijalno je prostor veličine 512KB potpuno slobodan za alokaciju
16/91
korisničkih procesa. Potom su različiti procesi zadavali sledeće zahteve (slovna oznaka označava proces koji je postavio zahtev, brojna oznaka označava veličinu alociranog prostora u KB, a minus označava gašenje procesa i oslobađanje njegove memorije): A128, B32, C256, D64, A-, E16, F64, BOdgovoriti na sledeća pitanja koja se odnose na stanje memorije nakon ove sekvence zahteva: i) Koliko je ukupno slobodnih fragmenata? Odgovor: _____________ ii) Kolika je veličina najmanjeg slobodnog fragmenta? Odgovor: _____________ iii) Kolika je veličina najvećeg slobodnog fragmenta? Odgovor: _____________ 7.(3) Virtuelna memorija organizovana je stranično, a adresibilna jedinica je bajt. Virtuelna adresa je 32-bitna, stranica je veličine 4KB, deskriptor stranice je 32bitni, a PMT je organizovana u dva nivoa, pri čemu je polje za straničenje prvog nivoa veličine 8 bita. Koliki prostor bi ukupno zauzimala PMT nekog procesa kada bi: a) proces koristio ceo svoj virtuelni adresni prostor? Odgovor: ________________ b) proces koristio samo dve stranice, prvu i poslednju u adr. prostoru? Odgovor: _______________ 8.(3) Umesto tehnike spooling, pristup uporednih procesa štampaču u nekom sistemu omogućuje se međusobnim isključenjem pomoću operacije rezervacije: svaki proces, pre nego što zatraži bilo koju operaciju sa štampačem, mora da ga rezerviše, a tu rezervaciju otpušta tek kada završi sa celim jednim poslom štampe. Pored eventualnog sprečavanja mrtve blokade, o čemu još mora da vodi računa operativni sistem da se ne bi dešavalo neograničeno zauzeće štampača? 9.(3) Izvod iz jednog uputstva za Unix fajl sistem i dodelu prava pristupa fajlu iz komandne linije: To change the mode of a file, use the chmod command. The general form is chmod X@Y file1 file2 ... where: X is any combination of the letters 'u' (for owner), 'g' (for group), 'o' (for others), 'a' (for all; that is, for 'ugo'); @ is either '+' to add permissions, '-' to remove permissions, or '=' to assign permissions absolutely; and Y is any combination of 'r', 'w', 'x'. Na primer, komanda chmod u=rx file daje vlasniku prava rx, ali ne i pravo w. Napisati komande koje za dati fajl postavljaju prava na sledeći način: a) grupi i ostalima oduzimaju prava na rx, ali ne i na w: _______________________________
17/91
b) svima dodaju pravo na izvršavanje: _____________________________________________ 10.(3) Neki fajl sistem podržava kombinovano indeksiran pristup alokaciji fajlova, pri čemu FCB sadrži 256 ulaza sa direktnim indeksom (sadrže brojeve blokova za podatke). Ako sadržaj fajla preraste veličinu koju podržava ovaj indeks nultog nivoa, za blokove preko te veličine postoji indeks prvog nivoa sa 256 ulaza u FCB; svaki od tih ulaza sadrži pokazivač na indeks drugog nivoa u kome je po 256 ulaza sa pokazivačima na blokove sa sadržajem. Koliki je maksimalni kapacitet fajla u blokovima? (Odgovor dati kao izraz.) Odgovor: __________________________ 1.(3) Šta je multiprocesni, a šta multiprocesorski operativni sistem? 2.(3) Korišćenjem operacije yield(PCB* old, PCB* new) koja čuva kontekst izvršavanja prvog i restaurira kontekst izvršavanja drugog datog procesa, implementirati operaciju wait na semaforu koji je realizovan klasom Semaphore poput one u školskom jezgru. 3.(3) Na jeziku C, korišćenjem sistemskih poziva fork() i execlp() za Unix, napisati program koji pokreće drugi program iz fajla čiji je naziv zadat kao parametar komandne linije prvog programa. 4.(3) Korišćenjem standardnih brojačkih semafora u školskom jezgru, na jeziku C++ napisati globalne deklaracije i inicijalizacije, kao i kod tela dve uporedne niti A i B koje ciklično rade sledeće: A: upisuje vrednost u deljene promenljive x i y, a zatim čeka da proces B upiše zbir x i y u promenljivu z čiju vrednost onda ispisuje na standardni izlaz; B: čeka da proces A upiše vrednosti u deljene promenljive x i y, zatim ove dve vrednosti sabira i zbir upisuje u deljenu promenljivu z. 5.(3) Šta je osnovni razlog za to da linker obavlja zadatak u dva prolaza? Precizno objasniti. 6.(3) Navesti najmanje tri sličnosti (npr. zajednički zahtevi, ograničenja ili problemi) između kontinualne alokacije memorije i segmentne alokacije memorije procesa. 7.(3) Kojom tehnikom se nedeljivi uređaj može učiniti virtuelno deljivim? Navesti klasičan primer takvog uređaja za koji se najčešće primenjuje ova tehnika. Odgovor: ____________________________________________________ 8.(3) U fajl podsistemu nekog operativnog sistema ne vodi se tabela otvorenih fajlova za svaki proces, već postoji samo jedna globalna tabela otvorenih fajlova za ceo sistem. Drugim rečima, ne postoji nikakva informacija o upotrebi otvorenog fajla lokalna (privatna) za pojedinačni proces, već su sve
18/91
takve informacije globalno deljene. Da li pojam pokazivača trenutne lokacije (kurzora) za čitanje/upis u fajl ima smisla čuvati u globalnoj tabeli otvorenih fajlova i zašto? 9.(3) Dati procenu kompleksnosti datih operacija sa direktorijumom u odnosu na broj postojećih fajlova n u direktorijumu, za navedene implementacije direktorijuma, ukoliko u slučaju hash tabele nema nijedne kolizije. Hash tabela sa dvostruko ulančanim listama za rešavanje kolizija
Dvostruko ulančana lista sa pokazivačima na glavu i rep liste
Pronalaženje ulaza sa datim Imenom Dodavanje novog ulaza sa jedinstvenim imenom (ne računajući proveru jedinstvenosti imena) 10.(3) Neki fajl sistem koristi indeksirani pristup alokaciji fajlova sa indeksima u dva nivoa, blokom veličine 256KB i 64-bitnim adresama fizičkih blokova. Kolika je maksimalna veličina fajla u ovom sistemu? 1.(3) Prvi interaktivni računarski sistemi uveli su jednu značajnu novinu u operativne sisteme. Koja je to novina? Objasniti ukratko njenu suštinu. 2.(3) Korišćenjem standardnih bibliotečnih funkcija setjmp() i longjmp(), u školskom jezgru implementirati operaciju yield(Thread* old, Thread* new) koja prebacuje kontekst izvršavanja sa jedne (old) na drugu (new) nit. 3.(3) Korišćenjem školskog jezgra, napraviti nit koja se inicijalizuje celobrojnim parametrom n i koja kreira jednu istu takvu nit-dete, ova nit-dete kreira jednu svoju nit-dete, i tako dalje, rekurzivno, ali tako da ukupno bude kreirano n niti. 4.(3) Dato je jedno moguće rešenje za međusobno isključenje dva procesa uposlenim čekanjem. Da li ovo rešenje obezbeđuje međusobno isključenje? Da li ima neki drugi problem? shared var turn : integer = 1; process P1
process P2
begin
begin
loop
loop
while turn = 2 do null end;
while turn = 1 do null end;
19/91
turn := 2;
turn := 1;
end end P1;
end end P2;
5.(3) Šta znači kad je proces swapped out? Odgovor: ________________________________________________________________________ ________________________________________________________________________________ Ako je proces swapped out, u kom stanju se od sledećih on nalazi? a) created b) ready c) running d) suspended
e) terminated
6.(3) Data je definicija strukture FreeSegment koja predstavlja jedan segment slobodne memorije. Ove strukture uvezane su u dvostruko ulančanu, neuređenu listu čija je glava freeSegHead. Implementirati funkciju getBestFit(size_t) koja treba da pronađe i vrati (ali ne menja ni njega ni listu) segment slobodne memorije u koji se može smestiti blok date veličine, po best fit algoritmu. struct FreeSegment { size_t size; FreeSegment *prev, *next; }; 7.(3) Memorija nekog računara organizovana je stranično, sa stranicom veličine 4KB. Adresibilna jedinica je bajt, a virtuelna adresa je 32-bitna. Fizička adresa je veličine 32 bita. Ako je PMT organizovana u dva nivoa, s tim da su veličine polja za broj ulaza u tabele oba nivoa isti, kolika je veličina (u bajtovima) PMT prvog nivoa? Odgovor: ______________ 8.(3) Kojom tehnikom se nedeljivi uređaj može učiniti virtuelno deljivim? Odgovor: _________________________ 9.(3) U nekom sistemu simbol . označava tekući, a .. roditeljski direktorijum. Koja od sledećih naredbi (svaka se izvršava uspešno) sigurno neće promeniti tekući direktorijum? (Zaokružiti jedan ili više tačnih odgovora.) a) cd ./../../x/y/z b) cd ./x/y/z/../.. c) cd ./../../../x/y/z d) cd ./x/y/z/../../..
20/91
10.(3) Neki fajl sistem primenjuje FAT za alokaciju sadržaja fajla. FAT je cela keširana u memoriji, na nju ukazuje pokazivač fat, i ima FATSIZE ulaza tipa unsigned. Prilikom ulančavanja blokova sa sadržajem fajla, null vrednost se označava vrednošću 0 u odgovarajućem ulazu u FAT, dok se slobodni blokove ne ulančavaju posebno, već su njima odgovarajući ulazi u FAT označeni vrednostima ~0U (sve jedinice binarno); blokovi broj 0 i broj ~0U se ne koriste u fajl sistemu. U FCB polje head tipa unsigned sadrži broj prvog bloka sa sadržajem fajla (0 ako je sadržaj prazan). Napisati kod kojim se oslobađaju svi blokovi sa sadržajem fajla. 1.(3) Kod kakvih sistema se najpre pojavljuje time sharing i sa kakvim motivom? 2.(3) Korišćenjem funkcija setjmp i longjmp iz standardne C biblioteke realizovati operaciju wait na binarnom semaforu u školskom jezgru. 3.(3) Korišćenjem sistemskih poziva fork() i execlp() napisati program P koji pokreće proces nad programom u fajlu čiji je naziv zadat kao argument izvršavanja programa P. 4.(3) Proces P treba da sačeka da sva tri procesa X, Y i Z ispune neki svoj uslov, u bilo kom redosledu. Napisati deo koda procesa P i bilo kog od druga tri procesa, uz potrebne deklaracije, koji obezbeđuju ovu uslovnu sinhronizaciju pomoću jednog standardnog brojačkog semafora. 5.(3) Koja dva podatka čine memorijski kontekst procesa kod kontinualne alokacije memorije za proces sa dinamičkim preslikavanjem adresa? 6.(3) Virtuelni adresni prostor sistema je 8GB, adresibilna jedinica je 16-bitna reč, a virtuelni adresni prostor je organizovan stranično sa stranicom veličine 32KB. Fizički adresni prostor je veličine 2GB. Tabele preslikavanja stranica su organizovane u dva nivoa, s tim da tabela drugog nivoa ima 1K ulaza. Ako deskriptori u PMT i prvog i drugog nivoa sadrže samo broj okvira u koji se stranica preslikava i ništa više (posebna vrednost označava da preslikavanje nije moguće), koliko bajtova zauzima jedna PMT prvog, a koliko drugog nivoa? 7.(3) Zaokružiti slovo ispred one ili onih podataka koji nisu neophodni u deskriptoru stranice u PMT koji koristi hardver za preslikavanje adresa kod virtuelne memorije: a) Informacija da preslikavanje nije moguće izvršiti b) Adresa bloka na disku u kome se nalazi stranica c) Informacija da je stranica deljena sa drugim procesom tehnikom copy-on-write d) Informacija da je stranica zabranjena za izbacivanje jer se koristi kao I/O bafer e) Da li je dozvoljen upis u stranicu f) Broj okvira u koji se stranica preslikava. 8.(3) Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati program koji prenosi blok podataka zadate dužine na zadatu adresu sa ulaznog uređaja korišćenjem programiranog ulaza/izlaza sa prozivanjem (polling).
21/91
9.(3) U fajl podsistemu nekog operativnog sistema ne vodi se tabela otvorenih fajlova za svaki proces, već postoji samo jedna globalna tabela otvorenih fajlova za ceo sistem. Drugim rečima, ne postoji nikakva informacija o upotrebi otvorenog fajla lokalna (privatna) za pojedinačni proces, već su sve takve informacije globalno deljene. Kako treba da izgleda API funkcija za čitanje bloka podataka dužine len iz nekog fajla, da bi se procesu obezbedila mogućnost sekvencijalnog čitanja svih podataka iz fajla? 10.(3) Posmatra se disk kapaciteta 80MB i blokom veličine 1KB. Ako se za evidenciju slobodnog prostora koristi bit-vektor sa maksimalnom kompakcijom (svih 8 bita u bajtu su iskorišćeni itd.), koliko celih blokova treba zauzeti na disku za smeštanje ovog vektora? 1.(3) Šta je bio osnovni motiv uvođenja multiprogramiranja u do tada paketne računarske sisteme? 2.(3) Korišćenjem standardnih bibliotečnih funkcija setjmp() i longjmp(), realizovati operaciju void yield(jmp_buf old, jmp_buf new); koja čuva kontekst niti čiji je jmp_buf dat kao prvi argument, oduzima joj procesor i restaurira kontekst niti čiji je jmp_buf dat kao drugi argument, kojoj predaje procesor. 3.(3) Korišćenjem sistemskih poziva fork() i execlp() napisati program run koji, kada se pokrene kao proces, kreira procese-decu nad svim programima koji se nalaze u fajlovima čija su imena data argumentima programa run (npr. run p1.exe p2.exe p3.exe). 4.(3) Korišćenjem standardnih brojačkih semafora, napisati kod za inicijalizaciju i potrebnu sinhronizaciju između dva procesa koji u svoje kritične sekcije treba da ulaze strogo naizmenično. 5.(3) Koju uslugu operativni sistem treba da obezbedi procesima da bi oni koristili preklope (overlays)? 6.(3) Ako je učestanost pogotka u TLB 90%, a vreme pristupa TLB iznosi 20% od vremena pristupa fizičkoj memoriji, koliko (procentualno) je duže efektivno vreme pristupa virtuelnoj memoriji u odnosu na pristup fizičkoj memoriji kod straničenja u dva nivoa? Odgovor: ________% 7.(3) Šta je svrha tehnike copy-on-write kod stranične organizacije virtuelne memorije? 8.(3) Koja je razlika između sinhronog i asinhronog slanja podataka na izlazni uređaj?
22/91
9.(3) U nekom fajl sistemu u sistemskom pozivu za otvaranje fajla proces navodi da li će fajl samo čitati ili ga i na bilo koji način menjati. U zavisnosti od toga, taj sistemski poziv zaključava fajl sa jednim od dve vrste ključa. Ako se fajl otvara samo za čitanje, fajl se zaključava deljenim ključem; ako se fajl otvara za izmenu, zaključava se ekskluzivnim ključem. Ukoliko poziv ne može da se izvrši zbog toga što ključ ne može da se dobije, poziv se otkazuje bez izmena u fajl sistemu i vraća se greška. Procesi A, B, C i D izvršavaju sistemske pozive otvaranja i zatvaranja istog fajla u sledećem redosledu (neki proces izvršava poziv zatvaranja fajla samo ako ga je uspešno otvorio): 1) 2) 3) 4) 5) 6)
A: open(READ) B: open(WRITE) C: open(READ) A: close C: close D: open(WRITE)
Koje od ovih operacija će se izvršiti uspešno, a koje neuspešno? Odgovor: ______________________________________________________________________ 10.(3) Šta je najveći nedostatak organizacije fajl sistema pomoću FAT? 1.(3) Šta je to multiprocesorski sistem, a šta distribuirani sistem? Navesti po jedan primer svakog. 2.(3) Korišćenjem funkcije yield(jmp_buf old, jmp_buf new) koja čuva kontekst jedne niti i predaje procesor drugoj niti, realizovati operaciju wait na brojačkom semaforu u školskom jezgru. 3.(3) Navesti najmanje tri slučaja (povoda) u kojima proces gubi procesor i prelazi u red suspendovanih (blokiranih) i naznačiti da li se to dešava kao posledica sistemskog poziva tog procesa ili spoljašnjeg prekida. 4.(3) Napisati kod koji realizuje Petersonov algoritam međusobnog isključenja dva uporedna procesa pomoću uposlenog čekanja. 5.(3) U čemu je razlika između tehnika dinamičkog učitavanja (dynamic loading) i preklopa (overlay)? 6.(3) Virtuelni adresni prostor sistema je 8GB, adresibilna jedinica je 16-bitna reč, a virtuelni adresni prostor je organizovan stranično sa stranicom veličine 32KB. Fizički adresni prostor je veličine 2GB. Tabele preslikavanja stranica su organizovane u dva nivoa, s tim da tabela prvog nivoa ima 2K ulaza. Prikazati logičku strukturu virtuelne adrese i označiti širinu svakog polja. Označiti i podelu polja za broj stranice na polja za indeksiranje PMT prvog i drugog nivoa. 7.(3) Neki sistem sa straničnom organizacijom memorije koristi tehniku copy on write. Jedan proces je tek kreirao drugi proces pozivom fork(). Ako novokreirani
23/91
proces odmah po pokretanju izvrši operaciju upisa u memoriju, koji izuzetak će generisati procesor, page fault ili neki drugi i koji? Precizno objasniti zašto i kako. 8.(3) Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati program koji prenosi blok podataka zadate dužine sa zadate adrese na izlazni uređaj korišćenjem programiranog ulaza/izlaza sa prozivanjem (polling). 9.(3) Šta je osnovna svrha (motiv) postojanja operacije otvaranja fajla? 10.(3) Navesti i objasniti neku tehniku organizacije strukture podataka za rukovanje slobodnim prostorom fajl sistema na disku, osim bit-vektora. 1.(3) Šta je to multiprocesorski sistem, a šta distribuirani sistem? Navesti po jedan primer svakog. 2.(3) Korišćenjem funkcija setjmp i longjmp iz standardne C biblioteke realizovati operaciju wait na brojačkom semaforu u školskom jezgru. 3.(3) Navesti najmanje tri slučaja (povoda) u kojima proces gubi procesor i prelazi u red spremnih (ready) i naznačiti da li se to dešava kao posledica sistemskog poziva tog procesa ili spoljašnjeg prekida. 4.(3) Ograničeni bafer je implementiran pomoću brojačkih semafora na sledeći način (ostatak klase je definisana na očigledan način, kao na predavanjima). Šta je problem sa ovom implementacijom? void BoundedBuffer::append (Data* d) { mutex.wait(); spaceAvailable.wait(); buffer[tail] = d; tail = (tail+1)%N; itemAvailable.signal(); mutex.signal(); } 5.(3) Po čemu se razlikuje posao linkera kada je njegov proizvod izvršivi program od onoga kada je to biblioteka? 6.(3) Virtuelni adresni prostor sistema je 4GB, adresibilna jedinica je bajt, a virtuelni adresni prostor je organizovan stranično sa stranicom veličine 16KB. Fizički adresni prostor je veličine 1GB. Tabele preslikavanja stranica su organizovane u dva nivoa, s tim da tabela prvog nivoa ima 2K ulaza. Prikazati logičku strukturu virtuelne adrese i označiti širinu svakog polja. Označiti i podelu polja za broj stranice na polja za indeksiranje PMT prvog i drugog nivoa.
24/91
7.(3) Neki sistem sa straničnom organizacijom memorije koristi tehniku copy on write. Jedan proces je tek kreirao drugi proces pozivom fork(). Ako novokreirani proces odmah po pokretanju izvrši operaciju upisa u memoriju, koji izuzetak će generisati procesor, page fault ili neki drugi i koji? Precizno objasniti zašto i kako. 8.(3) Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati program i prekidnu rutinu koja prenosi blok podataka zadate dužine sa zadate adrese na izlazni uređaj korišćenjem programiranog ulaza/izlaza sa prekidom. 9.(3) Šta je po vašem mišljenju osnovna svrha (motiv) postojanja koncepta tekućeg direktorijuma procesa? 10.(3) Zašto fajl sistemi po pravilu pokušavaju da alociraju susedne blokove na disku za sadržaj istog fajla, čak i ako to nije neophodno za datu alokaciju (ulančanu ili indeksnu)? 1.(3) Šta je to sistem sa raspodelom vremena (engl. time-sharing)? 2.(3) Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati prevod sledeće rekurzivne funkcije: int f (int n) { if (n<=0) return 0; else return f(n-1)+1; } 3.(3) Ukoliko su svi sistemski pozivi izvršeni uspešno, koliko procesa se ukupno kreira kada se nad sledećim programom kreira jedan proces (računajući i taj jedan)? void main () { for (int i=0; i<7; i++) if (fork()>0) return; } Odgovor: __________________________ 4.(3) Korišćenjem standardnih brojačkih semafora napisati kod dva uporedna procesa koji sarađuju na sledeći način. Proces A upisuje jednu vrednost u deljenu promenljivu x, koju proces B potom čita. Tek kada je B pročitao tu vrednost, proces A upisuje novu vrednost u x, koju proces B onda čita, i tako ciklično. 5.(3) Neki program koristi dve velike strukture podataka naizmenično: najpre za neku složenu obradu koristi samo prvu strukturu, pa onda za neku drugu obradu koristi samo drugu strukturu, pa onda ponovo prvu, pa drugu itd. Ako se ove dve strukture učitavaju dinamički i preklapaju se (kod korišćenja preklopa, overlays), u kom slučaju će izvršavanje tog programa trajati duže, a u kom će koristiti više
25/91
memorije: kada se koristi samo dinamičko učitavanje, ili kada se koriste preklopi? Kratko obrazložiti. 6.(3) Neki sistem primenjuje kontinualnu alokaciju memorije i best-fit algoritam alokacije, pri čemu su segmenti slobodne memorije organizovani u sledeću strukturu podataka: a) sortiranu ulančanu listu, b) balansirano binarno stablo. Koliko segmenata treba obići u najgorem slučaju da bi se pronašao odgovarajući slobodan segment prilikom alokacije, ukoliko je slobodnih segmenata n? Odgovor: a) ______________ b) _______________ 7.(3) Učestanost pogotka u TLB je 90%, a PMT je organizovana u dva nivoa. TLB je 10 puta brža nego operativna memorija. Koliko je efektivan pristup memoriji sporiji od pristupa fizičkoj memoriji? Odgovor: ________________ 8.(3) Navesti osnovne operacije klase blokovski orijentisanih uređaja sa direktnim pristupom. 9.(3) Neki fajl sistem pruža sledeće operacije u svom API za tekstualne fajlove:
int size(FHANDLE) Vraća trenutnu veličinu sadržaja fajla u znakovima. void append(FHANDLE,int) Proširuje sadržaj fajla za dati broj znakova na kraju. void seek(FHANDLE,int) Postavlja kurzor datog fajla na datu poziciju (redni broj znaka počev od 0). void write(FHANDLE,char*,int size) Na poziciju kurzora datog fajla upisuje dati niz znakova zadate dužine, i pomera kurzor iza upisanog niza znakova.
Operacije seek i write rade samo u opsegu trenutne veličine sadržaja fajla (ne pomeraju kurzor i ne upisuju iza kraja sadržaja fajla). Napisati operaciju write(FHANDLE,int position,char*,int size); koja na zadatu poziciju upisuje zadati niz znakova date veličine, pri čemu se fajl implicitno najpre proširuje na potrebnu veličinu ukoliko bi zadata pozicija ili zadati upis prekoračio trenutnu veličinu sadržaja fajla. Zanemariti sve moguće greške u ulazu/izlazu. 10.(3) Koliko pristupa blokovima na disku treba izvršiti za pristup n-tom logičkom bloku sadržaja fajla ako je alokacija fajla a) ulančana lista blokova, pri čemu na prvi blok sadržaja fajla ukazuje polje u FCB, b) indeksna, pri čemu je indeks fajla uvek u dva nivoa, a na blok sa indeksom prvog nivoa ukazuje polje u FCB? FCB fajla je u memoriji. Odgovor: a) ____________ b) ______________ 1.(3) Šta je multiprocesorski, a šta distribuirani sistem? 2.(3) Data je operacija yield(jmp_buf old, jmp_buf new) koja čuva kontekst niti čiji je jmp_buf dat kao prvi argument, oduzima joj procesor i restaurira kontekst
26/91
niti čiji je jmp_buf dat kao drugi argument, kojoj predaje procesor. Koristeći ovu operaciju, realizovati operaciju dispatch() koja ima isti efekat kao i ona data u školskom jezgru. 3.(3) Kako se u kodu koji se izvršava nakon sistemskog poziva fork() može znati da li se taj kod izvršava u kontekstu procesa-roditelja ili procesa-deteta? Objasniti i dati primer. 4.(3) Napisati kod jednog od dva procesa koji pristupaju kritičnoj sekciji sa međusobnim isključenjem pomoću uposlenog čekanja (busy waiting) Petersonovim algoritmom. 5.(3) Date su sledeće deklaracije u jednom izvornom C fajlu. Koji od ovih simbola će biti označeni kao „izveženi“, a koji kao „uveženi“ u .obj fajlu? extern int a(int); Odgovor: Izveženi: ______________________________ void b(int); void b(int) {}
Uveženi: ______________________________
void c(int); extern int d; static int e; int f; 6.(3) Neki sistem koristi kontinualnu alokaciju operativne memorije. Data je deklaracija strukture podataka koja predstavlja zaglavlje svakog slobodnog fragmenta memorije. Ova zaglavlja čine dvostruko ulančanu listu slobodnih fragmenata i upisuju se na sam početak svakog slobodnog fragmenta memorije. Napisati telo funkcije getFirstFitFragment() koja treba da pronađe fragment slobodne memorije veličine date argumentom po first-fit algoritmu i vrati njegovu adresu. Preostali deo fragmenta treba da postane novi (manji) fragment u listi slobodnih. typedef unsigned int size_t; struct FreeFragment { size_t size; // Veličina fragmenta u jedinicama sizeof(char) FreeFragment* prev; // Prethodni u listi FreeFragment* next; // Sledeći u listi } FreeFragment* head; // Glava liste slobodnih fragmenata void* getFirstFitFragment(size_t);
27/91
7.(3) Objasniti šta je osnovni motiv i pogodnost tehnike straničenja u više nivoa u odnosu na straničenje u jednom nivou? 8.(3) Kojom tehnikom se fizički nedeljivi izlazni uređaj može učiniti logički (virtuelno) deljivim između procesa koji ga uporedo koriste? Odgovor: ____________________________________ 9.(3) Neki proces otvara neki fajl samo za čitanje, iako „vlasnik“ tog procesa ima i pravo upisa u taj fajl. Da li se informacija da je taj proces otvorio taj fajl samo za čitanje čuva u tabeli otvorenih fajlova koja je globalna za sve procese, ili u onoj koja je lokalna za taj proces? Odgovor: ________________________________________________________________________ 10.(3) Neki fajl sistem koristi indeksiranu alokaciju fajlova na disku sa jednostrukim indeksom. Ako se pretpostavlja da je prostor za smeštanje fajlova (uključujući i njihove indekse) na disku veličine 32 GB, veličina klastera (jedine jedinice alokacije) 2 KB, i ceo prostor potpuno ispunjen fajlovima tako da je svaki fajl maksimalne veličine takve da ima samo jedan indeksni klaster, koliki procenat ukupnog prostora za smeštanje fajlova na ovom disku zauzimaju indeksi? Odgovor: 100/__________% (odgovor izraziti kao razlomak sa brojiocem 100)
1.(3) Na asembleru nekog dvoadresnog RISC procesora sa LOAD/STORE arhitekturom napisati prevod sledeće funkcije: int log (int n) { if (n<2) return 0; else return 1+log(n/2); }
2.(3) Na koji način se u programu koga izvršava procesor može znati da je DMA završio operaciju koja mu je zadata? 3.(3)
Navesti najmanje tri slučaja (uzroka) u kojima tekući proces gubi procesor.
4.(3) Proces P treba da sačeka da sva tri procesa X, Y i Z ispune neki svoj uslov, u bilo kom redosledu. Napisati deo koda procesa P i bilo kog od druga tri procesa, uz potrebne deklaracije, koji obezbeđuju ovu uslovnu sinhronizaciju pomoću jednog standardnog brojačkog semafora. 5.(3)
Dat je fajl sa sledećim sadržajem:
float base = 2.0; float log(float); float ln(float); float log(float x) { return ln(x)/ln(base); }
}
28/91
Koliko nerazrešenih adresnih polja instrukcija prevodilac ostavlja u ovom fajlu? _________________ Koje simbole izvozi ovak fajl? __________________________________ Koje simbole uvozi ovaj fajl? __________________________________
29/91
6.(3) Navesti osnovne sličnosti i osnovne razlike između tehnike dinamičkog učitavanja memorije i preklopa (overlays). 7.(3) Virtuelna memorija organizovana je stranično, a adresibilna jedinica je bajt. Virtuelna adresa je 32-bitna, stranica je veličine 4KB, deskriptor stranice je 32-bitni, a PMT je organizovana u dva nivoa, pri čemu je polje za straničenje prvog nivoa veličine 8 bita. U koje ulaze PMT prvog nivoa i drugog nivoa se preslikava stranica broj 5423Dh? Odgovor: Prvog - ___________, drugog - __________. 8.(3)
Ukratko objasniti princip dvostrukog baferisanja kod ulazno-izlaznih operacija.
9.(3)
Da li je veličina fajla ograničena ako je način alokacije blokova za fajlove na disku:
1) ulančani ________________________ 2) indeksirani ______________________ 10.(3) Neki fajl sistem koristi indeksirani pristup alokaciji blokova za fajlove na disku, sa kombinovanom tehnikom indeksiranja u jednom, dva i tri nivoa, kao kod UNIX inode strukture. Pretpostavljajući da disk ima uniformno srednje vreme pristupa do bilo kog bloka na disku, da li je vreme pristupa do različitih delova veoma velikih fajlova jednako? Ako jeste, precizno objasniti zašto jeste, a ako nije, objasniti kako se i zašto razlikuje.
1.
(25 poena)
Upravljanje procesima
(a)(10) Posmatra se neki multiprocesorski operativni sistem sa preuzimanjem (preemptive) i njegova struktura koja čuva red spremnih procesa. Popuniti donju tabelu odgovorima na pitanje (upisati „Da“ ili „Ne“ u svako polje) da li je pristup do ove strukture prilikom uzimanja narednog procesa za izvršavanje neophodno zaštiti datim mehanizmom međusobnog isključenja za dva različita slučaja realizacije ove strukture: Jedinstven red spremnih Poseban red spremnih procesa za sve procesore procesa za svaki procesor Maskiranje prekida Spinlock (npr. test-and-set) (b)(10) Procesi X, A i B rade ciklično svoje poslove i treba da se sinhronizuju na sledeći način. Procesi A i B treba da čekaju da proces X obavi svoju operaciju x. Svaki put kada završi svoju operaciju x, proces X treba da signalizira nastavak rada procesa A i B, s tim da proces A treba da uradi svoju operaciju a, a proces B svoju operaciju b, ali tako da ih urade baš u navedenom redosledu (najpre A da obavi a u celini, pa tek onda B da počne i obavi b u celini). Tek kada B obavi b u celini, X može da signalizira završetak operacije x ponovo, iako može da je počne i obavi je i ranije (tj. može da počne ovu operaciju čim je završio prethodnu). Napisati tela ovih procesa uz sinhronizaciju pomoću standardnih brojačkih semafora. (c)(5) Precizno objasniti šta je efekat izvršavanja sledećeg programa, pod pretpostavkom da su svi sistemski pozivi izvršeni uspešno (bez greške), kao i da su svi ispisi svih procesa
30/91
usmereni na isti standardni izlaz (ekran), uz regularno međusobno isključenje pojedinačnih operacija ispisa različitih procesa (preko poziva printf()): #include int main () { for (int i=0; i<10; i++) { int pid = fork(); if (pid!=0) { printf(“%d”,i); exit(0); } } }
2.
(20 poena)
Upravljanje memorijom
a)(10) Ako je prilikom pokretanja linkera zaboravljena da se navede biblioteka koju treba povezati sa ostatkom programa, kakvu vrstu greške očekujete od linkera? Obrazložiti.
b)(10) U nekom računarskom sistemu i virtuelna i fizička adresa su 32-bitne, a adresibilna jedinica je bajt. Jedna mašinska reč je veličine 32 bita (to je i veličina tipa int). Virtuelna memorija je organizovana stranično, a tabela preslikavanja stranica (PMT) je organizovana u dva nivoa. Struktura virtuelne adrese je sledeća: P1(8 bita):P2(8 bita):D(16 bita), gde je P1 broj ulaza u tabeli prvog, P2 drugog nivoa, a D pomeraj unutar stranice. Svaki ulaz u tabelama i prvog i drugog nivoa ima 32-bitni sadržaj koji se tumači na sledeći način: Vrednost U tabeli prvog nivoa U tabeli drugog nivoa =0 Tabela drugog nivoa nije alocirana Stranica nije u memoriji = -1 (sve jedinice) Opseg adresa pokriven ovim Stranica nije dozvoljena za pristup ulazom nije dozvoljen za pristup ostalo Fizička adresa tabele drugog nivoa Fizička adresa okvira Sistemskim pozivom: void mem_reg(int start_addr, int num_of_pages)
korisnički proces „registruje“ opseg virtuelne memorije počev od adrese date prvim argumentom (adresa mora biti poravnata na početak stranice) i veličine date drugim argumentom (izraženo u broju stranica) kao dozvoljen za pristup. Ovaj poziv ne alocira stranice u fizičkoj memoriji, već se stranice alociraju i dohvataju na zahtev, kada im se prvi put pristupi (demand paging). I tabele drugog nivoa alociraju se tek kada im se prvi put pristupa. Dat je sledeći program: void main () { int start_addr = 0x10800000; mem_reg(start_addr,512); int* p = (int*)start_addr; for (int i=0; i<0x400000; i++,p++) int dummy = *p; }
Ceo kod programa zauzima jednu, prvu stranicu virtuelnog prostora, a njegov stek još jednu, narednu stranicu. Jezgro operativnog sistema smešta tebele preslikavanja u posebno alocirane okvire memorijskog prostora i pakuje ih kompaktno, više njih u isti okvir, onoliko koliko može da ih stane. Koliko fizičke memorije (izražene u bajtovima) zauzima proces kreiran nad ovim programom na samom kraju svog izvršavanja, računajući i prostor alociran za same stranice virtuelnog prostora procesa, kao i onaj alociran za tabele preslikavanja?
31/91
Odgovor: _____________ 3.
(10 poena)
Ulazno/izlazni podsistem
Potrebno je realizovati drajver (device driver) za jedan izlazni, znakovno orijentisani uređaj, pri čemu korisnički proces može zadati prenos čitavog niza znakova koje će DMA upisivati na uređaj znak po znak. Korisnički proces koji zadaje izlaznu operaciju svoj zahtev predstavlja sledećom strukturom: struct DeviceRequest { char* block; // Pokazivač na niz znakova koje treba preneti na uređaj unsigned long size; // Veličina niza znakova Semaphore* toSignal; // Semafor koji treba signalizirati po završetku op. unsigned int status; // Status izvršene operacije dobijen od uređaja };
Korisnički proces svoj zahtev zapisan u ovakvoj strukturi (osim polja status koje upisuje drajver po završenoj operaciji) upisuje u ograničeni bafer koji predstavlja red postavljenih zahteva, a potom se blokira na standardnogm brojačkom semaforu na koji ukazuje pokazivač toSignal. Ograničenom baferu pristupa se sledećim operacijama koje su blokirajuće ukoliko je bafer pun, odnosno prazan: void putDeviceRequest (DeviceRequest*); // Stavlja jedan zahtev u red DeviceRequest* getDeviceRequest(); // Uzima jedan zahtev iz reda
Sama izlazna operacija obavlja se preko DMA uređaja kome se prenos niza znakova block veličine size iz memorije na uređaj zadaje i pokreće sledećom neblokirajućom operacijom: void DMARequest (char* block, unsigned long size);
Kada završi prenos bloka podataka, DMA ne generiše prekid, već postavlja najniži bit svog statusnog registra na 1. Vrednost statusnog registra DMA može se dobiti operacijom: unsigned int DMAStatus ();
Korišćenjem navedenih operacija (za koje se pretpostavlja da su implementirane) i koncepta niti, sa interfejsom kao što je definisano projektnim zadatkom za domaći rad, napisati kompletan kod ovog drajvera uređaja. 4.
(15 poena)
Fajl podsistem
a)(5) U nekom fajl sistemu primenjuje se sistem provere prava pristupa koja se definišu preko tri bita (rwx) za korisnika koji je kreirao fajl (tzv. vlasnik, engl. owner) i za sve ostale korisnike. Dat je prikaz jedne interakcije korisnika i sistema preko komandne linije: > dir -all my.dir 02/06/2008 12:34 rw-r-a.txt 02/06/2008 12:40 rw-r-p.exe 02/06/2008 12:45 rwxr-> run p.exe Error: Access denied. > delete a.txt
Da li će ova poslednja operacija brisanja fajla ( del a.txt) biti uspešna? Obrazložiti.
b)(10) Posmatraju se tri načina rukovanja slobodnim prostorom u nekom fajl sistemu: 1) Pomoću bit-vektora koji se smešta u tačno određene blokove na disku.
32/91
2) Pomoću ulančane liste, pri čemu se pokazivači za ulančavanje smeštaju neposredno u slobodne blokove. 3) Pomoću ulančane liste slobodnih blokova, ali uz korišćenje FAT (File Allocation Table). Uporediti sledeće karakteristike ovih tehnika i odgovoriti koja je od navedenih tehnika efikasnija. Odgovore obrazložiti. i)(4) Koja tehnika, 1 ili 2, je generalno efikasnija u smislu korišćenja prostora na disku i količine korisnog prostora za podatke? ii)(3) Koja tehnika, 1 ili 2, je generalno efikasnija u smislu brzine alokacije nekoliko slobodnih blokova na disku? iii)(3) Koja tehnika, 2 ili 3, je generalno efikasnija u smislu brzine alokacije nekoliko slobodnih blokova na disku? 1.
(25 poena)
Upravljanje procesima
(a)(10) U jezgru nekog jednoprocesorskog operativnog sistema postoje sledeće deklaracije: void lock (); // Mask interrupts void unlock (); // Unmask interrupts struct PCB; // Process Control Block extern PCB* running; // Running process void yield (WORD* prev, WORD* next); // WORD is a type that can store SP void dispatch () { lock(); PCB* prev = running; Scheduler::put(prev); PCB* next = Scheduler::get(); yield(prev->sp,next->sp); running = next; unlock(); }
Funkcija yield() izgleda kao ona data na predavanjima: ona najpre sačuva sve programski dostupne registre na tekućem steku, potom sačuva tekući pokazivač steka u lokaciju na koju ukazuje prvi argument, potom postavlja pokazivač steka na vrednost uzetu iz lokacije na koju ukazuje drugi argument, i najzad vraća kontekst izvršavanja sa tog novog steka. U strukturi PCB postoji polje sp u kome se čuva vrednost pokazivača steka datog procesa. Pretpostaviti da klasa Scheduler poseduje statičku operaciju get() koja iz reda spremnih procesa uzima i vraća onaj PCB koji je na redu za izvršavanje, i statičku operaciju put(PCB*) koja u taj red stavlja dati PCB. Pretpostaviti takođe da se sve promene konteksta u ovom jezgru rade kroz operaciju yield(). Da li je implementacija operacije dispatch() za promenu konteksta valjana? Precizno obrazložiti odgovor. (b)(5) Pretpostavka je da standardni sistemski poziv execlp() u slučaju bilo kakve greške ne vrši nikakvu akciju i samo vraća pozivaocu kod greške koji je uvek različit od 0. Da li i kada sledeći program ispisuje rečenicu „Ok. Started program...“? Precizno obrazložiti odgovor.
33/91
#include void main (int argc, char* argv[]) { if (argc>1) if (execlp(argv[1])!=0) printf(„Cannot start program %s.\n“, argv[1]); else printf(„Ok. Started program %s...\n“, argv[1]); }
c)(10) Korišćenjem standardnih brojačkih semafora implementirati ograničeni bafer u kome operacija stavljanja dodaje jedan podatak tipa int u bafer, a operacija uzimanja vadi dva susedna podatka tipa int iz bafera (u istom pozivu). 2.
(20 poena)
Upravljanje memorijom
a)(10) Posmatra se prevodilac koji prevodi izvorni kod i generiše mašinski kod za deljenu biblioteku sa dinamičkim vezivanjem (DLL) u sistemu sa virtuelnom memorijom. Navesti koji načini adresiranja mogu da se koriste u mašinskom kodu koga generiše ovaj prevodilac za pristup do statičkog podatka u takvoj biblioteci (u tabelu upisati „Da“ ili „Ne“): Način adresiranja Apsolutno Relativno u odnosu na SP Relativno u odnosu na PC
Dozvoljen?
b)(10) U nekom sistemu sa straničnom organizacijom virtuelne memorije koristi se copy-onwrite tehnika deljenja stranica između procesa. U deskriptoru stranice u tabeli preslikavanja stranica (PMT) procesa nalaze se samo sledeće informacije: broj okvira u koji se stranica preslikava (0 označava da stranica nije u memoriji, stranica broj 0 ne sme da se adresira) i biti prava pristupa (R-dozvoljeno čitanje u fazi izvršavanja instrukcije/dohvatanja operanda, Wdozvoljen upis, E-dozvoljeno čitanje u fazi dohvatanja instrukcije). Pored PMT, operativni sistem za svaki proces vodi posebnu strukturu podataka koju naziva VMStruct i u kojoj se čuvaju podaci koje koristi operativni sistem, a koji nisu potrebni hardveru za preslikavanje adresa. Svaki deskriptor u ovoj strukturi opisuje čitav skup susednih stranica koje predstavljaju logičku celinu, jer su svi ovi podaci za njih isti, i koji se u ovom kontekstu naziva region. U ovom deskriptoru čuvaju se sledeći podaci: prva stranica u skupu stranica na koje se deskriptor odnosi (Start Page#), broj susednih stranica na koje se deskriptor odnosi (Region Length), biti prava pristupa na logičkom nivou (R-dozvoljeno čitanje u fazi izvršavanja instrukcije/dohvatanja operanda, W-dozvoljen upis, E-dozvoljeno čitanje u fazi dohvatanja instrukcije), da li su stranice u ovom regionu deljene tako da ih treba kopirati pri prvom upisu (Copy-On-Write: 0-nisu deljene, 1-jesu deljene i treba ih kopirati pri upisu, samo ako je upis dozvoljen na logičkom nivou), kao i mesto na disku gde se zamenjuju stranice iz tog regiona (nije relevantno za ovaj zadatak). Posmatra se proces Parent čiji su delovi struktura PMT i VMStruct dati u nastavku. PMT VMStruct Page#
Frame#
112h 202h 330h
17h 56h 14h
RW E 001 110 110
34/91
StartPage# 100h 200h 300h
Region Length 25h 5h 40h
RWE-Copy-On-Write 001-0 110-0 110-0
Opis Code Region Data Region Stack Region
35/91
Ovaj proces izvršava sistemski poziv fork() i uspešno kreira proces potomak Child. Prikazati iste delove struktura PMT i VMStruct za oba procesa Parent i Child neposredno nakon ovog poziva. Sistem primenjuje demand paging strategiju (dohvata stranicu tek kada se prvi put zatraži, ne alocira je odmah pri kreiranju procesa). 3.
(10 poena)
Ulazno/izlazni podsistem
U nekom disk-podsistemu postoje dva istovetna fizička diska, svaki sa svojim posebnim DMA kanalom, koji imaju identičan sadržaj, odnosno koji sadrže identične kopije istog sadržaja, pa se spolja logički posmatraju kao jedan jedinstven disk. Smisao ove konfiguracije jeste povećanje pouzdanosti celog disk-podsistema: ukoliko otkaže jedan fizički disk, sadržaj je raspoloživ na drugom sve dok se onaj pokvareni ne zameni. Precizno objasnite kako zahteve za čitanje i zahteve za upis na logički disk treba usmeravati na fizičke diskove. Obratiti pažnju da se može ostvariti i poboljšanje performansi (povećanje propusnosti ukupnog disk-podsistema) pri operacijama čitanja. 4.
(15 poena)
Fajl podsistem
a)(5) U operativnim sistemima uobičajen je protokol u kome se svaki proces pokreće „u ime“ nekog korisnika (koji je njegov „pokretač“ ili „vlasnik“), i to istog onog u čije ime je pokrenut i roditeljski proces koji je pokrenuo taj proces odgovarajućim sistemskim pozivom za kreiranje procesa, pri čemu se početni procesi (npr. školjka) pokreću u ime korisnika koji se prijavio na sistem implicitno po prijavljivanju (log-in) tog korisnika. Prava pristupa do fajlova određuju se na nivou korisnika i grupa korisnika. Precizno obrazložiti kakve bi posledice u smislu pristupa do fajlova imalo uvođenje mogućnosti da se u sistemskom pozivu za kreiranje procesa procesdete kreira tako da se izvršava „u ime“ nekog drugog korisnika, a ne istog onog u čije ime se izvršava i proces-roditelj, pri čemu bi ta mogućnost bila dozvoljena svim procesima. b)(10) Neki fajl sistem koristi FAT (File Allocation Table) pristup alokaciji blokova za fajlove. FAT se kešira u memoriju u strukturu deklarisanu na sledeći način: typedef unsigned long int FATIndex; // FAT entry number const FATIndex FATSize = ...; // FAT (and disk) size struct FATEntry { unsigned short int isFree; // Is this block free (1) or allocated (0) FATIndex next; // Next block in the file’s block chain; 0 for terminator }; FATEntry fat[FATSize] ; // The FAT
Kontrolni blok fajla (File Control Block, FCB) je deklarisan na sledeći način: struct FCB { ... FATIndex sizeInBlocks; // Current file size in number of blocks FATIndex firstBlockNo; // Pointer to the first block (FAT entry number) ... };
Potrebno je realizovati funkciju: void clearFile (FCB* file);
koja treba da „obriše“ sadržaj fajla, odnosno dealocira blokove koje fajl zauzima, bez uklanjanja fajla kao objekta iz fajl sistema. 1.
(25 poena)
Upravljanje procesima
(a)(10) Školsko jezgro treba prilagoditi izvršavanju na procesorima niske potrošnje energije koji se koriste u prenosivim uređajima. Ovakvi procesori poseduju podršku za tzv. hibernaciju, tako što se posebnom instrukcijom procesor može prebaciti u modalitet niske snage (low-power mode), kada zapravo ne izvršava nikakve instrukcije (i time troši manje energije), već stoji ovako „uspavan“ sve dok ne dobije prekid i pređe na izvršavanje prekidne rutine. Zbog toga, u jezgru više ne postoji idle proces/nit koji je uvek spreman i koji jalovo troši procesorske cikluse kada nema drugih spremnih procesa, već red spremnih procesa može biti i prazan ako su svi procesi blokirani. U tom slučaju, procesor treba hibernirati. Potrebno je izvršiti modifikaciju implementacije semafora (klase Semaphore) tako da iskoristi ovu mogućnost i prebaci procesor u hibernaciju ako nema spremnih procesa, tj. ako se na semaforu blokirao poslednji spreman proces. Operaciju signaliziranja semafora treba prilagoditi za poziv i iz prekidne rutine: prekidna rutina može pozvati signal na nekom semaforu i tako deblokirati proces (i time probuditi procesor iz hibernacije ako je u njoj bio), ili vratiti procesor u hibernaciju, ako je prekid samo uvećao vrednost semafora na kome nije bilo blokiranih procesa (niti ima drugih spremnih procesa). Pretpostaviti da operacija Scheduler::get vraća 0 ako je red spremnih procesa prazan, a da operacija hibernate() prebacuje procesor u hibernaciju. Dati modifikovanu klasu Semaphore. (b)(10) Dva nezavisna i uporedna procesa PX i PY upisuju vrednosti koje nekako izračunaju u deljene promenljive x i y, respektivno. Proces PZ čita x odnosno y i ispisuje ga na standardni izlaz. Ove svoje aktivnosti procesi obavljaju ciklično. Pomoću standardnih brojačkih semafora potrebno je obezbediti sledeću sinhronizaciju. Proces PZ može da pročita i ispiše vrednost x tek kada je proces PX upisao novu vrednost u tu promenljivu, a PX može da upiše novu vrednost u x tek kada je PZ prethodnu vrednost pročitao i ispisao. Analogno važi za PY i y. Pri tome, PZ treba da čita i ispisuje x, odnosno y u proizvoljnom i nezavisnom redosledu, ne obavezno naizmenično, već tako da iskoristi onu vrednost (x ili y) koja je spremna, nezavisno od toga da li je ona druga spremna. Procesi PX i PY i deljene promenljive izgledaju ovako:
shared var x, y : integer = 0; fX, fY : boolean = false; wrX, wrY : semaphore = 1; rd : semaphore = 0; process PX; begin loop wrX.wait; x:=...; fX:=true; rd.signal; end; end;
process PY; begin loop wrY.wait; y:=...; fY:=true; rd.signal; end; end;
Napisati proces PZ. c)(5) Koliko ukupno procesa nastane (uključujući i početni) kada se nad sledećim programom kreira proces, pod uslovom da su svi sistemski pozivi uspešni? const unsigned int N = ...; // N>0 void main () { for (unsigned int i=0; i
Odgovor: ________________
2.
(20 poena)
Upravljanje memorijom
a)(5) Počeli ste razvoj nekog svog velikog programa koji se sastoji od mnogo izvornih fajlova, preveli ste ih i prvi put pokrenuli linker koji je tada prijavio nekoliko desetina grešaka tipa „Simbol ... nije definisan“. Šta ćete prvo proveriti? Odgovor:
b)(5) Neki program treba organizovati u preklope (overlays). Na slici je prikazan graf poziva potprograma u ovom programu nastao statičkom analizom (čvorovi predstavljaju potprograme, grana je usmerena od pozivaoca prema pozvanom potprogramu). Predložiti organizaciju ovog programa – navesti koji potprogrami bi bili u stacionarnom modulu koji se inicijalno učitava i uvek ostaje u memoriji, a koji u preklopima i kako se preklapaju.
main
extract sort getItem
store
compare
strcmp
c)(10) U nekom sistemu sa virtuelnom memorijom broj stranice u virtuelnoj adresi je veličine 48 bita. Da bi čuvanje PMT učinio izvodljivim, sistem koristi hash tabelu sa 64K ulaza za smešanje PMT svakog procesa. Hash funkcija je prosta modulo funkcija: ulaz u tabelu određuje se pomoću 16 najnižih bita broja stranice. U svakom ulazu hash tabele nalazi se 64-bitna glava ulančane liste zapisa za alocirane stranice koje se preslikavaju u taj ulaz. Svaki zapis sadrži viših 32 bita broja stranice, broj okvira u koji je ta stranica preslikana (32 bita, vrednost 0 označava da stranica nije u memoriji) i pokazivač na sledeći zapis (64 bita, vrednost 0 označava kraj liste). Napisati proceduru drop(unsigned long* pmt, unsigned long page) koja se poziva da bi se data stranica u datoj PMT proglasila izbačenom iz memorije. Pretpostaviti da je tip int 32bitni, tip long 64-bitni, a tip short 16-bitni. 3.
(10 poena)
Ulazno/izlazni podsistem
U nekom sistemu podržan je samo asinhroni izlaz na izlazni uređaj pomoću sledećeg API. Funkcija IOReqID output (IODevID deviceID, IOReq* request);
zadaje (asinhrono) izlaznu operaciju specifikovanu drugim argumentom na uređaju identifikovanom prvim argumentom. Ova funkcija odmah vraća kontrolu pozivaocu, uz identifikaciju zadate operacije (rezultat tipa IOReqID je veći od 0 u slučaju ispravno zadatog zahteva). Funkcija void ioWait (IOReqID);
blokira pozivajući proces sve dok operacija identifikovana argumentom nije završena u potpunosti. Pomoću ovih funkcija realizovati funkciju koja, u odnosu na jedan argument, može zadati operaciju sinhrono ili asinhrono, prema želji pozivaoca.
4.
(15 poena)
Fajl podsistem
a)(5) Neki fajl sistem podržava direktorijume sa strukturom usmerenog acikličkog grafa (DAG). Posmatraju se dva različita pristupa realizaciji operacije brisanja fajla sa zadatim simboličkim imenom (stazom, referencom): brisanje fajla i svih drugih referenci prilikom bilo kog (tj. prvog) zahteva sa brisanjem (tj. preko bilo koje reference) i brisanje fajla tek pri zahtevu za brisanjem preko poslednje preostale reference (pre toga se brišu samo reference, ne i fajl). Koja varijanta je po vašem mišljenu jednostavnija za implementaciju i zbog čega? 1.
(25 poena)
Upravljanje procesima
(a)(10) Neki RISC procesor ima registarski fajl sa 32 registra opšte namene označenih sa r0 do r31. Adresibilna jedinica je mašinska reč, a svi programski dostupni registri, uključujući i PC i SP su veličine jedne reči. Pri skoku u potprogram na steku se čuva samo PC. Kontekst niti čuva se u sledećoj strukturi: struct PCB { int sp, r1, r2, ..., r31; };
Po uzoru na implementaciju datu na predavanjima, realizovati funkciju: void yield (PCB* cur, PCB* next);
koja vrši promenu konteksta niti na čiji PCB ukazuje prvi argument na kontekst niti na čiji PCB ukazuje drugi argument. Sadržaj registra r0 treba čuvati na steku, jer se on jedini može menjati u funkciji yield. (b)(10) Data su dva segmenta koda dva uporedna procesa. Namera je da izvršavanje svakog od ovih segmanata koda umanji odgovarajuću deljenu promenljivu a ili b za po 100, ali da se vrednosti ovih promenljivih uvek očuvaju tako da je njihov zbir veći ili jednak 0. Inicijalno nije obezbeđeno međusobno isključenje ovih segmenata. begin if a+b>=100 then a:=a-100; end;
begin if a+b>=100 then b:=b-100; end;
i)(5) Precizno objasniti koja neregularna situacija može da nastane i kako. ii)(5) Pridružiti svakoj promenljivoj (a i b) po jedan standardni brojački semafor, a onda pomoću tih semafora sprečiti nastanak ove neregularne situacije, pri čemu treba paziti da ne nastane mrtva blokada.
(c)(5) Korišćenjem standardnih sistemskih poziva fork() i execlp() napisati program bore.txt koji, kada se nad njim pokrene proces, najpre izvršava svoju proceduru proc(), a zatim pokreće nov proces nad istim programom i ugasi se, ali tako da se taj program u procesudetetu izvršava ispočetka. Voditi računa da izvršavanje ispočetka treba da ima početno stanje eventualnih statičkih podataka, propisno inicijalizovanih prilikom učitavanja programa, a koje procedura proc() potencijalno menja. 2.
(20 poena)
Upravljanje memorijom
a)(5)
U nekom programu prijavljena je sledeća greška:
Error 1 error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup MSVCRTD.lib MyProgram
Ko je prijavio ovu grešku: prevodilac, linker, ili izvršno okruženje? Precizno objasnite uzrok ove greške. b)(5) U nekom operativnom sistemu, kod kernela se izvršava u zaštićenom procesorskom režimu, ali i u tom režimu procesor preslikava virtuelne u fizičke adrese kroz PMT na koju ukazuje poseban registar procesora. Objasniti kako kernel može da pristupa celoj fizičkoj memoriji ovog procesora da bi mogao da održava svoje strukture podataka koje se mogu nalaziti u svim delovima fizičke memorije, pa i delovima memorije koji pripadaju korisničkim procesima (na primer, vidi zadatak pod c) za primer potrebe za ovakvim pristupom). c)(10) U nekom sistemu sa straničnom organizacijom virtuelne memorije slobodni okviri ulančani su u jednostruko ulančanu listu na koju ukazuje glava freeFrameList, dok se pokazivači za ulančavanje upisuju na početak samog slobodnog okvira (struktura Frame). Date su sledeće deklaracije: struct Frame { Frame* next; }; extern Frame* freeFrameList; typedef unsigned int* PMT; const int OFFSET = ...;
Sve adrese su veličine jedne mašinske reči (tip unsigned int). PMT je u jednom nivou i u svakom ulazu veličine jedne reči sadrži samo broj okvira u koji se stranica preslikava (0 označava da stranica nije u memoriji). Konstanta OFFSET predstavlja širinu polja za ofset unutar virtuelne adrese. Implementirati funkciju: unsigned int allocateFrames (PMT pmt, unsigned int page, unsigned int n);
koja treba da dodeli n slobodnih okvira procesu čija je PMT data prvim argumentom i alocira ih u deo virtuelnog adresnog prostora počev od stranice broj page, i vrati broj stvarno alociranih okvira koji može biti i manji od n, ukoliko nema dovoljno slobodnih okvira. 3.
(10 poena)
Ulazno/izlazni podsistem
Implementirati internu nit jezgra, zajedno sa odgovarajućom prekidnom rutinom, koja uzima jedan po jedan zahtev za ulaznom operacijom na nekom ulaznom uređaju iz ograničenog bafera i
obavlja prenos bloka podataka zadat tim zahtevom korišćenjem dva raspoloživa kanala nekog DMA uređaja. Ova dva kanala omogućavaju dva uporedna prenosa sa istog uređaja. Ograničeni bafer, realizovan klasom InputBuffer, u sebi ima implementiranu sinhronizaciju proizvođača i potrošača. Zahtev ima sledeću strukturu: struct InputRequest { char* buffer; // Buffer with data (block) unsigned int size; // Buffer (blok) size Semaphore* toSignal; // Semaphore to signal on request completion };
Kada se završi prenos zadat zahtevom, potrebno je signalizirati semafor na koga ukazuje InputRequest::toSignal i obrisati zahtev. Date su deklaracije pokazivača preko kojih se može pristupiti registrima DMA uređaja, pošto su oni inicijalizovani adresama tih registara: typedef unsigned int REG; REG* dmaCtrl[2] =...; // control registers for 2 DMA channels REG* dmaStatus[2] =...; // status registers for 2 DMA channels REG* dmaBlkAddr[2] =...; // data block address registers for 2 DMA channels REG* dmaBlkSize[2] =...; // data block size registers for 2 DMA channels
U upravljačkim registrima najniži bit je bit Start kojim se pokreće prenos na datom DMA kanalu, a u statusnim registrima najniži bit je bit spremnosti (Ready) čija vrednost 1 ukazuje da je dati DMA kanal spreman za novi prenos podatka (inicijalno je tako postavljen). Postavljanje bilo kog od ova dva bita spremnosti kada neki kanal završi prethodni prenos generiše signal zahteva za prekid na istom IRQ ulazu. Na raspolaganju za implementaciju potrebne sinhronizacije između prekidne rutine i niti su standardni brojački semafori, čija se operacija signal može pozivati iz prekidne rutine. 4.
(15 poena)
Fajl podsistem
Neki fajl sistem koristi indeksirani pristup alokaciji fajlova sa neograničenim brojem blokova za indeks fajla, ulančanim u jednostruku listu. Polje index u strukturi FCB sadrži broj prvog indeksnog bloka u listi. Broj narednog indeksnog bloka u listi nalazi se na samom početku svakog indeksnog bloka. Broj bloka 0 u indeksu označava null - nealociran ulaz (fizički blok broj 0 se nikada ne koristi za fajlove). Konstanta INDEXSIZE definiše broj ulaza u jednom indeksu (u jednom bloku), uključujući i prvi ulaz koji ukazuje na sledeći indeksni blok, a tip BLKNO predstavlja broj bloka (logičkog ili fizičkog). a)(10) Realizovati funkciju koja se koristi kod direktnog pristupa fajlu: void* f_getblk(FCB* file, BLKNO logical);
koja vraća pokazivač na dohvaćeni i keširani blok sa podacima fajla sa datim logičkim brojem. Na raspolaganju je funkcija: void* f_getblk(BLKNO physical);
koja vraća pokazivač na keširani blok sa datim fizičkim brojem i učitava ga u keš ako je potrebno.
b)(5) Koliko je blokova raspoloživo za podatke nekog fajla za koga je alocirano ukupno 3K blokova na disku (i za indeksne blokove i za blokove za podatke zajedno), ako je INDEXSIZE=1024? Odgovor: ______________________________ 1.(3)
Ukratko objasniti osnovni motiv uvođenja multiprogramiranja u računarske sisteme.
2.(3) Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati program koji vrši prenos bloka podataka iz memorije na izlazni uređaj tehnikom programiranog izlaza korišćenjem prozivanja (polling). Samostalno usvojiti potrebne detaljne pretpostavke. 3.(3) Ukoliko su svi sistemski pozivi izvršeni uspešno, koliko procesa se ukupno kreira kada se nad sledećim programom kreira jedan proces (računajući i taj jedan)? void main () { for (int i=0; i<3; i++) fork(); }
Odgovor: __________________________ 4.(3) Korišćenjem školskog jezgra napisati kod klase koja apstrahuje nit koja, ukoliko se kreira sa neparnim celobrojnim parametrom, kreira još jednu takvu istu nit, samo sa parnim celobrojnim parametrom, a u suprotnom se samo završava. 5.(3) Kada najranije linker može prijaviti grešku tipa nedefinisanog simbola, a kada višestruko definisanog simbola (tokom prvog prolaza, nakon prvog prolaza, tokom drugog prolaza, ili nakon drugog prolaza)? Odgovor: ________________________________________________________________________ 6.(3) U nekom sistemu primenjuje se best-fit algoritam kontinualne alokacije memorije. Inicijalno je prostor veličine 256KB potpuno slobodan za alokaciju korisničkih procesa. Potom su različiti procesi zadavali sledeće zahteve (slovna oznaka označava proces koji je postavio zahtev, brojna oznaka označava veličinu alociranog prostora u KB, a minus označava gašenje procesa i oslobađanje njegove memorije): A64, B16, C128, D32, A-, E8, F32, BOdgovoriti na sledeća pitanja koja se odnose na stanje memorije nakon ove sekvence zahteva: i)
Koliko je ukupno slobodnih fragmenata? Odgovor: _____________
ii)
Kolika je veličina najmanjeg slobodnog fragmenta? Odgovor: _____________
iii)
Kolika je veličina najvećeg slobodnog fragmenta? Odgovor: _____________
7.(3) Virtuelna memorija organizovana je stranično, a adresibilna jedinica je bajt. Virtuelna adresa je 32-bitna, stranica je veličine 4KB, deskriptor stranice je 32-bitni, a PMT je organizovana u dva nivoa, pri čemu je polje za straničenje prvog nivoa veličine 8 bita. Koliki prostor bi ukupno zauzimala PMT nekog procesa kada bi: a) proces koristio ceo svoj virtuelni adresni prostor? Odgovor: ________________ b) proces koristio samo jednu stranicu? Odgovor: ________________ 8.(3) Umesto tehnike spooling, pristup uporednih procesa štampaču u nekom sistemu omogućuje se međusobnim isključenjem pomoću operacije rezervacije: svaki proces, pre nego što zatraži bilo koju operaciju sa štampačem, mora da ga rezerviše, a tu rezervaciju otpušta tek kada završi sa celim jednim poslom štampe. Šta je nedostatak ove tehnike? 9.(3) Neki fajl sistem pruža sledeće operacije u svom API za tekstualne fajlove: FHANDLE open(char* filename) Otvara fajl sa datim imenom. void close(FHANDLE) Zatvara dati fajl. int size(FHANDLE) Vraća trenutnu veličinu sadržaja fajla u znakovima. void append(FHANDLE,int) Proširuje sadržaj fajla za dati broj znakova na kraju. void seek(FHANDLE,int) Postavlja kurzor datog fajla na datu poziciju (redni broj znaka počev od 0). void write(FHANDLE,char*) Na poziciju kurzora datog fajla upisuje dati niz znakova, ne uključujući završni znak ‘\0’, i pomera kurzor iza upisanog niza znakova. Napisati program koji na kraj postojećeg fajla sa imenom proba.txt upisuje sve što je uneseno preko standardnog ulaza, sve dok se na ulazu ne unese znak ’X’. Zanemariti sve potencijalne greške u ulazu/izlazu. 10.(3) Koliko pristupa blokovima na disku treba izvršiti za pristup n-tom logičkom bloku sadržaja fajla ako je alokacija fajla a) FAT, pri čemu je FAT uvek inicijalno učitana u memoriju prilikom montiranja fajl sistema, b) indeksna, pri čemu je ceo indeks fajla u jednom bloku? Odgovor: a) ____________ b) ______________ 1.
(25 poena)
Upravljanje procesima
(a)(10) Neki operativni sistem podržava koncept za sinhronizaciju između niti koga naziva „kapijom“ (engl. gate). Ovaj koncept realizovan je klasom Gate koja poseduje sledeći interfejs: class Gate { public: Gate (); // Initially closed void open(); // Open the gate void close(); // Close the gate void pass();// Pass through the gate (when it’s open) and close it behind };
Konstruktor ove klase kreira kapiju u zatvorenom stanju. Operacija close() zatvara kapiju bez blokiranja pozivajuće niti. Operacija pass() predstavlja „prolaz“ kroz kapiju uz zatvaranje kapije u atomičnoj (neprekidivoj) sekvenci: ukoliko je kapija zatvorena, pozivajuća nit se blokira sve dok neka druga nit ne otvori kapiju pozivajuću open(), a zatim ponovo zatvara kapiju, ostavljajući blokirane ostale niti koje su čekale ispred kapije. Operacija open() otvara kapiju i kroz nju propušta jednu od niti koje čekaju ispred nje, ukoliko takvih ima. Sve ove operacije su atomične (nedeljive). Po uzori na implementaciju semafora, korišćenjem bibliotečnih funkcija setjmp() i longjmp(), implementirati koncept kapije. (b)(10) Pokazati kako se korišćenjem opisanog koncepta kapije realizuje međusobno isključenje kritične sekcije i uslovna sinhronizacija. (c)(5) Precizno objasniti zbog čega je potreban mehanizam raspodele vremena (time sharing) kod interaktivnih višeprocesnih i višekorisničkih operativnih sistema. 2.
(20 poena)
Upravljanje memorijom
a)(10) Kada prevodi kod potprograma u kome se pristupa statičkom podatku, da li prevodilac može da upotrebi apsolutni način adresiranja (unutar adresnog prostora procesa) u instrukciji pristupa tom podatku za slučaj da je taj statički podatak definisan: (i)(5) van jedinice koju trenutno prevodi; (ii)(5) u istoj jedinici koju trenutno prevodi, sa ciljem da se taj potprogram može deliti između više procesa sa virtuelnim adresnim prostorima kao deo deljene biblioteke. Obrazložiti odgovore. b)(10) U nekom sistemu primenjuje se kontinualna alokacija operativne memorije, uz postojanje registra za relokaciju (relocation register) i registra granice (limit register) u procesoru i PCB strukturi procesa. PCB strukture svih kreiranih procesa vezane su u ulančanu listu uređenu po rastućem redosledu početne fizičke adrese memorijskog segmenta koji zauzima dati proces (zapravo po vrednosti relokacionog registra). Dat je fragment definicije PCB (sve vrednosti pokazivača predstavljaju fizičke adrese): struct PCB { ... PCB* next; // Pointer to the next PCB in memory list int* startAddr; // Starting address of memory segment (relocation reg.) size_t size; // Size of memory segment (limit register) } PCB* firstPCB; // The first PCB in memory list
Na raspolaganju je funkcija memcopy(int* from, int* to, size_t size) koja kopira memorijski blok dužine size sa lokacije from na lokaciju to (blokovi se mogu i preklapati). Napisati proceduru kernela memcompact() za kompakciju memorijskog prostora. 3.
(10 poena)
Ulazno/izlazni podsistem
a)(5) Koja tehnika omogućava da se upis na neki izlazni, znakovno orijentisani uređaj sa strane procesa vrši kao blokovski upis? Precizno obrazložiti odgovor. b)(5) Koja tehnika omogućava da zahtev za štampanjem koji je dat pre isključenja računara bude obrađen nakon ponovnog uključenja računara? Precizno obrazložiti odgovor. 4.
(15 poena)
Fajl podsistem
a)(5) U cilju optimizacije vremena pristupa fajlovima, neki fajl sistem za isti fajl pokušava da alocira blokove na disku koji su međusobno što bliži. Koja struktura podataka za evidenciju slobodnih blokova je efikasnija u smislu brzine alokacije blokova prilikom proširenja postojećeg fajla – ulančana lista slobodnih blokova ili bitvektor? Obrazložiti.
b)(10) Neki operativni sistem na komandu dir iz komandne linije ispisuje listu fajlova u direktorijumu koji je naveden kao parametar ove komande, s tim da za svaki fajl ispiše najpre njegov jedinstveni identifikator u fajl sistemu, a onda i njegov nejedinstveni naziv i eventualno ostale atribute, ukoliko su zahtevani konfiguracionim parametrima ove komande. Fajl sistem podržava strukturu direktorijuma u obliku usmerenog acikličkog grafa (DAG), a isti fajl može imati različita imena u različitim direktorijumima. Dati su rezultati nekoliko sukcesivnih komandi dir: Komanda Rezultat dir / dir /a dir /b dir /a/c
1 2 3 6 7 5 7 4 5
a.dir b.dir c.dir d.txt e.doc f.exe g.doc h.exe k.exe
Nakon komande brisanja fajla /b/f.exe, koja je implementirana tako da briše fajl i sve reference na njega, popuniti donju tabelu rezultatima koje ispisuju date komande dir: Komanda Rezultat dir /
dir /a
dir /b
dir /a/c
1.
(25 poena)
Upravljanje procesima
(a)(10) U jezgru nekog jednoprocesorskog operativnog sistema postoje sledeće deklaracije: void lock (); // Mask interrupts void unlock (); // Unmask interrupts struct PCB; // Process Control Block extern PCB* running; // Running process void yield (WORD* prev, WORD* next); // WORD is a type that can store SP class Semaphore { public: Semaphore (int initVal=1) : myVal(initVal) {} void wait (); void signal (); private: int myVal; PCBQueue myQueue; };
Funkcija yield() izgleda kao ona data na predavanjima: ona najpre sačuva sve programski dostupne registre na tekućem steku, potom sačuva tekući pokazivač steka u lokaciju na koju ukazuje prvi argument, potom prebacuje pokazivač steka na vrednost uzetu iz lokacije na koju ukazuje drugi argument, i najzad vraća kontekst izvršavanja sa tog novog steka. U strukturi PCB postoji polje sp u kome se čuva vrednost pokazivača steka datog procesa. Pretpostaviti da klasa Scheduler poseduje statičku operaciju get() koja iz reda spremnih procesa uzima i vraća onaj PCB koji je na redu za izvršavanje, kao i da klasa PCBQueue poseduje operaciju put(PCB*) koja u red stavlja dati PCB. Pretpostaviti takođe da se sve promene konteksta u ovom jezgru rade kroz operaciju yield(). Korišćenjem ove operacije realizovati operaciju Semaphore::wait(). (b)(10) Operacija signalWait() ima za cilj da obezbedi atomičnu (nedeljivu) sekvencu operacija signal na prvom i wait na drugom datom semaforu. U dole datoj implementaciji koristi se klasičan brojački semafor za međusobno isključenje. Precizno objasniti šta u ovoj implementaciji ne valja.
Semaphore signalWaitMutex(1); void signalWait (Semaphore* s1, Semaphore* s2) { if (s1==0 || s2==0) return; // Exception signalWaitMutex.wait(); s1->signal(); s2->wait(); signalWaitMutex.signal(); }
(c)(5) U nekom C++ okruženju niti su predstavljene klasom Thread i imaju semantiku istu kao u jeziku Java (kako je pokazano i na predavanjima). Kreirana je jedna nit osnovne klase Thread čija operacija run() ima podrazumevano ponašanje (ne radi ništa): Thread* myThr = new Thread();
Precizno objasniti u čemu je razlika između poziva: myThr->start();
i myThr->run();
2.
(20 poena)
Upravljanje memorijom
a)(10) U nekom operativnom sistemu moguće je statičku biblioteku (.lib) koja ne uvozi, već samo izvozi simbole (i zato u sebi nema nerazrešenih adresa), „registrovati“ kao biblioteku sa dinamičkim vezivanjem (DLL). Precizno objasniti šta tačno radi sistem prilikom postupka „registracije“ ovakve biblioteke, a šta kada neki proces prvi put izvrši poziv za preslikavanje simbola iz date biblioteke u adresu u svom virtuelnom adresnom prostoru. b)(5) U nekom sistemu sa straničnom organizacijom virtuelne memorije preslikavanje virtuelnih u realne adrese vrši se i u kernel modu, odnosno i za izvršavanje koda kernela. Kako treba da izgleda preslikavanje adresa za kernel da bi on mogao da pristupi celom fizičkom adresnom prostoru i to tako da ga vidi „onakvog kakav jeste“, tj. da mu pristupa direktno navođenjem realnih fizičkih adresa, odnosno da preslikavanje za njega bude transparentno? c)(5) U nekom sistemu sa straničnom organizacijom virtuelne memorije i virtuelna i fizička adresa su 64-bitne, adresibilna jedinica je bajt, a neki proces je sistemu prijavio da koristi samo prvih 1G (giga) stranica, što iznosi 64TB (terabajta). Deskriptor stranice u PMT čuva samo broj okvira u fizičkoj memoriji. Sistem koristi registar ograničenja veličine PMT (page table length register, PTLR) da bi smanjio veličinu prostora potrebnog za smeštanje PMT samo na onaj deo koji proces zaista koristi. Koliko fizičke memorije treba alocirati za smeštanje PMT ovog procesa? Odgovor: ________________
3.
(10 poena)
Ulazno/izlazni podsistem
U školskom jezgru realizovati klasu IOStream. Svaki objekat ove klase treba da obavi zadatu ulaznu ili izlaznu operaciju sa zadatom periferijom korišćenjem mehanizma prekida. Novi objekat ove klase treba inicijalizovati sledećim parametrima: broj ulaza prekida koji generiše ova periferija, adresa upravljačkog registra, adresa registra za podatke periferijskog uređaja, vrsta operacije (ulaz ili izlaz), adresa memorijskog bafera sa podacima tipa unsigned int koje treba preneti, veličina bafera i pokazivač na semafor koji treba signalizirati po završetku operacije (može biti i null, kada ne treba signalizirati završetak). U upravljačkim registrima periferija najniži bit je bit Start kojim se pokreće periferija, a u statusnim registrima najniži bit je bit spremnosti (Ready) čija vrednost 1 ukazuje da je kontroler periferije spreman za prenos podatka preko svog registra za podatke; postavljanje ovog registra generiše prekid procesoru. Svi registri su veličine jedne mašinske reči (tip unsigned int) i preslikani su u memorijski adresni prostor, pa im se može pristupiti uobičajenim operacijama čitanja ili upisa preko pokazivača koji imaju vrednosti njihovih adresa. Jedan ulaz u interapt vektor tabeli inicijalizuje se pozivom: void init_IVT (int intNumber, interrupt void (*intRoutine)(int));
Prilikom poziva prekidne rutine, procesor na stek stavlja broj ulaza tog prekida koga prekidna rutina vidi kao svoj (jedini) argument tipa int. Iz prekidne rutine dozvoljeno je pozivati operaciju signal semafora. Smatrati da u jednom trenutku za jednu periferiju postoji najviše jedan zahtev. 4.
(15 poena)
Fajl podsistem
a)(5) Neki fajl sistem podržava organizaciju direktorijuma u obliku usmerenog acikličkog grafa (DAG). Zbog ovakve organizacije neophodni su sistemski pozivi za dve različite operacije kopiranja datog fajla na odredišno mesto. Predložiti ova dva sistemska poziva, napisati njihove deklaracije na jeziku C i objasniti njihovo značenje. U oba poziva zadaju se identifikator fajla koji se kopira („ručka“) i naziv (puna putanja) koji će imati iskopirani fajl. b)(10) U nekom fajl sistemu direktorijum se implementira kao običan fajl čiji je sadržaj organizovan korišćenjem hash tabele na sledeći način. U prvom delu sadržaja je sama hash tabela koja ima 4 ulaza (0..3). Svaki ulaz ima sadržaj koji predstavlja redni broj (počev od 1) zapisa u ulančanoj listi zapisa za taj ulaz. Ovi zapisi nalaze se u nastavku hash tabele u sadržaju. Vrednost 0 u ulazu označava praznu listu. U svakom zapisu u listama nalazi se naziv elementa direktorijuma (niz znakova), identifikator objekta u fajl sistemu kojim je predstavljen taj element (broj inode objekta) i pokazivač na sledeći zapis u listi zapisa za isti ulaz u hash tabeli. Ovaj pokazivač ima vrednost koja se tumači na isti način kao i u ulazu hash tabele (0 – null, >0 – redni broj). U nekom direktorijumu, koji je inicijalno bio prazan, kreirani su tim redom sledeći fajlovi (u trećoj koloni su date hash vrednosti njihovih naziva): Naziv inode# hash value alfa 100 3 beta 200 0 gama 300 1 delta 400 3
eta
500 1 Popuniti sadržaj hash tabele i lista zapisa u njenom nastavku za posmatrani direktorijum. Hash tabela: Ulaz Pokazivač na prvi zapis u listi 0 1 2 3 Lista zapisa: Ulaz Naziv inode# Sledeći 1 2 3 4 5 1.
(25 poena)
Upravljanje procesima
(a)(10) U jezgru nekog jednoprocesorskog operativnog sistema funkcija yield() vrši promenu konteksta dva procesa na čije PCB strukture ukazuju argumenti: void yield (PCB* oldProcess, PCB* newProcess);
Korišćenjem ove funkcije implementirati klasu Semaphore koja realizuje koncept standardnog brojačkog semafora sa operacijama wait() i signal(). Raspoređivanje je realizovano klasom Scheduler, a međusobno isključenje kritičnih sekcija jezgra funkcijama lock() i unlock(), kao u školskom jezgru. (b)(10) Korišćenjem standardnih brojačkih semafora, implementirati ograničeni bafer kapaciteta N elemenata tipa D, koji služi za adaptiranje veličine paketa koje koriste proizvođač i potrošač. Proizvođač proizvodi i u bafer stavlja po jedan podatak tipa D u jednom ciklusu, dok potrošač u jednom zahvatu uzima C podataka tipa D. N nije deljivo sa C. c)(5) Na jeziku C ili C++ napisati program cli za Unix koji ciklično radi sledeće. Najpre na standardni izlaz (npr. konzolu) ispisuje kurzor kao znak spremnosti za učitavanje (znak „>“), a potom učitava jednu liniju teksta sa standardnog ulaza, pri čemu ta linija predstavlja komandnu liniju u kojoj je prvi argument naziv programa, a ostali su parametri programa. Kada učita liniju, program cli pokreće novi proces nad programom zadatim u učitanoj komandnoj liniji, a kada se taj proces završi, ponovo ispisuje kurzor i prihvata novu komandnu liniju. Kada učita komandu „exit“, program cli se završava. Pretpostaviti da sistemski poziv execlp() prihvata jedan niz znakova u kome su i naziv programa i njegovi parametri. 2.
(20 poena)
Upravljanje memorijom
a)(5) Navesti koje simbole će prevodilac zapisati u zaglavlju proizvedenog .obj fajla kao simbole koji se izvoze, nakon prevoda sledećeg C fajla:
extern int alfa; extern unsigned beta; unsigned beta; void f(int,int); void g (); void h (float) {} void g (void*) {}
Odgovor: ________________________________________ b)(5) U nekom sistemu primenjuje se best-fit algoritam kontinualne alokacije memorije. Inicijalno je prostor veličine 256KB potpuno slobodan za alokaciju korisničkih procesa. Potom su različiti procesi zadavali sledeće zahteve (slovna oznaka označava proces koji je postavio zahtev, brojna oznaka označava veličinu alociranog prostora u KB, a minus označava gašenje procesa i oslobađanje njegove memorije): A64, B16, C128, D32, A-, E8, F32, BOdgovoriti na sledeća pitanja koja se odnose na stanje memorije nakon ove sekvence zahteva: i)
Kolika je ukupna veličina trenutno slobodne memorije? Odgovor: _____________
ii)
Koliko je ukupno slobodnih fragmenata? Odgovor: _____________
iii)
Kolika je veličina najmanjeg slobodnog fragmenta? Odgovor: _____________
iv)
Kolika je veličina najvećeg slobodnog fragmenta? Odgovor: _____________
c)(10) U nekom sistemu sa virtuelnom memorijom broj stranice u virtuelnoj adresi je veličine 48 bita. Da bi čuvanje PMT učinio izvodljivim, sistem koristi hash tabelu sa 64K ulaza za smešanje PMT svakog procesa. Hash funkcija je prosta modulo funkcija: ulaz u tabelu određuje se pomoću 16 najnižih bita broja stranice. U svakom ulazu hash tabele nalazi se 64-bitna glava ulančane liste zapisa za alocirane stranice koje se preslikavaju u taj ulaz. Svaki zapis sadrži viših 32 bita broja stranice, broj okvira u koji je ta stranica preslikana (32 bita, vrednost 0 označava da stranica nije u memoriji) i pokazivač na sledeći zapis (64 bita, vrednost 0 označava kraj liste). Neki proces je alocirao 256 najnižih i 256 najviših stranica svog virtuelnog adresnog prostora. Koliko prostora (u bajtovima) ukupno zauzima PMT ovog procesa? Odgovor: ___________ 3.
(10 poena)
Ulazno/izlazni podsistem
Na nekom računaru sa multiprogramskim operativnim sistemom neki kontroler periferije nema vezan svoj signal završetka operacije na ulaze za prekid procesora, ali je poznato vreme završetka operacije zadate tom uređaju u najgorem slučaju (maksimalno vreme završetka operacije). Za obradu ulazno/izlaznih operacija zadatih tom uređaju brine se poseban proces tog operativnog sistema. Kakvu uslugu treba operativni sistem da obezbedi, a ovaj proces da koristi, da bi se izbegla tehnika kojom se može detektovati završetak operacije čitanjem statusnog registra i ispitivanjem bita završetka operacije (polling), tj. da bi se izbeglo uposleno čekanje (busy waiting)? Precizno opisati kako ovaj proces treba da koristi ovu uslugu.
4.
(15 poena)
Fajl podsistem
a)(5) Neki fajl sistem podržava implicitno zaključavanje fajla prilikom njegovog otvaranja. Postoje dve vrste ključa: deljeni (shared, S), koji se traži prilikom otvaranja fajla samo za čitanje (proces koji je tako otvorio fajl ima pravo samo da čita iz fajla) i ekskluzivni (exclusive, X), koji se traži prilikom otvaranja fajla i za upis (proces koji je otvorio fajl ima pravo upisa). Popuniti sledeću tabelu upisivanjem oznaka onih procesa čiji će zahtev za otvaranjem istog fajla biti ispunjen, za svaki od dva data nezavisna slučaja. Procesi postavljaju zahteve redom navedenim u drugoj koloni, pri čemu oznaka npr. A-Rd označava da proces A postavlja zahtev za otvaranjem fajla za čitanje, a B-Wr da proces B postavlja zahtev za otvaranjem fajla za upis. Slučaj Zahtevi za otvaranje fajla Procesi koji su uspeli da otvore fajl 1 A-Rd, B-Rd, C-Wr, D-Rd, E-Wr 2 A-Wr, B-Wr, C-Rd, D-Rd, E-Rd b)(10) Neki fajl sistem koristi indeksirani pristup alokaciji blokova za fajlove, sa ulančavanjem blokova sa indeksima u listu. Na prvi indeksni blok u listi ukazuje polje indexBlockNo u FCB (file control block). Svaki indeksni blok sadrži EntriesInBlock ulaza tipa PBlockNo koji sadrže brojeve fizičkih blokova sa podacima, dok naredni (poslednji) ulaz tipa PBlockNo u indeksnom bloku sadrži broj sledećeg indeksnog bloka u listi (0 za kraj liste). FCB je deklarisan na sledeći način: typedef unsigned long int PBlockNo; // block number struct FCB { ... unsigned long sizeInBlocks; // Current file size in number of blocks PBlockNo indexBlockNo; // Pointer to the first index block ... };
Projektuje se sloj fajl sistema koji se bavi organizacijom fajla (file organization module). Ovaj modul održava memorijski keš na nivou fizičkih blokova diska, pa se učitani blokovi sa diska uvek nalaze u prostoru odvojenom za keš. Postojeća funkcija: Block* getDiskBlock (PBlockNo physicalFileBlockNo);
po potrebi učitava i vraća pokazivač na učitani blok za zadatim fizičkim rednim brojem na disku. Potrebno je realizovati funkciju: Block* getDataBlock(FCB* file, unsigned long logicalBlockNo);
koja treba da u memoriju učita blok sa logičkim rednim brojem datim drugim argumentom fajla čiji je FCB zadat prvim argumentom i da vrati pokazivač na taj blok.
1.
(25 poena)
Upravljanje procesima
(a)(10) U klasi Semaphore u školskom jezgru realizovati novu operaciju void Semaphore::signal(unsigned int n);
koja ima isti efekat kao da je standardna operacija signal() pozvana n puta u jednoj atomičnoj operaciji.
(b)(10) Dva procesa A i B pristupaju celobrojnoj deljenoj promenljivoj x tako što A uvećava x za a, a B za b, pri čemu ova uvećavanja treba da se obavljaju međusobno isključivo. Obezbediti potrebnu sinhronizaciju bez zaključavanja, optimističkim pristupom. Na raspolaganju je sledeća funkcija koja atomično, korišćenjem odgovarajuće hardverske podrške, poredi vrednosti argumenata p i q i ako su one jednake, zamenjuje vrednosti argumenata q i r (prenetih po referenci) i vraća true, u suprotnom vraća false. function compareAndSwap(p:integer, var q:integer, var r:integer) : boolean;
(c)(5) Šta je efekat pokretanja jednog inicijalnog procesa nad sledećim programom? const unsigned int N = ...; // N>=1 void main () { for (unsigned int i=N; i>0; i--) if (fork()!=0) break; }
2.
(20 poena)
Upravljanje memorijom
a)(10) U nekom sistemu postoji sledeći sistemski poziv: void* sc_load(char* filename);
Ovim pozivom učitava se sadržaj datog fajla u prvi slobodni deo memorije pozivajućeg procesa i vraća se adresa početka tog dela memorije. Korišćenjem ovog poziva, napisati kod za stub sledeće procedure koju treba dinamički učitati prilikom prvog poziva, a čiji se binarni kod nalazi u fajlu proc.bin: X proc (A a, B b, C c); // stub for proc
b)(5) Neki računar podržava segmentno-straničnu organizaciju virtuelne memorije, pri čemu je virtuelna adresa 16-bitna, fizički adresni prostor je veličine 8GB, a adresibilna jedinica je 16-bitna reč. Stranica je veličine 512B. Maksimalan broj segmenata u virtuelnom adresnom prostoru je 4. Prikazati logičku strukturu virtuelne i fizičke adrese i navesti širinu svakog polja. c)(5) Neki OS koristi kontinualnu alokaciju operativne memorije. Data je implementacija strukture podataka koja predstavlja zaglavlje svakog slobodnog fragmenta memorije, kao i funkcije alloc() za alokaciju kontinualnog segmenta memorije. Ova zaglavlja čine dvostruko ulančanu listu slobodnih fragmenata i upisuju se na sam početak svakog slobodnog fragmenta memorije.
typedef unsigned int size_t; struct FreeFragment { size_t size; // Veličina fragmenta FreeFragment* prev; // Prethodni u listi FreeFragment* next; // Sledeći u listi } FreeFragment* head; // Glava liste slobodnih fragmenata void* alloc (size_t) { FreeFragment* fit = 0; size_t fragment = 0; for (FreeFragment* cur = head; cur!=0; cur=cur->next) { if (cur->sizesize>fragment) { fragment = cur->size; fit = cur; } } if (fit==0) return 0; FreeFragment* newfrgm = (FreeFragment*)((char*)fit+sz); if (fit->prev) fit->prev->next = newfrgm; if (fit->next) fit->next->prev = newfrgm; FreeFragment* p = fit->prev; FreeFragment* n = fit->next; size_t s = fit->size-sz; newfrgm->prev = p; newfrgm->next = n; newfrgm->size = s; return fit; }
Koji algoritam primenjuje ovaj alokator? Odgovor: ________________________
3.
(10 poena)
Ulazno/izlazni podsistem
U nekom modularnom operativnom sistemu drajveri za raznovrsne ulazno/izlazne blokovski orijentisane uređaje registruju se kao moduli na sledeći način. Sistem održava jedinstvenu, centralizovanu tabelu registrovanih drajvera blockIOMap u kojoj svaki ulaz odgovara jednom registrovanom drajveru. Prilikom instalacije, svaki drajver u novi ulaz ove tabele upisuje adresu svoje tabele tipa BlockIOVectorTable sa adresama svojih funkcija zaduženih za odgovarajuće ulazno/izlazne operacije. Date su sledeće deklaracije:
// I/O request: struct BlockIORequest {...}; // I/O operation: typedef int (*BlockIOOp) (BlockIORequest*); // I/O driver vector table: struct BlockIOVectorTable { BlockIOOp open, close, read, write; }; // I/O device driver map: BlockIOVectorTable* blockIOMap[MAXDEVICES]; extern int numOfRegisteredDrivers; typedef int HANDLE;
a)(5) Implementirati sledeće funkcije sistema kojima se zadaju operacije uređaju datom prvim argumentom: int int int int
open (HANDLE device, BlockIORequest* req); close (HANDLE device, BlockIORequest* req); read (HANDLE device, BlockIORequest* req); write (HANDLE device, BlockIORequest* req);
b)(5) Implementirati operaciju za registraciju drajvera koja vraća identifikator uređaja koji će se koristiti kao „ručka“ u daljim operacijama sa tim uređajem, a predstavlja broj ulaza u tabeli regostrovanih uređaja (-1 u slučaju greške): HANDLE blockIODriverReg (BlockIOVectorTable*);
4.
(15 poena)
Fajl podsistem
Neki fajl sistem koristi indeksirani pristup alokaciji fajlova sa kombinovanim indeksom u jednom i dva nivoa. Polje index1 u strukturi FCB sadrži broj fizičkog bloka u kome je indeks prvog nivoa (čiji ulazi sadrže brojeve blokova sa sadržajem), dok polje index2 sadrži broj fizičkog bloka u kome je indeks drugog nivoa (čiji ulazi sadrže brojeve blokova sa indeksima u kojima su brojevi blokova sa sadržajem). Broj fizičkog bloka 0 u indeksu označava null nealociran ulaz (fizički blok broj 0 se nikada ne koristi za fajlove). Konstanta INDEXSIZE definiše broj ulaza u jednom indeksu (u jednom bloku), a tip BLKNO predstavlja broj bloka (logičkog ili fizičkog). a)(10) Realizovati funkciju: int f_blkalloc(FCB* file, BLKNO logical, BLKNO physical);
koja ažurira indekse datog fajla tako da proglašava dati logički blok alociranim u datom fizičkom bloku. U slučaju uspeha funkcija vraća 0, u slučaju greške -1. Pretpostaviti da je indeks prvog nivoa uvek inicijalno alociran, dok se indeks drugog nivoa alocira samo po potrebi. Na raspolaganju je funkcija: void* f_getblk(BLKNO physical, int toLoad=1);
koja vraća pokazivač na keširani fizički blok sa datim brojem i učitava ga u keš ako je toLoad=1 i ako blok već nije u kešu, kao i funkcija: BLKNO f_blkalloc();
koja alocira jedan slobodan fizički blok i vraća njegov broj (0 u slučaju neuspeha). b)(5) Kolika je maksimalna moguća veličina fajla, ako je INDEXSIZE=1024, a tip BLKNO je 64bitni neoznačeni ceo broj? Odgovor: ______________________________ 1.(3) Ako se nad sledećim programom kreira jedan proces, koliko će ukupno procesa biti kreirano (uključujući i taj jedan početni), pod pretpostavkom da su svi sistemski pozivi uspeli? const int N=2; int pid[N]; void main { for (int i=0; i
2.(3)
Šta je razlika između „teškog“ procesa i niti (thread)?
3.(3)
Šta je problem sledeće implementacije kritične sekcije uposlenim čekanjem?
process P1 begin loop while flag2 = true do null end; (* Busy wait *) flag1 := true; (* Critical section *) flag1 := false; (* Exit protocol *) end end P1; process P2 begin loop while flag1 = true do null end; (* Busy wait *) flag2 := true; (* Critical section *) flag2 := false; (* Exit protocol *) end end P2;
4.(3) Na jeziku C++ implementirati klasu BoundedBuffer koja realizuje ograničeni bafer elemenata tipa Data kapaciteta N pomoću semafora. 5.(3) Šta je osnovna razlika između tehnike dinamičkog učitavanja i tehnike preklopa (overlays)?
6.(3) Ukratko objasniti zašto je kod segmentne organizacije virtuelne memorije obavezna provera prekoračenja granice segmenta prilikom svakog adresiranja, a kod stanične organizacije ta provera ne postoji.
7.(3)
U nekom sistemu postoje sledeći sistemski pozivi:
int async_write (char* buffer); void wait (int request_id);
Operacija async_write asinhrono zadaje operaciju izlaza datog niza znakova na neki izlazni uređaj i vraća interni sistemski identifikator tog zahteva (veći od 0), odnosno kod greške (manji od nula). Operacija wait suspenduje pozivajući proces sve dok operacija sa datim identifikatorom nije završena. Korišćenjem ovih sistemskih poziva, realizovati sinhroni izlaz: int sync_write (char* buffer);
8.(3)
Ukratko objasniti kako se u Unix fajl sistemu definišu prava pristupa do fajla.
9.(3)
Navesti razlog zašto bi neki fajl sistem koristio klastere na disku različite veličine.
10.(3) Ukratko objasniti šta je inkrementalni, a šta totalni bekap (backup) fajl sistema? 1.(3)
Dati kratke definicije multiprocesorskog sistema i distribuiranog sistema.
___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________
2.(3) Koji je razlog deobe procesorskog vremena (time sharing) kod interaktivnih sistema? (Zaokružiti odgovor) a) Brži odziv na svaku akciju svakog korisnika nego bez deobe vremena. b) Ravnomerniji odziv na akcije više korisnika nego bez deobe vremena. c) Mogućnost podrške više korisnika nego bez deobe vremena. 3.(3)
Zašto je stek deo konteksta izvršavanja programa?
___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ 4.(3) Napisati deo koda koji obezbeđuje kritičnu sekciju pomoću brojačkih semafora, uz dozvolu konkurentnog izvršavanja kritične sekcije do N uporednih procesa. 5.(3) Korišćenjem sistemskih poziva fork() i execlp() napisati C program koji kreira proces nad programom u fajlu čije je ime zadato argumentom komandne linije.
6.(3) Memorija nekog računara organizovana je stranično, sa stranicom veličine 4KB. Adresibilna jedinica je bajt, a virtuelna adresa je 32-bitna. Fizička adresa je veličine 32 bita. Ako je PMT organizovana u dva nivoa, s tim da su veličine polja za broj ulaza u tabele oba nivoa isti, kolika je veličina (u bajtovima) PMT prvog nivoa? ___________________________________________________________________________ ___________________________________________________________________________ Odgovor: __________________________________________________________________ 7.(3) Da li linker prilikom povezivanja sa ciljem dobijanja izvršnog programa (.exe) pravi razliku između fajlova tipa .obj i tipa .lib? ___________________________________________________________________________ 8.(3) Kojom tehnikom se znakovno orijentisani ulazni uređaj može učiniti logički (virtuelno) blokovski orijentisanim? ___________________________________________________________________________ 9.(3) Neki proces izvršava redom sledeće sistemske pozive. Pod pretpostavkom da korisnik u čije ime se izvršava ovaj proces ima pravo pristupa do oba fajla i na čitanje i na upis, i da oba poziva za otvaranje fajlova uspevaju, navesti koji od preostalih poziva će biti uspešan, a koji neuspešan (upisati na liniji pored poziva). FHANDLE f1 = fopen(“x.doc”,read); FHANDLE f2 = fopen(“y.doc”,read|write); fread(f1,buffer1,n1); fwrite(f1,buffer2,n2); fread(f2,buffer1,n1); fwrite(f2,buffer2,n2);
_____________ _____________ _____________ _____________
10.(3) Korišćenjem podataka iz koje tabele otvorenih fajlova sistem proverava pravo pristupa za pozive iz prethodnog zadatka (fread i fwrite), u globalnoj tabeli ili u tabeli koja je deo konteksta datog procesa? ___________________________________________________________________________ 1.
(25 poena)
Upravljanje procesima
(a)(10) U nekom jednoprocesorskom operativnom sistemu svi sistemski pozivi obavljaju se preko softverskih prekida na koje se odazivaju prekidne rutine koje pripadaju jezgru. Prilikom obrade prekida, procesor implicitno maskira prekide, ali osim povratne adrese, na steku ne čuva više ništa. Kako ne bi došlo do prekoračenja memorijskog prostora odvojenog za stek korisničkog procesa, jezgro radi sa sopstvenim stekom. U kodu jezgra postoje sledeće deklaracije:
struct PCB; // Process Control Block extern PCB* running; // Running Process void put_ready (PCB*); // Put the given PCB to the ready queue PCB* get_running (); // Get a new running PCB from the ready queue inline void save_context (PCB*); // Saves the current processor context inline void restore_context (PCB*); // Restores the processor context extern void* kernel_sp; // Pointer to the kernel stack space void set_sp(void*); // Sets SP to the given value interrupt void dispatch();
Funkcije save_context(), restore_context() i set_sp() su inline (njihov kod se neposredno ugrađuje u kod pozivaoca, nema standardnog ulaznog i izlaznog protokola sa čuvanjem povratne adrese na steku). U njima su samo proste operacije prenosa podataka između registara i memorije, nema ugnežđenih poziva. Procedura save_context() čuva, a restore_context() restaurira kontekst izvršavanja prepisujući vrednosti svih programski dostupnih registara, uključujući i pokazivač steka (SP), osim programskog brojača (PC). Realizovati prekidnu rutinu dispatch() koja vrši eksplicitno preuzimanje procesa. (b)(10) Svaki od dva uporedna procesa, P1 i P2, treba da na standardni izlaz ispiše redom cele brojeve od 1 do 100, s tim da procesi brojeve treba da ispisuju naizmenično (P1 ispiše 1, P2 ispiše 1, P1 ispiše 2, P2 ispiše 2, ..., P1 ispiše i, P2 ispiše i itd.). Realizovati ove procese uz sinhronizaciju pomoću klasičnih brojačkih semafora. (c)(5) Korišćenjem sistemskog poziva fork() napisati program koji, kada se nad njim pokrene proces, kreira još jednog svog direktnog potomka i završi se, taj direktni potomak kreira još jednog svog direktnog potomka i završi se, a taj potomak se odmah završi. 2. (20 poena) Upravljanje memorijom a)(10) Dat je kompletan C kod dva fajla a.c i b.c: /* a.c */ void f() {} static void g() {} void main () { g(); }
/* b.c */ void g() {} static void f() {}
i)(5) Koju funkciju g poziva funkcija main, onu definisanu u a.c ili onu u b.c? ii)(5) Da li će linker prijaviti grešku prilikom povezivanja objektnih fajlova dobijenih prevođenjem ova dva fajla? Precizno obrazložiti odgovor. Podsećanje: modifikator static u deklaraciji globalnog imena označava da ime ima tzv. „interno vezivanje“ (engl. internal linking). b)(10) U nekom sistemu primenjuje se kontinualna alokacija operativne memorije, uz primenu algoritma best fit i alokaciju u jedinicama veličine 1KB. Ukupan prostor za alokaciju memorije za korisničke procese je veličine 128KB. Posmatra se sledeća sekvenca zahteva za alokacijom i dealokacijom memorije: A+45, B+23, C+38, B-, D+16, E+16, F+5, C-, G+25
U oznaci svakog zahteva prvo slovo označava proces koji izdaje zahtev, simbol „+“ označava operaciju alokacije memorije, simbol „–„ označava operaciju dealokacije memorije, dok broj označava veličinu memorije koja se alocira izraženu u KB. i)(5) Popuniti sledeću tabelu vrednostima koje opisuju stanje zauzetosti memorije nakon ove sekvence: Proces A D E F G Adresa početka (210) ii)(5) Broj slobodnih fragmenata je ____________ . Ukupna veličina slobodne memorije je ____________ . Veličina najvećeg slobodnog fragmenta je __________ . Veličina najmanjeg slobodnog fragmenta je __________ . 3.
(10 poena)
Ulazno/izlazni podsistem
Drajver nekog izlaznog uređaja obezbeđuje sledeću funkciju koja asinhrono pokreće operaciju izlaza datog bloka znakova zadate dužine: int async_write (char* buffer, int size, Semaphore* toSignalOnCompletion);
Završetak operacije drajver signalizira semaforom na koga ukazuje treći argument (ukoliko pokazivač nije null). Poznato je da sam uređaj interno omogućava paralelizam izlaznih operacija tako što može uporedo da vrši N zadatih operacija izlaza preko isto toliko svojih DMA kanala. Ukoliko se zada nova operacija a postoji slobodan kanal, drajver će tu operaciju pokrenuti na slobodnom kanalu, a funkcija async_write će vratiti 1. U suprotnom, ako su svi kanali zauzeti, drajver odbija zahtev (ne pokreće operaciju), a funkcija vraća -1. Korišćenjem ove funkcije i klasičnih brojačkih semafora realizovati funkciju: void optimized_write (char* buffer, int size);
koja asinhrono pokreće zadatu operaciju izlaza na ovom uređaju, ali tako da uređaj bude optimalno iskorišćen. To znači da ona treba da asinhrono pokrene traženu operaciju izlaza ako ima slobodnog kanala, tako da se svih N kanala maksimalno iskoriste, ali da u slučaju zauzetosti svih kanala uređaja ne odbije postavljeni zahtev, već blokira pozivajući proces sve dok se slobodan kanal ne pojavi, a onda obradi taj zahtev.
4.
(15 poena)
Fajl podsistem
Klasičan koncept fajla sa svojim operacijama ima grubo sledeću semantiku:
Fajl se može kreirati, pri čemu se veličina njegovog sadržaja postavlja na 0 (prazan sadržaj). Operacija kreiranja fajla ujedno i otvara taj fajl u kontekstu procesa koji ga je kreirao. Postojeći (već kreiran) fajl se može otvoriti i zatvoriti. Proces može direktno pristupati bilo kom delu fajla, na nivou bajta, ali samo u okvirima njegove trenutne veličine sadržaja. Svaki pristup iza kraja trenutnog sadržaja fajla je nelegalan i generiše grešku. Pristup podrazumeva mogućnost čitanja ili upisa niza bajtova proizvoljne veličine, pod navedenim ograničenjima. Postojeći sadržaj fajla se može proširiti posebnom operacijom dodavanja proizvoljnog sadržaja na kraj, pri čemu postoji podrazumevani sadržaj ako se on u operaciji ne navede eksplicitno (npr. nule). Umesto ovakvog koncepta, u nekom fajl sistemu koristi se koncept fajla sa nešto izmenjenom semantikom, tako da fajl predstavlja veliki, ali ograničeni virtuelni memorijski prostor na nekom uređaju (npr. disku). Svi fajlovi imaju isti veliki „kapacitet“, odnosno veličinu tog prostora. Definisan je podrazumevani sadržaj celog tog prostora (npr. sve nule). Proces može proizvoljno pristupati bilo kom delu tog prostora, čitajući ili upisujući niz bajtova proizvoljne veličine (naravno, u okvirima navedenog virtuelnog prostora). Važno je uočiti da nije neophodno da proces „proširuje“ sadržaj fajla kako je gore opisano, pa ta operacija i ne postoji. Naravno, fajl se i dalje može kreirati, otvoriti i zatvoriti. a)(5) Predložiti aplikativni programski interfejs ovako izmenjenog koncepta fajla. Navesti zaglavlja svih relevantnih operacija prema datim opisima i objasniti njihovo značenje. Nije potrebno voditi računa o pravima pristupa do fajla za korisnike i njihove procese. b)(10) Predložiti i objasniti implementaciju ovakvog koncepta fajla. Konkretno, objasniti sledeće: i) Koju biste metodu alokacije koristili, kontinualnu, ulančanu (osnovnu ili FAT), ili indeksnu (u jednom ili više nivoa ili kombinovano)? ii) Precizno objasnite kako biste obezbedili da sadržaj fajla zauzima na uređaju samo neophodan prostor, a nikako prostor za smeštanje celog virtuelnog sadržaja fajla (koji velikim delom može imati podrazumevani sadržaj jer nije redefinisan, odnosno ostao je „prazan“). iii) Opišite kako biste principijelno realizovali operacije čitanja i upisa niza bajtova sa tako predloženim načinom alokacije fajla. 1.
(25 poena)
Upravljanje procesima
(a)(10) Jezgro nekog operativnog sistema podržava niti (thread) i binarne semafore koje naziva događajima (event). Koncept niti podržan je klasom Thread čiji je deo definicije prikazan dole. Svaka nit ima jedan i samo jedan pridruženi događaj i svaki događaj pripada isključivo jednoj niti. Operacija Thread::waitEvent nekog objekta klase Thread sme da se pozove samo iz konteksta niti koja je predstavljena baš tim objektom; u suprotnom, ova operacija vraća kod greške -1 i ne vrši nikakvu drugu akciju. Operacija signalEvent može da se pozove iz konteksta bilo koje aktivne niti. Korišćenjem funkcija setjmp i longjmp, implementirati operaciju Thread::waitEvent.
class Thread { ... public: int waitEvent (); void signalEvent(); private: static Thread* running; jmp_buf context; int event; ... }; Thread::Thread () : ... event(0) ... void Thread::signalEvent () { lock(); if (event==-1) { event=0; Scheduler::put(this); } else event=1; unlock(); }
(b)(10) U nekom operativnom sistemu postoje sledeći sistemski pozivi za operacije sa semaforom: int sem_create (int init_value); int sem_wait (int semID); int sem_signal (int semID);
Sve operacije vraćaju -1 u slučaju greške. Operacija sem_create kreira novi semafor u sistemu i vraća njegov interni sistemski ID (>0) koji se može koristiti iz bilo kog procesa u sistemu da bi se jedinstveno identifikovao taj semafor u ostalim operacijama. Korišćenjem standardnog sistemskog poziva fork(), napisati program koji, kada se za njega pokrene proces, kreira proces-dete, pri čemu proces-dete sme da se završi tek kada mu procesroditelj to „dozvoli“. c)(5) Neka rekurzivna funkcija f implementirana je na sledeći način sa namerom da obezbedi međusobno isključenje svojih poziva i tako bude bezbedna za pozive iz konkurentnih niti. Objasniti šta je problem sa ovom implementacijom. Semaphore s(1); void f (...) { s.wait(); ... if (...) f(...); ... s.signal(); }
2.
(20 poena)
Upravljanje memorijom
a)(5) U jezicima C i C++, globalna imena deklarisana kao static, kao npr. u sledećim deklaracijama: static int x=1, y=2; static void f(int i) {...}
imaju tzv. interno vezivanje (internal linking). Precizno objasniti šta to znači i kakve efekte ima na prevođenje i povezivanje. b)(5) Precizno objasniti kakav problem i na koji način (pod kojim uslovima) može da nastane ako se iz memorije izbaci (swap out) proces koji čeka na završetak I/O operacije. c)(10) U nekom sistemu sa straničnom organizacijom virtuelne memorije primenjuje se straničenje u dva nivoa. Jedan ulaz u PMT i prvog i drugog nivoa je veličine jedne mašinske reči (pokazivač ili unsigned int, pokazivači su veličine jedne reči), pri čemu vrednost 1 u svim bitima označava da deo virtuelne memorije koji pokriva taj ulaz uopšte nije alociran od strane procesa. Date su sledeće deklaracije: const int PageSize = ... // Page size in Bytes const int PMT1Size = ... // Size of first-level PMT const int PMT2Size = ... // Size of second-level PMT typedef unsigned int PMT2[PMT2Size]; typedef unsigned int* PMT1[PMT1Size];
Implementirati funkciju: unsigned long int vMemSize (PMT1 pmt1);
koja izračunava koliki virtuelni memorijski prostor (u bajtovima) je alocirao proces na čiju PMT prvog nivoa ukazuje argument. 3.
(10 poena)
Ulazno/izlazni podsistem
a)(5)
Korišćenjem operacije
void putc(Device*, char);
koja na dati znakovno orijentisani izlazni uređaj izbacuje jedan znak, realizovati operaciju void writeln(Device*, const char*);
koja na dati uređaj izbacuje dati niz znakova u jednoj liniji (i liniju završava znakom za novi red). b)(5) Posmatra se neki sekvencijalni, izlazni, blokovski orijentisani uređaj sa blokom veličine N i operacijom koja na uređaj izbacuje dati blok: void output(const char* block);
Korišćenjem ove operacije, realizovati operaciju void putc(char);
koja izbacuje jedan znak na dati uređaj, uz baferisanje (znak po znak se upisuje u bafer, a kada se bafer napuni, izbacuje se ceo bafer kao blok). 4.
(15 poena)
Fajl podsistem
a)(5) U opštem slučaju, da li ista vrednost identifikatora („ručke“) fajla ( FHANDLE) koju su dva procesa dobila prilikom operacija otvaranja fajla koje su izvršili, znači da oni pristupaju istom fizičkom fajlu preko tih identifikatora? Precizno obrazložiti. b)(10) Neki fajl sistem koristi indeksirani pristup alokaciji blokova za fajlove. U strukturi FCB polje index ukazuje na indeks tog fajla; i struktura FCB i indeks su učitani u memoriju (keširani) prilikom otvaranja fajla. U indeksu, vrednost 0 označava da dati blok nije alociran (null). Operacija freeBlock dealocira dati blok na disku. Date su sledeće deklaracije: typedef unsigned long int BlockNo; // Block number const int FIndexSize = ...; // File index size typedef BlockNo FIndex[FIndexSize]; // File index struct FCB { ... long int sizeInBlocks; // Current file size in number of blocks FIndex index; // File index }; void freeBlock(BlockNo);
Potrebno je realizovati funkciju: void clearFile (FCB* file);
koja treba da „obriše“ sadržaj fajla, odnosno dealocira blokove koje fajl zauzima, bez uklanjanja fajla kao objekta iz fajl sistema. 1.
(25 poena)
Upravljanje procesima
(a)(10) U jezgru nekog operativnog sistema definisane se sledeće strukture podataka: typedef unsigned int PID; #define MaxProc ... // Max number of processes struct PCB { PID pid; // Process ID jmp_buf context; PCB* next; // Next PCB in the Ready or a waiting list ... }; PCB* allProcesses[MaxProc]; // Maps a PID to a PCB* PCB* running; // The running process PCB* ready; // Head of Ready list
Korišćenjem bibliotečnih funkcija setjmp() i longjmp(), napisati tela sledećih funkcija: suspend(): suspenduje (blokira) izvršavanje pozivajućeg procesa sve dok ga neki drugi proces ne „probudi“ pomoću resume(); resume(PID pid): „budi“ (deblokira) izvršavanje procesa koji je zadat argumentom.
Pretpostaviti da je lista spremnih procesa uvek neprazna prilikom suspenzije procesa i da je proces za koji se poziva resume sigurno suspendovan (ignorisati mogućnost greške). (b)(10) Proizvoljno mnogo uporednih procesa treba da se sinhronizuje na sledeći način. Na raspolaganju je N „žetona“ (engl. token), tj. brojeva od 1 do N. Svaki od procesa želi da uzme jedan slobodan žeton i da uradi neki svoj zadatak sa tim žetonom, odnosno brojem, a potom ga oslobodi. Prema tome, najviše N od ovih procesa može uporedo da radi svoje zadatke, svaki sa svojim žetonom (bojem). Pomoću standardnih brojačkih semafora potrebno je obezbediti ovu sinhronizaciju. Napisati kod za opšti oblik ovih procesa. Deklarisane su sledeće deljene promenljive i semafori: shared var tokens : array [1..N] of boolean = true; -- true means „free“ mutex : semaphore = 1; -- mutual exclusion for access to the tokens entry : semaphore = N;
c)(5) Koliko ukupno procesa nastane (uključujući i početni) kada se nad sledećim programom kreira proces, pod uslovom da su svi sistemski pozivi uspešni? const unsigned int N = ...; // N>0 void main () { for (unsigned int i=0; i
Odgovor: ______________________________________
2.
(20 poena)
Upravljanje memorijom
a)(5) Putem veb pretraživača (engl. web browser) pregledate povremeno neku svoju veb aplikaciju koja je instalirana na nekom udaljenom serverskom računaru na kome se nalaze i druge aplikacije drugih korisnika koje izvršavaju njihovi procesi. Vi ste jedini posetilac te svoje aplikacije. Kada nakon duže pauze (od npr. nekoliko dana) posetite jednu određenu stranicu svoje aplikacije, primećujete sledeći fenomen. Kada prvi put zatražite tu svoju stranicu nakon pauze od nekoliko dana, vreme odziva je relativno dugo (npr. reda nekoliko sekundi). Kada odmah nakon toga osvežavate (ponovo zahtevate) istu tu stranicu, svaki naredni put vreme odziva je veoma kratko (reda dela sekunde). Pri tome, vaša aplikacija za svaki zahtev za tom stranicom radi uvek isti posao, pa u njoj nema razloga za tako drastično različito vreme odziva. Osim toga, proces koji izvršava vašu aplikaciju je odavno pokrenut i nije uopšte gašen, već je sve vreme aktivan kao serverski proces koji čeka zahteve sa veb klijenata. Kako biste objasnili ovaj fenomen velikih razlika u vremenu odziva? b)(5) U nekom sistemu primenjuje se first-fit algoritam kontinualne alokacije memorije. Inicijalno je prostor veličine 256KB potpuno slobodan za alokaciju korisničkih procesa. Potom su različiti procesi zadavali sledeće zahteve (slovna oznaka označava proces koji je postavio zahtev, brojna oznaka označava veličinu alociranog prostora u KB, a minus označava gašenje procesa i oslobađanje njegove memorije): A16, B64, C32, B-, D128, A-, E8, F32
Odgovoriti na sledeća pitanja koja se odnose na stanje memorije nakon ove sekvence zahteva: i)
Kolika je ukupna veličina trenutno slobodne memorije? Odgovor: _____________
ii)
Koliko je ukupno slobodnih fragmenata? Odgovor: _____________
iii)
Kolika je veličina najmanjeg slobodnog fragmenta? Odgovor: _____________
iv)
Kolika je veličina najvećeg slobodnog fragmenta? Odgovor: _____________
c)(10) U nekom sistemu sa straničnom organizacijom memorije virtuelni adresni prostor procesa je veličine 4GB, fizički adresni prostor procesora je veličine 256TB, adresibilna jedinica je bajt, a stranica je veličine 64KB. Sistem nema zamenu (izbacivanje) stranica niti učitavanje stranica na zahtev, već su sve stranice koje je neki proces alocirao uvek u fizičkoj memoriji. PMT svakog procesa je prosta tabela u jednom nivou. Svaki ulaz u PMT sadrži broj okvira u koji je data stranica preslikana; vrednost 0 u ulazu označava da stranica nije alocirana od strane procesa. Realizovati funkciju: int page_share(unsigned int* pmt1, unsigned short page1, unsigned int* pmt2, unsigned short page2) koja se poziva da bi se data stranica page1 u PMT prvog procesa (pmt1) proglasila alociranom i postala deljena sa stranicom drugog procesa ( page2) na čiju PMT ukazuje pmt2. Ukoliko page2
nije alocirana ili u slučaju bilo kakve druge greške, ova funkcija vraća -1; u slučaju uspeha vraća 0. Pretpostaviti da je tip int 32-bitni, tip long 64-bitni, a tip short 16-bitni. 3.
(10 poena)
Ulazno/izlazni podsistem
U nekom sistemu obezbeđena je podrška procesima za usluge merenja vremena i uspavljivanja procesa na zadato vreme. U podsistemu za merenje vremena ovakvi zahtevi smeštaju se u jednostruko ulančanu listu elemenata tipa TimerRequest čija je deklaracija data dole. Na početak ove liste zahteva ukazuje globalni pokazivač timerQueueHead. Svaki zahtev tipa TimerRequest sadrži pokazivač event na događaj na kome je blokiran proces koji se uspavao na zadato vreme i koji treba „probuditi“ (signaliziranjem tog događaja) kada to vreme dođe. Poseban hardverski uzređaj (tajmer) generiše periodične prekide. Zahtevi se u red smeštaju po hronološkom redosledu, tako da u svakom zahtevu polje time predstavlja dužinu intervala (izraženu u jedinici vremena koja je jednaka periodi periodičnog prekida sa hardverskog tajmera) koji treba da protekne od „buđenja“ prethodnog zahteva u listi do trenutka „buđenja“ posmatranog zahteva u listi. Prvi zahtev u listi treba „probuditi“ za time perioda u odnosu na trenutak poslednjeg prekida. Na primer, za red zahteva na donjoj slici, prva tri zahteva treba probuditi za 3 „otkucaja“ tajmera, a četvrti i peti za 1 nakon njih, odnosno za 4 od poslednjeg otkucaja. timerQueueHead
3
0
0
1
0
struct TimerRequest { TimerRequest* next; // Next in the list of timer requests unsigned long int time; Event* event; }; extern TimerRequest* timerQueueHead;
Realizovati prekidnu rutinu timer() koja se poziva na svaki periodični prekid od vremenskog brojača i koja treba da odradi odgovarajući posao ažuriranja liste zahteva i buđenja procesa kojima je isteklo vreme. Operacija signal() događaja može da se pozove iz prekidne rutine, jer je za to i predviđena. Prekidna rutina je uvek atomična, pošto se radi o jednoprocesorskom sistemu koji hardverski maskira druge prekide pri prihvatanju prekida. Nakon obrade zahteva, ne treba ga dealocirati iz memorije, pošto je to odgovornost onoga ko je zahtev postavio. 4.
(15 poena)
Fajl podsistem
a)(5) Neki fajl sistem podržava montiranje nekog direktorijuma fajl sistema sa nekog eksternog uređaja ili udaljenog računara u bilo koji prazan lokani direktorijum, i to na više mesta (u različite prazne lokalne direktorijume). U fajl sistemu eksternog uređaja X nalazi se direktorijum \first\second u kome su tri fajla: a.txt, b.txt i c.txt. Šta će ispisati poslednja naredba u sledećoj sekvenci naredbi (sve su izvršene uspešno; prvi argument komandi mount i copy je izvorište, drugi odredište): mount X:\first\second \home\buzz mount X:\first\second \home\foo del \home\foo\a.txt copy \home\buzz\b.txt \home\foo\d.txt dir \home\buzz
b)(10) Neki fajl sistem koristi ulančani pristup alokaciji blokova za fajlove, pri čemu se u prvoj reči (tip unsigned int) svakog bloka alociranog za sadržaj fajla nalazi broj bloka koji je sledeći u lancu (0 za kraj). U FCB fajla polje head ukazuje na prvi, polje tail na poslednji blok u lancu alociranih blokova, a polje size sadrži broj blokova alociranih za sadržaj. Podsistem za alokaciju slobodnih blokova takođe ulančava slobodne blokove i pri alokaciji nekoliko slobodnih blokova od jednom vraća ceo lanac alociranih blokova. Postoji i podsistem koji kešira blokove sa sadržajem fajlova. U sistemu postoje realizovane sledeće funkcije: int alloc(int numOfBlocks,unsigned int* head,unsigned int* tail);
Alocira lanac od numOfBlocks blokova i broj prvog bloka u alociranom lancu upisuje u promenljivu na koju ukazuje argument head, a poslednjeg u promenljivu na koju ukazuje tail; u slučaju uspeha vraća 0, u slučaju greške vraća kod greške (!=0).
int block_write(unsigned int blockNo,int word,int length,unsigned int* buf)
U podsistemu koji kešira blokove, u blok blockNo, počev od reči sa brojem word (broji se počev od 0), upisuje length reči sa lokacije na koju ukazuje buf; u slučaju uspeha vraća 0, u slučaju greške vraća kod greške (!=0). Realizovati funkciju
int append(FCB* file, int numOfBlocks);
koja sadržaj datog fajla na čiji FCB ukazuje prvi argument proširuje dodavanjem numOfBlocks slobodnih blokova na kraj lanca. Ova funkcija u slučaju uspeha treba da vraća 0, a u slučaju greške da vraća kod greške (!=0). 1.(3) Ukratko objasniti osnovni motiv uvođenja raspodele vremena (time sharing) u multiprogramiranje. 2.(3) Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati program koji vrši učitavanje bloka podataka sa ulaznog uređaja tehnikom programiranog ulaza korišćenjem prekida. Samostalno usvojiti potrebne detaljne pretpostavke. 3.(3) Navesti najmanje četiri uzroka zbog kojih proces može izgubiti procesor. Za svaki od navedenih načina navesti da li se dešava sinhrono (kao posledica operacije koju je izvršio sam proces) ili asinhrono (nezavisno od izvršavanja procesa). 4.(3) Korišćenjem standardnih brojačkih semafora u školskom jezgru, na jeziku C++ u potpunosti realizovati klasu za ograničeni bafer (bounded buffer). 5.(3) Dati primer delova koda dva fajla sa izvornim C/C++ kodom za koje će linker generisati grešku tipa višestrukih simbola i nedefinsanih simbola, pod pretpostavkom da su to jedina dva fajla koja se linkuju. 6.(3) Virtuelna memorija nekog računara organizovana je stranično. Veličina virtuelnog adresnog prostora je 2 MB, adresibilna jedinica je 16-bitna reč, a veličina stranice je 128 KB. Veličina fizičkog adresnog prostora je 32 MB. Operativni sistem učitava stranice na zahtev, tako što se stranica učitava u prvi slobodni okvir fizičke memorije kada joj se pristupi. Kada se kreira proces, ni jedna njegova stranica se ne učitava odmah, već tek kad joj se prvi put pristupi. U početnom trenutku, slobodni okviri fizičke memorije su okviri počev od 10h zaključno sa 1Fh. Neki proces generiše sledeću sekvencu virtuelnih adresa tokom svog izvršavanja (sve vrednosti su heksadecimalne): 30F00, 30F02, 30F04, 922F0, 922F2, 322F0, 322F2, 322F4, 522F0, 522F2, 402F0, 402F2 Prikazati izgled cele tabele preslikavanja stranica (PMT) za ovaj proces nakon izvršavanja ove sekvence. Za svaki ulaz u PMT prikazati indikator prisutnosti stranice u fizičkoj memoriji (0 ili 1) i broj okvira u fizičkoj memoriji u koji se stranica preslikava, ukoliko je stranica učitana; ukoliko nije, prikazati samo ovaj indikator. 7.(3) Navesti tipične operacije apstrakcije blokovski orijentisanog ulazno/izlaznog uređaja sa direktnim pristupom.
8.(3) Neki proces izvršava sistemski poziv za upis u fajl koji je prethodno uspešno otvorio i sistem mu to ne dozvoljava, sa porukom da tom procesu nije dozvoljena ta operacija, iako je korisniku u čije ime se taj proces izvršava dozvoljena operacija upisa u taj fajl. Objasnite zašto se ovo dogodilo. 9.(3)
Šta znači termin „presna particija“ (raw partition)?
10.(3) Koliko pristupa blokovima na disku treba izvršiti za pristup n-tom logičkom bloku sadržaja fajla ako je alokacija fajla a) ulančana lista, b) kontinualna? Odgovor: a) ____________ b) ______________ 1.
(25 poena)
Upravljanje procesima
(a)(10) Posmatra se neki multiprocesorski operativni sistem u dve varijante: 1) sa jedinstvenim, zajedničkim redom spremnih procesa za sve procesore; prilikom promene konteksta na nekom procesoru uzima se neki proces iz tog reda i 2) sa odvojenim redovima spremnih procesa za svaki procesor, pri čemu se proces pridružuje procesoru prilikom svog kreiranja i više ne može biti „preseljen“ na drugi procesor. Sasvim intuitivno, u kojoj varijanti očekujete bolje iskorišćenje procesora u opštem slučaju većeg skupa procesa? Precizno obrazložiti odgovor. (b)(10) Korišćenjem standardnog brojačkog semafora, na jeziku C++ realizovati klasu koja apstrahuje garažu za vozila kapaciteta n vozila i operacijama ulaska i izlaska vozila. Vozila su predstavljena nitima koje pozivaju ove operacije (ne treba ih realizovati), a ukoliko je garaža puna, nit koja poziva operaciju ulaska u garažu treba da se blokira sve dok se u garaži ne pojavi slobodno mesto. Kapacitet garaže zadaje se inicijalizacijom objekta ove klase.
(c)(5) Nad sledećim programom pokrenut je jedan inicijalni proces. Koliko iznosi zbir svih brojeva koji se ispisuju na zajedničkom standardnom izlaznom uređaju nakon završetka svih procesa koji su kreirani od ovog inicijalnog procesa, uključujući i njega? Pretpostaviti da procesdete nasleđuje standardni izlazni uređaj od roditelja, da se izlazne operacije pozivom printf() na isti standardni uređaj od strane više procesa međusobno isključuju, kao i da su svi sistemski pozivi izvršeni uspešno. #include void main () { int i = 1; int pid = fork(); printf(“%d\n“,i++); if (pid==0) { fork(); printf(“%d\n“,i++); } }
Odgovor: __________ 2.
(20 poena)
Upravljanje memorijom
a)(10) U potpunosti realizovati klasu koja apstrahuje veliku kvadratnu matricu dimenzije NxN elemenata tipa double. Ovu implementaciju treba prilagoditi korišćenju u programu koji lokalizovano pristupa po jednoj vrsti, tako što u jednom intervalu intenzivno pristupa samo elementima jedne vrste, pa onda elementima neke druge vrste itd. Implementacija treba da koristi dinamičko učitavanje vrednosti iz jedne vrste matrice uz zamenu (swapping), zapravo neku vrstu preklopa (overlay), tako da se u memoriji uvek nalazi samo jedna vrsta kojoj se trenutno pristupa. Interfejs ove klase treba da bude: class DLMatrix { public: DLMatrix (int dimN, FHANDLE fromFile); double get (int i, int j); // Get element [i,j] void set (int i, int j, double x); // Set element [i,j] };
Inicijalno se vrednosti cele matrice nalaze u binarnom fajlu zadatom prvim argumentom (otvaranje i zatvaranje tog fajla je u odgovornosti korisnika ove klase). Na raspolaganju su sledeće funkcije za pristup fajlovima i učitavanje, odnosno snimanje datog niza elemenata tipa double na zadatu poziciju u fajlu. Pozicija se izražava u jedinicama veličine binarnog zapisa tipa double, počev od 0, što znači da se fajl kroz ove funkcije može posmatrati kao veliki apstraktni niz elemenata tipa double: void fread (FHANDLE, int position, double[], int size); void fwrite(FHANDLE, int position, double[], int size);
b)(5) U nekom sistemu sa straničnom organizacijom virtuelne memorije hardver za preslikavanje adresa proverava da li je broj stranice u generisanoj virtuelnoj adresi veći od vrednosti posebnog registra dužine tabele stranica (page-table length register, PLTR) i generiše izuzetak ukoliko jeste. Ko, kada i koju vrednost upisuje u registar PLTR? c)(5) U nekom sistemu sa straničnom organizacijom virtuelne memorije i virtuelna i fizička adresa su 64-bitne, adresibilna jedinica je bajt, a virtuelni adresni prostor procesa ima 256T (tera) stranica. Koliko fizičke memorije treba alocirati procesu da bi se u njega mogle smestiti 4 stranice? Odgovor: ________________ 3.
(10 poena)
Ulazno/izlazni podsistem
Korišćenjem koncepta niti i semafora u školskom jezgru realizovati klasu IOStream. Svaki objekat ove klase treba da u posebnoj niti obavi zadatu ulaznu ili izlaznu operaciju sa zadatom periferijom korišćenjem mehanizma prozivanja (polling). Novi objekat ove klase treba inicijalizovati sledećim parametrima: adresa upravljačkog registra, adresa statusnog registra, adresa registra za podatke periferijskog uređaja, vrsta operacije (ulaz ili izlaz), adresa memorijskog bafera sa podacima tipa unsigned int koje treba preneti, veličina bafera i pokazivač na semafor koji treba signalizirati po završetku operacije (može biti i null, kada ne treba signalizirati završetak). Nit koja obavlja ulaznu ili izlaznu operaciju treba da se pokrene odmah pri kreiranju ovakvog objekta, bez potrebe za posebnom akcijom iz koda koji kreira
objekat. U upravljačkim registrima periferija najniži bit je bit Start kojim se pokreće periferija, a u statusnim registrima najniži bit je bit spremnosti (Ready) čija vrednost 1 ukazuje da je kontroler periferije spreman za prenos podatka preko svog registra za podatke. Svi registri su veličine jedne mašinske reči (tip unsigned int) i preslikani su u memorijski adresni prostor, pa im se može pristupiti uobičajenim operacijama čitanja ili upisa preko pokazivača koji imaju vrednosti njihovih adresa. 4.
(15 poena)
Fajl podsistem
a)(5) U nekom fajl sistemu podržano je zaključavanje fajlova od strane procesa koji ih otvaraju, uz postojanje koncepta deljenog (shared) i ekskluzivnog (exclusive) ključa. Proces fajl zaključava implicitno, prilikom njegovog otvaranja, kada u sistemskom pozivu deklariše da li taj fajl otvara samo za čitanje (read-only) ili i za izmene (write-enabled). Proces koji fajl otvara samo za čitanje zahteva i, ukoliko su zadovoljeni uslovi, dobija deljeni ključ; proces koji fajl otvara i za izmene zahteva i, ukoliko su zadovoljeni uslovi, dobija ekskluzivni ključ. Deljeni ključ se može dobiti ako i samo ako ni jedan drugi proces trenutno nema ekskluzivni ključ; ekskluzivni ključ se može dobiti ako i samo ako ni jedan drugi proces nema bilo kakav ključ nad istim fajlom. Ukoliko proces ne može da dobije traženi ključ, operacija otvaranja fajla završava se greškom. U ovom sistemu izvršena je sledeća sekvenca sistemskih poziva; pozivi su označeni simbolički, gde Open znači otvaranje, a Close zatvaranje fajla koji je identifikovan prvim argumentom, dok drugi argument označava vrstu operacije (R-read-only, W-write-enabled); identifikator ispred dvotačke označava proces koji je izvršio taj poziv: P1:Open(F1,W), P2:Open(F2,W), P3:Open(F3,R), P1:Close(F1)
Navesti koje od sledećih sekvenci koje se, svaka za sebe i nezavisno, posmatraju kao nastavak ove sekvence, izvršavaju bez greške, a koje sa greškom: i) P2:Open(F3,R), P2:Open(F1,W) ii) P1:Open(F3,R), P1:Open(F2,R) iii) P2:Close(F2), P2:Open(F1,W), P1:Open(F3,R) Odgovori: i) __________________
ii) __________________
iii) __________________
b)(10) U nekom fajl sistemu podržano je učitavanje blokova fajla unapred radi efikasnijeg sekvencijalnog pristupa, u skladu sa ponašanjem koje proces pokazuje prilikom pristupa datom otvorenom fajlu i „stepena sekvencijalnosti“ u tom pristupu na sledeći način. U strukturi koja predstavlja ulaz u tabeli otvorenih fajlova lokalnoj za dati proces: const int NLB = ...; typedef unsigned long int BlockNo; struct PFileDescr { ... BlockNo lastBlocks[NLB]; int tailInLastBlocks, numOfLastBlocks; };
polje
lastBlocks predstavlja kružni bafer, realizovan pomoću niza i indeksa tailInLastBlocks (ukazuje na poslednje upisani element), u kome se nalazi numOfLastBlocks
brojeva poslednje pristupanih logičkih blokova. Projektuje se modul fajl sistema koji se bavi organizacijom fajla (file organization module). Ovaj modul održava memorijski keš na nivou blokova diska, pa se učitani blokovi sa diska uvek nalaze u prostoru odvojenom za keš. Kada proces zahteva pristup logičkom bloku broj n datog fajla, ovaj modul učitaće taj i još k logički narednih blokova u keš, pri čemu je k jednako celobrojnoj (odsečenoj) polovini dužine sekvence logički susednih blokova kojima se poslednje pristupalo. Na primer, ako je sekvenca blokova kojima se poslednje pristupalo (hronološki) ..., 2, 6, 3, 7, k je jednako 1/2=0; ako je sekvenca ..., 6, 5, 7, 8, 9, k je jednako 3/2=1. Postojeća funkcija: Block* readFileBlock (FCB* file, BlockNo logicalFileBlockNo);
u memorijski keš učitava blok sa logičkim rednim brojem datim drugim argumentom fajla čiji je FCB zadat prvim argumentom i vraća pokazivač na taj blok. Potrebno je realizovati funkciju: Block* readFileBlockWithPrefetching (FCB*, PFileDescr*, BlockNo);
koja obavlja ovo isto, ali sa opisanim dohvatanjem blokova unapred. 1.
(25 poena)
Upravljanje procesima
(a)(10) Jezgro nekog jednoprocesorskog operativnog sistema podržava niti (thread) sa mogućnošću suspenzije. Koncept niti podržan je klasom Thread čiji je deo definicije prikazan dole. Sistemska usluga suspend suspenduje (blokira) tekuću nit. Ova usluga realizovana je kao prekidna rutina. Hardver procesora pri ulasku u prekidnu rutinu čuva na tekućem steku sve programski dostupne registre, uključujući i povratnu adresu, a potom maskira prekide. Prilikom povratka iz prekidne rutine, hardver procesora radi inverzne operacije. Operacija Thread::resume ponovo aktivira suspendovanu nit; ako nit predstavljena objektom klase Thread čija je operacija pozvana nije suspendovana, resume vraća -1. Makro save_sp() se razvija u instrukcije koje na lokaciju na koju ukazuje argument ovog makroa upisuju tekuću vrednost pokazivača steka (stack pointer, SP). Slično, makro restore_sp() se razvija u instrukcije koje vrednost sa lokacije na koju ukazuje argument ovog makroa upisuju u pokazivač steka. Na raspolaganju su i operacije lock() i unlock() koje maskiraju i demaskiraju prekide, respektivno. Dat je i interfejs klase Scheduler koja realizuje listu spremnih niti sa raspoređivanjem. Implementirati operacije suspend i Thread::resume. typedef int SP; // Type of stack pointer #define save_sp(ptr) ... // Save SP to the given location #define restore_sp(ptr) ... // Restore SP from the given location void lock(); // Mask interrupts void unlock();// Unmask interrupts interrupt void suspend(); class Thread { public: Thread ();
int resume(); ... private: static Thread* running; SP sp; // Saved stack pointer int isSuspended; ... }; Thread::Thread () : ... isSuspended(0) ... class Scheduler { public: static Thread* get (); // Return the thread to run and remove it static void put (Thread*); // Put the given thread to the ready list };
(b)(10) Korišćenjem školskog jezgra napisati program u kome dve uporedne niti, ThreadA i ThreadB, upisuju cele brojeve 0..N-1 redom u elemente dva niza A, odnosno B, respektivno, svaka u svoj niz (A[i]=i, B[i]=i, i=0..N-1). Treća uporedna nit, ThreadC, upisuje u treći niz C vektorski zbir nizova A i B, tako da je C[i]=A[i]+B[i], i=0..N-1. Potrebnu sinhronizaciju realizovati semaforima. c)(5)
Na raspolaganju je sistemska operacija:
int cmp_xchg(int* slot, int oldVal, int newVal);
koja atomično radi sledeće: najpre poredi celobrojnu vrednost u lokaciji na koju ukazuje slot sa vrednošću oldVal; ako su te vrednosti jednake, u lokaciju slot upisuje vrednosti newVal i vraća 1; inače, vrednost u lokaciji slot ostaje nepromenjena i vraća se 0. Na jeziku C napisati funkciju int inc (int& sharedVar);
koja inkrementira deljenu celobrojnu promenljivu na koju ukazuje dati argument sharedVar korišćenjem optimističkog međusobnog isključenja. Ako je inkrementiranje uspelo, vraća se 1, a ukoliko je detektovan konflikt, vraća se 0. Ova funkcija može da se poziva i uporedo izvršava iz konkurentnih niti. 2.
(20 poena)
Upravljanje memorijom
a)(5) Precizno objasniti zašto je potrebno linkeru navesti da kao svoj proizvod treba da napravi statičku biblioteku (lib), a ne izvršni program (exe)? Precizno objasniti razlike između postupka i rezultata pravljenja ove dve vrste proizvoda povezivanja. b)(5)
Navesti dva glavna nedostatka kontinualne alokacije memorije po statičkim particijama.
c)(10) U nekom sistemu sa straničnom organizacijom virtuelne memorije u datom trenutku raspored stranica tri procesa po okvirima u fizičkoj memoriji izgleda redom ovako (oznake su složene redom po rastućem broju okvira, slova A, B i C označavaju procese kojima pripadaju stranice u tim okvirima, brojevi označavaju brojeve stranica tih procesa, K označava okvir koji pripada jezgru OS-a, a DLL označava okvir čiji je sadržaj DLL koga koriste sva tri procesa A, B i C): K, B2, A1, C3, C0, DLL, B0, K, K
U virtuelnom adresnom prostoru procesa A dati DLL se nalazi na stranici broj 3, a u prostorima procesa B i C na stranici broj 4. Napisati kako izgledaju tabele preslikavanja stranica za sva tri procesa A, B i C (u tabelu upisati brojeve okvira i T ili F kao oznaku da li je stranica u memoriji ili ne, za prvih 6 stranica). Odgovor: Strana: Proces A Proces B Proces C
0
1
2
3
4
5
3.
(10 poena)
Ulazno/izlazni podsistem
4.
(15 poena)
Fajl podsistem
Na nekom računaru sa multiprogramskim operativnim sistemom neki kontroler periferije nema vezan svoj signal završetka operacije na ulaze za prekid procesora, ali je poznato vreme završetka operacije zadate tom uređaju u najgorem slučaju (maksimalno vreme završetka operacije). Za obradu ulazno/izlaznih operacija zadatih tom uređaju brine se poseban proces tog operativnog sistema. Kakvu uslugu treba operativni sistem da obezbedi, a ovaj proces da koristi, da bi se izbegla tehnika kojom se može detektovati završetak operacije čitanjem statusnog registra i ispitivanjem bita završetka operacije (polling), tj. da bi se izbeglo uposleno čekanje (busy waiting)? Precizno opisati kako ovaj proces treba da koristi ovu uslugu.
a)(5) U nekom fajl sistemu struktura direktorijuma ima oblik usmerenog acikličkog grafa (DAG), pri čemu se isti fajl (kao objekat u fajl sistemu) može referencirati iz više različitih direktorijuma pod različitim imenima. Na primer, sledeće staze predstavljaju isti fajl: /mydocs/letters/to_john.doc i /correspondence/john/letter_17_09_2009.doc. Gde se čuva ime fajla u ovom sistemu, da li kao svaki drugi atribut fajla u FCB ili negde drugde? Precizno obrazložiti odgovor. b)(10) Neki fajl sistem koristi FAT (File Allocation Table) pristup alokaciji blokova za fajlove. FAT se kešira u memoriju u strukturu deklarisanu na sledeći način: typedef unsigned long int FATIndex; // FAT entry number const FATIndex FATSize = ...; // FAT (and disk) size struct FATEntry { FATIndex next; // Next block in the block chain; 0 for terminator }; FATEntry fat[FATSize] ; // The FAT FATIndex freeHead; // The head of the list of free blocks FATIndex freeTail; // The tail of the list of free blocks
Slobodni ulazi ulančani su u jednostruku listu na čiji prvi ulaz pokazuje freeHead, a na poslednji freeTail. Kontrolni blok fajla (File Control Block, FCB) je deklarisan na sledeći način: struct FCB ... FATIndex FATIndex FATIndex ... };
{ sizeInBlocks; // Current file size in number of blocks head; // Pointer to the first block (head FAT entry number) tail; // Pointer to the last block (tail FAT entry number)
Potrebno je realizovati funkciju: void clearFile (FCB* file);
koja treba da „obriše“ sadržaj fajla, odnosno dealocira blokove koje fajl zauzima, bez uklanjanja fajla kao objekta iz fajl sistema.
1.
(25 poena)
Upravljanje procesima
(a)(10) U jezgru nekog jednostavnog, jednoprocesorskog operativnog sistema specijalizovanog za rad u realnom vremenu (engl. real-time), promena konteksta niti obavlja se isključivo u prekidnoj rutini koja se poziva na periodični prekid sa vremenskog brojača – hardverskog tajmera (engl. timer). Svaka nit je periodična i u svakoj svojoj periodičnoj aktivaciji ona uradi svoj posao za tu aktivaciju, a onda se „uspava“ do sledeće aktivacije pozivom operacije Thread::sleep() čija je implementacija sledeća: void Thread::sleep (Time time) { this->wakeUpTime = time; this->isBlocked = 1; while (this->isBlocked); }
Ova operacija najpre upiše vreme sledeće aktivacije u PCB ove niti (prva linija), označi ovu nit kao „uspavanu“ (druga linija) i uđe u praznu petlju uposlenog čekanja do prvog sledećeg periodičnog prekida sa tajmera (treća linija). U prekidnoj rutini na taj prekid, ako jezgro pronađe da je tekuća nit uspavana, smestiće tu nit u strukturu o kojoj brine klasa Timing pozivom statičke operacije Timing::schedule(Thread*). Klasa Timing obezbeđuje da se, kada dođe vreme aktivacije date niti, ta nit ponovo označi kao „aktivna“ postavljanjem isBlocked na 0. Da bi se održavala ova struktura i niti kojima je došlo vreme aktivirale, potrebno je u svakom periodičnom prekidu pozvati statičku operaciju Timing::tick(). Sve niti, bez obzira da li su uspavane ili spremne za izvršavanje, nalaze se u strukturi o kojoj brine klasa Scheduler. Statička operacija Scheduler::getRunning()vraća pokazivač na nit najvišeg prioriteta koja je trenutno aktivna. Na raspolaganju je i statička operacija: Thread::yield(Thread* oldRunning, Thread* newRunning);
koja vrši prelazak za steka jedne na stek druge date niti. Implementirati prekidnu rutinu za periodični prekid sa tajmera. Prekidi se maskiraju hardverski, implicitno, prilikom ulaska u prekidnu rutinu. (b)(10) Svaki i-ti od N uporednih i nezavisnih procesa istog tipa Writer upisuje u svoj i-ti element deljenog vektora podataka. Jedan proces tipa Reader čita elemente iz tog deljenog vektora. Korišćenjem standardnih brojačkih semafora obezbediti potrebnu sinhronizaciju tako da svaki proces tipa Writer upiše podatak u svoj element tek kada je Reader pročitao prethodno upisanu vrednost iz tog elementa, a Reader čita elemente koji su upisani u vektor čim oni postanu upisani, ne namećući nikakav poseban redosled čitanja podatka koje upisuju različiti procesi tipa Writer (ovi procesi su nezavisni i Reader ne sme da čeka upis od strane procesa i da bi pročitao podatak j ako je podatak j spreman, a podatak i nije) i izbegavajući izgladnjivanje procesa tipa Writer. (c)(5) Potrebno je uraditi transformaciju i prenos neke jako velike količine ličnih podataka o građanima jedne države iz jedne baze podataka u drugu. Podaci vezani za svakog građanina su disjunktni, tj. podaci o jednom građaninu ne referenciraju podatke o drugim građanima. Za tu potrebu napravljen je program koji je u stanju da za dati ulazni podskup podataka iz izvorišne baze (specifikacija načina dolaska do tog podskupa u izvornoj bazi je ulazni parametar tog programa) uzima po N (N je još jedan parametar ovog progama) zapisa o građanima, transformiše ih, i da tako transformisane podatke upiše u jedan izlazni fajl, potom uzima N narednih zapisa i prebacuje ih u novi fajl itd, sve dok ne prebaci ceo svoj podskup. Sa druge
strane, postoji program koji je u stanju da uzima jedan po jedan ulazni fajl iz zadatog direktorijuma i da podatke iz fajla učitava u odredišnu bazu. Precizno objasnite kako biste ceo ovaj posao transformacije i prenosa podataka organizovali što efikasnije. 2.
(20 poena)
Upravljanje memorijom
a)(5) Posmatra se neki izvorni program p koji je podeljen na nekoliko modula i njegove tri izvršive verzije: prva dobijena statičkim povezivanjem modula, druga koja koristi dinamičko učitavanje modula i treća koja koristi preklapanje modula (overlays). Uz svaku dole navedenu tvrdnju navesti da li je tačna ili netačna: i) Za svaki program p, svako izvršavanje njegove statički povezane varijante zauzima više memorije nego semantički ekvivalentno izvršavanje varijante sa dinamičkim učitavanjem. Odgovor: ________________ ii) Za svaki program p, svako izvršavanje njegove varijante sa dinamičkim učitavanjem traje isto ili kraće nego semantički ekvivalentno izvršavanje varijante sa preklopima. Odgovor: ________________ b)(5) U nekom operativnom sistemu virtuelna adresa je veličine 40 bita, adresibilna jedinica je bajt, a stranica je veličine 4KB. Operativni sistem preslikava prvih 256K stranica adresnog prostora svakog procesa u svoj (kernel) memorijski prostor, tako da taj deo virtuelnog adresnog prostora nije na raspolaganju samom procesu. Koliko virtuelne memorije jeste na raspolaganju za korišćenje svakom procesu? Odgovor: ___________________________________________________________________ c)(10) U donjoj tabeli prikazane su informacije za svih 6 stranica nekog procesa u sistemu koji koristi copy-on-write tehniku prilikom kreiranja procesa-klona sistemskim pozivom fork(). Prikazati ovakvu tabelu za proces koji je dobijen od ovog procesa pozivom fork(), odmah nakon tog poziva. Kolona „Copy on write“ označava stranicu koja je logički dozvoljena za upis, ali je deljena između procesa roditelja i potomka do prvog upisa. 0 označava false/enabled, 1 označava true/disabled. Page num 0 1 2 3 4 5
R 0 0 1 1 1 1
W 0 0 1 1 0 1
E 1 1 0 0 0 0
Copy-on-write 0 0 0 0 0 0
Frame num FFFB FFFD FFFC FFFE FFFF FFFA
R
W
E
Copy-on-write
Frame num
Rešenje: Page num
3.
(10 poena)
Ulazno/izlazni podsistem
Implementirati internu nit jezgra, zajedno sa odgovarajućom prekidnom rutinom, koja uzima jedan po jedan zahtev za izlaznom operacijom na nekom izlaznom znakovnom uređaju iz ograničenog bafera i obavlja prenos bloka znakova zadat tim zahtevom korišćenjem mehanizma prekida. Ograničeni bafer, realizovan klasom OutputBuffer, u sebi ima implementiranu sinhronizaciju proizvođača i potrošača. Zahtev ima sledeću strukturu: struct OutputRequest { char* buffer; // Buffer with data (block) int size; // Buffer (blok) size Semaphore* toSignal; // Semaphore to signal on request completion };
Kada se završi prenos zadat zahtevom, potrebno je signalizirati semafor na koga ukazuje OutputRequest::toSignal i obrisati zahtev. Date su deklaracije pokazivača preko kojih se može pristupiti registrima uređaja, pošto su oni inicijalizovani adresama tih registara: typedef unsigned int REG; REG* ioCtrl =...; // control register REG* ioStatus =...; // status register char* ioData =...; // data register
U upravljačkim registrima najniži bit je bit Start kojim se pokreće periferija, a u statusnim registrima najniži bit je bit spremnosti (Ready) čija vrednost 1 ukazuje da je kontroler periferije spreman za prenos podatka preko svog registra za podatke. Na raspolaganju za implementaciju potrebne sinhronizacije između prekidne rutine i niti su binarni semafori – događaji, čija se operacija signal može pozivati iz prekidne rutine. 4.
(15 poena)
Fajl podsistem
a)(5) U nekom fajl sistemu struktura direktorijuma je aciklički usmereni graf (DAG). Postoje sledeće sistemske komande: copy src dst: kopira fajl do koga se može doći stazom src i registruje kopiju pod punim imenom (stazom) dst; alias src dst: registruje fajl do koga se može doći stazom src pod još jednim punim imenom (stazom) dst, bez kopiranja samog fajla. Na donjoj slici prikazano je posmatrano početno stanje sistema; direktorijumi su prikazani kao pravougaonici sa ulazima u kojima su nazivi, a fajlovi su prikazani krugovima. Prikazati stanje ovog sistema nakon izvršavanja sledeće sekvence komandi: copy alias copy alias
/a/e /a/d/n /b /b
/a/d/n /c/i/p /c/q /r
b)(10) U nekom fajl sistemu direktorijum i fajl se uopšteno nazivaju ulazom (entry) i predstavljaju se istom strukturom FCB. U sistemu su implementirane sledeće elementarne operacije: int f_find_entry(char* name, FCB** fcb): pronalazi ulaz sa zadatom punom stazom (imenom) i u *fcb upisuje pokazivač na FCB strukturu tog ulaza; int f_find_entry(FCB* dir, char* name, FCB** fcb): pronalazi ulaz u direktorijumu datom prvim argumentom sa zadatim imenom (nazivom bez staze) datim drugim argumentom i u *fcb upisuje pokazivač na FCB strukturu tog ulaza; int f_create_file(FCB** fcb): kreira novi fajl u fajl sistemu i u *fcb upisuje pokazivač na inicijalizovanu FCB strukturu tog kreiranog fajla; f_register_entry(FCB* dir, FCB* entry, char* name): u direktorijum dat prvim argumentom registruje ulaz dat drugim argumentom pod nazivom datim trećim arg.; f_remove_entry(FCB* dir, char* name): iz direktorijuma datog prvim argumentom izbacuje ulaz pod nazivom datim drugim argumentom (ne briše taj ulaz, već ga samo izbacuje iz direktorijuma, a taj ulaz ostaje kao objekat u fajl sistemu); f_delete_entry(FCB* entry): iz fajl sistema uklanja (briše, uništava) dati ulaz. Sve ove operacije u slučaju uspeha vraćaju vrednost 0, a u slučaju greške ostavljaju sistem u konzistentnom stanju, kao da promena nije ni započeta i vraćaju kod greške koji je različit od 0. Korišćenjem ovih operacija implementirati sledeće operacije koje treba da vraćaju status na isti način: int f_create_file(char* dname, char* fname): u direktorijumu sa punim imenom (sa stazom) zadatim prvim argumentom kreira novi fajl sa imenom zadatim drugim arg.; int f_move_entry(char* sdname, char* fname, char* tdname): iz direktorijuma sa punim imenom zadatim prvim argumentom premešta ulaz sa imenom zadatim drugim argumentom u direktorijum sa punim imenom zadatim trećim argumentom. 1.(3)
Ukratko objasniti osnovni motiv nastanka koncepta multiprogramiranja.
2.(3)
Zašto nije dobro koristiti uposleno čekanje u prekidnoj rutini?
3.(3) Na jeziku C, korišćenjem sistemskih poziva fork() i execlp() za Unix, napisati program koji pokreće drugi program iz fajla čiji je naziv zadat kao parametar komandne linije prvog programa.
4.(3) Korišćenjem standardnih brojačkih semafora u školskom jezgru, na jeziku C++ napisati globalne deklaracije i inicijalizacije, kao i kod tela dve uporedne niti A i B koje ciklično rade sledeće: A: upisuje vrednost u deljene promenljive x i y, a zatim čeka da proces B upiše zbir x i y u promenljivu z čiju vrednost ispisuje na standardni izlaz; B: čeka da proces A upiše vrednosti u deljene promenljive x i y, zatim ove dve vrednosti sabira i zbir upisuje u deljenu promenljivu z. 5.(3) Zašto preklopi (overlays) ne mogu da se koriste ako program ima više niti koje obezbeđuje operativni sistem? Precizno objasniti.
6.(3) Potrebno je u nekoj strukturi podataka voditi evidenciju o slobodnim fragmentima memorije kod kontinualne alokacije sa best fit algoritmom. Koja struktura podataka je efikasnija za implementaciju operacije dealokacije segmenta memorije koju je zauzimao ugašeni proces: a) dvostruko ulančana lista slobodnih fragmenata uređenih po veličini ili b) dvostruko ulančana lista slobodnih fragmenata uređenih po poziciji u memoriji. Kratko obrazložiti. 7.(3)
Kojom tehnikom se nedeljivi uređaj može učiniti virtuelno deljivim?
Odgovor: _________________________ 8.(3) U fajl podsistemu nekog operativnog sistema ne vodi se tabela otvorenih fajlova za svaki proces, već postoji samo jedna globalna tabela otvorenih fajlova za ceo sistem. Drugim rečima, ne postoji nikakva informacija o upotrebi otvorenog fajla lokalna (privatna) za pojedinačni proces, već su sve takve informacije globalno deljene. Da li pojam pokazivača trenutne lokacije (kurzora) za čitanje/upis u fajl ima smisla čuvati u globalnoj tabeli otvorenih fajlova i zašto? 9.(3) Dati procenu kompleksnosti u najgorem slučaju datih operacija sa direktorijumom u odnosu na broj postojećih fajlova n u direktorijumu, za navedene implementacije direktorijuma. Hash tabela sa dvostruko Dvostruko ulančana lista sa ulančanim listama za pokazivačima na glavu i rep liste rešavanje kolizija Pronalaženje ulaza sa datim imenom Brisanje pronađenog ulaza (ne računajući pronalaženje po imenu) 10.(3) Neki fajl sistem koristi indeksirani pristup alokaciji fajlova sa indeksima u dva nivoa, blokom veličine 512KB i 64-bitnim adresama fizičkih blokova. Kolika je maksimalna veličina fajla u ovom sistemu? 1.
(25 poena)
Upravljanje procesima
(a)(10) U nekom višeprocesorskom operativnom sistemu postoji zajednički red spremnih procesa za sve procesore. Kada se vrši promena konteksta na nekom procesoru, iz tog reda se uzima jedan odabrani spremni proces i njemu se dodeljuje dati procesor. Klasa Scheduler rukuje zajedničkim redom spremnih procesa i realizuje raspoređivanje, s tim da njene operacije nemaju
obezbeđeno međusobno isključenje, pa se ne mogu neposredno koristiti iz koda jezgra koje vrši promenu konteksta u višeprocesorskom režimu: class PCB; class Scheduler { public: static PCB* get(); // Returns one ready PCB static void put(PCB*); // Puts the given PCB into the ready queue };
Na raspolaganju su sledeće realizovane funkcije: void mask_interrupts(); void unmask_interrupts(); void swap(int*,int*);
Funkcija mask_interrupts() maskira, a unmask_interrupts() demaskira prekide na datom procesoru na kome se izvršava; ove funkcije su napravljene tako da dozvoljavaju višestruke ugnežđene pozive (tek poslednji poziv unmask_interrupts() koji je uparen sa prvim pozivom mask_interrupts() zaista omogućava prekide). Funkcija swap() atomično zamenjuje vrednosti memorijskih lokacija na koje ukazuju argumenti korišćenjem odgovarajuće mašinske instrukcije. Realizovati klasu MuxScheduler koja ima isti interfejs kao i klasa Scheduler, ali koja ima obezbeđeno međusobno isključenje tako da se može koristiti za promenu konteksta iz koda jezgra u višeprocesorskom režimu. (b)(10) Na raspolaganju je koncept neograničenog bafera čiji su elementi tipa int, realizovan klasom UnboundedBuffer sa operacijama append() i take(). Korišćenjem samo ove klase, realizovati klasu Semaphore koja predstavlja koncept standardnog brojačkog semafora sa inicijalizacijom i operacijama wait() i signal(). (c)(5) Koliko se ukupno procesa kreira nakon pokretanja jednog inicijalnog procesa nad sledećim program koji se nalazi u fajlu p.exe? void main () { for (int i=0; i<3; i++) { int pid = fork(); if (pid<0) exit(-1); if (pid==0) execlp(“p.exe”); } }
2. (20 poena) Upravljanje memorijom a)(5) Da li kôd deljene biblioteke sa dinamičkim vezivanjem (DLL) može da koristi apsolutno adresiranje memorije, npr. kod skokova, u višeprocesnom sistemu sa virtuelnom memorijom? Obrazložiti. b)(5) U nekom sistemu virtuelni adresni prostor je veličine 4 GB, adresibilna jedinica je 32-bitna reč, a fizička adresa je veličine 32 bita. Ceo virtuelni adresni prostor ima 64 K stranica,
a tabela preslikavanja stranica (PMT) je u jednom nivou i u svakom ulazu čuva samo broj okvira u koji se stranica preslikava. Koliko 32-bitnih reči zauzima PMT? Odgovor: __________
c)(10) U nekom operativnom sistemu primenjuje se tehnika copy-on-write i učitavanje stranica virtuelne memorije na zahtev (demand paging). Za potrebe preslikavanja stranica postoje dve odvojene strukture: tabela preslikavanja stranica (PMT) koju hardver za preslikavanje adresa jedino koristi i koja sadrži minimum potrebnih informacija za ovo hardversko preslikavanje, kako bi bila što manja, i struktura koju isključivo koristi operativni sistem i koja čuva ostale informacije o virtuelnom adresnom prostoru procesa. Drugim rečima, u PMT su uključene one i samo one informacije koje su potrebne hardveru za preslikavanje adresa. Hardver za preslikavanje adresa tumači vrednost u deskriptoru stranice u jednom ulazu u PMT na sledeći način: Vrednost Značenje svi biti 0 Nije moguće preslikavanje, hardver generiše izuzetak i kontrolu preuzima OS. najniži bit 0, Moguće preslikavanje, biti iznad razreda 0 daju broj okvira u koji se stranica preslikava, dozvoljena samo operacija čitanja. ostali 0 najniži bit 1, Moguće preslikavanje, biti iznad razreda 0 daju broj okvira u koji se stranica preslikava, dozvoljene operacije i čitanja i upisa. ostali 0 Implementirati operaciju: void copyPMT(PMT* parent, PMT* child);
koja obavlja deo postupka kopiranja adresnog prostora procesa prilikom kreiranja potomka sa fork(), pri čemu samo obavlja kopiranje i potrebno ažuriranje PMT procesa roditelja i deteta, uz copy-on-write semantiku. PMT je niz od NumOfPages elemenata tipa unsigned int.
3.
(10 poena)
Ulazno/izlazni podsistem
Predložiti API za rad sa nekim izlaznim, znakovno orijentisanim nedeljivim uređajem sa kojim se izlaz obavlja mehanizmom spooling, kako bi se omogućilo njegovo uporedno korišćenje, čak i iz više „sesija“ unutar istog korisničkog procesa. 4.
(15 poena)
Fajl podsistem
a)(5) U nekom operativnom sistemu postoji koncept tekućeg direktorijuma procesa, pri čemu proces može promeniti svoj tekući direktorijum odgovarajućim sistemskim pozivom, ali mu se dodeljuje podrazumevani tekući direktorijum prilikom pokretanja. Navesti bar dve različite mogućnosti – koji direktorijum se dodeljuje kao podrazumevani tekući direktorijum. b)(10) U nekom fajl sistemu direktorijum se smešta na isti način kao i fajl i opisuje se FCB strukturom (File Control Block). Direktorijum se implementira kao hash tabela sa N ulaza, pri čemu je u svakom ulazu pokazivač na ulančanu listu vrednosti svih ključeva koji se preslikavaju u taj ulaz u tabeli ili NULL, ukoliko takvih nema. Direktorijum preslikava naziv elementa direktorijuma (fajla ili poddirektorijuma) u vrednost koja je identifikator FCB-a tog elementa. Date su sledeće deklaracije: #define N ... typedef long int FCBID;
// FCB Identifier
struct DirEntry { char filename[MAX_FILENAME_LEN]; // Null-terminated string FCBID fcb; unsigned long next_dir_entry; // Next dir entry in the linked list }
Sadržaj direktorijuma organizovan je na sledeći način: Na početku je niz od N elemenata tipa unsigned long koji predstavljaju ulaze u hash tabeli. Svaki ulaz sadrži redni broj sloga tipa DirEntry koji je prvi u ulančanoj listi onih koji se preslikavaju u taj ulaz; vrednost 0 označava NULL vrednost. Odmah iza je neograničeni niz slogova tipa DirEntry, pri čemu svaki ima redni broj sloga u nizu koji je sledeći u njegovoj ulančanoj listi (to je next_dir_entry). Slogovi se broje počev od 1, a vrednost 0 označava NULL. Na raspolaganju je funkcija: int hash_code(char*);
koja vraća hash vrednost u opsegu 0..N-1 za zadati ključ-ime fajla, kao i funkcija: void* f_read(FCBID, unsigned long offset, unsigned long size);
koja po potrebi učitava i kešira deo fajla sa zadatim FCB-om i vraća pokazivač na bafer u koji je učitan taj deo fajla. Deo se identifikuje relativnom pozicijom u odnosu na početak sadržaja fajla (u sizeof(char) kao jediničnoj veličini, početak je 0), a funkciji se zadaje i njegova veličina (opet u jedinicama sizeof(char)). Realizovati funkciju: void dir(FCBID dir);
koja na standardni izlaz ispisuje sadržaj datog direktorijuma, i to u jednoj liniji samo po jedan naziv elementa tog direktorijuma. Redosled ispisa može da bude proizvoljan, prilagođen implementaciji. 1.
(25 poena)
Upravljanje procesima
(a)(10) Jezgro nekog operativnog sistema podržava niti (thread) sa mogućnošću suspenzije. Koncept niti podržan je klasom Thread čiji je deo definicije prikazan dole. Operacija Thread::suspend nekog objekta klase Thread može da se pozove iz konteksta bilo koje niti, pa i tekuće. Ova operacija suspenduje (blokira) nit predstavljenu objektom klase Thread za koga je operacija pozvana. Operacija resume ponovo aktivira suspendovanu nit; ako nit čija je operacija pozvana nije suspendovana, resume vraća -1. Dat je i interfejs klase Scheduler koja realizuje listu spremnih niti sa raspoređivanjem. Korišćenjem funkcija setjmp i longjmp, implementirati operacije Thread::suspend i Thread::resume. class Thread { public: Thread (); void suspend (); int resume(); ... private: static Thread* running; jmp_buf context; int isSuspended; ... }; Thread::Thread () : ... isSuspended(0) ... class Scheduler { public: static Thread* get (); // Return the thread to run static void remove (Thread*);//Remove the given thread from the ready list static void put (Thread*); // Put the given thread to the ready list };
(b)(5) Dat je sledeći program koji koristi koncept niti (klasa Thread) koje se mogu kreirati nad datom globalnom funkcijom, pri čemu se ta funkcija poziva u kontekstu novokreirane uporedne niti, kao što je pokazano u školskom jezgru datom na predavanjima. Zamisao programera je da ovaj program na kraju ispiše zbir celih brojeva od 0 do N-1.
#include „kernel.h“ #include #define N 10 int a[N]; int sum = 0; Semaphore end(0); void writer () { for (int i=0; istart(); Thread* t2 = new Thread(adder); t2->start(); end.wait(); printf(„Sum: %d\n“,sum); }
Precizno objasniti šta je problem sa ovim programom.
c)(10) Korišćenjem semafora i bez ikakvih izmena u funkciji main, rešiti problem u programu datom u tački b), tako da program zaista radi ono što je zamišljeno. 2.
(20 poena)
a)(5)
Pored svake tvrdnje dati odgovor da li je ona tačna ili netačna. Lakše je konstruisati program tako da koristi preklope nego isti taj program da koristi samo dinamičko učitavanje. ________________ Program koji koristi preklope (overlay) u opštem slučaju zahteva manje memorije od istog programa kada koristi samo dinamičko učitavanje. ____________________ U svakom svom izvršavanju, program koji koristi preklope (overlay) u opštem slučaju zahteva manje memorije od istog takvog izvršavanja istog programa kada koristi samo dinamičko učitavanje. ____________________
Upravljanje memorijom
b)(5) U nekom sistemu primenjuje se kontinualna alokacija memorije. Slobodni fragmenti memorije organizovani su u jednostruko ulančanu listu. Kako ova lista treba da bude uređena da bi best fit algoritam radio najefikasnije? Kako tada postupa ovaj algoritam? c)(10) U nekom sistemu sa straničnom organizacijom virtuelne memorije primenjuje se straničenje u dva nivoa. Stranica je veličine 512 bajtova. PMT i prvog i drugog nivoa su veličine po 32 ulaza, pri čemu vrednost 1 u svim bitima ulaza označava da deo virtuelne memorije koji pokriva taj ulaz uopšte nije korišćen (alociran) od strane procesa. PMT drugog nivoa se i ne alocira ako se u opsegu koga ona pokriva ne koristi ni jedna stranica. U PMT prvog nivoa nekog procesa postoji tačno 22 ulaza koji imaju vrednost 1 u svim bitima. Koliko svog virtuelnog adresnog prostora koristi ovaj proces? (Odgovor dati u vidu granica opsega u kome se može kretati ta vrednost.) Odgovor: Ovaj proces koristi najmanje ________B, a najviše _______B svog virtuelnog adresnog prostora.
3.
(10 poena)
Ulazno/izlazni podsistem
a)(5) Umesto tehnike spooling, pristup uporednih procesa štampaču u nekom sistemu omogućuje se međusobnim isključenjem pomoću operacije rezervacije: svaki proces, pre nego što zatraži bilo koju operaciju sa štampačem, mora da ga rezerviše, a tu rezervaciju otpušta tek kada završi sa celim jednim poslom štampe. Šta je nedostatak ove tehnike? b)(5)
Neki uređaj koji proizvodi podatke je blokovski uređaj i podatke isporučuje u blokovima
1.
(25 poena)
Upravljanje procesima
(a)(10) U jezgru nekog multiprocesorskog operativnog sistema raspoređivanje niti (threads) vrši se iz jednog zajedničkog reda spremnih niti, implementiranog kao dvostruko ulančana lista. Raspoređivanje se vrši po FIFO principu, a red sadrži niti za sve procesore, tako da se na procesoru za koji se vrši izbor uzima prva spremna nit iz tog zajedničkog reda. Red spremnih niti implementiran je klasom Scheduler čija je definicija: class Scheduler { public: static void put (Thread*); static Thread* get(); private: static Thread *head, *tail; static int lck; // Lock for mutual exclusion };
Procesori su svi isti, 32-bitni, dvoadresni, sa RISC load-store arhitekturom. Registri opšte namene, označeni sa R0..R31 su 32-bitni. Postoji instrukcija SWAP Ri,[Rj] koja vrši atomičnu zamenu sadržaja datog registra Ri i memorijske lokacije na adresi koja je u Rj. i)(5) Na asembleru datog procesora implementirati funkcije: void lock (int* ptrLock); void unlock (int* ptrLock);
koje obezbeđuju međusobno isključenje pristupa kritičnoj sekciji od strane programa koji se izvršavaju na više procesora, pri čemu je argument pokazivač na lokaciju koja služi kao „ključ“ (barijera) za pristup kritičnoj sekciji. Nije potrebno maskirati i demaskirati prekide, pošto se to radi pri ulasku u sistemski režim rada. ii)(5) Implementirati klasu Scheduler. (b)(10) Objasniti kakvu međusobnu sinhronizaciju imaju procesi tipa A i tipa B:
const N : integer = ...; -- N>0 shared var count : integer = 0; mutex : semaphore = 1; entry : semaphore = 0; process A; begin mutex.wait; count:=count+1; if (count==N) then entry.signal; else mutex.signal; end;
process B; begin entry.wait; count:=0; mutex.signal; end;
c)(5) Korišćenjem sistemskog poziva fork(), napisati C program koji, kada se nad njim kreira proces, napravi jednog svog potomka i završi se, ovaj novi proces napravi jednog svog potomka i završi se, itd., tako da ukupno bude kreirano N procesa (uključujući i početni, N>1), pod uslovom da su svi sistemski pozivi uspešni. veličine 256 bajtova. Drugi uređaj na koji treba slati ove podatke je znakovni uređaj. Kojom tehnikom je potrebno adaptirati ove različite veličine jedinica prenosa? 4.
(15 poena)
Fajl podsistem
a)(5) Neki fajl sistem pruža sledeće operacije u svom API za tekstualne fajlove: FHANDLE open(char* filename) Otvara fajl sa datim imenom. void close(FHANDLE) Zatvara dati fajl. int size(FHANDLE) Vraća trenutnu veličinu sadržaja fajla u znakovima. void append(FHANDLE,int) Proširuje sadržaj fajla za dati broj znakova na kraju. void seek(FHANDLE,int) Postavlja kurzor datog fajla na datu poziciju (redni broj znaka počev od 0). void write(FHANDLE,char*) Na poziciju kurzora datog fajla upisuje dati niz znakova, ne uključujući završni znak ‘\0’, i pomera kurzor iza upisanog niza znakova. Napisati program koji na kraj postojećeg fajla sa imenom proba.txt upisuje sve što je uneseno preko standardnog ulaza, sve dok se na ulazu ne unese znak ’X’. Zanemariti sve potencijalne greške u ulazu/izlazu. b)(10) Neki fajl sistem koristi indeksirani pristup alokaciji fajlova. U strukturi FCB polje index predstavlja indeks tog fajla; i struktura FCB i indeks su učitani u memoriju (keširani) prilikom otvaranja fajla. U indeksu, vrednost 0 označava da dati blok nije alociran (null). Operacija allocBlock alocira novi blok na disku i vraća njegov broj; u slučaju greške, ova funkcija vraća 0. Date su sledeće deklaracije:
typedef unsigned long int BlockNo; // Block number const int FIndexSize = ...; // File index size typedef BlockNo FIndex[FIndexSize]; // File index const unsigned long int FBlockSize = ...; // Block size in bytes struct FCB { ... unsigned long int size; // Current file size in bytes FIndex index; // File index }; BlockNo allocBlock();
Potrebno je realizovati funkciju: unsigned long int append (FCB* file, unsigned long int bytes);
koja treba da „proširi“ sadržaj fajla za dati broj bajtova, po potrebi alocirajući nove blokove za sadržaj fajla. Ova funkcija treba da vrati broj bajtova za koji je uspela da proširi fajl; u slučaju uspeha, ovaj broj je jednak traženom, a u slučaju nedostatka prostora, on je manji. Veličina sadržaja fajla ne mora biti zaokružena na veličinu bloka. 2.
(20 poena)
Upravljanje memorijom
a)(5) U implementaciji nekog linkera postoji operacija pronalaženja datog simbola u tabeli simbola i vraćanje deskriptora tog simbola. Ova operacija se koristi na svim mestima na kojima je potrebno pristupiti tabeli simbola i u njoj pronaći dati simbol ili iz nje dohvatiti njegov deskriptor. Da li slučaj nepostojanja tražnog simbola u tabeli simbola treba tretirati kao izuzetak koji ova operacija treba da podigne, odnosno grešku koju treba prijaviti? Precizno obrazložti odgovor. b)(5) U nekom sistemu primenjuje se best-fit algoritam kontinualne alokacije memorije. Inicijalno je prostor veličine 512KB potpuno slobodan za alokaciju korisničkih procesa. Potom su različiti procesi zadavali sledeće zahteve (slovna oznaka označava proces koji je postavio zahtev, brojna oznaka označava veličinu alociranog prostora u KB, a minus označava gašenje procesa i oslobađanje njegove memorije): A32, B128, C64, B-, D256, A-, E16, F64 Odgovoriti na sledeća pitanja koja se odnose na stanje memorije nakon ove sekvence zahteva: i)
Kolika je ukupna veličina trenutno slobodne memorije? Odgovor: _____________
ii)
Koliko je ukupno slobodnih fragmenata? Odgovor: _____________
iii)
Kolika je veličina najmanjeg slobodnog fragmenta? Odgovor: _____________
iv)
Kolika je veličina najvećeg slobodnog fragmenta? Odgovor: _____________
c)(10) U nekom sistemu sa straničnom organizacijom virtuelne memorije, operativni sistem za svaki proces vodi posebnu strukturu tzv. segmenata virtuelne memorije. Jedan segment virtuelne memorije procesa sastoji se od proizvoljno mnogo susednih stranica koje imaju isti način korišćenja, ista prava pristupa, na isti način se dohvataju sa diska (npr. programski kod koji se
dohvata iz .exe fajla ili podaci koji se dohvataju iz prostora za zamenu) itd. Deo definicije deskriptora segmenta data je u nastavku. Deskriptori segmenata uvezani su u jednostruku listu na koju ukazuje polje (glava liste) segs u PCB. Implementirati funkciju: Segment* getSegment(PCB* process, unsigned int page);
koja pronalazi i vraća deskriptor segmenta kome pripada data stranica. struct Segment { // Segment descriptor Segment* next; // Next segment descriptor in the list unsigned int startingPage; // The first page in the segment unsigned int size; // The number of pages in the segment (segment size) ... };
3.
(10 poena)
Ulazno/izlazni podsistem
Tehnikom baferisanja potrebno je omogućiti blokovski pristup nekom znakovno orijentisanom ulaznom uređaju. U nastavku je dat interfejs (deo definicije) klase Buffer koja obezbeđuje ovu adaptaciju. Capacity je kapacitet bafera, dok je BlockSize veličina bloka. Jedna interna nit jezgra učitava jedan po jedan znak sa ulaznog uređaja i upisuje u bafer pozivom operacije put() ove klase. Korisničke niti mogu da pozivaju operaciju get() kojom u svoj memorijski bafer, na koga ukazuje argument buf, mogu da preuzmu jedan ceo blok učitanih znakova veličine BlockSize. const int Capacity = ..., BlockSize = ...; // Capacity>BlockSize class Buffer { public: Buffer (); void put (char c); void get (char* buf); ... };
Realizovati u potpunosti klasu Buffer uz svu potrebnu sinhronizaciju, korišćenjem standardnih brojačkih semafora.
4.
(15 poena)
Fajl podsistem
a)(5) Objasniti zašto se prava pristupa do fajla (prava na izvršenje određenih operacija nad fajlom) po pravilu čuvaju u tabeli otvorenih fajlova koja pripada kontekstu procesa, a ne u globalnoj (sistemskoj) tabeli otvorenih fajlova zajedničkoj za sve procese. b)(10) Upoređuju se sledeća tri načina alokacije blokova za sadržaj fajla: A) Kontinualna alokacija, s tim da se za fajl odmah prilikom njegovog kreiranja alocira onoliko blokova kolika je maksimalna dozvoljena veličina fajla, iako ne moraju svi blokovi biti zauzeti sadržajem; u FCB je pokazivač na prvi blok i broj zauzetih blokova. B) Ulančana alokacija, s tim da su u FCB pokazivači na prvi i poslednji blok sa sadržajem fajla, a pokazivači na sledeći blok u fajlu su na kraju svakog bloka sa sadržajem. C) Indeksna alokacija, s tim da je u FCB pokazivač na (jedini) indeksni blok.
-
Za svaki od ovih načina alokacije posmatra se broj blokova koje je potrebno učitati u memoriju, pod sledećim pretpostavkama: svaka operacija posmatra se nezavisno, za isto početno stanje; početno stanje je takvo da je u memoriju učitan FCB i ni jedan drugi blok, osim onih koji su eksplicitno navedeni u operaciji. Operacije su sledeće: 1) Direktan pristup n-tom bloku sa sadržajem u odnosu na početak fajla (nije učitan indeksni blok za način C). 2) Sekvencijalni pristup: pristup bloku n+1 nakon što je već učitan blok n (time je već učitan i indeksni blok za način C). 3) Proširenje sadržaja fajla (ispod maksimalne dozvoljene veličine fajla) slobodnim blokom koji je već alociran i učitan u memoriju (nije učitan indeksni blok za način C). U donju tabelu upisati koliko blokova treba učitati za svaki od navedenih načina i svaku od navedenih operacija. A 1) 2) 3)
B
C