ОС1/Јул 2019 — разлика између измена
м (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. | |||
== 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. | == 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> | |||
=== Rešenje === | === Rešenje === | ||
<syntaxhighlight lang=" | <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. | == 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=" | <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. | == 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. | == 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, | 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. | == 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 | VA(32): Page1(10), Page2(11), Offset(11) | ||
== 8. | == 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> | |||
== 9. zadatak == | |||
== 9. | |||
=== 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. | == 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
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;
}