ОС1/Октобар 2012 — разлика између измена
м (Formatiranje) |
|||
Ред 7: | Ред 7: | ||
=== Rešenje === | === Rešenje === | ||
Videti [[ОС1/Јул 2012#1. zadatak|prvi zadatak iz julskog roka 2012. godine]]. | |||
== 2. zadatak == | == 2. zadatak == | ||
=== Postavka === | === Postavka === | ||
Data | Data je operacija <syntaxhighlight lang="c" inline>yield(jmp_buf old, jmp_buf new)</syntaxhighlight> koja čuva kontekst niti čiji je <code>jmp_buf</code> dat kao prvi argument, oduzima joj procesor i restaurira kontekst niti čiji je <code>jmp_buf</code> dat kao drugi argument, kojoj predaje procesor. Koristeći ovu operaciju, realizovati operaciju <code>dispatch()</code> koja ima isti efekat kao i ona data u školskom jezgru. | ||
=== Rešenje === | === Rešenje === | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
void dispatch () { | void dispatch () { | ||
lock(); | |||
jmp_buf old = Thread::running->context; | |||
Scheduler::put(Thread::running); | |||
Thread::running = Scheduler::get(); | |||
jmp_buf new = Thread::running->context; | |||
yield(old,new); | |||
unlock(); | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Ред 33: | Ред 32: | ||
=== Rešenje === | === Rešenje === | ||
Može se znati u kom se kontekstu izvršava kod na osnovu povratne vrednosti fork-a. Tj. 0 u kontekstu deteta, vrednost veća od 0 u kontekstu roditelja, a manja od 0 ako dođe do greške. | Može se znati u kom se kontekstu izvršava kod na osnovu povratne vrednosti fork-a. Tj. 0 u kontekstu deteta, vrednost veća od 0 u kontekstu roditelja, a manja od 0 ako dođe do greške. | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
int main(int argc, char* argv[]) { | int main(int argc, char* argv[]) { | ||
pid_t pid = fork(); | |||
if (pid < 0) { | |||
return -1; | |||
// greška | |||
} else if (pid == 0) { | |||
// dete | |||
} else { | |||
// roditelj | |||
} | |||
return 0; | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Ред 56: | Ред 49: | ||
== 4. zadatak == | == 4. zadatak == | ||
=== Postavka === | === Postavka === | ||
Napisati kod jednog od dva procesa koji pristupaju kritičnoj sekciji sa međusobnim isključenjem pomoću uposlenog čekanja (''busy waiting'') Petersonovim algoritmom | 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 === | === Rešenje === | ||
<syntaxhighlight lang="ada"> | <syntaxhighlight lang="ada"> | ||
process P1: | process P1: | ||
begin | |||
loop | |||
flag1 := true; turn := 2; | |||
while flag2 and turn = 2 do null; | |||
<critical section> | |||
flag1 := false; | |||
<non-critical section> | |||
end | |||
end | |||
end P1; | end P1; | ||
process P2: | process P2: | ||
begin | |||
loop | |||
flag2 := true; turn := 1; | |||
while flag1 and turn = 1 do null; | |||
<critical section> | |||
flag2 := false; | |||
<non-critical section> | |||
end | |||
end | |||
end P2; | end P2; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Ред 85: | Ред 80: | ||
== 5. zadatak == | == 5. zadatak == | ||
=== Postavka === | === Postavka === | ||
Date | 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? | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
extern int a(int); | extern int a(int); | ||
void b(int); | void b(int); | ||
void b(int) {} | void b(int) {} | ||
void c(int); | void c(int); | ||
extern int d; | extern int d; | ||
static int e; | static int e; | ||
int f; | int f; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Rešenje === | === Rešenje === | ||
Uveženi: a, c, d | * Uveženi: a, c, d | ||
Izveženi: b, f | * Izveženi: b, f | ||
== 6. zadatak == | == 6. zadatak == | ||
=== Postavka === | === Postavka === | ||
Neki sistem koristi kontinualnu alokaciju operativne memorije. Data je deklaracija strukture podataka | 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 <code>getFirstFitFragment()</code> 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 | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
typedef unsigned int size_t; | typedef unsigned int size_t; | ||
struct FreeFragment { | 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 | FreeFragment* head; // Glava liste slobodnih fragmenata | ||
void* getFirstFitFragment(size_t); | void* getFirstFitFragment(size_t); | ||
Ред 117: | Ред 112: | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
void* getFirstFitFragment(size_t sz) { | void* getFirstFitFragment(size_t sz) { | ||
if (head == 0 || sz == 0) { | |||
return 0; | |||
} | |||
for (FreeFragment* cur = head; cur; cur = cur->next) { | |||
if (cur->size < sz) { | |||
continue; | |||
} | |||
FreeFragment* newFrg = (FreeFragment*)((char*)cur + sz); | |||
if (cur->prev) { | |||
cur->prev->next = newFrg; | |||
} else { | |||
head = cur->next; | |||
} | |||
if (cur->next) { | |||
cur->next->prev = newFrg; | |||
} | |||
newFrg->prev = curr->prev; | |||
newFrg->next = curr->next; | |||
newFrg->size = cur->size - sz; | |||
return cur; | |||
} | |||
return 0; | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Ред 135: | Ред 139: | ||
== 7. zadatak == | == 7. zadatak == | ||
=== Postavka === | === Postavka === | ||
Objasniti | Objasniti šta je osnovni motiv i pogodnost tehnike straničenja u više nivoa u odnosu na straničenje u jednom nivou? | ||
=== Rešenje === | === Rešenje === | ||
Ред 143: | Ред 147: | ||
=== Postavka === | === Postavka === | ||
Kojom tehnikom se fizički nedeljivi izlazni uređaj može učiniti logički (virtuelno) deljivim između procesa koji ga uporedo koriste? | Kojom tehnikom se fizički nedeljivi izlazni uređaj može učiniti logički (virtuelno) deljivim između procesa koji ga uporedo koriste? | ||
=== Rešenje === | === Rešenje === | ||
Spooling-om. | Spooling-om. | ||
Ред 148: | Ред 153: | ||
== 9. zadatak == | == 9. zadatak == | ||
=== Postavka === | === Postavka === | ||
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 | 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 | ||
=== Rešenje === | === Rešenje === | ||
Ред 155: | Ред 160: | ||
== 10. zadatak == | == 10. zadatak == | ||
=== Postavka === | === Postavka === | ||
Neki | 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? | ||
=== Rešenje === | === Rešenje === | ||
32GB | * <math>\frac{32GB}{2KB} = 16M = 2^{24} \implies 3B</math> adresa | ||
* <math>\frac{2KB}{3B} = 682</math> ulaza u indeksu | |||
2KB | * Procenat zauzetosti: 100/(682 + 1)% | ||
[[Категорија:Рокови]] | [[Категорија:Рокови]] | ||
[[Категорија:ОС1]] | [[Категорија:ОС1]] |
Тренутна верзија на датум 19. јул 2022. у 20:57
1. zadatak
Postavka
Šta je multiprocesorski, a šta distribuirani sistem?
Rešenje
Videti prvi zadatak iz julskog roka 2012. godine.
2. zadatak
Postavka
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
void dispatch () {
lock();
jmp_buf old = Thread::running->context;
Scheduler::put(Thread::running);
Thread::running = Scheduler::get();
jmp_buf new = Thread::running->context;
yield(old,new);
unlock();
}
3. zadatak
Postavka
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.
Rešenje
Može se znati u kom se kontekstu izvršava kod na osnovu povratne vrednosti fork-a. Tj. 0 u kontekstu deteta, vrednost veća od 0 u kontekstu roditelja, a manja od 0 ako dođe do greške.
int main(int argc, char* argv[]) {
pid_t pid = fork();
if (pid < 0) {
return -1;
// greška
} else if (pid == 0) {
// dete
} else {
// roditelj
}
return 0;
}
4. zadatak
Postavka
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;
while flag2 and turn = 2 do null;
<critical section>
flag1 := false;
<non-critical section>
end
end
end P1;
process P2:
begin
loop
flag2 := true; turn := 1;
while flag1 and turn = 1 do null;
<critical section>
flag2 := false;
<non-critical section>
end
end
end P2;
5. zadatak
Postavka
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);
void b(int);
void b(int) {}
void c(int);
extern int d;
static int e;
int f;
Rešenje
- Uveženi: a, c, d
- Izveženi: b, f
6. zadatak
Postavka
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) {
if (head == 0 || sz == 0) {
return 0;
}
for (FreeFragment* cur = head; cur; cur = cur->next) {
if (cur->size < sz) {
continue;
}
FreeFragment* newFrg = (FreeFragment*)((char*)cur + sz);
if (cur->prev) {
cur->prev->next = newFrg;
} else {
head = cur->next;
}
if (cur->next) {
cur->next->prev = newFrg;
}
newFrg->prev = curr->prev;
newFrg->next = curr->next;
newFrg->size = cur->size - sz;
return cur;
}
return 0;
}
7. zadatak
Postavka
Objasniti šta je osnovni motiv i pogodnost tehnike straničenja u više nivoa u odnosu na straničenje u jednom nivou?
Rešenje
Veći kapacitet virtuelne memorije.
8. zadatak
Postavka
Kojom tehnikom se fizički nedeljivi izlazni uređaj može učiniti logički (virtuelno) deljivim između procesa koji ga uporedo koriste?
Rešenje
Spooling-om.
9. zadatak
Postavka
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
Rešenje
Ta informacija čuva se u tabeli otvorenih fajlova lokalnoj za taj proces.
10. zadatak
Postavka
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?
Rešenje
- adresa
- ulaza u indeksu
- Procenat zauzetosti: 100/(682 + 1)%