ОС1/Август 2020 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(Ваљда сви одговори сем петог задатка.)
 
м (→‎Rešenje: Kod treba da vrati 0 u slučaju uspeha, ne broj veći od 0.)
 
(Нису приказане 3 међуизмене 2 корисника)
Ред 1: Ред 1:
{{tocright}}
{{tocright}}
[http://os.etf.bg.ac.rs/OS1/rokovi/2020/avgust/Avg%202020.pdf Zadaci na stranici predmeta.]


#['''3'''] Ако се над следећим програмом креира један процес, колико ће укупно процеса бити креирано (укључујући и тај један почетни), под претпоставком да су сви системски позиви успели?
== 1. zadatak ==
#:<syntaxhighlight lang='c'>
=== 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>
#:Одговор: 4
 
#:Поступак:
=== Rešenje ===
#*P1 прави дете P2 и инкрементира своје ''i''.
Odgovor: 4
#*P2 је дете, те ''fork()'' враћа 0 у контексту дете, како услов није испуњен, завршава се ''for'' циклус.
* P1 pravi dete P2 i inkrementira svoje <code>i</code>.
#*P1 прави дете P3 и инкрементира своје ''i''.
* P2 je dete, te <code>fork()</code> vraća 0 u kontekstu deteta, kako uslov nije ispunjen, završava se <code>for</code> petlja.
#*P1 прави дете P4 и инкрементира своје ''i''.
* P1 pravi dete P3 i inkrementira svoje <code>i</code>.
#*P3 и P4 се исто завршавају као процес P2.
* P1 pravi dete P4 i inkrementira svoje <code>i</code>.
#*P1 завршава свој ''for'' циклус јер је ''i'' постало 3.
* P3 i P4 se isto završavaju kao proces P2.
#['''3'''] Шта је проблем следеће имплементације критичне секције упосленим чекањем?
* P1 završava svoj <code>for</code> ciklus jer je <code>i</code> postalo 3.
#:<syntaxhighlight>
 
== 2. zadatak ==
=== Postavka ===
Šta je problem sledeće implementacije kritične sekcije uposlenim čekanjem?
<syntaxhighlight lang="ada">
process P1
process P1
begin
begin
Ред 42: Ред 49:
end P2;
end P2;
</syntaxhighlight>
</syntaxhighlight>
#:Одговор: Ова два процеса не обезбеђују међусобно искључење јер оба процеса могу прочитати одговарајући ''flag'' и ући у критичну секцију. Да би ово поправили можемо користити Петерснов алгоритам.
 
#['''3'''] Шта је основна разлика између технике динамичког учитавања и технике преклопа (оверлаyс)?
=== Rešenje ===
#:Одговор: Динамичко учитавање алоцира меморију за неки процес тек када му је она потребна. Преклопи функционишу на исти начин али користе се чињеницом да се неки део никад не користи у исто време када и неки други део, већ наизменично, па се они динамички учитавају на истом месту. Такорећи се преклапају.
Ova dva procesa ne obezbeđuju međusobno isključenje jer oba procesa mogu pročitati odgovarajući <code>flag</code> i ući u kritičnu sekciju. Da bi ovo popravili možemo koristiti Petersnov algoritam.
#['''3'''] Укратко објаснити зашто је код сегментне организације виртуелне меморије обавезна провера прекорачења границе сегмента приликом сваког адресирања, а код станичне организације та провера не постоји.
 
#:Одговор: Сегментна организација функционише тако што се нађе одређени сегмент, односно базна адреса тог сегмента, затим се дода померај (''offset''). Могуће је да померај прелази величину сегмента те је обавезна провера за овакву грешку. Странична организација с друге стране, заправо и не познаје концепт сегмента. Пресликавање је реализовано тражењем физичке адресе оквира у односу на виртуелну адресу страницец која је увек исте величине. Померај такође не може бити већи од странице и он се не сабира са адресом већ се додаје на крају саме адресе.
== 3. zadatak ==
#['''3''']У неком систему постоје следећи системски позиви:
=== Postavka ===
#:<syntaxhighlight lang="c">
Š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, 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, u mapi segmenata (SMT) a 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 stranice 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>
#:Операција ''async_write'' асинхроно задаје операцију излаза датог низа знакова на неки излазни уређај и враћа интерни системски идентификатор тог захтева (већи од 0), односно код грешке (мањи од нула). Операција ''wait'' суспендује позивајући процес све док операција са датим идентификатором није завршена. Коришћењем ових системских позива, реализовати синхрони излаз (функција треба да враћа 0 у случају успеха, а код грешке у супротном):
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">
<syntaxhighlight lang="c">
int sync_write (char* buffer);
int sync_write (char* buffer);
</syntaxhighlight>
</syntaxhighlight>
#:Решење:
 
#['''3'''] Какав проблем може настати код уланчане алокације фајла ако се грешком промени садржај блока у ком је смештен део садржаја неког фајла?
=== Rešenje ===
#:Одговор: У случају када се деси грешка на садршај неког фајла, та грешка може оштетити сам показивач на следећи елемент у листи те или прекинути уланчану листу или грешка буде таква да сада то показује на неки део неког другог фајла. Па када буде читао фајл може наставити на тамо.
<syntaxhighlight lang="c">
#['''3'''] Укратко објаснити шта је инкрементални, а шта тотални бекап (''backup'') фајл система и навести пример оперативног система који има уграђену подршку за инкрементални бекап.
int sync_write(char* buffer) {
#:Одговор: Тотални бекап копира све фајлове из једног фајл система или његовог дела независно од тога да ли су били измењени од прошлог бекапа или нису. Неки фајлови се беспотребно копирају. Инкрементални бекап копира само измењене фајлове. ''Mac OS X'' има подршку инкременталног бекапа, тако што или експлицитно или аутоматски покрене бекап када се повеже хард диск уређај који је за то намењен.
    int request = async_write(buffer);
    if (request < 0) {
        return request;
    }
    wait(request);
    return 0;
}
</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 da se desi greška u sadržaju nekog fajla, ta greška može oštetiti sam pokazivač na sledeći element u listi blokova tog fajla. U najgorem slučaju pokazivač može biti promenjen tako da pokazuje na blok nekog drugog fajla, pa se onda i blokovi tog fajla mogu korumpirati.
 
== 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, pa se neki fajlovi bespotrebno kopiraju. Inkrementalni bekap kopira samo izmenjene fajlove. Operativni sistem ''macOS'' ima podršku za inkrementalni bekap, tako što ili eksplicitno ili automatski pokrene bekap kada se poveže hard disk uređaj koji je za to namenjen.


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

Тренутна верзија на датум 17. фебруар 2022. у 00:49

Zadaci na stranici predmeta.

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 deteta, kako uslov nije ispunjen, završava se for petlja.
  • 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, 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, u mapi segmenata (SMT) a 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 stranice 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 0;
}

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 da se desi greška u sadržaju nekog fajla, ta greška može oštetiti sam pokazivač na sledeći element u listi blokova tog fajla. U najgorem slučaju pokazivač može biti promenjen tako da pokazuje na blok nekog drugog fajla, pa se onda i blokovi tog fajla mogu korumpirati.

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, pa se neki fajlovi bespotrebno kopiraju. Inkrementalni bekap kopira samo izmenjene fajlove. Operativni sistem macOS ima podršku za inkrementalni bekap, tako što ili eksplicitno ili automatski pokrene bekap kada se poveže hard disk uređaj koji je za to namenjen.