ОС1/Јул 2020
1. задатак
Поставка
На асемблеру неког замишљеног РИСЦ процесора са лоад/сторе архитектуром написати програм који врши пренос блока података из меморије на излазни уређај техником програмираног излаза коришћењем прозивања (поллинг). Самостално усвојити потребне детаљне претпоставке.
Решење
Претпоставке:
- Меморија се преноси са адресе 1000х
- Улазно/излазни и адресни простор су раздвојени
- Контролни регистар уређаја је на ФФ00х, регистар података на ФФ01х а статусни регистар на ФФ02х
- Адресирање је бајтовско
- Блок је величине 100х бајтова
- Регистри су величине 16 бита и кад се чита или пише из меморије или на уређај користи се најнижих 8 бита
- Најнижи бит контролног регистра је бит Старт, најнижи бит статусног регистра је бит Реадy
- Периферија аутоматски постаје неспремна за упис следећег податка када се у њу упише податак који се још није пренео
load r0, #1000h ; adresa
load r1, #100h ; brojač
load r2, #0 ; nula
load r3, #1 ; privremeni registar
out FF00h, r3 ; pokrećemo periferiju
loop: in FF02h, r3 ; čitamo statusni registar
and r3, r3, #1 ; proveravamo ready bit
jz loop ; ako je ready = 0 čitamo ponovo
load r3, (r0) ; učitavamo podatak iz memorije
out FF01h, r3 ; šaljemo podatak na periferiju
inc r0 ; inkrementiramo adresu
dec r1 ; dekrementiramo brojač (postavlja se PSW)
jnz loop ; ako brojač != 0 vraćamo se na čekanje
load r3, #0 ; gasimo periferiju
out FF00h, r3
2. задатак
Поставка
Коришћењем школског језгра написати код класе која апстрахује нит која, уколико се креира са непарним целобројним параметром, креира још једну такву исту нит, само са за један мањим истим целобројним параметром (све док не стигне до 0), а у супротном се само завршава.
Решење
class ForkThread : public Thread {
public:
ForkThread(unsigned n) : n(n) {}
protected:
virtual void run();
private:
unsigned n;
};
void ForkThread::run() {
if (n % 2) {
ForkThread thr(n-1);
thr.start();
thr.join();
}
}
3. задатак
Поставка
У неком систему примењује се бест-фит алгоритам континуалне алокације меморије. Иницијално је простор величине 512КБ потпуно слободан за алокацију корисничких процеса. Потом су различити процеси задавали следеће захтеве (словна ознака означава процес који је поставио захтев, бројна ознака означава величину алоцираног простора у КБ, а минус означава гашење процеса и ослобађање његове меморије):
- А128, Б32, Ц256, Д64, А-, Е16, Ф64, Б-
Одговорити на следећа питања која се односе на стање меморије након ове секвенце захтева:
- Колико је укупно слободних фрагмената?
- Колика је величина најмањег слободног фрагмента?
- Колика је величина највећег слободног фрагмента?
Решење
По корацима, алокација меморије ће изгледати овако (једно слово = 16КБ):
AAAAAAAABBCCCCCCCCCCCCCCCCDDDD-- --------BBCCCCCCCCCCCCCCCCDDDD-- --------BBCCCCCCCCCCCCCCCCDDDDE- FFFF----BBCCCCCCCCCCCCCCCCDDDDE- FFFF------CCCCCCCCCCCCCCCCDDDDE-
- 2 су слободна фрагмента.
- Најмањи слободан фрагмент је 16КБ.
- Највећи слободан фрагмент је 96КБ.
4. задатак
Поставка
Виртуелна меморија организована је странично, а адресибилна јединица је бајт. Виртуелна адреса је 32-битна, страница је величине 4КБ, ПМТ је организована у два нивоа, дескриптор странице је 32-битни у табелама оба нивоа, при чему је поље за страничење првог нивоа величине 8 бита. Колики простор би укупно заузимала ПМТ неког процеса када би тај процес:
- користио цео свој виртуелни адресни простор?
- алоцирао само један логички сегмент величине само једне странице?
Решење
Адреса има структуру ВА(32): Паге1(8) Паге2(12) Оффсет(12). ПМТ првог нивоа има улаза, а ПМТ другог нивоа , и оба имају улазе величине бајтова.
5. задатак
Поставка
Уместо технике споолинг, приступ упоредних процеса штампачу у неком систему омогућује се међусобним искључењем помоћу операције резервације: сваки процес, пре него што затражи било коју операцију са штампачем, мора да га резервише, а ту резервацију отпушта тек када заврши са целим једним послом штампе. Шта је недостатак ове технике?
Решење
Недостатак ове технике је што се процеси док чекају на штампач блокирају, а за то време су могли да раде нешто корисније.
6. задатак
Поставка
Неки фајл систем пружа следеће операције у свом АПИ за текстуалне фајлове:
ФХАНДЛЕ опен(цхар* филенаме)
Отвара фајл са датим именом.воид цлосе(ФХАНДЛЕ)
Затвара дати фајл.инт сизе(ФХАНДЛЕ)
Враћа тренутну величину садржаја фајла у знаковима.воид аппенд(ФХАНДЛЕ, инт)
Проширује садржај фајла за дати број знакова на крају.воид сеек(ФХАНДЛЕ, инт)
Поставља курзор датог фајла на дату позицију (редни број знака почев од 0).воид wрите(ФХАНДЛЕ, цхар*)
На позицију курзора датог фајла уписује дати низ знакова, не укључујући завршни знак ‘\0’, и помера курзор иза уписаног низа знакова.
Написати програм који на крај постојећег фајла са именом proba.txt
уписује све што је унесено преко стандардног улаза, све док се на улазу не унесе знак ’X’. Занемарити све потенцијалне грешке у улазу/излазу.
Решење
int main(void) {
FHANDLE file = open("proba.txt");
seek(file, size(file));
char buf[2];
buf[1] = '\0';
while (true) {
buf[0] = getchar();
if (buf[0] == 'X') {
break;
}
append(file, 1);
write(file, buf);
}
close(file);
return 0;
}
7. задатак
Поставка
Колико приступа блоковима на диску треба извршити за приступ н-том логичком блоку садржаја фајла ако је алокација фајла
- ФАТ, при чему је ФАТ увек иницијално учитана у меморију приликом монтирања фајл система,
- индексна, при чему је цео индекс фајла у једном блоку, а број тог блока записан је у ФЦБ који је учитан приликом отварања фајла?
Решење
- 1, јер је ФАТ већ у меморији па се само треба приступити блоку који је тражен.
- 2, један да се прочита блок са индексом и један да се приступи блоку који је тражен.