48
ETF Beograd Rešeni rokovi iz Operativnih sistema 1 2011-2014

OS1 Reseni Rokovi

Embed Size (px)

DESCRIPTION

Reseni rokovi iz operativnih sistema

Citation preview

Page 1: OS1 Reseni Rokovi

ETF Beograd

Rešeni rokovi iz

Operativnih sistema 1

2011-2014

Page 2: OS1 Reseni Rokovi

2/48

Ispitni rok: jun 2011 (17.6.2011)

1.(3) Dati kratke definicije multiprocesorskog sistema i distribuiranog sistema.

Multiprocesorski sistem ima više procesora sa delejnom memorijom, tj. veću propusnu moć (veća

količina urađenog posla u jednici vremena). Distriburani sistem ima skup procesora bez zajedničke memorije

povezanih komunikacionom mrežom (npr. LAN, WAN, ...)

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?

Na stek se prilikom poziva potprograma pamti mesto odakle je potprogram pozvan, kako bi se

izvršavanje tamo moglo vratiti. Prilikom povratka iz potprograma uzima se poslednja sačuvana adresa

povratka, koja se posle skoka izbacuje sa steka.

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.

var mutex : Semaphore = N;

process P:

loop

wait(mutex);

<critical section>

signal(mutex);

<non-critical section>

end

end P;

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.

void main( int argc, char* argv[] ) {

int pid = fork();

if (pid==0) execlp ( argv[1] );

else {wait(null); exit(0);}

}

Promenljive argv (argument count) i argc (argument vector) su način pomoći kojih se argumenti

komandne linije prenose u main() u C-u i C++'u. argc je broj stringova koji pokazuju na argv. Promenljivu

pid (process ID) dobijamo od sistemskog poziva fork()koji deli proces na proces-roditelj i proces-dete, kad je

proces-dete vraća 0, a u slučaju proces-roditelja vraća ID deteta. Sistemski poziv execlp() zamenjuje program

pozivajućeg procesa drugim programom koji mu zadamo. Ukoliko je proces-dete u pitanju pozivamo

execlp()sa prvim argumentom komandne linije.

Page 3: OS1 Reseni Rokovi

3/48

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?

Veličina stranice je:

PAGE = 4kB = 212

B

Veličina adresibilne jedinice je:

AU = 1B = 20B

Širina stranice je:

OFFSET_S = log2(PAGE/AU) = 12B

Fizička adresa je:

PA_S = 32B

Virtuelna adresa je:

VA_S = 32B

Virtuelna adresa izgleda ovako:

VA(32) = PAGE_L1 + PAGE_L2 + OFFSET(12)

Vidimo da oba polja dele 20 bita u virtuelnoj adresi:

PAGE_L1 + PAGE_L2 = VA(32) - OFFSET(12) = 20B

Pošto je veličina polja ista, svako polje ima po 10 bita:

PAGE_L1 = PAGE_L2 => PAGE_L1(10) / PAGE_L2(10)

Konačan izgled virtuelne adrese je:

VA(32) = PAGE_L1(10) : PAGE_L2(10) : OFFSET(12)

Broj ulaza dobijamo iz veličine polja tj. za 10 bita je 210

ulaza (1024).

Veličina jednog ulaza je:

PMT1_ENTRY = log2(PA_S/AU) = 4B

Veličinu PMT prvog nivoa dobijamo kada pomnožimo broj ulaza sa veličinom jednog ulaza:

PMT1_S = 210

* PMT1_ENTRY = 1024 * 4B = 4kB

7.(3) Da li linker prilikom povezivanja sa ciljem dobijanja izvršnog programa (.exe) pravi razliku između

fajlova tipa .obj i tipa .lib?

Ne pravi razliku imaju isti oblik i značenje oba tipa.

8.(3) Kojom tehnikom se znakovno orijentisani ulazni uređaj može učiniti logički (virtuelno) blokovski

orijentisanim?

Tehnikom baferisanja, npr. dvostruki bafer.

Page 4: OS1 Reseni Rokovi

4/48

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); ______x_______

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?

Proverava pravo pristupa u tabeli koja je deo konteksta datog procesa.

Page 5: OS1 Reseni Rokovi

5/48

Ispitni rok: jul 2011 (8.7.2011)

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<N; i++) pid[i] = fork();

}

Odgovor: 4 .

Prilikom prvog fork-a imamo proces-roditelj i proces-dete koji dele isti ID (pid[0]) jer fork() vraća

nulu kao vrednost proces-deta. Sledećim pozivom fork-a i proces-roditelj i proces-dete se dele i onda ukupno

imamo 4 procesa.

2.(3) Šta je razlika između „teškog“ procesa i niti (thread)?

Odgovor:

Teški proces je izvršavanje jednog programa sa spostvenim adresnim prostorm. Nit je jedno izvršavanje dela

koda programa unutar adresnog prostora “okružujućeg” procesa.

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> // Critical section

flag1 := false; // Exit protocol

<non-critical section>

end

end P1;

process P2

begin

loop

while flag1 = true do null end; // Busy wait

flag2 := true;

<critical section> // Critical section

flag2 := false; // Exit protocol

<non-critical section>

end

end P2;

Odgovor:

Ne obezbeđuje međusobno isključivanje zbog utrkivanja (race condition).

Page 6: OS1 Reseni Rokovi

6/48

4.(3) Na jeziku C++ implementirati klasu BoundedBuffer koja realizuje ograničeni bafer elemenata tipa Data

kapaciteta N pomoću semafora.

class Data;

const int N = ...; //kapacitet bafera

class BoundedBuffer {

public:

BoundedBuffer(); //konstruktor

void put (Data*);

Data* get (int consumerID); //consumerID treba da bude 1 ili 2 (ID potrošača)

private:

Data* buf[N]; //red elemenata ograničenog bafera

int head, tail; //početak (glava) i kraj (rep) reda semafori sa sinhronizaciju

Semaphore mutex, spaceAvailable, itemAvailable;

};

BoundedBuffer::BoundedBuffer () :

head(0), tail(0), mutex(1), spaceAvailable(N), itemAvailable(0) {}

void BoundedBuffer::append (Data* d) { //isto se piše kao i BoundedBuffer::put iz knjige

spaceAvailable.wait(); //ako je bafer pun, čekamo jedno slobodno mesto

mutex.wait(); //ulazimo u kritičnu sekciju (da li je potreban mutex?)

buf[tail]=d; //stavljamo element u bafer

tail=(tail+1)%N; //ažuriramo indeks poslednjeg elementa

mutex.signal(); //izlazimo iz kritične sekcije

itemAvailable.signal(); //signaliziramo da je još jedan podatak raspoloživ

}

Data* BoundedBuffer::tail (int myID) { //varijacija na BoundedBuffer::get iz knjige (bez gate-a)

itemAvailable.wait(); //ako je bafer prazan, čekamo dok se ne upiše podatak

mutex.wait(); //ulazimo u kritičnu sekciju

Data* d = buf[head]; //čitamo podatak iz bafera

head=(head+1)%N; //ažuriramo indeks prvog elementa

mutex.signal(); //izlazimo iz kritične sekcije

spaceAvailable.signal(); //signaliziramo da ima slobodnog prostora u baferu

}

5.(3) Šta je osnovna razlika između tehnike dinamičkog učitavanja i tehnike preklopa (overlays)?

Odgovor:

Dinamičko učitavanje ima tabelu adresa potprograma i učita deo tek u vreme izvršavanja, po potrebi.

Složeni program često nikada ne izvršava neke svoje delove ili ne koristi neke svoje podatke.

Kod prekolpa, delovi koji se ne koriste u isto vreme se zamenjuju u memoriji, zauzimajući isto mesto .

Kada zatreba neki deo koji nije u memoriji, izbaciti deo sa kojim se preklapa i na njegovo mesto učitati

potrebni.

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.

Odgovor:

Kod segmentne organizacije blokovi nisu iste veličine i zato se veličina proverava svaki put. Kod

stranične organizacije blokovi su iste veličine pa provera nije potrebna.

Page 7: OS1 Reseni Rokovi

7/48

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);

Rešenje:

int sync_write (char* buffer) { wait (async_write(buffer) ); }

8.(3) Ukratko objasniti kako se u Unix fajl sistemu definišu prava pristupa do fajla.

Odgovor:

Tri bita (RWX – Read, Write, Execute) za vlasnika, grupu i ostale određuju prava pristupa.

9.(3) Navesti razlog zašto bi neki fajl sistem koristio klastere na disku različite veličine.

Odgovor:

Radi smanjenja interne fragmentacije, npr. manji klaster za manje fajlove i za kraj fajla.

10.(3) Ukratko objasniti šta je inkrementalni, a šta totalni bekap (backup) fajl sistema?

Odgovor:

Totalni bekap kompletno arhivira kopiju. Inkrementalni samo promene od zadatog vremena i datuma.

Page 8: OS1 Reseni Rokovi

8/48

Ispitni rok: septembar 2011 (2.9.2011)

1.(3) Ukratko objasniti osnovni motiv nastanka koncepta multiprogramiranja.

Odgovor:

Izvršavati više poslova uporedo. Dok jedan proces čeka npr. na izvrešetak I/O operacije, CPU obslužuje

neki drugi proces.

2.(3) Zašto nije dobro koristiti uposleno čekanje u prekidnoj rutini?

