ОС1/Октобар 2012 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
м (Formatiranje)
 
Ред 7: Ред 7:


=== Rešenje ===
=== Rešenje ===
Мултипроцесорски систем је сиситем у коме више процесора раде над истом оперативном меморијом.<br>
Videti [[ОС1/Јул 2012#1. zadatak|prvi zadatak iz julskog roka 2012. godine]].
Дистрибуирани систем је систем у коме више одвојених рачунара уз помоћ рачунарских мрежа чини једну логичку целину.


== 2. zadatak ==
== 2. zadatak ==
=== Postavka ===
=== Postavka ===
Data je operacija <code>yield(jmp_buf old, jmp_buf new)</code> 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.
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();
    lock();
jmp_buf old = Thread::running->context;
    jmp_buf old = Thread::running->context;
Scheduler::put(Thread::running);
    Scheduler::put(Thread::running);
Thread::running = Scheduler::get();
    Thread::running = Scheduler::get();
jmp_buf new = Thread::running->context;
    jmp_buf new = Thread::running->context;
yield(old,new);
    yield(old,new);
unlock();
    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();
    pid_t pid = fork();
    if (pid < 0) {
if(pid < 0) {
        return -1;  
return -1;  
        // greška
// greska
    } else if (pid == 0) {
}
        // dete
else if(pid == 0) {
    } else {
// dete
        // roditelj
}
    }
else {
    return 0;
// 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
    begin
loop
        loop
flag1 := true; turn := 2;
            flag1 := true; turn := 2;
while flag2 and turn = 2 do null;
            while flag2 and turn = 2 do null;
<critical section>
            <critical section>
flag1 := false;
            flag1 := false;
<non-critical section>
            <non-critical section>
end
        end
    end
end P1;
end P1;


process P2:
process P2:
begin
    begin
loop
        loop
flag2 := true; turn := 1;
            flag2 := true; turn := 1;
while flag1 and turn = 1 do null;
            while flag1 and turn = 1 do null;
<critical section>
            <critical section>
flag2 := false;
            flag2 := false;
<non-critical section>
            <non-critical section>
end
        end
    end
end P2;
end P2;
</syntaxhighlight>
</syntaxhighlight>
Ред 85: Ред 80:
== 5. zadatak ==
== 5. zadatak ==
=== Postavka ===
=== 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?  
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 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
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)  
    size_t size; // Veličina fragmenta u jedinicama sizeof(char)
  FreeFragment* prev; // Prethodni u listi  
    FreeFragment* prev; // Prethodni u listi
  FreeFragment* next; // Sledeći 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;
    if (head == 0 || sz == 0) {
for(FreeFragment* cur = head; cur; cur = cur->next) {
        return 0;
if(cur->size < sz) continue;
    }
FreeFragment* newFrg = (FreeFragment*)((char*)cur + sz);
    for (FreeFragment* cur = head; cur; cur = cur->next) {
if(cur->prev) cur->prev->next = newFrg;
        if (cur->size < sz) {
else head = cur->next;
            continue;
if(cur->next) cur->next->prev = newFrg;
        }
newFrg->prev = curr->prev;
        FreeFragment* newFrg = (FreeFragment*)((char*)cur + sz);
newFrg->next = curr->next;
        if (cur->prev) {
newFrg->size = cur->size - sz;
            cur->prev->next = newFrg;
return cur;
        } else {
}
            head = cur->next;
return 0;
        }
        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 šta je osnovni motiv i pogodnost tehnike straničenja u više nivoa u odnosu na straničenje u jednom nivou?
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 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
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 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?  
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 / 2KB = 16M = 2^24 -> 3B adresa
* <math>\frac{32GB}{2KB} = 16M = 2^{24} \implies 3B</math> adresa
 
* <math>\frac{2KB}{3B} = 682</math> ulaza u indeksu
2KB / 3B = 682 ulaza u indeksu
* Procenat zauzetosti: 100/(682 + 1)%
 
procenat zauzetosti: 100/(682 + 1)%


[[Категорија:Рокови]]
[[Категорија:Рокови]]
[[Категорија:ОС1]]
[[Категорија:ОС1]]

Тренутна верзија на датум 19. јул 2022. у 20:57

Zadaci na stranici predmeta.

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