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

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
м (Ispravke)
Ред 1: Ред 1:
{{tocright}}
{{tocright}}
[http://os.etf.bg.ac.rs/OS1/rokovi/2019/jul/Jul%202019.pdf Zadaci na stranici predmeta.]
[http://os.etf.bg.ac.rs/OS1/rokovi/2019/jul/Jul%202019.pdf Zadaci na stranici predmeta.]
== 1. Zadatak ==
 
== 1. zadatak ==
=== Postavka ===
=== Postavka ===
Šta se smatra multiprocesorskim računarskim sistemom? Šta je simetričan multiprocesorski sistem?
Šta se smatra multiprocesorskim računarskim sistemom? Šta je simetričan multiprocesorski sistem?
Ред 8: Ред 9:
Multiprocesorski sistem je sistem sa više procesora koji imaju zajedničku memoriju. Simetričan multiprocesorski sistem znači da su svi procesori opšte namene, jednaki i imaju isto vreme pristupa operativnoj memoriji. Asimetrični multiprocesorski sistem ima i specijalizovane procesore ili procesore sa različitim vremenom pristupa memoriji.
Multiprocesorski sistem je sistem sa više procesora koji imaju zajedničku memoriju. Simetričan multiprocesorski sistem znači da su svi procesori opšte namene, jednaki i imaju isto vreme pristupa operativnoj memoriji. Asimetrični multiprocesorski sistem ima i specijalizovane procesore ili procesore sa različitim vremenom pristupa memoriji.


== 2. Zadatak ==
== 2. zadatak ==
=== Postavka ===
=== Postavka ===
Neki procesor prilikom obrade prekida prebacuje svoje izvršavanje na korišćenje posebnog pokazivača steka koji se koristi u privilegovanom režimu rada, i pritom čuva sve registre na steku na čiji vrh ukazuje ovaj pokazivač. Operativni sistem na ovom procesoru koristi samo jedan sistemski stek za izvršavanje celog kernel koda. Da li se kontekst izvršavanja procesa (kontekst procesora) može čuvati na ovom steku?
Neki procesor prilikom obrade prekida prebacuje svoje izvršavanje na korišćenje posebnog pokazivača steka koji se koristi u privilegovanom režimu rada, i pritom čuva sve registre na steku na čiji vrh ukazuje ovaj pokazivač. Operativni sistem na ovom procesoru koristi samo jedan sistemski stek za izvršavanje celog kernel koda. Da li se kontekst izvršavanja procesa (kontekst procesora) može čuvati na ovom steku?


=== Rešenje ===
=== Rešenje ===
{{delimično rešeno}}


== 3. zadatak ==
=== Postavka ===
Korišćenjem niti u školskom jezgru napisati funkciju <code>sum</code> koja kreira nit koja će sabrati sve elemente zadatog niza zadate dužine i rezultat upisati na traženo mesto; u slučaju greške ove funkcije vraćaju negativnu vrednost.
<syntaxhighlight lang="c">int sum (int array[], size_t size, long* result);</syntaxhighlight>


== 3. Zadatak ==
=== Postavka ===
Korišćenjem niti u školskom jezgru napisati funkciju sum koja kreira nit koja će sabrati sve elemente zadatog niza zadate dužine i rezultat upisati na traženo mesto; u slučaju greške ove funkcije vraćaju negativnu vrednost.
<code>int sum (int array[], size_t size, long* result);</code>
=== Rešenje ===
=== Rešenje ===
<syntaxhighlight lang="c++">
<syntaxhighlight lang="cpp">
class SumThread{
class SumThread {
     public:
     public:
         SumThread(int* arr, size_t _size, long* res): array(arr), size(_size), result(res) {}
         SumThread(int* arr, size_t _size, long* res): array(arr), size(_size), result(res) {}
         void run(){
         void run() {
             long res = 0;
             long res = 0;
             for (size_t i = 0;i<size;i++){
             for (size_t i = 0; i < size; i++) {
                 res += array[i];
                 res += array[i];
             }
             }
Ред 36: Ред 38:
         long* result;
         long* result;
};
};
int sum (int array[], size_t size, long* result){
 
int sum (int array[], size_t size, long* result) {
     if (result == nullptr) return -1;
     if (result == nullptr) return -1;
     SumThread* st = new SumThread(array,size,result);
     SumThread* st = new SumThread(array, size, result);
     st->start();
     st->start();
     st->waitToComplete();
     st->waitToComplete();
     return 0;
     return 0;
Ред 46: Ред 48:
</syntaxhighlight>
</syntaxhighlight>


== 4. Zadatak ==
== 4. zadatak ==
=== Postavka ===
=== Postavka ===
Napisati pseudokod koji obezbeđuje međusobno isključenje pristupa kritičnoj sekciji dva procesa pomoću Petersonovog algoritma.
Napisati pseudokod koji obezbeđuje međusobno isključenje pristupa kritičnoj sekciji dva procesa pomoću Petersonovog algoritma.


=== Rešenje ===
=== Rešenje ===
<syntaxhighlight lang="milo">
<syntaxhighlight lang="ada">
shared var turn : integer := 1, flag1, flag2 : boolean := false;
shared var turn : integer := 1, flag1, flag2 : boolean := false;
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>
Ред 66: Ред 69:
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>
Ред 75: Ред 79:
</syntaxhighlight>
</syntaxhighlight>


== 5. Zadatak ==
== 5. zadatak ==
=== Postavka ===
=== Postavka ===
Zbog čega operativni sistem ne radi zamenu (swapping) procesa njegovim izbacivanjem iz memorije prilikom svake promene konteksta, kada procesu koji je izgubio procesor memorija svakako nije potrebna?
Zbog čega operativni sistem ne radi zamenu (''swapping'') procesa njegovim izbacivanjem iz memorije prilikom svake promene konteksta, kada procesu koji je izgubio procesor memorija svakako nije potrebna?


=== Rešenje ===
=== Rešenje ===
Zato što je pristup hard disku vrlo spor te će takva implementacija znatno uticati na performanse. Ovo se primenjivalo na ''Windows 3.1'', bilo je vrlo sporo. Danas, swapping se koristi kada nema dovoljno mesta u operativnoj memoriji.
Zato što je pristup hard disku vrlo spor te će takva implementacija znatno uticati na performanse. Ovo se primenjivalo na ''[[wikipedia:Windows 3.1|Windows 3.1]]'', i bilo je vrlo sporo. Danas, ''swapping'' se koristi kada nema dovoljno mesta u operativnoj memoriji.


== 6. Zadatak ==
== 6. zadatak ==
=== Postavka ===
=== Postavka ===
Šta je kompakcija kod kontinualne alokacije memorije?
Šta je kompakcija kod kontinualne alokacije memorije?


=== Rešenje ===
=== Rešenje ===
Kod kontinualne alokacije može doći do eksterne fragmentacije, odnosno da su slobodni fragmenti toliko mali da ni jedan proces ne može stati na tom delu, ali zbirno ih ima dovoljno za neki procos. Kompakcija rešava taj problem realokacijom svih zauzetih delova i spajanjem svih slobodnih fragmenata u jedan veliki slobodan fragment. Dok se dešava kompakcija, ni jedan proces se ne može izvršavati.
Kod kontinualne alokacije može doći do eksterne fragmentacije, odnosno da su slobodni fragmenti toliko mali da ni jedan proces ne može stati na tom delu, ali zbirno ih ima dovoljno za neki procos. Kompakcija rešava taj problem realokacijom svih zauzetih delova i spajanjem svih slobodnih fragmenata u jedan veliki slobodan fragment. Dok se dešava kompakcija, nijedan proces koji se pomera se ne može izvršavati.


== 7. Zadatak ==
== 7. zadatak ==
=== Postavka ===
=== Postavka ===
Virtuelni adresni prostor je velične 8GB, a adresibilna jedinica je 16-bitna reč. Stranica je veličine 4KB, a preslikavanje je u dva nivoa, s tim da PMT prvog nivoa ima dva puta manje ulaza nego PMT drugog nivoa. Prikazati strukturu virtuelne adrese i označiti širinu svakog polja.
Virtuelni adresni prostor je velične 8GB, a adresibilna jedinica je 16-bitna reč. Stranica je veličine 4KB, a preslikavanje je u dva nivoa, s tim da PMT prvog nivoa ima dva puta manje ulaza nego PMT drugog nivoa. Prikazati strukturu virtuelne adrese i označiti širinu svakog polja.


=== Rešenje ===
=== Rešenje ===
VA(32): 10 (Page1), 11(Page2), 11(Offset)
VA(32): Page1(10), Page2(11), Offset(11)


== 8. Zadatak ==
== 8. zadatak ==
=== Postavka ===
=== Postavka ===
Navesti tipične usluge operativnog sistema vezane za pristup blokovski orijentisanom ulaznom uređaju sa direktnim pristupom i predložiti potpise odgovarajućih funkcija za te sistemske pozive.
Navesti tipične usluge operativnog sistema vezane za pristup blokovski orijentisanom ulaznom uređaju sa direktnim pristupom i predložiti potpise odgovarajućih funkcija za te sistemske pozive.
Ред 102: Ред 106:
=== Rešenje ===
=== Rešenje ===
Osnovne usluge jesu pisanje i čitanje.
Osnovne usluge jesu pisanje i čitanje.
<syntaxhighlight lang="c">
int readBlock(int fd, BlockNo block, void* buffer);
int writeBlock(int fd, BlockNo block, void* buffer);
</syntaxhighlight>


<code> int readBlock(BlockNo block, void* buffer);</code>
== 9. zadatak ==
 
<code> int writeBlock(BlockNo block, void* buffer);</code>
 
== 9. Zadatak ==
=== Postavka ===
=== Postavka ===
Objasniti koncept ACL (access control list).
Objasniti koncept ACL (''access control list'').


=== Rešenje ===
=== Rešenje ===
Da bi se fajlovi zaštitili, jedan način je da se ograniče prava pristupa korisnika. Potrebno je definisati koji korisnik(ili grupa) može da izvršava koju operaciju. Jedan pristup je svakom fajlu pridružiti listu ovih parova(korisnik i operacija). Takva lista je lista kontrole pristupa (ACL).
Da bi se fajlovi zaštitili, jedan način je da se ograniče prava pristupa korisnika. Potrebno je definisati koji korisnik (ili grupa korisnika) može da izvršava koju operaciju. Jedan pristup je svakom fajlu pridružiti listu ovih parova (korisnik i operacija). Takva lista je lista kontrole pristupa (ACL).


== 10. Zadatak ==
== 10. zadatak ==
=== Postavka ===
=== Postavka ===
Fajl sistem primenjuje FAT 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. Globalna promenljiva fat_free_head sadrži broj prvog bloka (glavu liste), a fat_free_tail poslednjeg bloka (rep liste) u lancu slobodnih. FAT je u memoriju učitana kao niz. Napisati funkciju jezgra truncate koja briše sadržaj fajla na čiji FCB ukazuje argument.
Fajl sistem primenjuje FAT 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. Globalna promenljiva <code>fat_free_head</code> sadrži broj prvog bloka (glavu liste), a <code>fat_free_tail</code> poslednjeg bloka (rep liste) u lancu slobodnih. FAT je u memoriju učitana kao niz. Napisati funkciju jezgra <code>truncate</code> koja briše sadržaj fajla na čiji FCB ukazuje argument.


=== Rešenje ===
=== Rešenje ===
<syntaxhighlight lang="cpp">
const unsigned long FAT_SIZE = ...;
unsigned long FAT[FAT_SIZE];


void truncate(FCB* file) {
    unsigned long b = file->head;
    for (unsigned long i = 0; i < file->size; ++i) {
        unsigned long next = FAT[b];
        FAT[b] = 0;
        // Ovde se smatra da fat_free_tail pokazuje na blok 0 kada nema slobodnih blokova.
        if (fat_free_tail) {
            FAT[fat_free_tail] = b;
            fat_free_tail = b;
        } else {
            fat_free_head = b;
            fat_free_tail = b;
        }
        b = next;
    }
    file->size = 0;
    file->head = 0;
}
</syntaxhighlight>


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

Верзија на датум 7. јул 2021. у 20:04

Zadaci na stranici predmeta.

1. zadatak

Postavka

Šta se smatra multiprocesorskim računarskim sistemom? Šta je simetričan multiprocesorski sistem?

Rešenje

Multiprocesorski sistem je sistem sa više procesora koji imaju zajedničku memoriju. Simetričan multiprocesorski sistem znači da su svi procesori opšte namene, jednaki i imaju isto vreme pristupa operativnoj memoriji. Asimetrični multiprocesorski sistem ima i specijalizovane procesore ili procesore sa različitim vremenom pristupa memoriji.

2. zadatak

Postavka

Neki procesor prilikom obrade prekida prebacuje svoje izvršavanje na korišćenje posebnog pokazivača steka koji se koristi u privilegovanom režimu rada, i pritom čuva sve registre na steku na čiji vrh ukazuje ovaj pokazivač. Operativni sistem na ovom procesoru koristi samo jedan sistemski stek za izvršavanje celog kernel koda. Da li se kontekst izvršavanja procesa (kontekst procesora) može čuvati na ovom steku?

Rešenje

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

3. zadatak

Postavka

Korišćenjem niti u školskom jezgru napisati funkciju sum koja kreira nit koja će sabrati sve elemente zadatog niza zadate dužine i rezultat upisati na traženo mesto; u slučaju greške ove funkcije vraćaju negativnu vrednost.

int sum (int array[], size_t size, long* result);

Rešenje

class SumThread {
    public:
        SumThread(int* arr, size_t _size, long* res): array(arr), size(_size), result(res) {}
        void run() {
            long res = 0;
            for (size_t i = 0; i < size; i++) {
                res += array[i];
            }
            *result = res;
        }
    private:
        int* array;
        size_t size;
        long* result;
};

int sum (int array[], size_t size, long* result) {
    if (result == nullptr) return -1;
    SumThread* st = new SumThread(array, size, result);
    st->start();
    st->waitToComplete();
    return 0;
}

4. zadatak

Postavka

Napisati pseudokod koji obezbeđuje međusobno isključenje pristupa kritičnoj sekciji dva procesa pomoću Petersonovog algoritma.

Rešenje

shared var turn : integer := 1, flag1, flag2 : boolean := false;
process P1
begin
    loop
        flag1 := true;
        turn := 2;
        while flag2 and turn = 2 do null;
        <critical section>
        flag1 := false;
        <non-critical section>
    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 P2;

5. zadatak

Postavka

Zbog čega operativni sistem ne radi zamenu (swapping) procesa njegovim izbacivanjem iz memorije prilikom svake promene konteksta, kada procesu koji je izgubio procesor memorija svakako nije potrebna?

Rešenje

Zato što je pristup hard disku vrlo spor te će takva implementacija znatno uticati na performanse. Ovo se primenjivalo na Windows 3.1, i bilo je vrlo sporo. Danas, swapping se koristi kada nema dovoljno mesta u operativnoj memoriji.

6. zadatak

Postavka

Šta je kompakcija kod kontinualne alokacije memorije?

Rešenje

Kod kontinualne alokacije može doći do eksterne fragmentacije, odnosno da su slobodni fragmenti toliko mali da ni jedan proces ne može stati na tom delu, ali zbirno ih ima dovoljno za neki procos. Kompakcija rešava taj problem realokacijom svih zauzetih delova i spajanjem svih slobodnih fragmenata u jedan veliki slobodan fragment. Dok se dešava kompakcija, nijedan proces koji se pomera se ne može izvršavati.

7. zadatak

Postavka

Virtuelni adresni prostor je velične 8GB, a adresibilna jedinica je 16-bitna reč. Stranica je veličine 4KB, a preslikavanje je u dva nivoa, s tim da PMT prvog nivoa ima dva puta manje ulaza nego PMT drugog nivoa. Prikazati strukturu virtuelne adrese i označiti širinu svakog polja.

Rešenje

VA(32): Page1(10), Page2(11), Offset(11)

8. zadatak

Postavka

Navesti tipične usluge operativnog sistema vezane za pristup blokovski orijentisanom ulaznom uređaju sa direktnim pristupom i predložiti potpise odgovarajućih funkcija za te sistemske pozive.

Rešenje

Osnovne usluge jesu pisanje i čitanje.

int readBlock(int fd, BlockNo block, void* buffer);
int writeBlock(int fd, BlockNo block, void* buffer);

9. zadatak

Postavka

Objasniti koncept ACL (access control list).

Rešenje

Da bi se fajlovi zaštitili, jedan način je da se ograniče prava pristupa korisnika. Potrebno je definisati koji korisnik (ili grupa korisnika) može da izvršava koju operaciju. Jedan pristup je svakom fajlu pridružiti listu ovih parova (korisnik i operacija). Takva lista je lista kontrole pristupa (ACL).

10. zadatak

Postavka

Fajl sistem primenjuje FAT 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. Globalna promenljiva fat_free_head sadrži broj prvog bloka (glavu liste), a fat_free_tail poslednjeg bloka (rep liste) u lancu slobodnih. FAT je u memoriju učitana kao niz. Napisati funkciju jezgra truncate koja briše sadržaj fajla na čiji FCB ukazuje argument.

Rešenje

const unsigned long FAT_SIZE = ...;
unsigned long FAT[FAT_SIZE];

void truncate(FCB* file) {
    unsigned long b = file->head;
    for (unsigned long i = 0; i < file->size; ++i) {
        unsigned long next = FAT[b];
        FAT[b] = 0;
        // Ovde se smatra da fat_free_tail pokazuje na blok 0 kada nema slobodnih blokova.
        if (fat_free_tail) {
            FAT[fat_free_tail] = b;
            fat_free_tail = b;
        } else {
            fat_free_head = b;
            fat_free_tail = b;
        }
        b = next;
    }
    file->size = 0;
    file->head = 0;
}