Odgovor:

Dok se ne završi uposleno čekanje ne može da se promeni kontekst.

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.

Rešenje:

void main( int argc, char* argv[] ) {

int pid = fork();

if (pid==0) execlp (argv[1]);

else {wait(null); exit(0);}

}

Promenljive argv (argument count) i argc (argument vector) su način pomoći kojih se argumenti

komandne linije prenose u main() u C-u i C++'u. argc je broj stringova koji pokazuju na argv. Promenljivu

pid (process ID) dobijamo od sistemskog poziva fork()koji deli proces na proces-roditelj i proces-dete, kad je

proces-dete vraća 0, a u slučaju proces-roditelja vraća ID deteta. Sistemski poziv execlp() zamenjuje program

pozivajućeg procesa drugim programom koji mu zadamo. Ukoliko je proces-dete u pitanju pozivamo

execlp()sa prvim argumentom komandne linije.

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.

// Globalne deklaracije i inicijalizacije

Semaphore xySem(0);

Semaphore zSem(0);

// Kod tela niti A:

while (1) {

x = ...;

y = ...;

xySem.signal();

zSem.wait();

cout<<z;

}

// Kod tela niti B:

while (1) {

xySem.wait();

z = x+y;

zSem.signal();

}

PC
Highlight
Page 9: OS1 Reseni Rokovi

9/48

5.(3) Zašto preklopi (overlays) ne mogu da se koriste ako program ima više niti koje obezbeđuje operativni

sistem? Precizno objasniti.

Odgovor:

Kod preklopa prevodilac generiše kod koji proverava da li je taj kod učitan u preklop i učitava ga ako

nije, ali ne zna da li taj kod deo operativnog sistema. Za pravilno funkcionisanje OS-a sve njegove niti moraju

butu učitane za razliku od programa.

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.

Odgovor:

Dvostruko ulančana lista slobodnih fragmenata uređenih po poziciji u memoriji je efikasnija zato što

ako se dealocira, veća je verovatnoća da će fragmenti biti jedan pored drugog, dok kod uređenih po veličini

moguće je proći kroz celu listu da bi se oslobodio fragment, što je sporije.

7.(3) Kojom tehnikom se nedeljivi uređaj može učiniti virtuelno deljivim?

Odgovor: spooling_________.

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 (kursora) za čitanje/upis u fajl ima smisla čuvati u

globalnoj tabeli otvorenih fajlova i zašto?

Odgovor:

Nema smisla zato što svaki proces mora da ima svoj kursor. Ako bi kursor čuvao globalno, došlo bi do

konflikta kada bi više procesa pristupilo istom fajlu.

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

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 O(n) O(n)

Brisanje pronađenog ulaza (ne

računajući pronalaženje po imenu) O(n) O(n/2)

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?

Odgovor:

IndexSize = 512kB = 219

B

BlockNo = 64bit = 8 B

BlockSize = BlockNo * IndexSize = 512kB * 8B = 4 MB = 222

MaxFileSize = (IndexSize + IndexSize * IndexSize) * BlockSize =

= (219

+ 219

* 219

) * 222

= (219

+ 238

) * 222

= 241

+ 260

≈ 260

Page 10: OS1 Reseni Rokovi

10/48

Ispitni rok: oktobar 2011 (23.9.2011)

1.(3) Ukratko objasniti osnovni motiv uvođenja raspodele vremena (time sharing) u multiprogramiranje.

Odgovor:

Svaki korisnik ima utisak da računar opslužuje samo njega sa dovoljno dobrim vremenom odziva, a

računar opslužuje više korisnika.

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.

Main: LOAD R1, #BlockAddr //Učitavamo adresu bloka

LOAD R2, #Count //Učitavamo broj blokova

LOAD R3, #0 //End Fleg

STORE [CTRL], #00..1b //Start bit

Wait: CMP R3, #1 //Proveravamo da li je kraj transfera

JNZ Wait //

IntR: LOAD R0,[R1] //Učitavamo adresu na R0 registar

STORE [DATA],R0 //i onda je sačuvamo u DATA

INC R1 //Prelazmo na sledeći blok

DEC R2 //Smanjimo broj blokova za 1

JNZ Ret //Proveravamo da li je na nuli

LOAD R3,#1 //i ako jeste postavimo end fleg aktivan

STORE [CTRL],#0; //Stop bit

Ret: iret //Povratak iz interrupt-a

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).

Odgovor:

1) Isteklo dozvoljeno CPU vreme – Asinhrono

2) Ne blokirajući sistemski poziv – Asinhrono

3) Preuzimanje jer je neki drugi proces postao spreman – Asinhrono

4) Ekplicitno Preuzimanje – Sinhrono

Page 11: OS1 Reseni Rokovi

11/48

4.(3) Korišćenjem standardnih brojačkih semafora u školskom jezgru, na jeziku C++ u potpunosti realizovati

klasu za ograničeni bafer (bounded buffer).

class Data;

const int N = ...; //kapacitet bafera

class BoundedBuffer {

public:

BoundedBuffer(); //konstruktor

void put (Data*);

Data* get (int consumerID); //consumerID treba da bude 1 ili 2 (ID potrošača)

private:

Data* buf[N]; //red elemenata ograničenog bafera

int head, tail; //početak (glava) i kraj (rep) reda semafori sa sinhronizaciju

Semaphore mutex, spaceAvailable, itemAvailable;

};

BoundedBuffer::BoundedBuffer () :

head(0), tail(0), mutex(1), spaceAvailable(N), itemAvailable(0) {}

void BoundedBuffer::append (Data* d) { //isto se piše kao i BoundedBuffer::put iz knjige

spaceAvailable.wait(); //ako je bafer pun, čekamo jedno slobodno mesto

mutex.wait(); //ulazimo u kritičnu sekciju (da li je potreban mutex?)

buf[tail]=d; //stavljamo element u bafer

tail=(tail+1)%N; //ažuriramo indeks poslednjeg elementa

mutex.signal(); //izlazimo iz kritične sekcije

itemAvailable.signal(); //signaliziramo da je još jedan podatak raspoloživ

}

Data* BoundedBuffer::tail (int myID) { //varijacija na BoundedBuffer::get iz knjige (bez gate-a)

itemAvailable.wait(); //ako je bafer prazan, čekamo dok se ne upiše podatak

mutex.wait(); //ulazimo u kritičnu sekciju

Data* d = buf[head]; //čitamo podatak iz bafera

head=(head+1)%N; //ažuriramo indeks prvog elementa

mutex.signal(); //izlazimo iz kritične sekcije

spaceAvailable.signal(); //signaliziramo da ima slobodnog prostora u baferu

}

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.

Odgovor:

// File1.h | //File2.h

|

int a; | int a;

void f() { | void a();

a=b; | ….

} |

.... |

Page 12: OS1 Reseni Rokovi

12/48

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.

Rešenje:

Virtuelna adresa je širine:

VA_S = log2(VAS / AU) = log2(2MB / 16bit) = 20 bita

Od čega je za predstavljanje pomeraja (Offset) u okviru stranice odvojeno:

OFFSET_S = log2(PAGE / AU) = log2(128KB / 16bit) = 16 bita

Dakle, za predstavljanje broja stranice je preostalo 4 bita, pa je maksimalan broj stranice Fh:

VA = Page(4):Offset(16)

Najniže 4 cifre heksadekadne virtuelne adrese prestavljaju pomeraj, pa za adresu formata XYYYYh,

cifra X predstavlja broj stranice. Nijedna stranica procesa se na početku ne nalazi u memoriji, tako da je svaki

put kada pristupamo stranici koja se ne nalazi u memoriji potrebno uraditi sledeće:

1) dovući stranicu sa HDD-a u memoriju

2) ažurirati odgovarajući broj ulaza u PMT

Ukoliko se stranica već nalazi u memoriji (zauzima neki okvir), nije potrebno ništa uraditi, jer je stranici

već moguće pristupiti preko vrednosti okvira fizičke memorije u koji je smeštena.

Početni izgled PMT-a:

Entry 0 1 2 3 4 5 6 7 8 9 A B C D E F

Flag 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Frame

Pošto se na početku nijedna stranica procesa ne nalazi u memoriji, svi indikatori prisutnosti sranice u

fizičkoj memoriji su postavljeni na 0. Za svaku gorenavedenu generisanu virtuelnu adresu je potrebno uraditi

sledeće:

1) Naći broj stranice u okviru koje se nalazi generisana adresa (najviša heksadekadna cifra adrese)

2) Ako se stranica ne nalazi u memoriji, potrebno ju je učitati u prvi slobodni okvir (na početku,

prvi slobodni okvir je onaj sa adresom 10h) i ažurirati polja “Flag” i “Frame” na odgovarajućem

ulazu

3) Ako se stranica već nalazi u memoriji, prelazimo na sledeću (ne diramo vrednosti u PMT-u)

Page 13: OS1 Reseni Rokovi

13/48

Sekvenca virtuelnih adresa:

1 30F00h ⇒ ulaz 3 je prazan ⇒ dovlačimo stranicu broj 3 i smeštamo je u okvir broj 10h

2 30F02h ⇒ stranica 3 je već učitana u memoriju, pa ne radimo ništa

3 30F04h ⇒ stranica 3 je već učitana u memoriju, pa ne radimo ništa

