<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sr">
	<id>https://siwiki.rs/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Remaxsrb</id>
	<title>SI Wiki - Кориснички доприноси [sr]</title>
	<link rel="self" type="application/atom+xml" href="https://siwiki.rs/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Remaxsrb"/>
	<link rel="alternate" type="text/html" href="https://siwiki.rs/wiki/%D0%9F%D0%BE%D1%81%D0%B5%D0%B1%D0%BD%D0%BE:%D0%94%D0%BE%D0%BF%D1%80%D0%B8%D0%BD%D0%BE%D1%81%D0%B8/Remaxsrb"/>
	<updated>2026-06-04T03:15:27Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2024&amp;diff=7271</id>
		<title>КДП/Фебруар 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2024&amp;diff=7271"/>
		<updated>2024-02-07T21:34:38Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{нерешено}}&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити &#039;&#039;Test and set&#039;&#039; решење за критичну секцију (&#039;&#039;coarse grain&#039;&#039; и &#039;&#039;fine grain&#039;&#039;). Дати решење за смањење инвалидације кеш меморија у том случају.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Региони}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи условне критичне регионе написати програм који решава проблем путовања лифтом. Путник позива лифт са произвољног спрата. Када лифт стигне на неки спрат сви путници који су изразили жељу да сиђу на том спрату обавезно изађу. Након изласка путника сви путници који су чекали на улазак уђу у лифт и кажу на који спрат желе да пређу. Тек када се сви изјасне лифт прелази даље. Није потребно оптимизовати пут лифта и путника.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Решити проблем читалаца и писаца (&#039;&#039;Readers-Writers problem&#039;&#039;) користећи активне мониторе. Обезбедити да процес који је пре упутио захтев за приступ ресурсу пре треба да буде опслужен.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се шпил од 24 карте, подељене у 4 боје, са по 6 различитих бројева. Игру играју 4 играча, која седе за округлим столом и сваки од њих иницијално држи по 4 карте. Између сва суседна играча се налази гомила са картама, која може у неком тренутку бити празна, а иницијално садржи 2 карте. Игра се завршава када бар један играч објави да има све 4 карте истог броја, у различитим бојама, о тада сви играчи прекидају игру. Сваки играч, док год нема 4 карте исте и нико није објавио да је победник, избацује једну карту из своје руке и ставља је на гомилу са своје леве стране, потом узима једну карту са врха из гомиле са своје десне стране. Претпоставити да су играчима иницијално подељене карте на случајан начин. Користећи CSP написати програме за играче и гомиле са картама.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2024&amp;diff=7270</id>
		<title>КДП/Фебруар 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2024&amp;diff=7270"/>
		<updated>2024-02-07T21:34:01Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: Нова страница: {{tocright}} {{нерешено}}&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји и…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{нерешено}}&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Неки рок 20XX. године&#039;&#039;&#039; одржан је XX. месеца. Овде додати још информација које су релевантне за тај рок, попут тога да ли је била доступна литература, колико је шта носило бодова (уколико се мења кроз године), да ли је рок доступан јавно (додати линк до рока и пратећих материјала уколико јесте) итд.&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити &#039;&#039;Test and set&#039;&#039; решење за критичну секцију (&#039;&#039;coarse grain&#039;&#039; и &#039;&#039;fine grain&#039;&#039;). Дати решење за смањење инвалидације кеш меморија у том случају.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Региони}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи условне критичне регионе написати програм који решава проблем путовања лифтом. Путник позива лифт са произвољног спрата. Када лифт стигне на неки спрат сви путници који су изразили жељу да сиђу на том спрату обавезно изађу. Након изласка путника сви путници који су чекали на улазак уђу у лифт и кажу на који спрат желе да пређу. Тек када се сви изјасне лифт прелази даље. Није потребно оптимизовати пут лифта и путника.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Решити проблем читалаца и писаца (&#039;&#039;Readers-Writers problem&#039;&#039;) користећи активне мониторе. Обезбедити да процес који је пре упутио захтев за приступ ресурсу пре треба да буде опслужен.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се шпил од 24 карте, подељене у 4 боје, са по 6 различитих бројева. Игру играју 4 играча, која седе за округлим столом и сваки од њих иницијално држи по 4 карте. Између сва суседна играча се налази гомила са картама, која може у неком тренутку бити празна, а иницијално садржи 2 карте. Игра се завршава када бар један играч објави да има све 4 карте истог броја, у различитим бојама, о тада сви играчи прекидају игру. Сваки играч, док год нема 4 карте исте и нико није објавио да је победник, избацује једну карту из своје руке и ставља је на гомилу са своје леве стране, потом узима једну карту са врха из гомиле са своје десне стране. Претпоставити да су играчима иницијално подељене карте на случајан начин. Користећи CSP написати програме за играче и гомиле са картама.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Remaxsrb&amp;diff=7269</id>
		<title>Корисник:Remaxsrb</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Remaxsrb&amp;diff=7269"/>
		<updated>2024-02-07T01:12:15Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: Нова страница: Здраво, ја сам Марко. Ако приметите било какве грешке у мојим решењима или имате питања слободно измените шта не ваља и оставите објашњење како бих и ја знао где сам се прешао. Слободно пишите на дискорду remaxsrb за било каква питања или замерке.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здраво, ја сам Марко. Ако приметите било какве грешке у мојим решењима или имате питања слободно измените шта не ваља и оставите објашњење како бих и ја знао где сам се прешао. Слободно пишите на дискорду remaxsrb за било каква питања или замерке.&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2020&amp;diff=7268</id>
		<title>КДП/Фебруар 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2020&amp;diff=7268"/>
		<updated>2024-02-07T00:18:41Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* {{категорија|1. задатак|Семафори}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Фебруарски испит 2020. године&#039;&#039;&#039; одржан је 8. фебруара. Поставка се може наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/kdp20.zip странице предмета] (зипована).&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Семафори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи расподељене бинарне семафоре решити проблем произвођача и потрошача (&#039;&#039;Producer – Consumer Problem&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Решење са бафером за M произвођача и N потрошача&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;semaphore&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class ProducerConsumer {&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
	&lt;br /&gt;
	const int CAPACITY=...;&lt;br /&gt;
	int writeCursor=0;&lt;br /&gt;
	int readCursor = 0;&lt;br /&gt;
	&lt;br /&gt;
	int data[CAPACITY]; //Примера ради је узето да произвођач прави податке типа int&lt;br /&gt;
	&lt;br /&gt;
	std::binary_semaphore space_available(CAPACITY);&lt;br /&gt;
	std::binary_semaphore item_available(0);&lt;br /&gt;
	std::binary_semaphore mutexProducer(1);&lt;br /&gt;
	std::binary_semaphore mutexConsumer(1);&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
public:&lt;br /&gt;
&lt;br /&gt;
	void producer() {&lt;br /&gt;
	&lt;br /&gt;
		spaceAvailable.acquire(); //у std::binary_semaphore ово је еквивалент операцији wait&lt;br /&gt;
		mutexProducer.acquire();&lt;br /&gt;
		&lt;br /&gt;
		data[writeCursor] = this.produce(); //Нека метода која би враћала неки број&lt;br /&gt;
		&lt;br /&gt;
		writeCursor = (writeCursor + 1) % CAPACITY;&lt;br /&gt;
		&lt;br /&gt;
		mutexProducer.release();&lt;br /&gt;
		item_available.release(); //у std::binary_semaphore ово је еквивалент операцији signal&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	int consumer() {&lt;br /&gt;
		item_available.acquire();&lt;br /&gt;
		mutexConsumer.acquire()&lt;br /&gt;
		&lt;br /&gt;
		int i = data[readCursor];&lt;br /&gt;
		&lt;br /&gt;
		readCursor = (readCursor + 1) % CAPACITY;&lt;br /&gt;
		&lt;br /&gt;
		item_available.release();&lt;br /&gt;
		mutexConsumer.release()&lt;br /&gt;
		&lt;br /&gt;
		return i;&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Региони}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји група од N филозофа који проводи свој живот тако што наизменично филозофирају, чекају на пиће, и пију (&#039;&#039;The Drinking Philosophers Problem&#039;&#039;). Филозофи су тако распоређени да је по једна флаша са пићем постављенa између суседних филозофа. У неком тренутку филозоф може да постане жедан. Жедном филозофу је потребно неколико суседних флаша да би направио коктел и почео да га пије. Избор пића зависи од тренутног расположења и може се разликовати од прилике до прилике. Када прикупи сва потребна пића филозоф започиње са њиховим испијањем које траје извесно време. Када се напије, филозоф враћа флаше да и други уживају, а он прелази на филозофирање. Написати програм који симулира понашање филозофа користећи условне критичне регионе.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;queue&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const int N = 100;&lt;br /&gt;
&lt;br /&gt;
struct Table {&lt;br /&gt;
    int drinks[N] = {-1};&lt;br /&gt;
    queue&amp;lt;int&amp;gt; drinkQueues[N];&lt;br /&gt;
};&lt;br /&gt;
Table table;&lt;br /&gt;
&lt;br /&gt;
void philosophizing();&lt;br /&gt;
void drinking();&lt;br /&gt;
vector&amp;lt;int&amp;gt; getDrinkRound();&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        vector&amp;lt;int&amp;gt; drinks = getDrinkRound();&lt;br /&gt;
        region (table) {&lt;br /&gt;
            for (int drink : drinks) {&lt;br /&gt;
                if (table.drinks[drink] == -1) {&lt;br /&gt;
                    table.drinks[drink] = id;&lt;br /&gt;
                } else {&lt;br /&gt;
                    table.drinkQueues[drink].push(id);&lt;br /&gt;
                    await (table.drinks[drink] == id);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        drinking();&lt;br /&gt;
        region (table) {&lt;br /&gt;
            for (int drink : drinks) {&lt;br /&gt;
                if (table.drinkQueues[drink].empty()) {&lt;br /&gt;
                    table.drinks[drink] = -1;&lt;br /&gt;
                } else {&lt;br /&gt;
                    table.drinks[drink] = table.drinkQueues[drink].front();&lt;br /&gt;
                    table.drinkQueues[drink].pop();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        philosophizing();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз. Процеси имају само три локације. Направите проточну обраду (pipeline) од n ових филтерских процеса који проналазе медијану: до n улазних позитивних вредности (непарно) које се убацују на почетак проточне обраде, а завршавају се са EOS. На излаз проточне обраде се шаље медијана па EOS.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Пошто је у задатку речено да је дозвољено користити само три локације у процесу, једна ће бити одвојена за број који пристиже а друге две за локалне минимуме и максимуме. Памтиће се минимуми и максимуми јер је медијана непарног броја елемената управо она вредност која је тачно на средини листе у сортираном поретку. За разлику од других решења оваквог типа задатка на викију, ништа се не шаље на излаз осим EOS кад се исти прими јер је сва обрада за медијану већ разрешена унутар петље. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int mem[2];&lt;br /&gt;
    while ((input = in.receive()) != EOS) {       &lt;br /&gt;
        if (mem[0] &amp;lt;= input &amp;amp;&amp;amp; input &amp;lt;= mem[1]) {&lt;br /&gt;
              out.send(input);&lt;br /&gt;
            } else if (mem[0] &amp;gt; input &amp;amp;&amp;amp; input &amp;lt; mem[1]) {&lt;br /&gt;
                out.send(mem[0]);&lt;br /&gt;
                mem[0] = input;&lt;br /&gt;
            } else if (mem[0] &amp;lt; input &amp;amp;&amp;amp; input &amp;gt; mem[1]) {&lt;br /&gt;
                out.send(mem[1]);&lt;br /&gt;
                mem[1] = input;&lt;br /&gt;
            }&lt;br /&gt;
    }&lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се берберница у којој за три различите столице раде три берберина (&#039;&#039;The Hilzer&#039;s Barbershop problem&#039;&#039;). Поред ове три столице у берберници се налази и чекаоница која прима 10 муштерија које могу да седе и 10 које могу да стоје, укупно 20. Када муштерија дође до бербернице уколико на шишање чека више од 20 муштерија онда одлази, а уколико берберница није пуна онда остаје. Уколико барем један берберин спава муштерија која дође на ред за шишање буди оног берберина који је најдуже спавао и седа у његову столицу. На место те муштерије која је устала седа муштерија која је најдуже стајала. Уколико су сви бербери заузети онда муштерија чека, и то ако има места за седење седа, а ако не онда стоји. Муштерије се опслужују у редоследу по коме су приспеле, и седају у истом том редоследу. Када берберин заврши са шишањем муштерија му плаћа и излази из бербернице. Берберин све време или спава или шиша или наплаћује. Користећи C-Linda написати процесе берберина и муштерија.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7267</id>
		<title>КДП/Фебруар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7267"/>
		<updated>2024-02-06T23:36:07Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* {{категорија|4. задатак|CSP}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2223/KDP_2023_feb.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;Fine grain Ticket&#039;&#039; алгоритам реализован помоћу &#039;&#039;addAndGet&#039;&#039; операције. Уколико би &#039;&#039;addAndGet&#039;&#039; операција имала следећи ефекат: &amp;lt;code&amp;gt;addAndGet(var, incr) : &amp;lt; var = var + incr; return(var);&amp;lt;/code&amp;gt;, да ли је могуће направити &#039;&#039;Fine grain&#039;&#039; решење, полазећи од &#039;&#039;Coarse grain&#039;&#039; решења, и ако је могуће - направите га. Написати и &#039;&#039;Coarse grain&#039;&#039; решење. &lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        &amp;lt; myTicket=ticket++; &amp;gt;&lt;br /&gt;
        &amp;lt; await(myTicket==next); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        myTicket = addAndGet(ticket, 1) - 1;&lt;br /&gt;
        while(myTicket != next) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Племе људождера једе заједничку вечеру из казана који може да прими M порција куваних мисионара (&#039;&#039;The Dining Savages Problem&#039;&#039;). Када људождер пожели да руча онда се он сам послужи из заједничког казана, уколико казан није празан. Уколико је казан празан људождер буди кувара и сачека док кувар не напуни казан и онда узима своју порцију, а тек након тога преостали могу јести. Није дозвољено будити кувара уколико се налази бар мало хране у казану. Написати монитор са &#039;&#039;signal and continue&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи активне мониторе решити проблем филозофа који ручавају (&#039;&#039;The Dining Philosophers&#039;&#039;). Филозофи могу да комуницирају искључиво са процесом координатором (централизовано решење). Обезбедити да филозоф који је пре затражио да једе пре и започиње са јелом. Написати код за филозофе и за процес координатор.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
: &#039;&#039;Исти задатак дошао је у [[КДП/Јул 2020#3. задатак|јулу 2020. године]]. Ипак, аутор је одлучио да постави своје решење које је добило максималан број бодова.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = ...;&lt;br /&gt;
enum op_kind{REQUEST,RELEASE};&lt;br /&gt;
chan request(int, op_kind);&lt;br /&gt;
chan reply[N](bool);&lt;br /&gt;
&lt;br /&gt;
class Coordinator {&lt;br /&gt;
public:&lt;br /&gt;
    void run() {&lt;br /&gt;
        int id;&lt;br /&gt;
        op_kind op;&lt;br /&gt;
        queue&amp;lt;int&amp;gt; waiting;&lt;br /&gt;
        int forks[N] = {true};&lt;br /&gt;
        while (true) {&lt;br /&gt;
            receive request(id, op);&lt;br /&gt;
            int left = id, right = (id + 1) % N;&lt;br /&gt;
            if (op == REQUEST) {&lt;br /&gt;
                if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                    forks[left] = forks[right] = false;&lt;br /&gt;
                    send reply[id](OK);&lt;br /&gt;
                } else {&lt;br /&gt;
                    waiting.push(id);&lt;br /&gt;
                }&lt;br /&gt;
            } else if (op == RELEASE) {&lt;br /&gt;
                forks[left] = forks[right] = true;&lt;br /&gt;
                send reply[id](OK);&lt;br /&gt;
                while (!waiting.empty()) {&lt;br /&gt;
                    id = waiting.top();&lt;br /&gt;
                    left = id, right = (id + 1) % N;&lt;br /&gt;
                    if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                        forks[left] = forks[right] = false;&lt;br /&gt;
                        waiting.pop();&lt;br /&gt;
                        send reply[id](OK);&lt;br /&gt;
                    } else break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // Think&lt;br /&gt;
        send request(id, REQUEST);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // Eat&lt;br /&gt;
        send request(id, RELEASE);&lt;br /&gt;
        receive reply[id](status)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
На једној обали реке се налази чамац који превози путнике са једне на другу обалу и који може да прими тачно десет путника. Чамац могу да користе мушкарци, жене и деца. Чамац може да исплови само ако се у њему налази тачно онолико путника колики му је капацитет, али само под условом да се у чамцу налазе бар два мушкарца. Деца не смеју ући у чамац уколико се у њему не налазе бар једна одрасла особа и по завршетку вожње у чамцу не смеју да остану само деца. Сматрати да ће се чамац након искрцавања свих путника одмах бити спреман да прими наредну групу путника. Користећи &#039;&#039;CSP&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Водио сам се решењем истог задатка који је био у делу са регионима. Једино за шта нисам сигуран је да ли треба да се шаљу поруке деци уколико су се одрасли укрцали и одраслима уколико су се деца искрцала због тога што се то проверава у заштитним условима.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[Man(i:1..N)::MAN || Woman(i:1..N)::WOMAN || Child(i:1..N)::CHILD || Boat::BOAT]&lt;br /&gt;
&lt;br /&gt;
BOAT:: &lt;br /&gt;
[&lt;br /&gt;
	capacity:integer; capacity:=0;&lt;br /&gt;
	boarding:integer; boarding:=1;&lt;br /&gt;
	onBoard:integer; onBoard:=0;&lt;br /&gt;
	onBoardMen:integer; onBoardMen:=0;&lt;br /&gt;
	onBoardWomen:integer; onBoardWomen:=0;&lt;br /&gt;
	onBoardChildren:integer; onBoardChildren:=0;	&lt;br /&gt;
	&lt;br /&gt;
	*[&lt;br /&gt;
		boarding==1 -&amp;gt; &lt;br /&gt;
		[&lt;br /&gt;
			onBoard == capacity, Man(i:1..N) Man(i)?enter -&amp;gt;  Man(i)!boatFull;&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard &amp;lt; capacity; Man(i:1..N) Man(i)?enter -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				&lt;br /&gt;
				onBoard:=onBoard+1;&lt;br /&gt;
				onBoardMen:=onBoardMen+1;&lt;br /&gt;
				&lt;br /&gt;
				Man(i)!boarded;&lt;br /&gt;
				&lt;br /&gt;
				onBoard==capacity -&amp;gt; boarding:=0;&lt;br /&gt;
			]&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard == capacity, Woman(i:1..N) Woman(i)?enter -&amp;gt;  Woman(i)!boatFull;&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard &amp;lt; capacity and onBoard-onBoardMen &amp;lt;= 7, Woman(i:1..N) Woman(i)?enter -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard+1;&lt;br /&gt;
				onBoardWomen:=onBoardWomen+1;&lt;br /&gt;
				&lt;br /&gt;
				Woman(i)!boarded;&lt;br /&gt;
				&lt;br /&gt;
				onBoard==capacity -&amp;gt; boarding:=0;&lt;br /&gt;
			]&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard == capacity, Child(i:1..N) Child(i)?enter -&amp;gt;  Child(i)!boatFull;&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard == 0, Child(i:1..N) Child(i)?enter -&amp;gt;  Child(i)!waitForAdult;&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard-onBoardMen &amp;lt;= 7, Child(i:1..N) Child(i)?enter -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard+1;&lt;br /&gt;
				onBoardChildren:=onBoardChildren+1;&lt;br /&gt;
				&lt;br /&gt;
				Child(i)!boarded;&lt;br /&gt;
				&lt;br /&gt;
				onBoard==capacity -&amp;gt; boarding:=0;&lt;br /&gt;
			]&lt;br /&gt;
		]&lt;br /&gt;
		[]&lt;br /&gt;
		boarding==0 -&amp;gt;&lt;br /&gt;
		[&lt;br /&gt;
			onBoardMen+onBoardWomen==1 and onBoardChildren &amp;gt; 0, Man(i)?exit -&amp;gt; Man(i)!waitForChildrenToExit;&lt;br /&gt;
			[]&lt;br /&gt;
			(onBoardMen+onBoardWomen&amp;gt;1 and onBoardChildren &amp;gt; 0) or onBoardChildren==0, Man(i)?exit -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard-1;&lt;br /&gt;
				onBoardMen:=onBoardMen-1;&lt;br /&gt;
				&lt;br /&gt;
				Man(i)!exited;&lt;br /&gt;
				&lt;br /&gt;
				onBoard == 0 -&amp;gt; boarding:=1;&lt;br /&gt;
			]&lt;br /&gt;
			[]&lt;br /&gt;
			onBoardMen+onBoardWomen==1 and onBoardChildren &amp;gt; 0, Woman(i)?exit -&amp;gt; Woman(i)!waitForChildrenToExit;&lt;br /&gt;
			[]&lt;br /&gt;
			(onBoardMen+onBoardWomen&amp;gt;1 and onBoardChildren &amp;gt; 0) or onBoardChildren==0, Woman(i)?exit -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard-1;&lt;br /&gt;
				onBoardWomen:=onBoardWomen-1;&lt;br /&gt;
				&lt;br /&gt;
				Woman(i)!exited;&lt;br /&gt;
				&lt;br /&gt;
				onBoard == 0 -&amp;gt; boarding:=1;&lt;br /&gt;
&lt;br /&gt;
			]&lt;br /&gt;
			[]&lt;br /&gt;
			Child(i)?exit -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard - 1;&lt;br /&gt;
				onBoardChildren:= onBoardChildren -1;&lt;br /&gt;
				Child!exited;&lt;br /&gt;
			]&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
		]&lt;br /&gt;
	]&lt;br /&gt;
	&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
MAN:: &lt;br /&gt;
[&lt;br /&gt;
	Man!enter;&lt;br /&gt;
	&lt;br /&gt;
	[&lt;br /&gt;
		Man?boatFull -&amp;gt; waitForReturnTrip;&lt;br /&gt;
		[]&lt;br /&gt;
		Man?boarded -&amp;gt; &lt;br /&gt;
		[&lt;br /&gt;
			Man!exit;&lt;br /&gt;
			[&lt;br /&gt;
				Man?waitForChildrenToExit -&amp;gt; wait;&lt;br /&gt;
				[]&lt;br /&gt;
				Man(i)?exited; //iskrcao se muskarac&lt;br /&gt;
			]&lt;br /&gt;
		]&lt;br /&gt;
		&lt;br /&gt;
	]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
WOMAN:: &lt;br /&gt;
[&lt;br /&gt;
	Woman!enter;&lt;br /&gt;
	&lt;br /&gt;
	[&lt;br /&gt;
		Woman?boatFull -&amp;gt; waitForReturnTrip;&lt;br /&gt;
		[]&lt;br /&gt;
		Woman?boarded -&amp;gt; &lt;br /&gt;
		[&lt;br /&gt;
			Woman!exit;&lt;br /&gt;
			[&lt;br /&gt;
				Woman?waitForChildrenToExit -&amp;gt; wait;&lt;br /&gt;
				[]&lt;br /&gt;
				Woman(i)?exited; //iskrcala se zena&lt;br /&gt;
			]&lt;br /&gt;
		]&lt;br /&gt;
	]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
CHILD::&lt;br /&gt;
[&lt;br /&gt;
	Child!enter;&lt;br /&gt;
	&lt;br /&gt;
	[&lt;br /&gt;
		Child?boatFull -&amp;gt; waitForReturnTrip;&lt;br /&gt;
		[]&lt;br /&gt;
		Child?waitForAdult -&amp;gt; wait;&lt;br /&gt;
		[]&lt;br /&gt;
		Child?boarded -&amp;gt;&lt;br /&gt;
		[&lt;br /&gt;
			Child!exit;&lt;br /&gt;
			Child?exited; //iskrcalo se dete&lt;br /&gt;
		]&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2021&amp;diff=7266</id>
		<title>КДП/Фебруар 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2021&amp;diff=7266"/>
		<updated>2024-02-06T23:31:12Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2021/KDP_2021_feb.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објасните &#039;&#039;test and test and set&#039;&#039; решење за критичну секцију. Уколико би уместо TS(var) постојала операција SWAP која би недељиво обављала замену вредности два операнда (&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;SWAP(var1, var2) : &amp;lt; temp = var1; var1 = var2; var2 = temp; &amp;gt;&amp;lt;/syntaxhighlight&amp;gt;), да ли је могуће направити Fine grain решење и ако је могуће – направите га.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
У &#039;&#039;Test-and-set&#039;&#039; решењу при свакој провери дељене промењиве се истовремено и уписује у њу а то захтева синхронизацију кеш меморија језгара процесора и значајно окупира магистралу и не дозвољавва другим процесима да је користе. Ради боље перформансе програма потребно је што је могуће више смањити уписе у дељене промењиве. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Test and test and set&#039;&#039; решење ради баш то. Прво се процес врти у петљи док је критична секција закључана, па тек онда кад се откључа покуша да добије приступ, а ако није успео опет се врти у петљи док процес који је заузео критичну секцију пре њега не ослободи кључ.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Fine grain&#039;&#039; решење користећи &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;SWAP(var1, var2) : &amp;lt; temp = var1; var1 = var2; var2 = temp; &amp;gt;&amp;lt;/syntaxhighlight&amp;gt; би могло да се реши на следећи начин:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool lock = false;&lt;br /&gt;
void process(int id) {&lt;br /&gt;
	bool initialLock = true; // У lock треба да се недељиво упише true, а ако је брава ослобођена у initialLock ће се уписати false након замене а ко није ослобођена остаће иста вредност&lt;br /&gt;
	while (true) {&lt;br /&gt;
		while (lock == true) skip;  // врти се lock true, тј. док је брава заузета &lt;br /&gt;
		SWAP(lock, initialLock) //замени вредност браве и initialLock;&lt;br /&gt;
		while (initialLock == true) {  &lt;br /&gt;
			while (lock == true) skip;  // врти се поново ако ниси успео, tj. ако је неко други заузео критичну секцију &lt;br /&gt;
		}&lt;br /&gt;
		//  критична секција&lt;br /&gt;
		lock = false;  // ослободи браву &lt;br /&gt;
		// некритична секција&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Штафетна_палица}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се семафор за регулацију саобраћаја на улици са једним пешачким прелазом. Када пешак стигне до пешачког прелаза, уколико је светло за пешаке зелено, он прелази улицу. Уколико је у моменту његовог доласка светло за пешаке црвено, он чека да се укључи зелено светло. Зелено светло за пешаке се укључује или након К секунди од појаве првог пешака који је затекао црвено светло, или након проласка C аутомобила од последњег активног зеленог светла за пешаке. Зелено светло за пешаке трајања G секунди се пали само уколико је испуњен неки од наведених услова и барем један пешак чека. Користећи расподељене бинарне семафоре и технику предаје штафетне палице написати програме за пешаке, аутомобиле и семафор за регулацију саобраћаја. Доступна је функција &amp;lt;code&amp;gt;system_time()&amp;lt;/code&amp;gt; која враћа тренутно време система. Учесницима треба неко време да пређу улицу.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз, и до три локације за примљене бројева. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n ових филтерских процеса која сортира па сабира до 2*n улазних реалних бројева које се убацују на почетак проточне обраде, а завршавају се са EOS. На излаз проточне обраде се шаље сума па EOS.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Када стигне EOS, уколико су се све остале вредности пропагирале кроз мрежу, ове вредности ће бити сортиране од највеће ка најмањој како се редом буде ишло кроз садржај филтерских процеса. У задатку није специфицирано на који начин треба да се види чињеница да се низ сортира, па је ово узето као претпоставка.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int numReceived = 0;&lt;br /&gt;
    int input;&lt;br /&gt;
    int mem[2];&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (numReceived &amp;lt; 2) {&lt;br /&gt;
            mem[numReceived++] = input;&lt;br /&gt;
        } else {&lt;br /&gt;
            if (input &amp;lt;= mem[0] &amp;amp;&amp;amp; input &amp;lt;= mem[1]) {&lt;br /&gt;
                out.send(input);&lt;br /&gt;
            } else if (mem[0] &amp;lt;= input &amp;amp;&amp;amp; mem[0] &amp;lt;= mem[1]) {&lt;br /&gt;
                out.send(mem[0]);&lt;br /&gt;
                mem[0] = input;&lt;br /&gt;
            } else {&lt;br /&gt;
                out.send(mem[1]);&lt;br /&gt;
                mem[1] = input;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    out.send(mem[0] + mem[1]);&lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се једна подземна гаража. Постоји само једна рампа која служи и за улаз, и за излаз из гараже. У гаражи има N места за паркирање. Аутомобили који улазе, могу да уђу, један по један, уколико има слободних места. Уколико слободног места нема, проверава се да ли има аутомобила који хоће да изађу. Ако након изласка свих аутомобила који желе да изађу и уласка аутомобила који су дошли пре њега за аутомобил неће бити места, он одлази у потрагу за другом гаражом. Аутомобили при изласку плаћају услуге гараже и излазе један по један. Аутомобили се опслужују по ФИФО редоследу. Решити задатак користећи CSP.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[ramp::RAMP, car(i: 0..2*N+1)::CAR]&lt;br /&gt;
&lt;br /&gt;
RAMP::&lt;br /&gt;
    entering: integer;&lt;br /&gt;
    exiting: integer;&lt;br /&gt;
    parked: integer;&lt;br /&gt;
    // Ово је измишљена синтакса за низ структура&lt;br /&gt;
    enterQueue: (0..N) (carId, ticket: integer);&lt;br /&gt;
    exitQueue: (0..N) (carId, ticket: integer);&lt;br /&gt;
    enterHead: integer;&lt;br /&gt;
    exitHead: integer;&lt;br /&gt;
    enterTail: integer;&lt;br /&gt;
    exitTail: integer;&lt;br /&gt;
    ticket := integer;&lt;br /&gt;
    entering := 0;&lt;br /&gt;
    exiting := 0;&lt;br /&gt;
    parked := 0;&lt;br /&gt;
    enterHead := 0;&lt;br /&gt;
    exitHead := 0;&lt;br /&gt;
    enterTail := 0;&lt;br /&gt;
    exitTail := 0;&lt;br /&gt;
    ticket := 0;&lt;br /&gt;
    *[&lt;br /&gt;
        parked - exiting + entering &amp;gt;= N; (i: 0..2*N+1) car(i)?enter -&amp;gt; car(i)!full&lt;br /&gt;
        □&lt;br /&gt;
        parked - exiting + entering &amp;lt; N; (i: 0..2*N+1) car(i)?enter -&amp;gt;&lt;br /&gt;
            entering := entering + 1;&lt;br /&gt;
            [&lt;br /&gt;
                entering = 1; exiting = 0; parked &amp;lt; N -&amp;gt; car(i)!pass&lt;br /&gt;
                □&lt;br /&gt;
                entering &amp;gt; 1 or exiting &amp;gt; 0 or parked = N -&amp;gt;&lt;br /&gt;
                    // Ово је измишљена синтакса за убацивање структуре у низ&lt;br /&gt;
                    enterQueue(enterTail) := (i, ticket);&lt;br /&gt;
                    ticket := ticket + 1;&lt;br /&gt;
                    enterTail := (enterTail + 1) mod N&lt;br /&gt;
            ]&lt;br /&gt;
        □&lt;br /&gt;
        (i: 0..2*N+1) car(i)?entered -&amp;gt;&lt;br /&gt;
            entering := entering - 1;&lt;br /&gt;
            parked := parked + 1;&lt;br /&gt;
            [&lt;br /&gt;
                // Ово је измишљена синтакса за приступање пољу структуре&lt;br /&gt;
                entering &amp;gt; 0; parked + exiting &amp;lt; N; enterQueue(enterHead).ticket &amp;gt; exitQueue(exitHead).ticket -&amp;gt;&lt;br /&gt;
                    car(enterQueue(enterHead).carId)!pass;&lt;br /&gt;
                    enterHead := (enterHead + 1) mod N&lt;br /&gt;
                □&lt;br /&gt;
                exiting &amp;gt; 0; parked + exiting = N or enterQueue(enterHead).ticket &amp;lt; exitQueue(exitHead).ticket -&amp;gt;&lt;br /&gt;
                    car(exitQueue(exitHead).carId)!pass;&lt;br /&gt;
                    exitHead := (exitHead + 1) mod N&lt;br /&gt;
            ]&lt;br /&gt;
        □&lt;br /&gt;
        (i: 0..2*N+1) car(i)?exit -&amp;gt;&lt;br /&gt;
            exiting := exiting + 1;&lt;br /&gt;
            parked := parked - 1;&lt;br /&gt;
            [&lt;br /&gt;
                exiting = 1; entering = 0 -&amp;gt; car(i)!pass&lt;br /&gt;
                □&lt;br /&gt;
                exiting &amp;gt; 1 or entering &amp;gt; 0 -&amp;gt;&lt;br /&gt;
                    // Ово је измишљена синтакса за убацивање структуре у низ&lt;br /&gt;
                    exitQueue(exitTail) := (i, ticket);&lt;br /&gt;
                    ticket := ticket + 1;&lt;br /&gt;
                    exitTail := (exitTail + 1) mod N&lt;br /&gt;
            ]&lt;br /&gt;
        □&lt;br /&gt;
        (i: 0..2*N+1) car(i)?exited -&amp;gt;&lt;br /&gt;
            exiting := exiting - 1;&lt;br /&gt;
            [&lt;br /&gt;
                // Ово је измишљена синтакса за приступање пољу структуре&lt;br /&gt;
                entering &amp;gt; 0; parked + exiting &amp;lt; N; enterQueue(enterHead).ticket &amp;gt; exitQueue(exitHead).ticket -&amp;gt;&lt;br /&gt;
                    car(enterQueue(enterHead).carId)!pass;&lt;br /&gt;
                    enterHead := (enterHead + 1) mod N&lt;br /&gt;
                □&lt;br /&gt;
                exiting &amp;gt; 0; parked + exiting = N or enterQueue(enterHead).ticket &amp;lt; exitQueue(exitHead).ticket -&amp;gt;&lt;br /&gt;
                    car(exitQueue(exitHead).carId)!pass;&lt;br /&gt;
                    exitHead := (exitHead + 1) mod N&lt;br /&gt;
            ]&lt;br /&gt;
    ]&lt;br /&gt;
&lt;br /&gt;
CAR::&lt;br /&gt;
    ramp!enter;&lt;br /&gt;
    [&lt;br /&gt;
        // Тражимо другу гаражу&lt;br /&gt;
        ramp?full -&amp;gt; skip&lt;br /&gt;
        □&lt;br /&gt;
        ramp?pass -&amp;gt;&lt;br /&gt;
            // Пролазимо кроз рампу&lt;br /&gt;
            ramp!entered;&lt;br /&gt;
            // Паркирани смо&lt;br /&gt;
            ramp!exit;&lt;br /&gt;
            ramp?pass;&lt;br /&gt;
            // Пролазимо кроз рампу&lt;br /&gt;
            ramp!exited&lt;br /&gt;
    ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2021&amp;diff=7265</id>
		<title>КДП/Фебруар 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2021&amp;diff=7265"/>
		<updated>2024-02-06T23:30:40Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* {{категорија|1. задатак|Синхронизациони_алгоритми}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2021/KDP_2021_feb.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објасните &#039;&#039;test and test and set&#039;&#039; решење за критичну секцију. Уколико би уместо TS(var) постојала операција SWAP која би недељиво обављала замену вредности два операнда (&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;SWAP(var1, var2) : &amp;lt; temp = var1; var1 = var2; var2 = temp; &amp;gt;&amp;lt;/syntaxhighlight&amp;gt;), да ли је могуће направити Fine grain решење и ако је могуће – направите га.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
У &#039;&#039;Test-and-set&#039;&#039; решењу при свакој провери дељене промењиве се истовремено и уписује у њу а то захтева синхронизацију кеш меморија језгара процесора и значајно окупира магистралу и не дозвољавва другим процесима да је користе. Ради боље перформансе програма потребно је што је могуће више смањити уписе у дељене промењиве. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Test and test and set&#039;&#039; решење ради баш то. Прво се процес црти у петљи док је критична секција закључана, па тек онда кад се откључа покуша да добије приступ, а ако није успео опет се врти у петљи док процес који је заузео критичну секцију пре њега не ослободи кључ.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Fine grain&#039;&#039; решење користећи &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;SWAP(var1, var2) : &amp;lt; temp = var1; var1 = var2; var2 = temp; &amp;gt;&amp;lt;/syntaxhighlight&amp;gt; би могло да се реши на следећи начин:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool lock = false;&lt;br /&gt;
void process(int id) {&lt;br /&gt;
	bool initialLock = true; // У lock треба да се недељиво упише true, а ако је брава ослобођена у initialLock ће се уписати false након замене а ко није ослобођена остаће иста вредност&lt;br /&gt;
	while (true) {&lt;br /&gt;
		while (lock == true) skip;  // врти се lock true, тј. док је брава заузета &lt;br /&gt;
		SWAP(lock, initialLock) //замени вредност браве и initialLock;&lt;br /&gt;
		while (initialLock == true) {  &lt;br /&gt;
			while (lock == true) skip;  // врти се поново ако ниси успео, tj. ако је неко други заузео критичну секцију &lt;br /&gt;
		}&lt;br /&gt;
		//  критична секција&lt;br /&gt;
		lock = false;  // ослободи браву &lt;br /&gt;
		// некритична секција&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Штафетна_палица}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се семафор за регулацију саобраћаја на улици са једним пешачким прелазом. Када пешак стигне до пешачког прелаза, уколико је светло за пешаке зелено, он прелази улицу. Уколико је у моменту његовог доласка светло за пешаке црвено, он чека да се укључи зелено светло. Зелено светло за пешаке се укључује или након К секунди од појаве првог пешака који је затекао црвено светло, или након проласка C аутомобила од последњег активног зеленог светла за пешаке. Зелено светло за пешаке трајања G секунди се пали само уколико је испуњен неки од наведених услова и барем један пешак чека. Користећи расподељене бинарне семафоре и технику предаје штафетне палице написати програме за пешаке, аутомобиле и семафор за регулацију саобраћаја. Доступна је функција &amp;lt;code&amp;gt;system_time()&amp;lt;/code&amp;gt; која враћа тренутно време система. Учесницима треба неко време да пређу улицу.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз, и до три локације за примљене бројева. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n ових филтерских процеса која сортира па сабира до 2*n улазних реалних бројева које се убацују на почетак проточне обраде, а завршавају се са EOS. На излаз проточне обраде се шаље сума па EOS.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Када стигне EOS, уколико су се све остале вредности пропагирале кроз мрежу, ове вредности ће бити сортиране од највеће ка најмањој како се редом буде ишло кроз садржај филтерских процеса. У задатку није специфицирано на који начин треба да се види чињеница да се низ сортира, па је ово узето као претпоставка.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int numReceived = 0;&lt;br /&gt;
    int input;&lt;br /&gt;
    int mem[2];&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (numReceived &amp;lt; 2) {&lt;br /&gt;
            mem[numReceived++] = input;&lt;br /&gt;
        } else {&lt;br /&gt;
            if (input &amp;lt;= mem[0] &amp;amp;&amp;amp; input &amp;lt;= mem[1]) {&lt;br /&gt;
                out.send(input);&lt;br /&gt;
            } else if (mem[0] &amp;lt;= input &amp;amp;&amp;amp; mem[0] &amp;lt;= mem[1]) {&lt;br /&gt;
                out.send(mem[0]);&lt;br /&gt;
                mem[0] = input;&lt;br /&gt;
            } else {&lt;br /&gt;
                out.send(mem[1]);&lt;br /&gt;
                mem[1] = input;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    out.send(mem[0] + mem[1]);&lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се једна подземна гаража. Постоји само једна рампа која служи и за улаз, и за излаз из гараже. У гаражи има N места за паркирање. Аутомобили који улазе, могу да уђу, један по један, уколико има слободних места. Уколико слободног места нема, проверава се да ли има аутомобила који хоће да изађу. Ако након изласка свих аутомобила који желе да изађу и уласка аутомобила који су дошли пре њега за аутомобил неће бити места, он одлази у потрагу за другом гаражом. Аутомобили при изласку плаћају услуге гараже и излазе један по један. Аутомобили се опслужују по ФИФО редоследу. Решити задатак користећи CSP.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[ramp::RAMP, car(i: 0..2*N+1)::CAR]&lt;br /&gt;
&lt;br /&gt;
RAMP::&lt;br /&gt;
    entering: integer;&lt;br /&gt;
    exiting: integer;&lt;br /&gt;
    parked: integer;&lt;br /&gt;
    // Ово је измишљена синтакса за низ структура&lt;br /&gt;
    enterQueue: (0..N) (carId, ticket: integer);&lt;br /&gt;
    exitQueue: (0..N) (carId, ticket: integer);&lt;br /&gt;
    enterHead: integer;&lt;br /&gt;
    exitHead: integer;&lt;br /&gt;
    enterTail: integer;&lt;br /&gt;
    exitTail: integer;&lt;br /&gt;
    ticket := integer;&lt;br /&gt;
    entering := 0;&lt;br /&gt;
    exiting := 0;&lt;br /&gt;
    parked := 0;&lt;br /&gt;
    enterHead := 0;&lt;br /&gt;
    exitHead := 0;&lt;br /&gt;
    enterTail := 0;&lt;br /&gt;
    exitTail := 0;&lt;br /&gt;
    ticket := 0;&lt;br /&gt;
    *[&lt;br /&gt;
        parked - exiting + entering &amp;gt;= N; (i: 0..2*N+1) car(i)?enter -&amp;gt; car(i)!full&lt;br /&gt;
        □&lt;br /&gt;
        parked - exiting + entering &amp;lt; N; (i: 0..2*N+1) car(i)?enter -&amp;gt;&lt;br /&gt;
            entering := entering + 1;&lt;br /&gt;
            [&lt;br /&gt;
                entering = 1; exiting = 0; parked &amp;lt; N -&amp;gt; car(i)!pass&lt;br /&gt;
                □&lt;br /&gt;
                entering &amp;gt; 1 or exiting &amp;gt; 0 or parked = N -&amp;gt;&lt;br /&gt;
                    // Ово је измишљена синтакса за убацивање структуре у низ&lt;br /&gt;
                    enterQueue(enterTail) := (i, ticket);&lt;br /&gt;
                    ticket := ticket + 1;&lt;br /&gt;
                    enterTail := (enterTail + 1) mod N&lt;br /&gt;
            ]&lt;br /&gt;
        □&lt;br /&gt;
        (i: 0..2*N+1) car(i)?entered -&amp;gt;&lt;br /&gt;
            entering := entering - 1;&lt;br /&gt;
            parked := parked + 1;&lt;br /&gt;
            [&lt;br /&gt;
                // Ово је измишљена синтакса за приступање пољу структуре&lt;br /&gt;
                entering &amp;gt; 0; parked + exiting &amp;lt; N; enterQueue(enterHead).ticket &amp;gt; exitQueue(exitHead).ticket -&amp;gt;&lt;br /&gt;
                    car(enterQueue(enterHead).carId)!pass;&lt;br /&gt;
                    enterHead := (enterHead + 1) mod N&lt;br /&gt;
                □&lt;br /&gt;
                exiting &amp;gt; 0; parked + exiting = N or enterQueue(enterHead).ticket &amp;lt; exitQueue(exitHead).ticket -&amp;gt;&lt;br /&gt;
                    car(exitQueue(exitHead).carId)!pass;&lt;br /&gt;
                    exitHead := (exitHead + 1) mod N&lt;br /&gt;
            ]&lt;br /&gt;
        □&lt;br /&gt;
        (i: 0..2*N+1) car(i)?exit -&amp;gt;&lt;br /&gt;
            exiting := exiting + 1;&lt;br /&gt;
            parked := parked - 1;&lt;br /&gt;
            [&lt;br /&gt;
                exiting = 1; entering = 0 -&amp;gt; car(i)!pass&lt;br /&gt;
                □&lt;br /&gt;
                exiting &amp;gt; 1 or entering &amp;gt; 0 -&amp;gt;&lt;br /&gt;
                    // Ово је измишљена синтакса за убацивање структуре у низ&lt;br /&gt;
                    exitQueue(exitTail) := (i, ticket);&lt;br /&gt;
                    ticket := ticket + 1;&lt;br /&gt;
                    exitTail := (exitTail + 1) mod N&lt;br /&gt;
            ]&lt;br /&gt;
        □&lt;br /&gt;
        (i: 0..2*N+1) car(i)?exited -&amp;gt;&lt;br /&gt;
            exiting := exiting - 1;&lt;br /&gt;
            [&lt;br /&gt;
                // Ово је измишљена синтакса за приступање пољу структуре&lt;br /&gt;
                entering &amp;gt; 0; parked + exiting &amp;lt; N; enterQueue(enterHead).ticket &amp;gt; exitQueue(exitHead).ticket -&amp;gt;&lt;br /&gt;
                    car(enterQueue(enterHead).carId)!pass;&lt;br /&gt;
                    enterHead := (enterHead + 1) mod N&lt;br /&gt;
                □&lt;br /&gt;
                exiting &amp;gt; 0; parked + exiting = N or enterQueue(enterHead).ticket &amp;lt; exitQueue(exitHead).ticket -&amp;gt;&lt;br /&gt;
                    car(exitQueue(exitHead).carId)!pass;&lt;br /&gt;
                    exitHead := (exitHead + 1) mod N&lt;br /&gt;
            ]&lt;br /&gt;
    ]&lt;br /&gt;
&lt;br /&gt;
CAR::&lt;br /&gt;
    ramp!enter;&lt;br /&gt;
    [&lt;br /&gt;
        // Тражимо другу гаражу&lt;br /&gt;
        ramp?full -&amp;gt; skip&lt;br /&gt;
        □&lt;br /&gt;
        ramp?pass -&amp;gt;&lt;br /&gt;
            // Пролазимо кроз рампу&lt;br /&gt;
            ramp!entered;&lt;br /&gt;
            // Паркирани смо&lt;br /&gt;
            ramp!exit;&lt;br /&gt;
            ramp?pass;&lt;br /&gt;
            // Пролазимо кроз рампу&lt;br /&gt;
            ramp!exited&lt;br /&gt;
    ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2020&amp;diff=7264</id>
		<title>КДП/Фебруар 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2020&amp;diff=7264"/>
		<updated>2024-02-06T23:03:31Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* {{категорија|3. задатак|Филтерски_процеси}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Фебруарски испит 2020. године&#039;&#039;&#039; одржан је 8. фебруара. Поставка се може наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/kdp20.zip странице предмета] (зипована).&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Семафори}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи расподељене бинарне семафоре решити проблем произвођача и потрошача (&#039;&#039;Producer – Consumer Problem&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Региони}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји група од N филозофа који проводи свој живот тако што наизменично филозофирају, чекају на пиће, и пију (&#039;&#039;The Drinking Philosophers Problem&#039;&#039;). Филозофи су тако распоређени да је по једна флаша са пићем постављенa између суседних филозофа. У неком тренутку филозоф може да постане жедан. Жедном филозофу је потребно неколико суседних флаша да би направио коктел и почео да га пије. Избор пића зависи од тренутног расположења и може се разликовати од прилике до прилике. Када прикупи сва потребна пића филозоф започиње са њиховим испијањем које траје извесно време. Када се напије, филозоф враћа флаше да и други уживају, а он прелази на филозофирање. Написати програм који симулира понашање филозофа користећи условне критичне регионе.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;queue&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const int N = 100;&lt;br /&gt;
&lt;br /&gt;
struct Table {&lt;br /&gt;
    int drinks[N] = {-1};&lt;br /&gt;
    queue&amp;lt;int&amp;gt; drinkQueues[N];&lt;br /&gt;
};&lt;br /&gt;
Table table;&lt;br /&gt;
&lt;br /&gt;
void philosophizing();&lt;br /&gt;
void drinking();&lt;br /&gt;
vector&amp;lt;int&amp;gt; getDrinkRound();&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        vector&amp;lt;int&amp;gt; drinks = getDrinkRound();&lt;br /&gt;
        region (table) {&lt;br /&gt;
            for (int drink : drinks) {&lt;br /&gt;
                if (table.drinks[drink] == -1) {&lt;br /&gt;
                    table.drinks[drink] = id;&lt;br /&gt;
                } else {&lt;br /&gt;
                    table.drinkQueues[drink].push(id);&lt;br /&gt;
                    await (table.drinks[drink] == id);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        drinking();&lt;br /&gt;
        region (table) {&lt;br /&gt;
            for (int drink : drinks) {&lt;br /&gt;
                if (table.drinkQueues[drink].empty()) {&lt;br /&gt;
                    table.drinks[drink] = -1;&lt;br /&gt;
                } else {&lt;br /&gt;
                    table.drinks[drink] = table.drinkQueues[drink].front();&lt;br /&gt;
                    table.drinkQueues[drink].pop();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        philosophizing();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз. Процеси имају само три локације. Направите проточну обраду (pipeline) од n ових филтерских процеса који проналазе медијану: до n улазних позитивних вредности (непарно) које се убацују на почетак проточне обраде, а завршавају се са EOS. На излаз проточне обраде се шаље медијана па EOS.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Пошто је у задатку речено да је дозвољено користити само три локације у процесу, једна ће бити одвојена за број који пристиже а друге две за локалне минимуме и максимуме. Памтиће се минимуми и максимуми јер је медијана непарног броја елемената управо она вредност која је тачно на средини листе у сортираном поретку. За разлику од других решења оваквог типа задатка на викију, ништа се не шаље на излаз осим EOS кад се исти прими јер је сва обрада за медијану већ разрешена унутар петље. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int mem[2];&lt;br /&gt;
    while ((input = in.receive()) != EOS) {       &lt;br /&gt;
        if (mem[0] &amp;lt;= input &amp;amp;&amp;amp; input &amp;lt;= mem[1]) {&lt;br /&gt;
              out.send(input);&lt;br /&gt;
            } else if (mem[0] &amp;gt; input &amp;amp;&amp;amp; input &amp;lt; mem[1]) {&lt;br /&gt;
                out.send(mem[0]);&lt;br /&gt;
                mem[0] = input;&lt;br /&gt;
            } else if (mem[0] &amp;lt; input &amp;amp;&amp;amp; input &amp;gt; mem[1]) {&lt;br /&gt;
                out.send(mem[1]);&lt;br /&gt;
                mem[1] = input;&lt;br /&gt;
            }&lt;br /&gt;
    }&lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се берберница у којој за три различите столице раде три берберина (&#039;&#039;The Hilzer&#039;s Barbershop problem&#039;&#039;). Поред ове три столице у берберници се налази и чекаоница која прима 10 муштерија које могу да седе и 10 које могу да стоје, укупно 20. Када муштерија дође до бербернице уколико на шишање чека више од 20 муштерија онда одлази, а уколико берберница није пуна онда остаје. Уколико барем један берберин спава муштерија која дође на ред за шишање буди оног берберина који је најдуже спавао и седа у његову столицу. На место те муштерије која је устала седа муштерија која је најдуже стајала. Уколико су сви бербери заузети онда муштерија чека, и то ако има места за седење седа, а ако не онда стоји. Муштерије се опслужују у редоследу по коме су приспеле, и седају у истом том редоследу. Када берберин заврши са шишањем муштерија му плаћа и излази из бербернице. Берберин све време или спава или шиша или наплаћује. Користећи C-Linda написати процесе берберина и муштерија.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2020&amp;diff=7263</id>
		<title>КДП/Фебруар 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2020&amp;diff=7263"/>
		<updated>2024-02-06T23:01:53Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Фебруарски испит 2020. године&#039;&#039;&#039; одржан је 8. фебруара. Поставка се може наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/kdp20.zip странице предмета] (зипована).&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Семафори}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи расподељене бинарне семафоре решити проблем произвођача и потрошача (&#039;&#039;Producer – Consumer Problem&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Региони}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји група од N филозофа који проводи свој живот тако што наизменично филозофирају, чекају на пиће, и пију (&#039;&#039;The Drinking Philosophers Problem&#039;&#039;). Филозофи су тако распоређени да је по једна флаша са пићем постављенa између суседних филозофа. У неком тренутку филозоф може да постане жедан. Жедном филозофу је потребно неколико суседних флаша да би направио коктел и почео да га пије. Избор пића зависи од тренутног расположења и може се разликовати од прилике до прилике. Када прикупи сва потребна пића филозоф започиње са њиховим испијањем које траје извесно време. Када се напије, филозоф враћа флаше да и други уживају, а он прелази на филозофирање. Написати програм који симулира понашање филозофа користећи условне критичне регионе.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;queue&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const int N = 100;&lt;br /&gt;
&lt;br /&gt;
struct Table {&lt;br /&gt;
    int drinks[N] = {-1};&lt;br /&gt;
    queue&amp;lt;int&amp;gt; drinkQueues[N];&lt;br /&gt;
};&lt;br /&gt;
Table table;&lt;br /&gt;
&lt;br /&gt;
void philosophizing();&lt;br /&gt;
void drinking();&lt;br /&gt;
vector&amp;lt;int&amp;gt; getDrinkRound();&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        vector&amp;lt;int&amp;gt; drinks = getDrinkRound();&lt;br /&gt;
        region (table) {&lt;br /&gt;
            for (int drink : drinks) {&lt;br /&gt;
                if (table.drinks[drink] == -1) {&lt;br /&gt;
                    table.drinks[drink] = id;&lt;br /&gt;
                } else {&lt;br /&gt;
                    table.drinkQueues[drink].push(id);&lt;br /&gt;
                    await (table.drinks[drink] == id);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        drinking();&lt;br /&gt;
        region (table) {&lt;br /&gt;
            for (int drink : drinks) {&lt;br /&gt;
                if (table.drinkQueues[drink].empty()) {&lt;br /&gt;
                    table.drinks[drink] = -1;&lt;br /&gt;
                } else {&lt;br /&gt;
                    table.drinks[drink] = table.drinkQueues[drink].front();&lt;br /&gt;
                    table.drinkQueues[drink].pop();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        philosophizing();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз. Процеси имају само три локације. Направите проточну обраду (pipeline) од n ових филтерских процеса који проналазе медијану: до n улазних позитивних вредности (непарно) које се убацују на почетак проточне обраде, а завршавају се са EOS. На излаз проточне обраде се шаље медијана па EOS.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Пошто је у задатку речено да је дозвољено користити само три локације у процесу, једна ће бити одвојена за број који пристиже а друге две за локалне минимуме и максимуме. Памтиће се минимуми и максимуми јер је медијана непарног броја елемената управо она вредност која је тачно на средини листе у сортираном поретку. За разлику од других решења оваквог типа задатка на викију, ништа се не шаље на излаз осим EOS кад се исти прими јер је сва обрада за медијану већ разрешена унутар петље. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int mem[2];&lt;br /&gt;
    while ((input = in.receive()) != EOS) {       &lt;br /&gt;
        if (mem[0] &amp;lt;= input &amp;amp;&amp;amp; input &amp;lt;= mem[1]) {&lt;br /&gt;
              out.send(input);&lt;br /&gt;
            } else if (mem[0] &amp;gt; input &amp;amp;&amp;amp; input &amp;lt; mem[1]) {&lt;br /&gt;
                out.send(mem[0]);&lt;br /&gt;
                mem[0] = input;&lt;br /&gt;
            } else if (mem[0] &amp;lt; input &amp;amp;&amp;amp; input &amp;gt; mem[1]) {&lt;br /&gt;
                out.send(mem[1]);&lt;br /&gt;
                mem[1] = input;&lt;br /&gt;
            }&lt;br /&gt;
    }&lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се берберница у којој за три различите столице раде три берберина (&#039;&#039;The Hilzer&#039;s Barbershop problem&#039;&#039;). Поред ове три столице у берберници се налази и чекаоница која прима 10 муштерија које могу да седе и 10 које могу да стоје, укупно 20. Када муштерија дође до бербернице уколико на шишање чека више од 20 муштерија онда одлази, а уколико берберница није пуна онда остаје. Уколико барем један берберин спава муштерија која дође на ред за шишање буди оног берберина који је најдуже спавао и седа у његову столицу. На место те муштерије која је устала седа муштерија која је најдуже стајала. Уколико су сви бербери заузети онда муштерија чека, и то ако има места за седење седа, а ако не онда стоји. Муштерије се опслужују у редоследу по коме су приспеле, и седају у истом том редоследу. Када берберин заврши са шишањем муштерија му плаћа и излази из бербернице. Берберин све време или спава или шиша или наплаћује. Користећи C-Linda написати процесе берберина и муштерија.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2020&amp;diff=7262</id>
		<title>КДП/Фебруар 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2020&amp;diff=7262"/>
		<updated>2024-02-06T22:59:38Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Фебруарски испит 2020. године&#039;&#039;&#039; одржан је 8. фебруара. Поставка се може наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/kdp20.zip странице предмета] (зипована).&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Семафори}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи расподељене бинарне семафоре решити проблем произвођача и потрошача (&#039;&#039;Producer – Consumer Problem&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Региони}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји група од N филозофа који проводи свој живот тако што наизменично филозофирају, чекају на пиће, и пију (&#039;&#039;The Drinking Philosophers Problem&#039;&#039;). Филозофи су тако распоређени да је по једна флаша са пићем постављенa између суседних филозофа. У неком тренутку филозоф може да постане жедан. Жедном филозофу је потребно неколико суседних флаша да би направио коктел и почео да га пије. Избор пића зависи од тренутног расположења и може се разликовати од прилике до прилике. Када прикупи сва потребна пића филозоф започиње са њиховим испијањем које траје извесно време. Када се напије, филозоф враћа флаше да и други уживају, а он прелази на филозофирање. Написати програм који симулира понашање филозофа користећи условне критичне регионе.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;queue&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const int N = 100;&lt;br /&gt;
&lt;br /&gt;
struct Table {&lt;br /&gt;
    int drinks[N] = {-1};&lt;br /&gt;
    queue&amp;lt;int&amp;gt; drinkQueues[N];&lt;br /&gt;
};&lt;br /&gt;
Table table;&lt;br /&gt;
&lt;br /&gt;
void philosophizing();&lt;br /&gt;
void drinking();&lt;br /&gt;
vector&amp;lt;int&amp;gt; getDrinkRound();&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        vector&amp;lt;int&amp;gt; drinks = getDrinkRound();&lt;br /&gt;
        region (table) {&lt;br /&gt;
            for (int drink : drinks) {&lt;br /&gt;
                if (table.drinks[drink] == -1) {&lt;br /&gt;
                    table.drinks[drink] = id;&lt;br /&gt;
                } else {&lt;br /&gt;
                    table.drinkQueues[drink].push(id);&lt;br /&gt;
                    await (table.drinks[drink] == id);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        drinking();&lt;br /&gt;
        region (table) {&lt;br /&gt;
            for (int drink : drinks) {&lt;br /&gt;
                if (table.drinkQueues[drink].empty()) {&lt;br /&gt;
                    table.drinks[drink] = -1;&lt;br /&gt;
                } else {&lt;br /&gt;
                    table.drinks[drink] = table.drinkQueues[drink].front();&lt;br /&gt;
                    table.drinkQueues[drink].pop();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        philosophizing();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз. Процеси имају само три локације. Направите проточну обраду (pipeline) од n ових филтерских процеса који проналазе медијану: до n улазних позитивних вредности (непарно) које се убацују на почетак проточне обраде, а завршавају се са EOS. На излаз проточне обраде се шаље медијана па EOS.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Пошто је у задатку речено да је дозвољено користити само три локације у процесу, једна ће бити одвојена за број који пристиже а друге две за локалне минимуме и максимуме. Памтиће се минимуми и максимуми јер је медијана непарног броја елемената управо она вредност која је тачно на средини листе у сортираном поретку. За разлику од других решења оваквог типа задатка на викију, ништа се не шаље на излаз осим EOS кад се исти прими јер је сва обрада за медијану већ разрешена унутар петље. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int mem[2];&lt;br /&gt;
    while ((input = in.receive()) != EOS) {       &lt;br /&gt;
        if (mem[0] &amp;lt;= input &amp;amp;&amp;amp; input &amp;lt;= mem[1]) {&lt;br /&gt;
              out.send(input);&lt;br /&gt;
            } else if (mem[0] &amp;gt; input &amp;amp;&amp;amp; input &amp;lt; mem[1]) {&lt;br /&gt;
                out.send(mem[0]);&lt;br /&gt;
                mem[0] = input;&lt;br /&gt;
            } else if (mem[0] &amp;lt; input &amp;amp;&amp;amp; input &amp;gt; mem[1]) {&lt;br /&gt;
                out.send(mem[1]);&lt;br /&gt;
                mem[1] = input;&lt;br /&gt;
            }&lt;br /&gt;
    }&lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се берберница у којој за три различите столице раде три берберина (&#039;&#039;The Hilzer&#039;s Barbershop problem&#039;&#039;). Поред ове три столице у берберници се налази и чекаоница која прима 10 муштерија које могу да седе и 10 које могу да стоје, укупно 20. Када муштерија дође до бербернице уколико на шишање чека више од 20 муштерија онда одлази, а уколико берберница није пуна онда остаје. Уколико барем један берберин спава муштерија која дође на ред за шишање буди оног берберина који је најдуже спавао и седа у његову столицу. На место те муштерије која је устала седа муштерија која је најдуже стајала. Уколико су сви бербери заузети онда муштерија чека, и то ако има места за седење седа, а ако не онда стоји. Муштерије се опслужују у редоследу по коме су приспеле, и седају у истом том редоследу. Када берберин заврши са шишањем муштерија му плаћа и излази из бербернице. Берберин све време или спава или шиша или наплаћује. Користећи C-Linda написати процесе берберина и муштерија.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7261</id>
		<title>КДП/Септембар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7261"/>
		<updated>2024-02-06T16:13:36Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* Исправљена синтакса */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити CLH алгоритам за критичну секцију (coarse grain). Реализовати (fine grain) верзију алгоритма уколико би на датом процесору постојала операција SWAP која би недељиво обављала замену вердности два операнда (SWAP(var1, var2): &amp;lt;temp=var1; var1=var2; var2=temp;&amp;gt;). Објаснити зашто је то правична критична секција.  &lt;br /&gt;
=== Решење ===&lt;br /&gt;
CLH алгоритам процесе уланчава у уланчану листу по редоследу којим долазе. Самим тим та листа се понаша као ред и тиме је овај алгоритам правичан јер користи FIFO принцип.&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev;&lt;br /&gt;
        &amp;lt; prev = tail; tail = new_node; &amp;gt;&lt;br /&gt;
        &amp;lt; await(tail == nullptr || !prev-&amp;gt;locked); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење: &lt;br /&gt;
Пошто су prev и new_node локални показивачи, можемо да их усмеримо на новокреирани чвор. Затим се недељиво позива функција SWAP која ће недељиво заменити вредност prev и tail показивача. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev = new_node;&lt;br /&gt;
        SWAP(prev, tail);&lt;br /&gt;
        while(prev!= nullptr &amp;amp;&amp;amp; prev-&amp;gt;locked) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз аутомобила, камиона и аутобуса превози возила са обале на обалу. Трајект поседује N позиција које су линеарлно постављене једна иза друге. Камиона заузима три, аутовус две а аутомобил једну позицију. Возила чекају на трајект у реду и на њега улазе једно по једно по редоследу у ком чекају у реду, док на трајекту има места. Када нема места да се наредно возило у реду укрца и трајект није у потпуности попуњен, преко реда се укрцавају мања возила док се трајект не попуни у потпуности. Када је комплетно пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају у редоследу супротном од оног у којем су се укрцала. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Написати монитор са &#039;&#039;signal and wait&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз и раде следеће: примају позитивне вредности на улазу и прослеђују их на излаз ако су веће од запамћеног минимума процеса. Процеси имају само две локације, за сачувани минимум и за последњу примљену вредност. Када на улаз стигне EOS, избацују минималну вредност на излаз а затим EOS. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n процеса који опадајуће соритају до n улазних позитивних вредности које се убацују на почетак проточне обраде а завршавају се са EOS.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int min;&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (input &amp;lt; min) {&lt;br /&gt;
            out.send(min);&lt;br /&gt;
            min = input;&lt;br /&gt;
        } else out.send(input);&lt;br /&gt;
    out.send(min);    &lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји N пчела и један гладан медвед (&#039;&#039;The bear and honeybees&#039;&#039;). Они користе заједничку кошницу. Кошница је иницијално празна и може да прими до N напрстака меда. Медвед спава док се кошница не напуни медом, када се напуни медом меда поједе сав мед након чега се враћа на спавање. Пчелице непрестано лете од света до света и сакупљају мед. Она пчела која је попунила кошницу буди медведа. Решити проблем користећи CSP.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[Bee(i:1..N)::BEE || Bear::Bear || BeeHive::BeeHive]&lt;br /&gt;
&lt;br /&gt;
BEE:: *[&lt;br /&gt;
&lt;br /&gt;
	flyAndCollect();&lt;br /&gt;
	BeeHive!honneyCollected();&lt;br /&gt;
	BeeHive?goBackToCollecting();&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
Bear:: * [&lt;br /&gt;
	&lt;br /&gt;
	sleep();&lt;br /&gt;
	BeeHive?bearEat();&lt;br /&gt;
	BeeHive!allIsEaten();&lt;br /&gt;
	BeeHive?okToSleep();&lt;br /&gt;
	&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
BeeHive:: [&lt;br /&gt;
	size:integer; size:=0;&lt;br /&gt;
	N:integer; N:=...;&lt;br /&gt;
	&lt;br /&gt;
	*[&lt;br /&gt;
		size &amp;lt; N; Bees(i)?honneyCollected() -&amp;gt; [&lt;br /&gt;
			size := size + 1;&lt;br /&gt;
			&lt;br /&gt;
			size==N -&amp;gt; [BeeHive!bearEat();]&lt;br /&gt;
			[]&lt;br /&gt;
			size &amp;lt; N -&amp;gt; [Bees(i)!goBackToCollecting();]&lt;br /&gt;
			&lt;br /&gt;
		]&lt;br /&gt;
	&lt;br /&gt;
		[]&lt;br /&gt;
	&lt;br /&gt;
		size == N; BeeHive?allIsEaten() - &amp;gt; [&lt;br /&gt;
			size = 0;&lt;br /&gt;
			BeeHive!okToSleep();&lt;br /&gt;
		]&lt;br /&gt;
	&lt;br /&gt;
	]&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7260</id>
		<title>КДП/Фебруар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7260"/>
		<updated>2024-02-06T14:13:54Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: избачен дупликат речи&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2223/KDP_2023_feb.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;Fine grain Ticket&#039;&#039; алгоритам реализован помоћу &#039;&#039;addAndGet&#039;&#039; операције. Уколико би &#039;&#039;addAndGet&#039;&#039; операција имала следећи ефекат: &amp;lt;code&amp;gt;addAndGet(var, incr) : &amp;lt; var = var + incr; return(var);&amp;lt;/code&amp;gt;, да ли је могуће направити &#039;&#039;Fine grain&#039;&#039; решење, полазећи од &#039;&#039;Coarse grain&#039;&#039; решења, и ако је могуће - направите га. Написати и &#039;&#039;Coarse grain&#039;&#039; решење. &lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        &amp;lt; myTicket=ticket++; &amp;gt;&lt;br /&gt;
        &amp;lt; await(myTicket==next); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        myTicket = addAndGet(ticket, 1) - 1;&lt;br /&gt;
        while(myTicket != next) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Племе људождера једе заједничку вечеру из казана који може да прими M порција куваних мисионара (&#039;&#039;The Dining Savages Problem&#039;&#039;). Када људождер пожели да руча онда се он сам послужи из заједничког казана, уколико казан није празан. Уколико је казан празан људождер буди кувара и сачека док кувар не напуни казан и онда узима своју порцију, а тек након тога преостали могу јести. Није дозвољено будити кувара уколико се налази бар мало хране у казану. Написати монитор са &#039;&#039;signal and continue&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи активне мониторе решити проблем филозофа који ручавају (&#039;&#039;The Dining Philosophers&#039;&#039;). Филозофи могу да комуницирају искључиво са процесом координатором (централизовано решење). Обезбедити да филозоф који је пре затражио да једе пре и започиње са јелом. Написати код за филозофе и за процес координатор.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
: &#039;&#039;Исти задатак дошао је у [[КДП/Јул 2020#3. задатак|јулу 2020. године]]. Ипак, аутор је одлучио да постави своје решење које је добило максималан број бодова.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = ...;&lt;br /&gt;
enum op_kind{REQUEST,RELEASE};&lt;br /&gt;
chan request(int, op_kind);&lt;br /&gt;
chan reply[N](bool);&lt;br /&gt;
&lt;br /&gt;
class Coordinator {&lt;br /&gt;
public:&lt;br /&gt;
    void run() {&lt;br /&gt;
        int id;&lt;br /&gt;
        op_kind op;&lt;br /&gt;
        queue&amp;lt;int&amp;gt; waiting;&lt;br /&gt;
        int forks[N] = {true};&lt;br /&gt;
        while (true) {&lt;br /&gt;
            receive request(id, op);&lt;br /&gt;
            int left = id, right = (id + 1) % N;&lt;br /&gt;
            if (op == REQUEST) {&lt;br /&gt;
                if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                    forks[left] = forks[right] = false;&lt;br /&gt;
                    send reply[id](OK);&lt;br /&gt;
                } else {&lt;br /&gt;
                    waiting.push(id);&lt;br /&gt;
                }&lt;br /&gt;
            } else if (op == RELEASE) {&lt;br /&gt;
                forks[left] = forks[right] = true;&lt;br /&gt;
                send reply[id](OK);&lt;br /&gt;
                while (!waiting.empty()) {&lt;br /&gt;
                    id = waiting.top();&lt;br /&gt;
                    left = id, right = (id + 1) % N;&lt;br /&gt;
                    if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                        forks[left] = forks[right] = false;&lt;br /&gt;
                        waiting.pop();&lt;br /&gt;
                        send reply[id](OK);&lt;br /&gt;
                    } else break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // Think&lt;br /&gt;
        send request(id, REQUEST);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // Eat&lt;br /&gt;
        send request(id, RELEASE);&lt;br /&gt;
        receive reply[id](status)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
На једној обали реке се налази чамац који превози путнике са једне на другу обалу и који може да прими тачно десет путника. Чамац могу да користе мушкарци, жене и деца. Чамац може да исплови само ако се у њему налази тачно онолико путника колики му је капацитет, али само под условом да се у чамцу налазе бар два мушкарца. Деца не смеју ући у чамац уколико се у њему не налазе бар једна одрасла особа и по завршетку вожње у чамцу не смеју да остану само деца. Сматрати да ће се чамац након искрцавања свих путника одмах бити спреман да прими наредну групу путника. Користећи &#039;&#039;CSP&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Водио сам се решењем истог задатка који је био у делу са регионима. Једино за шта нисам сигуран је да ли треба да се шаљу поруке деци уколико су се одрасли укрцали и одраслима уколико су се деца искрцала због тога што се то проверава у заштитним условима.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[Man(i:1..N)::MAN || Woman(i:1..N)::WOMAN || Child(i:1..N)::CHILD || Boat::BOAT]&lt;br /&gt;
&lt;br /&gt;
BOAT:: &lt;br /&gt;
[&lt;br /&gt;
	capacity:integer; capacity:=0;&lt;br /&gt;
	boarding:integer; boarding:=1;&lt;br /&gt;
	onBoard:integer; onBoard:=0;&lt;br /&gt;
	onBoardMen:integer; onBoardMen:=0;&lt;br /&gt;
	onBoardWomen:integer; onBoardWomen:=0;&lt;br /&gt;
	onBoardChildren:integer; onBoardChildren:=0;	&lt;br /&gt;
	&lt;br /&gt;
	*[&lt;br /&gt;
		boarding==1 -&amp;gt; &lt;br /&gt;
		[&lt;br /&gt;
			onBoard == capacity, Man(i:1..N) Man(i)?enter -&amp;gt;  Man(i)!boatFull;&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard &amp;lt; capacity; Man(i:1..N) Man(i)?enter -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				&lt;br /&gt;
				onBoard:=onBoard+1;&lt;br /&gt;
				onBoardMen:=onBoardMen+1;&lt;br /&gt;
				&lt;br /&gt;
				Man(i)!boarded;&lt;br /&gt;
				&lt;br /&gt;
				onBoard==capacity -&amp;gt; boarding:=0;&lt;br /&gt;
			]&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard == capacity, Woman(i:1..N) Woman(i)?enter -&amp;gt;  Woman(i)!boatFull;&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard &amp;lt; capacity and onBoard-onBoardMen &amp;lt;= 7, Woman(i:1..N) Woman(i)?enter -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard+1;&lt;br /&gt;
				onBoardWomen:=onBoardWomen+1;&lt;br /&gt;
				&lt;br /&gt;
				Woman(i)!boarded;&lt;br /&gt;
				&lt;br /&gt;
				onBoard==capacity -&amp;gt; boarding:=0;&lt;br /&gt;
			]&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard == capacity, Child(i:1..N) Child(i)?enter -&amp;gt;  Child(i)!boatFull;&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard == 0, Child(i:1..N) Child(i)?enter -&amp;gt;  Child(i)!waitForAdult;&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard-onBoardMen &amp;lt;= 7, Child(i:1..N) Child(i)?enter -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard+1;&lt;br /&gt;
				onBoardChildren:=onBoardChildren+1;&lt;br /&gt;
				&lt;br /&gt;
				Child(i)!boarded;&lt;br /&gt;
				&lt;br /&gt;
				onBoard==capacity -&amp;gt; boarding:=0;&lt;br /&gt;
			]&lt;br /&gt;
		]&lt;br /&gt;
		[]&lt;br /&gt;
		boarding==0 -&amp;gt;&lt;br /&gt;
		[&lt;br /&gt;
			onBoardMen+onBoardWomen==1 and onBoardChildren &amp;gt; 0, Man(i)?exit -&amp;gt; Man(i)!waitForChildrenToExit;&lt;br /&gt;
			[]&lt;br /&gt;
			(onBoardMen+onBoardWomen&amp;gt;1 and onBoardChildren &amp;gt; 0) or onBoardChildren==0, Man(i)?exit -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard-1;&lt;br /&gt;
				onBoardMen:=onBoardMen-1;&lt;br /&gt;
				&lt;br /&gt;
				Man(i)!exited;&lt;br /&gt;
				&lt;br /&gt;
				onBoard == 0 -&amp;gt; boarding:=1;&lt;br /&gt;
			]&lt;br /&gt;
			[]&lt;br /&gt;
			onBoardMen+onBoardWomen==1 and onBoardChildren &amp;gt; 0, Woman(i)?exit -&amp;gt; Woman(i)!waitForChildrenToExit;&lt;br /&gt;
			[]&lt;br /&gt;
			(onBoardMen+onBoardWomen&amp;gt;1 and onBoardChildren &amp;gt; 0) or onBoardChildren==0, Woman(i)?exit -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard-1;&lt;br /&gt;
				onBoardWomen:=onBoardWomen-1;&lt;br /&gt;
				&lt;br /&gt;
				Woman(i)!exited;&lt;br /&gt;
				&lt;br /&gt;
				onBoard == 0 -&amp;gt; boarding:=1;&lt;br /&gt;
&lt;br /&gt;
			]&lt;br /&gt;
			[]&lt;br /&gt;
			Child(i)?exit -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard - 1;&lt;br /&gt;
				onBoardChildren:= onBoardChildren -1;&lt;br /&gt;
				Child!exited;&lt;br /&gt;
			]&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
		]&lt;br /&gt;
	]&lt;br /&gt;
	&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
MAN:: &lt;br /&gt;
[&lt;br /&gt;
	Man!enter;&lt;br /&gt;
	&lt;br /&gt;
	[&lt;br /&gt;
		Man?boatFull -&amp;gt; waitForReturnTrip;&lt;br /&gt;
		[]&lt;br /&gt;
		Man?boarded -&amp;gt; &lt;br /&gt;
		[&lt;br /&gt;
			Man!exit;&lt;br /&gt;
			[&lt;br /&gt;
				Man?waitForChildrenToExit -&amp;gt; wait;&lt;br /&gt;
				[]&lt;br /&gt;
				Man(i)?exited; //iskrcao se muskarac&lt;br /&gt;
			]&lt;br /&gt;
		]&lt;br /&gt;
		&lt;br /&gt;
	]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
WOMAN:: &lt;br /&gt;
[&lt;br /&gt;
	Woman!enter;&lt;br /&gt;
	&lt;br /&gt;
	[&lt;br /&gt;
		Woman?boatFull -&amp;gt; waitForReturnTrip;&lt;br /&gt;
		[]&lt;br /&gt;
		Woman?boarded -&amp;gt; &lt;br /&gt;
		[&lt;br /&gt;
			Woman!exit;&lt;br /&gt;
			[&lt;br /&gt;
				Woman?waitForChildrenToExit -&amp;gt; wait;&lt;br /&gt;
				[]&lt;br /&gt;
				Woman(i)?exited; //iskrcala se zena&lt;br /&gt;
			]&lt;br /&gt;
		]&lt;br /&gt;
	]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
CHILD::&lt;br /&gt;
[&lt;br /&gt;
	Child!enter;&lt;br /&gt;
	&lt;br /&gt;
	[&lt;br /&gt;
		Child?boatFull -&amp;gt; waitForReturnTrip;&lt;br /&gt;
		[]&lt;br /&gt;
		Child?waitForAdult -&amp;gt; wait;&lt;br /&gt;
		[]&lt;br /&gt;
		Child?boarded -&amp;gt;&lt;br /&gt;
		[&lt;br /&gt;
			Child!exit;&lt;br /&gt;
			Child?exited; //iskrcalo se dete&lt;br /&gt;
		]&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7259</id>
		<title>КДП/Фебруар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7259"/>
		<updated>2024-02-06T14:10:30Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2223/KDP_2023_feb.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;Fine grain Ticket&#039;&#039; алгоритам реализован помоћу &#039;&#039;addAndGet&#039;&#039; операције. Уколико би &#039;&#039;addAndGet&#039;&#039; операција имала следећи ефекат: &amp;lt;code&amp;gt;addAndGet(var, incr) : &amp;lt; var = var + incr; return(var);&amp;lt;/code&amp;gt;, да ли је могуће направити &#039;&#039;Fine grain&#039;&#039; решење, полазећи од &#039;&#039;Coarse grain&#039;&#039; решења, и ако је могуће - направите га. Написати и &#039;&#039;Coarse grain&#039;&#039; решење. &lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        &amp;lt; myTicket=ticket++; &amp;gt;&lt;br /&gt;
        &amp;lt; await(myTicket==next); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        myTicket = addAndGet(ticket, 1) - 1;&lt;br /&gt;
        while(myTicket != next) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Племе људождера једе заједничку вечеру из казана који може да прими M порција куваних мисионара (&#039;&#039;The Dining Savages Problem&#039;&#039;). Када људождер пожели да руча онда се он сам послужи из заједничког казана, уколико казан није празан. Уколико је казан празан људождер буди кувара и сачека док кувар не напуни казан и онда узима своју порцију, а тек након тога преостали могу јести. Није дозвољено будити кувара уколико се налази бар мало хране у казану. Написати монитор са &#039;&#039;signal and continue&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи активне мониторе решити проблем филозофа који ручавају (&#039;&#039;The Dining Philosophers&#039;&#039;). Филозофи могу да комуницирају искључиво са процесом координатором (централизовано решење). Обезбедити да филозоф који је пре затражио да једе пре и започиње са јелом. Написати код за филозофе и за процес координатор.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
: &#039;&#039;Исти задатак дошао је у [[КДП/Јул 2020#3. задатак|јулу 2020. године]]. Ипак, аутор је одлучио да постави своје решење које је добило максималан број бодова.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = ...;&lt;br /&gt;
enum op_kind{REQUEST,RELEASE};&lt;br /&gt;
chan request(int, op_kind);&lt;br /&gt;
chan reply[N](bool);&lt;br /&gt;
&lt;br /&gt;
class Coordinator {&lt;br /&gt;
public:&lt;br /&gt;
    void run() {&lt;br /&gt;
        int id;&lt;br /&gt;
        op_kind op;&lt;br /&gt;
        queue&amp;lt;int&amp;gt; waiting;&lt;br /&gt;
        int forks[N] = {true};&lt;br /&gt;
        while (true) {&lt;br /&gt;
            receive request(id, op);&lt;br /&gt;
            int left = id, right = (id + 1) % N;&lt;br /&gt;
            if (op == REQUEST) {&lt;br /&gt;
                if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                    forks[left] = forks[right] = false;&lt;br /&gt;
                    send reply[id](OK);&lt;br /&gt;
                } else {&lt;br /&gt;
                    waiting.push(id);&lt;br /&gt;
                }&lt;br /&gt;
            } else if (op == RELEASE) {&lt;br /&gt;
                forks[left] = forks[right] = true;&lt;br /&gt;
                send reply[id](OK);&lt;br /&gt;
                while (!waiting.empty()) {&lt;br /&gt;
                    id = waiting.top();&lt;br /&gt;
                    left = id, right = (id + 1) % N;&lt;br /&gt;
                    if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                        forks[left] = forks[right] = false;&lt;br /&gt;
                        waiting.pop();&lt;br /&gt;
                        send reply[id](OK);&lt;br /&gt;
                    } else break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // Think&lt;br /&gt;
        send request(id, REQUEST);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // Eat&lt;br /&gt;
        send request(id, RELEASE);&lt;br /&gt;
        receive reply[id](status)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
На једној обали реке се налази чамац који превози путнике са једне на другу обалу и који може да прими тачно десет путника. Чамац могу да користе мушкарци, жене и деца. Чамац може да исплови само ако се у њему налази тачно онолико путника колики му је капацитет, али само под условом да се у чамцу налазе бар два мушкарца. Деца не смеју ући у чамац уколико се у њему не налазе бар једна одрасла особа и по завршетку вожње у чамцу не смеју да остану само деца. Сматрати да ће се чамац након искрцавања свих путника одмах бити спреман да прими наредну групу путника. Користећи &#039;&#039;CSP&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Водио сам се решењем истог задатка који је био у делу са регионима. Једино за шта нисам сигуран је да ли треба да се шаљу поруке деци уколико су се одрасли укрцали и одраслима уколико су се деца искрцала због тога што се то проверава у заштитним условима условима.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[Man(i:1..N)::MAN || Woman(i:1..N)::WOMAN || Child(i:1..N)::CHILD || Boat::BOAT]&lt;br /&gt;
&lt;br /&gt;
BOAT:: &lt;br /&gt;
[&lt;br /&gt;
	capacity:integer; capacity:=0;&lt;br /&gt;
	boarding:integer; boarding:=1;&lt;br /&gt;
	onBoard:integer; onBoard:=0;&lt;br /&gt;
	onBoardMen:integer; onBoardMen:=0;&lt;br /&gt;
	onBoardWomen:integer; onBoardWomen:=0;&lt;br /&gt;
	onBoardChildren:integer; onBoardChildren:=0;	&lt;br /&gt;
	&lt;br /&gt;
	*[&lt;br /&gt;
		boarding==1 -&amp;gt; &lt;br /&gt;
		[&lt;br /&gt;
			onBoard == capacity, Man(i:1..N) Man(i)?enter -&amp;gt;  Man(i)!boatFull;&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard &amp;lt; capacity; Man(i:1..N) Man(i)?enter -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				&lt;br /&gt;
				onBoard:=onBoard+1;&lt;br /&gt;
				onBoardMen:=onBoardMen+1;&lt;br /&gt;
				&lt;br /&gt;
				Man(i)!boarded;&lt;br /&gt;
				&lt;br /&gt;
				onBoard==capacity -&amp;gt; boarding:=0;&lt;br /&gt;
			]&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard == capacity, Woman(i:1..N) Woman(i)?enter -&amp;gt;  Woman(i)!boatFull;&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard &amp;lt; capacity and onBoard-onBoardMen &amp;lt;= 7, Woman(i:1..N) Woman(i)?enter -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard+1;&lt;br /&gt;
				onBoardWomen:=onBoardWomen+1;&lt;br /&gt;
				&lt;br /&gt;
				Woman(i)!boarded;&lt;br /&gt;
				&lt;br /&gt;
				onBoard==capacity -&amp;gt; boarding:=0;&lt;br /&gt;
			]&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard == capacity, Child(i:1..N) Child(i)?enter -&amp;gt;  Child(i)!boatFull;&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard == 0, Child(i:1..N) Child(i)?enter -&amp;gt;  Child(i)!waitForAdult;&lt;br /&gt;
			[]&lt;br /&gt;
			onBoard-onBoardMen &amp;lt;= 7, Child(i:1..N) Child(i)?enter -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard+1;&lt;br /&gt;
				onBoardChildren:=onBoardChildren+1;&lt;br /&gt;
				&lt;br /&gt;
				Child(i)!boarded;&lt;br /&gt;
				&lt;br /&gt;
				onBoard==capacity -&amp;gt; boarding:=0;&lt;br /&gt;
			]&lt;br /&gt;
		]&lt;br /&gt;
		[]&lt;br /&gt;
		boarding==0 -&amp;gt;&lt;br /&gt;
		[&lt;br /&gt;
			onBoardMen+onBoardWomen==1 and onBoardChildren &amp;gt; 0, Man(i)?exit -&amp;gt; Man(i)!waitForChildrenToExit;&lt;br /&gt;
			[]&lt;br /&gt;
			(onBoardMen+onBoardWomen&amp;gt;1 and onBoardChildren &amp;gt; 0) or onBoardChildren==0, Man(i)?exit -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard-1;&lt;br /&gt;
				onBoardMen:=onBoardMen-1;&lt;br /&gt;
				&lt;br /&gt;
				Man(i)!exited;&lt;br /&gt;
				&lt;br /&gt;
				onBoard == 0 -&amp;gt; boarding:=1;&lt;br /&gt;
			]&lt;br /&gt;
			[]&lt;br /&gt;
			onBoardMen+onBoardWomen==1 and onBoardChildren &amp;gt; 0, Woman(i)?exit -&amp;gt; Woman(i)!waitForChildrenToExit;&lt;br /&gt;
			[]&lt;br /&gt;
			(onBoardMen+onBoardWomen&amp;gt;1 and onBoardChildren &amp;gt; 0) or onBoardChildren==0, Woman(i)?exit -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard-1;&lt;br /&gt;
				onBoardWomen:=onBoardWomen-1;&lt;br /&gt;
				&lt;br /&gt;
				Woman(i)!exited;&lt;br /&gt;
				&lt;br /&gt;
				onBoard == 0 -&amp;gt; boarding:=1;&lt;br /&gt;
&lt;br /&gt;
			]&lt;br /&gt;
			[]&lt;br /&gt;
			Child(i)?exit -&amp;gt; &lt;br /&gt;
			[&lt;br /&gt;
				onBoard:=onBoard - 1;&lt;br /&gt;
				onBoardChildren:= onBoardChildren -1;&lt;br /&gt;
				Child!exited;&lt;br /&gt;
			]&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
		]&lt;br /&gt;
	]&lt;br /&gt;
	&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
MAN:: &lt;br /&gt;
[&lt;br /&gt;
	Man!enter;&lt;br /&gt;
	&lt;br /&gt;
	[&lt;br /&gt;
		Man?boatFull -&amp;gt; waitForReturnTrip;&lt;br /&gt;
		[]&lt;br /&gt;
		Man?boarded -&amp;gt; &lt;br /&gt;
		[&lt;br /&gt;
			Man!exit;&lt;br /&gt;
			[&lt;br /&gt;
				Man?waitForChildrenToExit -&amp;gt; wait;&lt;br /&gt;
				[]&lt;br /&gt;
				Man(i)?exited; //iskrcao se muskarac&lt;br /&gt;
			]&lt;br /&gt;
		]&lt;br /&gt;
		&lt;br /&gt;
	]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
WOMAN:: &lt;br /&gt;
[&lt;br /&gt;
	Woman!enter;&lt;br /&gt;
	&lt;br /&gt;
	[&lt;br /&gt;
		Woman?boatFull -&amp;gt; waitForReturnTrip;&lt;br /&gt;
		[]&lt;br /&gt;
		Woman?boarded -&amp;gt; &lt;br /&gt;
		[&lt;br /&gt;
			Woman!exit;&lt;br /&gt;
			[&lt;br /&gt;
				Woman?waitForChildrenToExit -&amp;gt; wait;&lt;br /&gt;
				[]&lt;br /&gt;
				Woman(i)?exited; //iskrcala se zena&lt;br /&gt;
			]&lt;br /&gt;
		]&lt;br /&gt;
	]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
CHILD::&lt;br /&gt;
[&lt;br /&gt;
	Child!enter;&lt;br /&gt;
	&lt;br /&gt;
	[&lt;br /&gt;
		Child?boatFull -&amp;gt; waitForReturnTrip;&lt;br /&gt;
		[]&lt;br /&gt;
		Child?waitForAdult -&amp;gt; wait;&lt;br /&gt;
		[]&lt;br /&gt;
		Child?boarded -&amp;gt;&lt;br /&gt;
		[&lt;br /&gt;
			Child!exit;&lt;br /&gt;
			Child?exited; //iskrcalo se dete&lt;br /&gt;
		]&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7258</id>
		<title>КДП/Септембар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7258"/>
		<updated>2024-02-06T00:32:33Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити CLH алгоритам за критичну секцију (coarse grain). Реализовати (fine grain) верзију алгоритма уколико би на датом процесору постојала операција SWAP која би недељиво обављала замену вердности два операнда (SWAP(var1, var2): &amp;lt;temp=var1; var1=var2; var2=temp;&amp;gt;). Објаснити зашто је то правична критична секција.  &lt;br /&gt;
=== Решење ===&lt;br /&gt;
CLH алгоритам процесе уланчава у уланчану листу по редоследу којим долазе. Самим тим та листа се понаша као ред и тиме је овај алгоритам правичан јер користи FIFO принцип.&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev;&lt;br /&gt;
        &amp;lt; prev = tail; tail = new_node; &amp;gt;&lt;br /&gt;
        &amp;lt; await(tail == nullptr || !prev-&amp;gt;locked); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење: &lt;br /&gt;
Пошто су prev и new_node локални показивачи, можемо да их усмеримо на новокреирани чвор. Затим се недељиво позива функција SWAP која ће недељиво заменити вредност prev и tail показивача. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev = new_node;&lt;br /&gt;
        SWAP(prev, tail);&lt;br /&gt;
        while(prev!= nullptr &amp;amp;&amp;amp; prev-&amp;gt;locked) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз аутомобила, камиона и аутобуса превози возила са обале на обалу. Трајект поседује N позиција које су линеарлно постављене једна иза друге. Камиона заузима три, аутовус две а аутомобил једну позицију. Возила чекају на трајект у реду и на њега улазе једно по једно по редоследу у ком чекају у реду, док на трајекту има места. Када нема места да се наредно возило у реду укрца и трајект није у потпуности попуњен, преко реда се укрцавају мања возила док се трајект не попуни у потпуности. Када је комплетно пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају у редоследу супротном од оног у којем су се укрцала. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Написати монитор са &#039;&#039;signal and wait&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз и раде следеће: примају позитивне вредности на улазу и прослеђују их на излаз ако су веће од запамћеног минимума процеса. Процеси имају само две локације, за сачувани минимум и за последњу примљену вредност. Када на улаз стигне EOS, избацују минималну вредност на излаз а затим EOS. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n процеса који опадајуће соритају до n улазних позитивних вредности које се убацују на почетак проточне обраде а завршавају се са EOS.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int min;&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (input &amp;lt; min) {&lt;br /&gt;
            out.send(min);&lt;br /&gt;
            min = input;&lt;br /&gt;
        } else out.send(input);&lt;br /&gt;
    out.send(min);    &lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји N пчела и један гладан медвед (&#039;&#039;The bear and honeybees&#039;&#039;). Они користе заједничку кошницу. Кошница је иницијално празна и може да прими до N напрстака меда. Медвед спава док се кошница не напуни медом, када се напуни медом меда поједе сав мед након чега се враћа на спавање. Пчелице непрестано лете од света до света и сакупљају мед. Она пчела која је попунила кошницу буди медведа. Решити проблем користећи CSP.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[Bee(i:1..N)::BEE || Bear::BEAR || BeeHive::BEEHIVE]&lt;br /&gt;
&lt;br /&gt;
BEE:: *[&lt;br /&gt;
&lt;br /&gt;
	flyAndCollect(); &lt;br /&gt;
	BeeHive!honneyCollected();&lt;br /&gt;
	BeeHive?goBackToCollecting();&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
BEAR:: * [&lt;br /&gt;
	&lt;br /&gt;
	sleep();&lt;br /&gt;
	BeeHive?bearEat();&lt;br /&gt;
	BeeHive!allIsEaten();&lt;br /&gt;
	BeeHive?okToSleep();&lt;br /&gt;
	&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
BEEHIVE:: *[&lt;br /&gt;
&lt;br /&gt;
int size = 0;&lt;br /&gt;
int N = ...;&lt;br /&gt;
&lt;br /&gt;
	size &amp;lt; N; Bee(i:1..N)?honneyCollected() -&amp;gt; [&lt;br /&gt;
			size := size + 1;&lt;br /&gt;
			&lt;br /&gt;
			size==N -&amp;gt; [BeeHive!bearEat();]&lt;br /&gt;
			[]&lt;br /&gt;
			size &amp;lt; N -&amp;gt; [Bee(i:1..N)!goBackToCollecting();]&lt;br /&gt;
			&lt;br /&gt;
		]&lt;br /&gt;
	&lt;br /&gt;
	[]&lt;br /&gt;
	&lt;br /&gt;
	size == N; BeeHive?allIsEaten() - &amp;gt; [&lt;br /&gt;
		size = 0;&lt;br /&gt;
		BeeHive!okToSleep();&lt;br /&gt;
	]&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7257</id>
		<title>КДП/Септембар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7257"/>
		<updated>2024-02-06T00:24:31Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити CLH алгоритам за критичну секцију (coarse grain). Реализовати (fine grain) верзију алгоритма уколико би на датом процесору постојала операција SWAP која би недељиво обављала замену вердности два операнда (SWAP(var1, var2): &amp;lt;temp=var1; var1=var2; var2=temp;&amp;gt;). Објаснити зашто је то правична критична секција.  &lt;br /&gt;
=== Решење ===&lt;br /&gt;
CLH алгоритам процесе уланчава у уланчану листу по редоследу којим долазе. Самим тим та листа се понаша као ред и тиме је овај алгоритам правичан јер користи FIFO принцип.&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev;&lt;br /&gt;
        &amp;lt; prev = tail; tail = new_node; &amp;gt;&lt;br /&gt;
        &amp;lt; await(tail == nullptr || !prev-&amp;gt;locked); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење: &lt;br /&gt;
Пошто су prev и new_node локални показивачи, можемо да их усмеримо на новокреирани чвор. Затим се недељиво позива функција SWAP која ће недељиво заменити вредност prev и tail показивача. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev = new_node;&lt;br /&gt;
        SWAP(prev, tail);&lt;br /&gt;
        while(prev!= nullptr &amp;amp;&amp;amp; prev-&amp;gt;locked) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз аутомобила, камиона и аутобуса превози возила са обале на обалу. Трајект поседује N позиција које су линеарлно постављене једна иза друге. Камиона заузима три, аутовус две а аутомобил једну позицију. Возила чекају на трајект у реду и на њега улазе једно по једно по редоследу у ком чекају у реду, док на трајекту има места. Када нема места да се наредно возило у реду укрца и трајект није у потпуности попуњен, преко реда се укрцавају мања возила док се трајект не попуни у потпуности. Када је комплетно пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају у редоследу супротном од оног у којем су се укрцала. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Написати монитор са &#039;&#039;signal and wait&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз и раде следеће: примају позитивне вредности на улазу и прослеђују их на излаз ако су веће од запамћеног минимума процеса. Процеси имају само две локације, за сачувани минимум и за последњу примљену вредност. Када на улаз стигне EOS, избацују минималну вредност на излаз а затим EOS. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n процеса који опадајуће соритају до n улазних позитивних вредности које се убацују на почетак проточне обраде а завршавају се са EOS.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int min;&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (input &amp;lt; min) {&lt;br /&gt;
            out.send(min);&lt;br /&gt;
            min = input;&lt;br /&gt;
        } else out.send(input);&lt;br /&gt;
    out.send(min);    &lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји N пчела и један гладан медвед (&#039;&#039;The bear and honeybees&#039;&#039;). Они користе заједничку кошницу. Кошница је иницијално празна и може да прими до N напрстака меда. Медвед спава док се кошница не напуни медом, када се напуни медом меда поједе сав мед након чега се враћа на спавање. Пчелице непрестано лете од света до света и сакупљају мед. Она пчела која је попунила кошницу буди медведа. Решити проблем користећи CSP.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[(i:1..N)Bee::Bees || Bear::Bear || BeeHive::BeeHive]&lt;br /&gt;
&lt;br /&gt;
Bees:: *[&lt;br /&gt;
&lt;br /&gt;
	flyAndCollect(); &lt;br /&gt;
	BeeHive!honneyCollected();&lt;br /&gt;
	BeeHive?goBackToCollecting();&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
Bear:: * [&lt;br /&gt;
	&lt;br /&gt;
	sleep();&lt;br /&gt;
	BeeHive?bearEat();&lt;br /&gt;
	BeeHive!allIsEaten();&lt;br /&gt;
	BeeHive?okToSleep();&lt;br /&gt;
	&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
BeeHive:: *[&lt;br /&gt;
&lt;br /&gt;
int size = 0;&lt;br /&gt;
int N = ...;&lt;br /&gt;
&lt;br /&gt;
	size &amp;lt; N; Bees(i)?honneyCollected() -&amp;gt; [&lt;br /&gt;
			size := size + 1;&lt;br /&gt;
			&lt;br /&gt;
			size==N -&amp;gt; [BeeHive!bearEat();]&lt;br /&gt;
			[]&lt;br /&gt;
			size &amp;lt; N -&amp;gt; [Bees(i)!goBackToCollecting();]&lt;br /&gt;
			&lt;br /&gt;
		]&lt;br /&gt;
	&lt;br /&gt;
	[]&lt;br /&gt;
	&lt;br /&gt;
	size == N; BeeHive?allIsEaten() - &amp;gt; [&lt;br /&gt;
		size = 0;&lt;br /&gt;
		BeeHive!okToSleep();&lt;br /&gt;
	]&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7256</id>
		<title>КДП/Септембар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7256"/>
		<updated>2024-02-05T21:31:18Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити CLH алгоритам за критичну секцију (coarse grain). Реализовати (fine grain) верзију алгоритма уколико би на датом процесору постојала операција SWAP која би недељиво обављала замену вердности два операнда (SWAP(var1, var2): &amp;lt;temp=var1; var1=var2; var2=temp;&amp;gt;). Објаснити зашто је то правична критична секција.  &lt;br /&gt;
=== Решење ===&lt;br /&gt;
CLH алгоритам процесе уланчава у уланчану листу по редоследу којим долазе. Самим тим та листа се понаша као ред и тиме је овај алгоритам правичан јер користи FIFO принцип.&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev;&lt;br /&gt;
        &amp;lt; prev = tail; tail = new_node; &amp;gt;&lt;br /&gt;
        &amp;lt; await(tail == nullptr || !prev-&amp;gt;locked); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење: &lt;br /&gt;
Пошто су prev и new_node локални показивачи, можемо да их усмеримо на новокреирани чвор. Затим се недељиво позива функција SWAP која ће недељиво заменити вредност prev и tail показивача. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev = new_node;&lt;br /&gt;
        SWAP(prev, tail);&lt;br /&gt;
        while(prev!= nullptr &amp;amp;&amp;amp; prev-&amp;gt;locked) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз аутомобила, камиона и аутобуса превози возила са обале на обалу. Трајект поседује N позиција које су линеарлно постављене једна иза друге. Камиона заузима три, аутовус две а аутомобил једну позицију. Возила чекају на трајект у реду и на њега улазе једно по једно по редоследу у ком чекају у реду, док на трајекту има места. Када нема места да се наредно возило у реду укрца и трајект није у потпуности попуњен, преко реда се укрцавају мања возила док се трајект не попуни у потпуности. Када је комплетно пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају у редоследу супротном од оног у којем су се укрцала. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Написати монитор са &#039;&#039;signal and wait&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз и раде следеће: примају позитивне вредности на улазу и прослеђују их на излаз ако су веће од запамћеног минимума процеса. Процеси имају само две локације, за сачувани минимум и за последњу примљену вредност. Када на улаз стигне EOS, избацују минималну вредност на излаз а затим EOS. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n процеса који опадајуће соритају до n улазних позитивних вредности које се убацују на почетак проточне обраде а завршавају се са EOS.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int min;&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (input &amp;lt; min) {&lt;br /&gt;
            out.send(min);&lt;br /&gt;
            min = input;&lt;br /&gt;
        } else out.send(input);&lt;br /&gt;
    out.send(min);    &lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји N пчела и један гладан медвед (&#039;&#039;The bear and honeybees&#039;&#039;). Они користе заједничку кошницу. Кошница је иницијално празна и може да прими до N напрстака меда. Медвед спава док се кошница не напуни медом, када се напуни медом меда поједе сав мед након чега се враћа на спавање. Пчелице непрестано лете од света до света и сакупљају мед. Она пчела која је попунила кошницу буди медведа. Решити проблем користећи CSP.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7255</id>
		<title>КДП/Септембар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7255"/>
		<updated>2024-02-05T21:23:21Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити CLH алгоритам за критичну секцију (coarse grain). Реализовати (fine grain) верзију алгоритма уколико би на датом процесору постојала операција SWAP која би недељиво обављала замену вердности два операнда (SWAP(var1, var2): &amp;lt;temp=var1; var1=var2; var2=temp;&amp;gt;). Објаснити зашто је то правична критична секција.  &lt;br /&gt;
=== Решење ===&lt;br /&gt;
CLH алгоритам процесе уланчава у уланчану листу по редоследу којим долазе. Самим тим та листа се понаша као ред и тиме је овај алгоритам правичан јер користи FIFO принцип.&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev;&lt;br /&gt;
        &amp;lt; prev = tail; tail = new_node; &amp;gt;&lt;br /&gt;
        &amp;lt; await(tail == nullptr || !prev-&amp;gt;locked); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење: &lt;br /&gt;
Пошто су prev и new_node локални показивачи, можемо да их усмеримо на новокреирани чвор. Затим се недељиво позива функција SWAP која ће недељиво заменити вредност prev и tail показивача. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev = new_node;&lt;br /&gt;
        SWAP(prev, tail);&lt;br /&gt;
        while(prev!= nullptr &amp;amp;&amp;amp; prev-&amp;gt;locked) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз аутомобила, камиона и аутобуса превози возила са обале на обалу. Трајект поседује N позиција које су линеарлно постављене једна иза друге. Камиона заузима три, аутовус две а аутомобил једну позицију. Возила чекају на трајект у реду и на њега улазе једно по једно по редоследу у ком чекају у реду, док на трајекту има места. Када нема места да се наредно возило у реду укрца и трајект није у потпуности попуњен, преко реда се укрцавају мања возила док се трајект не попуни у потпуности. Када је комплетно пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају у редоследу супротном од оног у којем су се укрцала. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Написати монитор са &#039;&#039;signal and wait&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз и раде следеће: примају позитивне вредности на улазу и прослеђују их на излаз ако су веће од запамћеног минимума процеса. Процеси имају само две локације, за сачувани минимум и за последњу примљену вредност. Када на улаз стигне EOS, избацују минималну вредност на излаз а затим EOS. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n процеса који опадајуће соритају до n улазних позитивних вредности које се убацују на почетак проточне обраде а завршавају се са EOS.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int min;&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (input &amp;lt; min) {&lt;br /&gt;
            out.send(min);&lt;br /&gt;
            min = input;&lt;br /&gt;
        } else out.send(input);&lt;br /&gt;
    out.send(min);    &lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји N пчела и један гладан медвед (&#039;&#039;The bear and honeybees&#039;&#039;). Они користе заједничку кошницу. Кошница је иницијално празна и може да прими до N напрстака меда. Медвед спава док се кошница не напуни медом, када се напуни медом меда поједе сав мед након чега се враћа на спавање. Пчелице непрестано лете од света до света и сакупљају мед. Она пчела која је попунила кошницу буди медведа. Решити проблем користећи CSP.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7254</id>
		<title>КДП/Септембар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7254"/>
		<updated>2024-02-05T21:22:23Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити CLH алгоритам за критичну секцију (coarse grain). Реализовати (fine grain) верзију алгоритма уколико би на датом процесору постојала операција SWAP која би недељиво обављала замену вердности два операнда (SWAP(var1, var2): &amp;lt;temp=var1; var1=var2; var2=temp;&amp;gt;). Објаснити зашто је то правична критична секција.  &lt;br /&gt;
=== Решење ===&lt;br /&gt;
CLH алгоритам процесе уланчава у уланчану листу по редоследу којим долазе. Самим тим та листа се понаша као ред и тиме је овај алгоритам правичан јер користи FIFO принцип.&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev;&lt;br /&gt;
        &amp;lt; prev = tail; tail = new_node; &amp;gt;&lt;br /&gt;
        &amp;lt; await(tail == nullptr || !prev-&amp;gt;locked); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење: &lt;br /&gt;
Пошто су prev и new_node локални показивачи, можемо да их усмеримо на новокреирани чвор. Затим се недељиво позива функција SWAP која ће недељиво заменити вредност prev и tail показивача. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev = new_node;&lt;br /&gt;
        SWAP(prev, tail);&lt;br /&gt;
        while(prev!= nullptr &amp;amp;&amp;amp; prev-&amp;gt;locked) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
== {{категорија|1. задатак|Монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз аутомобила, камиона и аутобуса превози возила са обале на обалу. Трајект поседује N позиција које су линеарлно постављене једна иза друге. Камиона заузима три, аутовус две а аутомобил једну позицију. Возила чекају на трајект у реду и на њега улазе једно по једно по редоследу у ком чекају у реду, док на трајекту има места. Када нема места да се наредно возило у реду укрца и трајект није у потпуности попуњен, преко реда се укрцавају мања возила док се трајект не попуни у потпуности. Када је комплетно пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају у редоследу супротном од оног у којем су се укрцала. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Написати монитор са &#039;&#039;signal and wait&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
== {{категорија|1. задатак|Филтерски_процеси}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз и раде следеће: примају позитивне вредности на улазу и прослеђују их на излаз ако су веће од запамћеног минимума процеса. Процеси имају само две локације, за сачувани минимум и за последњу примљену вредност. Када на улаз стигне EOS, избацују минималну вредност на излаз а затим EOS. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n процеса који опадајуће соритају до n улазних позитивних вредности које се убацују на почетак проточне обраде а завршавају се са EOS.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int min;&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (input &amp;lt; min) {&lt;br /&gt;
            out.send(min);&lt;br /&gt;
            min = input;&lt;br /&gt;
        } else out.send(input);&lt;br /&gt;
    out.send(min);    &lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
== {{категорија|1. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји N пчела и један гладан медвед (&#039;&#039;The bear and honeybees&#039;&#039;). Они користе заједничку кошницу. Кошница је иницијално празна и може да прими до N напрстака меда. Медвед спава док се кошница не напуни медом, када се напуни медом меда поједе сав мед након чега се враћа на спавање. Пчелице непрестано лете од света до света и сакупљају мед. Она пчела која је попунила кошницу буди медведа. Решити проблем користећи CSP.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7253</id>
		<title>КДП/Фебруар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7253"/>
		<updated>2024-02-05T21:20:31Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2223/KDP_2023_feb.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;Fine grain Ticket&#039;&#039; алгоритам реализован помоћу &#039;&#039;addAndGet&#039;&#039; операције. Уколико би &#039;&#039;addAndGet&#039;&#039; операција имала следећи ефекат: &amp;lt;code&amp;gt;addAndGet(var, incr) : &amp;lt; var = var + incr; return(var);&amp;lt;/code&amp;gt;, да ли је могуће направити &#039;&#039;Fine grain&#039;&#039; решење, полазећи од &#039;&#039;Coarse grain&#039;&#039; решења, и ако је могуће - направите га. Написати и &#039;&#039;Coarse grain&#039;&#039; решење. &lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        &amp;lt; myTicket=ticket++; &amp;gt;&lt;br /&gt;
        &amp;lt; await(myTicket==next); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        myTicket = addAndGet(ticket, 1) - 1;&lt;br /&gt;
        while(myTicket != next) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Племе људождера једе заједничку вечеру из казана који може да прими M порција куваних мисионара (&#039;&#039;The Dining Savages Problem&#039;&#039;). Када људождер пожели да руча онда се он сам послужи из заједничког казана, уколико казан није празан. Уколико је казан празан људождер буди кувара и сачека док кувар не напуни казан и онда узима своју порцију, а тек након тога преостали могу јести. Није дозвољено будити кувара уколико се налази бар мало хране у казану. Написати монитор са &#039;&#039;signal and continue&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи активне мониторе решити проблем филозофа који ручавају (&#039;&#039;The Dining Philosophers&#039;&#039;). Филозофи могу да комуницирају искључиво са процесом координатором (централизовано решење). Обезбедити да филозоф који је пре затражио да једе пре и започиње са јелом. Написати код за филозофе и за процес координатор.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
: &#039;&#039;Исти задатак дошао је у [[КДП/Јул 2020#3. задатак|јулу 2020. године]]. Ипак, аутор је одлучио да постави своје решење које је добило максималан број бодова.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = ...;&lt;br /&gt;
enum op_kind{REQUEST,RELEASE};&lt;br /&gt;
chan request(int, op_kind);&lt;br /&gt;
chan reply[N](bool);&lt;br /&gt;
&lt;br /&gt;
class Coordinator {&lt;br /&gt;
public:&lt;br /&gt;
    void run() {&lt;br /&gt;
        int id;&lt;br /&gt;
        op_kind op;&lt;br /&gt;
        queue&amp;lt;int&amp;gt; waiting;&lt;br /&gt;
        int forks[N] = {true};&lt;br /&gt;
        while (true) {&lt;br /&gt;
            receive request(id, op);&lt;br /&gt;
            int left = id, right = (id + 1) % N;&lt;br /&gt;
            if (op == REQUEST) {&lt;br /&gt;
                if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                    forks[left] = forks[right] = false;&lt;br /&gt;
                    send reply[id](OK);&lt;br /&gt;
                } else {&lt;br /&gt;
                    waiting.push(id);&lt;br /&gt;
                }&lt;br /&gt;
            } else if (op == RELEASE) {&lt;br /&gt;
                forks[left] = forks[right] = true;&lt;br /&gt;
                send reply[id](OK);&lt;br /&gt;
                while (!waiting.empty()) {&lt;br /&gt;
                    id = waiting.top();&lt;br /&gt;
                    left = id, right = (id + 1) % N;&lt;br /&gt;
                    if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                        forks[left] = forks[right] = false;&lt;br /&gt;
                        waiting.pop();&lt;br /&gt;
                        send reply[id](OK);&lt;br /&gt;
                    } else break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // Think&lt;br /&gt;
        send request(id, REQUEST);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // Eat&lt;br /&gt;
        send request(id, RELEASE);&lt;br /&gt;
        receive reply[id](status)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
На једној обали реке се налази чамац који превози путнике са једне на другу обалу и који може да прими тачно десет путника. Чамац могу да користе мушкарци, жене и деца. Чамац може да исплови само ако се у њему налази тачно онолико путника колики му је капацитет, али само под условом да се у чамцу налазе бар два мушкарца. Деца не смеју ући у чамац уколико се у њему не налазе бар једна одрасла особа и по завршетку вожње у чамцу не смеју да остану само деца. Сматрати да ће се чамац након искрцавања свих путника одмах бити спреман да прими наредну групу путника. Користећи &#039;&#039;CSP&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7252</id>
		<title>КДП/Фебруар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7252"/>
		<updated>2024-02-05T21:18:58Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2223/KDP_2023_feb.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;Fine grain Ticket&#039;&#039; алгоритам реализован помоћу &#039;&#039;addAndGet&#039;&#039; операције. Уколико би &#039;&#039;addAndGet&#039;&#039; операција имала следећи ефекат: &amp;lt;code&amp;gt;addAndGet(var, incr) : &amp;lt; var = var + incr; return(var);&amp;lt;/code&amp;gt;, да ли је могуће направити &#039;&#039;Fine grain&#039;&#039; решење, полазећи од &#039;&#039;Coarse grain&#039;&#039; решења, и ако је могуће - направите га. Написати и &#039;&#039;Coarse grain&#039;&#039; решење. &lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони алгоритми}} ==&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        &amp;lt; myTicket=ticket++; &amp;gt;&lt;br /&gt;
        &amp;lt; await(myTicket==next); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        myTicket = addAndGet(ticket, 1) - 1;&lt;br /&gt;
        while(myTicket != next) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Племе људождера једе заједничку вечеру из казана који може да прими M порција куваних мисионара (&#039;&#039;The Dining Savages Problem&#039;&#039;). Када људождер пожели да руча онда се он сам послужи из заједничког казана, уколико казан није празан. Уколико је казан празан људождер буди кувара и сачека док кувар не напуни казан и онда узима своју порцију, а тек након тога преостали могу јести. Није дозвољено будити кувара уколико се налази бар мало хране у казану. Написати монитор са &#039;&#039;signal and continue&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи активне мониторе решити проблем филозофа који ручавају (&#039;&#039;The Dining Philosophers&#039;&#039;). Филозофи могу да комуницирају искључиво са процесом координатором (централизовано решење). Обезбедити да филозоф који је пре затражио да једе пре и започиње са јелом. Написати код за филозофе и за процес координатор.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
: &#039;&#039;Исти задатак дошао је у [[КДП/Јул 2020#3. задатак|јулу 2020. године]]. Ипак, аутор је одлучио да постави своје решење које је добило максималан број бодова.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = ...;&lt;br /&gt;
enum op_kind{REQUEST,RELEASE};&lt;br /&gt;
chan request(int, op_kind);&lt;br /&gt;
chan reply[N](bool);&lt;br /&gt;
&lt;br /&gt;
class Coordinator {&lt;br /&gt;
public:&lt;br /&gt;
    void run() {&lt;br /&gt;
        int id;&lt;br /&gt;
        op_kind op;&lt;br /&gt;
        queue&amp;lt;int&amp;gt; waiting;&lt;br /&gt;
        int forks[N] = {true};&lt;br /&gt;
        while (true) {&lt;br /&gt;
            receive request(id, op);&lt;br /&gt;
            int left = id, right = (id + 1) % N;&lt;br /&gt;
            if (op == REQUEST) {&lt;br /&gt;
                if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                    forks[left] = forks[right] = false;&lt;br /&gt;
                    send reply[id](OK);&lt;br /&gt;
                } else {&lt;br /&gt;
                    waiting.push(id);&lt;br /&gt;
                }&lt;br /&gt;
            } else if (op == RELEASE) {&lt;br /&gt;
                forks[left] = forks[right] = true;&lt;br /&gt;
                send reply[id](OK);&lt;br /&gt;
                while (!waiting.empty()) {&lt;br /&gt;
                    id = waiting.top();&lt;br /&gt;
                    left = id, right = (id + 1) % N;&lt;br /&gt;
                    if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                        forks[left] = forks[right] = false;&lt;br /&gt;
                        waiting.pop();&lt;br /&gt;
                        send reply[id](OK);&lt;br /&gt;
                    } else break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // Think&lt;br /&gt;
        send request(id, REQUEST);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // Eat&lt;br /&gt;
        send request(id, RELEASE);&lt;br /&gt;
        receive reply[id](status)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
На једној обали реке се налази чамац који превози путнике са једне на другу обалу и који може да прими тачно десет путника. Чамац могу да користе мушкарци, жене и деца. Чамац може да исплови само ако се у њему налази тачно онолико путника колики му је капацитет, али само под условом да се у чамцу налазе бар два мушкарца. Деца не смеју ући у чамац уколико се у њему не налазе бар једна одрасла особа и по завршетку вожње у чамцу не смеју да остану само деца. Сматрати да ће се чамац након искрцавања свих путника одмах бити спреман да прими наредну групу путника. Користећи &#039;&#039;CSP&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7250</id>
		<title>КДП/Фебруар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7250"/>
		<updated>2024-02-05T15:08:12Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2223/KDP_2023_feb.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;Fine grain Ticket&#039;&#039; алгоритам реализован помоћу &#039;&#039;addAndGet&#039;&#039; операције. Уколико би &#039;&#039;addAndGet&#039;&#039; операција имала следећи ефекат: &amp;lt;code&amp;gt;addAndGet(var, incr) : &amp;lt; var = var + incr; return(var);&amp;lt;/code&amp;gt;, да ли је могуће направити &#039;&#039;Fine grain&#039;&#039; решење, полазећи од &#039;&#039;Coarse grain&#039;&#039; решења, и ако је могуће - направите га. Написати и &#039;&#039;Coarse grain&#039;&#039; решење. &lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        &amp;lt; myTicket=ticket++; &amp;gt;&lt;br /&gt;
        &amp;lt; await(myTicket==next); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        myTicket = addAndGet(ticket, 1) - 1;&lt;br /&gt;
        while(myTicket != next) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Племе људождера једе заједничку вечеру из казана који може да прими M порција куваних мисионара (&#039;&#039;The Dining Savages Problem&#039;&#039;). Када људождер пожели да руча онда се он сам послужи из заједничког казана, уколико казан није празан. Уколико је казан празан људождер буди кувара и сачека док кувар не напуни казан и онда узима своју порцију, а тек након тога преостали могу јести. Није дозвољено будити кувара уколико се налази бар мало хране у казану. Написати монитор са &#039;&#039;signal and continue&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи активне мониторе решити проблем филозофа који ручавају (&#039;&#039;The Dining Philosophers&#039;&#039;). Филозофи могу да комуницирају искључиво са процесом координатором (централизовано решење). Обезбедити да филозоф који је пре затражио да једе пре и започиње са јелом. Написати код за филозофе и за процес координатор.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
: &#039;&#039;Исти задатак дошао је у [[КДП/Јул 2020#3. задатак|јулу 2020. године]]. Ипак, аутор је одлучио да постави своје решење које је добило максималан број бодова.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = ...;&lt;br /&gt;
enum op_kind{REQUEST,RELEASE};&lt;br /&gt;
chan request(int, op_kind);&lt;br /&gt;
chan reply[N](bool);&lt;br /&gt;
&lt;br /&gt;
class Coordinator {&lt;br /&gt;
public:&lt;br /&gt;
    void run() {&lt;br /&gt;
        int id;&lt;br /&gt;
        op_kind op;&lt;br /&gt;
        queue&amp;lt;int&amp;gt; waiting;&lt;br /&gt;
        int forks[N] = {true};&lt;br /&gt;
        while (true) {&lt;br /&gt;
            receive request(id, op);&lt;br /&gt;
            int left = id, right = (id + 1) % N;&lt;br /&gt;
            if (op == REQUEST) {&lt;br /&gt;
                if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                    forks[left] = forks[right] = false;&lt;br /&gt;
                    send reply[id](OK);&lt;br /&gt;
                } else {&lt;br /&gt;
                    waiting.push(id);&lt;br /&gt;
                }&lt;br /&gt;
            } else if (op == RELEASE) {&lt;br /&gt;
                forks[left] = forks[right] = true;&lt;br /&gt;
                send reply[id](OK);&lt;br /&gt;
                while (!waiting.empty()) {&lt;br /&gt;
                    id = waiting.top();&lt;br /&gt;
                    left = id, right = (id + 1) % N;&lt;br /&gt;
                    if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                        forks[left] = forks[right] = false;&lt;br /&gt;
                        waiting.pop();&lt;br /&gt;
                        send reply[id](OK);&lt;br /&gt;
                    } else break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // Think&lt;br /&gt;
        send request(id, REQUEST);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // Eat&lt;br /&gt;
        send request(id, RELEASE);&lt;br /&gt;
        receive reply[id](status)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
На једној обали реке се налази чамац који превози путнике са једне на другу обалу и који може да прими тачно десет путника. Чамац могу да користе мушкарци, жене и деца. Чамац може да исплови само ако се у њему налази тачно онолико путника колики му је капацитет, али само под условом да се у чамцу налазе бар два мушкарца. Деца не смеју ући у чамац уколико се у њему не налазе бар једна одрасла особа и по завршетку вожње у чамцу не смеју да остану само деца. Сматрати да ће се чамац након искрцавања свих путника одмах бити спреман да прими наредну групу путника. Користећи &#039;&#039;CSP&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7249</id>
		<title>КДП/Септембар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7249"/>
		<updated>2024-02-05T15:05:42Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити CLH алгоритам за критичну секцију (coarse grain). Реализовати (fine grain) верзију алгоритма уколико би на датом процесору постојала операција SWAP која би недељиво обављала замену вердности два операнда (SWAP(var1, var2): &amp;lt;temp=var1; var1=var2; var2=temp;&amp;gt;). Објаснити зашто је то правична критична секција.  &lt;br /&gt;
=== Решење ===&lt;br /&gt;
CLH алгоритам процесе уланчава у уланчану листу по редоследу којим долазе. Самим тим та листа се понаша као ред и тиме је овај алгоритам правичан јер користи FIFO принцип.&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev;&lt;br /&gt;
        &amp;lt; prev = tail; tail = new_node; &amp;gt;&lt;br /&gt;
        &amp;lt; await(tail == nullptr || !prev-&amp;gt;locked); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење: &lt;br /&gt;
Пошто су prev и new_node локални показивачи, можемо да их усмеримо на новокреирани чвор. Затим се недељиво позива функција SWAP која ће недељиво заменити вредност prev и tail показивача. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev = new_node;&lt;br /&gt;
        SWAP(prev, tail);&lt;br /&gt;
        while(prev!= nullptr &amp;amp;&amp;amp; prev-&amp;gt;locked) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз аутомобила, камиона и аутобуса превози возила са обале на обалу. Трајект поседује N позиција које су линеарлно постављене једна иза друге. Камиона заузима три, аутовус две а аутомобил једну позицију. Возила чекају на трајект у реду и на њега улазе једно по једно по редоследу у ком чекају у реду, док на трајекту има места. Када нема места да се наредно возило у реду укрца и трајект није у потпуности попуњен, преко реда се укрцавају мања возила док се трајект не попуни у потпуности. Када је комплетно пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају у редоследу супротном од оног у којем су се укрцала. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Написати монитор са &#039;&#039;signal and wait&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз и раде следеће: примају позитивне вредности на улазу и прослеђују их на излаз ако су веће од запамћеног минимума процеса. Процеси имају само две локације, за сачувани минимум и за последњу примљену вредност. Када на улаз стигне EOS, избацују минималну вредност на излаз а затим EOS. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n процеса који опадајуће соритају до n улазних позитивних вредности које се убацују на почетак проточне обраде а завршавају се са EOS.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int min;&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (input &amp;lt; min) {&lt;br /&gt;
            out.send(min);&lt;br /&gt;
            min = input;&lt;br /&gt;
        } else out.send(input);&lt;br /&gt;
    out.send(min);    &lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји N пчела и један гладан медвед (&#039;&#039;The bear and honeybees&#039;&#039;). Они користе заједничку кошницу. Кошница је иницијално празна и може да прими до N напрстака меда. Медвед спава док се кошница не напуни медом, када се напуни медом меда поједе сав мед након чега се враћа на спавање. Пчелице непрестано лете од света до света и сакупљају мед. Она пчела која је попунила кошницу буди медведа. Решити проблем користећи CSP.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7248</id>
		<title>КДП/Септембар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7248"/>
		<updated>2024-02-05T15:00:17Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{делимично решено}}&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити CLH алгоритам за критичну секцију (coarse grain). Реализовати (fine grain) верзију алгоритма уколико би на датом процесору постојала операција SWAP која би недељиво обављала замену вердности два операнда (SWAP(var1, var2): &amp;lt;temp=var1; var1=var2; var2=temp;&amp;gt;). Објаснити зашто је то правична критична секција.  &lt;br /&gt;
=== Решење ===&lt;br /&gt;
CLH алгоритам процесе уланчава у уланчану листу по редоследу којим долазе. Самим тим та листа се понаша као ред и тиме је овај алгоритам правичан јер користи FIFO принцип.&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev;&lt;br /&gt;
        &amp;lt; prev = tail; tail = new_node; &amp;gt;&lt;br /&gt;
        &amp;lt; await(tail == nullptr || !prev-&amp;gt;locked); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење: &lt;br /&gt;
Пошто су prev и new_node локални показивачи, можемо да их усмеримо на новокреирани чвор. Затим се недељиво позива функција SWAP која ће недељиво заменити вредност prev и tail показивача. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev = new_node;&lt;br /&gt;
        SWAP(prev, tail);&lt;br /&gt;
        while(prev!= nullptr &amp;amp;&amp;amp; prev-&amp;gt;locked) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз аутомобила, камиона и аутобуса превози возила са обале на обалу. Трајект поседује N позиција које су линеарлно постављене једна иза друге. Камиона заузима три, аутовус две а аутомобил једну позицију. Возила чекају на трајект у реду и на њега улазе једно по једно по редоследу у ком чекају у реду, док на трајекту има места. Када нема места да се наредно возило у реду укрца и трајект није у потпуности попуњен, преко реда се укрцавају мања возила док се трајект не попуни у потпуности. Када је комплетно пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају у редоследу супротном од оног у којем су се укрцала. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Написати монитор са &#039;&#039;signal and wait&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз и раде следеће: примају позитивне вредности на улазу и прослеђују их на излаз ако су веће од запамћеног минимума процеса. Процеси имају само две локације, за сачувани минимум и за последњу примљену вредност. Када на улаз стигне EOS, избацују минималну вредност на излаз а затим EOS. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n процеса који опадајуће соритају до n улазних позитивних вредности које се убацују на почетак проточне обраде а завршавају се са EOS.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int min;&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (input &amp;lt; min) {&lt;br /&gt;
            out.send(min);&lt;br /&gt;
            min = input;&lt;br /&gt;
        } else out.send(input);&lt;br /&gt;
    out.send(min);    &lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји N пчела и један гладан медвед (&#039;&#039;The bear and honeybees&#039;&#039;). Они користе заједничку кошницу. Кошница је иницијално празна и може да прими до N напрстака меда. Медвед спава док се кошница не напуни медом, када се напуни медом меда поједе сав мед након чега се враћа на спавање. Пчелице непрестано лете од света до света и сакупљају мед. Она пчела која је попунила кошницу буди медведа. Решити проблем користећи CSP.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7247</id>
		<title>КДП/Септембар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7247"/>
		<updated>2024-02-05T14:52:38Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: Нова страница: {{tocright}} {{делимично решено}}&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли п…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{делимично решено}}&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити CLH алгоритам за критичну секцију (coarse grain). Реализовати (fine grain) верзију алгоритма уколико би на датом процесору постојала операција SWAP која би недељиво обављала замену вердности два операнда (SWAP(var1, var2): &amp;lt;temp=var1; var1=var2; var2=temp;&amp;gt;). Објаснити зашто је то правична критична секција.  &lt;br /&gt;
=== Решење ===&lt;br /&gt;
CLH алгоритам процесе уланчава у уланчану листу по редоследу којим долазе. Самим тим та листа се понаша као ред и тиме је овај алгоритам правичан јер користи FIFO принцип.&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev;&lt;br /&gt;
        &amp;lt; prev = tail; tail = new_node; &amp;gt;&lt;br /&gt;
        &amp;lt; await(tail == nullptr || !prev-&amp;gt;locked); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење: &lt;br /&gt;
Пошто су prev и new_node локални показивачи, можемо да их усмеримо на новокреирани чвор. Затим се недељиво позива функција SWAP која ће недељиво заменити вредност prev и tail показивача. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev = new_node;&lt;br /&gt;
        SWAP(prev, tail);&lt;br /&gt;
        while(prev!= nullptr &amp;amp;&amp;amp; prev-&amp;gt;locked) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз аутомобила, камиона и аутобуса превози возила са обале на обалу. Трајект поседује N позиција које су линеарлно постављене једна иза друге. Камиона заузима три, аутовус две а аутомобил једну позицију. Возила чекају на трајект у реду и на њега улазе једно по једно по редоследу у ком чекају у реду, док на трајекту има места. Када нема места да се наредно возило у реду укрца и трајект није у потпуности попуњен, преко реда се укрцавају мања возила док се трајект не попуни у потпуности. Када је комплетно пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају у редоследу супротном од оног у којем су се укрцала. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Написати монитор са &#039;&#039;signal and wait&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз и раде следеће: примају позитивне вредности на улазу и прослеђују их на излаз ако су веће од запамћеног минимума процеса. Процеси имају само две локације, за сачувани минимум и за последњу примљену вредност. Када на улаз стигне EOS, избацују минималну вредност на излаз а затим EOS. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n процеса који опадајуће соритају до n улазних позитивних вредности које се убацују на почетак проточне обраде а завршавају се са EOS.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int min;&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (input &amp;lt; min) {&lt;br /&gt;
            out.send(min);&lt;br /&gt;
            min = input;&lt;br /&gt;
        } else out.send(input);&lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји N пчела и један гладан медвед (&#039;&#039;The bear and honeybees&#039;&#039;). Они користе заједничку кошницу. Кошница је иницијално празна и може да прими до N напрстака меда. Медвед спава док се кошница не напуни медом, када се напуни медом меда поједе сав мед након чега се враћа на спавање. Пчелице непрестано лете од света до света и сакупљају мед. Она пчела која је попунила кошницу буди медведа. Решити проблем користећи CSP.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7246</id>
		<title>КДП/Фебруар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7246"/>
		<updated>2024-02-05T13:47:26Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* {{категорија|1. задатак|Синхронизациони_алгоритми}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2223/KDP_2023_feb.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;Fine grain Ticket&#039;&#039; алгоритам реализован помоћу &#039;&#039;addAndGet&#039;&#039; операције. Уколико би &#039;&#039;addAndGet&#039;&#039; операција имала следећи ефекат: &amp;lt;code&amp;gt;addAndGet(var, incr) : &amp;lt; var = var + incr; return(var);&amp;lt;/code&amp;gt;, да ли је могуће направити &#039;&#039;Fine grain&#039;&#039; решење, полазећи од &#039;&#039;Coarse grain&#039;&#039; решења, и ако је могуће - направите га. Написати и &#039;&#039;Coarse grain&#039;&#039; решење. &lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        &amp;lt; myTicket=ticket++; &amp;gt;&lt;br /&gt;
        &amp;lt; await(myTicket==next); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        myTicket = addAndGet(ticket, 1) - 2;&lt;br /&gt;
        while(myTicket != next) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Племе људождера једе заједничку вечеру из казана који може да прими M порција куваних мисионара (&#039;&#039;The Dining Savages Problem&#039;&#039;). Када људождер пожели да руча онда се он сам послужи из заједничког казана, уколико казан није празан. Уколико је казан празан људождер буди кувара и сачека док кувар не напуни казан и онда узима своју порцију, а тек након тога преостали могу јести. Није дозвољено будити кувара уколико се налази бар мало хране у казану. Написати монитор са &#039;&#039;signal and continue&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи активне мониторе решити проблем филозофа који ручавају (&#039;&#039;The Dining Philosophers&#039;&#039;). Филозофи могу да комуницирају искључиво са процесом координатором (централизовано решење). Обезбедити да филозоф који је пре затражио да једе пре и започиње са јелом. Написати код за филозофе и за процес координатор.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
: &#039;&#039;Исти задатак дошао је у [[КДП/Јул 2020#3. задатак|јулу 2020. године]]. Ипак, аутор је одлучио да постави своје решење које је добило максималан број бодова.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = ...;&lt;br /&gt;
enum op_kind{REQUEST,RELEASE};&lt;br /&gt;
chan request(int, op_kind);&lt;br /&gt;
chan reply[N](bool);&lt;br /&gt;
&lt;br /&gt;
class Coordinator {&lt;br /&gt;
public:&lt;br /&gt;
    void run() {&lt;br /&gt;
        int id;&lt;br /&gt;
        op_kind op;&lt;br /&gt;
        queue&amp;lt;int&amp;gt; waiting;&lt;br /&gt;
        int forks[N] = {true};&lt;br /&gt;
        while (true) {&lt;br /&gt;
            receive request(id, op);&lt;br /&gt;
            int left = id, right = (id + 1) % N;&lt;br /&gt;
            if (op == REQUEST) {&lt;br /&gt;
                if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                    forks[left] = forks[right] = false;&lt;br /&gt;
                    send reply[id](OK);&lt;br /&gt;
                } else {&lt;br /&gt;
                    waiting.push(id);&lt;br /&gt;
                }&lt;br /&gt;
            } else if (op == RELEASE) {&lt;br /&gt;
                forks[left] = forks[right] = true;&lt;br /&gt;
                send reply[id](OK);&lt;br /&gt;
                while (!waiting.empty()) {&lt;br /&gt;
                    id = waiting.top();&lt;br /&gt;
                    left = id, right = (id + 1) % N;&lt;br /&gt;
                    if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                        forks[left] = forks[right] = false;&lt;br /&gt;
                        waiting.pop();&lt;br /&gt;
                        send reply[id](OK);&lt;br /&gt;
                    } else break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // Think&lt;br /&gt;
        send request(id, REQUEST);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // Eat&lt;br /&gt;
        send request(id, RELEASE);&lt;br /&gt;
        receive reply[id](status)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
На једној обали реке се налази чамац који превози путнике са једне на другу обалу и који може да прими тачно десет путника. Чамац могу да користе мушкарци, жене и деца. Чамац може да исплови само ако се у њему налази тачно онолико путника колики му је капацитет, али само под условом да се у чамцу налазе бар два мушкарца. Деца не смеју ући у чамац уколико се у њему не налазе бар једна одрасла особа и по завршетку вожње у чамцу не смеју да остану само деца. Сматрати да ће се чамац након искрцавања свих путника одмах бити спреман да прими наредну групу путника. Користећи &#039;&#039;CSP&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7245</id>
		<title>КДП/Фебруар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=7245"/>
		<updated>2024-02-05T13:42:24Z</updated>

		<summary type="html">&lt;p&gt;Remaxsrb: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2223/KDP_2023_feb.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;Fine grain Ticket&#039;&#039; алгоритам реализован помоћу &#039;&#039;addAndGet&#039;&#039; операције. Уколико би &#039;&#039;addAndGet&#039;&#039; операција имала следећи ефекат: &amp;lt;code&amp;gt;addAndGet(var, incr) : &amp;lt; var = var + incr; return(var);&amp;lt;/code&amp;gt;, да ли је могуће направити &#039;&#039;Fine grain&#039;&#039; решење, полазећи од &#039;&#039;Coarse grain&#039;&#039; решења, и ако је могуће - направите га. Написати и &#039;&#039;Coarse grain&#039;&#039; решење. &lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        &amp;lt; myTicket=ticket++; &amp;gt;&lt;br /&gt;
        &amp;lt; await(myTicket==next); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ticket = 0;&lt;br /&gt;
int next = 0;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int myTicket=0;&lt;br /&gt;
        myTicket = addAndGet(ticket, 1) - 2;&lt;br /&gt;
        while(myTicket != next) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        next++;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Племе људождера једе заједничку вечеру из казана који може да прими M порција куваних мисионара (&#039;&#039;The Dining Savages Problem&#039;&#039;). Када људождер пожели да руча онда се он сам послужи из заједничког казана, уколико казан није празан. Уколико је казан празан људождер буди кувара и сачека док кувар не напуни казан и онда узима своју порцију, а тек након тога преостали могу јести. Није дозвољено будити кувара уколико се налази бар мало хране у казану. Написати монитор са &#039;&#039;signal and continue&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи активне мониторе решити проблем филозофа који ручавају (&#039;&#039;The Dining Philosophers&#039;&#039;). Филозофи могу да комуницирају искључиво са процесом координатором (централизовано решење). Обезбедити да филозоф који је пре затражио да једе пре и започиње са јелом. Написати код за филозофе и за процес координатор.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
: &#039;&#039;Исти задатак дошао је у [[КДП/Јул 2020#3. задатак|јулу 2020. године]]. Ипак, аутор је одлучио да постави своје решење које је добило максималан број бодова.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = ...;&lt;br /&gt;
enum op_kind{REQUEST,RELEASE};&lt;br /&gt;
chan request(int, op_kind);&lt;br /&gt;
chan reply[N](bool);&lt;br /&gt;
&lt;br /&gt;
class Coordinator {&lt;br /&gt;
public:&lt;br /&gt;
    void run() {&lt;br /&gt;
        int id;&lt;br /&gt;
        op_kind op;&lt;br /&gt;
        queue&amp;lt;int&amp;gt; waiting;&lt;br /&gt;
        int forks[N] = {true};&lt;br /&gt;
        while (true) {&lt;br /&gt;
            receive request(id, op);&lt;br /&gt;
            int left = id, right = (id + 1) % N;&lt;br /&gt;
            if (op == REQUEST) {&lt;br /&gt;
                if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                    forks[left] = forks[right] = false;&lt;br /&gt;
                    send reply[id](OK);&lt;br /&gt;
                } else {&lt;br /&gt;
                    waiting.push(id);&lt;br /&gt;
                }&lt;br /&gt;
            } else if (op == RELEASE) {&lt;br /&gt;
                forks[left] = forks[right] = true;&lt;br /&gt;
                send reply[id](OK);&lt;br /&gt;
                while (!waiting.empty()) {&lt;br /&gt;
                    id = waiting.top();&lt;br /&gt;
                    left = id, right = (id + 1) % N;&lt;br /&gt;
                    if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                        forks[left] = forks[right] = false;&lt;br /&gt;
                        waiting.pop();&lt;br /&gt;
                        send reply[id](OK);&lt;br /&gt;
                    } else break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // Think&lt;br /&gt;
        send request(id, REQUEST);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // Eat&lt;br /&gt;
        send request(id, RELEASE);&lt;br /&gt;
        receive reply[id](status)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
На једној обали реке се налази чамац који превози путнике са једне на другу обалу и који може да прими тачно десет путника. Чамац могу да користе мушкарци, жене и деца. Чамац може да исплови само ако се у њему налази тачно онолико путника колики му је капацитет, али само под условом да се у чамцу налазе бар два мушкарца. Деца не смеју ући у чамац уколико се у њему не налазе бар једна одрасла особа и по завршетку вожње у чамцу не смеју да остану само деца. Сматрати да ће се чамац након искрцавања свих путника одмах бити спреман да прими наредну групу путника. Користећи &#039;&#039;CSP&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Remaxsrb</name></author>
	</entry>
</feed>