<?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=K0v4c</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=K0v4c"/>
	<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/K0v4c"/>
	<updated>2026-06-04T09:04:51Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A0%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D1%81%D0%BA%D0%B8_VLSI_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8/%D0%9F%D0%B8%D1%82%D0%B0%D1%9A%D0%B0&amp;diff=7962</id>
		<title>Рачунарски VLSI системи/Питања</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A0%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D1%81%D0%BA%D0%B8_VLSI_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8/%D0%9F%D0%B8%D1%82%D0%B0%D1%9A%D0%B0&amp;diff=7962"/>
		<updated>2025-08-26T07:47:25Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: /* 4. задатак [фебруар 2024 - група 2] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Питања&#039;&#039;&#039; на теоријском делу испита се, слично као на [[Рачунарске мреже 1/Питања|РМ1]], дохватају из корпуса питања и нису свим студентима иста, али долазе из сличних области. Испод су излистани неки задаци по категоријама питања.&lt;br /&gt;
&lt;br /&gt;
== SystemVerilog ограничења ==&lt;br /&gt;
У оваквим задацима, једноставно, је дат SystemVerilog код са ограничењима на неке променљиве, и пита се нешто у вези са вредностима које та променљива може да има и њиховим вероватноћама појављивања.&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Које вредности може имати променљива &amp;lt;code&amp;gt;variable&amp;lt;/code&amp;gt; из приказане класе &amp;lt;code&amp;gt;Constraints&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;systemverilog&amp;quot;&amp;gt;&lt;br /&gt;
class Constraints;&lt;br /&gt;
    rand bit [3:0] variable;&lt;br /&gt;
&lt;br /&gt;
    constraint c1 { variable &amp;lt;= 4&#039;d9; }&lt;br /&gt;
    constraint c2 { variable inside {[4:14]}; }&lt;br /&gt;
    constraint c3 { ! (variable inside {4&#039;h0, 4&#039;h5}); }&lt;br /&gt;
endclass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Могуће вредности, сортиране од најмање ка највећој, у децималном бројном систему, раздвојене запетом без пратећег размака, навести као одговор.&lt;br /&gt;
&lt;br /&gt;
Напомена: Приказ очекиваног формата одговора за следеће произвољно одабране вредности 15, 2, 7 и 10 јесте:&lt;br /&gt;
 2,7,10,15&lt;br /&gt;
&#039;&#039;&#039;Одговор:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;4,6,7,8,9&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
Дата је класа &amp;lt;code&amp;gt;Constraints&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;systemverilog&amp;quot;&amp;gt;&lt;br /&gt;
class Constraints;&lt;br /&gt;
    rand bit [2:0] variable;&lt;br /&gt;
&lt;br /&gt;
    constraint distribution { variable dist { 0:/20, 1:/30, [2:6]:/40, 7:/10 }; }&lt;br /&gt;
endclass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Која је вероватноћа да променљива &amp;lt;code&amp;gt;variable&amp;lt;/code&amp;gt; приликом генерисања псеудослучајне вредности добије вредност &#039;&#039;&#039;4&#039;&#039;&#039;? Вероватноћу представити као разломак у којем су бројилац и именилац узајамно прости бројеви.&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;9,10,5,3,11,27,4,12,2,26,28,1,25,29,13&amp;quot;&amp;gt;&lt;br /&gt;
* Бројилац: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&lt;br /&gt;
* Именилац: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;25&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
Које вредности може имати променљива &amp;lt;code&amp;gt;v2&amp;lt;/code&amp;gt; из приказане класе &amp;lt;code&amp;gt;Constraints&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;systemverilog&amp;quot;&amp;gt;&lt;br /&gt;
class Constraints;&lt;br /&gt;
    randc bit [3:0] v1;&lt;br /&gt;
    randc bit [3:0] v2;&lt;br /&gt;
&lt;br /&gt;
    constraint c1 { v1 &amp;gt; 4&#039;b0100; }&lt;br /&gt;
    constraint c2 { ! (v1 inside {[4&#039;h8:4&#039;hF]}); }&lt;br /&gt;
    constraint c3 { v2 == v1 * 2 + 1; }&lt;br /&gt;
endclass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Могуће вредности, сортиране од најмање ка највећој, у децималном бројном систему, раздвојене запетом без пратећег размака, навести као одговор.&lt;br /&gt;
&lt;br /&gt;
Напомена: Приказ очекиваног формата одговора за следеће произвољно одабране вредности 15, 2, 7 и 10 јесте:&lt;br /&gt;
 2,7,10,15&lt;br /&gt;
&#039;&#039;&#039;Одговор:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;11,13,15&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
Дата је класа &amp;lt;code&amp;gt;Constraints&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;systemverilog&amp;quot;&amp;gt;&lt;br /&gt;
class Constraints;&lt;br /&gt;
    rand bit [2:0] variable;&lt;br /&gt;
&lt;br /&gt;
    constraint distribution { variable dist { 0:/20, 1:/30, [2:6]:/20, 7:/30 }; }&lt;br /&gt;
endclass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Која је вероватноћа да променљива &amp;lt;code&amp;gt;variable&amp;lt;/code&amp;gt; приликом генерисања псеудослучајне вредности добије вредност &#039;&#039;&#039;4&#039;&#039;&#039;? Вероватноћу представити као разломак у којем су бројилац и именилац узајамно прости бројеви.&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;9,10,5,3,11,27,4,12,2,26,28,1,25,29,13&amp;quot;&amp;gt;&lt;br /&gt;
* Бројилац: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&lt;br /&gt;
* Именилац: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;25&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
Дата је класа &amp;lt;code&amp;gt;Constraints&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;systemverilog&amp;quot;&amp;gt;&lt;br /&gt;
class Constraints;&lt;br /&gt;
    rand bit [2:0] variable;&lt;br /&gt;
&lt;br /&gt;
    constraint distribution { variable dist { 0:/20, 1:/30, [2:6]:=20, 7:/30 }; }&lt;br /&gt;
endclass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Која је вероватноћа да променљива &amp;lt;code&amp;gt;variable&amp;lt;/code&amp;gt; приликом генерисања псеудослучајне вредности добије вредност &#039;&#039;&#039;4&#039;&#039;&#039;? Вероватноћу представити као разломак у којем су бројилац и именилац узајамно прости бројеви.&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;9,10,5,3,11,27,4,12,2,26,28,1,25,29,13&amp;quot;&amp;gt;&lt;br /&gt;
* Бројилац: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&lt;br /&gt;
* Именилац: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objašnjenje: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Kada stoji := to znači da se svakom broju iz opsega dodeljuje ta verovatnoća, za razliku od :/ koji označava kumulativnu verovatnoću za ceo opseg. Samim tim ukupna verovatnoća je &amp;lt;math&amp;gt;20+30+20*5+30 = 180&amp;lt;/math&amp;gt;, verovatnoća za broj 4 je 20, tako da će rezultat biti &amp;lt;math&amp;gt;\frac{20}{180}&amp;lt;/math&amp;gt; čijim skraćivanjem se dobija traženo rešenje.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сабирачи ==&lt;br /&gt;
У оваквим задацима обично је дат Verilog код одређеног сабирача (једног од типова као што су рађени на предавањима) и питају се ствари у вези са функционисањем тог сабирача.&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
У наставку је дата имплементација једног осморазредног сабирача. О ком сабирачу се ради, ако се зна да модул &amp;lt;code&amp;gt;ripple_carry_adder_n&amp;lt;/code&amp;gt; представља &#039;&#039;N&#039;&#039;-разредни сабирач са серијским преносом, а да модул &amp;lt;code&amp;gt;multiplexer_2_1&amp;lt;/code&amp;gt; представља двоулазни мултиплексер ширине &#039;&#039;N&#039;&#039; информационих улаза?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module adder_8 (&lt;br /&gt;
    input [7:0] a, b,&lt;br /&gt;
    input carry_in,&lt;br /&gt;
    output [7:0] sum,&lt;br /&gt;
    output carry_out&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
    wire carry_3_0, carry_3_1, carry_3;&lt;br /&gt;
    wire [3:0] sum_low_0, sum_low_1, sum_low;&lt;br /&gt;
&lt;br /&gt;
    ripple_carry_adder_n #(4) rca_1 (a[3:0], b[3:0], 1&#039;b0, sum_low_0, carry_3_0);&lt;br /&gt;
    ripple_carry_adder_n #(4) rca_2 (a[3:0], b[3:0], 1&#039;b1, sum_low_1, carry_3_1);&lt;br /&gt;
&lt;br /&gt;
    multiplexer_2_1 #(4) mpx_1 (sum_low_0, sum_low_1, carry_in, sum_low);&lt;br /&gt;
&lt;br /&gt;
    assign carry_3 = (carry_in &amp;amp; carry_3_1) | carry_3_0;&lt;br /&gt;
&lt;br /&gt;
    wire carry_7_0, carry_7_1, carry_7;&lt;br /&gt;
    wire [3:0] sum_high_0, sum_high_1, sum_high;&lt;br /&gt;
&lt;br /&gt;
    ripple_carry_adder_n #(4) rca_3 (a[7:4], b[7:4], 1&#039;b0, sum_high_0, carry_7_0);&lt;br /&gt;
    ripple_carry_adder_n #(4) rca_4 (a[7:4], b[7:4], 1&#039;b1, sum_high_1, carry_7_1);&lt;br /&gt;
&lt;br /&gt;
    multiplexer_2_1 #(4) mpx_2 (sum_high_0, sum_high_1, carry_3, sum_high);&lt;br /&gt;
&lt;br /&gt;
    assign carry_7 = carry_7_0 | (carry_3_0 &amp;amp; carry_7_1) | (carry_in &amp;amp; carry_3_1 &amp;amp; carry_7_1);&lt;br /&gt;
&lt;br /&gt;
    assign sum = {sum_high, sum_low};&lt;br /&gt;
    assign carry_out = carry_7;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# Условни сабирач (&#039;&#039;Conditional Sum Adder&#039;&#039;)&lt;br /&gt;
# Сабирач са серијским преносом (&#039;&#039;Ripple Carry Adder&#039;&#039;)&lt;br /&gt;
# Сабирач са чувањем преноса (&#039;&#039;Carry Save Adder&#039;&#039;)&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Сабирач на основу бита преноса (&#039;&#039;Carry Select Adder&#039;&#039;)&amp;lt;/span&amp;gt;&lt;br /&gt;
# Сабирач са паралелним преносом (&#039;&#039;Carry Lookahead Adder&#039;&#039;)&lt;br /&gt;
# Потпуни сабирач (&#039;&#039;Full Adder&#039;&#039;)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Објашњење:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;У коду се види карактеристични &amp;quot;осакаћени мултиплексер&amp;quot; код генерисања преноса &amp;lt;code&amp;gt;carry_3&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;carry_7&amp;lt;/code&amp;gt;.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
У наставку је дата непотпуна имплементација четвороразредног сабирача на основу бита преноса (&#039;&#039;Carry Select Adder&#039;&#039;). Допунити имплементацију, ако се зна да модул &amp;lt;code&amp;gt;ripple_carry_adder_n&amp;lt;/code&amp;gt; представља &#039;&#039;N&#039;&#039;-разредни сабирач са серијским преносом, а да модул &amp;lt;code&amp;gt;multiplexer_2_1&amp;lt;/code&amp;gt; представља двоулазни мултиплексер ширине &#039;&#039;N&#039;&#039; информационих улаза?&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module carry_select_adder_4 (&lt;br /&gt;
    input [3:0] a, b,&lt;br /&gt;
    input carry_in,&lt;br /&gt;
    output [3:0] sum,&lt;br /&gt;
    output carry_out&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
    wire carry_3_0, carry_3_1;&lt;br /&gt;
    wire [3:0] sum_0, sum_1;&lt;br /&gt;
&lt;br /&gt;
    ripple_carry_adder_n #(4) rca_1 (a[3:0], b[3:0], БЕЛИНА_1, sum_0, БЕЛИНА_2);&lt;br /&gt;
    ripple_carry_adder_n #(4) rca_2 (a[3:0], b[3:0], БЕЛИНА_3, sum_1, БЕЛИНА_4);&lt;br /&gt;
&lt;br /&gt;
    multiplexer_2_1 #(4) mpx_1 (sum_0, sum_1, carry_in, sum);&lt;br /&gt;
&lt;br /&gt;
    assign carry_out = (carry_in &amp;amp; carry_3_1) | carry_3_0;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;carry_3_1,1&#039;b1,sum,1&#039;b0,carry_out,carry_in,carry_3_0,sum_0,sum_1&amp;quot;&amp;gt;&lt;br /&gt;
# Белина 1: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;1&#039;b0&amp;lt;/span&amp;gt;&lt;br /&gt;
# Белина 2: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;carry_3_0&amp;lt;/span&amp;gt;&lt;br /&gt;
# Белина 3: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;1&#039;b1&amp;lt;/span&amp;gt;&lt;br /&gt;
# Белина 4: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;carry_3_1&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Објашњење:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Ово је само друга варијанта задатка изнад. Једном сабирачу се даје да рачуна као да је улазни пренос 0, а другом да је улазни пренос 1, па се њихови резултати смештају у одговарајуће сигнале.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Временски облици ==&lt;br /&gt;
У оваквим задацима дат је Verilog код са кашњењима и временски облици излазних сигнала у &#039;&#039;ModelSim&#039;&#039;, па се студенти питају да препознају одговарајући временски облик.&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
Који временски облик одговара следећем изворном коду:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module delay_module_3 (&lt;br /&gt;
    out1, out2, a, b, c, x, y, z&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
    output reg out1, out2;&lt;br /&gt;
    input a, b, c, x, y, z;&lt;br /&gt;
    wire e, f, g;&lt;br /&gt;
&lt;br /&gt;
    always @(posedge a) out1 = #1 b &amp;amp; c;&lt;br /&gt;
    always @(negedge a) out1 = #1 b | ~c;&lt;br /&gt;
&lt;br /&gt;
    always @(posedge x) out2 = #1 y ^ z;&lt;br /&gt;
    always @(negedge x) out2 = #1 ~y;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
module top_display;&lt;br /&gt;
&lt;br /&gt;
    reg a, b, c, x, y, z;&lt;br /&gt;
    wire o1, o2;&lt;br /&gt;
    delay_module_3 d3(o1, o2, a, b, c, x, y, z);&lt;br /&gt;
&lt;br /&gt;
    initial begin&lt;br /&gt;
        a = 1&#039;b0; b = 1&#039;b0; c = 1&#039;b0; x = 1&#039;b0; y = 1&#039;b0; z = 1&#039;b0;&lt;br /&gt;
        #1 b = 1&#039;b1;&lt;br /&gt;
        #2 a = 1&#039;b1; y = 1&#039;b1;&lt;br /&gt;
        #0 c = 1&#039;b1;&lt;br /&gt;
        #2 x = 1&#039;b1;&lt;br /&gt;
        #2 a = 1&#039;b0;&lt;br /&gt;
        #1 b = 1&#039;b0;&lt;br /&gt;
        #3 x = 1&#039;b0;&lt;br /&gt;
        #0 y = 1&#039;b0;&lt;br /&gt;
        #0 $finish;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# [[Датотека:VLSI zadaci vremenski oblik 9.jpg|link=]]&lt;br /&gt;
# [[Датотека:VLSI zadaci vremenski oblik 10.jpg|link=]]&lt;br /&gt;
# [[Датотека:VLSI zadaci vremenski oblik 11.jpg|link=]]&lt;br /&gt;
# [[Датотека:VLSI zadaci vremenski oblik 12.jpg|link=]]&lt;br /&gt;
# Ниједан од понуђених временских облика.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Померачи ==&lt;br /&gt;
У оваквим задацима дат је Фанел или Барел померач са одређеним карактеристикама, и траже се сви његови међурезултати.&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Дат је Фанел померач (&#039;&#039;Funnel Shifter&#039;&#039;) са дванаестобитним улазом и петобитним излазом. Допунити вредности добијене у сваком од корака овог померача као и вредност излзаног податка за следеће улазне вредности:&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;29,16,1A,27,7,14,5A,13,D,B,A7,9&amp;quot;&amp;gt;&lt;br /&gt;
* Улазни податак: 5A7&lt;br /&gt;
* Контролни сигнал (број померања удесно): 4&lt;br /&gt;
* Први корак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;5A&amp;lt;/span&amp;gt;&lt;br /&gt;
* Други корак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;1A&amp;lt;/span&amp;gt;&lt;br /&gt;
* Трећи корак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;1A&amp;lt;/span&amp;gt;&lt;br /&gt;
* Излазни податак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;1A&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Све вредности су написане у хексадецималном бројном систему.&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
Дат је Барел померач (&#039;&#039;Barrel Shifter&#039;&#039;) са осмобитним улазом и осмобитним излазом. Допунити вредности добијене у сваком од корака овог померача као и вредност излзаног податка за следеће улазне вредности:&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;5E,F2,97,79,CB,E5,2F&amp;quot;&amp;gt;&lt;br /&gt;
* Улазни податак: 79&lt;br /&gt;
* Контролни сигнал (број померања удесно): 7&lt;br /&gt;
* Први корак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;97&amp;lt;/span&amp;gt;&lt;br /&gt;
* Други корак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;E5&amp;lt;/span&amp;gt;&lt;br /&gt;
* Трећи корак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;F2&amp;lt;/span&amp;gt;&lt;br /&gt;
* Излазни податак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;F2&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Све вредности су написане у хексадецималном бројном систему.&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак [фебруар 2024 - група 1]===&lt;br /&gt;
Дат је Фанел померач (&#039;&#039;Funnel Shifter&#039;&#039;) са дванаестобитним улазом и петобитним излазом. Допунити вредности добијене у сваком од корака овог померача као и вредност излзаног податка за следеће улазне вредности:&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;26,16,1A,18,7,14,13,6D,B,A7,9&amp;quot;&amp;gt;&lt;br /&gt;
* Улазни податак: 26D&lt;br /&gt;
* Контролни сигнал (број померања удесно): 5&lt;br /&gt;
* Први корак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;26&amp;lt;/span&amp;gt;&lt;br /&gt;
* Други корак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;26&amp;lt;/span&amp;gt;&lt;br /&gt;
* Трећи корак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;13&amp;lt;/span&amp;gt;&lt;br /&gt;
* Излазни податак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;13&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Све вредности су написане у хексадецималном бројном систему.&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак [фебруар 2024 - група 2]===&lt;br /&gt;
Дат је Фанел померач (&#039;&#039;Funnel Shifter&#039;&#039;) са дванаестобитним улазом и петобитним излазом. Допунити вредности добијене у сваком од корака овог померача као и вредност излзаног податка за следеће улазне вредности:&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;23,16,13,17,7,14,13,3F,B,F8,9&amp;quot;&amp;gt;&lt;br /&gt;
* Улазни податак: 3F8&lt;br /&gt;
* Контролни сигнал (број померања удесно): 7&lt;br /&gt;
* Први корак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;3F&amp;lt;/span&amp;gt;&lt;br /&gt;
* Други корак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;F&amp;lt;/span&amp;gt;&lt;br /&gt;
* Трећи корак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt;&lt;br /&gt;
* Излазни податак: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Све вредности су написане у хексадецималном бројном систему.&lt;br /&gt;
&lt;br /&gt;
== Верификација без UVM ==&lt;br /&gt;
У оваквим задацима дат је код из примера верификације без коришћења UVM стандарда са вежби и пита се шта се тачно дешава у коду и зашто.&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
У наставку је дат део кода &#039;&#039;Driver&#039;&#039;-a.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;systemverilog&amp;quot;&amp;gt;&lt;br /&gt;
class Driver;&lt;br /&gt;
&lt;br /&gt;
    virtual reg8_if vif;&lt;br /&gt;
    mailbox mbx;&lt;br /&gt;
    event done;&lt;br /&gt;
&lt;br /&gt;
    task run();&lt;br /&gt;
        @(posedge vif.clk);&lt;br /&gt;
        forever begin&lt;br /&gt;
            dut_item item;&lt;br /&gt;
            mbx.get(item);&lt;br /&gt;
            // ...&lt;br /&gt;
            @(posedge vif.clk);&lt;br /&gt;
            -&amp;gt;done;&lt;br /&gt;
        end&lt;br /&gt;
    endtask&lt;br /&gt;
&lt;br /&gt;
endclass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Koja класа чека на догађај &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; који се овде окида?&lt;br /&gt;
&lt;br /&gt;
Напомена: Сматрати да се процес верификације врши без коришћења UVM стандарда.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# &#039;&#039;Driver&#039;&#039;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;Generator&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
# &#039;&#039;Monitor&#039;&#039;&lt;br /&gt;
# &#039;&#039;Scoreboard&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Објашњење:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Први пример са вежби. Генератор чека на овај догађај како не би генерисао више предмета него што драјвер може да конзумира.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
У наставку је дат део кода &#039;&#039;Driver&#039;&#039;-a.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;systemverilog&amp;quot;&amp;gt;&lt;br /&gt;
class Driver;&lt;br /&gt;
&lt;br /&gt;
    virtual reg8_if vif;&lt;br /&gt;
    mailbox mbx;&lt;br /&gt;
    event done;&lt;br /&gt;
&lt;br /&gt;
    task run();&lt;br /&gt;
        @(posedge vif.clk);&lt;br /&gt;
        forever begin&lt;br /&gt;
            dut_item item;&lt;br /&gt;
            mbx.get(item);&lt;br /&gt;
            // ...&lt;br /&gt;
            @(posedge vif.clk);&lt;br /&gt;
            -&amp;gt;done;&lt;br /&gt;
        end&lt;br /&gt;
    endtask&lt;br /&gt;
&lt;br /&gt;
endclass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Koja класа поставља &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; у &#039;&#039;mailbox&#039;&#039; који се овде дохвата?&lt;br /&gt;
&lt;br /&gt;
Напомена: Сматрати да се процес верификације врши без коришћења UVM стандарда.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# &#039;&#039;Driver&#039;&#039;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;Generator&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
# &#039;&#039;Monitor&#039;&#039;&lt;br /&gt;
# &#039;&#039;Scoreboard&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UVM ==&lt;br /&gt;
Ова питања се обично односе на било шта из UVM стандарда.&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Које класе наслеђују класу &amp;lt;code&amp;gt;uvm_transaction&amp;lt;/code&amp;gt;?&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&amp;lt;code&amp;gt;uvm_sequence_item&amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;uvm_driver&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;uvm_monitor&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;uvm_sequencer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;uvm_test&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&amp;lt;code&amp;gt;uvm_sequence&amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
Које фазе кроз које пролазе UVM компоненте се реализују као &#039;&#039;task&#039;&#039; уместо као функције?&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# build&lt;br /&gt;
# connect&lt;br /&gt;
# end of elaboration&lt;br /&gt;
# start of simulation&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;run&amp;lt;/span&amp;gt;&lt;br /&gt;
# extract&lt;br /&gt;
# check&lt;br /&gt;
# report&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рачунарски VLSI системи]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2023&amp;diff=7940</id>
		<title>Програмски преводиоци 1/Јануар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2023&amp;diff=7940"/>
		<updated>2025-08-16T18:39:07Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: /* Promena const_0 na const_2 -&amp;gt; Pocetak VT je u statickoj memoriji na adresi 2  jer postoje 2 globalne promenjive.*/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{nerešeno}}&lt;br /&gt;