4 922F0h ⇒ ulaz 9 je prazan ⇒ dovlačimo stranicu broj 9 i smeštamo je u okvir broj 11h

5 922F2h ⇒ stranica 9 je već učitana u memoriju, pa ne radimo ništa

6 322F0h ⇒ stranica 3 je već učitana u memoriju, pa ne radimo ništa

7 322F2h ⇒ stranica 3 je već učitana u memoriju, pa ne radimo ništa

8 322F4h ⇒ stranica 3 je već učitana u memoriju, pa ne radimo ništa

9 522F0h ⇒ ulaz 5 je prazan ⇒ dovlačimo stranicu broj 5 i smeštamo je u okvir broj 12h

10 522F2h ⇒ stranica 5 je već učitana u memoriju, pa ne radimo ništa

11 402F0h ⇒ ulaz 4 je prazan ⇒ dovlačimo stranicu broj 4 i smeštamo je u okvir broj 13h

12 402F2h ⇒ stranica 4 je već učitana u memoriju, pa ne radimo ništa

Konačan izgled PMT-a za dati proces:

Entry 0 1 2 3 4 5 6 7 8 9 A B C D E F

Flag 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0

Frame 10h 13h 12h 11h

7.(3) Navesti tipične operacije apstrakcije blokovski orijentisanog ulazno/izlaznog uređaja sa direktnim

pristupom.

Odgovor:

READ, WRITE, SEEK

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.

Odgovor:

Proces je stvorio fajl u režimu za čitanje.

9.(3) Šta znači termin „presna particija“ (raw partition)?

Odgovor:

Particija koja ne sadrži fajl sistem. Dešava se ako fajl sistem nije uspostavljen ili ako je za posebne

namene npr. swap space, baza ...

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) n . b) 1 .

Page 14: OS1 Reseni Rokovi

14/48

Ispitni rok: januar 2012 (22.1.2012)

1.(3) Ukratko objasniti osnovni motiv uvođenja multiprogramiranja u računarske sisteme.

Odgovor:

Multiprogramiranje se uvodi kako bi se izvršilo više poslova uporedo. Dok jedan čeka na završetak I/O

operacije , CPU obslužuje neki drugi proces.

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.

LOAD R1, #BlockAddr // Učitavamo adresu bloka

LOAD R2, #Count // Učitavamo broj blokova

STORE [CTRL], #00..1b // Start bit

Wait: LOAD R0, #Status // Učitavamo vrednost statusnog registra

AND R0, R0, #100..0b // Sa AND proveravamo da li je prvi bit 1

JZ Wait // Wait ako je nije

LOAD R0,[R1] // Učitavamo adresu na registar R0

STORE [DATA],R0 // i onda je sačuvamo u DATA

INC R1 // Prelazimo na sledeći blok

DEC R2 // Smanjimo broj blokova za 1

JNZ Wait // proveravamo da li jednak nuli, ako nije vraćamo se

STORE [CTRL],#0; // End Bit

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: 8 .

Petlja se deli svaki put kada se izvrši, na i=0 se deli na dve, na i=1 na četiri i na i=2 na osam.

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.

Class MyThread: public Thread {

private:

int param;

public:

MyThread(int param);

void run();

}

MyThread:: MyThread(int param) {

this->param=param;

this->start();

}

void Mythread::run() {

if (param%2==1) {

new MyThread(param+1);

}

}

Page 15: OS1 Reseni Rokovi

15/48

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: Nakon prvog prolaza .

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, B-

Odgovoriti na sledeća pitanja koja se odnose na stanje memorije nakon ove sekvence zahteva:

Koliko je ukupno slobodnih fragmenata? Odgovor: 2 .

Kolika je veličina najmanjeg slobodnog fragmenta? Odgovor: 8kB .

Kolika je veličina najvećeg slobodnog fragmenta? Odgovor: 48kB .

A64+B16+ C128+ D32+(Prazno:16kB)

A- (Prazno:64kB) +B16+ C128+ D32+(Prazno:16kB)

E8 (Prazno:64kB) +B16+ C128+ D32+ E8+ (Prazno:8kB)

F32 F32+(Prazno:32kB) +B16+ C128+ D32+ E8+ (Prazno:8kB)

B- F32+(Prazno:48kB) + C128+ D32+ E8+ (Prazno:8kB)

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: 4MB .

b) proces koristio samo jednu stranicu? Odgovor: 1kB .

Veličina stranice je:

PAGE=4kB=212

B

Veličina pomeraja je:

OFFSET= log2(PAGE/AU) = 12b

Pa će virtuelna adresa izgledati ovako:

VA(32)=Page(20):Offset(12)

Deskriptor stranice veličine 32 bita, odnosno 4 bajta. PMT ima po jedan ulaz za svaku stranicu, što

znači 220

ulaza po 4 bajta, odnosno 4MB. Kada proces koristio samo jednu stranicu on za straničenje koristi

PMT prvog nivoa, što zanči da če zauzimati prostor 28 ulaza puta 4 bajta odnosno 1kB.

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?

Odgovor:

Nedostatak je što ne postoji queue za štampač, što zanači da dok jedan proces drži štampač ostali ne

mogu da zadaju posao u queue i da se oslobode.

Page 16: OS1 Reseni Rokovi

16/48

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.

Rešenje:

#define incr 50

void main() {

fhandle file=open("proba.txt"); //Otvaranje txt fajla

char c;

int position=size(file); //Poziciju za unos stavljamo na kraj

while((c=getchar())!='x') { //Dokle god nije uneseno x

if(position==size(file)) { //Ukoliko je unos stigao do kraja fajla

append(file,size++); //povećaj veličinu fajla za jedan

}

write(file,&c); //Unesi tekst

position++; //Inkrementiraj poziciju

}

write(file,"\0"); //Unesi znak za kraj fajla

}

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) 1 . b) 2 .

Page 17: OS1 Reseni Rokovi

17/48

Ispitni rok: februar 2012 (12.2.2012)

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);

}

Odgovor:

LOG: LOAD R1, #N[SP] // R1=n

CMP R1, #2 // if (n<2)

JMPL ELSE // else

THEN: LOAD R0, #0 // R0=0

POP PC // return 0

ELSE: DIV R0, R1, #2 // R0=R1/2 => (n/2)

PUSH R0 //

CALL LOG // Ucitaj u LOG => log(n/2)

POP R1 //

LOAD R1, #N[SP] // R1=log(n/2)

ADD R0, R1, #1 // R0=1+log(n/2)

POP PC // 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?

Odgovor:

1) Ispitivanjem indikatora u statusnom registru DMA (busy waiting).

2) Signal završetka prenosa generiše procesoru zahtev za prekid.

3.(3) Navesti najmanje tri slučaja (uzroka) u kojima tekući proces gubi procesor.

Odgovor:

1) Isteklo dozvoljeno CPU vreme

2) Ne blokirajući sistemski poziv

3) Preuzimanje jer je neki drugi proces postao spreman

4) Ekplicitno Preuzimanje (yield, dispatch)

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.

Rešenje:

Semaphore::sem (0);

int counter = 0;

void P() { void X() {

.... ....

sem.wait(); lock();

.... counter++;

} if (counter==3) sem.signal();//kada su sva tri

unlock(); //uslova ispunjena

} //signal

Page 18: OS1 Reseni Rokovi

18/48

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);

}

Koliko nerazrešenih adresnih polja instrukcija prevodilac ostavlja u ovom fajlu? 1 .

Koje simbole izvozi ovak fajl? log, base .

Koje simbole uvozi ovaj fajl? ln .

6.(3) Navesti osnovne sličnosti i osnovne razlike između tehnike dinamičkog učitavanja memorije i preklopa

(overlays).

Odgovor:

Dinamičko učitavanje ima tabelu adresa potprograma i učita deo tek u vreme izvršavanja, po potrebi.

Složeni program često nikada ne izvršava neke svoje delove ili ne koristi neke svoje podatke.

Kod prekolpa, delovi koji se ne koriste u isto vreme se zamenjuju u memoriji, zauzimajući isto mesto .

Kada zatreba neki deo koji nije u memoriji, izbaciti deo sa kojim se preklapa i na njegovo mesto učitati

potrebni.

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 - 54 . Drugog - 0 .

Veličina polja za straničenje prvog nivoa je veličine 8 bita, što znači da imamo 255 ulaza u PMT prvog

nivoa. Pošto broj ulaza se određuje na osnovu broja stranice, imamo prostor za samo prve dve cifre (5423Dh).

Pošto pošto prvi nivo upućuje na drugi a on je prazan, možemo staviti na prvi slobodan ulaz (0) drugog nivoa.

8.(3) Ukratko objasniti princip dvostrukog baferisanja kod ulazno-izlaznih operacija.

Odgovor:

Proizvođač upisuje u prvi bafer dok potrošač čita iz drugog. Kada oba završe baferi zamenjuju uloge.

9.(3) Da li je veličina fajla ograničena ako je način alokacije blokova za fajlove na disku:

1) ulančani NE .

2) indeksirani DA .

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.

Odgovor:

Nije. Vreme pristupa raste za blokove bliže kraju veoma velikog fajla, jer se za pristup do njih mora

prolaziti kroz višestepene indekse. Pristup do delova bližim početku fajla je brži jer prolazi sam kroz

jednostepeni indeks.

Page 19: OS1 Reseni Rokovi

