ОС1/Модификације јул 2021
< ОС1
Пређи на навигацију
Пређи на претрагу
Следеће модификације су се појавиле на одбрани пројекта у јулском року 2021.
Основа
- Треба прошити класу
IVTEntry
тако да може сигналује више догађаја у редоследу по приоритетима. - Треба изменити конструктор класе
Event::Event(IVTNo ivtNo, int priority)
тако да прима приоритет по ком ће се ослобађати (већи је приоритетнији).
20 поена
- Направити програм који креира 50 нити које циклично чекају на догађају тастатуре (9h), па онда симулирају рад локалним семафором или упосленим чекањем.
- Приоритет догађаја поставити на ID нити.
- За бирање дужине чекања користити функцију
rand()
изstdlib.h
- У методи
Event::wait()
догађаја додати да се пре блокирања исписујеBLOCKED - THREAD ID = x
, где је x ID нити. - Након ослобађања догађаја треба да се испише
SIGNALED - THREAD ID = x
, где је x ID нити.
30 поена
Поставка
- Направити програм који
fork()
ом креира 50 нити које циклично чекају на догађају тастатуре (9h), па онда симулирају рад локалним семафором или упосленим чекањем. - Приоритет догађаја поставити на ID нити.
- За бирање дужине чекања користити функцију
rand()
изstdlib.h
- У методи
Event::wait()
догађаја додати да се пре блокирања исписујеBLOCKED - THREAD ID = x
, где је x ID нити. - Након ослобађања догађаја треба да се испише
SIGNALED - THREAD ID = x
, где је x ID нити.
Решење - тест
#include <stdlib.h>
#include <thread.h>
#include <semaphore.h>
#include <event.h>
#include <intLock.h> // iz javnog testa
PREPAREENTRY(9,1); // bitno je da se zove stara rutina
int userMain(int argc, char* argv[]) {
for(int i = 0; i < 50; i++){
int pid = Thread::fork();
if (pid) continue;
Event keyboard(9, Thread::getRunningId());
Semaphore waiter(0);
while(1){
keyboard.wait(); // čekamo
intLock
printf("SIGNALED - THREAD ID = %d", Thread::getRunningId());
intUnlock
waiter.wait(rand()%10+1);
}
}
Thread::waitForForkChildren();
}