ОС1/Јун 2013 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
м (→‎Rešenje: formula)
м (Formatiranje)
Ред 11: Ред 11:
== 2. zadatak ==
== 2. zadatak ==
=== Postavka ===
=== Postavka ===
Ako se nad sledećim programom kreira jedan proces, koliko će ukupno biti elemenata sa vrednošću '''različitom od 0''' u nizovima <code>pid</code> 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?  
Ako se nad sledećim programom kreira jedan proces, koliko će ukupno biti elemenata sa vrednošću '''različitom od 0''' u nizovima <code>pid</code> 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?
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
const int N=2;  
const int N = 2;
int pid[N];  
int pid[N];
void main () {
void main() {
for (int i=0; i<N; i++)  
    for (int i = 0; i < N; i++)
pid[i] = fork();  
        pid[i] = fork();
}
}
</syntaxhighlight>
</syntaxhighlight>


=== Rešenje ===
=== Rešenje ===
Biće ukupno 4 elemenata sa vrednošću različitom od 0.
* Prva iteracija: P1 pravi P2, <code>pid[0] = 2</code> u P1
* Druga iteracija: P1 pravi P3, <code>pid[1] = 3</code> u P1 dok je <code>pid[0] = 2</code> u P3 zbog toga što je taj niz kopiran iz P1
* Druga iteracija: P2 pravi P4, <code>pid[1] = 4</code> u P2
Na kraju postoji 4 vrednosti koje nisu nula.


== 3. zadatak ==
== 3. zadatak ==
=== Postavka ===
=== Postavka ===
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'')
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'').


=== Rešenje ===
=== Rešenje ===
Pretpostavimo da oba procesa uposleno čekaju. Promenljiva turn "prelama" u situaciji kada oba procesa žele da uđu u kritičnu sekciju jer turn može imati vrednost ili 1 ili 2. Dakle, nemoguće je da dođe do utrkivanja
Pretpostavimo da oba procesa uposleno čekaju. Promenljiva turn "prelama" u situaciji kada oba procesa žele da uđu u kritičnu sekciju jer turn može imati vrednost ili 1 ili 2. Dakle, nemoguće je da dođe do utrkivanja.


== 4. zadatak ==
== 4. zadatak ==
Ред 36: Ред 39:


=== Rešenje ===
=== Rešenje ===
<syntaxhighlight lang="ada">
<syntaxhighlight lang="pascal">
var mutex : Semaphore := N;
var mutex : Semaphore := N;
process P:
process P:
begin
    begin
loop
        loop
wait(mutex);
            wait(mutex);
<critical>
            <critical>
signal(mutex);
            signal(mutex);
<non-critical>
            <non-critical>
end
        end
    end
end P;
end P;
</syntaxhighlight>
</syntaxhighlight>
Ред 54: Ред 58:


