ОС1/Август 2020 — разлика између измена
мНема описа измене |
м (Latinifikacija, rešenje 5. zadatka i sekcionisanje) |
||
| Ред 1: | Ред 1: | ||
{{tocright}} | {{tocright}} | ||
== 1. zadatak == | |||
=== Postavka === | |||
Ako se nad sledećim programom kreira jedan proces, koliko će ukupno procesa biti kreirano (uključujući i taj jedan početni), pod pretpostavkom da su svi sistemski pozivi uspeli? | |||
<syntaxhighlight lang='c'> | |||
void main { | void main { | ||
for (int i=0; (i<3) && fork(); i++); | for (int i=0; (i<3) && fork(); i++); | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Rešenje === | |||
Odgovor: 4 | |||
* P1 pravi dete P2 i inkrementira svoje ''i''. | |||
* P2 je dete, te ''fork()'' vraća 0 u kontekstu dete, kako uslov nije ispunjen, završava se ''for'' ciklus. | |||
* P1 pravi dete P3 i inkrementira svoje ''i''. | |||
* P1 pravi dete P4 i inkrementira svoje ''i''. | |||
* P3 i P4 se isto završavaju kao proces P2. | |||
* P1 završava svoj ''for'' ciklus jer je ''i'' postalo 3. | |||
== 2. zadatak == | |||
=== Postavka === | |||
Šta je problem sledeće implementacije kritične sekcije uposlenim čekanjem? | |||
<syntaxhighlight lang="ada"> | |||
process P1 | process P1 | ||
begin | begin | ||
| Ред 42: | Ред 48: | ||
end P2; | end P2; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Rešenje === | |||
Ova dva procesa ne obezbeđuju međusobno isključenje jer oba procesa mogu pročitati odgovarajući ''flag'' i ući u kritičnu sekciju. Da bi ovo popravili možemo koristiti Petersnov algoritam. | |||
== 3. zadatak == | |||
=== Postavka === | |||
Šta je osnovna razlika između tehnike dinamičkog učitavanja i tehnike preklopa (overlays)? | |||
=== Rešenje === | |||
Dinamičko učitavanje alocira memoriju za neki proces tek kada mu je ona potrebna. Preklopi funkcionišu na isti način ali koriste se činjenicom da se neki deo nikad ne koristi u isto vreme kada i neki drugi deo, već naizmenično, pa se oni dinamički učitavaju na istom mestu. Takoreći se preklapaju. | |||
== 4. zadatak == | |||
=== Postavka === | |||
Ukratko objasniti zašto je kod segmentne organizacije virtuelne memorije obavezna provera prekoračenja granice segmenta prilikom svakog adresiranja, a kod stanične organizacije ta provera ne postoji. | |||
=== Rešenje === | |||
Segmentna organizacija funkcioniše tako što se nađe određeni segment, odnosno bazna adresa tog segmenta, zatim se doda pomeraj (''offset''). Moguće je da pomeraj prelazi veličinu segmenta te je obavezna provera za ovakvu grešku. Stranična organizacija s druge strane, zapravo i ne poznaje koncept segmenta. Preslikavanje je realizovano traženjem fizičke adrese okvira u odnosu na virtuelnu adresu stranicec koja je uvek iste veličine. Pomeraj takođe ne može biti veći od stranice i on se ne sabira sa adresom već se dodaje na kraju same adrese. | |||
== 5. zadatak == | |||
=== Postavka === | |||
U nekom sistemu postoje sledeći sistemski pozivi: | |||
<syntaxhighlight lang="c"> | |||
int async_write (const char* buffer); | int async_write (const char* buffer); | ||
void wait (int request_id); | void wait (int request_id); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Operacija <code>async_write</code> asinhrono zadaje operaciju izlaza datog niza znakova na neki izlazni uređaj i vraća interni sistemski identifikator tog zahteva (veći od 0), odnosno kod greške (manji od nula). Operacija <code>wait</code> suspenduje pozivajući proces sve dok operacija sa datim identifikatorom nije završena. Korišćenjem ovih sistemskih poziva, realizovati sinhroni izlaz (funkcija treba da vraća 0 u slučaju uspeha, a kod greške u suprotnom): | |||
<syntaxhighlight lang="c"> | |||
int sync_write (char* buffer); | int sync_write (char* buffer); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Rešenje === | |||
<syntaxhighlight lang="c"> | |||
int sync_write(char* buffer) { | |||
int request = async_write(buffer); | |||
if (request < 0) { | |||
return request; | |||
} | |||
wait(request); | |||
return request; | |||
} | |||
</syntaxhighlight> | |||
== 6. zadatak == | |||
=== Postavka === | |||
Kakav problem može nastati kod ulančane alokacije fajla ako se greškom promeni sadržaj bloka u kom je smešten deo sadržaja nekog fajla? | |||
=== Rešenje === | |||
U slučaju kada se desi greška na sadršaj nekog fajla, ta greška može oštetiti sam pokazivač na sledeći element u listi te ili prekinuti ulančanu listu ili greška bude takva da sada to pokazuje na neki deo nekog drugog fajla. Pa kada bude čitao fajl može nastaviti na tamo. | |||
== 7. zadatak == | |||
=== Postavka === | |||
Ukratko objasniti šta je inkrementalni, a šta totalni bekap (''backup'') fajl sistema i navesti primer operativnog sistema koji ima ugrađenu podršku za inkrementalni bekap. | |||
=== Rešenje === | |||
Totalni bekap kopira sve fajlove iz jednog fajl sistema ili njegovog dela nezavisno od toga da li su bili izmenjeni od prošlog bekapa ili nisu. Neki fajlovi se bespotrebno kopiraju. Inkrementalni bekap kopira samo izmenjene fajlove. ''Mac OS X'' ima podršku inkrementalnog bekapa, tako što ili eksplicitno ili automatski pokrene bekap kada se poveže hard disk uređaj koji je za to namenjen. | |||
[[Категорија:Рокови]] | [[Категорија:Рокови]] | ||
[[Категорија:ОС1]] | [[Категорија:ОС1]] | ||
Верзија на датум 29. јун 2021. у 15:24
1. zadatak
Postavka
Ako se nad sledećim programom kreira jedan proces, koliko će ukupno procesa biti kreirano (uključujući i taj jedan početni), pod pretpostavkom da su svi sistemski pozivi uspeli?
void main {
for (int i=0; (i<3) && fork(); i++);
}
Rešenje
Odgovor: 4
- P1 pravi dete P2 i inkrementira svoje i.
- P2 je dete, te fork() vraća 0 u kontekstu dete, kako uslov nije ispunjen, završava se for ciklus.
- P1 pravi dete P3 i inkrementira svoje i.
- P1 pravi dete P4 i inkrementira svoje i.
- P3 i P4 se isto završavaju kao proces P2.
- P1 završava svoj for ciklus jer je i postalo 3.
2. zadatak
Postavka
Šta je problem sledeće implementacije kritične sekcije uposlenim čekanjem?
process P1
begin
loop
while flag2 = true do null end; (* Busy wait *)
flag1 := true;
<critical section>
(* Critical section *)
flag1 := false;
(* Exit protocol *)
<non-critical section>
end
end P1;
process P2
begin
loop
while flag1 = true do null end; (* Busy wait *)
flag2 := true;
<critical section>
(* Critical section *)
flag2 := false;
(* Exit protocol *)
<non-critical section>
end
end P2;
Rešenje
Ova dva procesa ne obezbeđuju međusobno isključenje jer oba procesa mogu pročitati odgovarajući flag i ući u kritičnu sekciju. Da bi ovo popravili možemo koristiti Petersnov algoritam.
3. zadatak
Postavka
Šta je osnovna razlika između tehnike dinamičkog učitavanja i tehnike preklopa (overlays)?
Rešenje
Dinamičko učitavanje alocira memoriju za neki proces tek kada mu je ona potrebna. Preklopi funkcionišu na isti način ali koriste se činjenicom da se neki deo nikad ne koristi u isto vreme kada i neki drugi deo, već naizmenično, pa se oni dinamički učitavaju na istom mestu. Takoreći se preklapaju.
4. zadatak
Postavka
Ukratko objasniti zašto je kod segmentne organizacije virtuelne memorije obavezna provera prekoračenja granice segmenta prilikom svakog adresiranja, a kod stanične organizacije ta provera ne postoji.
Rešenje
Segmentna organizacija funkcioniše tako što se nađe određeni segment, odnosno bazna adresa tog segmenta, zatim se doda pomeraj (offset). Moguće je da pomeraj prelazi veličinu segmenta te je obavezna provera za ovakvu grešku. Stranična organizacija s druge strane, zapravo i ne poznaje koncept segmenta. Preslikavanje je realizovano traženjem fizičke adrese okvira u odnosu na virtuelnu adresu stranicec koja je uvek iste veličine. Pomeraj takođe ne može biti veći od stranice i on se ne sabira sa adresom već se dodaje na kraju same adrese.
5. zadatak
Postavka
U nekom sistemu postoje sledeći sistemski pozivi:
int async_write (const char* buffer);
void wait (int request_id);
Operacija async_write asinhrono zadaje operaciju izlaza datog niza znakova na neki izlazni uređaj i vraća interni sistemski identifikator tog zahteva (veći od 0), odnosno kod greške (manji od nula). Operacija wait suspenduje pozivajući proces sve dok operacija sa datim identifikatorom nije završena. Korišćenjem ovih sistemskih poziva, realizovati sinhroni izlaz (funkcija treba da vraća 0 u slučaju uspeha, a kod greške u suprotnom):
int sync_write (char* buffer);
Rešenje
int sync_write(char* buffer) {
int request = async_write(buffer);
if (request < 0) {
return request;
}
wait(request);
return request;
}
6. zadatak
Postavka
Kakav problem može nastati kod ulančane alokacije fajla ako se greškom promeni sadržaj bloka u kom je smešten deo sadržaja nekog fajla?
Rešenje
U slučaju kada se desi greška na sadršaj nekog fajla, ta greška može oštetiti sam pokazivač na sledeći element u listi te ili prekinuti ulančanu listu ili greška bude takva da sada to pokazuje na neki deo nekog drugog fajla. Pa kada bude čitao fajl može nastaviti na tamo.
7. zadatak
Postavka
Ukratko objasniti šta je inkrementalni, a šta totalni bekap (backup) fajl sistema i navesti primer operativnog sistema koji ima ugrađenu podršku za inkrementalni bekap.
Rešenje
Totalni bekap kopira sve fajlove iz jednog fajl sistema ili njegovog dela nezavisno od toga da li su bili izmenjeni od prošlog bekapa ili nisu. Neki fajlovi se bespotrebno kopiraju. Inkrementalni bekap kopira samo izmenjene fajlove. Mac OS X ima podršku inkrementalnog bekapa, tako što ili eksplicitno ili automatski pokrene bekap kada se poveže hard disk uređaj koji je za to namenjen.