ОС1/Јун 2021
1. задатак
Поставка
Шта је системски позив, а шта системски програм?
Решење
Системски позив је одређена функционалност коју оперативни систем пружа корисничким програмима. Кориснички програми могу позвати системски позив, често коришћењем механизма софтверских прекида, како би од оперативног система затражили неке основне услуге којима најчешће из корисничког режима и немају приступ. Пример системског позива би био fork()
на Униx-лике системима.
Системски програм је програм који обавља основне операције са корисничким системом, на пример брисање фајлова (rm
на Униx-лике системима).
2. задатак
Поставка
Шта су недостаци организације меморије са партицијама?
Решење
- Појављује се интерна фрагментација, јер ако процесу не треба цео свој меморијски простор онда је резервисани део простора који тај процес не користи беспотребно бачен.
- Балансира се између величине адресног простора једног процеса и укупног броја процеса.
3. задатак
Поставка
Корисник неког рачунара ради у веб прегледачу (wеб броwсер) у ком је отворио велики број картица (таб) у којима прегледа различите сајтове. Приметио је да му се рачунар понаша необично, да споро реагује на акције (има велико време одзива), да споро приказује садржај страница итд.
- Прецизно објаснити зашто се ово дешава.
- Корисник је даље приметио да када затвори већину картица и остави свега две-три, рачунар се не понаша ништа боље. Али када угаси цео прегледач, рачунар се поново понаша ваљано. Прецизно објаснити узрок оба ова поншаања[сиц].
Решење
- Веб прегледачи обично за сваки таб покрену одвојену нит, тако да се са више табова чешће дешава промена контекста. Поред тога, веће је заузеће меморије, и може да се дешава да се све странице у физичком адресном простору потроше па мора да се ради замена страница, што захтева споре операције уписа и читања са спољашње меморије, а може доћи и до батргања.
- Могуће је да претраживач не ослободи све ресурсе које је заузео, па се гашењем табова не ослободи коришћена меморија. Када се угаси цео процес, оперативни систем ће ослободити све ресурсе које је процес користио па ће моћи да настави са нормалнијим радом.
4. задатак
Поставка
На језику C, коришћењем системских позива fork()
и execlp()
за Униx, написати програм који покреће други програм из фајла чији је назив задат као параметар командне линије првог.
Решење
int main(int argc, char* argv[]) {
if (argc < 2) {
// Korisnička greška.
return -1;
}
pid_t pid = fork();
if (fork < 0) {
// Nije uspeo fork().
return -2;
} else if (fork == 0) {
char* args[] = {argv[0], argv[1]};
execlp(argv[0], args);
// Nije uspeo execlp().
return -3;
}
return 0;
}
5. задатак
Поставка
Коришћењем стандардних бројачких семафора у школском језгру, на језику C++ написати глобалне декларације и иницијализације, као и код тела две упоредне нити А и Б које циклично раде:
- А: уписује вредност у дељене променљиве
x
иy
, а затим чека да процес Б упише збирx
иy
у променљивуz
чију вредност онда исписује на стандардни излаз; - Б: чека да процес А упише вредности у дељене променљиве
x
иy
, затим ове две вредности сабира и збир уписује у дељену променљивуz
.
Решење
#include <iostream>
Semaphore waitA(0);
Semaphore waitB(0);
class A : public Thread {
public:
virtual void run() {
while (true) {
x = 1;
y = 2;
waitA.signal();
waitB.wait();
std::cout << z << std::endl;
}
}
};
class B : public Thread {
public:
virtual void run() {
while (true) {
waitA.wait();
z = x + y;
waitB.signal();
}
}
};
int main(void) {
A a;
B b;
a.start();
b.start();
a.join();
b.join();
return 0;
}
6. задатак
Поставка
Којом техником се недељиви уређај може учинити виртуелно дељивим? Навести класичан пример таквог уређаја за који се најчешће примењује ова техника
Решење
Техником споолинг се недељеви уређај може учинити виртуелно дељивим, и класичан пример таквог уређаја је штампач.
7. задатак
Поставка
Неки фајл систем користи индексирани приступ алокацији фајлова са индексима у два нивоа, блоком величине 256КБ и 64-битним адресама физичких блокова. Колика је максимална величина фајла у овом систему?
Решење
Максимална величина фајла се достиже када сви улази у индекс првог нивоа показују на индексе другог нивоа, а сви индекси другог нивоа показују на заузете блокове. Индекси првог и другог нивоа су величине једног блока, тако да се број улаза у индексу добија дељењем величине блока () и величине улаза (): . То значи да је могуће адресирати индекса другог нивоа, и из сваког индекса другог нивоа адресирати блокова, а у сваком блоку има , тако да је крајња максимална величина једнака .