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

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


=== Rešenje ===
=== Rešenje ===
OS dodeljuje procesoru vreme izvršavanja svakog posla i relativno često preuzima procesor. Osnovna ideja je da posao (engl. task) može da izgubi procesor nakon isteka dodeljenog procesorskog vremena ili kada sam zatraži promenu konteksta. Rezultat je da svaki korisnik ima utisak da računar radi samo za njega sa dovoljno dobrim vremenskim odzivom, dok računar opslužuje više korisnika.
Operativni sistem dodeljuje procesoru vreme izvršavanja svakog posla i relativno često preuzima procesor. Osnovna ideja je da posao (engl. ''task'') može da izgubi procesor nakon isteka dodeljenog procesorskog vremena ili kada sam zatraži promenu konteksta. Rezultat je da svaki korisnik ima utisak da računar radi samo za njega sa dovoljno dobrim vremenskim odzivom, dok računar opslužuje više korisnika.
 


== 2. zadatak ==
== 2. zadatak ==
=== Postavka ===
=== Postavka ===
Data je '''pogrešna''' implementacija operacije <code>yield()</code> 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 <code>cur</code>, i predaju procesora niti na čiji vrh steka ukazuje vrednost sačuvana na lokaciji na koju ukazuje argument <code>next</code>. Objasniti zašto ova implementacija nije ispravna i korigovati je.  
Data je '''pogrešna''' implementacija operacije <code>yield()</code> 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 <code>cur</code>, i predaju procesora niti na čiji vrh steka ukazuje vrednost sačuvana na lokaciji na koju ukazuje argument <code>next</code>. Objasniti zašto ova implementacija nije ispravna i korigovati je.
 
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
void yield (void* cur, void* next) {
void yield (void* cur, void* next) {
   asm {  
   asm {  
       push r0  
       push r0
       push r1  
       push r1
       ...  
       ...
       push rn  
       push rn
       add  r0,sp,#cur
       add  r0, sp, #cur
       mov  [r0],sp  
       mov  [r0], sp
       add  r0,sp,#next  
       add  r0, sp, #next
       mov  sp,[r0]  
       mov  sp, [r0]
       pop  rn  
       pop  rn
       ...  
       ...
       pop  r1  
       pop  r1
       pop  r0  
       pop  r0
       pop  pc ; return  
       pop  pc ; return
   }  
   }  
}  
}  
Ред 35: Ред 33:


=== Rešenje ===
=== Rešenje ===
Umesto <code>add r0,sp,#cur</code> treba napisati <code>mov r0, #cur[sp]</code>, tj. u <code>r0</code> treba upisati adresu <code>sp</code> pa ubaciti na tu adresu <code>sp</code>.
Umesto <syntaxhighlight lang="asm" inline>add r0, sp, #cur</syntaxhighlight> treba napisati <syntaxhighlight lang="asm" inline>mov r0, #cur[sp]</syntaxhighlight>, tj. u <code>r0</code> treba upisati adresu <code>sp</code> pa ubaciti na tu adresu <code>sp</code>. Umesto <syntaxhighlight lang="asm" inline>add r0, sp, #next</syntaxhighlight> treba napisati <syntaxhighlight lang="asm" inline>mov r0, #next[sp]</syntaxhighlight>, tj. u <code>r0</code> treba upisati adresu novog <code>sp</code>.
Umesto <code>add r0,sp,#next</code> treba napisati <code>mov r0, #next[sp]</code>, tj. u <code>r0</code> treba upisati adresu novog <code>sp</code>.
 


== 3. zadatak ==
== 3. zadatak ==
Ред 46: Ред 42:
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
int main(int argc, char* argv[]) {
int main(int argc, char* argv[]) {
if(argc < 2) return -1;
    if (argc < 2) {
int N = atoi(argv[1]);
        return -1;
for(int i = 0; i < N; i++)
    }
if(fork() == 0)
    int N = atoi(argv[1]);
return 0;
    for (int i = 0; i < N; i++) {
        if (fork() == 0) {
return 0;
            return 0;
        }
    }
    return 0;
}
}
</syntaxhighlight>
</syntaxhighlight>
Ред 58: Ред 57:
== 4. zadatak ==
== 4. zadatak ==
=== Postavka ===
=== Postavka ===
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.  
Data dva procesa međusobno se iključuju<sup>[sic]</sup> pri ulazu u dve kritične sekcije pomoću semafora čija je inicijalna vrednost 1. Objasniti šta je problem ove implementacije.  
<syntaxhighlight lang="ada">
<syntaxhighlight lang="ada">
process P1;    process P2:  
process P1;    process P2:  
Ред 70: Ред 69:


=== Rešenje ===
=== Rešenje ===
Problem je što će doći do deadlock-a, odnosno, moguće je da ''P1'' i ''P2'' prođu prvi <code>wait</code> jer je inicijalna vrednost semafora 1 ali će se zatim blokirati na drugim <code>wait()</code>-ovima.
Problem je što će doći do mrtvog blokiranja, odnosno, moguće je da ''P1'' i ''P2'' prođu prvi <code>wait</code> jer je inicijalna vrednost semafora 1 ali će se zatim blokirati na drugim <code>wait()</code> pozivima.


== 5. zadatak ==
== 5. zadatak ==
Ред 77: Ред 76:


=== 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.
Preklopi ne zahtevaju podršku operativnog sistema. Sve obavlja prevodilac i generisani kod. Operativni sistem samo obezbeđuje usluge za alokaciju dela virtuelnog adresnog prostora.


== 6. zadatak ==
== 6. zadatak ==
=== Postavka ===
=== Postavka ===
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>getWorstFit(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 ''worst 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>getWorstFit(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 ''worst 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>
Ред 92: Ред 91:
<syntaxhighlight lang = "c">
<syntaxhighlight lang = "c">
FreeSegment* getWorstFit(size_t size) {
FreeSegment* getWorstFit(size_t size) {
     FreeSegment *curr = freeSegHead, *max = NULL;
     FreeSegment* curr = freeSegHead;
    FreeSegment* max = NULL;
     size_t maxSize = 0;
     size_t maxSize = 0;
     while(curr) {
     while (curr) {
         if(curr->size >= size && curr->size > maxSize) {
         if (curr->size >= size && curr->size > maxSize) {
             max = curr;
             max = curr;
             maxSize = curr->size;
             maxSize = curr->size;
Ред 117: Ред 117:


=== Rešenje ===
=== Rešenje ===
Tehnikom spooling.
Spooling.


== 9. zadatak ==
== 9. zadatak ==
=== Postavka ===
=== Postavka ===
Napisati punu stazu (''path'') do fajla <code>resenja.doc</code> koji se nalazi u direktorijumu <code>d:/nastava/os/ispiti/jul2013</code> na uređaju <code>d:</code> posle sledeće operacije montiranja (prvi argument je fajl sistem koji montira, drugi je odredište montaže): <code>mount d: /etf/rti</code>  
Napisati punu stazu (''path'') do fajla <code>resenja.doc</code> koji se nalazi u direktorijumu <code>d:/nastava/os/ispiti/jul2013</code> na uređaju <code>d:</code> posle sledeće operacije montiranja (prvi argument je fajl sistem koji montira, drugi je odredište montaže): <syntaxhighlight lang="bash" inline>mount d: /etf/rti</syntaxhighlight>  


=== Rešenje ===
=== Rešenje ===
Ред 128: Ред 128:
== 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, 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?  
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?  


=== Rešenje ===
=== Rešenje ===

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

Zadaci na stranici predmeta.

1. zadatak

Postavka

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

Rešenje

Operativni sistem dodeljuje procesoru vreme izvršavanja svakog posla i relativno često preuzima procesor. Osnovna ideja je da posao (engl. task) može da izgubi procesor nakon isteka dodeljenog procesorskog vremena ili kada sam zatraži promenu konteksta. Rezultat je da svaki korisnik ima utisak da računar radi samo za njega sa dovoljno dobrim vremenskim odzivom, dok računar opslužuje više korisnika.

2. zadatak

Postavka

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
      add  r0, sp, #cur
      mov  [r0], sp
      add  r0, sp, #next
      mov  sp, [r0]
      pop  rn
      ...
      pop  r1
      pop  r0
      pop  pc ; return
   } 
}

Rešenje

Umesto add r0, sp, #cur treba napisati mov r0, #cur[sp], tj. u r0 treba upisati adresu sp pa ubaciti na tu adresu sp. Umesto add r0, sp, #next treba napisati mov r0, #next[sp], tj. u r0 treba upisati adresu novog sp.

3. zadatak

Postavka

Korišćenjem sistemskog poziva fork(), napisati program koji, kada se pokrene kao proces, kreira onoliko procesa-dece, koliko je dato argumentom tog programа. Ni taj proces, ni njegova deca ne treba da rade ništa više.

Rešenje

int main(int argc, char* argv[]) {
    if (argc < 2) {
        return -1;
    }
    int N = atoi(argv[1]);
    for (int i = 0; i < N; i++) {
        if (fork() == 0) {
            return 0;
        }
    }
    return 0;
}

4. zadatak

Postavka

Data dva procesa međusobno se iključuju[sic] 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;

Rešenje

Problem je što će doći do mrtvog blokiranja, odnosno, moguće je da P1 i P2 prođu prvi wait jer je inicijalna vrednost semafora 1 ali će se zatim blokirati na drugim wait() pozivima.

5. zadatak

Postavka

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

Rešenje

Preklopi ne zahtevaju podršku operativnog sistema. Sve obavlja prevodilac i generisani kod. Operativni sistem samo obezbeđuje usluge za alokaciju dela virtuelnog adresnog prostora.

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 getWorstFit(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 worst fit algoritmu.

struct FreeSegment {
  size_t size;
  FreeSegment *prev, *next;
};

Rešenje

FreeSegment* getWorstFit(size_t size) {
    FreeSegment* curr = freeSegHead;
    FreeSegment* max = NULL;
    size_t maxSize = 0;
    while (curr) {
        if (curr->size >= size && curr->size > maxSize) {
            max = curr;
            maxSize = curr->size;
        }
        curr = curr->next;
    }
    return max;
}

7. zadatak

Postavka

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

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

8. zadatak

Postavka

Kojom tehnikom se fizički nedeljiv izlazni uređaj može učiniti logički (virtuelno) deljivim između procesa koji ga uporedo koriste?

Rešenje

Spooling.

9. zadatak

Postavka

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

Rešenje

/etf/rti/nastava/os/ispiti/jul2013

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

Rešenje

Videti zadatak iz oktobarskog roka 2012.