КДП/Јул 2021 — разлика између измена
м (Rešenje drugog zadatka i još dve postavke) |
(Nije minrank nego signal) |
||
Ред 69: | Ред 69: | ||
queues[STANDARD_VEHICLE].signal(); | queues[STANDARD_VEHICLE].signal(); | ||
} else { | } else { | ||
queues[ANY_VEHICLE]. | queues[ANY_VEHICLE].signal(); | ||
} | } | ||
} else { | } else { | ||
Ред 76: | Ред 76: | ||
queues[LUXURY_VEHICLE].signal(); | queues[LUXURY_VEHICLE].signal(); | ||
} else { | } else { | ||
queues[ANY_VEHICLE]. | queues[ANY_VEHICLE].signal(); | ||
} | } | ||
} | } |
Верзија на датум 14. мај 2022. у 09:14
Поставка овог рока може се наћи са странице предмета.
1. задатак
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Поставка
Код Tie breaker алгоритма за n процеса се догодио следећи случај – приликом извршавања кода за улазак у критичну секцију, свих n процеса су ушли у стање 1 и ниједан још није ушао у стање 2. Одговорити на следећа питања и образложити одговор:
- Да ли процес који је први ушао у стање 1 први улази у стање 2?
- Да ли процес који је први ушао у стање n-2 први улази у критичну секцију?
- Да ли процес који је последњи ушао у стање 1 може да буде трећи који улази у стање 2?
- Да ли процес који је последњи ушао у стање 1 може да буде први који улази у критичну секцију?
Решење
- У општем случају, не мора да значи да ће процес који је први ушао у стање 1 први ући и у стање 2. Пошто се у том тренутку сви процеси налазе у стању 1, било који процес који није последњи стигао у стање 1 ће моћи да први уђе у стање 2. Специјално, у случају када је , процес који је први ушао у стање 1 ће гарантовано први ући у стање 2.
- У првом стању могу да се нађу процеса, у другом стању процеса... том логиком у стању могу да се нађу 3 процеса истовремено. Један од та три процеса ће последњи ући и неће моћи да напредује, док ће остала два моћи да напредују и не гарантује се који од та два процеса ће први напредовати.
- Процес који је последњи ушао у стање 1 ће бити последњи који ће из њега изаћи. Могуће је да он буде трећи који улази у стање 2 уколико је , у супротном не мора да значи.
- Процес који је последњи ушао у стање 1 је последњи који улази у критичну секцију. Да би такође био и први, морало би да важи а то нема смисла.
2. задатак
Поставка
Посматра се агенција за изнајмљивање аутомобила. У возном парку постоје M стандардних возила и N лукс возила. Приликом доласка клијента који жели да изнајми ауто, он се изјашњава да ли жели да изнајми стандардно или лукс возило или му је свеједно. Клијент чека у реду све док му се возило не додели на коришћење. По завршетку коришћења, корисник долази још једном у агенцију и враћа ауто. Потребно је обезбедити да клијенти преузимају своје аутомобиле по редоследу доласка у агенцију. Клијент има могућност да изнајми више возила, али је сваки долазак везан искључиво за позајмицу једног аутомобила. Решити проблем користећи мониторе сa signal and continue дисциплином.
Решење
class CarAgency {
public static final STANDARD_VEHICLE = 0;
public static final LUXURY_VEHICLE = 1;
public static final ANY_VEHICLE = 2;
private int standardVehicles = 100;
private int luxuryVehicles = 10;
private final Condition[] queues = new Condition[3];
private int ticket = 1;
public CarAgency() {
for (int i = 0; i < 3; ++i) {
queues[i] = new Condition();
}
}
public synchronized void rentCar(int which) {
int myTicket = ticket++;
if (
standardVehicles == 0 && which == STANDARD_VEHICLE ||
luxuryVehicles == 0 && which == LUXURY_VEHICLE ||
(standardVehicles == 0 && luxuryVehicles == 0)
) {
// Нема возила, чекамо
queues[which].wait(myTicket);
} else if (which == STANDARD_VEHICLE) {
// Желели смо стандардно возило и добили смо
--standardVehicles;
} else if (which == LUXURY_VEHICLE) {
// Желели смо луксузно возило и добили смо
--luxuryVehicles;
} else if (standardVehicles == 0) {
// Желели смо било које возило и добили смо луксузно
--luxuryVehicles;
} else {
// Желели смо било које возило и добили смо стандардно
--standardVehicles;
}
}
public synchronized void returnCar(int which) {
if (which == STANDARD_VEHICLE) {
++standardVehicles;
if (queues[STANDARD_VEHICLE].minrank() < queues[ANY_VEHICLE].minrank()) {
queues[STANDARD_VEHICLE].signal();
} else {
queues[ANY_VEHICLE].signal();
}
} else {
++luxuryVehicles;
if (queues[LUXURY_VEHICLE].minrank() < queues[ANY_VEHICLE].minrank()) {
queues[LUXURY_VEHICLE].signal();
} else {
queues[ANY_VEHICLE].signal();
}
}
}
}
3. задатак
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Поставка
У Линди реализовати лицитацију у којој постоји један процес vođa_licitacije и n процеса učesnika_u_licitaciji и један процес tick који само ажурира време. Вођа лицитације треба да иницијализује торку са почетном вредношћу и да после датог временског интервала заврши лицитацију, успешно ако је излицитирана вредност већа од резервисане вредности, неуспешно иначе. Процеси учесници у лицитацији треба да се реализују тако да се не блокирају када се заврши дата лицитација, треба да знају која је излицитирана вредност и да ли су је они поставили.
Решење
4. задатак
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Поставка
Постоји N процеса node(i:1..N)
који или чувају елементе листе или су слободни. Сваки од њих може да чува неку вредност (value
) и показивач на следећи елемент у листи (next
). Процес head
чува показивач на први елемент у листи. Приликом брисања елемента из листе процес који га представља се пребацује на почетак листе слободних процеса на који указује процес free
. Процес start
иницира брисање елемента са задатом вредношћу из листе. Реализовати процедуре за све наведене процесе користећи CSP.