OS1 Reseni Rokovi
-
Upload
petar-petrovic -
Category
Documents
-
view
148 -
download
15
description
Transcript of OS1 Reseni Rokovi
ETF Beograd
Rešeni rokovi iz
Operativnih sistema 1
2011-2014
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.
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.
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.
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).
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.
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.
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();
}
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
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
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; | ….
} |
.... |
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)
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 .
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);
}
}
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.
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 .
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
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.
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();
} }
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 .
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.
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.
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.
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.
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.
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
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;
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 .
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.
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;
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)
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.
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).
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) ); }
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
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;
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;
}
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.
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 .
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();
}
}
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;
}
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.
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.
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.
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.
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.
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();
} }
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.