OS1/Modifikacije jul 2021

Izvor: SI Wiki
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() iz stdlib.h
  • U metodi Event::wait() događaja dodati da se pre blokiranja ispisuje BLOCKED - 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() iz stdlib.h
  • U metodi Event::wait() događaja dodati da se pre blokiranja ispisuje BLOCKED - 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();
}