&#039;&#039;&#039;Januarski ispit 2023. godine&#039;&#039;&#039; održan je 19. januara. Postavka roka nije dostupna sa stranice predmeta.&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je sledeći program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int count;&lt;br /&gt;
    void procX() {&lt;br /&gt;
        void report() {&lt;br /&gt;
            writeln(&amp;quot;count = &amp;quot; + count);&lt;br /&gt;
        }&lt;br /&gt;
        void proxY() {&lt;br /&gt;
            int count;&lt;br /&gt;
            count = 200;&lt;br /&gt;
            report();&lt;br /&gt;
        }&lt;br /&gt;
        count = 100;&lt;br /&gt;
        report();&lt;br /&gt;
        procY();&lt;br /&gt;
    }&lt;br /&gt;
    count = 300;&lt;br /&gt;
    procX();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Ukoliko se koristi statičko razrešavanje dosega, šta će ispisati dati program?&lt;br /&gt;
# Ukoliko se koristi dinamičko razrešavanje dosega, šta će ispisati dati program?&lt;br /&gt;
# Ukoliko se za nelokalne promenljive koriste displeji, nacrtati poslednje stanje steka i displeja nakon što je &amp;lt;code&amp;gt;report&amp;lt;/code&amp;gt; funkcija pozvana poslednji put.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je isečak koda klase &amp;lt;code&amp;gt;Struct&amp;lt;/code&amp;gt;. Dopuniti metodu &amp;lt;code&amp;gt;AssignableTo&amp;lt;/code&amp;gt; kodom koji fali.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class Struct {&lt;br /&gt;
    private int kind;&lt;br /&gt;
    private Struct elemType;&lt;br /&gt;
    public boolean Equals(Struct other) {&lt;br /&gt;
        return (this == other) || (kind == Kinds.Array &amp;amp;&amp;amp; other.kind == Kinds.Array &amp;amp;&amp;amp; elemType.Equals(other.ElemType));&lt;br /&gt;
    }&lt;br /&gt;
    public boolean IsRefType() {&lt;br /&gt;
        return kind == Kinds.Class || kind == Kinds.Array;&lt;br /&gt;
    }&lt;br /&gt;
    public boolean AssignableTo(Struct dest) {&lt;br /&gt;
        if (this.Equals(dest) || &lt;br /&gt;
                || (kind == Kinds.Array &amp;amp;&amp;amp; dest.kind == Kinds.Array &amp;amp;&amp;amp; dest.elemType == Tab.noType)) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Preuzeto iz [http://ir4pp1.etf.rs/Predavanja/pp1_udzbenik.pdf udžbenika Programski prevodioci 1] (Dragan Bojić, Maja Vukasović) sa strane 209.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Struct {&lt;br /&gt;
    ...&lt;br /&gt;
    // checks, if this can be assigned to dest (explicit. assignment, parameters)&lt;br /&gt;
    public bool AssignableTo (Struct dest) {&lt;br /&gt;
        if ( this.Equals(dest) || this == Tab.nullType &amp;amp;&amp;amp; dest.IsRefType() ||&lt;br /&gt;
            kind == Kinds.Arr &amp;amp;&amp;amp; dest.kind == Kinds.Arr &amp;amp;&amp;amp; // for len()&lt;br /&gt;
            dest.elemType == Tab.noType) return true;&lt;br /&gt;
        for (Struct s = elemType; s != null; s = s.elemType) {&lt;br /&gt;
            if (s.equals(dest)) return true;&lt;br /&gt;
        }&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za dati blok koda napisati međukod a zatim nacrtati graf toka kontrole sa međukodom u SSA formi.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int res = 10;&lt;br /&gt;
for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
    int n = res;&lt;br /&gt;
    for (int j = i + 1; j &amp;lt; n; j++) {&lt;br /&gt;
        if ((i + j) % 2 == 0) {&lt;br /&gt;
           res++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za datu gramatiku konstruisati karakteristički LR(0) automat i kontrolnu tabelu, a zatim dodati LALR(1) predikcione skupove.&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;S&amp;gt; &amp;amp;lt;A&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → &amp;amp;lt;A&amp;gt; a &amp;amp;lt;A&amp;gt; b&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → &amp;amp;lt;S&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → c&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U datoj gramatici neterminalu &amp;lt;code&amp;gt;&amp;amp;lt;list&amp;gt;&amp;lt;/code&amp;gt; dodati sintetizovani atribut koji naizmenično sadrži cifre najvećih i najmanjih brojeva iz niza. Na primer, ukoliko je sekvenca koja se prepoznaje [1, 2, 3] [4, 5, 6] [7, 8, 9], taj atribut bi imao vrednost 349. Smatrati da terminal &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; ima sintetizovani simbol sa svojom vrednošću.&lt;br /&gt;
# &amp;amp;lt;list&amp;gt; → &amp;amp;lt;list&amp;gt; &amp;amp;lt;item&amp;gt;&lt;br /&gt;
# &amp;amp;lt;list&amp;gt; → &amp;amp;lt;item&amp;gt;&lt;br /&gt;
# &amp;amp;lt;item&amp;gt; → [ &amp;amp;lt;num_arr&amp;gt; ]&lt;br /&gt;
# &amp;amp;lt;num_arr&amp;gt; → &amp;amp;lt;num_arr&amp;gt;, INT&lt;br /&gt;
# &amp;amp;lt;num_arr&amp;gt; → INT&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Uvodimo sledeće sintetizovane atribute:&lt;br /&gt;
* INT&amp;lt;sub&amp;gt;digit&amp;lt;/sub&amp;gt; - digit predstavlja cifru opisanu terminalom INT&lt;br /&gt;
* &amp;lt;num_arr&amp;gt;&amp;lt;sub&amp;gt;minDigit, maxDigit&amp;lt;/sub&amp;gt; - minDigit predstavlja minimalnu cifru sadržanu u nizu cifara &amp;lt;num_arr&amp;gt;, a maxDigit maksimalnu cifru sadržanu u nizu cifara &amp;lt;num_arr&amp;gt;&lt;br /&gt;
* &amp;lt;item&amp;gt;&amp;lt;sub&amp;gt;minDigit, maxDigit&amp;lt;/sub&amp;gt; - minDigit predstavlja minimalnu cifru sadržanu u nizu cifara koji se nalazi u neterminalu &amp;lt;item&amp;gt;, a maxDigit maksimalnu cifru sadržanu u nizu cifara koji se nalazi u neterminalu &amp;lt;item&amp;gt;&lt;br /&gt;
* &amp;lt;list&amp;gt;&amp;lt;sub&amp;gt;value, takeMinDigit&amp;lt;/sub&amp;gt; - value predstavlja vrednost koju treba izračunati po postavci zadatka, a takeMinDigit da li u sledećem koraku treba uzeti minimalnu ili maksimalnu cifru (ovo posmatramo kao neki flag kome u svakom koraku invertujemo vrednost, a čija je početna vrednost 1 jer u prvom koraku uzimamo maksimalnu, a u drugom minimalnu cifru)&lt;br /&gt;
&lt;br /&gt;
Atributivno translaciona gramatika izgleda ovako (stvari koje su dodate u odnosu na gramatiku iz postavke su prikazane &#039;&#039;&#039;podebljanim slovima&#039;&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;list&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;value, takeMinDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; -&amp;gt; &amp;lt;list&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;valueRHS, takeMinDigitRHS&#039;&#039;&#039;&amp;lt;/sub&amp;gt; &amp;lt;item&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigit, maxDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; &#039;&#039;&#039;{ value = valueRHS * 10 + (takeMinDigitRHS == 1) ? minDigit : maxDigit; takeMinDigit = 1 - takeMinDigitRHS; }&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;list&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;value, takeMinDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; -&amp;gt; &amp;lt;item&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigit, maxDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; &#039;&#039;&#039;{ value = maxDigit; takeMinDigit = 1; }&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;item&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigit, maxDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; -&amp;gt; [ &amp;lt;num_arr&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigitRHS, maxDigitRHS&#039;&#039;&#039;&amp;lt;/sub&amp;gt; ] &#039;&#039;&#039;{ minDigit = minDigitRHS; maxDigit = maxDigitRHS; }&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;num_arr&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigit, maxDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; -&amp;gt; &amp;lt;num_arr&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigitRHS, maxDigitRHS&#039;&#039;&#039;&amp;lt;/sub&amp;gt; , INT&amp;lt;sub&amp;gt;&#039;&#039;&#039;digit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; &#039;&#039;&#039;{ minDigit = min(minDigitRHS, digit); maxDigit = max(maxDigitRHS, digit); }&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;num_arr&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigit, maxDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; -&amp;gt; INT&amp;lt;sub&amp;gt;&#039;&#039;&#039;digit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; &#039;&#039;&#039;{ minDigit = digit; maxDigit = digit; }&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati kompletan prevod funkcija &amp;lt;code&amp;gt;f1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f2&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; na Mikrojava bajtkod. Smatrati da prevod &amp;lt;code&amp;gt;f1&amp;lt;/code&amp;gt; kreće od adrese 0. Sekciju označenu sa &amp;lt;code&amp;gt;// ...&amp;lt;/code&amp;gt; nije potrebno prevoditi i smatrati da je njena dužina jedna instrukcija.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int b;&lt;br /&gt;
class A {&lt;br /&gt;
    int fun1(int p) {...}&lt;br /&gt;
}&lt;br /&gt;
class B {&lt;br /&gt;
    A[] arr;&lt;br /&gt;
}&lt;br /&gt;
B bObj;&lt;br /&gt;
int f1() {&lt;br /&gt;
    return 1;&lt;br /&gt;
}&lt;br /&gt;
int f2() {&lt;br /&gt;
    return 2;&lt;br /&gt;
}&lt;br /&gt;
void main() int x; {&lt;br /&gt;
    bObj = new B;&lt;br /&gt;
    // ...&lt;br /&gt;
    b = bObj.arr[1].fun1(3);&lt;br /&gt;
    if (b &amp;lt; x) {&lt;br /&gt;
        b = f1();&lt;br /&gt;
    }&lt;br /&gt;
    else b = f2();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
00: enter 0 0&lt;br /&gt;
03: const_1&lt;br /&gt;
04: exit&lt;br /&gt;
05: return&lt;br /&gt;
06: enter 0 0&lt;br /&gt;
09: const_2&lt;br /&gt;
10: exit&lt;br /&gt;
11: return&lt;br /&gt;
12: enter 0 1&lt;br /&gt;
15: new 4&lt;br /&gt;
18: dup&lt;br /&gt;
19: const_2&lt;br /&gt;
20: putfield 0&lt;br /&gt;
23: putstatic 1&lt;br /&gt;
26: ...&lt;br /&gt;
27: getstatic 1&lt;br /&gt;
30: getfield 1&lt;br /&gt;
33: const_1&lt;br /&gt;
34: aload&lt;br /&gt;
35: const_3&lt;br /&gt;
36: getstatic 1&lt;br /&gt;
39: getfield 1&lt;br /&gt;
42: const_1&lt;br /&gt;
43: aload&lt;br /&gt;
44: getfield 0&lt;br /&gt;
47: invokevirtual &#039;f&#039; &#039;u&#039; &#039;n&#039; &#039;1&#039; -1&lt;br /&gt;
68: putstatic 0&lt;br /&gt;
71: getstatic 0&lt;br /&gt;
74: load_0&lt;br /&gt;
75: jge 12&lt;br /&gt;
78: call -78&lt;br /&gt;
81: putstatic 0&lt;br /&gt;
84: jmp 9&lt;br /&gt;
87: call -81&lt;br /&gt;
90: putstatic 0&lt;br /&gt;
93: exit&lt;br /&gt;
94: return&lt;br /&gt;
95: ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%9B%D0%B0%D0%B1_2_%D0%A0%D0%A2%D0%98_2023&amp;diff=7122</id>
		<title>КДП/Лаб 2 РТИ 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%9B%D0%B0%D0%B1_2_%D0%A0%D0%A2%D0%98_2023&amp;diff=7122"/>
		<updated>2023-12-28T18:07:56Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: Dodata stranica za lab2 rti 2023 kdp&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
&lt;br /&gt;
У зависности од групе било је потребно решити један од следеће два проблема.&lt;br /&gt;
&lt;br /&gt;
1. Решити DiningPhilosopher проблем користећи &amp;lt;code&amp;gt;ExecutorService&amp;lt;/code&amp;gt;  и где је потребно да сервер враћа филозоферу информацију када му је дозвољено да једе. Користити &amp;lt;code&amp;gt;System.currentTimeMillis()&amp;lt;/code&amp;gt; за дохватање времена и дозвоњено је користити &amp;lt;code&amp;gt;Future&amp;lt;/code&amp;gt; и друге синхронизационе примитиве за решавање задатка.&lt;br /&gt;
&lt;br /&gt;
2. TODO.&lt;br /&gt;
&lt;br /&gt;
== Решење ==&lt;br /&gt;
&lt;br /&gt;
Испод је дато решење за DiningPhilosophers.&lt;br /&gt;
&lt;br /&gt;
Изглед хијерархије фајлова:&lt;br /&gt;
.&lt;br /&gt;
├── client&lt;br /&gt;
│   └── Philosopher.java&lt;br /&gt;
├── common&lt;br /&gt;
│   └── Service.java&lt;br /&gt;
└── server&lt;br /&gt;
    ├── RequestHandler.java&lt;br /&gt;
    └── Server.java&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Philosopher.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package client;&lt;br /&gt;
&lt;br /&gt;
import common.Service;&lt;br /&gt;
&lt;br /&gt;
public class Philosopher extends Thread{&lt;br /&gt;
&lt;br /&gt;
    public static final int NUM_OF_PHILOSOPHERS = 30;&lt;br /&gt;
    public static int curr_id = 0;&lt;br /&gt;
    public int id = 0;&lt;br /&gt;
    public Service service;&lt;br /&gt;
&lt;br /&gt;
    public Philosopher(Service service) {&lt;br /&gt;
        this.id = curr_id++;&lt;br /&gt;
&lt;br /&gt;
        this.service = service;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void run() {&lt;br /&gt;
&lt;br /&gt;
        while(true) {&lt;br /&gt;
            // think&lt;br /&gt;
            try {&lt;br /&gt;
                Thread.sleep((long) (Math.random() * 1000));&lt;br /&gt;
            } catch (InterruptedException e) {&lt;br /&gt;
                throw new RuntimeException(e);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            this.service.eat(this.id);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
        Philosopher[] arr = new Philosopher[NUM_OF_PHILOSOPHERS];&lt;br /&gt;
&lt;br /&gt;
        Service service = new Service(&amp;quot;localhost&amp;quot;, 4001);&lt;br /&gt;
&lt;br /&gt;
        for(int i = 0; i &amp;lt; NUM_OF_PHILOSOPHERS; i++) {&lt;br /&gt;
            arr[i] = new Philosopher(service);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        for(int i = 0; i &amp;lt; NUM_OF_PHILOSOPHERS; i++) {&lt;br /&gt;
            arr[i].start();&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;
==== &amp;lt;code&amp;gt;Service.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package common;&lt;br /&gt;
&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.OutputStreamWriter;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
&lt;br /&gt;
public class Service {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    String host;&lt;br /&gt;
    int port;&lt;br /&gt;
&lt;br /&gt;
    public Service(String host, int port) {&lt;br /&gt;
        this.host = host;&lt;br /&gt;
        this.port = port;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void eat(int id) {&lt;br /&gt;
&lt;br /&gt;
        try (&lt;br /&gt;
                Socket socket = new Socket(this.host, this.port);&lt;br /&gt;
                BufferedReader buffered_reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));&lt;br /&gt;
                PrintWriter print_writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);&lt;br /&gt;
                ) {&lt;br /&gt;
&lt;br /&gt;
            print_writer.println(&amp;quot;eat&amp;quot;+&amp;quot;#&amp;quot;+id);&lt;br /&gt;
&lt;br /&gt;
            // Get the resource&lt;br /&gt;
            String time = buffered_reader.readLine();&lt;br /&gt;
            System.out.println(&amp;quot;Filozofer sa id: &amp;quot; + id + &amp;quot; je dobio pristup u trenutku: &amp;quot; + time);&lt;br /&gt;
&lt;br /&gt;
        } catch (Exception e) {&lt;br /&gt;
            e.printStackTrace();&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;
==== &amp;lt;code&amp;gt;RequestHandler.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package server;&lt;br /&gt;
&lt;br /&gt;
import java.io.*;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
import java.util.Scanner;&lt;br /&gt;
&lt;br /&gt;
public class RequestHandler extends Thread {&lt;br /&gt;
&lt;br /&gt;
    Socket sock;&lt;br /&gt;
    Server server;&lt;br /&gt;
&lt;br /&gt;
    public RequestHandler(Socket sock, Server server) {&lt;br /&gt;
        this.sock = sock;&lt;br /&gt;
        this.server = server;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void run() {&lt;br /&gt;
&lt;br /&gt;
        try (&lt;br /&gt;
                Socket socket = this.sock;&lt;br /&gt;
                BufferedReader buffered_reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));&lt;br /&gt;
                PrintWriter print_writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);&lt;br /&gt;
        ) {&lt;br /&gt;
&lt;br /&gt;
            String in = buffered_reader.readLine();&lt;br /&gt;
&lt;br /&gt;
            String[] data = in.split(&amp;quot;#&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            String operation = data[0];&lt;br /&gt;
            int id = Integer.parseInt(data[1]);&lt;br /&gt;
&lt;br /&gt;
            if (&amp;quot;eat&amp;quot;.equalsIgnoreCase(operation)) {&lt;br /&gt;
                server.test(id);&lt;br /&gt;
                server.eat(buffered_reader, print_writer);&lt;br /&gt;
                server.signal(id);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        } catch (Exception e) {&lt;br /&gt;
            e.printStackTrace();&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;
==== &amp;lt;code&amp;gt;Server.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package server;&lt;br /&gt;
&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.net.ServerSocket;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
import java.util.concurrent.ExecutorService;&lt;br /&gt;
import java.util.concurrent.Executors;&lt;br /&gt;
&lt;br /&gt;
public class Server {&lt;br /&gt;
&lt;br /&gt;
    ExecutorService pool;&lt;br /&gt;
    final static int MAX_THREADS = 10;&lt;br /&gt;
&lt;br /&gt;
    public static final int NUM_OF_PHILOSOPHERS = 30;&lt;br /&gt;
    int []forks;&lt;br /&gt;
    int port;&lt;br /&gt;
&lt;br /&gt;
    public Server(int port) {&lt;br /&gt;
        this.forks = new int[NUM_OF_PHILOSOPHERS];&lt;br /&gt;
&lt;br /&gt;
        for(int i = 0; i &amp;lt; NUM_OF_PHILOSOPHERS; i++) {&lt;br /&gt;
            forks[i] = 2;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        pool = Executors.newFixedThreadPool(MAX_THREADS);&lt;br /&gt;
&lt;br /&gt;
        this.port = port;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public synchronized void test(int id) {&lt;br /&gt;
        int left = (id - 1 + NUM_OF_PHILOSOPHERS) % NUM_OF_PHILOSOPHERS;&lt;br /&gt;
        int right = (id + 1 + NUM_OF_PHILOSOPHERS) % NUM_OF_PHILOSOPHERS;&lt;br /&gt;
&lt;br /&gt;
        while(forks[id] != 2) {&lt;br /&gt;
            try {&lt;br /&gt;
                wait();&lt;br /&gt;
            } catch (InterruptedException e) {&lt;br /&gt;
                throw new RuntimeException(e);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        forks[left]--;&lt;br /&gt;
        forks[right]--;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void eat(BufferedReader rd, PrintWriter pw) {&lt;br /&gt;
        pw.println(System.currentTimeMillis());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public synchronized void signal(int id){&lt;br /&gt;
        int left = (id - 1 + NUM_OF_PHILOSOPHERS) % NUM_OF_PHILOSOPHERS;&lt;br /&gt;
        int right = (id + 1 + NUM_OF_PHILOSOPHERS) % NUM_OF_PHILOSOPHERS;&lt;br /&gt;
        forks[left]++;&lt;br /&gt;
        forks[right]++;&lt;br /&gt;
&lt;br /&gt;
        notifyAll();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
        Server server = new Server(4001);&lt;br /&gt;
&lt;br /&gt;
        try (&lt;br /&gt;
                ServerSocket listener = new ServerSocket(server.port)&lt;br /&gt;
                ) {&lt;br /&gt;
            while(true) {&lt;br /&gt;
                Socket sock = listener.accept();&lt;br /&gt;
&lt;br /&gt;
//                new RequestHandler(sock, server).start();&lt;br /&gt;
&lt;br /&gt;
                server.pool.execute(new RequestHandler(sock, server));&lt;br /&gt;
            }&lt;br /&gt;
        } catch (Exception e) {&lt;br /&gt;
            e.printStackTrace();&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;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%9B%D0%B0%D0%B1_1_%D0%A0%D0%A2%D0%98_2023&amp;diff=7116</id>
		<title>КДП/Лаб 1 РТИ 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%9B%D0%B0%D0%B1_1_%D0%A0%D0%A2%D0%98_2023&amp;diff=7116"/>
		<updated>2023-12-27T18:56:41Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: Dodata nova stranica&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
== Поставка ==&lt;br /&gt;
&lt;br /&gt;
У зависности од групе било је потребно решити један од следећих проблема:&lt;br /&gt;
&lt;br /&gt;
1. Решити Унисеx Батхроом проблем користећи &amp;lt;code&amp;gt;ReentrantLock&amp;lt;/code&amp;gt;. Потребно је да програм буде максимално конкурентан.&lt;br /&gt;
&lt;br /&gt;
2. Решити Атомиц Броадцаст проблем користећи &amp;lt;code&amp;gt;AtomicInteger&amp;lt;/code&amp;gt;. Потребно је да програм буде максимално конкурентан.&lt;br /&gt;
&lt;br /&gt;
== Решење ==&lt;br /&gt;
&lt;br /&gt;
Испод је решење за Unisex Bathroom.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package UnisexBathLocksLab1PrvaGrupa;&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
	&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
		&lt;br /&gt;
		int m = 5;&lt;br /&gt;
		int w = 5;&lt;br /&gt;
		&lt;br /&gt;
		int N = 4;&lt;br /&gt;
		&lt;br /&gt;
		Bathroom  b = new Bathroom(N);&lt;br /&gt;
		&lt;br /&gt;
		Thread mt[] = new Thread[m];&lt;br /&gt;
		Thread wt[] = new Thread[m];&lt;br /&gt;
		&lt;br /&gt;
		for(int i = 0; i &amp;lt; m; i++) {&lt;br /&gt;
			mt[i] = new Man(b);&lt;br /&gt;
			mt[i].start();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		for(int i = 0; i &amp;lt; w; i++) {&lt;br /&gt;
			wt[i] = new Woman(b);&lt;br /&gt;
			wt[i].start();&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;
==== &amp;lt;code&amp;gt;Woman.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package UnisexBathLocksLab1PrvaGrupa;&lt;br /&gt;
&lt;br /&gt;
public class Woman extends Thread{&lt;br /&gt;
	&lt;br /&gt;
	public int id;&lt;br /&gt;
	public static int running_id = 0;&lt;br /&gt;
	&lt;br /&gt;
	Bathroom bath;&lt;br /&gt;
	&lt;br /&gt;
	public Woman(Bathroom bath) {&lt;br /&gt;
		id = running_id++;&lt;br /&gt;
		this.bath = bath;&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			&lt;br /&gt;
			bath.w_enter(id);&lt;br /&gt;
			&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep((int)(Math.random() * 1000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			bath.w_exit(id);&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;
==== &amp;lt;code&amp;gt;Man.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package UnisexBathLocksLab1PrvaGrupa;&lt;br /&gt;
&lt;br /&gt;
public class Man extends Thread{&lt;br /&gt;
	&lt;br /&gt;
	public int id;&lt;br /&gt;
	public static int running_id = 0;&lt;br /&gt;
	&lt;br /&gt;
	Bathroom bath;&lt;br /&gt;
	&lt;br /&gt;
	public Man(Bathroom bath) {&lt;br /&gt;
		id = running_id++;&lt;br /&gt;
		this.bath = bath;&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			&lt;br /&gt;
			bath.m_enter(id);&lt;br /&gt;
			&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep((int)(Math.random() * 1000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			bath.m_exit(id);&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;
==== &amp;lt;code&amp;gt;Bathroom.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package UnisexBathLocksLab1PrvaGrupa;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.locks.Condition;&lt;br /&gt;
import java.util.concurrent.locks.Lock;&lt;br /&gt;
import java.util.concurrent.locks.ReentrantLock;&lt;br /&gt;
&lt;br /&gt;
public class Bathroom {&lt;br /&gt;
&lt;br /&gt;
	private int woman_cnt = 0;&lt;br /&gt;
	private int man_cnt = 0;&lt;br /&gt;
&lt;br /&gt;
	private int capacity = 0;&lt;br /&gt;
&lt;br /&gt;
	Lock lock = new ReentrantLock();&lt;br /&gt;
	Condition all = lock.newCondition();&lt;br /&gt;
&lt;br /&gt;
	private int ticket = 0;&lt;br /&gt;
	private int next = 0;&lt;br /&gt;
&lt;br /&gt;
	public Bathroom(int N) {&lt;br /&gt;
		this.ticket = 0;&lt;br /&gt;
		this.next = 0;&lt;br /&gt;
		this.man_cnt = 0;&lt;br /&gt;
		this.woman_cnt = 0;&lt;br /&gt;
		this.capacity = N;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void m_enter(int id) {&lt;br /&gt;
		lock.lock();&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			int my_ticket = ticket++;&lt;br /&gt;
			&lt;br /&gt;
			System.out.println(&amp;quot;Man(&amp;quot; + id + &amp;quot;) waiting&amp;quot;);&lt;br /&gt;
			while (my_ticket != next || woman_cnt &amp;gt; 0 || man_cnt &amp;gt;= capacity) {&lt;br /&gt;
				all.awaitUninterruptibly();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			System.out.println(&amp;quot;Man(&amp;quot; + id + &amp;quot;) entered&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			man_cnt += 1;&lt;br /&gt;
			this.next += 1;&lt;br /&gt;
&lt;br /&gt;
		} finally {&lt;br /&gt;
			lock.unlock();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void m_exit(int id) {&lt;br /&gt;
&lt;br /&gt;
		lock.lock();&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			System.out.println(&amp;quot;Man(&amp;quot; + id + &amp;quot;) left&amp;quot;);&lt;br /&gt;
			man_cnt -= 1;&lt;br /&gt;
			all.signalAll();&lt;br /&gt;
		} finally {&lt;br /&gt;
			lock.unlock();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void w_enter(int id) {&lt;br /&gt;
		lock.lock();&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			int my_ticket = ticket++;&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			System.out.println(&amp;quot;Woman(&amp;quot; + id + &amp;quot;) waiting&amp;quot;);&lt;br /&gt;
			while (my_ticket != next || man_cnt &amp;gt; 0 || woman_cnt &amp;gt;= capacity) {&lt;br /&gt;
				all.awaitUninterruptibly();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			System.out.println(&amp;quot;Woman(&amp;quot; + id + &amp;quot;) entered&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			woman_cnt += 1;&lt;br /&gt;
			next += 1;&lt;br /&gt;
&lt;br /&gt;
		} finally {&lt;br /&gt;
			lock.unlock();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void w_exit(int id) {&lt;br /&gt;
&lt;br /&gt;
		lock.lock();&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			System.out.println(&amp;quot;Woman(&amp;quot; + id + &amp;quot;) left&amp;quot;);&lt;br /&gt;
			woman_cnt -= 1;&lt;br /&gt;
			all.signalAll();&lt;br /&gt;
		} finally {&lt;br /&gt;
			lock.unlock();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6473</id>
		<title>ОС1/Модификације август 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6473"/>
		<updated>2023-09-06T21:28:01Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: jos uvek ne umem da kucam&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Sledeće modifikacije su se pojavile na odbrani projekta u avgustu 2023.&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 20 bodova ==&lt;br /&gt;
&lt;br /&gt;
Potrebno je proširiti usluge klase Thread tako da zadovoljava sledeće uslove&lt;br /&gt;
&lt;br /&gt;
Dodati statičku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads)&amp;lt;/code&amp;gt; koju korisnik poziva na početku programa. Ova metoda postavlja ograničenje na maksimalan broj &#039;&#039;&#039;korisničkih&#039;&#039;&#039; niti. &lt;br /&gt;
&lt;br /&gt;
Nakon postavljanja maksimalnog broja niti, moguce je kreirati dati broj niti, nakon toga sve novokreirane niti se blokiraju. Kada jedna od kreiranih korisničkih niti završi svoje izvršavanje ona odblokira jednu od prethodno blokiranih niti u redosledu kojem su blokirane.&lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
Potrebno je staviti maksimalan broj niti na 3 i kreirati 20 niti. Svaka nit treba da ispiše svoje ime + ID niti ciklično 5 puta. Nakog toga treba da simulira spavanje semaforom ili busy wait-om koji je u linearnoj korelaciji sa ID-om date niti.&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 30 bodova ==&lt;br /&gt;
&lt;br /&gt;
Dodati statičku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; koju korisnik poziva na početku programa. Ova metoda postavlja ograničenje na maksimalan broj &#039;&#039;&#039;korisničkih&#039;&#039;&#039; niti.  &lt;br /&gt;
&lt;br /&gt;
Nakon pozivanja metode &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; moguće je kreirati slobodno kreirati num_of_threads niti. Nakon toga naredne niti se blokiraju. Kada nit završi svoje izvršavanje ona prestaje sa radom (ove niti &#039;&#039;&#039;ne treba&#039;&#039;&#039; da deblokiraju prethodno blokirane niti). Nakon isteka max_time vremena potrebno je ispisati &#039;&#039;&#039;Waiting done: &#039;&#039;&#039;, i zatim odblokirati niti jednu za drugom onako kako suu blokirane pritom da se izmedju 2 deblokiranja čeka interval_time vremena. Posle svakog deblokiranja niti treba ispisati &#039;&#039;&#039;Interval time elapsed &#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
&lt;br /&gt;
Potrebno je pozvati &amp;lt;code&amp;gt;SetMaximumThreads(3, 20, 10)&amp;lt;/code&amp;gt; i kreirati 20 niti. Svaka nit treba da ispiše svoje ime + ID. Nakon toga treba nit da pozove &amp;lt;code&amp;gt;thread_sleep(10)&amp;lt;/code&amp;gt;. Ovo se ponavlja dok sve niti ne završe.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ОС1]]&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6472</id>
		<title>ОС1/Модификације август 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6472"/>
		<updated>2023-09-06T21:25:13Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: /* Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Sledeće modifikacije su se pojavile na odbrani projekta u avgustu 2023.&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 20 bodova ==&lt;br /&gt;
&lt;br /&gt;
Potrebno je proširiti usluge klase Thread tako da zadovoljava sledeće uslove&lt;br /&gt;
&lt;br /&gt;
Dodati statičku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads)&amp;lt;/code&amp;gt; koju korisnik poziva na početku programa. Ova metoda postavlja ograničenje na maksimalan broj &#039;&#039;&#039;korisničkih&#039;&#039;&#039; niti. &lt;br /&gt;
&lt;br /&gt;
Nakon postavljanja maksimalnog broja niti, moguce je kreirati dati broj niti, nakon toga sve novokreirane niti se blokiraju. Kada jedna od kreiranih korisničkih niti završi svoje izvršavanje ona odblokira jednu od prethodno blokiranih niti u redosledu kojem su blokirane.&lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
Potrebno je staviti maksimalan broj niti na 3 i kreirati 20 niti. Svaka nit treba da ispiše svoje ime + ID niti ciklično 5 puta. Nakog toga treba da simulira spavanje semaforom ili busy wait-om koji je u linearnoj korelacijai sa ID-om date niti.&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 30 bodova ==&lt;br /&gt;
&lt;br /&gt;
Dodati statičku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; koju korisnik poziva na početku programa. Ova metoda postavlja ograničenje na maksimalan broj &#039;&#039;&#039;korisničkih&#039;&#039;&#039; niti.  &lt;br /&gt;
&lt;br /&gt;
Nakon pozivanja metode &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; moguće je kreirati slobodno kreirati num_of_threads niti. Nakon toga naredne niti se blokiraju. Kada nit završi svoje izvršavanje ona prestaje sa radom (ove niti &#039;&#039;&#039;ne treba&#039;&#039;&#039; da deblokiraju prethodno blokirane niti). Nakon isteka max_time vremena potrebno je ispisati &#039;&#039;&#039;Waiting done: &#039;&#039;&#039;, i zatim odblokirati niti jednu za drugom onako kako suu blokirane pritom da se izmedju 2 deblokiranja čeka interval_time vremena. Posle svakog deblokiranja niti treba ispisati &#039;&#039;&#039;Interval time elapsed &#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
&lt;br /&gt;
Potrebno je pozvati &amp;lt;code&amp;gt;SetMaximumThreads(3 20, 10)&amp;lt;/code&amp;gt; i kreirati 20 niti. Svaka nit treba da ispiše svoje ime + ID. Nakon toga treba nit da pozove &amp;lt;code&amp;gt;thread_sleep(10)&amp;lt;/code&amp;gt;. Ovo se ponavlja dok sve niti ne završe.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ОС1]]&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6471</id>
		<title>ОС1/Модификације август 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6471"/>
		<updated>2023-09-06T21:24:35Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: ne umem da kucam&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Sledeće modifikacije su se pojavile na odbrani projekta u avgustu 2023.&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 20 bodova ==&lt;br /&gt;
&lt;br /&gt;
Potrebno je proširiti usluge klase Thread tako da zadovoljava sledeće uslove&lt;br /&gt;
&lt;br /&gt;
Dodati statičku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads)&amp;lt;/code&amp;gt; koju korisnik poziva na početku programa. Ova metoda postavlja ograničenje na maksimalan broj &#039;&#039;&#039;korisničkih&#039;&#039;&#039; niti. &lt;br /&gt;
&lt;br /&gt;
Nakon postavljanja maksimalnog broja niti, moguce je kreirati dati broj niti, nakon toga sve novokreirane niti se blokiraju. Kada jedna od kreiranih korisničkih niti završi svoje izvršavanje ona odblokira jednu od prethodno blokiranih niti u redosledu kojem su blokirane.&lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
Potrebno je staviti maksimalan broj niti na 3 i kreirati 20 niti. Svaka nit treba da ispiše svoje ime + ID niti ciklično 5 puta. Nakog toga treba da simulira spavanje semaforom ili busy wait-om koji je u linearnoj korelacijai sa ID-om date niti.&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 30 bodova ==&lt;br /&gt;
&lt;br /&gt;
Dodati statičku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; koju korisnik poziva na početku programa. Ova metoda postavlja ograničenje na maksimalan broj &#039;&#039;&#039;korisničkih&#039;&#039;&#039; niti.  &lt;br /&gt;
&lt;br /&gt;
Nakon pozivanja metode &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; moguće je kreirati slobodno kreirati num_of_threads niti. Nakon toga naredne niti se blokiraju. Kada nit završi svoje izvršavanje ona prestaje sa radom (ove niti &#039;&#039;&#039;ne treba&#039;&#039;&#039; da deblokiraju prethodno blokirane niti). Nakon isteka max_time vremena potrebno je ispisati &#039;&#039;&#039;Waiting done: &#039;&#039;&#039;, i zatim odblokirati niti jednu za drugom onako kako suu blokirane pritom da se izmedju 2 deblokiranja čeka interval_time vremena. Posle svakog deblokiranja niti treba ispisati &#039;&#039;&#039;Interval time elapsed &#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
&lt;br /&gt;
Potrebno je pozvati &amp;lt;code&amp;gt;SetMaximumThreads(3 20, 10)&amp;lt;/code&amp;gt; i kreirati 20 niti. Svaka nit treba da ispise svoje ime + ID. Nakon toga treba nit da pozove &amp;lt;code&amp;gt;thread_sleep(10)&amp;lt;/code&amp;gt;. Ovo se ponavlja dok sve niti ne zavrse.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ОС1]]&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=OS1/Modifikacije_avgust_2023&amp;diff=6470</id>
		<title>OS1/Modifikacije avgust 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=OS1/Modifikacije_avgust_2023&amp;diff=6470"/>
		<updated>2023-09-06T21:16:27Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: K0v4c преместио је страницу OS1/Modifikacije avgust 2023 на ОС1/Модификације август 2023&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#Преусмери [[ОС1/Модификације август 2023]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6469</id>
		<title>ОС1/Модификације август 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6469"/>
		<updated>2023-09-06T21:16:27Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: K0v4c преместио је страницу OS1/Modifikacije avgust 2023 на ОС1/Модификације август 2023&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Sledeće modifikacije su se pojavile na odbrani projekta u avgustu 2023.&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 20 bodova ==&lt;br /&gt;
&lt;br /&gt;
Potrebno je prosiriti usluge klase Thread tako da zadovoljava sledece uslove&lt;br /&gt;
&lt;br /&gt;
Dodati staticku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads)&amp;lt;/code&amp;gt; koju korisnik poziva na pocetku programa. Ova metoda postavlja ogranicenje na maksimalan broj &#039;&#039;&#039;korisnicnckih&#039;&#039;&#039; niti. &lt;br /&gt;
&lt;br /&gt;
Nakon postavljanja maksimalnog broja niti, slobodno je moguce kreirati dati broj niti, nakon toga sve novokreirane niti se blokiraju. Kada jedna od kreiranih korisnickih niti zavrsi svoje izvrsavanje ona odblokira jednu od prethodno blokiranih niti u redosledu kojem su blokirane.&lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
Potrebno je staviti maksimalan broj niti na 3 i kreirati 20 niti. Svaka nit treba da ispise svoje ime + ID niti cilicno 5 puta. Nakog toga treba da simulira spavanje semaforom ili busy wait-om koji je u linearnoj korelacijai sa ID-om date niti.&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 30 bodova ==&lt;br /&gt;
&lt;br /&gt;
Dodati staticku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; koju korisnik poziva na pocetku programa. Ova metoda postavlja ogranicenje na maksimalan broj &#039;&#039;&#039;korisnicnckih&#039;&#039;&#039; niti.  &lt;br /&gt;
&lt;br /&gt;
Nakon pozivanja metode &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; moguce je kreirati slobodno kreirati num_of_threads niti. Nakon toga naredne niti se blokiraju. Kada nit zavrsi svoje izvrsavanje ona prestaje sa radom (ove niti ne treba da deblokiraju prethodno blokirane niti). Nakon isteka max_time vremena potrebno je ispisati &#039;&#039;&#039;Waiting done: &#039;&#039;&#039;, i zatim odblokirati niti jednu za drugom onako kako se blokirane pritom da se izmedju 2 deblokiranja ceka interval_time vremena. Posle svakog deblokiranja niti treba ispisati &#039;&#039;&#039;Interval time elapsed &#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
&lt;br /&gt;
Potrebno je pozvati &amp;lt;code&amp;gt;SetMaximumThreads(3 20, 10)&amp;lt;/code&amp;gt; i kreirati 20 niti. Svaka nit treba da ispise svoje ime + ID. Nakon toga treba nit da pozove &amp;lt;code&amp;gt;thread_sleep(10)&amp;lt;/code&amp;gt;. Ovo se ponavlja dok sve niti ne zavrse.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ОС1]]&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6468</id>
		<title>ОС1/Модификације август 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6468"/>
		<updated>2023-09-06T21:14:52Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: /* Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Sledeće modifikacije su se pojavile na odbrani projekta u avgustu 2023.&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 20 bodova ==&lt;br /&gt;
&lt;br /&gt;
Potrebno je prosiriti usluge klase Thread tako da zadovoljava sledece uslove&lt;br /&gt;
&lt;br /&gt;
Dodati staticku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads)&amp;lt;/code&amp;gt; koju korisnik poziva na pocetku programa. Ova metoda postavlja ogranicenje na maksimalan broj &#039;&#039;&#039;korisnicnckih&#039;&#039;&#039; niti. &lt;br /&gt;
&lt;br /&gt;
Nakon postavljanja maksimalnog broja niti, slobodno je moguce kreirati dati broj niti, nakon toga sve novokreirane niti se blokiraju. Kada jedna od kreiranih korisnickih niti zavrsi svoje izvrsavanje ona odblokira jednu od prethodno blokiranih niti u redosledu kojem su blokirane.&lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
Potrebno je staviti maksimalan broj niti na 3 i kreirati 20 niti. Svaka nit treba da ispise svoje ime + ID niti cilicno 5 puta. Nakog toga treba da simulira spavanje semaforom ili busy wait-om koji je u linearnoj korelacijai sa ID-om date niti.&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 30 bodova ==&lt;br /&gt;
&lt;br /&gt;
Dodati staticku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; koju korisnik poziva na pocetku programa. Ova metoda postavlja ogranicenje na maksimalan broj &#039;&#039;&#039;korisnicnckih&#039;&#039;&#039; niti.  &lt;br /&gt;
&lt;br /&gt;
Nakon pozivanja metode &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; moguce je kreirati slobodno kreirati num_of_threads niti. Nakon toga naredne niti se blokiraju. Kada nit zavrsi svoje izvrsavanje ona prestaje sa radom (ove niti ne treba da deblokiraju prethodno blokirane niti). Nakon isteka max_time vremena potrebno je ispisati &#039;&#039;&#039;Waiting done: &#039;&#039;&#039;, i zatim odblokirati niti jednu za drugom onako kako se blokirane pritom da se izmedju 2 deblokiranja ceka interval_time vremena. Posle svakog deblokiranja niti treba ispisati &#039;&#039;&#039;Interval time elapsed &#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
&lt;br /&gt;
Potrebno je pozvati &amp;lt;code&amp;gt;SetMaximumThreads(3 20, 10)&amp;lt;/code&amp;gt; i kreirati 20 niti. Svaka nit treba da ispise svoje ime + ID. Nakon toga treba nit da pozove &amp;lt;code&amp;gt;thread_sleep(10)&amp;lt;/code&amp;gt;. Ovo se ponavlja dok sve niti ne zavrse.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ОС1]]&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6467</id>
		<title>ОС1/Модификације август 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6467"/>
		<updated>2023-09-06T21:13:04Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Sledeće modifikacije su se pojavile na odbrani projekta u avgustu 2023.&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 20 bodova ==&lt;br /&gt;
&lt;br /&gt;
Potrebno je prosiriti usluge klase Thread tako da zadovoljava sledece uslove&lt;br /&gt;
&lt;br /&gt;
Dodati staticku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads)&amp;lt;/code&amp;gt; koju korisnik poziva na pocetku programa. Ova metoda postavlja ogranicenje na maksimalan broj &#039;&#039;&#039;korisnicnckih&#039;&#039;&#039; niti. &lt;br /&gt;
&lt;br /&gt;
Nakon postavljanja maksimalnog broja niti, slobodno je moguce kreirati dati broj niti, nakon toga sve novokreirane niti se blokiraju. Kada jedna od kreiranih korisnickih niti zavrsi svoje izvrsavanje ona odblokira jednu od prethodno blokiranih niti u redosledu kojem su blokirane.&lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
Potrebno je staviti maksimalan broj niti na 3 i kreirati 20 niti. Svaka nit treba da ispise svoje ime + ID niti cilicno 5 puta. Nakog toga treba da simulira spavanje semaforom ili busy wait-om koji je u linearnoj korelacijai sa ID-om date niti.&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 30 bodova ==&lt;br /&gt;
&lt;br /&gt;
Dodati staticku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; koju korisnik poziva na pocetku programa. Ova metoda postavlja ogranicenje na maksimalan broj &#039;&#039;&#039;korisnicnckih&#039;&#039;&#039; niti.  &lt;br /&gt;
&lt;br /&gt;
Nakon pozivanja metode &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; moguce je kreirati slobodno kreirati num_of_threads niti. Nakon toga naredne niti se blokiraju. Kada nit zavrsi svoje izvrsavanje ona prestaje sa radom (ove niti ne treba da deblokiraju prethodno blokirane niti). Nakon isteka max_time vremena potrebno je ispisati &#039;&#039;&#039;Waiting done: &#039;&#039;&#039;, i zatim odblokirati niti jednu za drugom onako kako se blokirane pritom da se izmedju 2 deblokiranja ceka interval_time vremena. Posle svakog deblokiranja niti treba ispisati &#039;&#039;&#039;Interval time elapsed &#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
&lt;br /&gt;
Potrebno je kreirati pozvati &amp;lt;code&amp;gt;SetMaximumThreads(3 20, 10)&amp;lt;/code&amp;gt; i kreirati 20 niti. Svaka nit treba da ispise svoje ime + ID. Nakon toga treba nit da pozove &amp;lt;code&amp;gt;thread_sleep(10)&amp;lt;/code&amp;gt;. Ovo se ponavlja dok sve niti ne zavrse.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ОС1]]&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6466</id>
		<title>ОС1/Модификације август 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82_2023&amp;diff=6466"/>
		<updated>2023-09-06T21:12:31Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: Dodata modifikacija&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Sledeće modifikacije su se pojavile na odbrani projekta u avgustu 2023.&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 20 bodova ==&lt;br /&gt;
&lt;br /&gt;
Potrebno je prosiriti usluge klase Thread tako da zadovoljava sledece uslove&lt;br /&gt;
&lt;br /&gt;
Dodati staticku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads)&amp;lt;/code&amp;gt; koju korisnik poziva na pocetku programa. Ova metoda postavlja ogranicenje na maksimalan broj &#039;&#039;&#039;korisnicnckih&#039;&#039;&#039; niti. &lt;br /&gt;
&lt;br /&gt;
Nakon postavljanja maksimalnog broja niti, slobodno je moguce kreirati dati broj niti, nakon toga sve novokreirane niti se blokiraju. Kada jedna od kreiranih korisnickih niti zavrsi svoje izvrsavanje ona odblokira jednu od prethodno blokiranih niti u redosledu kojem su blokirane.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
Potrebno je staviti maksimalan broj niti na 3 i kreirati 20 niti. Svaka nit treba da ispise svoje ime + ID niti cilicno 5 puta. Nakog toga treba da simulira spavanje semaforom ili busy wait-om koji je u linearnoj korelacijai sa ID-om date niti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modifikacija za 30 bodova ==&lt;br /&gt;
&lt;br /&gt;
Dodati staticku metodu &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; koju korisnik poziva na pocetku programa. Ova metoda postavlja ogranicenje na maksimalan broj &#039;&#039;&#039;korisnicnckih&#039;&#039;&#039; niti.  &lt;br /&gt;
&lt;br /&gt;
Nakon pozivanja metode &amp;lt;code&amp;gt;SetMaximumThreads(int num_of_threads, int max_time, int interval_time)&amp;lt;/code&amp;gt; moguce je kreirati slobodno kreirati num_of_threads niti. Nakon toga naredne niti se blokiraju. Kada nit zavrsi svoje izvrsavanje ona prestaje sa radom (ove niti ne treba da deblokiraju prethodno blokirane niti). Nakon isteka max_time vremena potrebno je ispisati &#039;&#039;&#039;Waiting done: &#039;&#039;&#039;, i zatim odblokirati niti jednu za drugom onako kako se blokirane pritom da se izmedju 2 deblokiranja ceka interval_time vremena. Posle svakog deblokiranja niti treba ispisati &#039;&#039;&#039;Interval time elapsed &#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
&lt;br /&gt;
Potrebno je kreirati pozvati &amp;lt;code&amp;gt;SetMaximumThreads(3 20, 10)&amp;lt;/code&amp;gt; i kreirati 20 niti. Svaka nit treba da ispise svoje ime + ID. Nakon toga treba nit da pozove &amp;lt;code&amp;gt;thread_sleep(10)&amp;lt;/code&amp;gt;. Ovo se ponavlja dok sve niti ne zavrse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ОС1]]&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2013&amp;diff=6446</id>
		<title>ОС1/Јун 2013</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2013&amp;diff=6446"/>
		<updated>2023-08-26T11:22:36Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: /* Rešenje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2013/jun/OS1%20-%20Jun%202013.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta su multiprocesorski, a šta distribuirani sistemi? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti [[ОС1/Јул 2012#1. zadatak|prvi zadatak iz julskog roka 2012. godine]].&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako se nad sledećim programom kreira jedan proces, koliko će ukupno biti elemenata sa vrednošću &#039;&#039;&#039;različitom od 0&#039;&#039;&#039; u nizovima &amp;lt;code&amp;gt;pid&amp;lt;/code&amp;gt; svih kreiranih procesa (uključujući i taj jedan početni) kada svi ti procesi izađu iz petlje, pod pretpostavkom da su svi sistemski pozivi uspeli?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
const int N = 2;&lt;br /&gt;
int pid[N];&lt;br /&gt;
void main() {&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        pid[i] = fork();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Prva iteracija: P1 pravi P2, &amp;lt;code&amp;gt;pid[0] = 2&amp;lt;/code&amp;gt; u P1&lt;br /&gt;
* Druga iteracija: P1 pravi P3, &amp;lt;code&amp;gt;pid[1] = 3&amp;lt;/code&amp;gt; u P1 dok je &amp;lt;code&amp;gt;pid[0] = 2&amp;lt;/code&amp;gt; u P3 zbog toga što je taj niz kopiran iz P1&lt;br /&gt;
* Druga iteracija: P2 pravi P4, &amp;lt;code&amp;gt;pid[1] = 4&amp;lt;/code&amp;gt; u P2&lt;br /&gt;
Na kraju postoji 4 vrednosti koje nisu nula.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dokazati da Petersonov algoritam za međusobno isključenje kritičnih sekcija dva uporedna procesa uposlenim čekanjem zaista obezbeđuje međusobno isključenje, odnosno ne poseduje problem utrkivanja (&#039;&#039;race condition&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pretpostavimo da oba procesa uposleno čekaju. Promenljiva turn &amp;quot;prelama&amp;quot; u situaciji kada oba procesa žele da uđu u kritičnu sekciju jer turn može imati vrednost ili 1 ili 2. Dakle, nemoguće je da dođe do utrkivanja.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem klasičnih brojačkih semafora, napisati kod za kritičnu sekciju u koju može uporedo ući najviše &#039;&#039;N&#039;&#039; procesa. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var mutex : Semaphore := N;&lt;br /&gt;
process P:&lt;br /&gt;
    begin&lt;br /&gt;
        loop&lt;br /&gt;
            wait(mutex);&lt;br /&gt;
            &amp;lt;critical&amp;gt;&lt;br /&gt;
            signal(mutex);&lt;br /&gt;
            &amp;lt;non-critical&amp;gt;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end P;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koju uslugu operativni sistem treba da obezbedi procesima da bi oni koristili preklope (&#039;&#039;overlays&#039;&#039;)?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti rešenje [[ОС1/Јул 2013#5. zadatak|5. zadatka iz jula 2013. godine]].&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je definicija strukture &amp;lt;code&amp;gt;FreeSegment&amp;lt;/code&amp;gt; koja predstavlja jedan segment slobodne memorije. Ove strukture uvezane su u dvostruko ulančanu, neuređenu listu čija je glava &amp;lt;code&amp;gt;freeSegHead&amp;lt;/code&amp;gt;. Implementirati funkciju &amp;lt;code&amp;gt;getBestFit(size_t)&amp;lt;/code&amp;gt; koja treba da pronađe i vrati (ali ne menja ni njega ni listu) segment slobodne memorije u koji se može smestiti blok date veličine, po &#039;&#039;best fit&#039;&#039; algoritmu.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct FreeSegment {&lt;br /&gt;
    size_t size;&lt;br /&gt;
    FreeSegment *prev, *next;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void* getBestFit(size_t sz) {&lt;br /&gt;
    FreeSegment* bestFit = 0&lt;br /&gt;
    size_t smallestFragment = MAX_SIZE;&lt;br /&gt;
    for (FreeSegment* cur = freeSegHead; cur != 0; cur = cur-&amp;gt;next) {&lt;br /&gt;
        if (cur-&amp;gt;size &amp;lt; sz) {&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
        if (cur-&amp;gt;size &amp;lt; smallestFragment) {&lt;br /&gt;
            smallestFragment = cur-&amp;gt;size;&lt;br /&gt;
            bestFit = cur;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (bestFit == 0) {&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    FreeSegment* newFrag = (FreeSegment*)((char*)bestFit + sz);&lt;br /&gt;
    if (bestFit-&amp;gt;prev) {&lt;br /&gt;
        bestFit-&amp;gt;prev-&amp;gt;next = newFrag;&lt;br /&gt;
    } else {&lt;br /&gt;
        freeSegHead = bestFit-&amp;gt;next;&lt;br /&gt;
    }&lt;br /&gt;
    if (bestFit-&amp;gt;next) {&lt;br /&gt;
        bestFit-&amp;gt;next-&amp;gt;prev = newFrag;&lt;br /&gt;
    }&lt;br /&gt;
    newFrag-&amp;gt;prev = bestFit-&amp;gt;prev;&lt;br /&gt;
    newFrag-&amp;gt;next = bestFit-&amp;gt;next;&lt;br /&gt;
    newFrag-&amp;gt;size = bestFit-&amp;gt;size - sz;&lt;br /&gt;
    return bestFit;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Memorija nekog računara organizovana je stranično, sa stranicom veličine 4KB. Adresibilna jedinica  je  bajt,  a  virtuelna  adresa  je  32-bitna. Fizička adresa je veličine 32 bita. Ako je PMT organizovana u dva nivoa, s tim da su veličine polja za broj ulaza u tabele oba nivoa isti, kolika je veličina (u bajtovima) PMT prvog nivoa? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
VA: 10 PMT1 | 10 PMT2 | 12 offset &lt;br /&gt;
&lt;br /&gt;
Ulaz PMT 1. nivoa sadrzi fizičku adresu početka PMT 2. nivoa. Kako je fizička adresa 32b = 4B odavde sledi da veličina PMT 1. nivoa je:&lt;br /&gt;
&lt;br /&gt;
4B * 2&amp;lt;sup&amp;gt;10&amp;lt;/sup&amp;gt; = 4KB&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti tehniku dvostrukog baferisanja (&#039;&#039;double buffering&#039;&#039;) kod ulaza/izlaza. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Proizvođač upisuje u jedan bafer dok potrošač čita iz drugog bafora. Kada oba završe, baferi zamenjuju uloge.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki proces izvršava redom sledeće sistemske pozive. Pod pretpostavkom da korisnik u čije ime se izvršava ovaj proces ima pravo pristupa do oba fajla i na čitanje i na upis, i da oba poziva za otvaranje fajlova uspevaju, navesti koji od preostalih poziva će biti uspešan, a koji neuspešan (upisati na liniji pored poziva).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
FHANDLE f1 = fopen(“x.doc”,read);&lt;br /&gt;
FHANDLE f2 = fopen(“y.doc”,read|write);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fread(f1,buffer1,n1);&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fwrite(f1,buffer2,n2);&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fread(f2,buffer1,n1);&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fwrite(f2,buffer2,n2);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2011#9. zadatak|junskog roka 2011]].&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki fajl sistem koristi bit vektor za evidenciju slobodnih blokova na disku. Kolika je veličina ovog vektora u bajtovima, za disk veličine 256 GB sa blokom veličine 512B&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Na disku ima ukupno &amp;lt;math&amp;gt;\frac{256GB}{512B} = 2^{29}&amp;lt;/math&amp;gt; blokova. Pošto je za svaki blok potreban po jedan bit, količinu prostora određujemo kao &amp;lt;math&amp;gt;\frac{2^{29}}{2^3} = 64 MB&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2013&amp;diff=6445</id>
		<title>ОС1/Јун 2013</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2013&amp;diff=6445"/>
		<updated>2023-08-26T11:22:22Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: /* Rešenje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2013/jun/OS1%20-%20Jun%202013.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta su multiprocesorski, a šta distribuirani sistemi? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti [[ОС1/Јул 2012#1. zadatak|prvi zadatak iz julskog roka 2012. godine]].&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako se nad sledećim programom kreira jedan proces, koliko će ukupno biti elemenata sa vrednošću &#039;&#039;&#039;različitom od 0&#039;&#039;&#039; u nizovima &amp;lt;code&amp;gt;pid&amp;lt;/code&amp;gt; svih kreiranih procesa (uključujući i taj jedan početni) kada svi ti procesi izađu iz petlje, pod pretpostavkom da su svi sistemski pozivi uspeli?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
const int N = 2;&lt;br /&gt;
int pid[N];&lt;br /&gt;
void main() {&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        pid[i] = fork();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Prva iteracija: P1 pravi P2, &amp;lt;code&amp;gt;pid[0] = 2&amp;lt;/code&amp;gt; u P1&lt;br /&gt;
* Druga iteracija: P1 pravi P3, &amp;lt;code&amp;gt;pid[1] = 3&amp;lt;/code&amp;gt; u P1 dok je &amp;lt;code&amp;gt;pid[0] = 2&amp;lt;/code&amp;gt; u P3 zbog toga što je taj niz kopiran iz P1&lt;br /&gt;
* Druga iteracija: P2 pravi P4, &amp;lt;code&amp;gt;pid[1] = 4&amp;lt;/code&amp;gt; u P2&lt;br /&gt;
Na kraju postoji 4 vrednosti koje nisu nula.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dokazati da Petersonov algoritam za međusobno isključenje kritičnih sekcija dva uporedna procesa uposlenim čekanjem zaista obezbeđuje međusobno isključenje, odnosno ne poseduje problem utrkivanja (&#039;&#039;race condition&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pretpostavimo da oba procesa uposleno čekaju. Promenljiva turn &amp;quot;prelama&amp;quot; u situaciji kada oba procesa žele da uđu u kritičnu sekciju jer turn može imati vrednost ili 1 ili 2. Dakle, nemoguće je da dođe do utrkivanja.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem klasičnih brojačkih semafora, napisati kod za kritičnu sekciju u koju može uporedo ući najviše &#039;&#039;N&#039;&#039; procesa. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var mutex : Semaphore := N;&lt;br /&gt;
process P:&lt;br /&gt;
    begin&lt;br /&gt;
        loop&lt;br /&gt;
            wait(mutex);&lt;br /&gt;
            &amp;lt;critical&amp;gt;&lt;br /&gt;
            signal(mutex);&lt;br /&gt;
            &amp;lt;non-critical&amp;gt;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end P;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koju uslugu operativni sistem treba da obezbedi procesima da bi oni koristili preklope (&#039;&#039;overlays&#039;&#039;)?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti rešenje [[ОС1/Јул 2013#5. zadatak|5. zadatka iz jula 2013. godine]].&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je definicija strukture &amp;lt;code&amp;gt;FreeSegment&amp;lt;/code&amp;gt; koja predstavlja jedan segment slobodne memorije. Ove strukture uvezane su u dvostruko ulančanu, neuređenu listu čija je glava &amp;lt;code&amp;gt;freeSegHead&amp;lt;/code&amp;gt;. Implementirati funkciju &amp;lt;code&amp;gt;getBestFit(size_t)&amp;lt;/code&amp;gt; koja treba da pronađe i vrati (ali ne menja ni njega ni listu) segment slobodne memorije u koji se može smestiti blok date veličine, po &#039;&#039;best fit&#039;&#039; algoritmu.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct FreeSegment {&lt;br /&gt;
    size_t size;&lt;br /&gt;
    FreeSegment *prev, *next;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void* getBestFit(size_t sz) {&lt;br /&gt;
    FreeSegment* bestFit = 0&lt;br /&gt;
    size_t smallestFragment = MAX_SIZE;&lt;br /&gt;
    for (FreeSegment* cur = freeSegHead; cur != 0; cur = cur-&amp;gt;next) {&lt;br /&gt;
        if (cur-&amp;gt;size &amp;lt; sz) {&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
        if (cur-&amp;gt;size &amp;lt; smallestFragment) {&lt;br /&gt;
            smallestFragment = cur-&amp;gt;size;&lt;br /&gt;
            bestFit = cur;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (bestFit == 0) {&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    FreeSegment* newFrag = (FreeSegment*)((char*)bestFit + sz);&lt;br /&gt;
    if (bestFit-&amp;gt;prev) {&lt;br /&gt;
        bestFit-&amp;gt;prev-&amp;gt;next = newFrag;&lt;br /&gt;
    } else {&lt;br /&gt;
        freeSegHead = bestFit-&amp;gt;next;&lt;br /&gt;
    }&lt;br /&gt;
    if (bestFit-&amp;gt;next) {&lt;br /&gt;
        bestFit-&amp;gt;next-&amp;gt;prev = newFrag;&lt;br /&gt;
    }&lt;br /&gt;
    newFrag-&amp;gt;prev = bestFit-&amp;gt;prev;&lt;br /&gt;
    newFrag-&amp;gt;next = bestFit-&amp;gt;next;&lt;br /&gt;
    newFrag-&amp;gt;size = bestFit-&amp;gt;size - sz;&lt;br /&gt;
    return bestFit;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Memorija nekog računara organizovana je stranično, sa stranicom veličine 4KB. Adresibilna jedinica  je  bajt,  a  virtuelna  adresa  je  32-bitna. Fizička adresa je veličine 32 bita. Ako je PMT organizovana u dva nivoa, s tim da su veličine polja za broj ulaza u tabele oba nivoa isti, kolika je veličina (u bajtovima) PMT prvog nivoa? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
VA: 10 PMT1 | 10 PMT2 | 12 offset &lt;br /&gt;
&lt;br /&gt;
Ulaz PMT 1. nivoa sadrzi fizičku adresu početka PMT 2. nivoa. Kako je fizička adresa 32b = 4B odavde sledi da veličina PMT 1. nivoa je:&lt;br /&gt;
&lt;br /&gt;
4B * 2&amp;lt;sup&amp;gt;12&amp;lt;/sup&amp;gt; = 4KB&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti tehniku dvostrukog baferisanja (&#039;&#039;double buffering&#039;&#039;) kod ulaza/izlaza. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Proizvođač upisuje u jedan bafer dok potrošač čita iz drugog bafora. Kada oba završe, baferi zamenjuju uloge.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki proces izvršava redom sledeće sistemske pozive. Pod pretpostavkom da korisnik u čije ime se izvršava ovaj proces ima pravo pristupa do oba fajla i na čitanje i na upis, i da oba poziva za otvaranje fajlova uspevaju, navesti koji od preostalih poziva će biti uspešan, a koji neuspešan (upisati na liniji pored poziva).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
FHANDLE f1 = fopen(“x.doc”,read);&lt;br /&gt;
FHANDLE f2 = fopen(“y.doc”,read|write);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fread(f1,buffer1,n1);&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fwrite(f1,buffer2,n2);&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fread(f2,buffer1,n1);&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fwrite(f2,buffer2,n2);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2011#9. zadatak|junskog roka 2011]].&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki fajl sistem koristi bit vektor za evidenciju slobodnih blokova na disku. Kolika je veličina ovog vektora u bajtovima, za disk veličine 256 GB sa blokom veličine 512B&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Na disku ima ukupno &amp;lt;math&amp;gt;\frac{256GB}{512B} = 2^{29}&amp;lt;/math&amp;gt; blokova. Pošto je za svaki blok potreban po jedan bit, količinu prostora određujemo kao &amp;lt;math&amp;gt;\frac{2^{29}}{2^3} = 64 MB&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2013&amp;diff=6444</id>
		<title>ОС1/Јун 2013</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2013&amp;diff=6444"/>
		<updated>2023-08-26T11:21:58Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: /* Rešenje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2013/jun/OS1%20-%20Jun%202013.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta su multiprocesorski, a šta distribuirani sistemi? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti [[ОС1/Јул 2012#1. zadatak|prvi zadatak iz julskog roka 2012. godine]].&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako se nad sledećim programom kreira jedan proces, koliko će ukupno biti elemenata sa vrednošću &#039;&#039;&#039;različitom od 0&#039;&#039;&#039; u nizovima &amp;lt;code&amp;gt;pid&amp;lt;/code&amp;gt; svih kreiranih procesa (uključujući i taj jedan početni) kada svi ti procesi izađu iz petlje, pod pretpostavkom da su svi sistemski pozivi uspeli?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
const int N = 2;&lt;br /&gt;
int pid[N];&lt;br /&gt;
void main() {&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        pid[i] = fork();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Prva iteracija: P1 pravi P2, &amp;lt;code&amp;gt;pid[0] = 2&amp;lt;/code&amp;gt; u P1&lt;br /&gt;
* Druga iteracija: P1 pravi P3, &amp;lt;code&amp;gt;pid[1] = 3&amp;lt;/code&amp;gt; u P1 dok je &amp;lt;code&amp;gt;pid[0] = 2&amp;lt;/code&amp;gt; u P3 zbog toga što je taj niz kopiran iz P1&lt;br /&gt;
* Druga iteracija: P2 pravi P4, &amp;lt;code&amp;gt;pid[1] = 4&amp;lt;/code&amp;gt; u P2&lt;br /&gt;
Na kraju postoji 4 vrednosti koje nisu nula.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dokazati da Petersonov algoritam za međusobno isključenje kritičnih sekcija dva uporedna procesa uposlenim čekanjem zaista obezbeđuje međusobno isključenje, odnosno ne poseduje problem utrkivanja (&#039;&#039;race condition&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pretpostavimo da oba procesa uposleno čekaju. Promenljiva turn &amp;quot;prelama&amp;quot; u situaciji kada oba procesa žele da uđu u kritičnu sekciju jer turn može imati vrednost ili 1 ili 2. Dakle, nemoguće je da dođe do utrkivanja.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem klasičnih brojačkih semafora, napisati kod za kritičnu sekciju u koju može uporedo ući najviše &#039;&#039;N&#039;&#039; procesa. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var mutex : Semaphore := N;&lt;br /&gt;
process P:&lt;br /&gt;
    begin&lt;br /&gt;
        loop&lt;br /&gt;
            wait(mutex);&lt;br /&gt;
            &amp;lt;critical&amp;gt;&lt;br /&gt;
            signal(mutex);&lt;br /&gt;
            &amp;lt;non-critical&amp;gt;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end P;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koju uslugu operativni sistem treba da obezbedi procesima da bi oni koristili preklope (&#039;&#039;overlays&#039;&#039;)?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti rešenje [[ОС1/Јул 2013#5. zadatak|5. zadatka iz jula 2013. godine]].&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je definicija strukture &amp;lt;code&amp;gt;FreeSegment&amp;lt;/code&amp;gt; koja predstavlja jedan segment slobodne memorije. Ove strukture uvezane su u dvostruko ulančanu, neuređenu listu čija je glava &amp;lt;code&amp;gt;freeSegHead&amp;lt;/code&amp;gt;. Implementirati funkciju &amp;lt;code&amp;gt;getBestFit(size_t)&amp;lt;/code&amp;gt; koja treba da pronađe i vrati (ali ne menja ni njega ni listu) segment slobodne memorije u koji se može smestiti blok date veličine, po &#039;&#039;best fit&#039;&#039; algoritmu.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct FreeSegment {&lt;br /&gt;
    size_t size;&lt;br /&gt;
    FreeSegment *prev, *next;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void* getBestFit(size_t sz) {&lt;br /&gt;
    FreeSegment* bestFit = 0&lt;br /&gt;
    size_t smallestFragment = MAX_SIZE;&lt;br /&gt;
    for (FreeSegment* cur = freeSegHead; cur != 0; cur = cur-&amp;gt;next) {&lt;br /&gt;
        if (cur-&amp;gt;size &amp;lt; sz) {&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
        if (cur-&amp;gt;size &amp;lt; smallestFragment) {&lt;br /&gt;
            smallestFragment = cur-&amp;gt;size;&lt;br /&gt;
            bestFit = cur;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (bestFit == 0) {&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    FreeSegment* newFrag = (FreeSegment*)((char*)bestFit + sz);&lt;br /&gt;
    if (bestFit-&amp;gt;prev) {&lt;br /&gt;
        bestFit-&amp;gt;prev-&amp;gt;next = newFrag;&lt;br /&gt;
    } else {&lt;br /&gt;
        freeSegHead = bestFit-&amp;gt;next;&lt;br /&gt;
    }&lt;br /&gt;
    if (bestFit-&amp;gt;next) {&lt;br /&gt;
        bestFit-&amp;gt;next-&amp;gt;prev = newFrag;&lt;br /&gt;
    }&lt;br /&gt;
    newFrag-&amp;gt;prev = bestFit-&amp;gt;prev;&lt;br /&gt;
    newFrag-&amp;gt;next = bestFit-&amp;gt;next;&lt;br /&gt;
    newFrag-&amp;gt;size = bestFit-&amp;gt;size - sz;&lt;br /&gt;
    return bestFit;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Memorija nekog računara organizovana je stranično, sa stranicom veličine 4KB. Adresibilna jedinica  je  bajt,  a  virtuelna  adresa  je  32-bitna. Fizička adresa je veličine 32 bita. Ako je PMT organizovana u dva nivoa, s tim da su veličine polja za broj ulaza u tabele oba nivoa isti, kolika je veličina (u bajtovima) PMT prvog nivoa? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
VA: 10 PMT1 | 10 PMT2 | 12 offset &lt;br /&gt;
&lt;br /&gt;
Ulaz PMT 1. nivoa sadrzi fizičku adresu početka PMT 2. nivoa. Kako je fizička adresa 32b = 4B odavde sledi da veličina PMT 1. nivoa je:&lt;br /&gt;
&lt;br /&gt;
4B * 2^{10} = 4KB&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti tehniku dvostrukog baferisanja (&#039;&#039;double buffering&#039;&#039;) kod ulaza/izlaza. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Proizvođač upisuje u jedan bafer dok potrošač čita iz drugog bafora. Kada oba završe, baferi zamenjuju uloge.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki proces izvršava redom sledeće sistemske pozive. Pod pretpostavkom da korisnik u čije ime se izvršava ovaj proces ima pravo pristupa do oba fajla i na čitanje i na upis, i da oba poziva za otvaranje fajlova uspevaju, navesti koji od preostalih poziva će biti uspešan, a koji neuspešan (upisati na liniji pored poziva).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
FHANDLE f1 = fopen(“x.doc”,read);&lt;br /&gt;
FHANDLE f2 = fopen(“y.doc”,read|write);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fread(f1,buffer1,n1);&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fwrite(f1,buffer2,n2);&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fread(f2,buffer1,n1);&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fwrite(f2,buffer2,n2);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2011#9. zadatak|junskog roka 2011]].&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki fajl sistem koristi bit vektor za evidenciju slobodnih blokova na disku. Kolika je veličina ovog vektora u bajtovima, za disk veličine 256 GB sa blokom veličine 512B&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Na disku ima ukupno &amp;lt;math&amp;gt;\frac{256GB}{512B} = 2^{29}&amp;lt;/math&amp;gt; blokova. Pošto je za svaki blok potreban po jedan bit, količinu prostora određujemo kao &amp;lt;math&amp;gt;\frac{2^{29}}{2^3} = 64 MB&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2013&amp;diff=6443</id>
		<title>ОС1/Јун 2013</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2013&amp;diff=6443"/>
		<updated>2023-08-26T11:19:21Z</updated>

		<summary type="html">&lt;p&gt;K0v4c: /* Rešenje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2013/jun/OS1%20-%20Jun%202013.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta su multiprocesorski, a šta distribuirani sistemi? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti [[ОС1/Јул 2012#1. zadatak|prvi zadatak iz julskog roka 2012. godine]].&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako se nad sledećim programom kreira jedan proces, koliko će ukupno biti elemenata sa vrednošću &#039;&#039;&#039;različitom od 0&#039;&#039;&#039; u nizovima &amp;lt;code&amp;gt;pid&amp;lt;/code&amp;gt; svih kreiranih procesa (uključujući i taj jedan početni) kada svi ti procesi izađu iz petlje, pod pretpostavkom da su svi sistemski pozivi uspeli?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
const int N = 2;&lt;br /&gt;
int pid[N];&lt;br /&gt;
void main() {&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        pid[i] = fork();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Prva iteracija: P1 pravi P2, &amp;lt;code&amp;gt;pid[0] = 2&amp;lt;/code&amp;gt; u P1&lt;br /&gt;
* Druga iteracija: P1 pravi P3, &amp;lt;code&amp;gt;pid[1] = 3&amp;lt;/code&amp;gt; u P1 dok je &amp;lt;code&amp;gt;pid[0] = 2&amp;lt;/code&amp;gt; u P3 zbog toga što je taj niz kopiran iz P1&lt;br /&gt;
* Druga iteracija: P2 pravi P4, &amp;lt;code&amp;gt;pid[1] = 4&amp;lt;/code&amp;gt; u P2&lt;br /&gt;
Na kraju postoji 4 vrednosti koje nisu nula.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dokazati da Petersonov algoritam za međusobno isključenje kritičnih sekcija dva uporedna procesa uposlenim čekanjem zaista obezbeđuje međusobno isključenje, odnosno ne poseduje problem utrkivanja (&#039;&#039;race condition&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pretpostavimo da oba procesa uposleno čekaju. Promenljiva turn &amp;quot;prelama&amp;quot; u situaciji kada oba procesa žele da uđu u kritičnu sekciju jer turn može imati vrednost ili 1 ili 2. Dakle, nemoguće je da dođe do utrkivanja.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem klasičnih brojačkih semafora, napisati kod za kritičnu sekciju u koju može uporedo ući najviše &#039;&#039;N&#039;&#039; procesa. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
var mutex : Semaphore := N;&lt;br /&gt;
process P:&lt;br /&gt;
    begin&lt;br /&gt;
        loop&lt;br /&gt;
            wait(mutex);&lt;br /&gt;
            &amp;lt;critical&amp;gt;&lt;br /&gt;
            signal(mutex);&lt;br /&gt;
            &amp;lt;non-critical&amp;gt;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end P;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koju uslugu operativni sistem treba da obezbedi procesima da bi oni koristili preklope (&#039;&#039;overlays&#039;&#039;)?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti rešenje [[ОС1/Јул 2013#5. zadatak|5. zadatka iz jula 2013. godine]].&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je definicija strukture &amp;lt;code&amp;gt;FreeSegment&amp;lt;/code&amp;gt; koja predstavlja jedan segment slobodne memorije. Ove strukture uvezane su u dvostruko ulančanu, neuređenu listu čija je glava &amp;lt;code&amp;gt;freeSegHead&amp;lt;/code&amp;gt;. Implementirati funkciju &amp;lt;code&amp;gt;getBestFit(size_t)&amp;lt;/code&amp;gt; koja treba da pronađe i vrati (ali ne menja ni njega ni listu) segment slobodne memorije u koji se može smestiti blok date veličine, po &#039;&#039;best fit&#039;&#039; algoritmu.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct FreeSegment {&lt;br /&gt;
    size_t size;&lt;br /&gt;
    FreeSegment *prev, *next;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void* getBestFit(size_t sz) {&lt;br /&gt;
    FreeSegment* bestFit = 0&lt;br /&gt;
    size_t smallestFragment = MAX_SIZE;&lt;br /&gt;
    for (FreeSegment* cur = freeSegHead; cur != 0; cur = cur-&amp;gt;next) {&lt;br /&gt;
        if (cur-&amp;gt;size &amp;lt; sz) {&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
        if (cur-&amp;gt;size &amp;lt; smallestFragment) {&lt;br /&gt;
            smallestFragment = cur-&amp;gt;size;&lt;br /&gt;
            bestFit = cur;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (bestFit == 0) {&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    FreeSegment* newFrag = (FreeSegment*)((char*)bestFit + sz);&lt;br /&gt;
    if (bestFit-&amp;gt;prev) {&lt;br /&gt;
        bestFit-&amp;gt;prev-&amp;gt;next = newFrag;&lt;br /&gt;
    } else {&lt;br /&gt;
        freeSegHead = bestFit-&amp;gt;next;&lt;br /&gt;
    }&lt;br /&gt;
    if (bestFit-&amp;gt;next) {&lt;br /&gt;
        bestFit-&amp;gt;next-&amp;gt;prev = newFrag;&lt;br /&gt;
    }&lt;br /&gt;
    newFrag-&amp;gt;prev = bestFit-&amp;gt;prev;&lt;br /&gt;
    newFrag-&amp;gt;next = bestFit-&amp;gt;next;&lt;br /&gt;
    newFrag-&amp;gt;size = bestFit-&amp;gt;size - sz;&lt;br /&gt;
    return bestFit;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Memorija nekog računara organizovana je stranično, sa stranicom veličine 4KB. Adresibilna jedinica  je  bajt,  a  virtuelna  adresa  je  32-bitna. Fizička adresa je veličine 32 bita. Ako je PMT organizovana u dva nivoa, s tim da su veličine polja za broj ulaza u tabele oba nivoa isti, kolika je veličina (u bajtovima) PMT prvog nivoa? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
VA: 10 | 10 | 12&lt;br /&gt;
&lt;br /&gt;
Ulaz PMT 1. nivoa sadrzi fizičku adresu početka PMT 2. nivoa. Kako je fizička adresa 32b = 4B odavde sledi da veličina PMT 1. nivoa je:&lt;br /&gt;
&lt;br /&gt;
4B * 2^(10) = 4KB&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti tehniku dvostrukog baferisanja (&#039;&#039;double buffering&#039;&#039;) kod ulaza/izlaza. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Proizvođač upisuje u jedan bafer dok potrošač čita iz drugog bafora. Kada oba završe, baferi zamenjuju uloge.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki proces izvršava redom sledeće sistemske pozive. Pod pretpostavkom da korisnik u čije ime se izvršava ovaj proces ima pravo pristupa do oba fajla i na čitanje i na upis, i da oba poziva za otvaranje fajlova uspevaju, navesti koji od preostalih poziva će biti uspešan, a koji neuspešan (upisati na liniji pored poziva).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
FHANDLE f1 = fopen(“x.doc”,read);&lt;br /&gt;
FHANDLE f2 = fopen(“y.doc”,read|write);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fread(f1,buffer1,n1);&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fwrite(f1,buffer2,n2);&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fread(f2,buffer1,n1);&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;fwrite(f2,buffer2,n2);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2011#9. zadatak|junskog roka 2011]].&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki fajl sistem koristi bit vektor za evidenciju slobodnih blokova na disku. Kolika je veličina ovog vektora u bajtovima, za disk veličine 256 GB sa blokom veličine 512B&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Na disku ima ukupno &amp;lt;math&amp;gt;\frac{256GB}{512B} = 2^{29}&amp;lt;/math&amp;gt; blokova. Pošto je za svaki blok potreban po jedan bit, količinu prostora određujemo kao &amp;lt;math&amp;gt;\frac{2^{29}}{2^3} = 64 MB&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>K0v4c</name></author>
	</entry>
</feed>