19/48

Ispitni rok: jun 2012 (15.6.2012)

1.(3) Šta je to sistem sa raspodelom vremena (engl. time-sharing)?

Odgovor:

To je sistem u kome OS dodeljuje vreme svakom poslu i relativno često preuzima procesor. Posao može

da ostane u CPU na maksimalno dodeljeno vreme, a može i manje ako dođe do promene konteksta.

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;

}

Rešenje:

F: LOAD R1, #N[SP] //R1=n

CMP R1, #0 //(n<=0)

JMPL ELSE //skok na else

THEN: LOAD R0, #0 //R0=0

POP PC //return 0

ELSE: SUB R0, R1, #1 //R0=n-1

PUSH R0 //

CALL F //return f

POP R1 //

LOAD R1, #N[SP] //R1= f(n-1)

ADD R0, R1, #1 //f+1

POP PC //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: 7 .

Petlja će kreirati samo proces-decu pošto ako fork vrati ID roditelja (odnosno veći od nule) proces će

biti ukinut.

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.

Semaphore::semA(0);

Semaphore::semB(0);

//kod tela A //kod tela B

while(1){ while(1){

x=...; semB.wait();

semB.signal(); x=...;

semA.wait(); semA.signal();

} }

Page 20: OS1 Reseni Rokovi

20/48

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.

Odgovor:

Kod preklopa izvršavanje je zbog načina učitavanja, a dinamičko učitavanje će koristiti više memorije.

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) n . b) log2n .

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: 13% .

Račun:

Efektivnost pristupa se računa:

Učestanost pogotka*(TLB+Operativna mem) + Ostatak * (TLB+((nivo+1)*Operativna mem)) 90% * (1 + 10) + 10%*(1 + 3*10) = 0,9*11 + 0,1*31 = 13%

8.(3) Navesti osnovne operacije klase blokovski orijentisanih uređaja sa direktnim pristupom.

Odgovor:

Read, Write, Seek

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.

Rešenje:

write(FHANDLE,int position,char*,int size){

if(position+size>size(f))

append(f,position+size-size(f)+1);

seek(f,position);

write(f,buffer,size);

}

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) n .b) 2 .

Page 21: OS1 Reseni Rokovi

21/48

Ispitni rok: jul 2012 (6.7.2012)

1.(3) Šta je to multiprocesorski sistem, a šta distribuirani sistem? Navesti po jedan primer svakog.

Odgovor:

Multiprocesorski sistem ima više procesora sa delejnom memorijom, tj. veću propusnu moć (veća

količina urađenog posla u jednici vremena). Primer multiprocesorskog sistema može biti randa stanica ili server

za neku obradu podataka. Distriburani sistem ima skup procesora bez zajedničke memorije povezanih

komunikacionom mrežom (npr. LAN, WAN, ...). Primer distribuiranog sistema može biti superkompjuteri ili

"cloud" sistemi.

2.(3) Korišćenjem funkcija setjmp i longjmp iz standardne C biblioteke realizovati operaciju wait na

brojačkom semaforu u školskom jezgru.

Rešenje:

void Semaphore::wait () {

lock();

if(event==0){

event=-1

if(setjmp(Thread::runningThread->context)==0) {

blocked.put(thread::runningThread);

Thread::runningThread=Scheduler::get();

longjmp(Thread::runningThread->context,1);

}

else return;

}

unlock();

}

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.

Odgovor:

1) Isteklo dozvoljeno CPU vreme – Asinhrono

2) Ne blokirajući sistemski poziv – Asinhrono

3) Preuzimanje jer je neki drugi proces postao spreman – Asinhrono

4) Ekplicitno Preuzimanje (yield, dispatch) – Sinhrono

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();

}

Odgovor:

Ako je buffer pun a producer pokuša da upiše podatak, zablokiraće se i nikada se neće odblokirati. Da bi

implementacija radila pravilno treba mutex.wait() i spaceAvailable.wait(); kao i

itemAvailable.signal(); i mutex.signal(); da zamene mesta.

Page 22: OS1 Reseni Rokovi

22/48

5.(3) Po čemu se razlikuje posao linkera kada je njegov proizvod izvršivi program od onoga kada je to

biblioteka? Odgovor:

Drugačiji je proizvod, kod je binarni exe, nema zaglavlje, nema nerazrešene adresne delove instrukcija,

liba ima zaglavlje, može da ima nerazrešene delove instrukcija i može da toleriše nerazrešene simbola.

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.

Odgovor:

Veličina virtuelnog adresnog prostora je:

VAS = 4 GB = 232

B

Veličina fizičkog adresnog prostora je:

PAS = 1 GB = 230

B

Veličina adresibilne jedinice je:

AU = 1 B = 20 B

Veličina stranice (okvira) je:

PAGE = 16 KB = 214

B

Širina virtuelne adrese je:

VA_S = log2(VAS / AU) = 32 bita

Širina fizičke adrese je:

PA_S = log2(PAS / AU) = 30 bita

Širina pomeraja (Offset) unutar stranice/okvira:

OFFSET_S = log2(PAGE / AU) = 14 bita

Virtuelna adresa se sastoji od određenog broja bita koji određuju broj stranice u virtuelnom adresnom

prostoru i određenog broja bita koji određuju pomeraj unutar te stranice. Već smo utvrdili da je za

predstavljanje pomeraja potrebno odvojiti 14 bita, pa je za predstavljanje broja stranice potrebno:

VA_S - OFFSET_S = 32 bita - 14 bita = 18 bita

Jedan deo od tih 18 bita se koristi za indeksiranje PMT-a prvog nivoa, a preostali za indeksiranje PMT-a

drugog nivoa. Tabela prvog nivoa ima 2K = 211

ulaza, pa je za indeksiranje PMT-a prvog nivoa potrebno:

VA_L1_S = log2(2K) = 11 bita

Za indeksiranje PMT-a drugog nivoa je onda potrebno:

VA_L1_S = VA_S - OFFSET_S - VA_L1_S = 7 bita

Dakle, logička struktura virtuelne adrese je:

VA(32) = Page_L1(11):Page_L2(7):Offset(14)

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.

Odgovor:

Pri pozivu fork(), proces-dete deli sve stranice sa roditeljem, nema kopiranja adresnog prostora i sve

stranice dozvoljene za upis se inicijalno označe kao “copy on write” i sve dok proces pristupa stranici samo za

čitanje, ona može da ostane deljena. Kada proces prvi put upisuje u neku stranicu označenu kao “copy on

write”, stranica se kopira i prestaje da bude deljena, posebno se mapira i označava kao “privatna”. Generiše

page fault unapred, pre nego što instrukcija promeni neku vrednost u memoriji. Upotrebljavaju se posebni

registri za smeštanje starih vrednosti lokacija koje se menjaju. Ukoliko nastane page fault, CPU vraća stare

vrednosti u promenjene lokacije.

Page 23: OS1 Reseni Rokovi

23/48

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.

Rešenje:

Main: LOAD R1, #BlockAddr //Učitavamo adresu bloka

LOAD R2, #Count //Učitavamo broj blokova

LOAD R3, #0 //End Fleg

STORE [CTRL], #00..1b //Start bit

Wait: CMP R3, #1 //Proveravamo da li je kraj transfera

JNZ Wait //

IntR: LOAD R0,[R1] //Učitavamo adresu na R0 registar

STORE [DATA],R0 //i onda je sačuvamo u DATA

INC R1 //Prelazmo na sledeći blok

DEC R2 //Smanjimo broj blokova za 1

JNZ Ret //Proveravamo da li je na nuli

LOAD R3,#1 //i ako jeste postavimo end fleg aktivan

STORE [CTRL],#0; //Stop bit

Ret: iret //Povratak iz interrupt-a

9.(3) Šta je po vašem mišljenju osnovna svrha (motiv) postojanja koncepta tekućeg direktorijuma procesa?

Odgovor:

Motiv je staza do fajla. Svaki proces ima svoj tekući dirketorijum koji može promeniti sistemskim

pozivom. Otvaranje fajla samo po imenu traži fajl u tekućem direktorijumu. Fajl se može zadati i zadavanjem

pune staze od korena stabla direktorijuma ili relativnom stazom u odnosu na tekući direktorijum.

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)?

Zbog bržeg pristupa, pri alociranju susednih blokova za isti fajl vreme pristupa je kraće.

Page 24: OS1 Reseni Rokovi

24/48

Ispitni rok: septembar 2012 (31.8.2012)

1.(3) Kod kakvih sistema se najpre pojavljuje time sharing i sa kakvim motivom?

Odgovor:

Time sharing se pojavljuje kod interaktivnih višekorisničkih sistema. Motiv je kad istekne deljeno

vreme nekog procesa oduzme mu se CPU i dodeli nekom drugom procesu. Tako sprečavamo izgladnjivanje

procesa.

2.(3) Korišćenjem funkcija setjmp i longjmp iz standardne C biblioteke realizovati operaciju wait na binarnom

semaforu u školskom jezgru.

Rešenje:

void Semaphore::wait(){

lock(lck);

if(--val<0){

if(setjmp(Thread::runningThread->context)==0){

blocked.put(thread::runningThread);

Thread::runningThread=Scheduler::get();

longjmp(Thread::runningThread->context,1);

}

else return;

}

unlock(lck);

}

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.

Rešenje:

void main( int argc, char* argv[] ) {

int pid = fork();

if (pid==0) execlp ( argv[1] );

else {wait(null); exit(0);}

}

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.

Rešenje:

Semaphore::sem (0);

int counter = 0;

void P() { void X() {

.... ....

sem.wait(); lock();

.... counter++;

} if (counter==3) sem.signal();

unlock();

}

5.(3) Koja dva podatka čine memorijski kontekst procesa kod kontinualne alokacije memorije za proces sa

dinamičkim preslikavanjem adresa?

Odgovor:

Realocation registar i Limit registar.

Page 25: OS1 Reseni Rokovi

25/48

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?

Odgovor:

VAS= 8GB = 233

B

PAS = 2GB = 231

B

AU = 16 bit = 2B = 21 B

PAGE= 32 kB = 215

B

Širina virtuelne adrese je:

VA_S= log2(VAS/AU)=32 bit

Širina fizicke adrese je:

PA_S = log2(PAS/AU) = 30 bit

Širina stranice je:

OFFSET= log2(PAGE/AU) = 14 bit

Za predstavljanje broja stranice potrebno:

VA_S - OFFSET = 18 bit

Za indeksiranje PMT-a drugog nivoa je onda potrebno:

VA_L2_S = log2(1k) = 10 bit

Za indeksiranje PMT-a prvog nivoa je onda potrebno:

VA_L1_S = 18 bit – 10 bit = 8 bit => iz toga dobijamo da je broj ulaza 28 odnosno 256 ulaza.

Jedan ulaz u PMT prvog nivoa sadrži fizičku adresu početka PMT-a drugog nivoa,pa je on veličine:

PMT1_ENTRY = [PA_S / AU] * AU = [30bit/16bit] * 2B = 3.75B

Ukupna veličina PMT prvog nivoa je:

PMT1_S = 3.75 * 256 ulaza = 960B

Veličina ulaza u PMT drugog nivoa je:

PMT2_ENTRY_S = PA_S - offset = 16 bit = 2B

Ukupna veličina PMT drugog nivoa je:

PMT2_S = 1k * 2B = 2kB

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.

Page 26: OS1 Reseni Rokovi

26/48

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).

Rešenje:

LOAD R1, #BlockAddr // Učitavamo adresu bloka

LOAD R2, #Count // Učitavamo broj blokova

STORE [CTRL], #00..1b // Start bit

Wait: LOAD R0, #Status // Učitavamo vrednost statusnog registra

AND R0, R0, #100..0b // Sa AND proveravamo da li je prvi bit 1

JZ Wait // Wait ako je nije

LOAD R0,[R1] // Učitavamo adresu na registar R0

STORE [DATA],R0 // i onda je sačuvamo u DATA

INC R1 // Prelazimo na sledeći blok

DEC R2 // Smanjimo broj blokova za 1

JNZ Wait // proveravamo da li jednak nuli, ako nije vraćamo se

STORE [CTRL],#0; // End Bit

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?

Odgovor:

io status read file(FileHandle fh, void*buffer, unsigned long len);

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?

Odgovor:

Veličinu celog vektora dobijamo kada podelimo kapacitet diska sa veličinom bloka:

80MB/1kB = 80*(220

b/210

b) = 80kB

Zatim veličinu svih blokova dobijamo kada dalje podelimo veličinu celog vektora sa bit-vektorom:

80kB/8b = 10kB

Ovu vrednost podelimo sa veličinom bloka i dobijamo konačan broj blokova:

10kB/1kB = 10 blokova

Page 27: OS1 Reseni Rokovi

27/48

Ispitni rok: oktobar 2012 (21.9.2012)

1.(3) Šta je multiprocesorski, a šta distribuirani sistem?

Odgovor:

Multiprocesorski sistem ima više procesora sa delejnom memorijom, tj. veću propusnu moć (veća količina

urađenog posla u jednici vremena). Distriburani sistem ima skup procesora bez zajedničke memorije povezanih

komunikacionom mrežom (npr. LAN, WAN, ...)

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 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.

Rešenje:

Thread::dispatch(){

lock();

jmp_buf old=Thread::runningThread->context;

Scheduler::put(Thread::runningThread);

Thread::runningThread=Scheduler::get();

yeald(old,Thread::runningThread->context);

unlock(lck);

}

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.

Odgovor:

Može se znati po tome što fork() vraća ID deteta roditelju, a NULL detetu. int ID=fork();

if (ID>0){//Roditelj}

else if (ID==0){//Dete}

else {//Greška}

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.

Rešenje:

process P1

begin

loop

flag1:=true; turn:=2; // Announce intent to entry

while flag2 and turn=2 do null end; // Busy wait

<critical section> // Critical section

flag1 := false; // Exit protocol

<non-critical section>

end

end P1;

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: B, E, F . void b(int);

void b(int) {} Uveženi: A, C, D . void c(int);

extern int d; static int e;

int f;

Page 28: OS1 Reseni Rokovi

28/48

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);

Rešenje:

void* getFirstFitFragment (size_t sz){

for (FreeFragment* cur = head; cur!=0; cur=cur->next) {

if (cur->size<sz) continue; // set pointer to the first byte of the remaining free fragment

FreeFragment* newfrgm = (FreeFragment*)((char*)cur+sz);

if (cur->prev) cur->prev->next = newfrgm;

else head = cur->next;

if (cur->next) cur->next->prev = newfrgm;

newfrgm->prev = cur->prev;

newfrgm->next = cur->next;

newfrgm->size = cur->size-sz;

return cur;

}

return 0;

}

7.(3) Objasniti šta je osnovni motiv i pogodnost tehnike straničenja u više nivoa u odnosu na straničenje u

jednom nivou?

Odgovor:

Osnovni motiv je veći kapacitet virtuelne memorije.

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: spooling .

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: Lokalno za taj proces .

Page 29: OS1 Reseni Rokovi

29/48

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/ 683 % (odgovor izraziti kao razlomak sa brojiocem 100)

Račun:

Ukupan broj klastera:

32GB/2KB = 25B*2

30B/2

1B*2

10B = 2

24 = 16M

Jedan ulaz u indeksnom klasteru mora da adresira 16M klastera, pa zauzima 24 bita, tj. 3B. Zato jedan

indeksni klaster može da sadrži 2kB/3B = 2048B/3B = 682 ulaza, tj. da adresira 682 klastera sa podacima.

Drugim rečima, na jedan indeksni klaster dolazi 682 klastera sa podacima, odnosno indeksni klasteri zauzimaju

1/683 deo prostora za fajlove, ili 100/683 procenata (~0.15%). Odgovor: 100/683 procenata.

Page 30: OS1 Reseni Rokovi

30/48

Ispitni rok: januar 2013 (20.1.2013)

1.(3) Šta je to multiprocesorski sistem, a šta distribuirani sistem? Navesti po jedan primer svakog.

Odgovor:

Multiprocesorski sistem ima više procesora sa delejnom memorijom, tj. veću propusnu moć (veća

količina urađenog posla u jednici vremena). Primer multiprocesorskog sistema može biti randa stanica ili server

za neku obradu podataka. Distriburani sistem ima skup procesora bez zajedničke memorije povezanih

komunikacionom mrežom (npr. LAN, WAN, ...). Primer distribuiranog sistema može biti superkompjuteri ili

"cloud" sistemi.

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.

Rešenje:

void Semaphore::wait () {

lock();

if(event==0){

event=-1

jmp_buf old = Thread::running->context;

blocked->put(Thread::runningThread);

Thread::running = Scheduler::get();

jmp_buf new = Thread::running->context;

yield(old,new);

}

unlock();

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.

Odgovor:

1) Izvršio blokirajući sistemski poziv - Asinhrono

2) Zatražio I/O operaciju - Asinhrono

3) Suspendovao se na zadato vreme - Asinhrono

4.(3) Napisati kod koji realizuje Petersonov algoritam međusobnog isključenja dva uporedna procesa pomoću

uposlenog čekanja.

Rešenje: process P1

begin

loop

flag1:=true; turn:=2; // Announce intent to entry

while flag2 and turn=2 do null end; // Busy wait

<critical section> // Critical section

flag1 := false; // Exit protocol

<non-critical section>

end

end P1;

process P2

begin

loop

flag2:=true; turn:=1; // Announce intent to entry

while flag1 and turn=1 do null end; // Busy wait

<critical section> // Critical section

flag1 := false; // Exit protocol

<non-critical section>

end

end P1;

Page 31: OS1 Reseni Rokovi

31/48

5.(3) U čemu je razlika između tehnika dinamičkog učitavanja (dynamic loading) i preklopa

(overlay)?

Odgovor:

Dinamičko učitavanje ima tabelu adresa potprograma i učita deo tek u vreme izvršavanja, po potrebi.

Složeni program često nikada ne izvršava neke svoje delove ili ne koristi neke svoje podatke.

Kod prekolpa, delovi koji se ne koriste u isto vreme se zamenjuju u memoriji, zauzimajući isto mesto .

Kada zatreba neki deo koji nije u memoriji, izbaciti deo sa kojim se preklapa i na njegovo mesto učitati

potrebni.

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.

Odgovor:

Veličina virtuelnog adresnog prostora je:

VAS = 8 GB = 2^33 B

Veličina fizičkog adresnog prostora je:

PAS = 2 GB = 2^31 B

