OS1/Modifikacije jul 2021
< ОС1
Pređi na navigaciju
Pređi na pretragu
Sledeće modifikacije su se pojavile na odbrani projekta u julskom roku 2021.
Osnova
- Treba prošiti klasu
IVTEntry
tako da može signaluje više događaja u redosledu po prioritetima. - Treba izmeniti konstruktor klase
Event::Event(IVTNo ivtNo, int priority)
tako da prima prioritet po kom će se oslobađati (veći je prioritetniji).
20 poena
- Napraviti program koji kreira 50 niti koje ciklično čekaju na događaju tastature (9h), pa onda simuliraju rad lokalnim semaforom ili uposlenim čekanjem.
- Prioritet događaja postaviti na ID niti.
- Za biranje dužine čekanja koristiti funkciju
rand()
izstdlib.h
- U metodi
Event::wait()
događaja dodati da se pre blokiranja ispisujeBLOCKED - THREAD ID = x
, gde je x ID niti. - Nakon oslobađanja događaja treba da se ispiše
SIGNALED - THREAD ID = x
, gde je x ID niti.
30 poena
Postavka
- Napraviti program koji
fork()
om kreira 50 niti koje ciklično čekaju na događaju tastature (9h), pa onda simuliraju rad lokalnim semaforom ili uposlenim čekanjem. - Prioritet događaja postaviti na ID niti.
- Za biranje dužine čekanja koristiti funkciju
rand()
izstdlib.h
- U metodi
Event::wait()
događaja dodati da se pre blokiranja ispisujeBLOCKED - THREAD ID = x
, gde je x ID niti. - Nakon oslobađanja događaja treba da se ispiše
SIGNALED - THREAD ID = x
, gde je x ID niti.
Rešenje - test
#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();
}