ОС1/Јул 2011
1. задатак
Поставка
Ако се над следећим програмом креира један процес, колико ће укупно процеса бити креирано (укључујући и тај један почетни), под претпоставком да су сви системски позиви успели?
const int N = 2;
int pid[N];
void main {
for (int i = 0; i < N; i++) pid[i] = fork();
}
Решење
Петља укупно има две итерације. У првој итерацији почетни процес прави један други, док у другој итерацији оба процеса праве још један, па на крају има 4 процеса.
2. задатак
Поставка
Шта је разлика између „тешког“ процеса и нити (тхреад)?
Решење
Тешки процес (или само процес) је једно извршавање једног програма са сопственим адресним простором односно меморијским контекстом, док се сваки ток контроле који користи тај адресни простор зове лаки процес (или нит).
3. задатак
Поставка
Шта је проблем следеће имплементације критичне секције упосленим чекањем?
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;
Решење
Не обезбеђује међусобно искључење, долази до утркивања.
4. задатак
Поставка
На језику C++ имплементирати класу BoundedBuffer која реализује ограничени бафер елемената типа Data капацитета N помоћу семафора.
Решење
const int N = ...;
class Data;
class BoundedBuffer {
public:
BoundedBuffer();
void append(Data*);
Data* take();
private:
Semaphore mutex, spaceAvailable, itemAvailable;
Data* buffer[N];
int head, tail;
};
BoundedBuffer::BoundedBuffer() : mutex(1), spaceAvailable(N), itemAvailable(0), head(0), tail(0) {}
void BoundedBuffer::append(Data* d) {
spaceAvailable.wait();
mutex.wait();
buffer[tail] = d;
tail = (tail + 1) % N;
mutex.signal();
itemAvailable.signal();
}
Data* BoundedBuffer::take() {
itemAvailable.wait();
mutex.wait();
Data* d = buffer[head];
head = (head + 1) % N;
mutex.signal();
spaceAvailable.signal();
return d;
}
5. задатак
Поставка
Шта је основна разлика између технике динамичког учитавања и технике преклопа (оверлаyс)?
Решење
Техником динамичког учитавања процес алоцира меморију и из фајлова учитава делове само ако су стварно потребни.
Техника преклопа подразумева да се модули у којима су груписани програми и/или подаци који се користе заједно а у алтернацији са другим модулима динамички учитавају у меморију и избацују из ње на исто место, преклапајући се са оним модулима са којима нису потребни истовремено.
Разлике су у томе што:
- више модула се наизменично учитава на исто место у виртуелном адресном простору процеса, преклапајући се,
- модул може бити одсутан не само када му се први пут приступи, него и касније, јер је на његово место учитан неки други модул, па програм о томе мора да води рачуна; програм мора да води рачуна о томе који је од преклопљених модула тренутно учитан на датом месту, као и о томе да је пре приступа одређеном потпрограму/податку модул у коме се он налази сигурно учитан, исто као и код динамичког учитавања, и
- ако неки модул који се преклапа садржи податке који се мењају, пре него што се на његово место учита неки други модул, мора се сачувати садржај избаченог модула уписом у неки фајл, ако ће тај модул касније бити поново употребљаван.
6. задатак
Поставка
Укратко објаснити зашто је код сегментне организације виртуелне меморије обавезна провера прекорачења границе сегмента приликом сваког адресирања, а код станичне организације та провера не постоји.
Решење
Код сегментне организације виртуелне меморије обавезно се проверава прекорачење границе сегмента јер ако прелази лимит то значи да је процес адресирао виртуелну адресу изван декларисаног сегмента. Код страничне организације виртуелни адресни простор процеса је подељен на странице исте величине а физички оквири су исте величине као странице.
7. задатак
Поставка
У неком систему постоје следећи системски позиви:
int async_write (char* buffer);
void wait (int request_id);
Операција async_write асинхроно задаје операцију излаза датог низа знакова на неки излазни уређај и враћа интерни системски идентификатор тог захтева (већи од 0), односно код грешке (мањи од нула). Операција wаит суспендује позивајући процес све док операција са датим идентификатором није завршена. Коришћењем ових системских позива, реализовати синхрони излаз: инт сyнц_wрите (цхар* буффер);
Решење
int sync_write (char* buffer) {
int id = async_write(buffer);
if (id < 0) {
return id;
}
wait(id);
return 0;
}
8. задатак
Поставка
Укратко објаснити како се у Униx фајл систему дефинишу права приступа до фајла.
Решење
По 3 бита (рwx) за власника, групу и остале (укупно 9 битова) одређују права приступа до фајла.
9. задатак
Поставка
Навести разлог зашто би неки фајл систем користио кластере на диску различите величине.
Решење
Због смањења интерне фрагментације.
10. задатак
Поставка
Укратко објаснити шта је инкрементални, а шта тотални бекап (бацкуп) фајл система?
Решење
- Инкрементални бекап: бекапују се само измењени фајлови.
- Тотални бекап: копирају се сви фајлови из једног фајл система или његовог дела.