Veličina adresibilne jedinice je:

AU =16bit =2 B = 2^1 B

Veličina stranice (okvira) je:

PAGE = 32 KB = 2^15 B

Širina virtuelne adrese je:

VA_S = log 2 (VAS / AU) = 32 bita

Širina fizičke adrese je:

PA_S = log 2 (PAS / AU) = 30 bita

Širina pomeraja (Offset) unutar stranice/okvira:

OFFSET_S = log 2 (PAGE / AU) = 14 bita

Virtuelna adresa se sastoji od određenog broja bita koji određuju broj stranice u virtuelnom

adresnom prostoru i određenog broja bita koji određuju pomeraj unutar te stranice. Već smo

utvrdili da je za predstavljanje pomeraja potrebno odvojiti 14 bita, pa je za predstavljanje broja

stranice potrebno:

VA_S - OFFSET_S = 32 bita - 14 bita = 18 bita

Jedan deo od tih 18 bita se koristi za indeksiranje PMT-a prvog nivoa, a preostali za indeksiranje

PMT-a drugog nivoa. Tabela prvog nivoa ima 2K = 2^11 ulaza, pa je za indeksiranje PMT-a prvog

nivoa potrebno:

VA_L1_S = log 2 (2K) = 11 bita

Za indeksiranje PMT-a drugog nivoa je onda potrebno:

VA_L1_S = VA_S - OFFSET_S - VA_L1_S = 7 bita

Dakle, logička struktura virtuelne adrese je:

VA(32) = Page_L1(11):Page_L2(7):Offset(14)

Page 32: OS1 Reseni Rokovi

32/48

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.

Odgovor:

Pri pozivu fork(), proces-dete deli sve stranice sa roditeljem, nema kopiranja adresnog prostora i sve

stranice dozvoljene za upis se inicijalno označe kao “copy on write” i sve dok proces pristupa stranici samo za

čitanje, ona može da ostane deljena. Kada proces prvi put upisuje u neku stranicu označenu kao “copy on

write”, stranica se kopira i prestaje da bude deljena, posebno se mapira i označava kao “privatna”. Generiše

page fault unapred, pre nego što instrukcija promeni neku vrednost u memoriji. Upotrebljavaju se posebni

registri za smeštanje starih vrednosti lokacija koje se menjaju. Ukoliko nastane page fault, CPU vraća stare

vrednosti u promenjene lokacije.

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).

Rešenje:

LOAD R1, #BlockAddr // Učitavamo adresu bloka

LOAD R2, #Count // Učitavamo broj blokova

STORE [CTRL], #00..1b // Start bit

Wait: LOAD R0, #Status // Učitavamo vrednost statusnog registra

AND R0, R0, #100..0b // Sa AND proveravamo da li je prvi bit 1

JZ Wait // Wait ako je nije

LOAD R0,[R1] // Učitavamo adresu na registar R0

STORE [DATA],R0 // i onda je sačuvamo u DATA

INC R1 // Prelazimo na sledeći blok

DEC R2 // Smanjimo broj blokova za 1

JNZ Wait // proveravamo da li jednak nuli, ako nije vraćamo se

STORE [CTRL],#0; // End Bit

9.(3) Šta je osnovna svrha (motiv) postojanja operacije otvaranja fajla?

Odgovor:

Obezbedjuje pristup fajlu bez pretrage direktorijuma za ulazom za fajl sa datim imenom i dobijanje

lokacije i ostalih atributa fajla.

10.(3) Navesti i objasniti neku tehniku organizacije strukture podataka za rukovanje slobodnim prostorom fajl

sistema na disku, osim bit-vektora.

Odgovor:

Grupisanje, prvi slobodni blok sadrži spisak narednih n slobodnih blokova, n-ti iz tog spiska sadrži

spisak sledećih n slobodnih blokova itd.

Page 33: OS1 Reseni Rokovi

33/48

Ispitni rok: februar 2013 (10.2.2013)

1.(3) Neki interaktivni višeprocesni i višekorisnički sistem ne podržava raspodelu vremena (time sharing). Šta

je njegov osnovni problem?

Odgovor:

Osnovni problem je neujednačenost (moguća velika razlika) u vremenu odziva na korisničku akciju.

Ukoliko je više procesa spremno (aktivirano na korisničku akciju) i treba da obradi korisničku akciju, oni

procesi koji ranije dobiju procesor imaće kraće vreme odziva, dok oni koji kasnije dobiju imaju duže vreme

odziva. Još gore, vreme odziva istog procesa na sukcesivne korisničke akcije potpuno je nedeterminisano i

zavisi samo od toga kako se u svakom slučaju rasporede procesi, pa može da varira od veoma kratkog do

veoma dugačkog, u slučaju većeg opterećenja sistema. Kod sistema sa raspodelom vremena nema takvih

varijacija i vreme odziva se približno ravnomerno produžava pod većim opterećenjem (više procesa), ali ne

varira toliko od slučaja do slučaja.

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<N; i++) pid[i] = fork();

}

Odgovor: 4 .

Prilikom prvog fork-a imamo proces-roditelj i proces-dete koji dele isti ID (pid[0]) jer fork() vraća

nulu kao vrednost proces-deta. Sledećim pozivom fork-a i proces-roditelj i proces-dete se dele i onda ukupno

imamo 4 procesa.

3.(3) Šta je problem sledeće implementacije kritične sekcije uposlenim čekanjem? process P1

loop

while flag2 = true do null end; (* Busy wait *)

flag1 := true;

<critical section> (* Critical section *)

flag1 := false; (* Exit protocol *)

<non-critical section>

end

end P1;

process P2

loop

while flag1 = true do null end; (* Busy wait *)

flag2 := true;

<critical section> (* Critical section *)

flag2 := false; (* Exit protocol *)

<non-critical section>

end

end P2;

Odgovor:

Ne obezbeđuje međusobno isključivanje zbog utrkivanja (race condition).

Page 34: OS1 Reseni Rokovi

34/48

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.

var

i : 0..1 := 0;

a : array [0..1] of integer;

mutex : semaphore := 1;

readyToWriteX : semaphore := 1;

readyToWriteY : semaphore := 1;

readyToRead : semaphore := 0;

process X begin process Y – similar process Z begin

loop loop

readyToWriteX.wait; readyToRead.wait;

mutex.wait; readyToRead.wait;

a[i]:=...; writeln(a[0]+a[1]);

i:=(i+1) mod 2; readyToWriteX.signal;

mutex.signal; readyToWriteY.signal;

readyToRead.signal; end loop

end loop end;

end;

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?

Odgovor:

Ukoliko linker već ima napravljenu tabelu simbola on će prijaviti grešku u prvom prolazu.

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.

Odgovor:

Ima smilsla, prilikom preslikavanja adrese, hardver (memory management unit) dovlači deskriptor

stranice i najpre proverava pravo pristupa do te stranice. Ako pristup nije dozvoljen, generiše se interni prekid

(trap).

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);

Rešenje:

int sync_write (char* buffer) { wait (async_write(buffer) ); }

Page 35: OS1 Reseni Rokovi

35/48

8.(3) Ukratko objasniti šta je spooling.

Odgovor:

Kad više procesa zadaje operacije nedeljivom uređaju uporedo npr. više procesa šalje blokove podataka

na štampač, operacije se prepliću. Pomoću spoolinga operacije zadate uređaju od strane procesa smeštaju se u

poseban fajl, kada završi, proces zatvara fajl i “predaje ga” OS-u. Poseban proces ili nit OS-a "spooler", uzima

jedan po jedan fajl iz reda i prenosi njegov sadržaj na uređaj.

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 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 Procesi koji su uspeli da otvore fajl

1 A-Rd, B-Wr, C-Rd, D-Rd, E-Wr A,C,D

2 A-Wr, B-Rd, C-Wr, D-Rd, E-Rd A

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?

Odgovor: 32.125 GB .

Račun:

Maksimalan broj blokova koje fajl može da zauzima je:

256 + 512K/8 = 28

+ 219

/23 = 2

8 + 2

16 = 2

8(2

8+1).

Maksimalna veličina fajla je:

28(2

8+1)2

9KB = 2

7(2

8+1)MB = 32GB + 128MB = 32.125GB

Page 36: OS1 Reseni Rokovi

36/48

Ispitni rok: Jun 2013 (14.6.2013)

1.(3) Šta su multiprocesorski, a šta distribuirani sistemi?

Odgovor:

Multiprocesorski sistem ima više procesora sa delejnom memorijom, tj. veću propusnu moć (veća

količina urađenog posla u jednici vremena).

Distriburani sistem ima skup procesora bez zajedničke memorije povezanih komunikacionom mrežom

(npr. LAN, WAN, ...)

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 (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<N; i++) pid[i] = fork();

}

Odgovor: 4 .

Prilikom prvog fork-a imamo proces-roditelj i proces-dete koji dele isti ID (pid[0]) jer fork() vraća

nulu kao vrednost proces-deta. Sledećim pozivom fork-a i proces-roditelj i proces-dete se dele i onda ukupno

imamo 4 procesa.

3.(3) Dokazati da Petersonov algoritam za međusobno isključenje kritičnih sekcija dva uporedna procesa

uposlenim čekanjem zaista obezbeđuje međusobno isključenje, odnosno ne poseduje problem utrkivanja (race

condition). Odgovor:

