<?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=Uros+Velimirovic</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=Uros+Velimirovic"/>
	<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/Uros_Velimirovic"/>
	<updated>2026-06-04T06:27:13Z</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%9A_2019&amp;diff=6911</id>
		<title>КДП/К 2019</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%9A_2019&amp;diff=6911"/>
		<updated>2023-11-12T21:00:56Z</updated>

		<summary type="html">&lt;p&gt;Uros Velimirovic: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Колоквијум 2019. године за РТИ&#039;&#039;&#039; одржан је 24. новембра. Поставка овог рока може се наћи са [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;Reader Writers Problem&#039;&#039;) користећи семафоре. Обезбедити да процеси започињу приступ ресурсу по редоследу слања захтева. Претпоставити да у неком тренутку максимално N процеса може упутити захтев за приступ ресурсу.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = 100;&lt;br /&gt;
// Један више како бисмо могли да користимо проверу head == tail&lt;br /&gt;
// да бисмо видели да ли је листа празна&lt;br /&gt;
sem sems[N + 1];&lt;br /&gt;
bool isReader[N + 1];&lt;br /&gt;
int head = 0;&lt;br /&gt;
int tail = 0;&lt;br /&gt;
sem mutex;&lt;br /&gt;
// count == -1 =&amp;gt; писац&lt;br /&gt;
int count = 0;&lt;br /&gt;
&lt;br /&gt;
void read();&lt;br /&gt;
void write();&lt;br /&gt;
&lt;br /&gt;
void reader() {&lt;br /&gt;
    mutex.wait();&lt;br /&gt;
    if (head == tail &amp;amp;&amp;amp; count &amp;gt;= 0) {&lt;br /&gt;
        // Ако је листа празна значи да сигурно немамо писаца у њој&lt;br /&gt;
        ++count;&lt;br /&gt;
        mutex.signal();&lt;br /&gt;
    } else {&lt;br /&gt;
        int index = tail;&lt;br /&gt;
        tail = (tail + 1) % (N + 1);&lt;br /&gt;
        isReader[index] = true;&lt;br /&gt;
        mutex.signal();&lt;br /&gt;
        sems[index].wait();&lt;br /&gt;
    }&lt;br /&gt;
    read();&lt;br /&gt;
    mutex.wait();&lt;br /&gt;
    if (--count == 0 &amp;amp;&amp;amp; head != tail) {&lt;br /&gt;
        // Следећи мора да је писац, јер да је читалац листа би била празна&lt;br /&gt;
        count = -1;&lt;br /&gt;
        sems[head].signal();&lt;br /&gt;
        head = (head + 1) % (N + 1);&lt;br /&gt;
    }&lt;br /&gt;
    mutex.signal();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writer() {&lt;br /&gt;
    mutex.wait();&lt;br /&gt;
    if (head == tail &amp;amp;&amp;amp; count == 0) {&lt;br /&gt;
        // Ако нема читалаца нити писаца и листа је празна, можемо само да прођемо&lt;br /&gt;
        --count;&lt;br /&gt;
        mutex.signal();&lt;br /&gt;
    } else {&lt;br /&gt;
        int index = tail;&lt;br /&gt;
        tail = (tail + 1) % (N + 1);&lt;br /&gt;
        isReader[index] = false;&lt;br /&gt;
        mutex.signal();&lt;br /&gt;
        sems[index].wait();&lt;br /&gt;
    }&lt;br /&gt;
    write();&lt;br /&gt;
    mutex.wait();&lt;br /&gt;
    if (head == tail) {&lt;br /&gt;
        // Нико више не чека&lt;br /&gt;
        count = 0;&lt;br /&gt;
    } else if (isReader[head]) {&lt;br /&gt;
        // Чекају читаоци иза писца&lt;br /&gt;
        count = 0;&lt;br /&gt;
        while (isReader[head] &amp;amp;&amp;amp; head != tail) {&lt;br /&gt;
            ++count;&lt;br /&gt;
            sems[head].signal();&lt;br /&gt;
            head = (head + 1) % (N + 1);&lt;br /&gt;
        }&lt;br /&gt;
    } else {&lt;br /&gt;
        // Чека писац иза писца&lt;br /&gt;
        sems[head].signal();&lt;br /&gt;
        head = (head + 1) % (N + 1);&lt;br /&gt;
    }&lt;br /&gt;
    mutex.signal();&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 места за паркирање. Аутомобили који улазе, могу да уђу, један по један, уколико има слободних места, по редоследу по којем су тражили улаз. Уколико слободног места нема, проверава се да ли има аутомобила који хоће да изађу. Ако након изласка свих аутомобила који желе да изађу и уласка аутомобила који су дошли пре њега за аутомобил неће бити места, он одлази у потрагу за другом гаражом. Аутомобили при изласку плаћају услуге гараже и излазе један по један, по редоследу по којем су затражили излазак. Предност на рампи имају аутомобили који излазе из гараже.&lt;br /&gt;
&lt;br /&gt;
Написати монитор са &#039;&#039;signal and continue&#039;&#039; дисциплином који има следеће методе: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;boolean trazim_ulaz()&amp;lt;/syntaxhighlight&amp;gt;, за тражење дозволе за улаз у гаражу, која враћа &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; ако се дозвољава улаз у гаражу, а &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; ако нема места; &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;void usao()&amp;lt;/syntaxhighlight&amp;gt;, за обавештавање о уласку у гаражу; &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;void trazim_izlaz()&amp;lt;/syntaxhighlight&amp;gt; за тражење дозволе за изласком из гараже; &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;void izasao()&amp;lt;/syntaxhighlight&amp;gt; за обавештавање о изласку из гараже.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class PodzemnaGaraza {&lt;br /&gt;
    private static final int N = 100;&lt;br /&gt;
    private int ulazi = 0;&lt;br /&gt;
    private int izlazi = 0;&lt;br /&gt;
    private int parkirano = 0;&lt;br /&gt;
    private boolean rampaZauzeta = false;&lt;br /&gt;
    private Condition ulaziRed = new Condition();&lt;br /&gt;
    private Condition izlaziRed = new Condition();&lt;br /&gt;
    public synchronized boolean trazim_ulaz() {&lt;br /&gt;
        if (parkirano + ulazi == N) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        ++ulazi;&lt;br /&gt;
        if (!ulaziRed.queue() &amp;amp;&amp;amp; !izlaziRed.queue() &amp;amp;&amp;amp; !rampaZauzeta) {&lt;br /&gt;
            // Нема никога, улазимо&lt;br /&gt;
            rampaZauzeta = true;&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
        ulaziRed.wait();&lt;br /&gt;
        // rampaZauzeta је постављена од стране нити која сигнлизира&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void usao() {&lt;br /&gt;
        ++parkirano;&lt;br /&gt;
        --ulazi;&lt;br /&gt;
        signal();&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void trazim_izlaz() {&lt;br /&gt;
        ++izlazi;&lt;br /&gt;
        --parkirano;&lt;br /&gt;
        if (!izlaziRed.queue() &amp;amp;&amp;amp; !rampaZauzeta) {&lt;br /&gt;
            rampaZauzeta = true;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        izlaziRed.wait();&lt;br /&gt;
        // rampaZauzeta је постављена од стране нити која сигнлизира&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void izasao() {&lt;br /&gt;
        --izlazi;&lt;br /&gt;
        signal();&lt;br /&gt;
    }&lt;br /&gt;
    private void signal() {&lt;br /&gt;
        rampaZauzeta = false;&lt;br /&gt;
        if (izlaziRed.queue()) {&lt;br /&gt;
            rampaZauzeta = true;&lt;br /&gt;
            izlaziRed.signal();&lt;br /&gt;
        } else if (ulaziRed.queue() &amp;amp;&amp;amp; parkirano + izlazi &amp;lt; N) {&lt;br /&gt;
            rampaZauzeta = true;&lt;br /&gt;
            ulaziRed.signal();&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;/div&gt;</summary>
		<author><name>Uros Velimirovic</name></author>
	</entry>
</feed>