ОС1/Модификације јул 2021 — разлика између измена
< ОС1
Пређи на навигацију
Пређи на претрагу
(nisam siguran jel sve ovako) |
(→Решење - тест: big fix) |
||
| (Нису приказане 4 међуизмене 2 корисника) | |||
| Ред 8: | Ред 8: | ||
== 20 поена == | == 20 поена == | ||
* Направити програм који креира 50 нити које циклично чекају на догађају тастатуре (9h), па онда симулирају рад локалним семафором или упосленим чекањем. | * Направити програм који креира 50 нити које циклично чекају на догађају тастатуре (9h), па онда симулирају рад локалним семафором или упосленим чекањем. | ||
* Приоритет догађаја поставити на ID нити. | |||
* За бирање дужине чекања користити функцију <code>rand()</code> из <code>stdlib.h</code> | * За бирање дужине чекања користити функцију <code>rand()</code> из <code>stdlib.h</code> | ||
* У методи <code>Event::wait()</code> догађаја додати да се пре блокирања исписује '''<code>BLOCKED - THREAD ID = x</code>''', где је x ID нити. | * У методи <code>Event::wait()</code> догађаја додати да се пре блокирања исписује '''<code>BLOCKED - THREAD ID = x</code>''', где је x ID нити. | ||
* Након ослобађања догађаја треба да се испише '''<code>SIGNALED - THREAD ID = x</code>'''. | * Након ослобађања догађаја треба да се испише '''<code>SIGNALED - THREAD ID = x</code>''', где је x ID нити. | ||
== 30 поена == | == 30 поена == | ||
=== Поставка === | |||
* Направити програм који '''<code>fork()</code>ом''' креира 50 нити које циклично чекају на догађају тастатуре (9h), па онда симулирају рад локалним семафором или упосленим чекањем. | * Направити програм који '''<code>fork()</code>ом''' креира 50 нити које циклично чекају на догађају тастатуре (9h), па онда симулирају рад локалним семафором или упосленим чекањем. | ||
* Приоритет догађаја поставити на ID нити. | |||
* За бирање дужине чекања користити функцију <code>rand()</code> из <code>stdlib.h</code> | * За бирање дужине чекања користити функцију <code>rand()</code> из <code>stdlib.h</code> | ||
* У методи <code>Event::wait()</code> догађаја додати да се пре блокирања исписује '''<code>BLOCKED - THREAD ID = x</code>''', где је x ID нити. | * У методи <code>Event::wait()</code> догађаја додати да се пре блокирања исписује '''<code>BLOCKED - THREAD ID = x</code>''', где је x ID нити. | ||
* Након ослобађања догађаја треба да се испише '''<code>SIGNALED - THREAD ID = x</code>''', где је x ID нити. | * Након ослобађања догађаја треба да се испише '''<code>SIGNALED - THREAD ID = x</code>''', где је x ID нити. | ||
=== Решење - тест === | |||
<syntaxhighlight lang=cpp> | |||
#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(); | |||
} | |||
</syntaxhighlight> | |||
[[Категорија:ОС1]] | |||
[[Категорија:Лабораторијске вежбе]] | |||
Тренутна верзија на датум 12. јул 2021. у 21:16
Следеће модификације су се појавиле на одбрани пројекта у јулском року 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();
}