=== Rešenje ===
=== Rešenje ===
Preklopi ne zahtevaju podršku OS-a. Sve obavlja prevodilac i generisani kod. OS samo obezbeđuje usluge za alokaciju dela virtuelnog adresnog prostora.
Videti rešenje [[ОС1/Јул 2013#5. zadatak|5. zadatka iz jula 2013. godine]].


== 6. zadatak ==
== 6. zadatak ==
=== Postavka ===
=== Postavka ===
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 <code>freeSegHead</code>. Implementirati funkciju <code>getBestFit(size_t)</code> 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.  
Data je definicija strukture <code>FreeSegment</code> koja predstavlja jedan segment slobodne memorije. Ove strukture uvezane su u dvostruko ulančanu, neuređenu listu čija je glava <code>freeSegHead</code>. Implementirati funkciju <code>getBestFit(size_t)</code> 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.
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
struct FreeSegment {
struct FreeSegment {
size_t size;
    size_t size;
FreeSegment *prev, *next;
    FreeSegment *prev, *next;
};
};
</syntaxhighlight>
</syntaxhighlight>
Ред 69: Ред 73:
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
void* getBestFit(size_t sz) {
void* getBestFit(size_t sz) {
FreeSegment* bestFit = 0
    FreeSegment* bestFit = 0
size_t smallestFragment = MAX_SIZE;
    size_t smallestFragment = MAX_SIZE;
for(FreeSegment* cur = freeSegHead; cur != 0; cur = cur->next) {
    for (FreeSegment* cur = freeSegHead; cur != 0; cur = cur->next) {
if(cur->size < sz) continue;
        if (cur->size < sz) {
if(cur->size < smallestFragment) {
            continue;
smallestFragment = cur->size;
        }
bestFit = cur;
        if (cur->size < smallestFragment) {
}
            smallestFragment = cur->size;
}
            bestFit = cur;
if(bestFit == 0) return 0;
        }
FreeSegment* newFrag = (FreeSegment*)((char*)bestFit + sz);
    }
if(bestFit->prev) bestFit->prev->next = newFrag;
    if (bestFit == 0) {
else freeSegHead = bestFit->next;
        return 0;
if(bestFit->next) bestFit->next->prev = newFrag;
    }
newFrag->prev = bestFit->prev;
    FreeSegment* newFrag = (FreeSegment*)((char*)bestFit + sz);
newFrag->next = bestFit->next;
    if (bestFit->prev) {
newFrag->size = bestFit->size - sz;
        bestFit->prev->next = newFrag;
return bestFit;
    } else {
        freeSegHead = bestFit->next;
    }
    if (bestFit->next) {
        bestFit->next->prev = newFrag;
    }
    newFrag->prev = bestFit->prev;
    newFrag->next = bestFit->next;
    newFrag->size = bestFit->size - sz;
    return bestFit;
}
}
</syntaxhighlight>
</syntaxhighlight>
Ред 121: Ред 134:
== 10. zadatak ==
== 10. zadatak ==
=== Postavka ===
=== Postavka ===
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
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


=== Rešenje ===
=== Rešenje ===
<math> 256GB / 512B = 2^{29} </math> blokova
Na disku ima ukupno <math>\frac{256GB}{512B} = 2^{29}</math> blokova. Pošto je za svaki blok potreban po jedan bit, količinu prostora određujemo kao <math>\frac{2^{29}}{2^3} = 64 MB</math>.
 
<math> 2^{29} / 2^3 = 64 MB </math>


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

Верзија на датум 19. јул 2022. у 18:09

Zadaci na stranici predmeta.

1. zadatak

Postavka

Šta su multiprocesorski, a šta distribuirani sistemi?

Rešenje

Videti zadatak iz junskog roka 2011.

2. zadatak

Postavka

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

Rešenje

  • Prva iteracija: P1 pravi P2, pid[0] = 2 u P1
  • Druga iteracija: P1 pravi P3, pid[1] = 3 u P1 dok je pid[0] = 2 u P3 zbog toga što je taj niz kopiran iz P1
  • Druga iteracija: P2 pravi P4, pid[1] = 4 u P2

Na kraju postoji 4 vrednosti koje nisu nula.

3. zadatak

Postavka

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

Rešenje

Pretpostavimo da oba procesa uposleno čekaju. Promenljiva turn "prelama" u situaciji kada oba procesa žele da uđu u kritičnu sekciju jer turn može imati vrednost ili 1 ili 2. Dakle, nemoguće je da dođe do utrkivanja.

4. zadatak

Postavka

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;
process P:
    begin
        loop
            wait(mutex);
            <critical>
            signal(mutex);
            <non-critical>
        end
    end
end P;

5. zadatak

Postavka

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

Rešenje

Videti rešenje 5. zadatka iz jula 2013. godine.

6. zadatak

Postavka

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 smallestFragment = MAX_SIZE;
    for (FreeSegment* cur = freeSegHead; cur != 0; cur = cur->next) {
        if (cur->size < sz) {
            continue;
        }
        if (cur->size < smallestFragment) {
            smallestFragment = cur->size;
            bestFit = cur;
        }
    }
    if (bestFit == 0) {
        return 0;
    }
    FreeSegment* newFrag = (FreeSegment*)((char*)bestFit + sz);
    if (bestFit->prev) {
        bestFit->prev->next = newFrag;
    } else {
        freeSegHead = bestFit->next;
    }
    if (bestFit->next) {
        bestFit->next->prev = newFrag;
    }
    newFrag->prev = bestFit->prev;
    newFrag->next = bestFit->next;
    newFrag->size = bestFit->size - sz;
    return bestFit;
}

7. zadatak

Postavka

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

Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.

8. zadatak

Postavka

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

Rešenje

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

9. zadatak

Postavka

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);
  1. fread(f1,buffer1,n1);
  2. fwrite(f1,buffer2,n2);
  3. fread(f2,buffer1,n1);
  4. fwrite(f2,buffer2,n2);

Rešenje

Videti zadatak iz junskog roka 2011.

10. zadatak

Postavka

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

Rešenje

Na disku ima ukupno blokova. Pošto je za svaki blok potreban po jedan bit, količinu prostora određujemo kao .