loop sa utrkivanjem: while flag2 = true do null end; // Busy wait

flag1 := true;

<critical section>

flag1 := false; // Exit protocol

<non-critical section>

loop bez utrkivanja: flag1:=true; turn:=2; // Announce intent to entry

while flag2 and turn=2 do null end; // Busy wait

<critical section>

flag1 := false; // Exit protocol

<non-critical section>

Uvođenjem promenjljive turn pored promenljive flag u while petlju eliminisemo problem utrkivanja.

Pored toga sto nit mora da bude spremna ona takođe mora da bude sledeca na redu, i time ne trosi bespotrebno

procesor.

4.(3) Korišćenjem klasičnih brojačkih semafora, napisati kod za kritičnu sekciju u koju može uporedo ući

najviše N procesa.

Rešenje:

var mutex : Semaphore = N; // Initially equal to N

process P;

loop

wait(mutex);

<critical section>

signal(mutex);

<non-critical section>

end

end P;

Page 37: OS1 Reseni Rokovi

37/48

5.(3) Koju uslugu operativni sistem treba da obezbedi procesima da bi oni koristili preklope (overlays)?

Odgovor:

OS ne obezbđuje nista što je potrebno za rad, sve radi prevodilac i generisani kod. OS samo obezbeđuje

bibliotečne rutine za dinamičko učitavanje.

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;

};

Rešenje:

void* getBestFit (size_t sz) {

FreeSegment* bestFit = 0;

size_t smallestSegment = MAXSIZE;

for (FreeSegment* cur = freeSegHead; cur!=0; cur=cur->next) {

if (cur->size<sz) continue;

if (cur->size<smallestSegment) {

smallestSegment = cur->size;

bestFit = cur;

}

}

if (bestFit==0) return 0;

FreeSegment* newsgm =(FreeSegment*)((char*)bestFit+sz);

if (bestFit->prev) bestFit->prev->next = newsgm;

if (bestFit->next) bestFit->next->prev = newsgm;

FreeSegment* p = bestFit->prev;

FreeSegment* n = bestFit->next;

size_t s = bestFit->size-sz;

newsgm->prev = p;

newsgm->next = n;

newsgm->size = s;

return bestFit;

}

Page 38: OS1 Reseni Rokovi

38/48

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?

Rešenje:

Veličina stranice je:

PAGE = 4kB = 212

B

Veličina adresibilne jedinice je:

AU = 1B = 20B

Širina stranice je:

OFFSET_S = log2(PAGE/AU) = 12B

Fizička adresa je:

PA_S = 32B

Virtuelna adresa je:

VA_S = 32B

Virtuelna adresa izgleda ovako:

VA(32) = PAGE_L1 + PAGE_L2 + OFFSET(12)

Vidimo da oba polja dele 20 bita u virtuelnoj adresi:

PAGE_L1 + PAGE_L2 = VA(32) - OFFSET(12) = 20B

Pošto je veličina polja ista, svako polje ima po 10 bita:

PAGE_L1 = PAGE_L2 => PAGE_L1(10) / PAGE_L2(10)

Konačan izgled virtuelne adrese je:

VA(32) = PAGE_L1(10) : PAGE_L2(10) : OFFSET(12)

Broj ulaza dobijamo iz veličine polja tj. za 10 bita je 210

ulaza (1024).

Veličina jednog ulaza je:

PMT1_ENTRY = log2(PA_S/AU) = 4B

Veličinu PMT prvog nivoa dobijamo kada pomnožimo broj ulaza sa veličinom jednog ulaza:

PMT1_S = 210

* PMT1_ENTRY = 1024 * 4B = 4kB

8.(3) Ukratko objasniti tehniku dvostrukog baferisanja (double buffering) kod ulaza/izlaza.

Odgovor:

Proizvodjac upisuje u bafer A, dok potrosac cita iz bafera B. Kada su oba zavrsila baferi zamenjuju

uloge.

Page 39: OS1 Reseni Rokovi

39/48

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); ______x_______

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.

Račun:

256 GB / 512B = 238

B / 29 B = 2

29 B=512MB

Odgovor: 512MB .

Page 40: OS1 Reseni Rokovi

40/48

Ispitni rok: Jul 2013 (5.7.2013)

1.(3) Objasniti pojam raspodele vremena (time sharing) kod multiprocesnih sistema.

Odgovor:

OS dodeljuje CPU vreme svakom poslu i relativno često preuzima procesor. Osnovna ideja je da posao

(task) može da izgubi procesor kada mu istekne dodeljeno CPU vreme i kada sam zatraži I/O operaciju.

Rezultat je svaki korisnik ima utisak da računar radi samo za njega sa dovoljno dobrim vremenom odziva, a

računar opslužuje više korisnika. Program koji je učitan u memoriju i izvršava se uporedo sa drugim

programima naziva se proces (process).

2.(3) Data je pogrešna implementacija operacije yield() za neki troadresni procesor. Ova operacija bi trebalo

da izvrši preuzimanje 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 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 rn ----------------------------Ovako treba tacno da izgleda ovaj deo

add r0,sp,#cur mov r0,#cur[sp]

mov [r0],sp mov [r0],sp

add r0,sp,#next mov r0,#next[sp]

mov sp,[r0] mov sp,[r0]

pop rn ----------------------------

...

pop r1

pop r0

pop pc ; return

}

}

Odgovor:

Na registar R0 ne treba da se dodaju pokazivači i stek pointer, već da se na njega stave vrednosti stek

pointera sa pokazivača.

3.(3) Korišćenjem sistemskog poziva fork() , napisati program koji, kada se pokrene kao proces, kreira

onoliko procesa-dece, koliko je dato argumentom tog programa. Ni taj proces, ni njegova deca ne treba da rade

ništa više.

void program(int N){

int pid[N];

for (int i=0; i<N; i++) {

pid[i] = fork();

}

}

Page 41: OS1 Reseni Rokovi

41/48

4.(3) Data dva procesa međusobno se iključ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);

end P1;

end P2;

Odgovor:

Ne obezbedjuje medjusobno iskljucenje zbog utrkivanja (Race condition)

5.(3) Koju uslugu operativni sistem treba da obezbedi procesima da bi oni koristili dinamičko učitavanje

modula (dynamic loading)?

Odgovor:

OS ne obezbedjuje nista sto je potrebno za rad. Dinamičko učitavanje ne zahteva nikakvu podršku OS-a,

sve radi prevodilac i generisani kod. OS samo obezbeđuje bibliotečne rutine za dinamičko učitavanje.

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 nemenja 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;

};

Rešenje: void* getWorstFit (size_t sz) {

FreeSegment* worstFit = 0;

size_t biggestSegment = 0;

for (FreeSegment* cur = freeSegHead; cur!=0; cur=cur->next) {

if (cur->size>sz) continue;

if (cur->size>biggestSegment) {

smallestSegment = cur->size;

worstFit = cur;

}

}

if (worstFit==MAXSIZE) return 0;

FreeSegment* newsgm =

(FreeSegment*)((char*)worstFit+sz);

if (worstFit->prev) worstFit->prev->next = newsgm;

if (worstFit->next) worstFit->next->prev = newsgm;

FreeSegment* p = worstFit->prev;

FreeSegment* n = worstFit->next;

size_t s = worstFit->size-sz;

newsgm->prev = p;

newsgm->next = n;

newsgm->size = s;

return worstFit;

}

Page 42: OS1 Reseni Rokovi

42/48

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.

Rešenje:

VA(16): Segment(2), Page(6), Offset(8)

PA(32): Block(24), Offset(8)

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: spooling .

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: etf/rti/nastava/os/ispiti/jul2013 .

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, 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/ 683 % (odgovor izraziti kao razlomak sa brojiocem 100)

Račun:

Ukupan broj klastera:

32GB/2KB = 25B*2

30B/2

1B*2

10B = 2

24 = 16M

Jedan ulaz u indeksnom klasteru mora da adresira 16M klastera, pa zauzima 24 bita, tj. 3B. Zato jedan

indeksni klaster može da sadrži 2kB/3B = 2048B/3B = 682 ulaza, tj. da adresira 682 klastera sa podacima.

Drugim rečima, na jedan indeksni klaster dolazi 682 klastera sa podacima, odnosno indeksni klasteri zauzimaju

1/683 deo prostora za fajlove, ili 100/683 procenata (~0.15%). Odgovor: 100/683 procenata.

Page 43: OS1 Reseni Rokovi

43/48

Ispitni rok: Septembar 2013 (30.8.2013)

1.(3) Šta je bio osnovni motiv uvođenja multiprogramiranja u do tada paketne računarske sisteme?

Odgovor:

Izvršavati više poslova istovremeno. Više procesa moze biti u memoriji uz efikasno korišćenje

memorije. Osim kad sam zatraži I/O operaciju task moze da izgubi procesor i kada mu istekne dodeljeno CPU

vreme. OS dodeli CPU vreme svakom tasku i relativno cesto preuzima procesor. Sad svaki korisnik ima utisak

da racunar samo za njega radi, a racunar opsluzuje vise korisnika.

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.

Rešenje:

void yield (jmp_buf old, jmp_buf new) {

if (setjmp(old)==0)

longjmp(new,1);

}

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). Rešenje:

