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

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
м (pogresan link)
м (Ispravke; delimično rešeno)
Ред 1: Ред 1:
{{tocright}}
{{tocright}}
[http://os.etf.bg.ac.rs/OS1/rokovi/2018/jun/Jun%202018.pdf Zadaci na stranici predmeta.]
[http://os.etf.bg.ac.rs/OS1/rokovi/2018/jun/Jun%202018.pdf Zadaci na stranici predmeta.]
== 1. zadatak ==
== 1. zadatak ==
=== Postavka ===
=== Postavka ===
Objasniti razliku između pojmova proces i nit (engl. ''thread'')
Objasniti razliku između pojmova ''proces'' i ''nit'' (engl. ''thread'').


=== Rešenje ===
=== Rešenje ===
Proces je jedno izvršavanje programa sa jednim adresnim prostorom. Niti (''thread'') ili laki procesi: tok kontrole koji teče uporedo sa drugim tokovima kontrole, ali koji deli virtuelni   adresni prostor sa nekim drugim tokom ili tokovima kontrole.
Proces je jedno izvršavanje programa sa jednim adresnim prostorom. Nit (''thread'') ili laki proces je tok kontrole koji teče uporedo sa drugim tokovima kontrole, ali koji deli virtuelni adresni prostor sa nekim drugim tokom ili tokovima kontrole.


== 2. zadatak ==
== 2. zadatak ==
{{delimično rešeno}}
=== Postavka ===
=== Postavka ===
Korišćenjem standardnih bibliotečnih operacija <code>setjmp</code> i <code>longjmp</code>, implementirati operaciju <code>wait</code> na binarnom semaforu koji je realizovan klasom <code>Event</code> poput one u školskom jezgru.
Korišćenjem standardnih bibliotečnih operacija <code>setjmp</code> i <code>longjmp</code>, implementirati operaciju ''wait'' na binarnom semaforu koji je realizovan klasom <code>Event</code> poput one u školskom jezgru.
 
=== Rešenje ===


== 3. zadatak ==
== 3. zadatak ==
=== Postavka ===
=== Postavka ===
Korišćenjem sistemskih poziva <code>fork</code> i <code>exec</code>, napisati funkciju run koja kreira proces nad programom u fajlu sa zadatom putanjom i vraća negativnu vrednost u slučaju greške, a pid kreiranog procesa u slučaju uspeha pri <code>fork</code>. Ukoliko ne uspe <code>exec</code>, kreirani proces-dete treba ugasiti.
Korišćenjem sistemskih poziva <code>fork</code> i <code>exec</code>, napisati funkciju <code>run</code> koja kreira proces nad programom u fajlu sa zadatom putanjom i vraća negativnu vrednost u slučaju greške, a <code>pid</code> kreiranog procesa u slučaju uspeha pri <code>fork</code>. Ukoliko ne uspe <code>exec</code>, kreirani proces-dete treba ugasiti.


=== Rešenje ===
=== Rešenje ===
 
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="c++">
int run(char* path) {
int main(int argc, int argv[]){
    if (argc < 2) return -1;
     pid_t pid = fork();
     pid_t pid = fork();
     if (pid < 0){
     if (pid < 0) {
         return -2;
         return -1;
     }
     }
     if (pid == 0){
     if (pid == 0) {
         int t = exec(argv[1]);
         int t = exec(path);
         if (t < 0){
         if (t < 0) {
             exit(-3);
             exit(-2);
         }
         }
     }
     }
     return 0;
     return pid;
}
}
</syntaxhighlight>
</syntaxhighlight>
Ред 52: Ред 54:


=== Rešenje ===
=== Rešenje ===
Ovo rešenje ne valja jer se dešava ''livelock'' odnosno oba procesa se međusobno zaključaju i ni jedan ni drugi se neće dalje izvršavati. To se desi kada proces P1 postavi <code>flag1</code> na ''true'' a zatim P2 postavi <code>flag2</code> na ''true''.
Ovo rešenje ne valja jer se dešava ''livelock'' odnosno oba procesa se međusobno zaključaju i ni jedan ni drugi se neće dalje izvršavati. To se desi kada proces P1 postavi <code>flag1</code> na <code>true</code> a zatim se desi promena konteksta i P2 postavi <code>flag2</code> na <code>true</code>.


== 5. zadatak ==
== 5. zadatak ==
Ред 59: Ред 61:


=== Rešenje ===
=== Rešenje ===
Duže vreme izvršavanja u najgorem slučaju se može očekivati kod preklopa jer će program stalno učitavati iz memorije. Dok će dinamičko učitavanje zauzeti više memorije, svaki potreban modul će učitati po jednom dok preklopi će se stalno učitavati iznova i iznova.
Duže vreme izvršavanja u najgorem slučaju se može očekivati kod preklopa jer će program stalno učitavati iz memorije iznova i iznova, dok će dinamičko učitavanje zauzeti više memorije, svaki potreban modul će učitati po jednom.


== 6. zadatak ==
== 6. zadatak ==
=== Postavka ===
=== Postavka ===
U nekom sistemu primenjuje se worst-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):  
U nekom sistemu primenjuje se ''worst-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-
A64, B16, C128, D32, A-, E8, F32, B-
 
Odgovoriti na sledeća pitanja koja se odnose na stanje memorije nakon ove sekvence zahteva:  
Odgovoriti na sledeća pitanja koja se odnose na stanje memorije nakon ove sekvence zahteva:  
*Koliko je ukupno slobodnih fragmenata?
# Koliko je ukupno slobodnih fragmenata?
*Kolika je veličina najmanjeg slobodnog fragmenta?
# Kolika je veličina najmanjeg slobodnog fragmenta?
*Kolika je veličina najvećeg slobodnog fragmenta?
# Kolika je veličina najvećeg slobodnog fragmenta?


=== Rešenje ===
=== Rešenje ===
#A64 -> A(64), Free(192)
Jedno slovo označava 8KB prostora.
#B16 -> A(64), B(16), Free(176)
AAAAAAAA------------------------
#C128 -> A(64), B(16), C(128), Free(48)
AAAAAAAABB----------------------
#D32 -> A(64), B(16), C(128), D(32), Free(16)
AAAAAAAABBCCCCCCCCCCCCCCCC------
#A- -> Free(64), B(16), C(128), D(32), Free(16)
AAAAAAAABBCCCCCCCCCCCCCCCCDDDD--
#E8 -> E(8), Free(56), B(16), C(128), D(32), Free(16)
--------BBCCCCCCCCCCCCCCCCDDDD--
#F32 -> E(8), F(32), Free(24), B(16), C(128), D(32), Free(16)
E-------BBCCCCCCCCCCCCCCCCDDDD--
#B- -> E(8), F(32), Free(42), C(128), D(32), Free(16)
EFFFF---BBCCCCCCCCCCCCCCCCDDDD--
*Koliko je ukupno slobodnih fragmenata? 2
EFFFF-----CCCCCCCCCCCCCCCCDDDD--
*Kolika je veličina najmanjeg slobodnog fragmenta? 16KB
* Slobodnih fragmenata: 2
*Kolika je veličina najvećeg slobodnog fragmenta? 42KB
* Najmanji slobodan fragment: 16KB
* Najveći slobodan fragment: 40KB


== 7. zadatak ==
== 7. zadatak ==
Ред 88: Ред 91:


=== Rešenje ===
=== Rešenje ===
Neće ugasiti program jer se zapravo radi o tehnici ''copy-on-write'' odnosno kopiranja na upis. U ovoj tehnici, ''MMU'' vidi tu memoriju kao zabranjenu za upis. Prilikom generisanja greške, OS proverava da li je zabranjena, i kako kod njega nije, to znači da se radi o tehnici kopiranja na upis.
Neće ugasiti program jer se zapravo radi o tehnici ''copy-on-write'' odnosno kopiranja na upis. U ovoj tehnici, MMU vidi tu memoriju kao zabranjenu za upis. Prilikom generisanja greške, OS proverava da li je zabranjena, i kako vidi da zapravo nije nije, to znači da se radi o tehnici kopiranja na upis pa će operativni sistem kopirati stranicu i reći MMU da je dozvoljena za upis.


== 8. zadatak ==
== 8. zadatak ==
Ред 95: Ред 98:


=== Rešenje ===
=== Rešenje ===
#Informacija o tekućem realnom vremenu:
# Informacija o tekućem realnom vremenu:
#:<code>time_t time (time_t* tloc);</code>
#: <syntaxhighlight lang="c" inline>time_t time (time_t* tloc);</syntaxhighlight>
#:Vraća broj sekundi koje su protekle od 1. 1. 1970. u 0 časova postoje i bibliotečne funkcije u <time.h> koje vraćaju “kalendarsko” vreme, rastavljeno na datum i sat itd, a oslanjaju se na ovaj sistemski poziv: ''asctime'', ''ctime'', ''gmtime'', ''localtime''
#: Vraća broj sekundi koje su protekle od 1. 1. 1970. u 0 časova. Postoje i bibliotečke funkcije u <code>time.h</code> koje vraćaju “kalendarsko” vreme, rastavljeno na datum i sat itd, a oslanjaju se na ovaj sistemski poziv: <code>asctime</code>, <code>ctime</code>, <code>gmtime</code>, <code>localtime</code>.
#Suspenzija pozivajućeg procesa (“uspavljivanje”) za zadato vreme
# Suspenzija pozivajućeg procesa (“uspavljivanje”) za zadato vreme
#:<code>unsigned int sleep (unsigned int seconds);</code>
#: <syntaxhighlight lang="c" inline>unsigned int sleep (unsigned int seconds);</syntaxhighlight>
#Čekanje na događaje, uslove ili na sinhronizacione primitive, ali vremenski ograničeno (tzv. tajmaout kontrole, timeout); ako se proces ne deblokira u zadatom vremenu, biće deblokiran zbog isteka vremenske kontrole; npr. za semafore:
# Čekanje na događaje, uslove ili na sinhronizacione primitive, ali vremenski ograničeno (tzv. ''timeout'' kontrole); ako se proces ne deblokira u zadatom vremenu, biće deblokiran zbog isteka vremenske kontrole; npr. za semafore:
#:<code>int sem_timedwait (sem_t *sem, const struct timespec *abs_timeout);</code>
#: <syntaxhighlight lang="c" inline>int sem_timedwait (sem_t *sem, const struct timespec *abs_timeout);</syntaxhighlight>
 


== 9. zadatak ==
== 9. zadatak ==
=== Postavka ===
=== Postavka ===
Ako je tekući direktorijum nekog procesa ''/a/b/c'', koja je apsolutna putanja do fajla koji taj proces otvara davanjem putanje ''d/../../e/f.txt''?
Ako je tekući direktorijum nekog procesa <code>/a/b/c</code>, koja je apsolutna putanja do fajla koji taj proces otvara davanjem putanje <code>d/../../e/f.txt</code>?


=== Rešenje ===
=== Rešenje ===
Rešenje je ''a/b/e/f.txt''.
Raščlanimo relativnu putanju na delove:
* <code>d</code>: idemo u direktorijum <code>d</code>, sada je putanja <code>/a/b/c/d</code>
* <code>..</code> idemo jedan direktorijum iznad, sada je putanja <code>/a/b/c</code>
* <code>..</code> idemo jedan direktorijum iznad, sada je putanja <code>/a/b</code>
* <code>e</code> idemo u direktorijum <code>e</code>, sada je putanja <code>/a/b/e</code>
* <code>f.txt</code> posećujemo fajl <code>f.txt</code>, krajnja putanja je <code>/a/b/e/f.txt</code>


== 10. zadatak ==
== 10. zadatak ==
{{delimično rešeno}}
=== Postavka ===
=== Postavka ===
Fajl sistem primenjuje ulančanu alokaciju, s tim da se i slobodni blokovi ulančavaju u listu. U strukturi FCB polje <code>head</code> sadrži broj prvog bloka sa sadržajem fajla, a polje <code>size</code> veličinu sadržaja. Funkcija jezgra <code>free</code> prima kao argument broj prvog bloka u lancu blokova koje treba proglasiti slobodnim. Napisati funkciju jezgra <code>truncate</code> koja briše sadržaj fajla na čiji <code>FCB</code> ukazuje argument.
Fajl sistem primenjuje ulančanu alokaciju, s tim da se i slobodni blokovi ulančavaju u listu. U strukturi FCB polje <code>head</code> sadrži broj prvog bloka sa sadržajem fajla, a polje <code>size</code> veličinu sadržaja. Funkcija jezgra <code>free</code> prima kao argument broj prvog bloka u lancu blokova koje treba proglasiti slobodnim. Napisati funkciju jezgra <code>truncate</code> koja briše sadržaj fajla na čiji <code>FCB</code> ukazuje argument.
=== Rešenje ===


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

Верзија на датум 11. јул 2021. у 15:56

Zadaci na stranici predmeta.

1. zadatak

Postavka

Objasniti razliku između pojmova proces i nit (engl. thread).

Rešenje

Proces je jedno izvršavanje programa sa jednim adresnim prostorom. Nit (thread) ili laki proces je tok kontrole koji teče uporedo sa drugim tokovima kontrole, ali koji deli virtuelni adresni prostor sa nekim drugim tokom ili tokovima kontrole.

2. zadatak

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

Postavka

Korišćenjem standardnih bibliotečnih operacija setjmp i longjmp, implementirati operaciju wait na binarnom semaforu koji je realizovan klasom Event poput one u školskom jezgru.

Rešenje

3. zadatak

Postavka

Korišćenjem sistemskih poziva fork i exec, napisati funkciju run koja kreira proces nad programom u fajlu sa zadatom putanjom i vraća negativnu vrednost u slučaju greške, a pid kreiranog procesa u slučaju uspeha pri fork. Ukoliko ne uspe exec, kreirani proces-dete treba ugasiti.

Rešenje

int run(char* path) {
    pid_t pid = fork();
    if (pid < 0) {
        return -1;
    }
    if (pid == 0) {
        int t = exec(path);
        if (t < 0) {
            exit(-2);
        }
    }
    return pid;
}

4. zadatak

Postavka

Dva procesa pristupaju kritičnoj sekciji. Dat je presudokod jednog od njih, koji bi trebalo da obezbedi međusobno isključenje uposlenim čekanjem (kod drugog procesa izgleda analogno). Da li ovo rešenje obezbeđuje međusobno isključenje? Da li ima neki problem (ako ima, koji)?

process P1
begin
    loop
        flag1 := true;
        while flag2 = true do null end;
        <critical section>
        flag1 := false;
        <non-critical section>
    end
end P1;

Rešenje

Ovo rešenje ne valja jer se dešava livelock odnosno oba procesa se međusobno zaključaju i ni jedan ni drugi se neće dalje izvršavati. To se desi kada proces P1 postavi flag1 na true a zatim se desi promena konteksta i P2 postavi flag2 na true.

5. zadatak

Postavka

Za koju od ove dve tehnike, dinamičko učitavanje (dynamic loading) ili preklopi (overlays), se može očekivati duže izvršavanje istog programa u najgorem slučaju? Precizno obrazložiti.

Rešenje

Duže vreme izvršavanja u najgorem slučaju se može očekivati kod preklopa jer će program stalno učitavati iz memorije iznova i iznova, dok će dinamičko učitavanje zauzeti više memorije, svaki potreban modul će učitati po jednom.

6. zadatak

Postavka

U nekom sistemu primenjuje se worst-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:

  1. Koliko je ukupno slobodnih fragmenata?
  2. Kolika je veličina najmanjeg slobodnog fragmenta?
  3. Kolika je veličina najvećeg slobodnog fragmenta?

Rešenje

Jedno slovo označava 8KB prostora.

AAAAAAAA------------------------
AAAAAAAABB----------------------
AAAAAAAABBCCCCCCCCCCCCCCCC------
AAAAAAAABBCCCCCCCCCCCCCCCCDDDD--
--------BBCCCCCCCCCCCCCCCCDDDD--
E-------BBCCCCCCCCCCCCCCCCDDDD--
EFFFF---BBCCCCCCCCCCCCCCCCDDDD--
EFFFF-----CCCCCCCCCCCCCCCCDDDD--
  • Slobodnih fragmenata: 2
  • Najmanji slobodan fragment: 16KB
  • Najveći slobodan fragment: 40KB

7. zadatak

Postavka

Prilikom preslikavanja virtuelne adrese, procesor je generisao izuzetak zbog pokušaja upisa na tu adresu koji je u deskriptoru stranice označen kao zabranjen. Operativni sistem ipak neće ugasiti taj proces. Precizno objasniti zašto.

Rešenje

Neće ugasiti program jer se zapravo radi o tehnici copy-on-write odnosno kopiranja na upis. U ovoj tehnici, MMU vidi tu memoriju kao zabranjenu za upis. Prilikom generisanja greške, OS proverava da li je zabranjena, i kako vidi da zapravo nije nije, to znači da se radi o tehnici kopiranja na upis pa će operativni sistem kopirati stranicu i reći MMU da je dozvoljena za upis.

8. zadatak

Postavka

Navesti tri usluge vezane za realno vreme koje operativni sistem može da nudi i predložiti i kratko objasniti funkcije – sistemske pozive za te usluge.

Rešenje

  1. Informacija o tekućem realnom vremenu:
    time_t time (time_t* tloc);
    Vraća broj sekundi koje su protekle od 1. 1. 1970. u 0 časova. Postoje i bibliotečke funkcije u time.h koje vraćaju “kalendarsko” vreme, rastavljeno na datum i sat itd, a oslanjaju se na ovaj sistemski poziv: asctime, ctime, gmtime, localtime.
  2. Suspenzija pozivajućeg procesa (“uspavljivanje”) za zadato vreme
    unsigned int sleep (unsigned int seconds);
  3. Čekanje na događaje, uslove ili na sinhronizacione primitive, ali vremenski ograničeno (tzv. timeout kontrole); ako se proces ne deblokira u zadatom vremenu, biće deblokiran zbog isteka vremenske kontrole; npr. za semafore:
    int sem_timedwait (sem_t *sem, const struct timespec *abs_timeout);

9. zadatak

Postavka

Ako je tekući direktorijum nekog procesa /a/b/c, koja je apsolutna putanja do fajla koji taj proces otvara davanjem putanje d/../../e/f.txt?

Rešenje

Raščlanimo relativnu putanju na delove:

  • d: idemo u direktorijum d, sada je putanja /a/b/c/d
  • .. idemo jedan direktorijum iznad, sada je putanja /a/b/c
  • .. idemo jedan direktorijum iznad, sada je putanja /a/b
  • e idemo u direktorijum e, sada je putanja /a/b/e
  • f.txt posećujemo fajl f.txt, krajnja putanja je /a/b/e/f.txt

10. zadatak

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

Postavka

Fajl sistem primenjuje ulančanu alokaciju, s tim da se i slobodni blokovi ulančavaju u listu. U strukturi FCB polje head sadrži broj prvog bloka sa sadržajem fajla, a polje size veličinu sadržaja. Funkcija jezgra free prima kao argument broj prvog bloka u lancu blokova koje treba proglasiti slobodnim. Napisati funkciju jezgra truncate koja briše sadržaj fajla na čiji FCB ukazuje argument.

Rešenje