ОС1/Модификације јул 2021 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
м (detalj)
 
(Нису приказане 3 међуизмене 2 корисника)
Ред 11: Ред 11:
* За бирање дужине чекања користити функцију <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 нити.  
* Приоритет догађаја поставити на ID нити.  
Ред 18: Ред 20:
* У методи <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();
}