void run(int n) {

stringstream p;

int pid = fork();

if (pid==0) {

for(i=1;i<=n;i++) {

p<<"p"<<i;

execlp(p.str());

}

}

else {wait(null); exit(0);}

}

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.

Rešenje:

shared var

sa : Semaphore:=1,

sb : Semaphore:=0;

process A; process B;

begin begin

loop loop

wait(sa); wait(sb);

<critical-section> <critical-section>

signal(sb); signal(sa);

<non-critical-section> <non-critical-section>

end; end;

end; end;

5.(3) Koju uslugu operativni sistem treba da obezbedi procesima da bi oni koristili preklope (overlays)?

Odgovor:

OS ne obezbeđuje nista sto je potrebno za rad, samo obezbeđuje bibliotečke rutine za dinamičko

učitavanje.

Page 44: OS1 Reseni Rokovi

44/48

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: 14% .

Račun:

Efektivnost pristupa se računa:

Učestanost pogotka*(TLB+Operativna mem) + Ostatak * (TLB+((nivo+1)*Operativna mem)) 90% * (2 + 10) + 10%*(2 + 3*10) = 0,9*12 + 0,1*32 = 14%

7.(3) Šta je svrha tehnike copy-on-write kod stranične organizacije virtuelne memorije?

Odgovor:

Dete deli sve stranice sa procesom-roditeljom, nema kopiranja adresnog prostora pa je samim tim ušteda

memorije veća.

8.(3) Koja je razlika između sinhronog i asinhronog slanja podataka na izlazni uređaj?

Odgovor:

Sinhronim slanjem podataka proces zadaje operaciju i ona mu odmah vraća kontrolu sa vraćenom

informacijom o tome koliki deo operacije je uspešno završen (ništa, delimično ili sve).

Ainhronim slanjem podataka proces samo zadaje operaciju i nastavlja izvršavanje. Ako je potrebno,

završetak operacije se procesu dojavljuje asinhronim signalom (npr. postavljanje nekog indikatora ili call-back

rutinom).

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) 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?

Odgovor: Neuspešna je operacija 2), ostale su uspešne .

10.(3) Šta je najveći nedostatak organizacije fajl sistema pomoću FAT?

Odgovor:

Osetljiv na otkaze. Ako FAT nije keširan, uzrokuje setanje glave diska za pristup susednim blokovima.

Page 45: OS1 Reseni Rokovi

45/48

Ispitni rok: Oktobar 2013 (13.9.2013)

1.(3) Koja je razlika između multiprocesorskih i distribuiranih računarskih sistema?

Odgovor:

Kod multiprocesorskih sistema skup procesora ima deljenu memoriju, dok kod distribuiranih sistema

nema zajedničke memorije ali zato postoji komunikaciona mreza izmedju procesora.

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.

Rešenje:

void Semaphore::wait () {

lock();

jmp_buf old = Thread::running->context;

blocked->put(Thread::runningThread);

Thread::running = Scheduler::get();

jmp_buf new = Thread::running->context;

yield(old,new);

unlock();

}

3.(3) Koja je razlika između (teškog) procesa i niti (thread)?

Odgovor:

Teški proces je izvršavanje jednog programa sa spostvenim adresnim prostorm. Nit je jedno izvršavanje dela

koda programa unutar adresnog prostora “okružujućeg” procesa.

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.

Rešenje:

var mutex : Semaphore = N;

process P:

loop

wait(mutex);

<critical section>

signal(mutex);

<non-critical section>

end

end P;

5.(3) Ako tokom svog prvog prolaza linker u svojoj tabeli ne pronađe simbol koji je definisan u tekućem fajlu

(izvozi se), da li će prijaviti grešku? Obrazložiti.

Odgovor:

Ukoliko linker već ima napravljenu tabelu simbola on će prijaviti grešku u prvom prolazu.

6.(3) Koja je razlika između best fit i worst fit algoritma kontinualne alokacije memorije?

Odgovor:

Best fit gleda da smesti blok podataka u segment tako da ostane sto manje neiskoriscene memorije, ali

na štetu brzine pristupa. Worst fit stavlja podatke tako da im se što brže pristupa, ali na štetu iskorišćenosti

memorije.

Page 46: OS1 Reseni Rokovi

46/48

7.(3) 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 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 virtuelnog adresnog

prostora. Koliko prostora (u bajtovima) ukupno zauzima PMT ovog procesa?

Odgovor: 520kB .

Sama hash tabela zauzima uvek 64K=216 64-bitnih ulaza, što je 64K∙8B=512KB.

Dati proces je alocirao po 256 najnižih i 256 najviših stranica, pri čemu se po dve (jedna iz grupe najnižih i

odgovarajuća iz grupe najviših) preslikavaju u isti ulaz (ukupno 256 najnižih ulaza) hash tabele. Dakle, svaki od

256 najnižih ulaza hash tabele predstavlja glavu liste sa po dva zapisa. Veličina svakog zapisa je 128 bita,

odnosno 16B. Prema tome, svaka od 256 lista zauzima po 32B, što znači da liste zauzimaju 256∙32B=8KB.

Dakle, PMT ovog procesa zauzima ukupno 512KB+8KB=520KB.

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 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.

Rešenje:

IDReqID output (IODevID deviceID, IOReq* request, int sync) {

IOReqID ioReqID = output(deviceID,request);

if (sync && ioReqID>0) ioWait(ioReqID);

return ioReqID;

}

9.(3) Šta označava skraćenica FTP? Ukratko objasniti čemu služi ovaj protokol.

Odgovor:

File Transfer Protocol (FTP) je protokol koji obezbeđuje operacije za prenos fajlova između udaljenih

fajl sistema. Može imati anonimni (anonymous) ili autorizovani pristup fajlovima.

10.(3) Koja metoda alokacije fajlova je efikasnija za direktni pristup, ulančana ili indeksirana i zašto?

Odgovor:

Indeksirana zato što nas indeks fajla direktno vodi ka fajlu, dok kod ulančane liste bi smo morali da

prolazimo kroz celu listu preko pokazivača dok ne dođemo do traženog fajla.

Page 47: OS1 Reseni Rokovi

47/48

Ispitni rok: Januar 2014 (19.1.2013)

1.(3) Šta označava termin multiprogramiranje, a šta termin multiprocesiranje?

Odgovor:

Multiprogramiranje (multiprogramming): izvršavati više poslova upredo; dok jedan čeka na završetak

I/O operacije, CPU izvršava drugi posao.

Multiprocesiranje: raditi sa vise korisnika u jednom trenutku, vise procesora radi sa deljenom

memorijom.

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.

Rešenje:

void yield (jmp_buf old, jmp_buf new) {

if (setjmp(old)==0)

longjmp(new,1);

}

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.

Rešenje: public class Thread{

public static void main(String[] args){

int n = Citaj.Int();

for(int i=0; i<n; i++){

new Thread("" + i){

public void run() {

try{

while(Interrupted()!){};

}

catch(InterruptedException g);

}

}

thread.start();

}

}

}

//napomena: čitanje podatak sa glavnog ulaza nije standardno.

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.

Rešenje:

Semaphore semA(1), semB(0)

boolean uslov;

Process A: Process B:

while(1) { while(1) {

semA.wait(); semB.wait();

uslov=true; if (uslov)

semB.signal(); semA.signal();

} }

Page 48: OS1 Reseni Rokovi

48/48

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.

Odgovor:

Ukoliko linker već ima napravljenu tabelu simbola on će prijaviti grešku u prvom prolazu.

6.(3) Šta je interna fragmentacija kod alokacije memorije? Da li je ona moguća kod kontinualne alokacije

memorije?

Odgovor:

Interna fragmentacija je neiskorišćen ostatak memorije unutar alociranih blokova memorije zbog

ograničenja u dozvoljenoj veličini alociranog bloka. Ona nije moguća kod kontinualne alokacije memorije jer

kod nje se ostatak bloka ostavlja namerno prazan i upisuje podatke na pocetak sledećeg bloka, ali ovo dovodi

do eksterne fragmentacije.

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.

Odgovor:

PMT organizovan u jednom nivou (linearno) je bolji za slučaj gde neki proces koristi ceo svoj virtuelni

prostor. Pošto znamo veličinu prostora nema potrebe da koristimo više nivoa PMT i time nepotrebno

zauzimamo dodatni prostor. PMT organizovan u više nivoa je bolji za slucaj gde neki proces koristi samo

nekoliko susednih stranica svog virtuelnog prostora. Malo ima stranica pa je bolje organizovati PMT u više

nivoa radi uštede prostora.

8.(3) Kojom tehnikom se može blokovski orijentisani ulazni uređaj koristiti kao znakovno orijentisani ulazni

tok? Kratko objasniti kako.

Odgovor:

Koristi se dvostruki bafer zato što sluzi za prilagodjavanje različitih veličina i tipova prenosa.

Blokovski orijentisani ulazni uređaj kopira originalne podatke u bafer blok po blok. Odatle se kopiraju u drugi

bafer gde čitaju kao znak po znak na znakovno orijentisani ulazni tok.

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); ______x_______

fread(f2,buffer1,n1); ______√_______

fwrite(f2,buffer2,n2); ______√_______

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).

Odgovor:

Ulancana lista, slobodni blokovi se ulančavaju u listu pokazivača koji se nalaze u svakom bloku.

Alokacija jednog bloka je jednostavna i efikasna tj. uzima se prvi blok iz liste.