<?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=Ivan+Pe%C5%A1i%C4%87</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=Ivan+Pe%C5%A1i%C4%87"/>
	<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/Ivan_Pe%C5%A1i%C4%87"/>
	<updated>2026-06-04T01:10:55Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Ivan_Pe%C5%A1i%C4%87&amp;diff=6297</id>
		<title>Корисник:Ivan Pešić</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Ivan_Pe%C5%A1i%C4%87&amp;diff=6297"/>
		<updated>2023-06-17T17:49:02Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: (веома битна) измена након дуго времена&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Иван Пешић&lt;br /&gt;
&lt;br /&gt;
Контакт:&lt;br /&gt;
* [https://discordapp.com Discord:] &amp;lt;code&amp;gt;ivan_pesic&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</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&amp;diff=4792</id>
		<title>Програмски преводиоци 1</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&amp;diff=4792"/>
		<updated>2022-09-26T20:32:27Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: Исправка године&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С114ПП1, 13Е114ПП1&lt;br /&gt;
| семестар  = 7&lt;br /&gt;
| статус    = обавезни&lt;br /&gt;
| страница  = [http://ir4pp1.etf.bg.ac.rs/ ir4pp1.etf.rs]&lt;br /&gt;
| одсек     = СИ, РТИ&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Програмски преводиоци 1&#039;&#039;&#039; је обавезни предмет у седмом семестру на СИ и РТИ.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* [https://drive.google.com/open?id=107YMW0yq1ShVDAIyVtzLGwJ_H8Sm13D1 ETF SI] (модификације)&lt;br /&gt;
* [https://app.box.com/s/0r50je333z1qyypz0h3rm0iqb9s0d64f/folder/38797850748 ETF Materijali (Box)] (решења старијих рокова)&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&amp;lt;!-- Овде се наводе све битне информације у вези са предавањима и вежбама на предмету, као и потребни материјали. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: које се области прелазе у којем блоку, која се развојна окружења користе, шта обично долази за који колоквијум, где могу да се нађу белешке и презентације, да ли се настава на предмету уопште држи (ако се не држи то треба назначити како би било јасно да викију не недостају информације по том питању), да ли су предавања или вежбе бескорисне --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: окружења за израду, шта се ради на домаћем, водичи за домаћи (уколико су довољно слични из године у годину), када се предају, како изгледа одбрана, корисни материјали --&amp;gt;&lt;br /&gt;
Пројекат на предмету носи 40 бодова и обавезан је. Услов за излазак на испит је барем 20 бодова освојених на одбрани пројекта.&lt;br /&gt;
&lt;br /&gt;
Поставка пројекта се не мења много кроз године. У јануарском и фебруарском року важи једна поставка, у јулском се на ту поставку дода још захтева и у августовском и септембарском још више захтева. Стари домаћи доступни су са странице предмета (године 2021/2022 су доступни на http://ir4pp1.etf.rs/Domaci/2021-2022, претходне године на http://ir4pp1.etf.rs/Domaci/2020-2021 и тако даље, али не постоји лако доступна листа домаћих на једном месту).&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Испитни рокови се понекад објављују [http://ir4pp1.etf.bg.ac.rs/Rokovi.html на страници предмета,] и понекад имају решења у виду сликаних вежбанки студената који су освојили максималан број бодова.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
Постоји једна збирка задатака из предмета, доступна са странице предмета:&lt;br /&gt;
* &#039;&#039;&#039;[http://ir4pp1.etf.rs/zbirka/ppzbirka.pdf &amp;quot;Збирка задатака из Програмских преводилаца 1&amp;quot;]&#039;&#039;&#039;, Д.Велашевић, Д.Бојић, 2000 издавач: &#039;&#039;Електротехнички факултет Универзитета у Београду&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
=== СИ ===&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt; — бодови са првог и другог колоквијума који се одржавају у првој и другој колоквијумској недељи и надокнађују се преко бодова са испита (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; — бодови са пројекта (0-40)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — бодови са испита (0-60)&lt;br /&gt;
* Бодови: &amp;lt;math&amp;gt;P = D + max\left(\frac{1}{3} I + K_1 + K_2, \frac{2}{3} I + K_1, \frac{2}{3} I + K_2, I\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Услов: &amp;lt;math&amp;gt;D \geq 20&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;!-- Уколико је оцењивање другачије на РТИ, овде направити нови одељак за РТИ испод одељка за СИ. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: да ли дозвољавају да се уместо поништавања оцене на увиду упише оцена 5, који бодови се преносе из једног у други испитни рок --&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 51&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 61&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 71&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 81&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 91&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;91 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== РТИ ===&lt;br /&gt;
Како на РТИ има само један колоквијум од 30 бодова, коначни бодови се рачунају по формули: &amp;lt;math&amp;gt;P = D + max\left(\frac{1}{2} I + K, I\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{задаци|postavke}}&lt;br /&gt;
* {{задаци|rešenja}}&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=4788</id>
		<title>Тестирање софтвера</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=4788"/>
		<updated>2022-09-26T20:15:18Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С113ТС&lt;br /&gt;
| семестар  = 5&lt;br /&gt;
| статус    = изборни&lt;br /&gt;
| страница  = [http://si3ts.etf.bg.ac.rs/ si3ts.etf.rs]&lt;br /&gt;
| одсек     = СИ&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Тестирање софтвера&#039;&#039;&#039; је изборни предмет из петог семестра на СИ.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
Подела градива на предавањима и вежбама изгледа овако:&lt;br /&gt;
* &#039;&#039;&#039;Први блок:&#039;&#039;&#039; Технике црне кутије (Black box)&lt;br /&gt;
* &#039;&#039;&#039;Други блок:&#039;&#039;&#039; Технике беле кутије (White box)&lt;br /&gt;
* &#039;&#039;&#039;Трећи блок:&#039;&#039;&#039; Интеграционо тестирање, тестирање објектно оријентисаног софтвера, тестирање графичког корисничког интерфејса&lt;br /&gt;
Вежбе скоро у потпуности прате градиво са предавања, с тим што се на предавањима прелазе поједине области које се не прелазе на вежбама а долазе на испитима и колоквијумима. Страница предмета је корисна и на њој се налазе материјали са предавања, вежби и нерешени рокови.&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: које се области прелазе у којем блоку, која се развојна окружења користе, шта обично долази за који колоквијум, где могу да се нађу белешке и презентације, да ли се настава на предмету уопште држи (ако се не држи то треба назначити како би било јасно да викију не недостају информације по том питању), да ли су предавања или вежбе бескорисне --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Домаћи ==&lt;br /&gt;
Постоје два домаћа задатка која носе по 20 поена. Први домаћи задатак је из тестирања црном кутијом, а други из тестирања белом кутијом. Могуће је надокнадити један домаћи задатак уколико раније није урађен. У школској 2021/22. години оба домаћа задатка у јануарском испитном року бранила су се истовремено, преко &#039;&#039;MS Teams&#039;&#039;-a пар дана након испита и одбрана је трајала двадесетак минута.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
Лабораторијске вежбе су показног карактера и служе за упознавање са алатима који су потребни за израду домаћих задатака.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
На [http://si3ts.etf.bg.ac.rs/rokovi.html страници предмета] су доступни неки рокови од претходних година, али без решења.&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1&amp;lt;/math&amp;gt; — Први колоквијум (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt; — Други колоквијум (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;DZ_1&amp;lt;/math&amp;gt; — Бодови са првог домаћег задатка (тестирање црном кутијом) (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;DZ_2&amp;lt;/math&amp;gt; — Бодови са другог домаћег задатка (тестирање белом кутијом) (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са испита (0-60)&lt;br /&gt;
* Надокнаде колоквијума не постоје јер се у сваком испитном року ради интегрални испит.&lt;br /&gt;
* &#039;&#039;&#039;Укупни бодови:&#039;&#039;&#039; &amp;lt;math&amp;gt;P = DZ_1 + DZ_2 + \max \left(K_1 + K_2 + \frac{I}{3}, K_1 +  \frac{2I}{3}, K_2 +  \frac{2I}{3}, I\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{задаци|rešenja}}&lt;br /&gt;
* {{задаци|prepis}}&lt;br /&gt;
** Јануар 2022: [https://cdn.discordapp.com/attachments/725100175990980658/940239047954137108/IMG_2280.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239048327462963/IMG_2281.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239072293699604/IMG_2282.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239072679563294/IMG_2283.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239160579596299/IMG_2284.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239160114020433/IMG_2285.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239175679107072/IMG_2286.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239175096107059/IMG_2287.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239206263975976/IMG_2288.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239242511130654/IMG_2289.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239243014443018/IMG_2290.HEIC]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=4787</id>
		<title>Тестирање софтвера</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=4787"/>
		<updated>2022-09-26T20:14:53Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: Додат опис наставе и лабораторијских вежби&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С113ТС&lt;br /&gt;
| семестар  = 5&lt;br /&gt;
| статус    = изборни&lt;br /&gt;
| страница  = [http://si3ts.etf.bg.ac.rs/ si3ts.etf.rs]&lt;br /&gt;
| одсек     = СИ&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Тестирање софтвера&#039;&#039;&#039; је изборни предмет из петог семестра на СИ.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
Подела градива на предавањима и вежбама изгледа овако:&lt;br /&gt;
* &#039;&#039;&#039;Први блок:&#039;&#039;&#039; Технике црне кутије (Black box)&lt;br /&gt;
* &#039;&#039;&#039;Други блок:&#039;&#039;&#039; Технике беле кутије (White box)&lt;br /&gt;
* &#039;&#039;&#039;Трећи блок:&#039;&#039;&#039; Интеграционо тестирање, тестирање објектно оријентисаног софтвера, тестирање графичког корисничког интерфејса&lt;br /&gt;
Вежбе скоро у потпуности прате градиво са предавања, с тим што се на предавањима прелазе поједине области које се не прелазе на вежбама а долазе на испитима и колоквијумима. Страница предмета је корисна и на њој се налазе материјали са предавања, вежби и нерешени рокови.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: које се области прелазе у којем блоку, која се развојна окружења користе, шта обично долази за који колоквијум, где могу да се нађу белешке и презентације, да ли се настава на предмету уопште држи (ако се не држи то треба назначити како би било јасно да викију не недостају информације по том питању), да ли су предавања или вежбе бескорисне --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Домаћи ==&lt;br /&gt;
Постоје два домаћа задатка која носе по 20 поена. Први домаћи задатак је из тестирања црном кутијом, а други из тестирања белом кутијом. Могуће је надокнадити један домаћи задатак уколико раније није урађен. У школској 2021/22. години оба домаћа задатка у јануарском испитном року бранила су се истовремено, преко &#039;&#039;MS Teams&#039;&#039;-a пар дана након испита и одбрана је трајала двадесетак минута.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
Лабораторијске вежбе су показног карактера и служе за упознавање са алатима који су потребни за израду домаћих задатака.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
На [http://si3ts.etf.bg.ac.rs/rokovi.html страници предмета] су доступни неки рокови од претходних година, али без решења.&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1&amp;lt;/math&amp;gt; — Први колоквијум (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt; — Други колоквијум (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;DZ_1&amp;lt;/math&amp;gt; — Бодови са првог домаћег задатка (тестирање црном кутијом) (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;DZ_2&amp;lt;/math&amp;gt; — Бодови са другог домаћег задатка (тестирање белом кутијом) (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са испита (0-60)&lt;br /&gt;
* Надокнаде колоквијума не постоје јер се у сваком испитном року ради интегрални испит.&lt;br /&gt;
* &#039;&#039;&#039;Укупни бодови:&#039;&#039;&#039; &amp;lt;math&amp;gt;P = DZ_1 + DZ_2 + \max \left(K_1 + K_2 + \frac{I}{3}, K_1 +  \frac{2I}{3}, K_2 +  \frac{2I}{3}, I\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{задаци|rešenja}}&lt;br /&gt;
* {{задаци|prepis}}&lt;br /&gt;
** Јануар 2022: [https://cdn.discordapp.com/attachments/725100175990980658/940239047954137108/IMG_2280.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239048327462963/IMG_2281.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239072293699604/IMG_2282.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239072679563294/IMG_2283.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239160579596299/IMG_2284.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239160114020433/IMG_2285.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239175679107072/IMG_2286.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239175096107059/IMG_2287.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239206263975976/IMG_2288.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239242511130654/IMG_2289.HEIC] [https://cdn.discordapp.com/attachments/725100175990980658/940239243014443018/IMG_2290.HEIC]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=4407</id>
		<title>КДП/Јануар 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=4407"/>
		<updated>2022-06-14T12:18:33Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: Фалило је ticket?pass; у USER процесу&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2021/IR3KDP_2021_jan.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Потребно је реализовати тајмер користећи приватне семафоре и технику предаје штафетне палице. Тајмер има две методе, прва је метода &amp;lt;code&amp;gt;wakeme&amp;lt;/code&amp;gt; која омогућава да се дата нит блокирана &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; јединица времена (ово је аргумент), а друга је метода &amp;lt;code&amp;gt;tick&amp;lt;/code&amp;gt; која означава да је истекла једна јединица времена.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји тоалет капацитета N (N &amp;gt; 1) који могу да користе жене, мушкарци, деца и домар (&#039;&#039;Single Bathroom Problem&#039;&#039;) такав да важе следећа правила коришћења: у исто време у тоалету не могу наћи и жене и мушкарци; деца могу да деле тоалет и са женама и са мушкарцима; дете може да се нађе у тоалету само ако се тамо налази барем једна жена или мушкарац; домар има ексклузивно право коришћења тоалета. Написати монитор са &#039;&#039;signal and wait&#039;&#039; дисциплином који решава дати проблем, као и главне програме за мушкарце, жене, децу и домаре, кроз које су дати примери коришћења мониторских процедура.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class SingleBathroomProblem {&lt;br /&gt;
    public static final int capacity = 10;&lt;br /&gt;
    private int count = 0;&lt;br /&gt;
    private int childCount = 0;&lt;br /&gt;
    // Група која је тренутно у тоалету&lt;br /&gt;
    // -1 - нема никога, 0 - мушкарци, 1 - жене, 2 - домар&lt;br /&gt;
    private int group = -1;&lt;br /&gt;
    private final Condition queue = new Condition();&lt;br /&gt;
    private final Condition childrenQueue = new Condition();&lt;br /&gt;
    private final Condition waitingForChildren = new Condition();&lt;br /&gt;
    private int ticket = 1;&lt;br /&gt;
    private void signalPersonOrChild() {&lt;br /&gt;
        boolean personWaiting = queue.queue() &amp;amp;&amp;amp; queue.minrank() % 3 == group;&lt;br /&gt;
        boolean childWaiting = childrenQueue.queue();&lt;br /&gt;
        if (personWaiting &amp;amp;&amp;amp; childWaiting) {&lt;br /&gt;
            if (queue.minrank() &amp;gt; childrenQueue.minrank() * 3) {&lt;br /&gt;
                // Одрасла особа је стигла пре детета&lt;br /&gt;
                queue.signal();&lt;br /&gt;
            } else {&lt;br /&gt;
                // Дете је стигло пре одрасле особе&lt;br /&gt;
                childrenQueue.signal();&lt;br /&gt;
            }&lt;br /&gt;
        } else if (personWaiting) {&lt;br /&gt;
            queue.signal();&lt;br /&gt;
        } else if (childWaiting) {&lt;br /&gt;
            childrenQueue.signal();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void enterMan() {&lt;br /&gt;
        int myTicket = ticket++;&lt;br /&gt;
        if (count == capacity || group == 1 || group == 2 || queue.queue()) {&lt;br /&gt;
            // Пун тоалет, у њему су жене/домар или има других особа испред тоалета&lt;br /&gt;
            queue.wait(myTicket * 3);&lt;br /&gt;
        }&lt;br /&gt;
        ++count;&lt;br /&gt;
        if (group == -1) {&lt;br /&gt;
            // Означавамо да је тренутно активна група мушкараца&lt;br /&gt;
            group = 0;&lt;br /&gt;
        } else if (waitingForChildren.queue()) {&lt;br /&gt;
            // Ако има мушкарца који чека децу јавља му се да не мора више да чека&lt;br /&gt;
            waitingForChildren.signal();&lt;br /&gt;
        }&lt;br /&gt;
        if (count != capacity) {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void enterWoman() {&lt;br /&gt;
        int myTicket = ticket++;&lt;br /&gt;
        if (count == capacity || group == 0 || group == 2 || queue.queue()) {&lt;br /&gt;
            // Пун тоалет или су у њему мушкарци/домар&lt;br /&gt;
            queue.wait(myTicket * 3 + 1);&lt;br /&gt;
        }&lt;br /&gt;
        ++count;&lt;br /&gt;
        if (group == -1) {&lt;br /&gt;
            // Означавамо да је тренутно активна група жена&lt;br /&gt;
            group = 1;&lt;br /&gt;
        } else if (waitingForChildren.queue()) {&lt;br /&gt;
            // Ако има жена која чека децу јавља јој се да не мора више да чека&lt;br /&gt;
            waitingForChildren.signal();&lt;br /&gt;
        }&lt;br /&gt;
        if (count != capacity) {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void enterJanitor() {&lt;br /&gt;
        int myTicket = ticket++;&lt;br /&gt;
        if (group != -1) {&lt;br /&gt;
            // У тоалету или испред тоалета има било кога&lt;br /&gt;
            queue.wait(myTicket * 3 + 2);&lt;br /&gt;
        }&lt;br /&gt;
        ++count;&lt;br /&gt;
        // Означавамо да је домар тренутно у тоалету&lt;br /&gt;
        group = 2;&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void enterChild() {&lt;br /&gt;
        int myTicket = ticket++;&lt;br /&gt;
        if (count == capacity || group == 2 || group == -1 || queue.queue() || childrenQueue.queue() || waitingForChildren.queue()) {&lt;br /&gt;
            // Пун тоалет, у њему нема никога, у њему је домар, има других особа&lt;br /&gt;
            // испред тоалета или има особа која је унутра и чека да деца изађу&lt;br /&gt;
            childrenQueue.wait(myTicket);&lt;br /&gt;
        }&lt;br /&gt;
        ++count;&lt;br /&gt;
        ++childCount;&lt;br /&gt;
        if (count != capacity) {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void exitMan() {&lt;br /&gt;
        if (count == childCount + 1) {&lt;br /&gt;
            // Мушкарац не може да изађе док су деца сама у тоалету&lt;br /&gt;
            waitingForChildren.wait();&lt;br /&gt;
        }&lt;br /&gt;
        --count;&lt;br /&gt;
        if (count == 0) {&lt;br /&gt;
            // Нема више никог у тоалету, пусти следећу одраслу особу ако је има&lt;br /&gt;
            group = -1;&lt;br /&gt;
            if (queue.queue()) {&lt;br /&gt;
                queue.signal();&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void exitWoman() {&lt;br /&gt;
        if (count == childCount + 1) {&lt;br /&gt;
            // Жена не може да изађе док су деца сама у тоалету&lt;br /&gt;
            waitingForChildren.wait();&lt;br /&gt;
        }&lt;br /&gt;
        --count;&lt;br /&gt;
        if (count == 0) {&lt;br /&gt;
            // Нема више никог у тоалету, пусти следећу одраслу особу ако је има&lt;br /&gt;
            group = -1;&lt;br /&gt;
            if (queue.queue()) {&lt;br /&gt;
                queue.signal();&lt;br /&gt;
            }&lt;br /&gt;
        } else  {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void exitJanitor() {&lt;br /&gt;
        --count;&lt;br /&gt;
        // Сигурно нема више никог у тоалету&lt;br /&gt;
        group = -1;&lt;br /&gt;
        if (queue.queue()) {&lt;br /&gt;
            queue.signal();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void exitChild() {&lt;br /&gt;
        --count;&lt;br /&gt;
        --childCount;&lt;br /&gt;
        if (waitingForChildren.queue() &amp;amp;&amp;amp; childCount == 0) {&lt;br /&gt;
            // Јави особи која чека на излазак детета да су сва деца изашла&lt;br /&gt;
            waitingForChildren.signal();&lt;br /&gt;
        }&lt;br /&gt;
        if (count == 0) {&lt;br /&gt;
            // Нема више никог у тоалету, пусти следећу одраслу особу ако је има&lt;br /&gt;
            group = -1;&lt;br /&gt;
            if (queue.queue()) {&lt;br /&gt;
                queue.signal();&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Реализујте &#039;&#039;coarse grain ticket&#039;&#039; алгоритам за улазак у критичну секцију користећи CSP.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Није јасно на шта се мисли под &#039;&#039;coarse grain&#039;&#039; реализацијом у овом случају, али је испод једна могућа имплементација &#039;&#039;ticket&#039;&#039; алгоритма за улазак у критичну секцију користећи CSP.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[ticket::TICKET || user(i: 1..N)::USER]&lt;br /&gt;
&lt;br /&gt;
TICKET::&lt;br /&gt;
    users: (1..N) integer;&lt;br /&gt;
    head: integer;&lt;br /&gt;
    tail: integer;&lt;br /&gt;
    head := 0;&lt;br /&gt;
    tail := 0;&lt;br /&gt;
    *[&lt;br /&gt;
        head == tail; (i: 1..N) user(i)?enter -&amp;gt;&lt;br /&gt;
            // Нема никога, па пуштамо овог корисника&lt;br /&gt;
            user(i)!pass;&lt;br /&gt;
            tail := (tail + 1) mod N&lt;br /&gt;
        □&lt;br /&gt;
        head &amp;lt;&amp;gt; tail; (i: 1..N) user(i)?enter -&amp;gt;&lt;br /&gt;
            // Додајемо корисника у ред чекања&lt;br /&gt;
            users(tail) := i;&lt;br /&gt;
            tail := (tail + 1) mod N&lt;br /&gt;
        □&lt;br /&gt;
        (i: 1..N) user(i)?exit -&amp;gt;&lt;br /&gt;
            head := (head + 1) mod N;&lt;br /&gt;
            [&lt;br /&gt;
                // Пуштамо следећег корисника, уколико га има&lt;br /&gt;
                users(head) &amp;lt;&amp;gt; 0 -&amp;gt;&lt;br /&gt;
                    user(users(head))!pass;&lt;br /&gt;
                    users(head) := 0&lt;br /&gt;
            ]&lt;br /&gt;
        □&lt;br /&gt;
    ]&lt;br /&gt;
&lt;br /&gt;
USER::&lt;br /&gt;
    ticket!enter;&lt;br /&gt;
    ticket?pass;&lt;br /&gt;
    // У критичној секцији&lt;br /&gt;
    ticket!exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
На уласку у једну железничку станицу са једном улазном пругом и једним слепим колосеком десио се квар, па се на улазу направила колона међународних и домаћих возова. Квар је отклоњен и треба пуштати возове. Да би међународни возови мање каснили, они се пуштају први, по редоследу доласка. Пошто постоји само једна пруга и возови се не могу „претицати”, сви домаћи возови који су били испред међународних у колони се пребацују на слепи колосек који је довољно велики да сви возови могу да стану. Када сви међународни возови оду, пуштају се прво возови са слепог колосека, па онда преостали домаћи возови из колоне. Сама станица има N перона, тј. N возова истовремено могу да укрцавају и искрцавају путнике. Возови који у међувремену пристижу треба да буду опслужени, али новопристигли међународни немају приоритет у односу на возове који су испред њих у колони. Решити проблем користећи C-Linda. Написати потребну иницијализацију која осликава стање након отклањања квара. Водити рачуна о томе да су композиције возова тешке и да је потребно време да се воз помери са једног места на друго.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Следећи тагови су коришћени током реализације:&lt;br /&gt;
* &amp;lt;code&amp;gt;ticket&amp;lt;/code&amp;gt;: редослед воза по пристизању&lt;br /&gt;
* &amp;lt;code&amp;gt;current&amp;lt;/code&amp;gt;: воз који тренутно окупира улаз (било да излази из улаза и иде у слепи колосек, излази из улаза и иде на станицу или излази из слепог колосека и иде на станицу)&lt;br /&gt;
* &amp;lt;code&amp;gt;sidetrack&amp;lt;/code&amp;gt;: возови који се налазе у слепом колосеку, прва вредност је редослед у слепом колосеку а друга редослед пристизања воза&lt;br /&gt;
* &amp;lt;code&amp;gt;sidetrackHead&amp;lt;/code&amp;gt;: први воз који следећи треба да изађе из слепог колосека, по редоследу у слепом колосеку&lt;br /&gt;
* &amp;lt;code&amp;gt;sidetrackTail&amp;lt;/code&amp;gt;: број возова у слепом колосеку&lt;br /&gt;
* &amp;lt;code&amp;gt;station&amp;lt;/code&amp;gt;: возови који су тренутно на једном од регуларних N колосека&lt;br /&gt;
Начин на који је у овом решењу било одређено да ли је воз пристигао током квара или после је провера да ли је његов редослед пристизања већи или једнак константи &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, што је број возова који су пристигли током квара. Након почетне иницијализације стања након поправљања квара очекује се да новопристигли возови сами направе &amp;lt;code&amp;gt;train&amp;lt;/code&amp;gt; процес.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = 10;&lt;br /&gt;
const int M = 100;&lt;br /&gt;
&lt;br /&gt;
void setCurrentFromSidetrack() {&lt;br /&gt;
    int sidetrackTicket;&lt;br /&gt;
    int sidetrackHead;&lt;br /&gt;
    in(&amp;quot;sidetrackHead&amp;quot;, &amp;amp;sidetrackHead);&lt;br /&gt;
    in(&amp;quot;sidetrack&amp;quot;, sidetrackHead, &amp;amp;sidetrackTicket);&lt;br /&gt;
    out(&amp;quot;sidetrackHead&amp;quot;, sidetrackHead + 1);&lt;br /&gt;
    out(&amp;quot;current&amp;quot;, sidetrackTicket);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void train(bool isInternational) {&lt;br /&gt;
    int ticket;&lt;br /&gt;
    in(&amp;quot;ticket&amp;quot;, &amp;amp;ticket);&lt;br /&gt;
    out(&amp;quot;ticket&amp;quot;, ticket + 1);&lt;br /&gt;
    in(&amp;quot;current&amp;quot;, ticket);&lt;br /&gt;
    bool arrivedLater = ticket &amp;gt;= M;&lt;br /&gt;
    bool isSidetrack = !isInternational &amp;amp;&amp;amp; !arrivedLater;&lt;br /&gt;
    if (isSidetrack) {&lt;br /&gt;
        // Прво идемо у слепи колосек&lt;br /&gt;
        int sidetrackTail;&lt;br /&gt;
        in(&amp;quot;sidetrackTail&amp;quot;, &amp;amp;sidetrackTail);&lt;br /&gt;
        out(&amp;quot;sidetrack&amp;quot;, sidetrackTail, ticket);&lt;br /&gt;
        out(&amp;quot;sidetrackTail&amp;quot;, sidetrackTail + 1);&lt;br /&gt;
        if (ticket == M - 1) {&lt;br /&gt;
            // Ми смо последњи воз који је стигао током квара,&lt;br /&gt;
            // треба да предамо првом из слепог колосека&lt;br /&gt;
            setCurrentFromSidetrack();&lt;br /&gt;
            in(&amp;quot;current&amp;quot;, ticket);&lt;br /&gt;
        } else {&lt;br /&gt;
            // Предајемо следећем возу који је стигао током квара&lt;br /&gt;
            out(&amp;quot;current&amp;quot;, ticket + 1);&lt;br /&gt;
            in(&amp;quot;current&amp;quot;, ticket);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    int station;&lt;br /&gt;
    in(&amp;quot;station&amp;quot;, &amp;amp;station);&lt;br /&gt;
    // Идемо на станицу, па чим ослободимо улаз пуштамо следећег&lt;br /&gt;
    if (isSidetrack) {&lt;br /&gt;
        if (rdp(&amp;quot;sidetrack&amp;quot;)) {&lt;br /&gt;
            // Пуштамо следећег из слепог колосека&lt;br /&gt;
            setCurrentFromSidetrack();&lt;br /&gt;
        } else {&lt;br /&gt;
            // Нема више никог из слепог колосека, пуштамо обичну колону&lt;br /&gt;
            out(&amp;quot;current&amp;quot;, M);&lt;br /&gt;
        }&lt;br /&gt;
    } else {&lt;br /&gt;
        if (ticket == M - 1) {&lt;br /&gt;
            // Ми смо последњи воз који је стигао током квара,&lt;br /&gt;
            // треба да предамо возовима из слепог колосека, уколико постоје&lt;br /&gt;
            if (rdp(&amp;quot;sidetrack&amp;quot;)) {&lt;br /&gt;
                setCurrentFromSidetrack();&lt;br /&gt;
            } else {&lt;br /&gt;
                // Нико није ушао у слепи колосек&lt;br /&gt;
                out(&amp;quot;current&amp;quot;, ticket + 1);&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            // Пуштамо следећи воз, пошто још увек колона која је стигла&lt;br /&gt;
            // током квара није изашла из улаза&lt;br /&gt;
            out(&amp;quot;current&amp;quot;, ticket + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Одлазимо са станице&lt;br /&gt;
    out(&amp;quot;station&amp;quot;, station);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initialize() {&lt;br /&gt;
    out(&amp;quot;ticket&amp;quot;, 0);&lt;br /&gt;
    for (int i = 0; i &amp;lt; M; ++i) {&lt;br /&gt;
        eval(train, rand() % 2 == 1);&lt;br /&gt;
        // Чекамо да воз покупи свој ticket&lt;br /&gt;
        rd(&amp;quot;ticket&amp;quot;, i + 1);&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
        out(&amp;quot;station&amp;quot;, i);&lt;br /&gt;
    }&lt;br /&gt;
    out(&amp;quot;current&amp;quot;, 0);&lt;br /&gt;
    out(&amp;quot;sidetrackHead&amp;quot;, 0);&lt;br /&gt;
    out(&amp;quot;sidetrackTail&amp;quot;, 0);&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>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2022&amp;diff=4034</id>
		<title>Пројектовање софтвера/Фебруар 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2022&amp;diff=4034"/>
		<updated>2022-02-22T18:46:41Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: Ово је заправо писало&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{nerešeno}}&lt;br /&gt;
&#039;&#039;&#039;Februarski ispit 2022. godine&#039;&#039;&#039; održan je 22. februara. Tekst zadataka ispod je po sećanju studenata.&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
Povezati definicije principa OO modela sa njihovim nazivima:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;tipizacija,konkurentnost,perzistencija,modularnost,hijerarhija&amp;quot;&amp;gt;&lt;br /&gt;
# Osobina koja razlikuje aktivne objekte od pasivnih: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;konkurentnost&amp;lt;/span&amp;gt;&lt;br /&gt;
# Osobina sistema da se razlaže na skup kohezivnih i slabo spregnutih modula: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;modularnost&amp;lt;/span&amp;gt;&lt;br /&gt;
# Osobina da se objekti različitih klasa ne mogu uopšte ili mogu zamenjivati na ograničene načine: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;tipizacija&amp;lt;/span&amp;gt;&lt;br /&gt;
# Osobina po kojoj se postojanje objekta može protezati kroz vreme ili prostor: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;perzistencija&amp;lt;/span&amp;gt;&lt;br /&gt;
# Rangiranje ili uređivanje apstrakcija: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;hijerarhija&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
Označiti tačne tvrdnje za dati dijagram:&lt;br /&gt;
[[Датотека:PS februar 2022 zadatak 2 dijagram sekvence.svg|мини|Dijagram iz drugog zadatka.]]&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;Prikazani dijagram je dijagram sekvence.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Objekat sa &amp;lt;code&amp;gt;{transient}&amp;lt;/code&amp;gt; ograničenjem se stvara i uništava u toku sekvence.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Metoda &amp;lt;code&amp;gt;promptKomanda()&amp;lt;/code&amp;gt; je sinhrona.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Metoda &amp;lt;code&amp;gt;&amp;lt;&amp;lt;create&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; stvara objekat tipa &amp;lt;code&amp;gt;Transakcija&amp;lt;/code&amp;gt;.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Metoda &amp;lt;code&amp;gt;provera()&amp;lt;/code&amp;gt; nema parametre.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
Koji dijagram se koristi za modeliranje izvršnog okruženja?&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;
# raspoređivanja&lt;br /&gt;
# klasa&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;komponenata&amp;lt;/span&amp;gt;&lt;br /&gt;
# interakcija&lt;br /&gt;
# aktivnosti&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
Kolika je multiplikativnost sa suprotne strane kvalifikatora na datom dijagramu?&lt;br /&gt;
[[Датотека:PS februar 2022 zadatak 4 dijagram klasa.svg|мини|Dijagram klasa iz četvrtog zadatka.]]&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt;&lt;br /&gt;
# 0..1&lt;br /&gt;
# 1&lt;br /&gt;
# 1..*&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
Označiti tačna tvrđenja za dijagram klasa:&lt;br /&gt;
[[Датотека:PS februar 2022 zadatak 5 dijagram klasa.svg|мини|Dijagram klasa iz petog zadatka.]]&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;
# Objekat klase B može da preko asocijacije pristupi objektu klase A.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Metod klase A može preko asocijacije da pristupi objektima klase C.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Metod klase B može preko asocijacije da pristupi objektima klase C.&lt;br /&gt;
# Objekat klase A može da poziva privatne metode objekta klase C.&lt;br /&gt;
# Metod klase C može preko asocijacije da pristupi objektima klase A.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
Sa kojim projektnim uzorcima se slaže projektni uzorak Prototip:&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;Sastav&amp;lt;/span&amp;gt;&lt;br /&gt;
# Unikat&lt;br /&gt;
# Fabrički metod&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Dekorater&amp;lt;/span&amp;gt;&lt;br /&gt;
# Strategija&lt;br /&gt;
# Podsetnik&lt;br /&gt;
# ...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
Koju ulogu u Podsetniku ima Konkretna komanda u slučaju da se komanda koristi za poništavanje operacija (undo)?&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;
# Klijent&lt;br /&gt;
# Subjekat&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Čuvar&amp;lt;/span&amp;gt;&lt;br /&gt;
# Podsetnik&lt;br /&gt;
# Fabrika&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
Označiti tačne tvrdnje za projektni uzorak Fabrički metod.&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;Uzorak eliminiše potrebu da se klijentski kod vezuje za aplikativno-specifične klase.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Apstraktna fabrika se često implementira pomoću Fabričkog metoda.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Učesnik Fabrika mora da zna za postojanje Konkretnih proizvoda.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Drugo ime za Fabrički metod je virtuelni konstruktor.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Fabrički metod je objektni uzorak kreiranja.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
Označiti tačne tvrdnje u vezi sa projektnim uzorkom Graditelj.&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;
# Graditelj stvara cele objekte odjednom.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Graditelj stvara objekte iz delova.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Upravljač stvara objekte Konkretnog graditelja.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;gt;Uzorak Graditelj često ima sličnu objektnu i klasnu strukturu kao Strategija.&amp;lt;/span&amp;gt;&lt;br /&gt;
# ...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
Označiti tačne tvrdnje u vezi sa projektnim uzorkom Zastupnik.&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;
# Virtuelni zastupnik je ambasador.&lt;br /&gt;
# Svaki zastupnik mora da što duže odlaže kreiranje objekta kojeg zastupa.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Zastupnik može biti implementiran kao Dekorater.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Zastupnik je klasni uzorak strukture.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Zastupnik se koristi za implementaciju copy-on-write funkcionalnosti.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2022&amp;diff=4033</id>
		<title>Пројектовање софтвера/Фебруар 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2022&amp;diff=4033"/>
		<updated>2022-02-22T18:37:26Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: Ово што је у 10. задатку (сличност објектне и класне) је било заправо за Градитељ а не за Заступник. Писало је нешто друго за Декоратер, али исправићу кад сазнам шта тачно.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{nerešeno}}&lt;br /&gt;
&#039;&#039;&#039;Februarski ispit 2022. godine&#039;&#039;&#039; održan je 22. februara. Tekst zadataka ispod je po sećanju studenata.&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
Povezati definicije principa OO modela sa njihovim nazivima:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;tipizacija,konkurentnost,perzistencija,modularnost,hijerarhija&amp;quot;&amp;gt;&lt;br /&gt;
# Osobina koja razlikuje aktivne objekte od pasivnih: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;konkurentnost&amp;lt;/span&amp;gt;&lt;br /&gt;
# Osobina sistema da se razlaže na skup kohezivnih i slabo spregnutih modula: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;modularnost&amp;lt;/span&amp;gt;&lt;br /&gt;
# Osobina da se objekti različitih klasa ne mogu uopšte ili mogu zamenjivati na ograničene načine: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;tipizacija&amp;lt;/span&amp;gt;&lt;br /&gt;
# Osobina po kojoj se postojanje objekta može protezati kroz vreme ili prostor: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;perzistencija&amp;lt;/span&amp;gt;&lt;br /&gt;
# Rangiranje ili uređivanje apstrakcija: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;hijerarhija&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
Označiti tačne tvrdnje za dati dijagram:&lt;br /&gt;
[[Датотека:PS februar 2022 zadatak 2 dijagram sekvence.svg|мини|Dijagram iz drugog zadatka.]]&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;Prikazani dijagram je dijagram sekvence.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Objekat sa &amp;lt;code&amp;gt;{transient}&amp;lt;/code&amp;gt; ograničenjem se stvara i uništava u toku sekvence.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Metoda &amp;lt;code&amp;gt;promptKomanda()&amp;lt;/code&amp;gt; je sinhrona.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Metoda &amp;lt;code&amp;gt;&amp;lt;&amp;lt;create&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; stvara objekat tipa &amp;lt;code&amp;gt;Transakcija&amp;lt;/code&amp;gt;.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Metoda &amp;lt;code&amp;gt;provera()&amp;lt;/code&amp;gt; nema parametre.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
Koji dijagram se koristi za modeliranje izvršnog okruženja?&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;
# raspoređivanja&lt;br /&gt;
# klasa&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;komponenata&amp;lt;/span&amp;gt;&lt;br /&gt;
# interakcija&lt;br /&gt;
# aktivnosti&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
Kolika je multiplikativnost sa suprotne strane kvalifikatora na datom dijagramu?&lt;br /&gt;
[[Датотека:PS februar 2022 zadatak 4 dijagram klasa.svg|мини|Dijagram klasa iz četvrtog zadatka.]]&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt;&lt;br /&gt;
# 0..1&lt;br /&gt;
# 1&lt;br /&gt;
# 1..*&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
Označiti tačna tvrđenja za dijagram klasa:&lt;br /&gt;
[[Датотека:PS februar 2022 zadatak 5 dijagram klasa.svg|мини|Dijagram klasa iz petog zadatka.]]&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;
# Objekat klase B može da preko asocijacije pristupi objektu klase A.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Metod klase A može preko asocijacije da pristupi objektima klase C.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Metod klase B može preko asocijacije da pristupi objektima klase C.&lt;br /&gt;
# Objekat klase A može da poziva privatne metode objekta klase C.&lt;br /&gt;
# Metod klase C može preko asocijacije da pristupi objektima klase A.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
Sa kojim projektnim uzorcima se slaže projektni uzorak Prototip:&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;Sastav&amp;lt;/span&amp;gt;&lt;br /&gt;
# Unikat&lt;br /&gt;
# Fabrički metod&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Dekorater&amp;lt;/span&amp;gt;&lt;br /&gt;
# Strategija&lt;br /&gt;
# Podsetnik&lt;br /&gt;
# ...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
Koju ulogu u Podsetniku ima Konkretna komanda u slučaju da se komanda koristi za poništavanje operacija (undo)?&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;
# Klijent&lt;br /&gt;
# Subjekat&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Čuvar&amp;lt;/span&amp;gt;&lt;br /&gt;
# Podsetnik&lt;br /&gt;
# Fabrika&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
Označiti tačne tvrdnje za projektni uzorak Fabrički metod.&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;Uzorak eliminiše potrebu da se klijentski kod vezuje za aplikativno-specifične klase.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Apstraktna fabrika se često implementira pomoću Fabričkog metoda.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Učesnik Fabrika mora da zna za postojanje Konkretnih proizvoda.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Drugo ime za Fabrički metod je virtuelni konstruktor.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Fabrički metod je objektni uzorak kreiranja.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
Označiti tačne tvrdnje u vezi sa projektnim uzorkom Graditelj.&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;
# Graditelj stvara cele objekte odjednom.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Graditelj stvara objekte iz delova.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Upravljač stvara objekte Konkretnog graditelja.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;gt;Uzorak Graditelj često ima sličnu objektnu i klasnu strukturu kao Strategija.&amp;lt;/span&amp;gt;&lt;br /&gt;
# ...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
Označiti tačne tvrdnje u vezi sa projektnim uzorkom Zastupnik.&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;
# Virtuelni zastupnik je ambasador.&lt;br /&gt;
# Svaki zastupnik mora da što duže odlaže kreiranje objekta kojeg zastupa.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Uzorak Zastupnik često ima sličnu objektnu i klasnu strukturu kao Dekorater.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Zastupnik je klasni uzorak strukture.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Zastupnik se koristi za implementaciju copy-on-write funkcionalnosti.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2020&amp;diff=3837</id>
		<title>Пројектовање софтвера/Јануар 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2020&amp;diff=3837"/>
		<updated>2022-02-18T17:36:47Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: /* 9. zadatak */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
Napisati osobinu koja se koristi da se označi klasa koja nema potomke, tj. iz koje se ne može izvoditi. Iskoristiti pravilnu sintaksu za navođenje osobine.&lt;br /&gt;
&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;{leaf}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
Odabrati ispravne dijagrame aktivnosti koji generišu generišu slučajan broj i sve dok generisana vrednost ne bude jednaka 0.&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;
# [[Датотека:PS januar 2020 zadatak 2a.svg|link=|class=transparent-svg|Dijagram iz stavke pod a.]]&lt;br /&gt;
# [[Датотека:PS januar 2020 zadatak 2b.svg|link=|class=transparent-svg solution|Dijagram iz stavke pod b.]]&lt;br /&gt;
# [[Датотека:PS januar 2020 zadatak 2c.svg|link=|class=transparent-svg|Dijagram iz stavke pod c.]]&lt;br /&gt;
# [[Датотека:PS januar 2020 zadatak 2d.svg|link=|class=transparent-svg|Dijagram iz stavke pod d.]]&lt;br /&gt;
# [[Датотека:PS januar 2020 zadatak 2e.svg|link=|class=transparent-svg solution|Dijagram iz stavke pod e.]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Objašnjenje: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Na prvom dijagramu aktivnost kreće od početnog čvora i ne može da uđe u akciju generisanja dok ne pristigne žeton po drugoj ulaznoj grani, što se nikada neće desiti. U trećem dijagramu dva ulazna žetona će se u prvoj iteraciji spojiti u akciji generisanja i izaći kao jedan žeton, a zatim će blokirati aktivnost na sledećem pokušaju da uđu u akciju zbog toga što se na drugoj grani nikada neće pojaviti žeton. Na četvrtom dijagramu aktivnost se blokira već kod konkurentnog spajanja jer po tim granama neće doći žetoni.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
Označiti elemente stanja po UML2:&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;Podstanje&amp;lt;/span&amp;gt;&lt;br /&gt;
# Samo-tranzicije&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Odloženi događaji&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Unutrašnje tranzicije&amp;lt;/span&amp;gt;&lt;br /&gt;
# Tranzicije u druga stanja&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
Modelira se sistem u kom se na Parkingu nalaze Automobili. Potrebno je koristeći kvalifikator selektovati automobile po njihovoj boji. Multiplikativnost koja odgovara opisanom slučaju je:&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Na strani Automobil *&amp;lt;/span&amp;gt;&lt;br /&gt;
# Na strani kvalifikatora 0..1&lt;br /&gt;
# Na strani Automobil 1&lt;br /&gt;
# Na strani kvalifikatora *&lt;br /&gt;
# Na strani Automobil 0..1&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
Označiti tačne tvrdnje za pakete na jeziku UML:&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;Paket može grupisati artefakte.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Spoljašni paket implicitno uvozi imena sadržanog paketa.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Paket je vlasnik sadržanih elemenata.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Nekvalifikovana imena moraju biti jedinstvena u čitavom sistemu.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Paket može sadržati druge pakete.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
Povezati data zaduženja sa ulogama projektnog uzorka Fasada.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Opcije&lt;br /&gt;
! Zaduženja&lt;br /&gt;
! Uloge&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;a,b,c,d,e&amp;quot;&amp;gt;&lt;br /&gt;
* Ne zna za klasu i objekat Fasade. &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;b&amp;lt;/span&amp;gt;&lt;br /&gt;
* Zahteve klijenta prosleđuje klasama podsistema. &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;a&amp;lt;/span&amp;gt;&lt;br /&gt;
* Implementira potrebne funkcionalnosti. &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;b&amp;lt;/span&amp;gt;&lt;br /&gt;
* Zna koja klasa podsistema je odgovorna za koje funkcionalnosti. &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;a&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
| &amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Fasada&lt;br /&gt;
# Klase podsistema&lt;br /&gt;
# Subjekat&lt;br /&gt;
# Konkretan subjekat&lt;br /&gt;
# Klijent&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
Upariti uzorke sa njihovim alternativnim nazivima.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Opcije&lt;br /&gt;
! Uzorci&lt;br /&gt;
! Alternativni nazivi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;a,b,c,d,e,f,g,h&amp;quot;&amp;gt;&lt;br /&gt;
* Kurzor (Cursor) &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;g&amp;lt;/span&amp;gt;&lt;br /&gt;
* Omotač (Wrapper) &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;d&amp;lt;/span&amp;gt;&lt;br /&gt;
* Ručka/telo (Handle/Body) &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;e&amp;lt;/span&amp;gt;&lt;br /&gt;
* Oznaka (Token) &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;b&amp;lt;/span&amp;gt;&lt;br /&gt;
* Virtuelni konstruktor (Virtual constructor) &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;&lt;br /&gt;
* Transakcija (Transaction) &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;c&amp;lt;/span&amp;gt;&lt;br /&gt;
* Surogat (Surogate) &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;a&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
| &amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Zastupnik&lt;br /&gt;
# Podsetnik&lt;br /&gt;
# Komanda&lt;br /&gt;
# Dekorater&lt;br /&gt;
# Most&lt;br /&gt;
# Fabrički metod&lt;br /&gt;
# Iterator&lt;br /&gt;
# Klasni adapter&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
Označiti tačna tvrđena za projektni uzorak Adapter:&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;Adapter može sadržati dodatne javne metode koje Klijent ne koristi s obzirom da Adapter vidi preko interfejsa Cilj.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Adapter se koristi kako bi interfejs jedne klase prilagodio interfejsu koji klijent očekuje.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Dvosmerni adapter se može koristiti i kao Cilj i kao Adaptirani.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Prilikom korišćenja projektnog uzorka Adapter nije potrebno menjati kod interfejsa Cilj, kao i klasa Klijent i Adaptirani.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
U sistemu postoji 10 objekata Korisnik koji međusobno komuniciraju svaki sa svakim. Ukoliko se u sistem uvede projektni uzorak Posrednik preko kog bi objekti komunicirali, koliko će biti manje veza potrebno u sistemu? Smatrati da su veze bidirekcione i da je potreban jedan objekat Posrednika.&lt;br /&gt;
&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;35&amp;lt;/span&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;Ukoliko 10 korisnika komuniciraju svaki sa svakim to je ukupno 45 veza u sistemu, a ako komuniciraju preko posrednika to je 10.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
Označiti tačna tvrđena za projektni uzorak Dekorater:&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;
# Konstrukcija projektnog uzorka ne dozvoljava da objekat klase Dopuna dekoriše druge objekte klase Dopuna.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Korišćenje Dekoratera otežava testiranje.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Preporučljivo je da Komponenta nema atribute.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Prilikom dekorisanja objekata, nije bitan redosled konkretnih dopuna, već samo njihov broj.&lt;br /&gt;
# Dopuna menja interfejs Komponente kako bi proširila funkcionalnosti.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2022&amp;diff=3836</id>
		<title>Пројектовање софтвера/Јануар 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2022&amp;diff=3836"/>
		<updated>2022-02-18T17:01:11Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: /* 5. zadatak */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
šta važi za sledeći dijagram klasa:&lt;br /&gt;
[[Датотека:PS Januar 2022 zadatak 1 dijagram klasa.svg|мини|Dijagram klasa iz prvog zadatka.]]&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;
# Objekat klase B može da pozove metod a1().&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Objekat klase B je odgovoran za životni vek objekta klase A.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Objekat klase A nema prikazan nijedan atribut.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Objekti klase A sadrže objekte klase B.&lt;br /&gt;
# Objekat klase B sadrži proizvoljan broj objekata klase A.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
Koja ključna reč za čvorove objekata na dijagramu aktivnosti se koristi za prikazivanje upravljanja tokovima objekata iz više izvora prema više odredišta?&lt;br /&gt;
&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;&amp;lt;centralBuffer&amp;gt;&amp;gt;&amp;lt;/span&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;Odgovor &amp;lt;code&amp;gt;&amp;amp;lt;&amp;amp;lt;central buffer&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; ili &amp;lt;code&amp;gt;central buffer&amp;lt;/code&amp;gt; je bio priznavan sa 75% bodova nakon žalbi.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
Dijagrami složene strukture mogu da prikažu unutrašnju strukturu:&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;
# Portova&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Komponenti&amp;lt;/span&amp;gt;&lt;br /&gt;
# Interfejsa&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Saradnji&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Klasa&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
Povezati konstrukte jezika UML sa dijagramima na kojima se pojavljuju:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Opcije&lt;br /&gt;
! Jezički konstrukt&lt;br /&gt;
! Vrsta dijagrama&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;a,b,c,d,e,f,g,h,i,j,k&amp;quot;&amp;gt;&lt;br /&gt;
* Tačka proširenja &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;c&amp;lt;/span&amp;gt;&lt;br /&gt;
* Oblast ekspanzije &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;e&amp;lt;/span&amp;gt;&lt;br /&gt;
* Završno pseudostanje &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;h&amp;lt;/span&amp;gt;&lt;br /&gt;
* Čvor &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;&lt;br /&gt;
* Izgubljena poruka &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;g&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
| &amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Dijagram klasa&lt;br /&gt;
# Dijagram paketa&lt;br /&gt;
# Dijagram slučaja korišćenja&lt;br /&gt;
# Dijagram složene strukture&lt;br /&gt;
# Dijagram aktivnosti&lt;br /&gt;
# Dijagram raspoređivanja&lt;br /&gt;
# Dijagram interakcije&lt;br /&gt;
# Dijagram stanja&lt;br /&gt;
# Dijagram komponenata&lt;br /&gt;
# Dijagram objekata&lt;br /&gt;
# Vremenski dijagram&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;Završno stanje na dijagramu stanja zapravo nije pseudostanje, već specijalno stanje, pa je neoznačavanje odgovora na ovom pitanju nakon žalbi donosilo sve bodove.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
Multiplikativnost na strani elementa zbirke, povezane relacijom asocijacije sa kvalifikatorom na strani zbirke, određuje:&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Broj primeraka elemenata koji odgovaraju kvalifikatoru u jednom primerku zbirke.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Broj primeraka zbirke u kojima se može naći jedan ili više primeraka elementa.&lt;br /&gt;
# Broj primeraka zbirke u kojima se može nalaziti jedan primerak elementa.&lt;br /&gt;
# Broj primeraka elementa koji se mogu nalaziti u jednom primerku zbirke.&lt;br /&gt;
# Broj primeraka elemenata koji odgovaraju kvalifikatoru ukupno u svim primercima zbirke.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
Ako se pri razvoju sistema koristi radni okvir koji obezbeđuje arhitekturu Izdavač-Pretplatnik (eng. &#039;&#039;Publisher - Subscriber&#039;&#039;), šta od navedenog važi za korisničke klase koje je&lt;br /&gt;
potrebno dodatno implementirati u razvijanom sistemu da bi bila podržana komunikacija između Izdavača i pretplatnika po projektnom uzorku &#039;&#039;Posmatrač&#039;&#039; sa modelom&lt;br /&gt;
preuzimanja (eng. &#039;&#039;pull model&#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;
# Radni okvir obezbeđuje samo interfejse apstraktnog posmatrača i apstraktnog subjekta, a klase koje se dodaju, implementirajući te interfejse obezbeđuju kompletnu logiku komunikacije.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Klase koje se dodatno implementiraju imaju uloge Konkretnog Subjekta i Konkretnog Posmatrača i izvode se iz klasa radnog okvira.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Odgovornost dodatnih klasa je da obezbede da se obaveštavanje posmatrača o promenama stanja subjekta obavlja asinhrono.&lt;br /&gt;
# Konkretni posmatrač implementira metod koji određuje reakciju na promenu stanja subjekta, kao nadjačan prost korak &#039;&#039;Šablonskog metoda&#039;&#039; propisanog u apstraktnom posmatraču.&lt;br /&gt;
# Vođenje i ažuriranje zbirke prijavljenih posmatrača se implementira u dodatoj klasi konkretnog subjekta.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Objašnjenje: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Stavka pod d je na kolokvijumu bila označena kao tačna, ali zapravo nije.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
Koje od navedenih tvrdnji su tačne za projektni uzorak &#039;&#039;Podsetnik&#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;
# Objekti uloge &#039;&#039;Podsetnik&#039;&#039; su obavezno aktivni.&lt;br /&gt;
# Učesnik &#039;&#039;Podsetnik&#039;&#039; ima dva interfejsa, gde učesnik &#039;&#039;Subjekat&#039;&#039; vidi uski. a učesnik &#039;&#039;Čuvar&#039;&#039; vidi širok.&lt;br /&gt;
# Predstavlja objektni uzorak strukture.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Učesnik &#039;&#039;Subjekat&#039;&#039; ima diskreciono pravo da odluči koji deo stanja se čuva.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;Podsetnik&#039;&#039; može da se koristi zajedno sa &#039;&#039;Iteratorom&#039;&#039; za čuvanje podatka o tekućem elementu.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
Koji projektni uzorak razdvaja apstrakciju od njene implementacije da bi se mogle nezavisno menjati?&lt;br /&gt;
&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Most&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
Koje od navedenih tvrdnji su tačne za projektni uzorak &#039;&#039;Komanda&#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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;Komanda&#039;&#039; je objektni uzorak ponašanja&amp;lt;/span&amp;gt;&lt;br /&gt;
# Multiplikativnost asocijacije od &#039;&#039;Izvršioca&#039;&#039; do &#039;&#039;Komande&#039;&#039; na strani &#039;&#039;Izvršioca&#039;&#039; je obavezno 1.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;Makrokomanda&#039;&#039; je varijanta &#039;&#039;Komande&#039;&#039;.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;Komanda&#039;&#039; može imati više &#039;&#039;Pokretača&#039;&#039;.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Konkretne komande se često realizuju kao &#039;&#039;Unikat&#039;&#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
Kako se naziva vrsta zastupnika koja obezbeđuje lokalnog predstavnika objekta koji se nalazi u drugom adresnom prostoru?&lt;br /&gt;
&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;udaljen&amp;lt;/span&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;Može i &amp;quot;ambasador&amp;quot; ili &amp;quot;remote&amp;quot;.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8_1&amp;diff=3817</id>
		<title>Информациони системи 1</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8_1&amp;diff=3817"/>
		<updated>2022-02-15T15:05:24Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: редуНданса&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Информациони системи 1&#039;&#039;&#039; је обавезан предмет из петог семестра.&lt;br /&gt;
&lt;br /&gt;
== Странице ==&lt;br /&gt;
* [http://si3is1.etf.rs/ Страница предмета]&lt;br /&gt;
** На &#039;&#039;Google&#039;&#039; можете наћи [https://rti.etf.bg.ac.rs/rti/temp/is1_proba/ тестирање изгледа нове странице предмета] јер је званична страница предмета јако лоше рангирана, али ово није званична страница предмета и на њој можете наћи неажурне информације.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
{{Материјали&lt;br /&gt;
| vuk = 11oSzQNNsC_pXCYTZirbMi4moyoi-TRqG&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
На страници предмета доступни су директоријуми за недеље наставе, али нажалост у потпуном расулу. На предавањима се теме обрађују следећим редом:&lt;br /&gt;
* Први блок:&lt;br /&gt;
** [http://si3is1.etf.rs/Nastava/Predavanja/1/ Увод] (не долази на роковима)&lt;br /&gt;
** [http://si3is1.etf.rs/Nastava/Predavanja/2/ Методи функционалне декомпозиције (FD) и дијаграм токова података (DFD)] (ДТП не долази на роковима)&lt;br /&gt;
** [http://si3is1.etf.rs/Nastava/Predavanja/3/ Примери функционалне декомпозиције — библиотека и банка]&lt;br /&gt;
** [http://si3is1.etf.rs/Nastava/Predavanja/4/ Примери функционалне декомпозиције — авио компанија и компанија за превоз]&lt;br /&gt;
* Други блок:&lt;br /&gt;
** [http://si3is1.etf.rs/Nastava/Predavanja/10/ Објектно-оријентисано пројектовање] (слично као на [[Пројектовање софтвера|Пројектовању софтвера]], али једноставније)&lt;br /&gt;
** [http://si3is1.etf.rs/Nastava/Predavanja/11/ Објектно-релационо мапирање (ORM)] (&#039;&#039;&#039;може да дође на испиту уместо на другом колоквијуму&#039;&#039;&#039;)&lt;br /&gt;
* Трећи блок:&lt;br /&gt;
** [http://si3is1.etf.rs/Nastava/Predavanja/7/ Редукција]&lt;br /&gt;
** [http://si3is1.etf.rs/Nastava/Predavanja/8/ Редунданса]&lt;br /&gt;
** [http://si3is1.etf.rs/Nastava/Predavanja/9/ Индекси]&lt;br /&gt;
* Следећи директоријуми на страници предмета се &#039;&#039;&#039;не предају више:&#039;&#039;&#039;&lt;br /&gt;
** [http://si3is1.etf.rs/Nastava/Predavanja/5/ Позициони модел ентитета и односа]&lt;br /&gt;
** [http://si3is1.etf.rs/Nastava/Predavanja/6/ Подмодели података]&lt;br /&gt;
* Доступан је и [http://si3is1.etf.rs/Nastava/Predavanja/12/ испит из 2011. године] који се не налази у директоријуму за испит.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
Од школске 2020/2021. године на предмету више не постоји лабораторијска вежба са функционалном декомпозицијом, већ само JMS (прва лабораторијска вежба), JPA и REST (друга лабораторијска вежба). Прва лабораторијска вежба носи 8 бодова, а друга 12 бодова. Једну лабораторијску вежбу је могуће радити само једном, али тај један пут може да буде током семестра или у фебруару (2022. године омогућена је надокнада лабораторијских вежби и у јануарском испитном року). Уколико се лабораторијске вежбе раде у фебруарском испитном року, могуће је сачувати бодове са испита у јануарском испитном року.&lt;br /&gt;
&lt;br /&gt;
Након израде лабораторијске вежбе, оне се бране тако што асистент погледа да ли је добро направљен програм по захтевима и на лицу места даје бодове. За другу лабораторијску вежбу 2021. године долазили су аутоматски тестови, али је 2022. године то избачено.&lt;br /&gt;
&lt;br /&gt;
Испод су излистане лабораторијске вежбе за које су сачуване поставке.&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = Информациони_системи_1/Лаб&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦24¦-1}²]],,&lt;br /&gt;
| noresultsheader = Тренутно нема лабораториских вежби.&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Препоручено је да прочитате наредне водиче за поставку алата, са корисним саветима и идејама шта је могло да пође по злу уколико добијете неку грешку:&#039;&#039;&#039;&lt;br /&gt;
* [[Информациони системи 1/JMS|JMS]]&lt;br /&gt;
* [[Информациони системи 1/JPA и REST|JPA и REST]]&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Пројекат носи 20 бодова и брани се у јануарском или фебруарском испитном року. Слично као за лабораторијске вежбе може да се ради само једном и бодови са испита у јануару могу да се пренесу у фебруар уколико се тада брани пројекат. Пројекат обухвата градиво JMS, JPA и REST које је до тада било рађено на вежбама (може да дође и помало градива које није било рађено на вежбама). На одбрани пројекта могу да дођу модификације.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Препоручено је да прочитате [[Информациони системи 1/Пројекат|водич за пројекат]] током израде пројекта,&#039;&#039;&#039; као и горенаведене водиче за лабораторијске вежбе.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
На страници предмета доступни су неки старији испитни рокови, али на консултацијама пред колоквијуме професор може урадити неки од старијих колоквијума који није са странице предмета (ти колоквијуми су такође излистани испод). На &amp;quot;ETF SI&amp;quot; драјву изнад можете пронаћи још неке рокове, а испод су излистани рокови скупљени на викију.&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = Информациони_системи_1/К\d&lt;br /&gt;
| titleregexp     = Информациони_системи_1/Јануар&lt;br /&gt;
| titleregexp     = Информациони_системи_1/Фебруар&lt;br /&gt;
| titleregexp     = Информациони_системи_1/Јун&lt;br /&gt;
| titleregexp     = Информациони_системи_1/Јул&lt;br /&gt;
| titleregexp     = Информациони_системи_1/Август&lt;br /&gt;
| titleregexp     = Информациони_системи_1/Септембар&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦24¦-1}²]],,&lt;br /&gt;
| noresultsheader = Тренутно нема испитних рокова.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1, K_2&amp;lt;/math&amp;gt; — Бодови са колоквијума (0-15). &#039;&#039;&#039;На сваки колоквијум је могуће изаћи само једном.&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt;L_1&amp;lt;/math&amp;gt; — Бодови са прве лабораторијске вежбе (0-8). &#039;&#039;&#039;Могуће је изаћи само једном.&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt;L_2&amp;lt;/math&amp;gt; — Бодови са друге лабораторијске вежбе (0-12). &#039;&#039;&#039;Могуће је изаћи само једном.&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt;PR&amp;lt;/math&amp;gt; — Бодови са пројекта (0-20). &#039;&#039;&#039;Пројекат се може бранити само једном.&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са испита (0-30). &amp;lt;!-- Не брините се, испит може да се ради више пута. --&amp;gt;&lt;br /&gt;
* Укупни бодови: &amp;lt;math&amp;gt;P = K_1 + K_2 + L_1 + L_2 + PR + I&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Рачунање ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;calculator&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;K1&amp;quot; data-max=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;K2&amp;quot; data-max=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;L_1&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;L1&amp;quot; data-max=&amp;quot;8&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;L_2&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;L2&amp;quot; data-max=&amp;quot;12&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;PR&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;PR&amp;quot; data-max=&amp;quot;20&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;I&amp;quot; data-max=&amp;quot;30&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;P&amp;quot; data-expression=&amp;quot;K1 K2 L1 L2 PR I + + + + +&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Оцена: &amp;lt;span data-expression=&amp;quot;P 10 / ceil 5 max 10 min&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|postavke}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Пети семестар]]&lt;br /&gt;
[[Категорија:Обавезни предмети]]&lt;br /&gt;
[[Категорија:Информациони системи 1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=3685</id>
		<title>Тестирање софтвера</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=3685"/>
		<updated>2022-02-12T12:54:09Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: додата секција о домаћима и напомена за интегрални испит&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Тестирање софтвера&#039;&#039;&#039; је изборни предмет из петог семестра.&lt;br /&gt;
&lt;br /&gt;
== Странице ==&lt;br /&gt;
* [http://si3ts.etf.rs/ Страница предмета]&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
{{Материјали&lt;br /&gt;
| beastweb       = testiranje-softvera&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Домаћи задаци ==&lt;br /&gt;
Постоје два домаћа задатка која носе по 20 поена. Први домаћи задатак је из тестирања црном кутијом, а други из тестирања белом кутијом. Могуће је надокнадити један домаћи задатак уколико раније није урађен. У школској 2021/22. години оба домаћа задатка у јануарском испитном року бранила су се истовремено, преко &#039;&#039;MS Teams&#039;&#039;-a пар дана након испита и одбрана је трајала двадесетак минута.&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1&amp;lt;/math&amp;gt; — Први колоквијум (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt; — Други колоквијум (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;DZ_1&amp;lt;/math&amp;gt; — Бодови са првог домаћег задатка (тестирање црном кутијом) (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;DZ_2&amp;lt;/math&amp;gt; — Бодови са другог домаћег задатка (тестирање белом кутијом) (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са испита (0-60)&lt;br /&gt;
* Надокнаде колоквијума не постоје јер се у сваком испитном року ради интегрални испит.&lt;br /&gt;
* &#039;&#039;&#039;Укупни бодови:&#039;&#039;&#039; &amp;lt;math&amp;gt;P = DZ_1 + DZ_2 + \max \left(K_1 + K_2 + \frac{I}{3}, K_1 +  \frac{2I}{3}, K_2 +  \frac{2I}{3}, I\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* Додати остале информације када почне семестар.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Пети семестар]]&lt;br /&gt;
[[Категорија:Изборни предмети]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=3683</id>
		<title>Тестирање софтвера</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=3683"/>
		<updated>2022-02-12T12:40:55Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Тестирање софтвера&#039;&#039;&#039; је изборни предмет из петог семестра.&lt;br /&gt;
&lt;br /&gt;
== Странице ==&lt;br /&gt;
* [http://si3ts.etf.rs/ Страница предмета]&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
{{Материјали&lt;br /&gt;
| beastweb       = testiranje-softvera&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1&amp;lt;/math&amp;gt; — Први колоквијум (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt; — Други колоквијум (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;DZ_1&amp;lt;/math&amp;gt; — Бодови са првог домаћег задатка (тестирање црном кутијом) (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;DZ_2&amp;lt;/math&amp;gt; — Бодови са другог домаћег задатка (тестирање белом кутијом) (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са испита (0-60)&lt;br /&gt;
* &#039;&#039;&#039;Укупни бодови:&#039;&#039;&#039; &amp;lt;math&amp;gt;P = DZ_1 + DZ_2 + \max(K_1 + K_2 + \frac{I}{3}, K_1 +  \frac{2I}{3}, K_2 +  \frac{2I}{3}, I)&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* Додати остале информације када почне семестар.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Пети семестар]]&lt;br /&gt;
[[Категорија:Изборни предмети]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=3681</id>
		<title>Тестирање софтвера</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=3681"/>
		<updated>2022-02-12T12:39:10Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: додат начин оцењивања&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Тестирање софтвера&#039;&#039;&#039; је изборни предмет из петог семестра.&lt;br /&gt;
&lt;br /&gt;
== Странице ==&lt;br /&gt;
* [http://si3ts.etf.rs/ Страница предмета]&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
{{Материјали&lt;br /&gt;
| beastweb       = testiranje-softvera&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1&amp;lt;/math&amp;gt; — Први колоквијум (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt; — Други колоквијум (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; — Бодови са првог домаћег задатка (тестирање црном кутијом) (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; — Бодови са другог домаћег задатка (тестирање белом кутијом) (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са испита (0-60)&lt;br /&gt;
* &#039;&#039;&#039;Укупни бодови:&#039;&#039;&#039; &amp;lt;math&amp;gt;P = P_1 + P_2 + \max(K_1 + K_2 + \frac{I}{3}, K_1 +  \frac{2I}{3}, K_2 +  \frac{2I}{3}, I)&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* Додати остале информације када почне семестар.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Пети семестар]]&lt;br /&gt;
[[Категорија:Изборни предмети]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9F%D1%80%D0%BE%D0%B1%D0%BD%D0%B8_%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B8_2021&amp;diff=3440</id>
		<title>Пројектовање софтвера/Пробни тестови 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9F%D1%80%D0%BE%D0%B1%D0%BD%D0%B8_%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B8_2021&amp;diff=3440"/>
		<updated>2022-01-24T12:11:42Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: r-&amp;gt;p&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
== Probni test ==&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
Povezati pojmove sa odgovarajućim definicijama principa OO modela.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Opcije&lt;br /&gt;
! Definicija&lt;br /&gt;
! Pojam&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;a,b,c&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;tipizacija&amp;lt;/code&amp;gt; &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;b&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;perzistencija&amp;lt;/code&amp;gt; &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;a&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;konkurentnost&amp;lt;/code&amp;gt; &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;c&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
| &amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Osobina po kojoj se postojanje objekta proteže kroz vreme.&lt;br /&gt;
# Osobine da se objekti različitih klasa ne mogu uopšte ili se mogu zamenjivati na određene načine.&lt;br /&gt;
# Osobina koja razlikuje aktivne objekte od pasivnih.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
Navesti simbol paketskog prava pristupa na jeziku UML:&lt;br /&gt;
&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;~&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
Označite tačna tvrđenja vezana za klase u jeziku UML.&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;Klasa je opis skupa objekata koji dele istu specifikaciju karakteristika (atributa i operacija), ograničenja i semantike.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Podrazumevano pravo pristupa za atribute/operacije u klasi je javno.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Dobro osmišljena klasa treba da ima veliki broj odgovornosti.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Atribute/operacije klase je moguće grupisati uz navođenje opisnog prefiksnog naziva grupe.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Simbol klase može da sadrži prazan odeljak za atribute/operacije samo ako odgovarajuća klasa nema atribute/operacije.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
Kako se naziva klasa čija je multiplikativnost 1?&lt;br /&gt;
&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Unikat&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. zadatak ===&lt;br /&gt;
Koje od sledećih osobina ispunjava paket na jeziku UML?&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;Paket je vlasnik sadržanih elemenata.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Paket može da sadrži druge pakete.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Paket je fizička stvar.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Paket predstavlja prostor imena.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Paket je stereotip klase.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6. zadatak ===&lt;br /&gt;
Ako se u paketu &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; nalazi javna klasa &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, da bi se u paketu &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; ta klasa mogla koristiti direktnim imenovanjem &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, ali da se u paketu &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; ne bi mogla koristiti pod imenom &amp;lt;code&amp;gt;B::X&amp;lt;/code&amp;gt;, koju relaciju treba uspostaviti između paketa &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; i paketa &amp;lt;code&amp;gt;A&amp;lt;/code&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;
# Stereotip asocijacije &amp;lt;&amp;lt;private&amp;gt;&amp;gt;.&lt;br /&gt;
# Stereotip generalizacije &amp;lt;&amp;lt;public&amp;gt;&amp;gt;.&lt;br /&gt;
# Stereotip zavisnosti &amp;lt;&amp;lt;import&amp;gt;&amp;gt;.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Stereotip zavisnosti &amp;lt;&amp;lt;access&amp;gt;&amp;gt;.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Stereotip realizacije &amp;lt;&amp;lt;include&amp;gt;&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. zadatak ===&lt;br /&gt;
Šta predstavlja dijagram objekata u UML?&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;
# Dijagram za prikaz dinamičkih aspekata modela.&lt;br /&gt;
# Dijagram predstavlja formalnu specifikaciju modela.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Dijagram za prikaz statičkih aspekata modela.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Dijagram predstavlja samo primer i služi za bolje razumevanje modela.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Dijagram za prikaz fizičkih aspekata modela.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Dijagram za prikaz logičkih aspekata modela.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8. zadatak ===&lt;br /&gt;
Koja od ponuđenih tvrnji su tačne za projektni uzorak &#039;&#039;Unikat&#039;&#039; (eng. &#039;&#039;Singleton&#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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;Unikat&#039;&#039; spada u objektne uzorke stvaranja.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Iako to nije po kanonskom uzorku &#039;&#039;Unikat&#039;&#039;, jednostavno (po maloj ceni) se može kontrolisano povećati broj dozvoljenih objekata.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Konstruktor klase koja implementira objektni uzorak uvek mora biti privatan.&lt;br /&gt;
# Dobar primerak klase koja implementira projektni uzorak &#039;&#039;Unikat&#039;&#039; je uslužna (eng. &#039;&#039;utility&#039;&#039;) klasa.&lt;br /&gt;
# Kanonski uzorak &#039;&#039;Unikat&#039;&#039; ne ograničava broj objekata klase &amp;lt;code&amp;gt;Unikat&amp;lt;/code&amp;gt;, koja implementira projektni uzorak.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 9. zadatak ===&lt;br /&gt;
Koliko različitih tipova učesnika postoji u projektnom uzorku &#039;&#039;Prototip&#039;&#039;?&lt;br /&gt;
&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 10. zadatak ===&lt;br /&gt;
U aplikaciji grafičkog editora se primenjuje uzorak &#039;&#039;Sastav&#039;&#039; (&#039;&#039;Kompozicija&#039;&#039;, &#039;&#039;Sklop&#039;&#039;, eng. &#039;&#039;Composite&#039;&#039;). Upariti pojedine nazive klasa u aplikaciji sa nazivima učesnika u projektnom uzorku.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Opcije&lt;br /&gt;
! Učesnici&lt;br /&gt;
! Klase &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;a,b,c,d&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Linija&amp;lt;/code&amp;gt; &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;a&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Pravougaonik&amp;lt;/code&amp;gt; &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;a&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Kružnica&amp;lt;/code&amp;gt; &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;a&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Crtez&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;b&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;&#039;Grafik&#039;&#039;&amp;lt;/code&amp;gt; &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;c&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Editor&amp;lt;/code&amp;gt; &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;d&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
| &amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# List&lt;br /&gt;
# Sklop&lt;br /&gt;
# Element&lt;br /&gt;
# Klijent&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2021&amp;diff=3431</id>
		<title>Пројектовање софтвера/К2 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2021&amp;diff=3431"/>
		<updated>2022-01-23T11:17:44Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: /* 10. zadatak */ Додато &amp;quot;реализује&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
Izabrati odgovarajuću sintaksu za sekvenciranje poruka, koja odgovara sledećem opisu:&lt;br /&gt;
&lt;br /&gt;
U toku posmatrane interakcije, u aktivnosti koja sledi na strani prijema 2. poruke dolazi do konkuretnog grananja; u niti B se poziva 1. operacija po redu, koja izaziva aktivnost u kojoj se kao 4. poruka po redu, dok god je uslov &amp;lt;code&amp;gt;x&amp;gt;5&amp;lt;/code&amp;gt; ispunjen, pokreće aktivnost iz koje se poziva operacija &amp;lt;code&amp;gt;f()&amp;lt;/code&amp;gt; kao 3. po redu.&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;2B.1.4*[x&amp;gt;5].3:f()&amp;lt;/span&amp;gt;&lt;br /&gt;
# 3.1B.4[x&amp;gt;5].2:f()&lt;br /&gt;
# 2.B1.4*||[x&amp;gt;5].3:f()&lt;br /&gt;
# 2.1B.*[x&amp;gt;5]4.3:f()&lt;br /&gt;
# 2.B1.[x&amp;gt;5]*4.3:f()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
Povezati načine pristupa drugoj strani konektora kod dijagrama komunikacije sa njihovim ukrasima:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Opcije&lt;br /&gt;
! Pristup&lt;br /&gt;
! Ukras&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;a,b,c,d,e,f,g&amp;quot;&amp;gt;&lt;br /&gt;
* Objektu uloge se pristupa preko primerka asocijacije - veze &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;b&amp;lt;/span&amp;gt;&lt;br /&gt;
* Objekat uloge je u nekom okružujućem dosegu imena &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;c&amp;lt;/span&amp;gt;&lt;br /&gt;
* Objekat uloge je argument operacije &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;e&amp;lt;/span&amp;gt;&lt;br /&gt;
* Objekat uloge je u lokalnom dosegu imena &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;d&amp;lt;/span&amp;gt;&lt;br /&gt;
* Objekat uloge sam sebi može da šalje poruku &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
| &amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# argument&lt;br /&gt;
# association&lt;br /&gt;
# global&lt;br /&gt;
# local&lt;br /&gt;
# parameter&lt;br /&gt;
# self&lt;br /&gt;
# this&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
Kako se na jeziku UML označava sekcija slučaja korišćenja, u kojoj se naznače tačke ponašanja u kojim se dati slučaj korišćenja proširuje drugim slučajevima korišćenja?&lt;br /&gt;
&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;extension points&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
Koje od navedenih tvrdnji su tačne za sledeći dijagram stanja:&lt;br /&gt;
[[Датотека:PS K2 2021 zadatak 4.svg|center|frame|Slika uz četvrti zadatak.]]&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;
# Ovakav automat stanja prihvata kao ispravnu i kompletnu praznu sekvencu znakova.&lt;br /&gt;
# Ovakav automat stanja prihvata kao ispravnu i kompletnu sledeću sekvencu znakova: &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Ovo je primer automata &#039;&#039;Moor&#039;&#039;-ovog tipa.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ovakav automat stanja prihvata kao ispravnu i kompletnu sledeću sekvencu znakova: &amp;lt;code&amp;gt;&amp;lt;&amp;gt;;&amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ovakav automat stanja prihvata kao ispravnu i kompletnu sledeću sekvencu znakova: &amp;lt;code&amp;gt;&amp;lt;a&amp;gt;bbb;&amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ovaj automat radi beskonačno.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
Sistem modelovan priloženim dijagramom stanja se pušta u rad. Redom se dešavaju događaji e1, e3, e2. Navesti akcije koje sistem izvršava kao posledicu navedene sekvence događaja, po redosledu izvršavanja. Odgovor (sekvencu akcija) dati navođenjem naziva akcija razdvojenih zapetama, bez razmaka. Primer: ako se redom izvršavaju akcije sa nazivima akcija1, akcija2 i akcija3, odgovor treba dati u formatu &amp;quot;akcija1,akcija2,akcija3&amp;quot; (bez znakova navoda).&lt;br /&gt;
[[Датотека:PS K2 2021 zadatak 5.svg|center|frame|Slika uz peti zadatak.]]&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;z,z1,z11,t11,f1,z12,t12,t1,t,f3,z,z1,z12,t12,t1,t,f2,x,x1&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
Koje od sledećih tvrdnji su tačne za projektni uzorak &#039;&#039;Iterator&#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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Kurzor je naziv specifične vrste iteratora.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Unutrašnji iterator je fleksibilniji od spoljašnjeg.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Kod spoljašnjeg iteratora je na klijentu odgovornost za progres obilaska.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Agregat ne sme da definiše algoritam obilaska ni za jednu vrstu iteratora.&lt;br /&gt;
# Unutrašnji iterator mora posedovati javni metod za dohvatanje tekućeg elementa.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
Koje od navedenih tvrdnji su tačne za projektni uzorak &#039;&#039;Stanje&#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;
# Predstavlja klasni uzorak ponašanja.&lt;br /&gt;
# Mana uzorka je što prelasci između stanja konteksta nisu eksplicitni.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Objekti stanja se često realizuju preko projektnog uzorka &#039;&#039;Unikat&#039;&#039;.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Prilikom promene stanja, spolja izgleda kao da objekat konteksta menja svoju klasu.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Konkretan objekat stanja ne sme da menja stanje svog konteksta.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
Koje od navedenih tvrdnji su tačne za projektni uzorak &#039;&#039;Podsetnik&#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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Klasa &#039;&#039;Podsetnik&#039;&#039; ispoljava dva interfejsa - uski prema klasi &#039;&#039;Čuvar&#039;&#039; i široki prema klasi &#039;&#039;Subjekat&#039;&#039;.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &#039;&#039;Čuvar&#039;&#039; proverava i koristi stanje objekta &#039;&#039;Podsetnik&#039;&#039;.&lt;br /&gt;
# &#039;&#039;Subjekat&#039;&#039; odlučuje u kom trenutku će da sačuva svoje kompletno stanje ili deo stanja.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;Subjekat&#039;&#039; kreira objekat &#039;&#039;Podsetnika&#039;&#039;.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Objekat &#039;&#039;Podsetnika&#039;&#039; nema unutrašnje stanje.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Objašnjenje: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Stavka pod c je na kolokvijumu bila označena kao tačna, ali pošto čuvanje izvršava Čuvar prihvaćena je žalba za ovo.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
Koje od navedenih tvrdnji su tačne za projektni uzorak &#039;&#039;Muva&#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;
# Klijenti stvaraju objekte muve njenim kloniranjem ili direktnom konstrukcijom.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Objekti deljenih muva mogu biti varijacije &#039;&#039;Unikata&#039;&#039; sa ograničenim brojem objekata.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Glavna mana ovog uzorka su potencijalni troškovi pronalaženja ili izračunavanja spoljašnjeg stanja muve.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Često se kombinuje sa uzorkom &#039;&#039;Sastav&#039;&#039;, tako da se formira stablo sa deljenim muvama u čvorovima i nedeljivim muvama u listovima.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Koristi se sa ciljem da se izbegne hiperprodukcija objekata.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
Koje od navedenih tvrdnji su tačne za projektni uzorak Adapter?&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;
# Klasa &#039;&#039;Cilj&#039;&#039; predstavlja klasu koju treba adaptirati prema očekivanom interfejsu za klijenta.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Objektni uzorak &#039;&#039;Adapter&#039;&#039; treba koristiti kada je potrebno istovremeno adaptirati više potklasa neke klase.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Klasa &#039;&#039;Adapter&#039;&#039; sme imati metode koje nisu deo interfejsa &#039;&#039;Cilj&#039;&#039;.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Dvosmerni adapter realizuje i klasni i objektni adapter.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Klasni uzorak &#039;&#039;Adapter&#039;&#039; dopušta klasi &#039;&#039;Adapter&#039;&#039; da nadjača i tako redefiniše neke metode adaptirane klase.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8_1/%D0%9B%D0%B0%D0%B1_1_2020&amp;diff=3202</id>
		<title>Информациони системи 1/Лаб 1 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8_1/%D0%9B%D0%B0%D0%B1_1_2020&amp;diff=3202"/>
		<updated>2021-11-29T18:40:55Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: Исправка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
== Zadatak 1b ==&lt;br /&gt;
Posmatra se proces za sklapanje automobila. Radnici RA, RB i RC prave delove A, B, C respektivno. Delovi su instance klasa A, B, C. Dakle, sklopljeni deo radnik šalje unutar objektne poruke u red za sklapanje koji je zajednički za sve radnike. Radnik kada napravi deo čeka između 3 i 6 sekundi (sa uniformnom raspodelom) i kreće sa pravljenjem novog dela. Sve delove iz reda za sklapanje prikuplja poseban radnik koji radi samo sklapanje automobila. Svaki automobil sastoji se iz tačno jednog dela A, jednog dela B i jednog dela C. Kada prikupi sva tri različita dela koja su prva pristigla (nije dozvoljeno da skladišti više delova istog tipa), radnik od njih pravi automobil koji je predstavljen klasom Automobil koja u sebi ima reference na svoja tri dela. Radniku je za sklapanje automobila potrebno 5 sekundi i sve sklopljene automobile šalje u posebnu temu za testiranje. Radnici za testiranje preuzimaju automobile sa te teme. Potrebno je omogućiti da radnici za testiranje primaju poruke koje su pristigle i u periodu kada niko nije bio aktivan i da svaki automobil preuzme samo jedan radnik. Slanje i prijem svake poruke je potrebno ispisati na glavnom izlazu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pre pokretanja u Glassfish napraviti Queue sa nazivom &amp;lt;code&amp;gt;myQueue&amp;lt;/code&amp;gt; i Topic sa nazivom &amp;lt;code&amp;gt;MyTopic&amp;lt;/code&amp;gt;, dok takođe treba da postoji podrazumevani Connection Factory &amp;lt;code&amp;gt;jms/__defaultConnectionFactory&amp;lt;/code&amp;gt;. Radnici treba da se nalaze u odvojenim projektima kako bi mogli da se pokreću odvojeno, dok ostali paketi mogu da se nalaze u svim projektima.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;delovi&amp;lt;/code&amp;gt; paket ====&lt;br /&gt;
Ovaj paket mora biti u sva tri projekta kako bi procesi uspešno razmenjivali poruke.&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;A.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package delovi;&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
public class A implements Serializable {&lt;br /&gt;
    private final int id;&lt;br /&gt;
    public A(int id) {&lt;br /&gt;
        this.id = id;&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return &amp;quot;A[&amp;quot; + id + &amp;quot;]&amp;quot;;&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;B.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package delovi;&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
public class B implements Serializable {&lt;br /&gt;
    private final int id;&lt;br /&gt;
    public B(int id) {&lt;br /&gt;
        this.id = id;&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return &amp;quot;B[&amp;quot; + id + &amp;quot;]&amp;quot;;&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;C.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package delovi;&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
public class C implements Serializable {&lt;br /&gt;
    private final int id;&lt;br /&gt;
    public C(int id) {&lt;br /&gt;
        this.id = id;&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return &amp;quot;C[&amp;quot; + id + &amp;quot;]&amp;quot;;&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;automobil&amp;lt;/code&amp;gt; paket ====&lt;br /&gt;
Ovaj paket mora da se nalazi i u projektu sa radnikom sklapačem i u projektu sa radnicima testerima.&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;Automobil.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package automobil;&lt;br /&gt;
&lt;br /&gt;
import delovi.*;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
public class Automobil implements Serializable {&lt;br /&gt;
    private final A a;&lt;br /&gt;
    private final B b;&lt;br /&gt;
    private final C c;&lt;br /&gt;
    &lt;br /&gt;
    public Automobil(A a, B b, C c) {&lt;br /&gt;
        this.a = a;&lt;br /&gt;
        this.b = b;&lt;br /&gt;
        this.c = c;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return &amp;quot;Automobil[&amp;quot; + a + &amp;quot;, &amp;quot; + b + &amp;quot;,&amp;quot; + c + &amp;quot;]&amp;quot;;&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;radnikdelova&amp;lt;/code&amp;gt; paket ====&lt;br /&gt;
===== &amp;lt;code&amp;gt;RadnikDelova.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Predstavlja radnike RA, RB i RC. Pokrenuti tri puta menjajući &amp;lt;code&amp;gt;PART_NAME&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package radnikdelova;&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.logging.Level;&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
import javax.annotation.Resource;&lt;br /&gt;
import javax.jms.ConnectionFactory;&lt;br /&gt;
import javax.jms.JMSContext;&lt;br /&gt;
import javax.jms.JMSException;&lt;br /&gt;
import javax.jms.JMSProducer;&lt;br /&gt;
import javax.jms.Queue;&lt;br /&gt;
import javax.jms.ObjectMessage;&lt;br /&gt;
import delovi.*;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    @Resource(lookup=&amp;quot;jms/__defaultConnectionFactory&amp;quot;)&lt;br /&gt;
    private static ConnectionFactory connectionFactory;&lt;br /&gt;
    &lt;br /&gt;
    @Resource(lookup=&amp;quot;myQueue&amp;quot;)&lt;br /&gt;
    private static Queue myQueue;&lt;br /&gt;
    &lt;br /&gt;
    private static final char PART_NAME = &#039;A&#039;;&lt;br /&gt;
    private static int staticId = 0;&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        JMSContext context = connectionFactory.createContext();&lt;br /&gt;
        JMSProducer producer = context.createProducer();&lt;br /&gt;
        while (true) {&lt;br /&gt;
            try {&lt;br /&gt;
                Serializable obj = null;&lt;br /&gt;
                switch (PART_NAME) {&lt;br /&gt;
                    case &#039;A&#039;:&lt;br /&gt;
                        obj = new A(staticId++);&lt;br /&gt;
                        break;&lt;br /&gt;
                    case &#039;B&#039;:&lt;br /&gt;
                        obj = new B(staticId++);&lt;br /&gt;
                        break;&lt;br /&gt;
                    case &#039;C&#039;:&lt;br /&gt;
                        obj = new C(staticId++);&lt;br /&gt;
                        break;&lt;br /&gt;
                }&lt;br /&gt;
                ObjectMessage objMsg = context.createObjectMessage(obj);&lt;br /&gt;
                objMsg.setStringProperty(&amp;quot;Type&amp;quot;, String.valueOf(PART_NAME));&lt;br /&gt;
                producer.send(myQueue, objMsg);&lt;br /&gt;
                System.out.println(&amp;quot;Sent &amp;quot; + obj);&lt;br /&gt;
                int wait = (int)((Math.random() * 4 + 3) * 1000);&lt;br /&gt;
                Thread.sleep(wait);&lt;br /&gt;
            } catch (InterruptedException | JMSException ex) {&lt;br /&gt;
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);&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;radniksklapac&amp;lt;/code&amp;gt; paket ====&lt;br /&gt;
===== &amp;lt;code&amp;gt;RadnikSklapac.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package radniksklapac;&lt;br /&gt;
&lt;br /&gt;
import automobil.Automobil;&lt;br /&gt;
import delovi.*;&lt;br /&gt;
import java.util.logging.Level;&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
import javax.annotation.Resource;&lt;br /&gt;
import javax.jms.ConnectionFactory;&lt;br /&gt;
import javax.jms.JMSConsumer;&lt;br /&gt;
import javax.jms.JMSContext;&lt;br /&gt;
import javax.jms.JMSException;&lt;br /&gt;
import javax.jms.JMSProducer;&lt;br /&gt;
import javax.jms.Message;&lt;br /&gt;
import javax.jms.Queue;&lt;br /&gt;
import javax.jms.ObjectMessage;&lt;br /&gt;
import javax.jms.Topic;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    @Resource(lookup=&amp;quot;jms/__defaultConnectionFactory&amp;quot;)&lt;br /&gt;
    private static ConnectionFactory connectionFactory;&lt;br /&gt;
    &lt;br /&gt;
    @Resource(lookup=&amp;quot;myQueue&amp;quot;)&lt;br /&gt;
    private static Queue myQueue;&lt;br /&gt;
    &lt;br /&gt;
    @Resource(lookup=&amp;quot;MyTopic&amp;quot;)&lt;br /&gt;
    private static Topic myTopic;&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        JMSContext context = connectionFactory.createContext();&lt;br /&gt;
        JMSConsumer consumerA = context.createConsumer(myQueue, &amp;quot;Type = &#039;A&#039;&amp;quot;);&lt;br /&gt;
        JMSConsumer consumerB = context.createConsumer(myQueue, &amp;quot;Type = &#039;B&#039;&amp;quot;);&lt;br /&gt;
        JMSConsumer consumerC = context.createConsumer(myQueue, &amp;quot;Type = &#039;C&#039;&amp;quot;);&lt;br /&gt;
        JMSProducer producer = context.createProducer();&lt;br /&gt;
        while (true) {&lt;br /&gt;
            Message msgA = consumerA.receive();&lt;br /&gt;
            System.out.println(&amp;quot;Received A&amp;quot;);&lt;br /&gt;
            Message msgB = consumerB.receive();&lt;br /&gt;
            System.out.println(&amp;quot;Received B&amp;quot;);&lt;br /&gt;
            Message msgC = consumerC.receive();&lt;br /&gt;
            System.out.println(&amp;quot;Received C&amp;quot;);&lt;br /&gt;
            if (msgA instanceof ObjectMessage &amp;amp;&amp;amp; msgB instanceof ObjectMessage &amp;amp;&amp;amp; msgC instanceof ObjectMessage) {&lt;br /&gt;
                try {&lt;br /&gt;
                    ObjectMessage objMsgA = (ObjectMessage)msgA;&lt;br /&gt;
                    ObjectMessage objMsgB = (ObjectMessage)msgB;&lt;br /&gt;
                    ObjectMessage objMsgC = (ObjectMessage)msgC;&lt;br /&gt;
                    A a = (A)objMsgA.getObject();&lt;br /&gt;
                    B b = (B)objMsgB.getObject();&lt;br /&gt;
                    C c = (C)objMsgC.getObject();&lt;br /&gt;
                    Automobil auto = new Automobil(a, b, c);&lt;br /&gt;
                    Thread.sleep(5000);&lt;br /&gt;
                    System.out.println(&amp;quot;Produced &amp;quot; + auto);&lt;br /&gt;
                    ObjectMessage autoMsg = context.createObjectMessage(auto);&lt;br /&gt;
                    producer.send(myTopic, autoMsg);&lt;br /&gt;
                } catch (JMSException | InterruptedException ex) {&lt;br /&gt;
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);&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;radniktester&amp;lt;/code&amp;gt; paket ====&lt;br /&gt;
===== &amp;lt;code&amp;gt;RadnikTester.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package radniktester;&lt;br /&gt;
&lt;br /&gt;
import automobil.Automobil;&lt;br /&gt;
import java.util.logging.Level;&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
import javax.annotation.Resource;&lt;br /&gt;
import javax.jms.ConnectionFactory;&lt;br /&gt;
import javax.jms.JMSConsumer;&lt;br /&gt;
import javax.jms.JMSContext;&lt;br /&gt;
import javax.jms.JMSException;&lt;br /&gt;
import javax.jms.Message;&lt;br /&gt;
import javax.jms.ObjectMessage;&lt;br /&gt;
import javax.jms.Topic;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    @Resource(lookup=&amp;quot;jms/__defaultConnectionFactory&amp;quot;)&lt;br /&gt;
    private static ConnectionFactory connectionFactory;&lt;br /&gt;
&lt;br /&gt;
    @Resource(lookup=&amp;quot;MyTopic&amp;quot;)&lt;br /&gt;
    private static Topic myTopic;&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        JMSContext context = connectionFactory.createContext();&lt;br /&gt;
        JMSConsumer consumer = context.createSharedDurableConsumer(myTopic, &amp;quot;sub1&amp;quot;);&lt;br /&gt;
        while (true) {&lt;br /&gt;
            try {&lt;br /&gt;
                Message msg = consumer.receive();&lt;br /&gt;
                System.out.println(&amp;quot;Received car&amp;quot;);&lt;br /&gt;
                if (msg instanceof ObjectMessage) {&lt;br /&gt;
                    Automobil auto = (Automobil)((ObjectMessage) msg).getObject();&lt;br /&gt;
                    System.out.println(&amp;quot;Received &amp;quot; + auto);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (JMSException ex) {&lt;br /&gt;
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);&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;
[[Категорија:Информациони системи 1]]&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8_1/%D0%9B%D0%B0%D0%B1_1_2021&amp;diff=3201</id>
		<title>Информациони системи 1/Лаб 1 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8_1/%D0%9B%D0%B0%D0%B1_1_2021&amp;diff=3201"/>
		<updated>2021-11-29T18:40:43Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: Исправка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grupa B ==&lt;br /&gt;
Posmatra se proces za pravljenje novogodišnjih paketića. Tri radnika prave ratluk, bombone i čokoladice, respektivno. Slatkiši su instance klasa Ratluk, Bombona, Čokoladica. Dakle, napravljeni slatkiš radnik šalje unutar objektne poruke u red za pravljenje koji je zajednički za sve radnike. Radnik kada napravi slatkiš čeka između 3 i 6 sekundi (sa uniformnom raspodelom) i kreće sa pravljenjem novog slatkiša. Sve delove iz reda za pravljenje prikuplja vilenjak koji radi samo sklapanje paketića. Svaki paketić sastoji se iz tačno jednog ratluka, jedne bombone i jedne čokoladice. Kada prikupi sva tri različita slatkiša koja su prva pristigla (nije dozvoljeno da skladišti više slatkiša istog tipa), vilenjak od njih pravi paketić koji je predstavljen klasom Paketić koja u sebi ima reference na svoja tri slatkiša. Vilenjak šalje sve napravljene paketiće na temu. Deda Mraz preuzima paketiće sa te teme. Potrebno je omogućiti da jedan paketić preuzme samo jedan Deda Mraz. Slanje i prijem svake poruke je potrebno ispisati na glavnom izlazu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pre pokretanja u Glassfish napraviti Queue sa nazivom &amp;lt;code&amp;gt;myQueue&amp;lt;/code&amp;gt; i Topic sa nazivom &amp;lt;code&amp;gt;myTopic&amp;lt;/code&amp;gt;, dok takođe treba da postoji podrazumevani Connection Factory &amp;lt;code&amp;gt;jms/__defaultConnectionFactory&amp;lt;/code&amp;gt;. Radnici treba da se nalaze u odvojenim projektima kako bi mogli da se pokreću odvojeno, dok ostali paketi mogu da se nalaze u svim projektima.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;slatkisi&amp;lt;/code&amp;gt; paket ====&lt;br /&gt;
Ovaj paket mora biti u sva tri projekta kako bi procesi uspešno razmenjivali poruke.&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;Ratluk.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package slatkisi;&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
public class Ratluk implements Serializable {&lt;br /&gt;
    private final int id;&lt;br /&gt;
    public Ratluk(int id) {&lt;br /&gt;
        this.id = id;&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return &amp;quot;RATLUK[&amp;quot; + id + &amp;quot;]&amp;quot;;&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;Bombona.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package slatkisi;&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
public class Bombona implements Serializable {&lt;br /&gt;
    private final int id;&lt;br /&gt;
    public Bombona(int id) {&lt;br /&gt;
        this.id = id;&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return &amp;quot;BOMBONA[&amp;quot; + id + &amp;quot;]&amp;quot;;&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;Cokoladica.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package slatkisi;&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
public class Cokoladica implements Serializable {&lt;br /&gt;
    private final int id;&lt;br /&gt;
    public Cokoladica(int id) {&lt;br /&gt;
        this.id = id;&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return &amp;quot;COKOLADICA[&amp;quot; + id + &amp;quot;]&amp;quot;;&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;paketic&amp;lt;/code&amp;gt; paket ====&lt;br /&gt;
Ovaj paket mora da se nalazi i u projektu sa Vilenjakom i u projektu sa Deda Mrazom.&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;code&amp;gt;Paketic.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package paketic;&lt;br /&gt;
&lt;br /&gt;
import slatkisi.*;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
public class Paketic implements Serializable {&lt;br /&gt;
    private final Ratluk ratluk;&lt;br /&gt;
    private final Bombona bombona;&lt;br /&gt;
    private final Cokoladica cokoladica;&lt;br /&gt;
    &lt;br /&gt;
    public Paketic(Ratluk ratluk, Bombona bombona, Cokoladica cokoladica) {&lt;br /&gt;
        this.ratluk = ratluk;&lt;br /&gt;
        this.bombona = bombona;&lt;br /&gt;
        this.cokoladica = cokoladica;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return &amp;quot;PAKETIC[&amp;quot; + ratluk + &amp;quot;, &amp;quot; + bombona + &amp;quot;, &amp;quot; + cokoladica + &amp;quot;]&amp;quot;;&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;radnici&amp;lt;/code&amp;gt; paket ====&lt;br /&gt;
===== &amp;lt;code&amp;gt;RadnikRatluk.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
Predstavlja radnike RadnikRatluk, RadnikBombona i RadnikCokoaldica. Pokrenuti tri puta menjajući &amp;lt;code&amp;gt;CANDY_NAME&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package radnici;&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.logging.Level;&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
import javax.annotation.Resource;&lt;br /&gt;
import javax.jms.ConnectionFactory;&lt;br /&gt;
import javax.jms.JMSContext;&lt;br /&gt;
import javax.jms.JMSException;&lt;br /&gt;
import javax.jms.JMSProducer;&lt;br /&gt;
import javax.jms.Queue;&lt;br /&gt;
import javax.jms.ObjectMessage;&lt;br /&gt;
import slatkisi.*;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    @Resource(lookup=&amp;quot;jms/__defaultConnectionFactory&amp;quot;)&lt;br /&gt;
    private static ConnectionFactory connectionFactory;&lt;br /&gt;
    &lt;br /&gt;
    @Resource(lookup=&amp;quot;myQueue&amp;quot;)&lt;br /&gt;
    private static Queue myQueue;&lt;br /&gt;
    &lt;br /&gt;
    private static final String CANDY_NAME = &amp;quot;RATLUK&amp;quot;;&lt;br /&gt;
    private static int staticId = 0;&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        JMSContext context = connectionFactory.createContext();&lt;br /&gt;
        JMSProducer producer = context.createProducer();&lt;br /&gt;
        while (true) {&lt;br /&gt;
            try {&lt;br /&gt;
                Serializable obj = null;&lt;br /&gt;
                switch (CANDY_NAME) {&lt;br /&gt;
                    case &amp;quot;RATLUK&amp;quot;:&lt;br /&gt;
                        obj = new Ratluk(staticId++);&lt;br /&gt;
                        break;&lt;br /&gt;
                    case &amp;quot;BOMBONA&amp;quot;:&lt;br /&gt;
                        obj = new Bombona(staticId++);&lt;br /&gt;
                        break;&lt;br /&gt;
                    case &amp;quot;COKOLADICA&amp;quot;:&lt;br /&gt;
                        obj = new Cokoladica(staticId++);&lt;br /&gt;
                        break;&lt;br /&gt;
                }&lt;br /&gt;
                ObjectMessage objMsg = context.createObjectMessage(obj);&lt;br /&gt;
                objMsg.setStringProperty(&amp;quot;Type&amp;quot;, CANDY_NAME);&lt;br /&gt;
                producer.send(myQueue, objMsg);&lt;br /&gt;
                System.out.println(&amp;quot;Sent &amp;quot; + obj);&lt;br /&gt;
                int wait = (int)((Math.random() * 4 + 3) * 1000);&lt;br /&gt;
                Thread.sleep(wait);&lt;br /&gt;
            } catch (InterruptedException | JMSException ex) {&lt;br /&gt;
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);&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;vilenjak&amp;lt;/code&amp;gt; paket ====&lt;br /&gt;
===== &amp;lt;code&amp;gt;Vilenjak.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package vilenjak;&lt;br /&gt;
&lt;br /&gt;
import paketic.Paketic;&lt;br /&gt;
import slatkisi.*;&lt;br /&gt;
import java.util.logging.Level;&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
import javax.annotation.Resource;&lt;br /&gt;
import javax.jms.ConnectionFactory;&lt;br /&gt;
import javax.jms.JMSConsumer;&lt;br /&gt;
import javax.jms.JMSContext;&lt;br /&gt;
import javax.jms.JMSException;&lt;br /&gt;
import javax.jms.JMSProducer;&lt;br /&gt;
import javax.jms.Message;&lt;br /&gt;
import javax.jms.Queue;&lt;br /&gt;
import javax.jms.ObjectMessage;&lt;br /&gt;
import javax.jms.Topic;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    @Resource(lookup=&amp;quot;jms/__defaultConnectionFactory&amp;quot;)&lt;br /&gt;
    private static ConnectionFactory connectionFactory;&lt;br /&gt;
    &lt;br /&gt;
    @Resource(lookup=&amp;quot;myQueue&amp;quot;)&lt;br /&gt;
    private static Queue myQueue;&lt;br /&gt;
    &lt;br /&gt;
    @Resource(lookup=&amp;quot;myTopic&amp;quot;)&lt;br /&gt;
    private static Topic myTopic;&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        JMSContext context = connectionFactory.createContext();&lt;br /&gt;
        JMSConsumer consumerR = context.createConsumer(myQueue, &amp;quot;Type = &#039;RATLUK&#039;&amp;quot;);&lt;br /&gt;
        JMSConsumer consumerB = context.createConsumer(myQueue, &amp;quot;Type = &#039;BOMBONA&#039;&amp;quot;);&lt;br /&gt;
        JMSConsumer consumerC = context.createConsumer(myQueue, &amp;quot;Type = &#039;COKOLADICA&#039;&amp;quot;);&lt;br /&gt;
        JMSProducer producer = context.createProducer();&lt;br /&gt;
        while (true) {&lt;br /&gt;
            Message msgR = consumerR.receive();&lt;br /&gt;
            System.out.println(&amp;quot;Received ratluk&amp;quot;);&lt;br /&gt;
            Message msgB = consumerB.receive();&lt;br /&gt;
            System.out.println(&amp;quot;Received bombona&amp;quot;);&lt;br /&gt;
            Message msgC = consumerC.receive();&lt;br /&gt;
            System.out.println(&amp;quot;Received cokoladica&amp;quot;);&lt;br /&gt;
            if (msgR instanceof ObjectMessage &amp;amp;&amp;amp; msgB instanceof ObjectMessage &amp;amp;&amp;amp; msgC instanceof ObjectMessage) {&lt;br /&gt;
                try {&lt;br /&gt;
                    ObjectMessage objMsgR = (ObjectMessage)msgR;&lt;br /&gt;
                    ObjectMessage objMsgB = (ObjectMessage)msgB;&lt;br /&gt;
                    ObjectMessage objMsgC = (ObjectMessage)msgC;&lt;br /&gt;
                    Ratluk ratluk = (Ratluk)objMsgR.getObject();&lt;br /&gt;
                    Bombona bombona = (Bombona)objMsgB.getObject();&lt;br /&gt;
                    Cokoladica cokoladica = (Cokoladica)objMsgC.getObject();&lt;br /&gt;
                    Paketic paketic = new Paketic(ratluk, bombona, cokoladica);&lt;br /&gt;
                    System.out.println(&amp;quot;Produced &amp;quot; + paketic);&lt;br /&gt;
                    ObjectMessage paketicMsg = context.createObjectMessage(paketic);&lt;br /&gt;
                    producer.send(myTopic, paketicMsg);&lt;br /&gt;
                    System.out.println(&amp;quot;Sent &amp;quot; + paketic);&lt;br /&gt;
                } catch (JMSException ex) {&lt;br /&gt;
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);&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;dedamraz&amp;lt;/code&amp;gt; paket ====&lt;br /&gt;
===== &amp;lt;code&amp;gt;DedaMraz.java&amp;lt;/code&amp;gt; =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package dedamraz;&lt;br /&gt;
&lt;br /&gt;
import paketic.Paketic;&lt;br /&gt;
import java.util.logging.Level;&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
import javax.annotation.Resource;&lt;br /&gt;
import javax.jms.ConnectionFactory;&lt;br /&gt;
import javax.jms.JMSConsumer;&lt;br /&gt;
import javax.jms.JMSContext;&lt;br /&gt;
import javax.jms.JMSException;&lt;br /&gt;
import javax.jms.Message;&lt;br /&gt;
import javax.jms.ObjectMessage;&lt;br /&gt;
import javax.jms.Topic;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    @Resource(lookup=&amp;quot;jms/__defaultConnectionFactory&amp;quot;)&lt;br /&gt;
    private static ConnectionFactory connectionFactory;&lt;br /&gt;
&lt;br /&gt;
    @Resource(lookup=&amp;quot;myTopic&amp;quot;)&lt;br /&gt;
    private static Topic myTopic;&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        JMSContext context = connectionFactory.createContext();&lt;br /&gt;
        JMSConsumer consumer = context.createSharedConsumer(myTopic, &amp;quot;sub1&amp;quot;);&lt;br /&gt;
        while (true) {&lt;br /&gt;
            try {&lt;br /&gt;
                Message msg = consumer.receive();&lt;br /&gt;
                System.out.println(&amp;quot;Received paketic&amp;quot;);&lt;br /&gt;
                if (msg instanceof ObjectMessage) {&lt;br /&gt;
                    Paketic paketic = (Paketic)((ObjectMessage) msg).getObject();&lt;br /&gt;
                    System.out.println(&amp;quot;Received &amp;quot; + paketic);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (JMSException ex) {&lt;br /&gt;
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);&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>Ivan Pešić</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_2021&amp;diff=2949</id>
		<title>ОС1/Модификације август 2021</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_2021&amp;diff=2949"/>
		<updated>2021-09-22T09:53:08Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: можда није писало нестатичка метода али свеједно&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Sledeće modifikacije su se pojavile na odbrani projekta u avgustovskom roku 2021.&lt;br /&gt;
&lt;br /&gt;
== 30 poena ==&lt;br /&gt;
* U klasi Thread dodati metodu &amp;lt;code&amp;gt;int olderSiblingCount()&amp;lt;/code&amp;gt; koja vraća broj nezavršene starije braće trenutne niti. Ukoliko nit nije nastala &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;-om, metoda vraća -1.&lt;br /&gt;
* Nit &#039;&#039;A&#039;&#039; je stariji brat niti &#039;&#039;B&#039;&#039; ako su i nit &#039;&#039;A&#039;&#039; i nit &#039;&#039;B&#039;&#039; nastale forkovanjem iste niti, ali je &#039;&#039;A&#039;&#039; startovana pre &#039;&#039;B&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Napisati test primer na sledeći način:&lt;br /&gt;
* Forkom napraviti 5 dece a zatim u svakom detetu generisati slučajan broj &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; (od 3 do 10) i u petlji koja iterira &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; puta ispisivati sledeću poruku: &amp;quot;&amp;lt;code&amp;gt;Thread id: x/num_iter olderSiblingCount: res&amp;lt;/code&amp;gt;&amp;quot; gde je &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; ID trenutne niti, &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; trenutna iteracija petlje, &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; prethodno slučajno generisan broj, a &amp;lt;code&amp;gt;res&amp;lt;/code&amp;gt; povratna vrednost &amp;lt;code&amp;gt;olderSiblingCount()&amp;lt;/code&amp;gt; metode za tekuću nit.&lt;br /&gt;
* Takođe dodati semafor koji u svakoj iteraciji deteta uspavljuje dete na random vreme od &amp;lt;code&amp;gt;50&amp;lt;/code&amp;gt; do &amp;lt;code&amp;gt;250ms&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int userMain(int argc, char** argv) {&lt;br /&gt;
  for(int i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
    int pid = Thread::fork();&lt;br /&gt;
    if(pid) continue;&lt;br /&gt;
    Semaphore sleeper(0);&lt;br /&gt;
    int num_iter = 3 + (rand() % 8);&lt;br /&gt;
    for(int j = 0; j &amp;lt; num_iter; j++) {&lt;br /&gt;
      intLock&lt;br /&gt;
      cout &amp;lt;&amp;lt; &amp;quot;Thread &amp;quot; &amp;lt;&amp;lt; Thread::getRunningId() &amp;lt;&amp;lt; &amp;quot;: &amp;quot; &amp;lt;&amp;lt; j &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; num_iter &amp;lt;&amp;lt; &amp;quot; olderSiblingCount = &amp;quot; &amp;lt;&amp;lt; (Thread::getThreadById(Thread::getRunningId()))-&amp;gt;olderSiblingCount() &amp;lt;&amp;lt; endl;&lt;br /&gt;
      intUnlock&lt;br /&gt;
      sleeper.wait(1 + (rand() % 5));&lt;br /&gt;
    }&lt;br /&gt;
    Thread::exit();&lt;br /&gt;
  }&lt;br /&gt;
  Thread::waitForForkChildren();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</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_2021&amp;diff=2947</id>
		<title>ОС1/Модификације август 2021</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_2021&amp;diff=2947"/>
		<updated>2021-09-21T15:07:57Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: Исправка од @656800909262585856&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Sledeće modifikacije su se pojavile na odbrani projekta u avgustovskom roku 2021.&lt;br /&gt;
&lt;br /&gt;
== 30 poena ==&lt;br /&gt;
* U klasi Thread dodati nestatičku metodu &amp;lt;code&amp;gt;int allOlderSiblings()&amp;lt;/code&amp;gt; koja vraća broj nezavršene starije braće trenutne niti. Ukoliko nit nije nastala &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;-om, metoda vraća -1.&lt;br /&gt;
* Nit &#039;&#039;A&#039;&#039; je stariji brat niti &#039;&#039;B&#039;&#039; ako su i nit &#039;&#039;A&#039;&#039; i nit &#039;&#039;B&#039;&#039; nastale forkovanjem iste niti ali je &#039;&#039;A&#039;&#039; nastala pre &#039;&#039;B&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Napisati test primer na sledeći način:&lt;br /&gt;
*Forkom napraviti 5 dece a zatim u svakom detetu generisati slučajan broj &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; (od 3 do 10) i u petlji koja iterira &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; puta ispisivati sledeću poruku: &amp;quot;&amp;lt;code&amp;gt;Thread id: x/num_iter allOlderSiblings: res&amp;lt;/code&amp;gt;&amp;quot; gde je &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; ID trenutne niti, &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; trenutna iteracija petlje, &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; prethodno slučajno generisan broj, a &amp;lt;code&amp;gt;res&amp;lt;/code&amp;gt; povratna vrednost &amp;lt;code&amp;gt;allOlderSiblings()&amp;lt;/code&amp;gt; metode za tekuću nit.&lt;br /&gt;
*Takođe dodati semafor koji u svakoj iteraciji deteta uspavljuje dete na random vreme od &amp;lt;code&amp;gt;50&amp;lt;/code&amp;gt; do &amp;lt;code&amp;gt;250ms&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int userMain(int argc, char** argv) {&lt;br /&gt;
  for(int i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
    int pid = Thread::fork();&lt;br /&gt;
    if(pid) continue;&lt;br /&gt;
    Semaphore sleeper(0);&lt;br /&gt;
    int num_iter = 3 + (rand() % 8);&lt;br /&gt;
    for(int j = 0; j &amp;lt; num_iter; j++) {&lt;br /&gt;
      intLock&lt;br /&gt;
      cout &amp;lt;&amp;lt; &amp;quot;Thread &amp;quot; &amp;lt;&amp;lt; Thread::getRunningId() &amp;lt;&amp;lt; &amp;quot;: &amp;quot; &amp;lt;&amp;lt; j &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; num_iter &amp;lt;&amp;lt; &amp;quot; allOlderSiblings = &amp;quot; &amp;lt;&amp;lt; (Thread::getThreadById(Thread::getRunningId()))-&amp;gt;allOlderSiblings() &amp;lt;&amp;lt; endl;&lt;br /&gt;
      intUnlock&lt;br /&gt;
      sleeper.wait(1 + (rand() % 5));&lt;br /&gt;
    }&lt;br /&gt;
    Thread::exit();&lt;br /&gt;
  }&lt;br /&gt;
  Thread::waitForForkChildren();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</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_2021&amp;diff=2946</id>
		<title>ОС1/Модификације август 2021</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_2021&amp;diff=2946"/>
		<updated>2021-09-21T12:17:08Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: Исправка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Sledeće modifikacije su se pojavile na odbrani projekta u avgustovskom roku 2021.&lt;br /&gt;
&lt;br /&gt;
== 30 poena ==&lt;br /&gt;
* U klasi Thread dodati nestatičku metodu &amp;lt;code&amp;gt;int allOlderSiblings()&amp;lt;/code&amp;gt; koja vraća broj nezavršene starije braće trenutne niti. Ukoliko nit nije nastala &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;-om, metoda vraća -1.&lt;br /&gt;
* Nit &#039;&#039;A&#039;&#039; je stariji brat niti &#039;&#039;B&#039;&#039; ako su i nit &#039;&#039;A&#039;&#039; i nit &#039;&#039;B&#039;&#039; nastale forkovanjem iste niti ali je &#039;&#039;A&#039;&#039; nastala pre &#039;&#039;B&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Napisati test primer na sledeći način:&lt;br /&gt;
*Forkom napraviti 5 dece a zatim u svakom detetu generisati slučajan broj &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; (od 3 do 10) i u petlji koja iterira &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; puta ispisivati sledeću poruku: &amp;quot;&amp;lt;code&amp;gt;Thread id: x/num_iter allOlderSiblings: res&amp;lt;/code&amp;gt;&amp;quot; gde je &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; ID trenutne niti, &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; trenutna iteracija petlje, &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; prethodno slučajno generisan broj, a &amp;lt;code&amp;gt;res&amp;lt;/code&amp;gt; povratna vrednost &amp;lt;code&amp;gt;allOlderSiblings()&amp;lt;/code&amp;gt; metode za tekuću nit.&lt;br /&gt;
*Takođe dodati semafor koji u svakoj iteraciji deteta uspavljuje dete na random vreme od &amp;lt;code&amp;gt;50&amp;lt;/code&amp;gt; do &amp;lt;code&amp;gt;250ms&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int userMain(int argc, char** argv) {&lt;br /&gt;
  for(int i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
    int pid = Thread::fork();&lt;br /&gt;
    if(pid) continue;&lt;br /&gt;
    Semaphore sleeper(0);&lt;br /&gt;
    int num_iter = 3 + (rand() % 8);&lt;br /&gt;
    for(int j = 0; j &amp;lt; num_iter; j++) {&lt;br /&gt;
      intLock&lt;br /&gt;
      cout &amp;lt;&amp;lt; &amp;quot;Thread &amp;quot; &amp;lt;&amp;lt; Thread::getRunningId() &amp;lt;&amp;lt; &amp;quot;: &amp;quot; &amp;lt;&amp;lt; j &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; num_iter &amp;lt;&amp;lt; &amp;quot; allOlderSiblings = &amp;quot; &amp;lt;&amp;lt; (Thread::getThreadById(Thread::getRunningId))-&amp;gt;allOlderSiblings() &amp;lt;&amp;lt; endl;&lt;br /&gt;
      intUnlock&lt;br /&gt;
      sleeper.wait(1 + (rand() % 5));&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;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</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_2021&amp;diff=2944</id>
		<title>ОС1/Модификације август 2021</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_2021&amp;diff=2944"/>
		<updated>2021-09-20T17:01:07Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: nisam video ovo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Sledeće modifikacije su se pojavile na odbrani projekta u avgustovskom roku 2021.&lt;br /&gt;
&lt;br /&gt;
== 30 poena ==&lt;br /&gt;
* U klasi Thread dodati nestatičku metodu &amp;lt;code&amp;gt;int allOlderSiblings()&amp;lt;/code&amp;gt; koja vraća broj nezavršene starije braće trenutne niti. Ukoliko nit nije nastala fork()-om, metoda vraća -1.&lt;br /&gt;
* Nit &#039;&#039;A&#039;&#039; je stariji brat niti &#039;&#039;B&#039;&#039; ako su i nit &#039;&#039;A&#039;&#039; i nit &#039;&#039;B&#039;&#039; nastale forkovanjem iste niti ali je &#039;&#039;A&#039;&#039; nastala pre &#039;&#039;B&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Napisati test primer na sledeći način:&lt;br /&gt;
*Forkom napraviti 5 dece a zatim u svakom detetu generisati slučajan broj &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; (od 3 do 10) i u petlji koja iterira &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; puta ispisivati sledeću poruku: &amp;quot;&amp;lt;code&amp;gt;Thread id: x/num_iter allOlderSiblings: res&amp;lt;/code&amp;gt;&amp;quot; gde je &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; ID trenutne niti, &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; trenutna iteracija petlje, &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; prethodno slučajno generisan broj, a &amp;lt;code&amp;gt;res&amp;lt;/code&amp;gt; povratna vrednost &amp;lt;code&amp;gt;allOlderSiblings()&amp;lt;/code&amp;gt; metode za tekuću nit.&lt;br /&gt;
*Takođe dodati semafor koji u svakoj iteraciji deteta uspavljuje dete na random vreme od &amp;lt;code&amp;gt;50&amp;lt;/code&amp;gt; do &amp;lt;code&amp;gt;250ms&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int userMain(int argc, char** argv) {&lt;br /&gt;
  for(int i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
    int pid = Thread::fork();&lt;br /&gt;
    if(pid) continue;&lt;br /&gt;
    Semaphore sleeper(0);&lt;br /&gt;
    int num_iter = 3 + (rand() % 8);&lt;br /&gt;
    for(int j = 0; j &amp;lt; num_iter; j++) {&lt;br /&gt;
      intLock&lt;br /&gt;
      cout &amp;lt;&amp;lt; &amp;quot;Thread &amp;quot; &amp;lt;&amp;lt; Thread::getRunningId() &amp;lt;&amp;lt; &amp;quot;: &amp;quot; &amp;lt;&amp;lt; j &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; num_iter &amp;lt;&amp;lt; &amp;quot; allOlderSiblings = &amp;quot; &amp;lt;&amp;lt; (Thread::getThreadById(Thread::getRunningId))-&amp;gt;allOlderSiblings() &amp;lt;&amp;lt; endl;&lt;br /&gt;
      intUnlock&lt;br /&gt;
      sleeper.wait(1 + (rand() % 5));&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;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</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_2021&amp;diff=2943</id>
		<title>ОС1/Модификације август 2021</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_2021&amp;diff=2943"/>
		<updated>2021-09-20T16:58:23Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: mala latinizacija&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Sledeće modifikacije su se pojavile na odbrani projekta u avgustovskom roku 2021.&lt;br /&gt;
&lt;br /&gt;
== 30 poena ==&lt;br /&gt;
* U klasi Thread dodati nestatičku metodu &amp;lt;code&amp;gt;int allOlderSiblings()&amp;lt;/code&amp;gt; koja vraća broj nezavršene starije braće trenutne niti. Ukoliko nit nije nastala fork()-om, metoda vraća -1.&lt;br /&gt;
* Nit &#039;&#039;A&#039;&#039; je stariji brat niti &#039;&#039;B&#039;&#039; ako su i nit &#039;&#039;A&#039;&#039; i nit &#039;&#039;B&#039;&#039; nastale forkovanjem iste niti ali je &#039;&#039;A&#039;&#039; nastala pre &#039;&#039;B&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Napisati test primer na sledeći način:&lt;br /&gt;
*Forkom napraviti 5 dece a zatim u svakom detetu generisati slučajan broj &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; (od 3 do 10) i u petlji koja iterira &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; puta ispisivati sledeću poruku: &amp;quot;&amp;lt;code&amp;gt;Thread id: x/num_iter allOlderSiblings: res&amp;lt;/code&amp;gt;&amp;quot; gde je &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; ID trenutne niti, &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; trenutna iteracija petlje, &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; prethodno slučajno generisan broj, a &amp;lt;code&amp;gt;res&amp;lt;/code&amp;gt; povratna vrednost &amp;lt;code&amp;gt;allOlderSiblings()&amp;lt;/code&amp;gt; metode za tekuću nit.&lt;br /&gt;
*Takođe dodati semafor koji u svakoj iteraciji deteta uspavljuje dete na random vreme od &amp;lt;code&amp;gt;50&amp;lt;/code&amp;gt; do &amp;lt;code&amp;gt;250ms&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int userMain(int argc, char** argv) {&lt;br /&gt;
  for(int i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
    int pid = Thread::fork();&lt;br /&gt;
    if(pid) continue;&lt;br /&gt;
    Semaphore sleeper(0);&lt;br /&gt;
    int num_iter = 3 + (rand() % 8);&lt;br /&gt;
    for(int j = 0; j &amp;lt; num_iter; j++) {&lt;br /&gt;
      intLock&lt;br /&gt;
      cout &amp;lt;&amp;lt; &amp;quot;Thread &amp;quot; &amp;lt;&amp;lt; Thread::getRunningId() &amp;lt;&amp;lt; &amp;quot;: &amp;quot; &amp;lt;&amp;lt; j &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; num_iter &amp;lt;&amp;lt; &amp;quot; allOlderSiblings = &amp;quot; &amp;lt;&amp;lt; (Thread::getThreadById(Thread::getRunningId))-&amp;gt;allOlderSiblings() &amp;lt;&amp;lt; endl;&lt;br /&gt;
      intUnlock&lt;br /&gt;
      sleeper.wait(1 + (rand() % 5));&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;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</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_2021&amp;diff=2942</id>
		<title>ОС1/Модификације август 2021</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_2021&amp;diff=2942"/>
		<updated>2021-09-20T16:57:29Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: августовска модификација од 30п&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Sledeće modifikacije su se pojavile na odbrani projekta u avgustovskom roku 2021.&lt;br /&gt;
&lt;br /&gt;
== 30 поена ==&lt;br /&gt;
* U klasi Thread dodati nestatičku metodu &amp;lt;code&amp;gt;int allOlderSiblings()&amp;lt;/code&amp;gt; koja vraća broj nezavršene starije braće trenutne niti. Ukoliko nit nije nastala fork()-om, metoda vraća -1.&lt;br /&gt;
* Nit &#039;&#039;A&#039;&#039; je stariji brat niti &#039;&#039;B&#039;&#039; ako su i nit &#039;&#039;A&#039;&#039; i nit &#039;&#039;B&#039;&#039; nastale forkovanjem iste niti ali je &#039;&#039;A&#039;&#039; nastala pre &#039;&#039;B&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Napisati test primer na sledeći način:&lt;br /&gt;
*Forkom napraviti 5 dece a zatim u svakom detetu generisati slučajan broj &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; (od 3 do 10) i u petlji koja iterira &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; puta ispisivati sledeću poruku: &amp;quot;&amp;lt;code&amp;gt;Thread id: x/num_iter allOlderSiblings: res&amp;lt;/code&amp;gt;&amp;quot; gde je &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; ID trenutne niti, &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; trenutna iteracija petlje, &amp;lt;code&amp;gt;num_iter&amp;lt;/code&amp;gt; prethodno slučajno generisan broj, a &amp;lt;code&amp;gt;res&amp;lt;/code&amp;gt; povratna vrednost &amp;lt;code&amp;gt;allOlderSiblings()&amp;lt;/code&amp;gt; metode za tekuću nit.&lt;br /&gt;
*Takođe dodati semafor koji u svakoj iteraciji deteta uspavljuje dete na random vreme od &amp;lt;code&amp;gt;50&amp;lt;/code&amp;gt; do &amp;lt;code&amp;gt;250ms&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int userMain(int argc, char** argv) {&lt;br /&gt;
  for(int i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
    int pid = Thread::fork();&lt;br /&gt;
    if(pid) continue;&lt;br /&gt;
    Semaphore sleeper(0);&lt;br /&gt;
    int num_iter = 3 + (rand() % 8);&lt;br /&gt;
    for(int j = 0; j &amp;lt; num_iter; j++) {&lt;br /&gt;
      intLock&lt;br /&gt;
      cout &amp;lt;&amp;lt; &amp;quot;Thread &amp;quot; &amp;lt;&amp;lt; Thread::getRunningId() &amp;lt;&amp;lt; &amp;quot;: &amp;quot; &amp;lt;&amp;lt; j &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; num_iter &amp;lt;&amp;lt; &amp;quot; allOlderSiblings = &amp;quot; &amp;lt;&amp;lt; (Thread::getThreadById(Thread::getRunningId))-&amp;gt;allOlderSiblings() &amp;lt;&amp;lt; endl;&lt;br /&gt;
      intUnlock&lt;br /&gt;
      sleeper.wait(1 + (rand() % 5));&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;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2015&amp;diff=2941</id>
		<title>ОС1/Септембар 2015</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2015&amp;diff=2941"/>
		<updated>2021-09-20T16:42:58Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2015/sep/Sep%202015.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Prvi  interaktivni  računarski  sistemi  uveli  su  jednu  značajnu  novinu  u  operativne  sisteme. Koja je to novina? Objasniti ukratko njenu suštinu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Novina koja je uvedena je multiprogramiranje. Suština multiprogramiranja je mogućnost izvršavanja uporedo više provesa na jednom procesoru. Dok jedan proces čeka na izvršenje I/O operacije, procesor izvršava druge poslove.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem  standardnih  bibliotečnih  funkcija  &amp;lt;code&amp;gt;setjmp()&amp;lt;/code&amp;gt;  i  &amp;lt;code&amp;gt;longjmp()&amp;lt;/code&amp;gt;,  u  školskom  jezgru implementirati operaciju &amp;lt;code&amp;gt;yield(Thread* old, Thread* new)&amp;lt;/code&amp;gt; koja prebacuje kontekst izvršavanja sa jedne (&amp;lt;code&amp;gt;old&amp;lt;/code&amp;gt;) na drugu (&amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) nit. &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 yield(Thread* old, Thread* new) {&lt;br /&gt;
	if(setjmp(old-&amp;gt;context) == 0)&lt;br /&gt;
		longjmp(new-&amp;gt;context, 1);&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;
Кorišćenjem školskog jezgra, napraviti nit koja se inicijalizuje celobrojnim parametrom &#039;&#039;n&#039;&#039; i koja kreira jednu istu takvu nit-dete, ova nit-dete kreira jednu svoju nit-dete, i tako dalje, rekurzivno, ali tako da ukupno bude kreirano &#039;&#039;n&#039;&#039; niti.&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;
class myThread : public Thread {&lt;br /&gt;
	public:&lt;br /&gt;
		myThread(int val) {&lt;br /&gt;
			n = val;&lt;br /&gt;
			start();&lt;br /&gt;
		}&lt;br /&gt;
	protected:&lt;br /&gt;
		void run() {&lt;br /&gt;
			if(n &amp;lt;= 0) return;&lt;br /&gt;
			else new myThread(n - 1);&lt;br /&gt;
		}&lt;br /&gt;
	private:&lt;br /&gt;
		int n;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dato je jedno moguće rešenje za međusobno isključenje dva procesa uposlenim čekanjem. Da li ovo rešenje obezbeđuje međusobno isključenje? Da li ima neki drugi problem?&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
shared var turn : integer = 1; &lt;br /&gt;
process P1      				 process P2 &lt;br /&gt;
begin     						 begin &lt;br /&gt;
  loop       					 	loop     &lt;br /&gt;
    while turn = 2 do null end;  		while turn = 1 do null end; &lt;br /&gt;
    &amp;lt;critical section&amp;gt;        			&amp;lt;critical section&amp;gt; &lt;br /&gt;
    turn := 2;        					turn := 1; &lt;br /&gt;
    &amp;lt;non-critical section&amp;gt;      		&amp;lt;non-critical section&amp;gt; &lt;br /&gt;
  end        					 	end &lt;br /&gt;
end P1;     					 end P2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Rešenje obezbeđuje međusobno isključenje ali je problem stroga naizmeničnost što je suvišna sinhronizacija.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta znači kad je proces &#039;&#039;swapped out&#039;&#039;? &lt;br /&gt;
&lt;br /&gt;
Ako je proces swapped out, u kom stanju se od sledećih on nalazi? &lt;br /&gt;
# created &lt;br /&gt;
# ready &lt;br /&gt;
# running &lt;br /&gt;
# suspended &lt;br /&gt;
# terminated &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Swapped out proces je proces koji je bio izbačen iz memorije i upisan na disk kako bi se u memoriju učitao neki drugi koji se ubacuje memoriju.&lt;br /&gt;
&lt;br /&gt;
Nalazi se u &#039;&#039;suspended&#039;&#039; stanju kada se swap-out-uje.&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;
{{delimično rešeno}}&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;
page: 4KB -&amp;gt; 12b&lt;br /&gt;
&lt;br /&gt;
VA(32) : page1(10) : page2(10) : offset(12)&lt;br /&gt;
&lt;br /&gt;
pmt1_size = 2^10 * 4B = 4KB&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kojom tehnikom se nedeljivi uređaj može učiniti virtuelno deljivim?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Spooling-om.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U  nekom  sistemu  simbol  &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  označava  tekući,  a  &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; roditeljski  direktorijum.  Koja  od  sledećih naredbi  (svaka  se izvršava uspešno) &#039;&#039;sigurno neće&#039;&#039; promeniti tekući direktorijum? (Zaokružiti jedan ili više tačnih odgovora.) &lt;br /&gt;
# &amp;lt;code&amp;gt;cd ./../../x/y/z&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;cd ./x/y/z/../..&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;cd ./../../../x/y/z&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;cd ./x/y/z/../../..&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
4. naredba sigurno neće promeniti tekući direktorijum.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki  fajl  sistem  primenjuje  FAT  za  alokaciju  sadržaja  fajla.  FAT  je  cela  keširana  u memoriji, na nju ukazuje pokazivač &amp;lt;code&amp;gt;fat&amp;lt;/code&amp;gt;, i ima &amp;lt;code&amp;gt;FATSIZE&amp;lt;/code&amp;gt; ulaza tipa &amp;lt;code&amp;gt;unsigned&amp;lt;/code&amp;gt;. Prilikom ulančavanja blokova sa sadržajem fajla, &#039;&#039;null&#039;&#039; vrednost se označava vrednošću 0 u odgovarajućem ulazu u FAT, dok  se  slobodni  blokove  ne  ulančavaju  posebno,  već  su  njima  odgovarajući  ulazi  u  FAT  označeni vrednostima  &amp;lt;code&amp;gt;~0U&amp;lt;/code&amp;gt;  (sve  jedinice  binarno);  blokovi  broj  0  i  broj  &amp;lt;code&amp;gt;~0U&amp;lt;/code&amp;gt;  se  ne  koriste  u  fajl  sistemu.  U FCB polje &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; tipa &amp;lt;code&amp;gt;unsigned&amp;lt;/code&amp;gt; sadrži broj prvog bloka sa sadržajem fajla (0 ako je sadržaj prazan). Napisati kod kojim se oslobađaju svi blokovi sa sadržajem fajla.&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 clearAll(FCB* file) {&lt;br /&gt;
	if(file == 0 || file-&amp;gt;sizeInBlocks == 0 || file-&amp;gt;head == 0) return;&lt;br /&gt;
	while(file-&amp;gt;head) {&lt;br /&gt;
		auto tmp = file-&amp;gt;head;&lt;br /&gt;
		file-&amp;gt;head = file-&amp;gt;head-&amp;gt;next;&lt;br /&gt;
		tmp-&amp;gt;value = ~0U;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2013&amp;diff=2940</id>
		<title>ОС1/Септембар 2013</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2013&amp;diff=2940"/>
		<updated>2021-09-20T16:41:42Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2013/sep/Sep%202013.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta  je  bio osnovni  motiv  uvođenja  multiprogramiranja  u  do tada paketne računarske sisteme?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovo pitanje pojavilo se na septembarskom roku 2011. godine kao 1. pitanje.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih bibliotečnih funkcija &amp;lt;code&amp;gt;setjmp()&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;longjmp()&amp;lt;/code&amp;gt;, realizovati operaciju &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void yield(jmp_buf old, jmp_buf new);&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
koja čuva kontekst niti čiji je &amp;lt;code&amp;gt;jmp_buf&amp;lt;/code&amp;gt; dat kao prvi argument, oduzima joj procesor i restaurira kontekst niti čiji je &amp;lt;code&amp;gt;jmp_buf&amp;lt;/code&amp;gt; dat kao drugi argument, kojoj predaje procesor. &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 yield(jmp_buf old, jmp_buf new) {&lt;br /&gt;
	if(setjmp(old) == 0) {&lt;br /&gt;
		longjmp(new, 1);	&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;
Korišćenjem  sistemskih  poziva &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;execlp()&amp;lt;/code&amp;gt; napisati program &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt; koji, kada se pokrene kao proces, kreira procese-decu nad svim programima koji se nalaze u fajlovima čija su imena data argumentima programa &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt; (npr. &amp;lt;code&amp;gt;run p1.exe p2.exe p3.exe&amp;lt;/code&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;
int main(int argc, char* argv[]) {&lt;br /&gt;
	for(int i = 1; i &amp;lt; argc; i++) {&lt;br /&gt;
		int pid = fork();&lt;br /&gt;
		if(pid == 0) {&lt;br /&gt;
			execlp(argv[i]);&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		else if(pid &amp;lt; 0)&lt;br /&gt;
			return -2;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora, napisati kod za inicijalizaciju i potrebnu sinhronizaciju između dva procesa koji u svoje kritične sekcije treba da ulaze strogo naizmeničn&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
var semA : Semaphore := 1;&lt;br /&gt;
	semB : Semaphore := 0;&lt;br /&gt;
&lt;br /&gt;
process A:&lt;br /&gt;
	begin&lt;br /&gt;
		loop&lt;br /&gt;
			wait(semA);&lt;br /&gt;
			&amp;lt;critical&amp;gt;&lt;br /&gt;
			signal(semB);&lt;br /&gt;
			&amp;lt;non-critical&amp;gt;&lt;br /&gt;
	end&lt;br /&gt;
end A;&lt;br /&gt;
&lt;br /&gt;
process B:&lt;br /&gt;
	begin&lt;br /&gt;
		loop&lt;br /&gt;
			wait(semB);&lt;br /&gt;
			&amp;lt;critical&amp;gt;&lt;br /&gt;
			signal(semA);&lt;br /&gt;
			&amp;lt;non-critical&amp;gt;&lt;br /&gt;
	end&lt;br /&gt;
end B;&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;
Preklopi ne zahtevaju podršku OS-a. Sve obavlja prevodilac i generisani kod. OS samo obezbeđuje usluge za alokaciju dela virtuelnog adresnog prostora.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako  je  učestanost  pogotka  u  TLB  90%,  a  vreme  pristupa  TLB  iznosi  20%  od  vremena pristupa  fizičkoj  memoriji,  koliko  (procentualno)  je  duže  efektivno  vreme  pristupa  virtuelnoj memoriji u odnosu na pristup fizičkoj memoriji kod straničenja u dva nivoa?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
0.9 * ( 0.2t_ram + t_ram) + 0.1 * ( 0.2t_ram + 3t_ram) = 1.49 t_ram&lt;br /&gt;
&lt;br /&gt;
Odnos: 49%&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je svrha tehnike &#039;&#039;copy-on-write&#039;&#039; kod stranične organizacije virtuelne memorije? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Služi sa uštedu memorije koja bi se bespotrebno trošila sve dok jedan od procesa ne zatraži promenu te stranice kada se alocira nova stranica i kopira se sadržaj. Ukoliko više procesa dele istu stranicu, samo će onaj koji je napravio izmenu dobiti novu stranicu dok će ostali nastaviti da dele istu stranicu.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koja je razlika između sinhronog i asinhronog slanja podataka na izlazni uređaj? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Sinhronim slanjem podataka proces zadaje operaciju i po potrebi se suspenduje i nastavlja tek kada se zahtevana operacija završi.&lt;br /&gt;
Kod asinhronog poziva pozivajući proces samo zadaje operaciju i nastavlja izvršavanje.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U  nekom  fajl  sistemu  u  sistemskom  pozivu  za  otvaranje  fajla  proces  navodi  da  li  će  fajl samo čitati ili ga i na bilo koji način menjati. U zavisnosti od toga, taj  sistemski  poziv  zaključava fajl sa jednim  od dve vrste ključa.  Ako  se  fajl  otvara  samo  za čitanje,  fajl  se  zaključava deljenim ključem; ako se fajl otvara za izmenu, zaključava se ekskluzivnim ključem. Ukoliko poziv ne može da se izvrši zbog toga što ključ ne može da se dobije, poziv se otkazuje bez izmena u fajl sistemu i vraća se greška. &lt;br /&gt;
&lt;br /&gt;
Procesi  A,  B,  C  i  D  izvršavaju  sistemske  pozive  otvaranja  i  zatvaranja  istog  fajla  u  sledećem redosledu (neki proces izvršava poziv zatvaranja fajla samo ako ga je uspešno otvorio): &lt;br /&gt;
&lt;br /&gt;
# A: open(READ) &lt;br /&gt;
# B: open(WRITE) &lt;br /&gt;
# C: open(READ) &lt;br /&gt;
# A: close &lt;br /&gt;
# C: close &lt;br /&gt;
# D: open(WRITE) &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Uspešno: 1, 2, 4, 5, 6&lt;br /&gt;
&lt;br /&gt;
Neuspešno: 3&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je najveći nedostatak organizacije fajl sistema pomoću FAT?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Veoma velika osetljivost na otkaze. Bilo kakvo oštećenje u FAT uzrokuje štetu. Moguće je uništiti ceo fajlsistem.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2011&amp;diff=2939</id>
		<title>ОС1/Септембар 2011</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2011&amp;diff=2939"/>
		<updated>2021-09-20T16:40:58Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: средити 10. задатак&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2011/septembar/Sep%202011.doc Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti osnovni motiv nastanka koncepta multiprogramiranja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kod monoprocesnih računara uz sporu obradu i spore ulazno-izlazne uređaje, izvršavanje samog programa i iskorišćenje procesora je bilo slabo. Rešenje (multiprogramiranje) ogleda se u učitavanju više procesa u operativnu memoriju i njihovom uporedom izvršavanju. Dok jedan proces čeka na završetak I/O operacije, procesor može da izvršava instrukcije nekog drugog procesa.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Zašto nije dobro koristiti uposleno čekanje u prekidnoj rutini?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Dok se ne završi uposleno čekanje neće biti moguće promeniti kontekst jer se interrupt bit setuje na 0 pri ulasku u prekidnu rutinu. Pošto se kontekst neće moći promeniti, ceo sistem će ostati blokiran tu (ako se koristi jednoprocesorski sistem). Prekidna rutina takođe treba da bude što kraća da bi sistem imao što bolji &amp;quot;osećaj&amp;quot; o vremenu.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na jeziku C, korišćenjem sistemskih poziva &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;execlp()&amp;lt;/code&amp;gt; za Unix, napisati program koji pokreće drugi program iz fajla čiji je naziv zadat kao parametar komandne linije prvog programa.&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;
int main(int argc, char* argv[]) {&lt;br /&gt;
	if(argc &amp;lt; 2)&lt;br /&gt;
		return -1;&lt;br /&gt;
	&lt;br /&gt;
	pid_t pid = fork();&lt;br /&gt;
	&lt;br /&gt;
	if(pid &amp;lt; 0)&lt;br /&gt;
		return -2;&lt;br /&gt;
	else if(pid == 0)&lt;br /&gt;
		execlp(argv[1]);&lt;br /&gt;
	else wait(0);&lt;br /&gt;
	&lt;br /&gt;
	return 0;&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora u školskom jezgru, na jeziku C++ napisati globalne deklaracije i inicijalizacije, kao i kod tela dve uporedne niti A i B koje ciklično rade sledeće:&lt;br /&gt;
&lt;br /&gt;
A: upisuje vrednost u deljene promenljive x i y, a zatim čeka da proces B upiše zbir x i y u promenljivu z čiju vrednost ispisuje na standardni izlaz;&lt;br /&gt;
&lt;br /&gt;
B: čeka da proces A upiše vrednosti u deljene promenljive x i y, zatim ove dve vrednosti sabira i zbir upisuje u deljenu promenljivu z.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
Semaphore xySem(0), zSem(0);&lt;br /&gt;
int x, y, z;&lt;br /&gt;
&lt;br /&gt;
//A:&lt;br /&gt;
while(1) {&lt;br /&gt;
	x = ...;&lt;br /&gt;
	y = ...;&lt;br /&gt;
	xySem.signal();&lt;br /&gt;
	zSem.wait();&lt;br /&gt;
	cout &amp;lt;&amp;lt; z;&lt;br /&gt;
}&lt;br /&gt;
//B:&lt;br /&gt;
while(1) {&lt;br /&gt;
	xySem.wait();&lt;br /&gt;
	z = x + y;&lt;br /&gt;
	zSem.signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Zašto preklopi (&#039;&#039;overlays&#039;&#039;) ne mogu da se koriste ako program ima više niti koje obezbeđuje operativni sistem? Precizno objasniti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Preklopi se realizuju bez podrške bilo kakve interakcije sa OS, tako što se na ulasku u određeni potprogram koji je alociran u neki preklop, prevodilac generiše kod koji proverava da li je taj kod učitan u preklop i učitava ga ako nije. Ako program koristi niti koje obezbeđuje OS, sistem održavanja preklopa (u odgovornosti programa) i promene konteksta niti (u odgovornosti OS) nemaju interakciju i ne znaju jedan za drugog.&lt;br /&gt;
Može se dogoditi sledeće:&lt;br /&gt;
*jedna nit uđe u izvršavanje nekog potprograma P koji pripada jednom preklopu, proveri i po potrebi učita kod za taj potprogram u preklop X.&lt;br /&gt;
*OS izvršava promenu konteksta niti i pokrene drugu nit&lt;br /&gt;
*ova druga nit ulazi u potprogram Q koji pripada drugom preklopu&lt;br /&gt;
*sistem preklopa učitava preklop kome pripada Q na mesto X&lt;br /&gt;
*ponovo dođe do promene konteksta i prva nit nastavi od adrese koju očekuje (potprogram P) ali se tu nalazi kod potprograma Q.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Potrebno je u nekoj strukturi podataka voditi evidenciju o slobodnim fragmentima memorije kod kontinualne alokacije sa &#039;&#039;best fit&#039;&#039; algoritmom. Koja struktura podataka je efikasnija za implementaciju operacije dealokacije segmenta memorije koju je zauzimao ugašeni proces: &lt;br /&gt;
&lt;br /&gt;
a) dvostruko ulančana lista slobodnih fragmenata uređenih po veličini ili &lt;br /&gt;
&lt;br /&gt;
b) dvostruko ulančana lista slobodnih fragmenata uređenih po poziciji u memoriji. &lt;br /&gt;
&lt;br /&gt;
Kratko obrazložiti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Lista slobodnih fragmenata uređenih po poziciji u memoriji je efikasnija zato što ako se dealocira, veća je verovatnoća da će fragmenti biti jedni pored drugih. Uređenje po veličini može značiti da treba proći čitavu listu u potrazi za fragmentima.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kojom tehnikom se nedeljivi uređaj može učiniti virtuelno deljivim?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tehnikom pod imenom spooling.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U fajl podsistemu nekog operativnog sistema ne vodi se tabela otvorenih fajlova za svaki proces, već postoji samo jedna globalna tabela otvorenih fajlova za ceo sistem. Drugim rečima, ne postoji nikakva informacija o upotrebi otvorenog fajla lokalna (privatna) za pojedinačni proces, već su sve takve informacije globalno deljene. Da li pojam pokazivača trenutne lokacije (kurzora) za čitanje/upis u fajl ima smisla čuvati u globalnoj tabeli otvorenih fajlova i zašto?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Nema smisla jer će svaki proces imati različitu vrednost ovog kurzora.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dati procenu kompleksnosti u najgorem slučaju datih operacija sa direktorijumom u odnosu na broj postojećih fajlova n u direktorijumu, za navedene implementacije direktorijuma.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
#Hash tabela sa dvostruko ulančanim listama za rešavanje kolizija: &lt;br /&gt;
#*Pronalaženje ulaza sa datim imenom - O(n)&lt;br /&gt;
#*Brisanje pronađenog ulaza (ne računajući pronalaženje po imenu) - O(1)&lt;br /&gt;
#Dvostruko ulančana lista sa pokazivačima na glavu i rep liste:&lt;br /&gt;
#*Pronalaženje ulaza sa datim imenom - O(n)&lt;br /&gt;
#*Brisanje pronađenog ulaza (ne računajući pronalaženje po imenu) - O(1)&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki fajl sistem koristi indeksirani pristup alokaciji fajlova sa indeksima u dva nivoa, blokom veličine 512KB i 64-bitnim adresama fizičkih blokova. Kolika je maksimalna veličina fajla u ovom sistemu?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
512KB / 8B = 64K ulaza = 2^16&lt;br /&gt;
&lt;br /&gt;
Maksimalna veličina je 2^16 * 2^16 * 512KB = 2^51B = 2PB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2012&amp;diff=2938</id>
		<title>ОС1/Септембар 2012</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2012&amp;diff=2938"/>
		<updated>2021-09-20T16:40:54Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: средити 10. задатак&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2012/septembar/Septembar%202012.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kod kakvih sistema se najpre pojavljuje &#039;&#039;time sharing&#039;&#039; i sa kakvim motivom?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Time sharing se najpre pojavljuje kod interaktivnih višekorisničkih sistema. Motiv je da se postigne ravnomerniji odziv na akcije više korisnika nego bez time sharing-a.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem funkcija &amp;lt;code&amp;gt;setjmp&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;longjmp&amp;lt;/code&amp;gt; iz standardne C biblioteke realizovati operaciju &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; na binarnom semaforu u školskom jezgru&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јул 2012#2. zadatak|julskog roka 2012]].&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem sistemskih poziva &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;execlp()&amp;lt;/code&amp;gt; napisati program &#039;&#039;P&#039;&#039; koji pokreće proces nad programom u fajlu čiji je naziv zadat kao argument izvršavanja programa &#039;&#039;P&#039;&#039;. &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;
int main(int argc, char* argv[]) {&lt;br /&gt;
	if(argc &amp;lt; 2) return -1;&lt;br /&gt;
	pid_t pid = fork();&lt;br /&gt;
	if(pid &amp;lt; 0) return -2;&lt;br /&gt;
	if(pid == 0) {&lt;br /&gt;
		execlp(argv[1]);&lt;br /&gt;
		return -3;&lt;br /&gt;
	}&lt;br /&gt;
	else wait(0);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Proces &#039;&#039;P&#039;&#039; treba da sačeka da sva tri procesa &#039;&#039;X&#039;&#039;, &#039;&#039;Y&#039;&#039; i &#039;&#039;Z&#039;&#039; ispune neki svoj uslov, u bilo kom redosledu. Napisati deo koda procesa &#039;&#039;P&#039;&#039; i bilo kog od druga tri procesa, uz potrebne deklaracije, koji obezbeđuju ovu uslovnu sinhronizaciju pomoću jednog standardnog brojačkog semafora.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Фебруар 2012#4. zadatak|februarskog roka 2012]].&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koja dva podatka čine memorijski kontekst procesa kod kontinualne alokacije memorije za proces sa dinamičkim preslikavanjem adresa? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelni  adresni  prostor  sistema  je  8GB,  adresibilna jedinica  je  16-bitna reč,  a  virtuelni adresni  prostor  je  organizovan stranično sa stranicom veličine 32KB.  Fizički  adresni  prostor  je veličine 2GB.  Tabele  preslikavanja  stranica  su  organizovane u  dva  nivoa,  s  tim  da  tabela  drugog nivoa ima 1K ulaza. Ako deskriptori u PMT i prvog i drugog nivoa sadrže samo broj okvira u koji se stranica preslikava i ništa više (posebna vrednost označava da preslikavanje nije moguće), koliko bajtova zauzima jedna PMT prvog, a koliko drugog nivoa?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Zaokružiti slovo ispred one ili onih podataka koji &#039;&#039;nisu&#039;&#039; neophodni  u  deskriptoru  stranice  u PMT koji koristi hardver za preslikavanje adresa kod virtuelne memorije: &lt;br /&gt;
#Informacija da preslikavanje nije moguće izvršiti&lt;br /&gt;
#Adresa bloka na disku u kome se nalazi stranica &lt;br /&gt;
#Informacija da je stranica deljena sa drugim procesom tehnikom copy-on-write &lt;br /&gt;
#Informacija da je stranica zabranjena za izbacivanje jer se koristi kao I/O bafer &lt;br /&gt;
#Da li je dozvoljen upis u stranicu &lt;br /&gt;
#Broj okvira u koji se stranica preslikava.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati program koji prenosi blok podataka zadate dužine na zadatu adresu sa ulaznog uređaja korišćenjem programiranog ulaza/izlaza sa prozivanjem (&#039;&#039;polling&#039;&#039;).  na  izlazni uređaj korišćenjem programiranog ulaza/izlaza sa prekidom.&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;
main:	LD R1, blockAddr&lt;br /&gt;
		LD R2, cnt&lt;br /&gt;
		ST [ctrl], #0..1&lt;br /&gt;
wait:	LD R0, [status]&lt;br /&gt;
		AND R0, #1..0&lt;br /&gt;
		JZ wait&lt;br /&gt;
		LD R0, [data]&lt;br /&gt;
		INC R1&lt;br /&gt;
		DEC R2&lt;br /&gt;
		JNZ wait&lt;br /&gt;
		ST [ctrl], #0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U  fajl  podsistemu  nekog  operativnog  sistema  ne  vodi  se  tabela  otvorenih  fajlova  za  svaki proces, već postoji samo jedna globalna tabela otvorenih fajlova za ceo sistem. Drugim rečima, ne postoji nikakva informacija o upotrebi otvorenog fajla lokalna (privatna) za pojedinačni proces, već su sve takve informacije globalno deljene. Kako treba da izgleda API funkcija za čitanje bloka podataka dužine &amp;lt;code&amp;gt;len&amp;lt;/code&amp;gt;  iz nekog fajla, da bi se procesu obezbedila mogućnost sekvencijalnog čitanja svih podataka iz fajla? &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;
IOStatus readFile(FHANDLE fh, void* buffer, long len, long offset);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se disk kapaciteta 80MB i blokom veličine 1KB. Ako se za evidenciju slobodnog prostora  koristi  bit-vektor sa maksimalnom kompakcijom (svih 8 bita u bajtu su iskorišćeni itd.), koliko celih blokova treba zauzeti na disku za smeštanje ovog vektora? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
80MB / 1KB = 80K blokova&lt;br /&gt;
&lt;br /&gt;
80K / 8b/B = 10KB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2013&amp;diff=2937</id>
		<title>ОС1/Септембар 2013</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2013&amp;diff=2937"/>
		<updated>2021-09-20T16:40:52Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: средити 6. задатак&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2013/sep/Sep%202013.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta  je  bio osnovni  motiv  uvođenja  multiprogramiranja  u  do tada paketne računarske sisteme?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovo pitanje pojavilo se na septembarskom roku 2011. godine kao 1. pitanje.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih bibliotečnih funkcija &amp;lt;code&amp;gt;setjmp()&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;longjmp()&amp;lt;/code&amp;gt;, realizovati operaciju &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void yield(jmp_buf old, jmp_buf new);&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
koja čuva kontekst niti čiji je &amp;lt;code&amp;gt;jmp_buf&amp;lt;/code&amp;gt; dat kao prvi argument, oduzima joj procesor i restaurira kontekst niti čiji je &amp;lt;code&amp;gt;jmp_buf&amp;lt;/code&amp;gt; dat kao drugi argument, kojoj predaje procesor. &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 yield(jmp_buf old, jmp_buf new) {&lt;br /&gt;
	if(setjmp(old) == 0) {&lt;br /&gt;
		longjmp(new, 1);	&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;
Korišćenjem  sistemskih  poziva &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;execlp()&amp;lt;/code&amp;gt; napisati program &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt; koji, kada se pokrene kao proces, kreira procese-decu nad svim programima koji se nalaze u fajlovima čija su imena data argumentima programa &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt; (npr. &amp;lt;code&amp;gt;run p1.exe p2.exe p3.exe&amp;lt;/code&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;
int main(int argc, char* argv[]) {&lt;br /&gt;
	for(int i = 1; i &amp;lt; argc; i++) {&lt;br /&gt;
		int pid = fork();&lt;br /&gt;
		if(pid == 0) {&lt;br /&gt;
			execlp(argv[i]);&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		else if(pid &amp;lt; 0)&lt;br /&gt;
			return -2;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora, napisati kod za inicijalizaciju i potrebnu sinhronizaciju između dva procesa koji u svoje kritične sekcije treba da ulaze strogo naizmeničn&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
var semA : Semaphore := 1;&lt;br /&gt;
	semB : Semaphore := 0;&lt;br /&gt;
&lt;br /&gt;
process A:&lt;br /&gt;
	begin&lt;br /&gt;
		loop&lt;br /&gt;
			wait(semA);&lt;br /&gt;
			&amp;lt;critical&amp;gt;&lt;br /&gt;
			signal(semB);&lt;br /&gt;
			&amp;lt;non-critical&amp;gt;&lt;br /&gt;
	end&lt;br /&gt;
end A;&lt;br /&gt;
&lt;br /&gt;
process B:&lt;br /&gt;
	begin&lt;br /&gt;
		loop&lt;br /&gt;
			wait(semB);&lt;br /&gt;
			&amp;lt;critical&amp;gt;&lt;br /&gt;
			signal(semA);&lt;br /&gt;
			&amp;lt;non-critical&amp;gt;&lt;br /&gt;
	end&lt;br /&gt;
end B;&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;
Preklopi ne zahtevaju podršku OS-a. Sve obavlja prevodilac i generisani kod. OS samo obezbeđuje usluge za alokaciju dela virtuelnog adresnog prostora.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako  je  učestanost  pogotka  u  TLB  90%,  a  vreme  pristupa  TLB  iznosi  20%  od  vremena pristupa  fizičkoj  memoriji,  koliko  (procentualno)  je  duže  efektivno  vreme  pristupa  virtuelnoj memoriji u odnosu na pristup fizičkoj memoriji kod straničenja u dva nivoa?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
0.9 * ( 0.2t_ram + t_ram) + 0.1 * ( 0.2t_ram + 3t_ram) = 1.49 t_ram&lt;br /&gt;
&lt;br /&gt;
Odnos: 49%&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je svrha tehnike &#039;&#039;copy-on-write&#039;&#039; kod stranične organizacije virtuelne memorije? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Služi sa uštedu memorije koja bi se bespotrebno trošila sve dok jedan od procesa ne zatraži promenu te stranice kada se alocira nova stranica i kopira se sadržaj. Ukoliko više procesa dele istu stranicu, samo će onaj koji je napravio izmenu dobiti novu stranicu dok će ostali nastaviti da dele istu stranicu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koja je razlika između sinhronog i asinhronog slanja podataka na izlazni uređaj? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Sinhronim slanjem podataka proces zadaje operaciju i po potrebi se suspenduje i nastavlja tek kada se zahtevana operacija završi.&lt;br /&gt;
Kod asinhronog poziva pozivajući proces samo zadaje operaciju i nastavlja izvršavanje.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U  nekom  fajl  sistemu  u  sistemskom  pozivu  za  otvaranje  fajla  proces  navodi  da  li  će  fajl samo čitati ili ga i na bilo koji način menjati. U zavisnosti od toga, taj  sistemski  poziv  zaključava fajl sa jednim  od dve vrste ključa.  Ako  se  fajl  otvara  samo  za čitanje,  fajl  se  zaključava deljenim ključem; ako se fajl otvara za izmenu, zaključava se ekskluzivnim ključem. Ukoliko poziv ne može da se izvrši zbog toga što ključ ne može da se dobije, poziv se otkazuje bez izmena u fajl sistemu i vraća se greška. &lt;br /&gt;
&lt;br /&gt;
Procesi  A,  B,  C  i  D  izvršavaju  sistemske  pozive  otvaranja  i  zatvaranja  istog  fajla  u  sledećem redosledu (neki proces izvršava poziv zatvaranja fajla samo ako ga je uspešno otvorio): &lt;br /&gt;
&lt;br /&gt;
# A: open(READ) &lt;br /&gt;
# B: open(WRITE) &lt;br /&gt;
# C: open(READ) &lt;br /&gt;
# A: close &lt;br /&gt;
# C: close &lt;br /&gt;
# D: open(WRITE) &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Uspešno: 1, 2, 4, 5, 6&lt;br /&gt;
&lt;br /&gt;
Neuspešno: 3&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je najveći nedostatak organizacije fajl sistema pomoću FAT?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Veoma velika osetljivost na otkaze. Bilo kakvo oštećenje u FAT uzrokuje štetu. Moguće je uništiti ceo fajlsistem.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2014&amp;diff=2936</id>
		<title>ОС1/Септембар 2014</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2014&amp;diff=2936"/>
		<updated>2021-09-20T16:40:50Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: средити 10. задатак&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2014/sep/OS1%20Sep%202014.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je multiprocesni, a šta multiprocesorski operativni sistem?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Multiprocesni OS je OS koji podržava izvršavanje više procesa uporedo (nad istim procesorom).&lt;br /&gt;
&lt;br /&gt;
Multiprocesorski sistem je računarski sistem sa više procesora koji imaju deljenu memoriju. Procesori mogu da pristupaju toj deljenoj memoriji preko zajedničke magistrale na koju su povezani.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem operacije &amp;lt;code&amp;gt;yield(PCB* old, PCB* new)&amp;lt;/code&amp;gt; koja čuva kontekst izvršavanja prvog i restaurira kontekst izvršavanja drugog datog procesa, implementirati operaciju &#039;&#039;wait&#039;&#039; na semaforu koji je realizovan klasom &amp;lt;code&amp;gt;Semaphore&amp;lt;/code&amp;gt; poput one u školskom jezgru. &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;
Semaphore::wait() {&lt;br /&gt;
	lock();&lt;br /&gt;
	if(--val &amp;lt; 0) {&lt;br /&gt;
		PCB* old = Thread::running-&amp;gt;myPCB;&lt;br /&gt;
		blocked.put(Thread::running);&lt;br /&gt;
		Thread::running = Scheduler::get();&lt;br /&gt;
		PCB* new = Thread::running-&amp;gt;myPCB;&lt;br /&gt;
		yield(old, new);&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;
Na  jeziku  C,  korišćenjem  sistemskih  poziva  &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;  i  &amp;lt;code&amp;gt;execlp()&amp;lt;/code&amp;gt;  za  Unix, napisati program koji  pokreće  drugi  program  iz  fajla  čiji  je  naziv  zadat  kao  parametar  komandne  linije  prvog programa.&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;
int main(int argc, char* argv[]) {&lt;br /&gt;
	if(argc &amp;lt; 2)&lt;br /&gt;
		return -1;&lt;br /&gt;
	int pid = fork();&lt;br /&gt;
	if(pid &amp;lt; 0)&lt;br /&gt;
		return -2;&lt;br /&gt;
	else if(pid == 0) {&lt;br /&gt;
		execlp(argv[1]);&lt;br /&gt;
		return -3;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		wait(0);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem  standardnih  brojačkih  semafora  u  školskom  jezgru,  na  jeziku  C++  napisati globalne  deklaracije  i  inicijalizacije,  kao  i  kod  tela  dve  uporedne  niti  A  i  B  koje  ciklično  rade sledeće: &lt;br /&gt;
&lt;br /&gt;
A:  upisuje  vrednost  u  deljene  promenljive  x  i  y,  a  zatim  čeka  da  proces  B  upiše  zbir  x  i  y  u promenljivu z čiju vrednost onda ispisuje na standardni izlaz; &lt;br /&gt;
&lt;br /&gt;
B:  čeka  da  proces  A  upiše  vrednosti  u  deljene  promenljive  x  i  y,  zatim  ove  dve  vrednosti  sabira  i zbir upisuje u deljenu promenljivu z. &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;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Semaphore semA(0), semB(0);&lt;br /&gt;
int x, y, z;&lt;br /&gt;
&lt;br /&gt;
class A : public Thread {&lt;br /&gt;
protected:&lt;br /&gt;
	void run() {&lt;br /&gt;
		while(1) {&lt;br /&gt;
			x = ...&lt;br /&gt;
			y = ...&lt;br /&gt;
			semB.signal();&lt;br /&gt;
			semA.wait();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class B : public Thread {&lt;br /&gt;
protected:&lt;br /&gt;
	void run() {&lt;br /&gt;
		while(1) {&lt;br /&gt;
			semB.wait();&lt;br /&gt;
			z = x + y;&lt;br /&gt;
			semA.signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je osnovni razlog za to da linker obavlja zadatak u dva prolaza? Precizno objasniti. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U prvom prolazu linker analizira ulazne fajlove, veličinu njihovog binarnog sadržaja i pravi maou izvršivog fajla. U tabelu simbola unosi sve izvezene simbole iz objektnih fajlova za koje može da izračuna adresu u odnosu na ceo izvršivi fajl.&lt;br /&gt;
U drugom prolazu linker generiše binarni kod i ujedno razrešava nerazrešena adresna polja mašinskih instrukcija na osnovu informacija o adresama u koje se premeštaju simboli iz tabele simbola.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti  najmanje  tri  sličnosti  (npr.  zajednički  zahtevi,  ograničenja  ili  problemi)  između kontinualne alokacije memorije i segmentne alokacije memorije procesa.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# OS mora da organizuje i održava strukturu podataka za evidenciju slobodnih fragmenata&lt;br /&gt;
# OS mora da sprovodi neku od tehnika dinamičke alokacije&lt;br /&gt;
# problem eksterne fragmentacije&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kojom  tehnikom  se  nedeljivi  uređaj  može  učiniti  virtuelno deljivim?  Navesti  klasičan primer takvog uređaja za koji se najčešće primenjuje ova tehnika. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Spooling-om. Klasičan primer je štampač.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U  fajl  podsistemu  nekog  operativnog  sistema  ne  vodi  se tabela  otvorenih  fajlova  za  svaki proces, već postoji samo jedna globalna tabela otvorenih fajlova za ceo sistem. Drugim rečima, ne postoji nikakva informacija o upotrebi otvorenog fajla lokalna (privatna) za pojedinačni proces, već su  sve  takve  informacije  globalno  deljene.  Da  li  pojam pokazivača  trenutne  lokacije  (kurzora)  za čitanje/upis u fajl ima smisla čuvati u globalnoj tabeli otvorenih fajlova i zašto?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dati  procenu  kompleksnosti  datih  operacija  sa direktorijumom u odnosu na broj postojećih fajlova n u direktorijumu, za navedene implementacije direktorijuma, ukoliko u slučaju hash tabele nema nijedne kolizije.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki  fajl  sistem  koristi  indeksirani  pristup  alokaciji  fajlova  sa  indeksima  u  dva  nivoa, blokom veličine 256KB i 64-bitnim adresama fizičkih blokova. Kolika je maksimalna veličina fajla u ovom sistemu? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Broj ulaza: 256KB / 8B = 2^15&lt;br /&gt;
&lt;br /&gt;
Maksimalna veličina fajla: 2^15 * 2^15 * 2^18 = 2^48&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2015&amp;diff=2935</id>
		<title>ОС1/Септембар 2015</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2015&amp;diff=2935"/>
		<updated>2021-09-20T16:40:47Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: средити 7. задатак&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2015/sep/Sep%202015.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Prvi  interaktivni  računarski  sistemi  uveli  su  jednu  značajnu  novinu  u  operativne  sisteme. Koja je to novina? Objasniti ukratko njenu suštinu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Novina koja je uvedena je multiprogramiranje. Suština multiprogramiranja je mogućnost izvršavanja uporedo više provesa na jednom procesoru. Dok jedan proces čeka na izvršenje I/O operacije, procesor izvršava druge poslove.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem  standardnih  bibliotečnih  funkcija  &amp;lt;code&amp;gt;setjmp()&amp;lt;/code&amp;gt;  i  &amp;lt;code&amp;gt;longjmp()&amp;lt;/code&amp;gt;,  u  školskom  jezgru implementirati operaciju &amp;lt;code&amp;gt;yield(Thread* old, Thread* new)&amp;lt;/code&amp;gt; koja prebacuje kontekst izvršavanja sa jedne (&amp;lt;code&amp;gt;old&amp;lt;/code&amp;gt;) na drugu (&amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) nit. &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 yield(Thread* old, Thread* new) {&lt;br /&gt;
	if(setjmp(old-&amp;gt;context) == 0)&lt;br /&gt;
		longjmp(new-&amp;gt;context, 1);&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;
Кorišćenjem školskog jezgra, napraviti nit koja se inicijalizuje celobrojnim parametrom &#039;&#039;n&#039;&#039; i koja kreira jednu istu takvu nit-dete, ova nit-dete kreira jednu svoju nit-dete, i tako dalje, rekurzivno, ali tako da ukupno bude kreirano &#039;&#039;n&#039;&#039; niti.&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;
class myThread : public Thread {&lt;br /&gt;
	public:&lt;br /&gt;
		myThread(int val) {&lt;br /&gt;
			n = val;&lt;br /&gt;
			start();&lt;br /&gt;
		}&lt;br /&gt;
	protected:&lt;br /&gt;
		void run() {&lt;br /&gt;
			if(n &amp;lt;= 0) return;&lt;br /&gt;
			else new myThread(n - 1);&lt;br /&gt;
		}&lt;br /&gt;
	private:&lt;br /&gt;
		int n;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dato je jedno moguće rešenje za međusobno isključenje dva procesa uposlenim čekanjem. Da li ovo rešenje obezbeđuje međusobno isključenje? Da li ima neki drugi problem?&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
shared var turn : integer = 1; &lt;br /&gt;
process P1      				 process P2 &lt;br /&gt;
begin     						 begin &lt;br /&gt;
  loop       					 	loop     &lt;br /&gt;
    while turn = 2 do null end;  		while turn = 1 do null end; &lt;br /&gt;
    &amp;lt;critical section&amp;gt;        			&amp;lt;critical section&amp;gt; &lt;br /&gt;
    turn := 2;        					turn := 1; &lt;br /&gt;
    &amp;lt;non-critical section&amp;gt;      		&amp;lt;non-critical section&amp;gt; &lt;br /&gt;
  end        					 	end &lt;br /&gt;
end P1;     					 end P2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Rešenje obezbeđuje međusobno isključenje ali je problem stroga naizmeničnost što je suvišna sinhronizacija.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta znači kad je proces &#039;&#039;swapped out&#039;&#039;? &lt;br /&gt;
&lt;br /&gt;
Ako je proces swapped out, u kom stanju se od sledećih on nalazi? &lt;br /&gt;
# created &lt;br /&gt;
# ready &lt;br /&gt;
# running &lt;br /&gt;
# suspended &lt;br /&gt;
# terminated &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Swapped out proces je proces koji je bio izbačen iz memorije i upisan na disk kako bi se u memoriju učitao neki drugi koji se ubacuje memoriju.&lt;br /&gt;
&lt;br /&gt;
Nalazi se u &#039;&#039;suspended&#039;&#039; stanju kada se swap-out-uje.&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;
{{delimično rešeno}}&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;
page: 4KB -&amp;gt; 12b&lt;br /&gt;
&lt;br /&gt;
VA(32) : page1(10) : page2(10) : offset(12)&lt;br /&gt;
&lt;br /&gt;
pmt1_size = 2^10 * 4B = 4KB&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kojom tehnikom se nedeljivi uređaj može učiniti virtuelno deljivim?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Spooling-om.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U  nekom  sistemu  simbol  &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  označava  tekući,  a  &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; roditeljski  direktorijum.  Koja  od  sledećih naredbi  (svaka  se izvršava uspešno) &#039;&#039;sigurno neće&#039;&#039; promeniti tekući direktorijum? (Zaokružiti jedan ili više tačnih odgovora.) &lt;br /&gt;
# cd ./../../x/y/z &lt;br /&gt;
# cd ./x/y/z/../.. &lt;br /&gt;
# cd ./../../../x/y/z &lt;br /&gt;
# cd ./x/y/z/../../.. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
4. naredba sigurno neće promeniti tekući direktorijum.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki  fajl  sistem  primenjuje  FAT  za  alokaciju  sadržaja  fajla.  FAT  je  cela  keširana  u memoriji, na nju ukazuje pokazivač &amp;lt;code&amp;gt;fat&amp;lt;/code&amp;gt;, i ima &amp;lt;code&amp;gt;FATSIZE&amp;lt;/code&amp;gt; ulaza tipa &amp;lt;code&amp;gt;unsigned&amp;lt;/code&amp;gt;. Prilikom ulančavanja blokova sa sadržajem fajla, &#039;&#039;null&#039;&#039; vrednost se označava vrednošću 0 u odgovarajućem ulazu u FAT, dok  se  slobodni  blokove  ne  ulančavaju  posebno,  već  su  njima  odgovarajući  ulazi  u  FAT  označeni vrednostima  &amp;lt;code&amp;gt;~0U&amp;lt;/code&amp;gt;  (sve  jedinice  binarno);  blokovi  broj  0  i  broj  &amp;lt;code&amp;gt;~0U&amp;lt;/code&amp;gt;  se  ne  koriste  u  fajl  sistemu.  U FCB polje &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; tipa &amp;lt;code&amp;gt;unsigned&amp;lt;/code&amp;gt; sadrži broj prvog bloka sa sadržajem fajla (0 ako je sadržaj prazan). Napisati kod kojim se oslobađaju svi blokovi sa sadržajem fajla.&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 clearAll(FCB* file) {&lt;br /&gt;
	if(file == 0 || file-&amp;gt;sizeInBlocks == 0 || file-&amp;gt;head == 0) return;&lt;br /&gt;
	while(file-&amp;gt;head) {&lt;br /&gt;
		auto tmp = file-&amp;gt;head;&lt;br /&gt;
		file-&amp;gt;head = file-&amp;gt;head-&amp;gt;next;&lt;br /&gt;
		tmp-&amp;gt;value = ~0U;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2014&amp;diff=2934</id>
		<title>ОС1/Октобар 2014</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2014&amp;diff=2934"/>
		<updated>2021-09-20T15:53:12Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: Нова страница: {{tocright}} [http://os.etf.bg.ac.rs/OS1/rokovi/2014/okt/OS1%20Okt%202014.pdf Zadaci na stranici predmeta.]  == 1. zadatak == === Postavka === Šta je bio osnovni motiv…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2014/okt/OS1%20Okt%202014.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je bio osnovni motiv za uvođenje multiprogramiranja u računarske sisteme?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Септембар 2011#1. zadatak|septembarskog roka 2011]].&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem  standardnih  bibliotečnih  operacija  &amp;lt;code&amp;gt;setjmp&amp;lt;/code&amp;gt;  i &amp;lt;code&amp;gt;longjmp&amp;lt;/code&amp;gt;, implementirati operaciju  &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;  na  binarnom  semaforu  koji  je  realizovan  klasom  &amp;lt;code&amp;gt;Event&amp;lt;/code&amp;gt;  poput  one  u školskom jezgru. &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;
Event::wait() {&lt;br /&gt;
	lock(lck);&lt;br /&gt;
	if(--val &amp;lt; 0) {&lt;br /&gt;
		if(setjmp(Thread::running-&amp;gt;context) == 0) {&lt;br /&gt;
			blocked.put(Thread::running);&lt;br /&gt;
			Thread::running = Scheduler::get();&lt;br /&gt;
			longjmp(Thread::running-&amp;gt;context, 1);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	unlock(lck);&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;
Na jeziku C, korišćenjem sistemskog poziva &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; za Unix, napisati program koji prihvata celobrojni argument &#039;&#039;n&#039;&#039; i koji, kada se nad njim pokrene proces, pokreće jedan proces-dete i završava se, ovaj proces-dete pokreće svoje dete, itd, tako da ukupno bude &#039;&#039;n&#039;&#039; procesa u relaciji roditelj-dete (&#039;&#039;n&#039;&#039; „generacija“). &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;
int main(int argc, char* argv[]) {&lt;br /&gt;
	if(argc &amp;lt; 2)&lt;br /&gt;
		return -1;&lt;br /&gt;
	int N = atoi(argv[1]);&lt;br /&gt;
	for(int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
		if(fork() != 0) return 0;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora u školskom jezgru, na jeziku C++ napisati kod za ograničeni bafer (&#039;&#039;bounded buffer&#039;&#039;). &lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јул 2011#4. zadatak|julskog roka 2011]].&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koja je osnovna razlika između tehnika dinamičkog učitavanja i preklopa (&#039;&#039;overlays&#039;&#039;)? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јул 2011#5. zadatak|julskog roka 2011]].&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ko i kada upisuje vrednosti u registar bazne adrese i registar ograničenja procesora kod kontinualne alokacije memorije? Ukratko objasniti svrhu ovih registara.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kada se kreira novi proces, stavlja se u ulazni red. OS alocira memorijske zahteve u ulaznom redu i trenutno stanje memorije i bira proces za učitavanje. OS učitava izabran proces i upisuje vrednost u base i limit registar. Bazni je koristan kod realokacije procesa a limit služi za zaštitu zauzete memorije jednog procesa od drugog.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Primenom tehnike &#039;&#039;copy-on-write&#039;&#039; kod virtuelne memorije, hardver je generisao izuzetak tipa „nedozvoljen upis u adresiranu stranicu“. Precizno objasniti šta dalje radi operativni sistem.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kada proces prvi put upisuje u neku deljenu stranicu hardver generiše izuzetak tipa nedozvoljen upis u adresiranu stranicu. Operativni sistem zaključuje da je upis logički dozvoljen ali je stranica deljena, stranica se tada kopira, prestaje da bude deljena.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti  tipične  operacije  apstrakcije  blokovski orijentisanog  izlaznog  uređaja  sa &#039;&#039;&#039;sekvencijalnim&#039;&#039;&#039; pristupom.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki proces izvršava sistemski poziv za upis u  fajl koji je prethodno uspešno otvorio i sistem  mu  to  ne  dozvoljava,  sa  porukom  da  tom  procesu  nije  dozvoljena  ta  operacija,  iako  je korisniku u čije ime se taj proces izvršava dozvoljena operacija upisa u taj fajl. Objasnite kako  i zašto se ovo dogodilo.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Fajl je otvoren u režimu čitanja.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koliko pristupa blokovima na disku treba izvršiti za pristup n-tom logičkom bloku sadržaja fajla ako je alokacija fajla&lt;br /&gt;
# FAT, pri čemu je cela FAT u memoriji &lt;br /&gt;
# kontinualna? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2013&amp;diff=2933</id>
		<title>ОС1/Октобар 2013</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2013&amp;diff=2933"/>
		<updated>2021-09-20T15:53:10Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: Нова страница: {{tocright}} [http://os.etf.bg.ac.rs/OS1/rokovi/2013/okt/OS1%20Okt%202013.pdf Zadaci na stranici predmeta.]  == 1. zadatak == === Postavka === Koja je razlika između m…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2013/okt/OS1%20Okt%202013.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koja je razlika između multiprocesorskih i distribuiranih računarskih sistema?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kod multiprocesorskih sistema skup procesora ima deljenu operativnu memoriju, dok kod distribuiranog sistema nema zajedničke operativne memorije, već postoji mrežna komunikacija između procesora.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem operacije &amp;lt;code&amp;gt;yield(jmp_buf old, jmp_buf new)&amp;lt;/code&amp;gt; koja čuva kontekst niti čiji je &amp;lt;code&amp;gt;jmp_buf&amp;lt;/code&amp;gt; dat  kao  prvi  argument, oduzima  joj  procesor  i restaurira kontekst  niti čiji je &amp;lt;code&amp;gt;jmp_buf&amp;lt;/code&amp;gt; dat kao drugi argument, kojoj predaje procesor, realizovati operaciju &amp;lt;code&amp;gt;Semaphore::wait()&amp;lt;/code&amp;gt; u školskom jezgru.&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;
Semaphore::wait() {&lt;br /&gt;
	lock();&lt;br /&gt;
	if(--val &amp;lt; 0) {&lt;br /&gt;
		jmp_buf old = Thread::running-&amp;gt;context;&lt;br /&gt;
		blocked.put(Thread::running);&lt;br /&gt;
		Thread::running = Scheduler::get();&lt;br /&gt;
		jmp_buf new = Thread::running-&amp;gt;context;&lt;br /&gt;
		yield(old, new);&lt;br /&gt;
	}&lt;br /&gt;
	unlock();&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;
Koja je razlika između (teškog) procesa i niti (&#039;&#039;thread&#039;&#039;)? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Teški proces je izvršavanje jednog programa sa sopstvenim adresnim prostorom dok se nitima, tj. lakim procesima zove svaki tok kontrole koji koristi taj adresni prostor.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora, napisati kod za inicijalizaciju i potrebnu  sinhronizaciju kritične sekcije u koju može ući najviše &#039;&#039;N&#039;&#039; uporednih procesa.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
var mutex : Semaphore := N;&lt;br /&gt;
&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 P;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako tokom svog prvog prolaza linker u svojoj tabeli ne pronađe simbol koji je definisan u tekućem fajlu (izvozi se), da li će prijaviti grešku? Obrazložiti. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ne jer ako se ne nalazi u tabeli simbola znači da simbol nije definisan i ne dolazi do konflikta imena.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koja je razlika između &#039;&#039;best fit&#039;&#039; i &#039;&#039;worst fit&#039;&#039; algoritma kontinualne alokacije memorije? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Best fit algoritam ima cilj da nakon alokacije ostane što manji slobodan fragment kako bi se smanjila eksterna fragmentacija.&lt;br /&gt;
Worst fit algoritam ima cilja da preostali slobodan fragment bude što upotrebljiviji, odnosno takav da se poveća šansa da se može upotrebiti za dalju alokaciju, tj. ostavlja najveći slobodan fragment nakon alokacije.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U  nekom  sistemu  sa  virtuelnom  memorijom  broj  stranice  u virtuelnoj  adresi  je  veličine  48 bita.  Da  bi  čuvanje  PMT  učinio  izvodljivim,  sistem koristi  &#039;&#039;hash&#039;&#039;  tabelu  sa  64K  ulaza  za  smešanje PMT  svakog  procesa.  &#039;&#039;Hash&#039;&#039;  funkcija  je  prosta  modulo funkcija:  ulaz  u  tabelu  određuje  se  pomoću 16 najnižih bita broja stranice. U svakom ulazu &#039;&#039;hash&#039;&#039; tabele nalazi se 64-bitna glava ulančane liste zapisa  za  alocirane  stranice  koje  se  preslikavaju  u  taj ulaz.  Svaki  zapis  sadrži  viših  32  bita  broja stranice,  broj  okvira  u  koji  je  ta  stranica  preslikana (32  bita,  vrednost  0  označava  da  stranica  ne može da se preslika) i pokazivač na sledeći zapis (64 bita, vrednost 0 označava kraj liste). Neki  proces  je  alocirao  256  najnižih  i  256  najviših stranica  svog  virtuelnog  adresnog  prostora. Koliko prostora (u bajtovima) ukupno zauzima PMT ovog procesa? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu podržan je samo asinhroni izlaz na izlazni uređaj pomoću sledeće funkcije&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;IOReqID output (IODevID deviceID, IOReq* request);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
koja zadaje (asinhrono) izlaznu operaciju specifikovanu drugim argumentom na uređaju identifikovanom prvim argumentom. Ova funkcija odmah vraća kontrolu pozivaocu, uz identifikaciju  zadate  operacije  (rezultat  tipa  &amp;lt;code&amp;gt;IOReqID&amp;lt;/code&amp;gt;  je  veći  od  0  u  slučaju  ispravno  zadatog  zahteva).&lt;br /&gt;
Funkcija &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void ioWait (IOReqID);&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
blokira pozivajući proces sve dok operacija identifikovana argumentom nije završena u potpunosti. Pomoću ovih funkcija realizovati funkciju koja, u odnosu na jedan argument, može zadati operaciju sinhrono ili asinhrono, prema želji pozivaoca. &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;
IOReqID output_user(IODevID deviceID, IOReq* request, bool synchronous) {&lt;br /&gt;
	IOReqID id = output(deviceID, request);&lt;br /&gt;
	if(synchronous &amp;amp;&amp;amp; id &amp;gt; 0) wait(id);&lt;br /&gt;
	return id;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta označava skraćenica FTP? Ukratko objasniti čemu služi ovaj protokol.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
File Transfer Protocol - u razmeni fajlova učestvuju 2 računara. Jedan igra ulogu servera a drugi ulogu klijenta. Na oba računara se izvršavaju programi koji implementiraju ovaj protokol.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koja  metoda  alokacije  fajlova  je  efikasnija  za  direktni pristup,  ulančana  ili  indeksirana  i zašto?&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2012&amp;diff=2932</id>
		<title>ОС1/Октобар 2012</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2012&amp;diff=2932"/>
		<updated>2021-09-20T15:53:06Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: средити 10. задатак&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2012/oktobar/Oktobar%202012.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je multiprocesorski, a šta distribuirani sistem?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data  je  operacija  &amp;lt;code&amp;gt;yield(jmp_buf  old,  jmp_buf  new)&amp;lt;/code&amp;gt;  koja  čuva  kontekst  niti  čiji  je &amp;lt;code&amp;gt;jmp_buf&amp;lt;/code&amp;gt;  dat kao prvi argument, oduzima joj procesor i restaurira kontekst niti čiji je  &amp;lt;code&amp;gt;jmp_buf&amp;lt;/code&amp;gt;  dat kao  drugi  argument,  kojoj  predaje  procesor.  Koristeći  ovu  operaciju,  realizovati  operaciju &amp;lt;code&amp;gt;dispatch()&amp;lt;/code&amp;gt; koja ima isti efekat kao i ona data u školskom jezgru.&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 dispatch () {&lt;br /&gt;
	lock();&lt;br /&gt;
	jmp_buf old = Thread::running-&amp;gt;context;&lt;br /&gt;
	Scheduler::put(Thread::running);&lt;br /&gt;
	Thread::running = Scheduler::get();&lt;br /&gt;
	jmp_buf new = Thread::running-&amp;gt;context;&lt;br /&gt;
	yield(old,new);&lt;br /&gt;
	unlock();&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;
Kako se u kodu koji se izvršava nakon sistemskog poziva &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; može znati da li se taj kod izvršava u kontekstu procesa-roditelja ili procesa-deteta? Objasniti i dati primer.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Može se znati u kom se kontekstu izvršava kod na osnovu povratne vrednosti fork-a. Tj. 0 u kontekstu deteta, vrednost veća od 0 u kontekstu roditelja, a manja od 0 ako dođe do greške.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int main(int argc, char* argv[]) {&lt;br /&gt;
	pid_t pid = fork();&lt;br /&gt;
	&lt;br /&gt;
	if(pid &amp;lt; 0) {&lt;br /&gt;
		return -1; &lt;br /&gt;
		// greska&lt;br /&gt;
	}&lt;br /&gt;
	else if(pid == 0) {&lt;br /&gt;
		// dete&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		// roditelj&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return 0;&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati kod jednog od dva procesa koji pristupaju kritičnoj sekciji sa međusobnim isključenjem pomoću uposlenog čekanja (&#039;&#039;busy waiting&#039;&#039;) Petersonovim algoritmom&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
process P1:&lt;br /&gt;
	begin&lt;br /&gt;
		loop&lt;br /&gt;
			flag1 := true; turn := 2;&lt;br /&gt;
			while flag2 and turn = 2 do null;&lt;br /&gt;
			&amp;lt;critical section&amp;gt;&lt;br /&gt;
			flag1 := false;&lt;br /&gt;
			&amp;lt;non-critical section&amp;gt;&lt;br /&gt;
	end&lt;br /&gt;
end P1;&lt;br /&gt;
&lt;br /&gt;
process P2:&lt;br /&gt;
	begin&lt;br /&gt;
		loop&lt;br /&gt;
			flag2 := true; turn := 1;&lt;br /&gt;
			while flag1 and turn = 1 do null;&lt;br /&gt;
			&amp;lt;critical section&amp;gt;&lt;br /&gt;
			flag2 := false;&lt;br /&gt;
			&amp;lt;non-critical section&amp;gt;&lt;br /&gt;
	end&lt;br /&gt;
end P2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Date  su  sledeće  deklaracije  u  jednom  izvornom  C  fajlu.  Koji  od  ovih  simbola  će  biti označeni kao „izveženi“, a koji kao „uveženi“ u .obj fajlu? &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int a(int); &lt;br /&gt;
void b(int);  &lt;br /&gt;
void b(int) {}&lt;br /&gt;
void c(int); &lt;br /&gt;
extern int d; &lt;br /&gt;
static int e; &lt;br /&gt;
int f;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Uveženi: a, c, d&lt;br /&gt;
Izveženi: b, f&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki sistem koristi kontinualnu alokaciju operativne memorije. Data je deklaracija strukture podataka  koja  predstavlja  zaglavlje  svakog  slobodnog  fragmenta  memorije.  Ova  zaglavlja  čine dvostruko  ulančanu  listu  slobodnih  fragmenata  i  upisuju  se  na  sam  početak  svakog  slobodnog fragmenta memorije. Napisati telo funkcije &amp;lt;code&amp;gt;getFirstFitFragment()&amp;lt;/code&amp;gt; koja  treba  da  pronađe fragment slobodne memorije veličine date argumentom po &#039;&#039;first-fit&#039;&#039; algoritmu i vrati njegovu adresu. Preostali deo fragmenta treba da postane novi (manji) fragment u listi slobodnih&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef unsigned int size_t; &lt;br /&gt;
struct FreeFragment { &lt;br /&gt;
  size_t size; // Veličina fragmenta u jedinicama sizeof(char) &lt;br /&gt;
  FreeFragment* prev; // Prethodni u listi &lt;br /&gt;
  FreeFragment* next; // Sledeći u listi &lt;br /&gt;
} &lt;br /&gt;
FreeFragment* head; // Glava liste slobodnih fragmenata &lt;br /&gt;
void* getFirstFitFragment(size_t);&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* getFirstFitFragment(size_t sz) {&lt;br /&gt;
	if(head == 0 || sz == 0) return 0;&lt;br /&gt;
	for(FreeFragment* cur = head; cur; cur = cur-&amp;gt;next) {&lt;br /&gt;
		if(cur-&amp;gt;size &amp;lt; sz) continue;&lt;br /&gt;
		FreeFragment* newFrg = (FreeFragment*)((char*)cur + sz);&lt;br /&gt;
		if(cur-&amp;gt;prev) cur-&amp;gt;prev-&amp;gt;next = newFrg;&lt;br /&gt;
		else head = cur-&amp;gt;next;&lt;br /&gt;
		if(cur-&amp;gt;next) cur-&amp;gt;next-&amp;gt;prev = newFrg;&lt;br /&gt;
		newFrg-&amp;gt;prev = curr-&amp;gt;prev;&lt;br /&gt;
		newFrg-&amp;gt;next = curr-&amp;gt;next;&lt;br /&gt;
		newFrg-&amp;gt;size = cur-&amp;gt;size - sz;&lt;br /&gt;
		return cur;&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&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;
Objasniti  šta  je  osnovni  motiv  i  pogodnost  tehnike  straničenja  u  više  nivoa  u  odnosu  na straničenje u jednom nivou?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Veći kapacitet virtuelne memorije.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kojom tehnikom se fizički nedeljivi izlazni uređaj može učiniti logički (virtuelno) deljivim između procesa koji ga uporedo koriste? &lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Spooling-om.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki proces otvara neki fajl samo za čitanje, iako „vlasnik“ tog procesa ima i pravo upisa u taj fajl. Da li se informacija da je taj  proces otvorio taj fajl samo za čitanje čuva u tabeli otvorenih fajlova koja je globalna za sve procese, ili u onoj koja je lokalna za taj proces&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ta informacija čuva se u tabeli otvorenih fajlova lokalnoj za taj proces.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki  fajl  sistem  koristi  indeksiranu  alokaciju  fajlova  na  disku  sa  jednostrukim indeksom. Ako se pretpostavlja da je prostor za smeštanje fajlova (uključujući i njihove indekse) na disku  veličine  32 GB,  veličina  klastera  (jedine  jedinice  alokacije)  2 KB,  i  ceo  prostor  potpuno ispunjen  fajlovima  tako  da  je  svaki  fajl  maksimalne  veličine  takve  da  ima  samo  jedan  indeksni klaster, koliki procenat ukupnog prostora za smeštanje fajlova na ovom disku zauzimaju indeksi? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
32GB / 2KB = 16M = 2^24 -&amp;gt; 3B adresa&lt;br /&gt;
&lt;br /&gt;
2KB / 3B = 682 ulaza u indeksu&lt;br /&gt;
&lt;br /&gt;
procenat zauzetosti: 100/(682 + 1)%&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2011&amp;diff=2931</id>
		<title>ОС1/Октобар 2011</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2011&amp;diff=2931"/>
		<updated>2021-09-20T15:53:02Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: средити 6. задатак&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2011/oktobar/Okt%202011.doc Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti osnovni motiv uvođenja raspodele vremena (&#039;&#039;time sharing&#039;&#039;) u multiprogramiranje.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U zavisnosti od toga u kom hronološkom poretku su se dogodile akcije korisnika, što je potpuno proizvoljno, korisnici bi dobijali odzive nakon različitog vremena i zavisili bi od broja i aktivnosti drugih korisnika, te bi korisnici imali osećaj da smetaju jedni drugima. Mehanizmom raspodele vremena korisniku se odaje utisak da računar radi samo za njega sa dovoljno dobrim i ujednačenim vremenom odziva, iako opslužuje više korisnika istovremeno.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati program koji vrši učitavanje bloka podataka sa ulaznog uređaja tehnikom programiranog ulaza korišćenjem prekida. Samostalno usvojiti potrebne detaljne pretpostavke.&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;
main:	LD R1, blockAddr&lt;br /&gt;
		LD R2, count&lt;br /&gt;
		LD R3, #0&lt;br /&gt;
		ST [ctrl], #00..01&lt;br /&gt;
wait:	CMP R3, #1&lt;br /&gt;
		JNZ wait&lt;br /&gt;
		HALT&lt;br /&gt;
&lt;br /&gt;
intr:	LD R0, [data]&lt;br /&gt;
		ST [R1], R0&lt;br /&gt;
		INC R1&lt;br /&gt;
		DEC R2&lt;br /&gt;
		JNZ ret&lt;br /&gt;
		LD R3, #1&lt;br /&gt;
		ST [ctrl], #0&lt;br /&gt;
ret: 	RTI&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti najmanje četiri uzroka zbog kojih proces može izgubiti procesor. Za svaki od navedenih načina navesti da li se dešava sinhrono (kao posledica operacije koju je izvršio sam proces) ili asinhrono (nezavisno od izvršavanja procesa).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# Eksplicitnim zahtevom za promenu konteksta - dispatch, yield - sinhrono.&lt;br /&gt;
# Isteklo je dodeljeno CPU vreme - time exceeded - asinhrono.&lt;br /&gt;
# Prekid - maskirajući ili nemaskirajući - asinhrono.&lt;br /&gt;
# Zbog operacije na nekoj sinhronizacionoj primitivi tj. semaforu ili događaju - sinhrono.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora u školskom jezgru, na jeziku C++ u potpunosti realizovati klasu za ograničeni bafer (&#039;&#039;bounded buffer&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јул 2011#4. zadatak|julskog roka 2011]].&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dati primer delova koda dva fajla sa izvornim C/C++ kodom za koje će linker generisati grešku tipa višestrukih simbola i nedefinsanih simbola, pod pretpostavkom da su to jedina dva fajla koja se linkuju.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelna memorija nekog računara organizovana je stranično. Veličina virtuelnog adresnog prostora je 2 MB, adresibilna jedinica je 16-bitna reč, a veličina stranice je 128 KB. Veličina fizičkog adresnog prostora je 32 MB. Operativni sistem učitava stranice na zahtev, tako što se stranica učitava u prvi slobodni okvir fizičke memorije kada joj se pristupi. Kada se kreira proces, ni jedna njegova stranica se ne učitava odmah, već tek kad joj se prvi put pristupi. U početnom trenutku, slobodni okviri fizičke memorije su okviri počev od 10h zaključno sa 1Fh. Neki proces generiše sledeću sekvencu virtuelnih adresa tokom svog izvršavanja (sve vrednosti su heksadecimalne):&lt;br /&gt;
&lt;br /&gt;
30F00, 30F02, 30F04, 922F0, 922F2, 322F0, 322F2, 322F4, 522F0, 522F2, 402F0, 402F2&lt;br /&gt;
&lt;br /&gt;
Prikazati izgled cele tabele preslikavanja stranica (PMT) za ovaj proces nakon izvršavanja ove sekvence. Za svaki ulaz u PMT prikazati indikator prisutnosti stranice u fizičkoj memoriji (0 ili 1) i broj okvira u fizičkoj memoriji u koji se stranica preslikava, ukoliko je stranica učitana; ukoliko nije, prikazati samo ovaj indikator.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
VAS: 2MB = 2^21B -&amp;gt; VA: 20b&lt;br /&gt;
&lt;br /&gt;
page = 128KB = 64K AU -&amp;gt; 16b&lt;br /&gt;
&lt;br /&gt;
VA: page(4) : offset(16)&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti tipične operacije apstrakcije blokovski orijentisanog ulazno/izlaznog uređaja sa direktnim pristupom.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tipične operacije su:&lt;br /&gt;
*&amp;lt;code&amp;gt;int readBlock(BlockNo block, void* buffer);&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;int writeBlock(BlockNo block, void* buffer);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki proces izvršava sistemski poziv za upis u fajl koji je prethodno uspešno otvorio i sistem mu to ne dozvoljava, sa porukom da tom procesu nije dozvoljena ta operacija, iako je korisniku u čije ime se taj proces izvršava dozvoljena operacija upisa u taj fajl. Objasnite zašto se ovo dogodilo.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Fajl je otvoren u režimu čitanja.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta znači termin „presna particija“ (&#039;&#039;raw partition&#039;&#039;)?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Presna particija je particija koja nije formatizovana, na njoj nije organizovan fajl sistem. Može se upotrebljavati za posebne namene, npr. za zamenu stranica.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koliko pristupa blokovima na disku treba izvršiti za pristup &#039;&#039;n&#039;&#039;-tom logičkom bloku sadržaja fajla ako je alokacija fajla &lt;br /&gt;
#ulančana lista, &lt;br /&gt;
#kontinualna&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# &#039;&#039;n&#039;&#039;&lt;br /&gt;
# &#039;&#039;1&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11&amp;diff=2922</id>
		<title>ОС1</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11&amp;diff=2922"/>
		<updated>2021-09-20T11:33:16Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: Измена на страници предмета&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Оперативни системи 1&#039;&#039;&#039; (енгл. &#039;&#039;Operating systems 1&#039;&#039;) су обавезан предмет у четвртом семестру.&lt;br /&gt;
&lt;br /&gt;
== Странице ==&lt;br /&gt;
* [http://os.etf.bg.ac.rs/OS1/ Страница предмета]&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
{{Материјали&lt;br /&gt;
| suetf          = ir2os1&lt;br /&gt;
| vuk            = 1861zDxYoWeF7meMNlUweyGvGJtPkafQz&lt;br /&gt;
| box            = 8383729297&lt;br /&gt;
| scientificmind = IR2OS1&lt;br /&gt;
}}&lt;br /&gt;
* [[github:nikolabebic95/Fakultet/tree/master/Godina2/OS1|&#039;&#039;GitHub&#039;&#039; налог nikolabebic95]]&lt;br /&gt;
* [https://drive.google.com/open?id=1lMu2cdbvaUjVMdUCa5lhu7K59lDN02w8 Неки решени испити] (Богдан Бебић)&lt;br /&gt;
* [[github:KockaAdmiralac/OS1-kolokvijumi|Сви колоквијуми спојени у један документ и категорисани по области, спремни за штампу]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Предавања ==&lt;br /&gt;
Овде се наводе све битне информације у вези са предавањима на предмету, као и потребни материјали.&lt;br /&gt;
&lt;br /&gt;
== Вежбе ==&lt;br /&gt;
Овде се наводе све битне информације у вези са вежбама на предмету, као и потребни материјали.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Пројекат се обично ради са Borland C++ 3.1 преводиоцем на 32-битној Windows 7 виртуелној машини. Обично се ради на језгру процесора чији је задатак да управља више нити. Пројекат се може предати и у предроку, а пројекти предати у предроку који су такође међу најбоље урађеним добијају бонус 10% бодова уколико је студент из текуће генерације. Пројекат носи 30% укупне оцене, и предаја пројекта је услов за излазак на испит.&lt;br /&gt;
&lt;br /&gt;
Корисни материјали за израду пројекта:&lt;br /&gt;
* &#039;&#039;&#039;[https://drive.google.com/open?id=1FfSk-shJZ2_ZyA9GGEC8Pp3KEYH94zlT Водич за пројекат]&#039;&#039;&#039; (Алекса Митровић и Кристијан Жижа)&lt;br /&gt;
* [https://gist.github.com/lazanet/4c60bca936fdf6ce6f813f98cadf0c27 Покретање пројекта без виртуелне машине на Linux-у] (Лазар Митровић)&lt;br /&gt;
* [https://gist.github.com/bogdanbebic/e0ed7002e1341715c26c4599b0726586 Упутства за постављање Borland C++ 3.1 у Visual Studio Code окружењу и честе грешке при изради пројекта] (Богдан Бебић)&lt;br /&gt;
** [https://drive.google.com/open?id=1sZYVGqPz1NNcEvSRCuICKryXMvrxrnY_ Додатне датотеке за постављање у Visual Studio Code]&lt;br /&gt;
* [[Медиј:OS1 modifikacija jul 2020.pdf|Модификације дате на одбрани пројекта у јулу 2020. године]]&lt;br /&gt;
* [http://www.bitsavers.org/pdf/borland/borland_C++/Borland_C++_Version_3.1_Users_Guide_1992.pdf Корисничко упутство за Borland C++ 3.1 преводилац]&lt;br /&gt;
* [[Медиј:OS1 vodič 2019.pdf|Водич из 2018/2019. године (Милош Јовановић, 2017/0741)]]&lt;br /&gt;
=== Модификације ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| namespace       =&lt;br /&gt;
| titleregexp     = ОС1/Модификације .*&lt;br /&gt;
| noresultsheader = Тренутно нема модификација.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦17¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Док колоквијуми на предмету увек имају решења, испити обично немају, тако да су овде сакупљени неки решени рокови.&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| namespace       =&lt;br /&gt;
| titleregexp     = ОС1/[^ ]* \d+&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]],,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
Доступан је уџбеник из предмета од 2020. године:&lt;br /&gt;
* &#039;&#039;&#039;[https://www.mikroknjiga.rs/store/prikaz.php?ref=978-86-7555-446-2 Основи оперативних система]&#039;&#039;&#039; Драган Милићев, &#039;&#039;Издавач: Микро Књига, Београд&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;Pr&amp;lt;/math&amp;gt; — Бодови са пројекта (0-30)&lt;br /&gt;
* &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; — Бодови са колоквијума (0-40)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са писменог дела испита (0-30)&lt;br /&gt;
* Укупни бодови: &amp;lt;math&amp;gt;P = Pr + K + I&amp;lt;/math&amp;gt;&lt;br /&gt;
* Услов: &amp;lt;math&amp;gt;K \geq 16&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;I &amp;gt; 15&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Рачунање ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;calculator&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;PR&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;PR&amp;quot; data-max=&amp;quot;40&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;K&amp;quot; data-max=&amp;quot;40&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;I&amp;quot; data-max=&amp;quot;30&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;P&amp;quot; data-expression=&amp;quot;PR K I + + I 15 - 1 min 0 max * K 15.99 - ceil 1 min 0 max *&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Оцена: &amp;lt;span data-expression=&amp;quot;P 10 / ceil 5 max 10 min&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|rešenja}} (Ово се конкретно односи на испите, пошто су колоквијуми већ решени.)&lt;br /&gt;
*: Рокови код којих нису сви задаци решени су: {{rokovi|делимично решени}}&lt;br /&gt;
* {{zadaci|prepis}}&lt;br /&gt;
** Модификације за пројекат од 2018 до 2020. године: [https://cdn.discordapp.com/attachments/693907701771665448/858783731958153236/modifikacije.zip]&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Четврти семестар]]&lt;br /&gt;
[[Категорија:Обавезни предмети]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2017&amp;diff=2921</id>
		<title>ОС1/Јун 2017</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_2017&amp;diff=2921"/>
		<updated>2021-09-20T11:30:15Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2017/jun/Jun%202017.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je multiprogramiranje, a šta multiprocesiranje? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јануар 2014#1. zadatak|januarskog roka 2014]].&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti kako se obezbeđuje međusobno isključenje pristupa kritičnim sekcijama jezgra operativnog sistema od strane uporednih tokova kontrole (niti) koji se izvršavaju na istom, odnosno na različitim procesorima. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Фебруар 2014#2. zadatak|februarskog roka 2014]].&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem sistemskog poziva &amp;lt;code&amp;gt;create_thread(void(*f)(void*),void* p)&amp;lt;/code&amp;gt; koji kreira nit koja izvršava datu funkciju &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; sa datim argumentom &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, na jeziku C napisati program koji u &#039;&#039;n&#039;&#039; uporednih niti izračunava kvadrat svakog elementa nekog celobrojnog niza (&amp;lt;code&amp;gt;a[i]*=a[i]&amp;lt;/code&amp;gt;) veličine &amp;lt;code&amp;gt;n*k&amp;lt;/code&amp;gt;, tako što svaka nit obrađuje &#039;&#039;k&#039;&#039; elemanata (jednu particiju niza). &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;
int n = ...;&lt;br /&gt;
int k = ...;&lt;br /&gt;
int a[n*k];&lt;br /&gt;
&lt;br /&gt;
void square(void* p) {&lt;br /&gt;
	int part = *(int*)(p);&lt;br /&gt;
	part *= k;&lt;br /&gt;
	for(int i = 0; i &amp;lt; k; i++)&lt;br /&gt;
		a[part + i] *= a[part + i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main() {&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
		create_thread(square, &amp;amp;i);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem  standardnih brojačkih semafora u  školskom jezgru,  na jeziku C++ napisati implementaciju ograničenog bafera (&#039;&#039;bounded buffer&#039;&#039;). &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Октобар 2011#4. zadatak|oktobarskog roka 2011]].&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako u svom C programu ni u jednom fajlu ne definišete funkciju &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;, ko će prijaviti grešku i kog tipa, prevodilac ili linker? Precizno obrazložiti na osnovu čega se ta greška prijavljuje. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Linker prijavljuje grešku tipa simbol main nije definisan. Kada se povezuje C/C++ program, lista obj fajlova mora da sadrži i obavezno generiše modul koji poziva funkciju main, pa je zato i referiše kao spoljni simbol kog uvozi, što dovodi do greške ako ga nema.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Precizno objasniti zašto klasičan linker svoj posao obavlja u dva prolaza (a ne može samo u jednom). Obrazloženje ilustrovati primerom. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U prvom prolazu linker pravi globalnu mapu .obj fajlova i globalno definisanih izvezenih simbola i njihovih adresa relativno u odnosu na početak .obj fajla. U drugom prolazu razrešava nerazrešena adresna polja koristeći definisane simbole u tabeli simbola.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelni  adresni  prostor  je  veličine  1GB,  organizovan  je  segmentno,  sa  maksimalnom veličinom segmenta od 4KB, adresibilna jedinica je bajt. Svi segmenti nekog procesa su stvarne veličine od po 2KB i u fizičku memoriju smešteni su odmah jedan iza drugog, pri čemu segment broj 0 počinje od fizičke adrese F000h. Prikazati logičku strukturu virtuelne adrese i izračunati u koju fizičku adresu se preslikava virtuelna adresa 2564h.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
VA: 2^30B, segment 4KB = 2^12B, AU = 1B&lt;br /&gt;
&lt;br /&gt;
limit: 2KB&lt;br /&gt;
&lt;br /&gt;
VA(30) : segment(18) : offset(12)&lt;br /&gt;
&lt;br /&gt;
VA = 2564h -&amp;gt; segment = 2, offset = 564&lt;br /&gt;
&lt;br /&gt;
PA = 11564&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
bjasniti kako se znakovno orijentisani sekvencijalni ulazni uređaj može učiniti (virtuelno) istim takvim, ali sa direktnim pristupom?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako je tekući direktorijum nekog procesa &amp;lt;code&amp;gt;/a/b/c&amp;lt;/code&amp;gt;, koja je apsolutna staza do fajla koga ovaj proces otvara zadajući sledeću stazu: &amp;lt;code&amp;gt;../../d/e/../f.txt&amp;lt;/code&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;code&amp;gt;/a/d/f.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki fajl sistem koristi kombinovani indeksirani pristup alokaciji fajlova sa indeksima od jednog do tri nivoa. Objasniti zašto taj fajl sistem pokušava da alocira blokove za sadržaj fajla što bliže jedan drugome na disku, kad god je to moguće? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Da bi vreme pristupa blokovima bilo što kraće.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2017&amp;diff=2920</id>
		<title>ОС1/Јун 2017</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_2017&amp;diff=2920"/>
		<updated>2021-09-20T11:29:10Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: средити 7. задатак (&amp;lt;math&amp;gt;)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2017/jun/Jun%202017.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je multiprogramiranje, a šta multiprocesiranje? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јануар 2014#1. zadatak|januarskog roka 2014]].&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti kako se obezbeđuje međusobno isključenje pristupa kritičnim sekcijama jezgra operativnog sistema od strane uporednih tokova kontrole (niti) koji se izvršavaju na istom, odnosno na različitim procesorima. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Фебруар 2014#2. zadatak|februarskog roka 2014]].&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem sistemskog poziva &amp;lt;code&amp;gt;create_thread(void(*f)(void*),void* p)&amp;lt;/code&amp;gt; koji kreira nit koja izvršava datu funkciju &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; sa datim argumentom &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, na jeziku C napisati program koji u &#039;&#039;n&#039;&#039; uporednih niti izračunava kvadrat svakog elementa nekog celobrojnog niza (&amp;lt;code&amp;gt;a[i]*=a[i]&amp;lt;/code&amp;gt;) veličine &amp;lt;code&amp;gt;n*k&amp;lt;code&amp;gt;, tako što svaka nit obrađuje &#039;&#039;k&#039;&#039; elemanata (jednu particiju niza). &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;
int n = ...;&lt;br /&gt;
int k = ...;&lt;br /&gt;
int a[n*k];&lt;br /&gt;
&lt;br /&gt;
void square(void* p) {&lt;br /&gt;
	int part = *(int*)(p);&lt;br /&gt;
	part *= k;&lt;br /&gt;
	for(int i = 0; i &amp;lt; k; i++)&lt;br /&gt;
		a[part + i] *= a[part + i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main() {&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
		create_thread(square, &amp;amp;i);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem  standardnih brojačkih semafora u  školskom jezgru,  na jeziku C++ napisati implementaciju ograničenog bafera (&#039;&#039;bounded buffer&#039;&#039;). &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Октобар 2011#4. zadatak|oktobarskog roka 2011]].&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako u svom C programu ni u jednom fajlu ne definišete funkciju &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;, ko će prijaviti grešku i kog tipa, prevodilac ili linker? Precizno obrazložiti na osnovu čega se ta greška prijavljuje. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Linker prijavljuje grešku tipa simbol main nije definisan. Kada se povezuje C/C++ program, lista obj fajlova mora da sadrži i obavezno generiše modul koji poziva funkciju main, pa je zato i referiše kao spoljni simbol kog uvozi, što dovodi do greške ako ga nema.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Precizno objasniti zašto klasičan linker svoj posao obavlja u dva prolaza (a ne može samo u jednom). Obrazloženje ilustrovati primerom. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U prvom prolazu linker pravi globalnu mapu .obj fajlova i globalno definisanih izvezenih simbola i njihovih adresa relativno u odnosu na početak .obj fajla. U drugom prolazu razrešava nerazrešena adresna polja koristeći definisane simbole u tabeli simbola.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelni  adresni  prostor  je  veličine  1GB,  organizovan  je  segmentno,  sa  maksimalnom veličinom segmenta od 4KB, adresibilna jedinica je bajt. Svi segmenti nekog procesa su stvarne veličine od po 2KB i u fizičku memoriju smešteni su odmah jedan iza drugog, pri čemu segment broj 0 počinje od fizičke adrese F000h. Prikazati logičku strukturu virtuelne adrese i izračunati u koju fizičku adresu se preslikava virtuelna adresa 2564h.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
VA: 2^30B, segment 4KB = 2^12B, AU = 1B&lt;br /&gt;
&lt;br /&gt;
limit: 2KB&lt;br /&gt;
&lt;br /&gt;
VA(30) : segment(18) : offset(12)&lt;br /&gt;
&lt;br /&gt;
VA = 2564h -&amp;gt; segment = 2, offset = 564&lt;br /&gt;
&lt;br /&gt;
PA = 11564&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
bjasniti kako se znakovno orijentisani sekvencijalni ulazni uređaj može učiniti (virtuelno) istim takvim, ali sa direktnim pristupom?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako je tekući direktorijum nekog procesa &amp;lt;code&amp;gt;/a/b/c&amp;lt;/code&amp;gt;, koja je apsolutna staza do fajla koga ovaj proces otvara zadajući sledeću stazu: &amp;lt;code&amp;gt;../../d/e/../f.txt&amp;lt;/code&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;code&amp;gt;/a/d/f.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki fajl sistem koristi kombinovani indeksirani pristup alokaciji fajlova sa indeksima od jednog do tri nivoa. Objasniti zašto taj fajl sistem pokušava da alocira blokove za sadržaj fajla što bliže jedan drugome na disku, kad god je to moguće? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Da bi vreme pristupa blokovima bilo što kraće.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2016&amp;diff=2919</id>
		<title>ОС1/Јун 2016</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_2016&amp;diff=2919"/>
		<updated>2021-09-20T11:14:34Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2016/jun/Jun%202016.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta se smatralo najvećim nedostatkom prvobitnih paketnih (&#039;&#039;batch&#039;&#039;)  sistema  i  kako  je  taj nedostatak rešen?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prvobitni batch sistemi su efikasno delili resurse ali nisu interaktivni. Osnovni nedostatak bio je slabo iskorišćenje glavnog resursa računara - procesora. Nedostatak je rešen uvođenjem time sharing-a&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem funkcije &amp;lt;code&amp;gt;yield(jmp_buf old, jmp_buf new)&amp;lt;/code&amp;gt; koja čuva kontekst jedne niti i predaje procesor drugoj niti, realizovati operaciju &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; na brojačkom semaforu u školskom jezgru&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Октобар 2013#2. zadatak|oktobarskog roka 2013]].&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za sledeće slučajeve navesti u koje stanje prelazi tekući (&#039;&#039;running&#039;&#039;) proces i naznačiti da li se to dešava kao posledica sistemskog poziva od strane tog tekućeg procesa ili spoljašnjeg prekida. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
___________________________________________________________________________________________________________________________________&lt;br /&gt;
| Slučaj                                                    | Tekući proces prelazi u stanje: | Uzrok prekid ili sistemski poziv: |&lt;br /&gt;
|___________________________________________________________|_________________________________|___________________________________|&lt;br /&gt;
| Istek vremenskog kvantuma kod timesharing sistema         |            ready                |              prekid               |&lt;br /&gt;
|___________________________________________________________|_________________________________|___________________________________|&lt;br /&gt;
| Operacija wait na semaforu koji ima vrednost 0            |            blocked              |         sistemski poziv           |&lt;br /&gt;
|___________________________________________________________|_________________________________|___________________________________|&lt;br /&gt;
| Došlo vreme aktivacije prioritetnijeg periodičnog procesa |            ready                |              prekid               |&lt;br /&gt;
|___________________________________________________________|_________________________________|___________________________________|&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati kod koji realizuje Petersonov algoritam međusobnog isključenja dva uporedna procesa pomoću uposlenog čekanja. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
shared var turn : integer := 1, flag1, flag2 : boolean := false;&lt;br /&gt;
&lt;br /&gt;
process P1 &lt;br /&gt;
begin &lt;br /&gt;
  loop &lt;br /&gt;
    flag1 := true; turn := 2; &lt;br /&gt;
    while flag2 and turn = 2 do null; &lt;br /&gt;
    &amp;lt;critical section&amp;gt; &lt;br /&gt;
    flag1 := false; &lt;br /&gt;
    &amp;lt;non-critical section&amp;gt; &lt;br /&gt;
  end &lt;br /&gt;
end P1;&lt;br /&gt;
&lt;br /&gt;
process P2 &lt;br /&gt;
begin &lt;br /&gt;
  loop &lt;br /&gt;
    flag2 := true; turn := 1; &lt;br /&gt;
    while flag1 and turn = 1 do null; &lt;br /&gt;
    &amp;lt;critical section&amp;gt; &lt;br /&gt;
    flag2 := false; &lt;br /&gt;
    &amp;lt;non-critical section&amp;gt; &lt;br /&gt;
  end &lt;br /&gt;
end P2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Precizno objasniti zašto klasičan linker svoj posao obavlja u dva prolaza (a ne može samo u jednom). Obrazloženje ilustrovati primerom. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U prvom prolazu linker pravi globalnu mapu .obj fajlova i globalno definisanih izvezenih simbola i njihovih adresa relativno u odnosu na početak .obj fajla. U drugom prolazu razrešava nerazrešena adresna polja koristeći definisane simbole u tabeli simbola.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelni  adresni  prostor  sistema  je  8GB,  adresibilna  jedinica  je  16-bitna reč, a virtuelni adresni prostor je organizovan stranično sa stranicom veličine 32KB. Fizički adresni prostor je veličine 2GB. Tabele preslikavanja  stranica  su  organizovane  u  dva  nivoa,  s  tim  da  tabela  prvog nivoa  ima  2K  ulaza.  Svaki  ulaz  u  PMT  oba  nivoa  zauzima  samo  onoliko  koliko  je potrebno da se smesti broj okvira (PMT drugog nivoa je poravnata na okvir). Koliko memorije zauzimaju ukupno PMT procesa koji je alocirao svojih prvih 128 stranica?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
VAS: 2^33B -&amp;gt; VA: 32b, page size 32KB = 2^15B -&amp;gt; page 14b, AU = 2B&lt;br /&gt;
&lt;br /&gt;
PAS: 2GB = 2^31B -&amp;gt; PA: 30b&lt;br /&gt;
&lt;br /&gt;
PMT1: 2K = 2^11 -&amp;gt; 11b&lt;br /&gt;
&lt;br /&gt;
VA: page1(11) : page2(7) : offset(14)&lt;br /&gt;
&lt;br /&gt;
128 stranica -&amp;gt; PMT1 i 1 PMT2 = 2^11 * 2^2 + 2^7 * 2^2 = 8.5KB&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki sistem sa straničnom organizacijom memorije koristi tehniku &#039;&#039;copy  on  write&#039;&#039;.  Jedan proces je tek kreirao drugi proces pozivom &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;. Ako novokreirani proces odmah po pokretanju izvrši operaciju upisa u memoriju, koji izuzetak će generisati procesor, &#039;&#039;page  fault&#039;&#039;  ili  neki  drugi  i koji? Precizno objasniti zašto i kako.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati program  koji  prenosi  blok podataka zadate dužine sa zadate adrese na izlazni uređaj korišćenjem programiranog ulaza/izlaza sa prozivanjem (polling).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
		LD R1, blockAddr&lt;br /&gt;
		LD R2, cnt&lt;br /&gt;
		ST [ctrl], #0..1&lt;br /&gt;
wait:	LD R0, [status]&lt;br /&gt;
		AND R0, #1..0&lt;br /&gt;
		JZ wait&lt;br /&gt;
		LD R0, [R1]&lt;br /&gt;
		ST [data], R0&lt;br /&gt;
		INC R1&lt;br /&gt;
		DEC R2&lt;br /&gt;
		JNZ wait&lt;br /&gt;
		ST [ctrl], R0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako  fajl  sistem  koristi  dve  vrste  ključeva,  deljeni (&#039;&#039;shared&#039;&#039;)  i  ekskluzivni  (&#039;&#039;exclusive&#039;&#039;),  sa implicitnim  zaključavanjem prilikom otvaranja fajla, koji ključ će biti zahtevan od strane procesa koji otvara fajl sa najavom samo operacije čitanja?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki sistem evidentira slobodne blokove fajl sistema tako što u jedan slobodan blok smešta spisak (indeks) do &#039;&#039;n&#039;&#039; narednih slobodnih blokova (najmanje 0, najviše &#039;&#039;n&#039;&#039;), kao i broj sledećeg takvog indeksnog bloka. Koliki je broj blokova kojima sistem treba da pristupi (na čitanje ili upis) u najgorem slučaju prilikom alokacije jednog slobodnog bloka za sadržaj fajla? Broj prvog takvog bloka u lancu je globalni podatak koji se nalazi u memoriji i njegova eventualna izmena se ne broji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2016&amp;diff=2918</id>
		<title>ОС1/Јун 2016</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_2016&amp;diff=2918"/>
		<updated>2021-09-20T11:13:26Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: наместити табелу у 3. задатку и средити испис за 6. задатак&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2016/jun/Jun%202016.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta se smatralo najvećim nedostatkom prvobitnih paketnih (&#039;&#039;batch&#039;&#039;)  sistema  i  kako  je  taj nedostatak rešen?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prvobitni batch sistemi su efikasno delili resurse ali nisu interaktivni. Osnovni nedostatak bio je slabo iskorišćenje glavnog resursa računara - procesora. Nedostatak je rešen uvođenjem time sharing-a&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem funkcije &amp;lt;code&amp;gt;yield(jmp_buf old, jmp_buf new)&amp;lt;/code&amp;gt; koja čuva kontekst jedne niti i predaje procesor drugoj niti, realizovati operaciju wait na brojačkom semaforu u školskom jezgru&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Октобар 2013#2. zadatak|oktobarskog roka 2013]].&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za sledeće slučajeve navesti u koje stanje prelazi tekući (&#039;&#039;running&#039;&#039;) proces i naznačiti da li se to dešava kao posledica sistemskog poziva od strane tog tekućeg procesa ili spoljašnjeg prekida. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
___________________________________________________________________________________________________________________________________&lt;br /&gt;
| Slučaj                                                    | Tekući proces prelazi u stanje: | Uzrok prekid ili sistemski poziv: |&lt;br /&gt;
|___________________________________________________________|_________________________________|___________________________________|&lt;br /&gt;
| Istek vremenskog kvantuma kod timesharing sistema         |            ready                |              prekid               |&lt;br /&gt;
|___________________________________________________________|_________________________________|___________________________________|&lt;br /&gt;
| Operacija wait na semaforu koji ima vrednost 0            |            blocked              |         sistemski poziv           |&lt;br /&gt;
|___________________________________________________________|_________________________________|___________________________________|&lt;br /&gt;
| Došlo vreme aktivacije prioritetnijeg periodičnog procesa |            ready                |              prekid               |&lt;br /&gt;
|___________________________________________________________|_________________________________|___________________________________|&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati kod koji realizuje Petersonov algoritam međusobnog isključenja dva uporedna procesa pomoću uposlenog čekanja. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
shared var turn : integer := 1, flag1, flag2 : boolean := false;&lt;br /&gt;
&lt;br /&gt;
process P1 &lt;br /&gt;
begin &lt;br /&gt;
  loop &lt;br /&gt;
    flag1 := true; turn := 2; &lt;br /&gt;
    while flag2 and turn = 2 do null; &lt;br /&gt;
    &amp;lt;critical section&amp;gt; &lt;br /&gt;
    flag1 := false; &lt;br /&gt;
    &amp;lt;non-critical section&amp;gt; &lt;br /&gt;
  end &lt;br /&gt;
end P1;&lt;br /&gt;
&lt;br /&gt;
process P2 &lt;br /&gt;
begin &lt;br /&gt;
  loop &lt;br /&gt;
    flag2 := true; turn := 1; &lt;br /&gt;
    while flag1 and turn = 1 do null; &lt;br /&gt;
    &amp;lt;critical section&amp;gt; &lt;br /&gt;
    flag2 := false; &lt;br /&gt;
    &amp;lt;non-critical section&amp;gt; &lt;br /&gt;
  end &lt;br /&gt;
end P2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Precizno objasniti zašto klasičan linker svoj posao obavlja u dva prolaza (a ne može samo u jednom). Obrazloženje ilustrovati primerom. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U prvom prolazu linker pravi globalnu mapu .obj fajlova i globalno definisanih izvezenih simbola i njihovih adresa relativno u odnosu na početak .obj fajla. U drugom prolazu razrešava nerazrešena adresna polja koristeći definisane simbole u tabeli simbola.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelni  adresni  prostor  sistema  je  8GB,  adresibilna  jedinica  je  16-bitna reč, a virtuelni adresni prostor je organizovan stranično sa stranicom veličine 32KB. Fizički adresni prostor je veličine 2GB. Tabele preslikavanja  stranica  su  organizovane  u  dva  nivoa,  s  tim  da  tabela  prvog nivoa  ima  2K  ulaza.  Svaki  ulaz  u  PMT  oba  nivoa  zauzima  samo  onoliko  koliko  je potrebno da se smesti broj okvira (PMT drugog nivoa je poravnata na okvir). Koliko memorije zauzimaju ukupno PMT procesa koji je alocirao svojih prvih 128 stranica?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
VAS: 2^33B -&amp;gt; VA: 32b, page size 32KB = 2^15B -&amp;gt; page 14b, AU = 2B&lt;br /&gt;
&lt;br /&gt;
PAS: 2GB = 2^31B -&amp;gt; PA: 30b&lt;br /&gt;
&lt;br /&gt;
PMT1: 2K = 2^11 -&amp;gt; 11b&lt;br /&gt;
&lt;br /&gt;
VA: page1(11) : page2(7) : offset(14)&lt;br /&gt;
&lt;br /&gt;
128 stranica -&amp;gt; PMT1 i 1 PMT2 = 2^11 * 2^2 + 2^7 * 2^2 = 8.5KB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki sistem sa straničnom organizacijom memorije koristi tehniku &#039;&#039;copy  on  write&#039;&#039;.  Jedan proces je tek kreirao drugi proces pozivom &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;. Ako novokreirani proces odmah po pokretanju izvrši operaciju upisa u memoriju, koji izuzetak će generisati procesor, &#039;&#039;page  fault&#039;&#039;  ili  neki  drugi  i koji? Precizno objasniti zašto i kako.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati program  koji  prenosi  blok podataka zadate dužine sa zadate adrese na izlazni uređaj korišćenjem programiranog ulaza/izlaza sa prozivanjem (polling).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
		LD R1, blockAddr&lt;br /&gt;
		LD R2, cnt&lt;br /&gt;
		ST [ctrl], #0..1&lt;br /&gt;
wait:	LD R0, [status]&lt;br /&gt;
		AND R0, #1..0&lt;br /&gt;
		JZ wait&lt;br /&gt;
		LD R0, [R1]&lt;br /&gt;
		ST [data], R0&lt;br /&gt;
		INC R1&lt;br /&gt;
		DEC R2&lt;br /&gt;
		JNZ wait&lt;br /&gt;
		ST [ctrl], R0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako  fajl  sistem  koristi  dve  vrste  ključeva,  deljeni (&#039;&#039;shared&#039;&#039;)  i  ekskluzivni  (&#039;&#039;exclusive&#039;&#039;),  sa implicitnim  zaključavanjem prilikom otvaranja fajla, koji ključ će biti zahtevan od strane procesa koji otvara fajl sa najavom samo operacije čitanja?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki sistem evidentira slobodne blokove fajl sistema tako što u jedan slobodan blok smešta spisak (indeks) do &#039;&#039;n&#039;&#039; narednih slobodnih blokova (najmanje 0, najviše &#039;&#039;n&#039;&#039;), kao i broj sledećeg takvog indeksnog bloka. Koliki je broj blokova kojima sistem treba da pristupi (na čitanje ili upis) u najgorem slučaju prilikom alokacije jednog slobodnog bloka za sadržaj fajla? Broj prvog takvog bloka u lancu je globalni podatak koji se nalazi u memoriji i njegova eventualna izmena se ne broji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2014&amp;diff=2917</id>
		<title>ОС1/Јун 2014</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_2014&amp;diff=2917"/>
		<updated>2021-09-20T10:58:23Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: јун 2014&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2014/jun/OS1%20jun%202014.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti značenje pojmova multiprogramiranje i multiprocesiranje.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јануар 2014#1. zadatak|januarskog roka 2014]].&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih bibliotečnih funkcija &amp;lt;code&amp;gt;setjmp()&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;longjmp()&amp;lt;/code&amp;gt; implementirati funkciju &amp;lt;code&amp;gt;void yield(jmp_buf old, jmp_buf new)&amp;lt;/code&amp;gt; koja vrši promenu konteksta procesora.&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 yield(jmp_buf old, jmp_buf new) {&lt;br /&gt;
	if(setjmp(old) == 0)&lt;br /&gt;
		longjmp(new, 1);&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;
Korišćenjem niti u školskom jezgru (klasa &amp;lt;code&amp;gt;Thread&amp;lt;/code&amp;gt;) napisati kod koji konkurentno i rekurzivno  obilazi  binarno  stablo  tako  što  tekuća  nit  nastavlja  da  obilazi  levo  podstablo,  a  kreira  novu  nit  koja  će  obići  desno  podstablo.  Struktura  &amp;lt;code&amp;gt;Node {Node *left, *right}&amp;lt;/code&amp;gt;  predstavlja  čvor stabla&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;
class myThread : public Thread {&lt;br /&gt;
	public:&lt;br /&gt;
		myThread(Node* root) {&lt;br /&gt;
			this-&amp;gt;root = root;&lt;br /&gt;
			start();&lt;br /&gt;
		}&lt;br /&gt;
	protected:&lt;br /&gt;
		void run() {&lt;br /&gt;
			visit(root);&lt;br /&gt;
		}&lt;br /&gt;
	private:&lt;br /&gt;
		Node* root;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void visit(Node* root) {&lt;br /&gt;
	if(root-&amp;gt;right)&lt;br /&gt;
		new myThread(root-&amp;gt;right);&lt;br /&gt;
	if(root-&amp;gt;left)&lt;br /&gt;
		visit(root-&amp;gt;left);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora napisati kod za kontrolu kritične sekcije koju uporedo sme da izvršava najviše &#039;&#039;N&#039;&#039; procesa. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јул 2013#4. zadatak|julskog roka 2013]].&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je osnovni razlog toga (osnovni problem koji se rešava time) što linker svoj posao obavlja u dva prolaza? Precizno i kratko objasniti. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Osnovni problem je kako povezati prevedene objektne fajlove u jedinstveni izvršivi fajl i rešiti obraćanje promenljivoj ili funkciji u drugom fajlu.&lt;br /&gt;
Linker ne zna apsolutnu poziciju simbola unutar fajla dok ne spoji sve fajlove pa tek onda može da razrešava.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti  kako  se  kod  kontinualne  alokacije  memorije  obezbeđuje  zaštita  memorijskog  prostora drugih procesa od ilegalnog adresiranja jednog procesa. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Zaštita memorijskog prostora drugih procesa od ilegalnog adresiranja jednog procesa kod kontinualne alokacije se obezbeđuje limit registrom. U ovaj registar procesora OS upisuje vrednost prilikom promene konteksta.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu sa straničnom organizacijom virtuelne memorije virtuelna i fizička adresa su  32-bitne,  adresibilna  jedinica  je  bajt,  a  stranica  je veličine  64  KB.  PMT  je  organizovana  u  dva nivoa i jedan ulaz u PMT oba nivoa zauzima po jednu 32-bitnu reč. PMT oba nivoa su iste veličine. Koliko ukupno zauzimaju PMT za proces koji je alocirao samo svoju prvu i poslednju stranicu?  &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti tehniku dvostrukog baferisanja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki  fajl  sistem  koristi  dve  vrste  ključeva  za  fajlove, deljene  i  ekskluzivne,  i  fajlove zaključava  prilikom otvaranja fajla, u zavisnosti od najavljenog načina korišćenja fajla. Procesi A, B, C i  D izvršavaju  sistemske pozive otvaranja i zatvaranja istog  fajla u sledećem redosledu (neki proces izvršava poziv zatvaranja fajla samo ako ga je uspešno otvorio):&lt;br /&gt;
#A: open(READ)&lt;br /&gt;
#B: open(WRITE)&lt;br /&gt;
#C: open(READ)&lt;br /&gt;
#A: close&lt;br /&gt;
#C: close&lt;br /&gt;
#D: open(WRITE)&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koliko pristupa blokovima na disku treba izvršiti za pristup &#039;&#039;n&#039;&#039;-tom logičkom bloku sadržaja fajla  ako  je  alokacija  fajla  &lt;br /&gt;
# indeksna,  pri  čemu  je indeks  fajla  uvek  u  dva  nivoa,  a  na  blok  sa indeksom prvog nivoa ukazuje polje u FCB, &lt;br /&gt;
# ulančana lista, pri čemu je glava liste u FCB? FCB fajla je u memoriji. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</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=2916</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=2916"/>
		<updated>2021-09-20T10:39:47Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: средити 10. задатак &amp;lt;math&amp;gt;&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 zadatak iz [[ОС1/Јун 2011#1. zadatak|junskog roka 2011]].&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;
Biće ukupno 4 elemenata sa vrednošću različitom od 0.&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;ada&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 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;
Preklopi ne zahtevaju podršku OS-a. Sve obavlja prevodilac i generisani kod. OS samo obezbeđuje usluge za alokaciju dela virtuelnog adresnog prostora.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je definicija strukture FreeSegment 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) continue;&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) return 0;&lt;br /&gt;
	 FreeSegment* newFrag = (FreeSegment*)((char*)bestFit + sz);&lt;br /&gt;
	 if(bestFit-&amp;gt;prev) bestFit-&amp;gt;prev-&amp;gt;next = newFrag;&lt;br /&gt;
	 else freeSegHead = bestFit-&amp;gt;next;&lt;br /&gt;
	 if(bestFit-&amp;gt;next) bestFit-&amp;gt;next-&amp;gt;prev = newFrag;&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;
{{delimično rešeno}}&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;
256GB / 512B = 2^29 blokova&lt;br /&gt;
&lt;br /&gt;
2^29 / 2^3 = 64MB&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2012&amp;diff=2915</id>
		<title>ОС1/Јун 2012</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_2012&amp;diff=2915"/>
		<updated>2021-09-20T10:21:39Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: средити 6. и 7. задатак (&amp;lt;math&amp;gt;)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2012/jun/Jun%202012.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je to sistem sa raspodelom vremena (engl. &#039;&#039;time-sharing&#039;&#039;)?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Sistem sa raspodelom vremena je sistem u kome OS dodeljuje procesor nekom procesu na određeno vreme, zatim se procesu preotima procesor, vrši promena konteksta i procesor predaje drugom procesu kome se ponovo ograničava vreme izvršavanja. Na ovaj način procesi dele vreme na procesoru.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati prevod sledeće rekurzivne funkcije: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int f (int n) { &lt;br /&gt;
  if (n&amp;lt;=0) return 0;&lt;br /&gt;
  else return f(n-1)+1; &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;
f: 		LD R1, #n[SP]&lt;br /&gt;
		LD R0, #0&lt;br /&gt;
		CMP R1, R0&lt;br /&gt;
		JG else&lt;br /&gt;
		RTS			; u R0 je 0&lt;br /&gt;
else:	LD R0, #1&lt;br /&gt;
		SUB R1, R0&lt;br /&gt;
		PUSH R1&lt;br /&gt;
		CALL f&lt;br /&gt;
		POP R1&lt;br /&gt;
		ADD R0, R1&lt;br /&gt;
		RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukoliko su svi sistemski pozivi izvršeni uspešno, koliko procesa se ukupno kreira kada se nad sledećim programom kreira jedan proces (računajući i taj jedan)?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void main () {&lt;br /&gt;
  for (int i=0; i&amp;lt;7; i++) if(fork() &amp;gt; 0) return;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pošto samo dete nastavlja dalje, a pravi se 7 dece, ukupno ima 8 procesa.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora napisati kod dva uporedna procesa koji sarađuju na sledeći način. Proces &#039;&#039;A&#039;&#039; upisuje jednu vrednost u deljenu promenljivu  &#039;&#039;x&#039;&#039;, koju proces &#039;&#039;B&#039;&#039; potom čita. Tek kada je &#039;&#039;B&#039;&#039; pročitao tu vrednost, proces &#039;&#039;A&#039;&#039; upisuje novu vrednost u &#039;&#039;x&#039;&#039;, koju proces &#039;&#039;B&#039;&#039; onda čita, i tako ciklično&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
shared var x : Integer;&lt;br /&gt;
	   semA : Semaphore := 0;&lt;br /&gt;
	   semB : Semaphore := 0;&lt;br /&gt;
&lt;br /&gt;
process A&lt;br /&gt;
	begin&lt;br /&gt;
		loop&lt;br /&gt;
			x = ...&lt;br /&gt;
			signal(semB);&lt;br /&gt;
			wait(semA);&lt;br /&gt;
	end&lt;br /&gt;
end A;&lt;br /&gt;
&lt;br /&gt;
process B&lt;br /&gt;
	begin&lt;br /&gt;
		loop&lt;br /&gt;
			wait(semB);&lt;br /&gt;
			y = ...&lt;br /&gt;
			signal(semA);&lt;br /&gt;
	end&lt;br /&gt;
end B;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki program koristi dve velike strukture podataka naizmenično: najpre za neku  složenu obradu koristi samo prvu strukturu, pa onda za neku drugu obradu koristi samo drugu strukturu, pa onda ponovo prvu, pa drugu itd. Ako se ove dve strukture učitavaju dinamički i preklapaju se (kod korišćenja preklopa, overlays), u kom slučaju će izvršavanje tog programa trajati duže, a u kom će koristiti više memorije: kada se koristi samo dinamičko učitavanje, ili kada se koriste preklopi? Kratko obrazložiti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kod preklopa će izvršavanje trajati duže zbog učitavanja, a dinamičko učitavanje će koristiti više memorije.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki  sistem  primenjuje  kontinualnu  alokaciju  memorije  i  &#039;&#039;best-fit&#039;&#039;  algoritam  alokacije,  pri čemu su segmenti slobodne memorije organizovani u sledeću strukturu podataka:&lt;br /&gt;
#sortiranu ulančanu listu,&lt;br /&gt;
#balansirano binarno stablo. &lt;br /&gt;
&lt;br /&gt;
Koliko segmenata treba obići u najgorem slučaju da bi se pronašao odgovarajući slobodan segment prilikom alokacije, ukoliko je slobodnih segmenata &#039;&#039;n&#039;&#039;? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# n&lt;br /&gt;
# log2(n)&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Učestanost pogotka u TLB je 90%, a PMT je organizovana u dva nivoa. TLB je 10 puta brža nego operativna memorija. Koliko je efektivan pristup memoriji sporiji  od  pristupa  fizičkoj memoriji?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
0.9 * (0.1t_ram + t_ram) + 0.1 * (0.1t_ram + 3t_ram) = 1.3t_ram&lt;br /&gt;
&lt;br /&gt;
30%&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti osnovne operacije klase blokovski orijentisanih uređaja sa direktnim pristupom&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki fajl sistem pruža sledeće operacije u svom API za tekstualne fajlove:&lt;br /&gt;
*&amp;lt;code&amp;gt;int size(FHANDLE)&amp;lt;/code&amp;gt; Vraća trenutnu veličinu sadržaja fajla u znakovima. &lt;br /&gt;
*&amp;lt;code&amp;gt;void append(FHANDLE,int)&amp;lt;/code&amp;gt; Proširuje sadržaj fajla za dati broj znakova na kraju.&lt;br /&gt;
*&amp;lt;code&amp;gt;void seek(FHANDLE,int)&amp;lt;/code&amp;gt; Postavlja kurzor datog fajla na datu poziciju (redni broj znaka počev od 0).&lt;br /&gt;
*&amp;lt;code&amp;gt;void write(FHANDLE,char*,int size)&amp;lt;/code&amp;gt; Na poziciju kurzora datog fajla upisuje dati niz znakova zadate dužine, i pomera kurzor iza upisanog niza znakova.&lt;br /&gt;
&lt;br /&gt;
Operacije &amp;lt;code&amp;gt;seek&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;write&amp;lt;/code&amp;gt; rade samo u opsegu trenutne veličine sadržaja fajla (ne pomeraju kurzor i ne upisuju iza kraja sadržaja fajla). Napisati operaciju &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;write(FHANDLE,int position,char*,int size);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
koja na zadatu poziciju upisuje zadati niz znakova date veličine, pri čemu se fajl implicitno najpre &lt;br /&gt;
proširuje na potrebnu veličinu ukoliko bi zadata pozicija ili zadati upis prekoračio trenutnu veličinu &lt;br /&gt;
sadržaja fajla. Zanemariti sve moguće greške u ulazu/izlazu&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koliko pristupa blokovima na disku treba izvršiti za pristup &#039;&#039;n&#039;&#039;-tom logičkom bloku sadržaja fajla  ako  je  alokacija  fajla &lt;br /&gt;
# ulančana lista blokova, pri čemu na prvi blok sadržaja fajla ukazuje polje u FCB,&lt;br /&gt;
# indeksna, pri čemu je indeks fajla uvek u dva nivoa, a na blok sa indeksom prvog nivoa ukazuje polje u FCB? FCB fajla je u memoriji&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# n&lt;br /&gt;
# 2&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2011&amp;diff=2914</id>
		<title>ОС1/Јун 2011</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_2011&amp;diff=2914"/>
		<updated>2021-09-20T10:10:09Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: јун 2011&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2011/jun/Jun%202011.doc Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dati kratke definicije multiprocesorskog sistema i distribuiranog sistema.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Multiprocesorski sistem je računarski sistem sa više procesora koji imaju zajedničku (deljenu) operativnu memoriju (&#039;&#039;engl. shared memory&#039;&#039;). Procesori mogu da pristupaju toj deljenoj memoriji, tj. da čitaju iz nje i u nju upisuju, npr. preko zajedničke magistrale na koju su povezani.&lt;br /&gt;
&lt;br /&gt;
Distribuirani sistem je računarski sistem sa više procesora koji nemaju zajedničku operativnu memoriju, već svaki procesor ima svoju, ali su svi povezani komunikacionom mrežom.&lt;br /&gt;
	&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koji je razlog deobe procesorskog vremena (&#039;&#039;time sharing&#039;&#039;) kod interaktivnih sistema?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ravnomerniji odziv na akcije više korisnika nego bez deobe vremena.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Zašto je stek deo konteksta izvršavanja programa?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Stek predstavlja deo konteksta izvršavanja programa zato što se prilikom poziva bilo kog potprograma u programu na steku pamti mesto odakle je potprogram pozvan kako bi se po povratku moglo nastaviti odakle se stalo.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati deo koda koji obezbeđuje kritičnu sekciju pomoću brojačkih semafora, uz dozvolu konkurentnog izvršavanja kritične sekcije do &#039;&#039;N&#039;&#039; uporednih procesa.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&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 section&amp;gt;&lt;br /&gt;
	signal(mutex);&lt;br /&gt;
	&amp;lt;non-critical section&amp;gt;&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;
Korišćenjem sistemskih poziva &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;execlp()&amp;lt;/code&amp;gt; napisati C program koji kreira proces nad programom u fajlu čije je ime zadato argumentom komandne linije.&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;
int main(int argc, char* argv[]) {&lt;br /&gt;
	if(argc &amp;lt; 2)&lt;br /&gt;
		return -1;&lt;br /&gt;
	&lt;br /&gt;
	pid_t pid = fork();&lt;br /&gt;
	&lt;br /&gt;
	if(pid &amp;lt; 0)&lt;br /&gt;
		return -2;&lt;br /&gt;
	else if(pid == 0)&lt;br /&gt;
		execlp(argv[1]);&lt;br /&gt;
	else wait(0);&lt;br /&gt;
	&lt;br /&gt;
	return 0;&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. 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;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Da li linker prilikom povezivanja sa ciljem dobijanja izvršnog programa (.exe) pravi razliku između fajlova tipa .obj i tipa .lib?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Linker ne pravi razliku između .obj i .lib fajlova prilikom povezivanja. Razlika je jedino što je .obj fajl nastao prevođenjem jednog fajla dok je lib fajl nastao povezivanjem više objektnih, moguće i više drugih fajlova.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kojom tehnikom se znakovno orijentisani ulazni uređaj može učiniti logički (virtuelno) blokovski orijentisanim?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tehnikom baferisanja.&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;
#uspešan&lt;br /&gt;
#neuspešan&lt;br /&gt;
#uspešan&lt;br /&gt;
#uspešan&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem podataka iz koje tabele otvorenih fajlova sistem proverava pravo pristupa za pozive iz prethodnog zadatka (&amp;lt;code&amp;gt;fread&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;fwrite&amp;lt;/code&amp;gt;), u globalnoj tabeli ili u tabeli koja je deo konteksta datog procesa?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U tabeli koja je kontekst datog procesa.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2015&amp;diff=2913</id>
		<title>ОС1/Јул 2015</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2015&amp;diff=2913"/>
		<updated>2021-09-19T14:23:51Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: средити 7. и 10. задатак&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2015/jul/OS1%20Jul%202015.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je multiprocesorski, a šta distribuirani računarski sistem? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2011#1. zadatak|junskog roka 2011]].&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na  asembleru  nekog  zamišljenog  dvoadresnog  RISC  procesora  sa  &#039;&#039;load/store&#039;&#039;  arhitekturom napisati prevod sledeće rekurzivne C funkcije: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int f (int n) { &lt;br /&gt;
  if (n&amp;lt;=1) return 1; &lt;br /&gt;
  else return f(n-1)+f(n-2); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јул 2014#2. zadatak|julskog roka 2014]].&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem  školskog  jezgra  napisati  kod  koji  omogućava  da  se  kreira  nit  sa  celobrojnim parametrom &#039;&#039;n&#039;&#039;. Ako je &#039;&#039;n&#039;&#039; manje ili jednako 0, ova nit samo ispisuje pozdravnu poruku i završava se. U suprotnom, ova nit će (rekurzivno) kreirati istu takvu nit, ali sa parametrom &#039;&#039;n-1&#039;&#039;.&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;
class myThread : public Thread {&lt;br /&gt;
	public:&lt;br /&gt;
		myThread(int val) {&lt;br /&gt;
			n = val;&lt;br /&gt;
			start();&lt;br /&gt;
		}&lt;br /&gt;
	protected:&lt;br /&gt;
		void run() {&lt;br /&gt;
				if(n &amp;lt;= 0) printf(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
			else new myThread(n - 1);&lt;br /&gt;
		}&lt;br /&gt;
	private:&lt;br /&gt;
		int n;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti koja su to dva osnovna modela (paradigme) međuprocesne komunikacije.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Deljena promenljiva i razmena poruka.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti bar jednu razliku u načinu funkcionisanja linkera kada kao svoj rezultat pravi .exe i kada pravi .lib.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koja dva parametra procesa čine sastavni deo njegovog memorijskog konteksta, a koristi ih hardver  pri  preslikavanju  adresa  kod  kontinualne  alokacije  memorije?  Ukratko  objasniti  njihovo značenje.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Registri base i limit su sastavni deo konteksta procesa. OS ih učitava pri promeni konteksta. Relokatibilnost se obezbeđuje dinamičkim preslikavanjem sa base registrom. Limit registar obezbeđuje zaštitu OS-a od korisničkih procesa i procesa između sebe.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelna  memorija  organizovana  je  stranično,  sa  straničenjem  u  tri  nivoa.  Vreme  pristupa operativnoj memoriji je 50 ns, a TLB-u 10 ns. Procenat pogotka u TLB je 90%. Koliko je efektivno vreme pristupa memoriji?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
0.9*(10 + 50) + 0.1(10 + 4*50) = 75ns&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti bar tri vrste usluga vezanih za realno vreme koje uobičajeno nude operativni sistemi.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
#čitanje tekućeg datuma i vremena&lt;br /&gt;
#vreme proteklo između 2 događaja&lt;br /&gt;
#pokreni datu operaciju u zadato vreme&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Izvod iz jednog uputstva za Unix fajl sistem i dodelu prava pristupa fajlu iz komandne linije: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To change the mode of a file, use the chmod command. The general form is chmod X@Y file1 file2 ... where: X is any combination of the letters &#039;u&#039; (for owner), &#039;g&#039; (for group), &#039;o&#039; (for others), &#039;a&#039; (for all; that  is,  for  &#039;ugo&#039;);  @  is  either  &#039;+&#039;  to  add  permissions,  &#039;-&#039;  to  remove  permissions,  or  &#039;=&#039;  to  assign permissions absolutely; and Y is any combination of &#039;r&#039;, &#039;w&#039;, &#039;x&#039;. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Na primer, komanda  &amp;lt;code&amp;gt;chmod u=rx file&amp;lt;/code&amp;gt; daje vlasniku prava &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;, ali ne i pravo &amp;lt;code&amp;gt;w&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Napisati komande koje za dati fajl postavljaju prava na sledeći način:&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
#grupi i ostalima dodaju prava na rw, ali ne i na x: &amp;lt;code&amp;gt; chmod go+rw file&amp;lt;/code&amp;gt;&lt;br /&gt;
#svima oduzimaju pravo na upis: &amp;lt;code&amp;gt; chmod a-w file&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki  fajl  sistem  podržava  kombinovano  indeksiran  pristup  alokaciji  fajlova,  pri  čemu FCB sadrži  512  ulaza  sa  direktnim  indeksom  (sadrže  brojeve  blokova  za  podatke).  Ako  sadržaj  fajla preraste  veličinu  koju  podržava  ovaj  indeks  nultog  nivoa,  za  blokove  preko  te  veličine  postoji indeks prvog nivoa sa 512 ulaza u FCB; svaki od tih ulaza sadrži pokazivač na indeks drugog nivoa u  kome  je  po  512  ulaza  sa  pokazivačima  na  blokove sa sadržajem. Koliki je maksimalni kapacitet fajla u blokovima? (Odgovor dati kao izraz.) &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
(512 + 512 * 512) * blockSize&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2014&amp;diff=2912</id>
		<title>ОС1/Јул 2014</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2014&amp;diff=2912"/>
		<updated>2021-09-19T13:41:29Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: средити 7. задатак (&amp;lt;math&amp;gt;)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2014/jul/OS1%20Jul%202014.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta  je  bio  osnovni  motiv  za  uvođenje  raspodele  vremena  (engl. &#039;&#039;time-sharing&#039;&#039;) kod interaktivnih sistema? Objasniti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Фебруар 2013#1. zadatak|februarskog roka 2013]].&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na  asembleru  nekog  zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati prevod sledeće rekurzivne funkcije:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int fib (int n) { &lt;br /&gt;
  if (n&amp;lt;=1) return 1; &lt;br /&gt;
  else return fib(n-1)+fib(n-2); &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;
fib:	LD R1, #n[SP]&lt;br /&gt;
		LD R0, #1&lt;br /&gt;
		CMP R1, R0&lt;br /&gt;
		JG else&lt;br /&gt;
		RTS&lt;br /&gt;
else:	SUB R1, R0&lt;br /&gt;
		PUSH R1&lt;br /&gt;
		CALL fib&lt;br /&gt;
		POP R2&lt;br /&gt;
		SUB R1, R0&lt;br /&gt;
		PUSH R1&lt;br /&gt;
		CALL fib&lt;br /&gt;
		POP R0&lt;br /&gt;
		ADD R0, R1&lt;br /&gt;
		RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukoliko su svi sistemski pozivi izvršeni uspešno, koliko procesa se ukupno kreira kada se nad sledećim programom kreira jedan proces (računajući i taj jedan)?&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;c&amp;quot;&amp;gt;	&lt;br /&gt;
void main () {   &lt;br /&gt;
    for (int i=0; i&amp;lt;7; i++) &lt;br /&gt;
        if (fork()==0) &lt;br /&gt;
            return; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
=== Rešenje===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora napisati kod tri uporedna procesa koji sarađuju na sledeći način. Proces &#039;&#039;A&#039;&#039;  upisuje jednu vrednost u deljenu promenljivu &#039;&#039;x&#039;&#039;, a nezavisni  proces &#039;&#039;B&#039;&#039; uporedo upisuje jednu vrednost u deljenu promenljivu &#039;&#039;y&#039;&#039;. Proces &#039;&#039;C&#039;&#039; potom čita &#039;&#039;x&#039;&#039; i &#039;&#039;y&#039;&#039; da bi izračunao njihov zbir. Tek kada je &#039;&#039;C&#039;&#039; pročitao &#039;&#039;x&#039;&#039;, proces &#039;&#039;A&#039;&#039; upisuje novu vrednost u &#039;&#039;x&#039;&#039;; tek kada je &#039;&#039;C&#039;&#039; pročitao vrednost &#039;&#039;y&#039;&#039;, proces &#039;&#039;B&#039;&#039; upisuje novu vrednost u &#039;&#039;y&#039;&#039;, i tako ciklično. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
var: sax : Semaphore := 1, scx : Semaphore := 0, sby : Semaphore := 1, sbc : Semaphore := 0;&lt;br /&gt;
	 x, y, z : Integer;&lt;br /&gt;
&lt;br /&gt;
process A:&lt;br /&gt;
	begin&lt;br /&gt;
		loop&lt;br /&gt;
			wait(sax);&lt;br /&gt;
			x := ...&lt;br /&gt;
			signal(scx);&lt;br /&gt;
	end;&lt;br /&gt;
end A;&lt;br /&gt;
&lt;br /&gt;
process B:&lt;br /&gt;
	begin&lt;br /&gt;
		loop&lt;br /&gt;
			wait(sby);&lt;br /&gt;
			y := ...&lt;br /&gt;
			signal(scy);&lt;br /&gt;
	end;&lt;br /&gt;
end B;&lt;br /&gt;
&lt;br /&gt;
process C:&lt;br /&gt;
	begin&lt;br /&gt;
		loop&lt;br /&gt;
			wait(scx);&lt;br /&gt;
			z := x;&lt;br /&gt;
			signal(sax);&lt;br /&gt;
			wait(scy);&lt;br /&gt;
			z := z + y;&lt;br /&gt;
			signal(sby);&lt;br /&gt;
	end;&lt;br /&gt;
end A;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki program koristi dve velike strukture podataka naizmenično: najpre za neku složenu obradu koristi samo prvu strukturu, pa onda za neku drugu obradu koristi samo drugu strukturu, pa onda ponovo prvu, pa drugu itd. Ako se ove dve strukture učitavaju dinamički i preklapaju se (kod korišćenja preklopa, &#039;&#039;overlays&#039;&#039;), u kom slučaju će izvršavanje tog programa trajati duže, a u kom će koristiti više memorije: kada se koristi samo dinamičko učitavanje, ili kada se koriste preklopi? Kratko obrazložiti. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kod preklopa će ivršavanje trajati duže zbog toliko učitavanja a dinamičko učitavanje će koristiti više memorije.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki  sistem  primenjuje  kontinualnu  alokaciju  memorije.  Kakva  je  hardverska  podrška potrebna  za  ovaj  pristup  da  bi se obezbedila: &lt;br /&gt;
#relokatibilnost procesa&lt;br /&gt;
#zaštita memorijskog prostora jednog procesa od drugih procesa?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
#relokatibilnost procesa - kompakcija slobodnog prostora -&amp;gt; kernel realocira sve procese tako da ih slaže jedan iza drugog redom tako da sav slobodan prostor fuzioniše u jedan slobodan fragment.&lt;br /&gt;
#zaštita memorijskog prostora - limit registar&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Učestanost pogotka u TLB je 90%, a PMT je organizovana u tri nivoa. TLB je 10 puta brža nego operativna  memorija.  Za  koliko  procenata  je  efektivan  pristup  memoriji  sporiji  od  pristupa fizičkoj memoriji? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
t_TLB = 0.1 t_RAM&lt;br /&gt;
&lt;br /&gt;
0.9 * (t_TLB + t_RAM) + 0.1 * (t_TLB + 4 * t_RAM) = 1.4 t_RAM&lt;br /&gt;
&lt;br /&gt;
Odnos: (1.4 - 1) / 1 = 40%&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti osnovne operacije klase znakovno-orijentisanih ulazno/izlaznih uređaja (tokova).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki fajl sistem pruža sledeće operacije u svom API za tekstualne fajlove: &lt;br /&gt;
#&amp;lt;code&amp;gt;int size(FHANDLE)&amp;lt;/code&amp;gt; Vraća trenutnu veličinu sadržaja fajla u znakovima. &lt;br /&gt;
#&amp;lt;code&amp;gt;void append(FHANDLE,int)&amp;lt;/code&amp;gt; Proširuje sadržaj fajla za dati broj znakova na kraju. &lt;br /&gt;
#&amp;lt;code&amp;gt;void seek(FHANDLE,int)&amp;lt;/code&amp;gt; Postavlja kurzor datog fajla na datu poziciju (redni broj znaka počev od 0). &lt;br /&gt;
#&amp;lt;code&amp;gt;void write(FHANDLE,char*,int size)&amp;lt;/code&amp;gt; Na poziciju kurzora datog fajla upisuje dati niz znakova zadate dužine, i pomera kurzor iza upisanog niza znakova. Operacije seek i write rade samo u opsegu trenutne veličine sadržaja fajla (ne pomeraju kurzor i ne upisuju iza kraja sadržaja fajla). &lt;br /&gt;
&lt;br /&gt;
Napisati operaciju &amp;lt;code&amp;gt;write(FHANDLE,int position,char*,int size);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
koja na zadatu poziciju upisuje zadati niz znakova date veličine, pri čemu se fajl implicitno najpre proširuje na potrebnu veličinu ukoliko bi zadata pozicija ili zadati upis prekoračio trenutnu veličinu sadržaja fajla. Zanemariti sve moguće greške u ulazu/izlazu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti kako se u fajl sistemu tipa FAT vodi evidencija o slobnom prostoru. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Slobodni blokovi se ulančavaju u listu pokazivača koji se nalaze u svakom bloku. Alokacija jednog bloka je jednostavna. Uzima se prvi blok iz liste. FAT varijanta je inherentna - ulazi za slobodne blokove u FAT su posebno označeni.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11&amp;diff=2911</id>
		<title>ОС1</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11&amp;diff=2911"/>
		<updated>2021-09-19T13:20:27Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: промењен начин сортирања&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Оперативни системи 1&#039;&#039;&#039; су обавезан предмет у четвртом семестру.&lt;br /&gt;
&lt;br /&gt;
== Странице ==&lt;br /&gt;
* [http://os.etf.bg.ac.rs/OS1/ Страница предмета]&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
{{Материјали&lt;br /&gt;
| suetf          = ir2os1&lt;br /&gt;
| vuk            = 1861zDxYoWeF7meMNlUweyGvGJtPkafQz&lt;br /&gt;
| box            = 8383729297&lt;br /&gt;
| scientificmind = IR2OS1&lt;br /&gt;
}}&lt;br /&gt;
* [[github:nikolabebic95/Fakultet/tree/master/Godina2/OS1|&#039;&#039;GitHub&#039;&#039; налог nikolabebic95]]&lt;br /&gt;
* [https://drive.google.com/open?id=1lMu2cdbvaUjVMdUCa5lhu7K59lDN02w8 Неки решени испити] (Богдан Бебић)&lt;br /&gt;
* [[github:KockaAdmiralac/OS1-kolokvijumi|Сви колоквијуми спојени у један документ и категорисани по области, спремни за штампу]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Предавања ==&lt;br /&gt;
Овде се наводе све битне информације у вези са предавањима на предмету, као и потребни материјали.&lt;br /&gt;
&lt;br /&gt;
== Вежбе ==&lt;br /&gt;
Овде се наводе све битне информације у вези са вежбама на предмету, као и потребни материјали.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Пројекат се обично ради са Borland C++ 3.1 преводиоцем на 32-битној Windows 7 виртуелној машини. Обично се ради на језгру процесора чији је задатак да управља више нити. Пројекат се може предати и у предроку, а пројекти предати у предроку који су такође међу најбоље урађеним добијају бонус 10% бодова уколико је студент из текуће генерације. Пројекат носи 30% укупне оцене, и предаја пројекта је услов за излазак на испит.&lt;br /&gt;
&lt;br /&gt;
Корисни материјали за израду пројекта:&lt;br /&gt;
* &#039;&#039;&#039;[https://drive.google.com/open?id=1FfSk-shJZ2_ZyA9GGEC8Pp3KEYH94zlT Водич за пројекат]&#039;&#039;&#039; (Алекса Митровић и Кристијан Жижа)&lt;br /&gt;
* [https://gist.github.com/lazanet/4c60bca936fdf6ce6f813f98cadf0c27 Покретање пројекта без виртуелне машине на Linux-у] (Лазар Митровић)&lt;br /&gt;
* [https://gist.github.com/bogdanbebic/e0ed7002e1341715c26c4599b0726586 Упутства за постављање Borland C++ 3.1 у Visual Studio Code окружењу и честе грешке при изради пројекта] (Богдан Бебић)&lt;br /&gt;
** [https://drive.google.com/open?id=1sZYVGqPz1NNcEvSRCuICKryXMvrxrnY_ Додатне датотеке за постављање у Visual Studio Code]&lt;br /&gt;
* [[Медиј:OS1 modifikacija jul 2020.pdf|Модификације дате на одбрани пројекта у јулу 2020. године]]&lt;br /&gt;
* [http://www.bitsavers.org/pdf/borland/borland_C++/Borland_C++_Version_3.1_Users_Guide_1992.pdf Корисничко упутство за Borland C++ 3.1 преводилац]&lt;br /&gt;
* [[Медиј:OS1 vodič 2019.pdf|Водич из 2018/2019. године (Милош Јовановић, 2017/0741)]]&lt;br /&gt;
=== Модификације ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| namespace       =&lt;br /&gt;
| titleregexp     = ОС1/Модификације .*&lt;br /&gt;
| noresultsheader = Тренутно нема модификација.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦17¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Док колоквијуми на предмету увек имају решења, испити обично немају, тако да су овде сакупљени неки решени рокови.&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| namespace       =&lt;br /&gt;
| titleregexp     = ОС1/[^ ]* \d+&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]],,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
Доступан је уџбеник из предмета од 2020. године:&lt;br /&gt;
* &#039;&#039;&#039;[https://www.mikroknjiga.rs/store/prikaz.php?ref=978-86-7555-446-2 Основи оперативних система]&#039;&#039;&#039; Драган Милићев, &#039;&#039;Издавач: Микро Књига, Београд&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;Pr&amp;lt;/math&amp;gt; — Бодови са пројекта (0-30)&lt;br /&gt;
* &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; — Бодови са колоквијума (0-40)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са писменог дела испита (0-30)&lt;br /&gt;
* Укупни бодови: &amp;lt;math&amp;gt;P = Pr + K + I&amp;lt;/math&amp;gt;&lt;br /&gt;
* Услов: &amp;lt;math&amp;gt;K \geq 16&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;I &amp;gt; 15&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Рачунање ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;calculator&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;PR&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;PR&amp;quot; data-max=&amp;quot;40&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;K&amp;quot; data-max=&amp;quot;40&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;I&amp;quot; data-max=&amp;quot;30&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;P&amp;quot; data-expression=&amp;quot;PR K I + + I 15 - 1 min 0 max * K 15.99 - ceil 1 min 0 max *&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Оцена: &amp;lt;span data-expression=&amp;quot;P 10 / ceil 5 max 10 min&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|rešenja}} (Ово се конкретно односи на испите, пошто су колоквијуми већ решени.)&lt;br /&gt;
*: Рокови код којих нису сви задаци решени су: {{rokovi|делимично решени}}&lt;br /&gt;
* {{zadaci|prepis}}&lt;br /&gt;
** Модификације за пројекат од 2018 до 2020. године: [https://cdn.discordapp.com/attachments/693907701771665448/858783731958153236/modifikacije.zip]&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Четврти семестар]]&lt;br /&gt;
[[Категорија:Обавезни предмети]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2013&amp;diff=2910</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%BB_2013&amp;diff=2910"/>
		<updated>2021-09-19T12:06:18Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: јул 2013&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2013/jul/OS1%20-%20Jul%202013.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti pojam raspodele vremena (&#039;&#039;time sharing&#039;&#039;) kod multiprocesnih sistema. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
OS dodeljuje procesoru vreme izvršavanja svakog posla i relativno često preuzima procesor. Osnovna ideja je da posao (engl. task) može da izgubi procesor nakon isteka dodeljenog procesorskog vremena ili kada sam zatraži promenu konteksta. Rezultat je da svaki korisnik ima utisak da računar radi samo za njega sa dovoljno dobrim vremenskim odzivom, dok računar opslužuje više korisnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je &#039;&#039;&#039;pogrešna&#039;&#039;&#039; implementacija operacije &amp;lt;code&amp;gt;yield()&amp;lt;/code&amp;gt; za neki troadresni procesor. Ova operacija bi trebalo da izvrši preuzimanje procesora od niti na čiji vrh steka ukazuje vrednost sačuvana na lokaciji na koju ukazuje argument &amp;lt;code&amp;gt;cur&amp;lt;/code&amp;gt;, i predaju procesora niti na čiji vrh steka ukazuje vrednost sačuvana na lokaciji na koju ukazuje argument &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Objasniti zašto ova  implementacija nije ispravna i korigovati je. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void yield (void* cur, void* next) {&lt;br /&gt;
   asm { &lt;br /&gt;
      push r0 &lt;br /&gt;
      push r1 &lt;br /&gt;
      ... &lt;br /&gt;
      push rn &lt;br /&gt;
      add  r0,sp,#cur  &lt;br /&gt;
      mov  [r0],sp &lt;br /&gt;
      add  r0,sp,#next &lt;br /&gt;
      mov  sp,[r0]    &lt;br /&gt;
      pop  rn &lt;br /&gt;
      ... &lt;br /&gt;
      pop  r1 &lt;br /&gt;
      pop  r0 &lt;br /&gt;
      pop  pc ; return &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;
Umesto &amp;lt;code&amp;gt;add r0,sp,#cur&amp;lt;/code&amp;gt; treba napisati &amp;lt;code&amp;gt;mov r0, #cur[sp]&amp;lt;/code&amp;gt;, tj. u &amp;lt;code&amp;gt;r0&amp;lt;/code&amp;gt; treba upisati adresu &amp;lt;code&amp;gt;sp&amp;lt;/code&amp;gt; pa ubaciti na tu adresu &amp;lt;code&amp;gt;sp&amp;lt;/code&amp;gt;.&lt;br /&gt;
Umesto &amp;lt;code&amp;gt;add r0,sp,#next&amp;lt;/code&amp;gt; treba napisati &amp;lt;code&amp;gt;mov r0, #next[sp]&amp;lt;/code&amp;gt;, tj. u &amp;lt;code&amp;gt;r0&amp;lt;/code&amp;gt; treba upisati adresu novog &amp;lt;code&amp;gt;sp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem sistemskog poziva &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;, napisati program koji, kada se pokrene kao proces, kreira onoliko procesa-dece, koliko je dato argumentom tog programа. Ni taj proces, ni njegova deca ne treba da rade ništa više.&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;
int main(int argc, char* argv[]) {&lt;br /&gt;
	if(argc &amp;lt; 2) return -1;&lt;br /&gt;
	int N = atoi(argv[1]);&lt;br /&gt;
	for(int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
		if(fork() == 0)&lt;br /&gt;
			return 0;&lt;br /&gt;
			&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data dva procesa međusobno se iključuju pri ulazu u dve kritične sekcije pomoću semafora čija je inicijalna vrednost 1. Objasniti šta je problem ove implementacije. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
process P1;  	  process P2: &lt;br /&gt;
  wait(S1);         wait(S2); &lt;br /&gt;
  wait(S2);         wait(S1); &lt;br /&gt;
    ...               ... &lt;br /&gt;
  signal(S2);       signal(S1); &lt;br /&gt;
  signal(S1);       signal(S2); &lt;br /&gt;
end P1;           end P2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Problem je što će doći do deadlock-a, odnosno, moguće je da &#039;&#039;P1&#039;&#039; i &#039;&#039;P2&#039;&#039; prođu prvi &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; jer je inicijalna vrednost semafora 1 ali će se zatim blokirati na drugim &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt;-ovima.&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;
Preklopi ne zahtevaju podršku OS-a. Sve obavlja prevodilac i generisani kod. OS samo obezbeđuje usluge za alokaciju dela virtuelnog adresnog prostora.&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;getWorstFit(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;worst 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;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki računar podržava segmentno-straničnu organizaciju virtuelne memorije, pri čemu je virtuelna adresa 16-bitna, fizički adresni prostor je veličine 8GB, a adresibilna jedinica je 16-bitna reč. Stranica je veličine 512B. Maksimalan broj segmenata u virtuelnom adresnom prostoru je 4. Prikazati logičku strukturu virtuelne i fizičke adrese i navesti širinu svakog polja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kojom tehnikom se fizički nedeljiv izlazni uređaj može učiniti logički (virtuelno) deljivim između procesa koji ga uporedo koriste? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tehnikom spooling.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati punu stazu (&#039;&#039;path&#039;&#039;) do fajla &amp;lt;code&amp;gt;resenja.doc&amp;lt;/code&amp;gt; koji se nalazi u direktorijumu &amp;lt;code&amp;gt;d:/nastava/os/ispiti/jul2013&amp;lt;/code&amp;gt; na uređaju &amp;lt;code&amp;gt;d:&amp;lt;/code&amp;gt; posle sledeće operacije montiranja (prvi argument je fajl sistem koji montira, drugi je odredište montaže): &amp;lt;code&amp;gt;mount  d:  /etf/rti&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;code&amp;gt;/etf/rti/nastava/os/ispiti/jul2013&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki  fajl  sistem  koristi  indeksiranu  alokaciju  fajlova  na  disku  sa  jednostrukim  indeksom.  Ako  se  pretpostavlja  da  je  prostor  za  smeštanje  fajlova  (uključujući  i  njihove  indekse)  na  disku  veličine  32 GB,  veličina  klastera  (jedine  jedinice  alokacije)  2 KB,  i  ceo  prostor  potpuno  ispunjen  fajlovima, gde je svaki fajl maksimalne veličine i ima samo jedan indeksni klaster, koliki procenat ukupnog prostora za smeštanje fajlova na ovom disku zauzimaju indeksi? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Октобар 2012#10. zadatak|oktobarskog roka 2012]].&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2012&amp;diff=2909</id>
		<title>ОС1/Јул 2012</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2012&amp;diff=2909"/>
		<updated>2021-09-19T11:35:38Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: јул 2012&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2012/jul/Jul%202012.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je to multiprocesorski sistem, a šta distribuirani sistem? Navesti po jedan primer svakog.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Multiprocesorski sistem je računarski sistem sa više procesora koji imaju zajedničku (deljenu) operativnu memoriju. Procesori mogu da pristupaju toj deljenoj memoriji tj. da čitaju iz nje i u nju upisuju, npr. preko zajedničke magistrale. Primer bi bio današnji personalni računar.&lt;br /&gt;
&lt;br /&gt;
Distribuirani sistem je sistem sa više procesora koji nemaju zajedničku operativnu memoriju, već svaki procesor ima svoju, ali su povezani komunikacionom mrežom preko koje mogu razmenjivati poruke. Primer: LAN mreža u nekom preduzeću, cloud servisi...&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem funkcija &amp;lt;code&amp;gt;setjmp&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;longjmp&amp;lt;/code&amp;gt; iz standardne C biblioteke realizovati operaciju &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; na brojačkom semaforu u školskom jezgru&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 Semaphore::wait() {&lt;br /&gt;
	lock();&lt;br /&gt;
	if(--val &amp;lt; 0) {&lt;br /&gt;
		if(setjmp(Thread::running-&amp;gt;context) == 0) {&lt;br /&gt;
			blocked.put(Thread::running);&lt;br /&gt;
			Thread::running = Scheduler::get();&lt;br /&gt;
			longjmp(Thread::running-&amp;gt;context, 1);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	unlock();&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;
Navesti najmanje tri slučaja (povoda) u kojima proces gubi procesor i prelazi u red spremnih (&#039;&#039;ready&#039;&#039;) i naznačiti da li se to dešava kao posledica sistemskog poziva tog procesa ili spoljašnjeg prekida&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
#Dispatch - sistemski poziv&lt;br /&gt;
#Zbog isteka dodeljenog vremena - tajmer generiše prekid, asinhrono.&lt;br /&gt;
#Usled neke havarije skače se na kod kernela a proces se stavlja u raspoređivač - javlja se usled prekida.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ograničeni bafer je implementiran pomoću brojačkih semafora na sledeći način (ostatak klase je definisana na očigledan način, kao na predavanjima). Šta je problem sa ovom implementacijom? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void BoundedBuffer::append (Data* d) {&lt;br /&gt;
   mutex.wait();&lt;br /&gt;
   spaceAvailable.wait();&lt;br /&gt;
   buffer[tail] = d;&lt;br /&gt;
   tail = (tail+1)%N;&lt;br /&gt;
   itemAvailable.signal();&lt;br /&gt;
   mutex.signal(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U slučaju da je bafer bio pun a producer pokušava da upiše podatak, zablokiraće se na &amp;lt;code&amp;gt;spaceAvailable&amp;lt;/code&amp;gt; semaforu. Consumer će se zablokirati na ulazu u kritičnu sekciju i doći će do deadlock-a.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Po čemu se razlikuje posao linkera kada je njegov proizvod izvršivi program od onoga kada je to biblioteka?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Drugačiji je proizvod. Kod je binaran kod exe, nema zaglavlje i nema nerazrešenih simbola. .lib može da ima simbole koje uvozi i koji ostaju nerazrešeni i uvek ima zaglavlje sa simbolima koje izvozi.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelni adresni prostor sistema je 4GB, adresibilna jedinica je bajt, a virtuelni adresni prostor je organizovan stranično sa stranicom veličine 16KB. Fizički adresni prostor je veličine 1GB. Tabele preslikavanja stranica su organizovane u dva nivoa,  s tim da tabela prvog nivoa ima 2K ulaza. Prikazati logičku strukturu virtuelne adrese i označiti širinu svakog polja. Označiti i podelu polja za broj stranice na polja za indeksiranje PMT prvog i drugog nivoa.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki sistem sa straničnom organizacijom memorije koristi tehniku &#039;&#039;copy on write&#039;&#039;. Jedan proces je tek kreirao drugi proces pozivom &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;. Ako novokreirani proces odmah po pokretanju izvrši operaciju upisa u memoriju, koji izuzetak će  generisati procesor,  &#039;&#039;page fault&#039;&#039; ili neki drugi i koji? Precizno objasniti zašto i kako. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pri pozivanju fork-a, proces dete deli sve stranice sa roditeljem, ne kopiraju se. Sve stranice u svojim deskriptorima će imati prava i upisa i čitanja. Dokle god oba procesa samo čitaju podatke ne pravi se kopija za proces dete. Kada bilo ko zatraži upis dešava se page fault i stranica se kopira.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati program i prekidnu rutinu koja prenosi blok podataka zadate dužine  sa  zadate  adrese  na  izlazni uređaj korišćenjem programiranog ulaza/izlaza sa prekidom.&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;
main:	LD R1, blockAddr&lt;br /&gt;
		LD R2, cnt&lt;br /&gt;
		LD R3, #0&lt;br /&gt;
		ST [ctrl], #0..1&lt;br /&gt;
wait:	CMP R3, #1&lt;br /&gt;
		JNZ wait&lt;br /&gt;
		&lt;br /&gt;
intr:	LD R0, [R1]&lt;br /&gt;
		ST [data], R0&lt;br /&gt;
		INC R1&lt;br /&gt;
		DEC R2&lt;br /&gt;
		JNZ ret&lt;br /&gt;
		LD R3, #1&lt;br /&gt;
		ST [ctrl], #0&lt;br /&gt;
ret:	RTI&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je po vašem mišljenju osnovna svrha (motiv) postojanja koncepta tekućeg direktorijuma procesa?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Relokatibilnost procesa.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Zašto fajl sistemi po pravilu  pokušavaju da alociraju  susedne  blokove  na  disku  za sadržaj istog fajla, čak i ako to nije neophodno za datu alokaciju (ulančanu ili indeksnu)? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Alociraju se susedni blokovi za isti fajl da bi vreme pristupa bilo što kraće, tj. da bi se glava hard diska što manje pomerala.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2011&amp;diff=2908</id>
		<title>ОС1/Јул 2011</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2011&amp;diff=2908"/>
		<updated>2021-09-19T11:24:00Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: јул 2011, средити 1. задатак (&amp;lt;math&amp;gt; или како већ)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2011/jul/Jul%202011.doc Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako se nad sledećim programom kreira jedan proces, koliko će ukupno procesa biti kreirano (uključujući i taj jedan početni), 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++) 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;
1 + 2^N - 1 = 2^N = 2^2 = 4&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je razlika između „teškog“ procesa i niti (&#039;&#039;thread&#039;&#039;)?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Proces je teški proces odnosno jedno izvršavanje jednog programa sa sopstvenim adresnim prostorom odnosno memorijskim kontekstom, dok se svaki tok kontrole koji koristi taj adresni prostor zove nit, tj. laki proces.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je problem sledeće implementacije kritične sekcije uposlenim čekanjem?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
process P1&lt;br /&gt;
begin&lt;br /&gt;
  loop&lt;br /&gt;
    while flag2 = true do null end; (* Busy wait *)&lt;br /&gt;
    flag1 := true;&lt;br /&gt;
    &amp;lt;critical section&amp;gt;          (* Critical section *)&lt;br /&gt;
    flag1 := false;             (* Exit protocol *)&lt;br /&gt;
    &amp;lt;non-critical section&amp;gt;&lt;br /&gt;
  end&lt;br /&gt;
end P1;&lt;br /&gt;
&lt;br /&gt;
process P2&lt;br /&gt;
begin&lt;br /&gt;
  loop&lt;br /&gt;
    while flag1 = true do null end; (* Busy wait *)&lt;br /&gt;
    flag2 := true;&lt;br /&gt;
    &amp;lt;critical section&amp;gt;          (* Critical section *)&lt;br /&gt;
    flag2 := false;             (* Exit protocol *)&lt;br /&gt;
    &amp;lt;non-critical section&amp;gt;&lt;br /&gt;
  end&lt;br /&gt;
end P2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ne obezbeđuje međusobno isključenje, dolazi do utrkivanja.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na jeziku C++ implementirati klasu &amp;lt;code&amp;gt;BoundedBuffer&amp;lt;/code&amp;gt; koja realizuje ograničeni bafer elemenata tipa &amp;lt;code&amp;gt;Data&amp;lt;/code&amp;gt; kapaciteta &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; pomoću semafora.&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;
const int N = ...&lt;br /&gt;
class Data;&lt;br /&gt;
class BoundedBuffer {&lt;br /&gt;
public:&lt;br /&gt;
	BoundedBuffer();&lt;br /&gt;
	void append(Data*);&lt;br /&gt;
	Data* take();&lt;br /&gt;
private:&lt;br /&gt;
	Semaphore mutex, spaceAvailable, itemAvailable;&lt;br /&gt;
	Data* buffer[N];&lt;br /&gt;
	int head, tail;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
BoundedBuffer::BoundedBuffer() : mutex(1), spaceAvailable(N), itemAvailable(0), head(0), tail(0) {}&lt;br /&gt;
&lt;br /&gt;
void BoundedBuffer::append(Data* d) {&lt;br /&gt;
	spaceAvailable.wait();&lt;br /&gt;
	mutex.wait();&lt;br /&gt;
	buffer[tail] = d;&lt;br /&gt;
	tail = (tail + 1) % N;&lt;br /&gt;
	mutex.signal();&lt;br /&gt;
	itemAvailable.signal();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Data* BoundedBuffer::take() {&lt;br /&gt;
	itemAvailable.wait();&lt;br /&gt;
	mutex.wait();&lt;br /&gt;
	Data* d = buffer[head];&lt;br /&gt;
	head = (head + 1) % N;&lt;br /&gt;
	mutex.signal();&lt;br /&gt;
	spaceAvailable.signal();&lt;br /&gt;
	return d;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je osnovna razlika između tehnike dinamičkog učitavanja i tehnike preklopa (&#039;&#039;overlays&#039;&#039;)?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tehnikom dinamičkog učitavanja proces alocira memoriju i iz fajlova učitava delove samo ako su stvarno potrebni.&lt;br /&gt;
Tehnika preklopa podrazumeva da se moduli u kojima su grupisani programi i/ili podaci koji se koriste zajedno a u alternaciji sa drugim modulima dinamički učitavaju u memoriju i izbacuju iz nje na isto mesto, preklapajući se sa onim modulima sa kojima nisu potrebni istovremeno.&lt;br /&gt;
Razlike su u tome što:&lt;br /&gt;
#više modula se naizmenično učitava na isto mesto u virtuelnom adresnom prostoru procesa, preklapajući se&lt;br /&gt;
#modul može biti odsutan ne samo kada mu se prvi put pristupi, nego i kasnije, jer je na njegovo mesto učitan neki drugi modul, pa program o tome mora da vodi računa; program mora da vodi računa o tome koji je od preklopljenih modula trenutno učitan na datom mestu, kao i o tome da je pre pristupa određenom potprogramu/podatku modul u kome se on nalazi sigurno učitan, isto kao i kod dinamičkog učitavanja&lt;br /&gt;
#ako neki modul koji se preklapa sadrži podatke koji se menjaju, pre nego što se na njegovo mesto učita neki drugi modul, mora se sačuvati sadržaj izbačenog modula upisom u neki fajl, ako će taj modul kasnije biti ponovo upotrebljavan&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti zašto je kod segmentne organizacije virtuelne memorije obavezna provera prekoračenja granice segmenta prilikom svakog adresiranja, a kod stanične organizacije ta provera ne postoji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kod segmentne organizacije virtuelne memorije obavezno se proverava prekoračenje granice segmenta jer ako prelazi limit to znači da je proces adresirao virtuelnu adresu izvan deklarisanog segmenta.&lt;br /&gt;
Kod stranične organizacije virtuelni adresni prostor procesa je podeljen na stranice iste veličine a fizički okviri su iste veličine kao stranice.	&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu postoje sledeći sistemski pozivi:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int async_write (char* buffer);&lt;br /&gt;
void wait (int request_id);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Operacija &amp;lt;code&amp;gt;async_write&amp;lt;/code&amp;gt; asinhrono zadaje operaciju izlaza datog niza znakova na neki izlazni uređaj i vraća interni sistemski identifikator tog zahteva (veći od 0), odnosno kod greške (manji od nula). Operacija wait suspenduje pozivajući proces sve dok operacija sa datim identifikatorom nije završena. Korišćenjem ovih sistemskih poziva, realizovati sinhroni izlaz: &amp;lt;code&amp;gt;int sync_write (char* buffer);&amp;lt;/code&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;
int sync_write (char* buffer) {&lt;br /&gt;
	int id = async_write(buffer);&lt;br /&gt;
	if(id &amp;lt; 0) return id;&lt;br /&gt;
	wait(id);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti kako se u Unix fajl sistemu definišu prava pristupa do fajla.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Po 3 bita (rwx) za vlasnika, grupu i ostale (ukupno 9 bitova) određuju prava pristupa do fajla.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti razlog zašto bi neki fajl sistem koristio klastere na disku različite veličine.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Zbog smanjenja interne fragmentacije.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti šta je inkrementalni, a šta totalni bekap (&#039;&#039;backup&#039;&#039;) fajl sistema?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
#Inkrementalni backup: backup-uju se samo izmenjeni fajlovi.&lt;br /&gt;
#Totalni backup: kopiraju se svi fajlovi iz jednog fajl sistema ili njegovog dela.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2015&amp;diff=2907</id>
		<title>ОС1/Јануар 2015</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2015&amp;diff=2907"/>
		<updated>2021-09-19T11:16:56Z</updated>

		<summary type="html">&lt;p&gt;Ivan Pešić: јануар 2015&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2015/januar/OS1%20Jan%202015.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti osnovni motiv nastanka koncepta raspodele vremena (&#039;&#039;time sharing&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Svaki korisnik treba da ima utisak da računar radi samo za njega sa dovoljno dobrim i ujednačenim vremenima odziva dok taj isti računar zapravo opslužuje više korisnika istovremeno.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti semantiku mašinske instrukcije &#039;&#039;test &amp;amp; set&#039;&#039; i  način  njene upotrebe za međusobno isključenje kritičnih sekcija kod miltiprocesorskih sistema. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Instrukcija &#039;&#039;test &amp;amp; set&#039;&#039; atomično čita i vraća vrednost sadržaja zadate promenljive i u nju upisuje 1. Ova atomičnost se obezbeđuje hardverski zaključavanjem magistrale. Svakoj kritičnoj sekciji, tj. deljenoj strukturi podataka kojoj pristupa kod kritičnih sekcija se pridruži jedna globalna deljena promenljiva L u deljenoj operativnoj memoriji multiprocesora.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
lock(L):&lt;br /&gt;
	while test_and_set(L) do null;&lt;br /&gt;
&lt;br /&gt;
unlock(L):&lt;br /&gt;
	L := 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na jeziku C, korišćenjem sistemskih poziva &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;  i &amp;lt;code&amp;gt;execlp()&amp;lt;/code&amp;gt; za Unix, napisati program koji pokreće  drugi program iz fajla čiji je naziv zadat kao parametar  komandne linije prvog programa.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati kod jednog od dva procesa sa međusobnim isključenjem kritične sekcije korišćenjem Petersonovog rešenja. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
shared var turn : integer := 1, flag1, flag2 : boolean := false;&lt;br /&gt;
&lt;br /&gt;
process P1&lt;br /&gt;
begin&lt;br /&gt;
	loop&lt;br /&gt;
		flag1 := true; turn := 2;&lt;br /&gt;
		while flag2 and turn = 2 do null;&lt;br /&gt;
		&amp;lt;critical&amp;gt;&lt;br /&gt;
		flag1 := false;&lt;br /&gt;
		&amp;lt;non-critical&amp;gt;&lt;br /&gt;
	end&lt;br /&gt;
end P1;&lt;br /&gt;
&lt;br /&gt;
process P2&lt;br /&gt;
begin&lt;br /&gt;
	loop&lt;br /&gt;
		flag2 := true; turn := 1;&lt;br /&gt;
		while flag1 and turn = 1 do null;&lt;br /&gt;
		&amp;lt;critical&amp;gt;&lt;br /&gt;
		flag2 := false;&lt;br /&gt;
		&amp;lt;non-critical&amp;gt;&lt;br /&gt;
	end&lt;br /&gt;
end P2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Zašto preklopi (&#039;&#039;overlays&#039;&#039;) ne mogu da se koriste ako program ima više niti koje obezbeđuje operativni sistem? Precizno objasniti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovo pitanje pojavilo se na septembarskom roku 2011. godine kao 5. pitanje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Potrebno je u nekoj strukturi podataka voditi evidenciju o slobodnim fragmentima memorije kod kontinualne alokacije sa &#039;&#039;best fit&#039;&#039; algoritmom. Koja struktura podataka je efikasnija za implementaciju operacije dealokacije segmenta memorije koju je zauzimao ugašeni proces: a) dvostruko ulančana lista slobodnih fragmenata uređenih po veličini ili b) dvostruko ulančana lista slobodnih fragmenata uređenih po poziciji u memoriji? Kratko obrazložiti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu sa straničnom organizacijom virtuelne memorije virtuelna i fizička adresa su 32-bitne, adresibilna jedinica  je bajt, a stranica je veličine 64 KB. PMT je organizovana u  dva nivoa i jedan ulaz u PMT oba nivoa zauzima po jednu 32-bitnu reč. PMT oba nivoa su iste veličine. Koliko ukupno zauzimaju PMT za proces koji je alocirao samo svoju prvu i poslednju stranicu?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kojom tehnikom se nedeljivi uređaj može učiniti virtuelno deljivim?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U fajl podsistemu nekog operativnog sistema nema koncepta kurzora (pokazivača) trenutne lokacije za čitanje i upis sadržaja u fajl. Čime se može nadomestiti ovaj nedostatak u  sistemskim pozivima za čitanje i upis u fajl? Precizno objasniti i ilustrovati potpisom funkcija za ove pozive.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Potrebno je dodati i poziciju odakle se želi čitati/upisivati.&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void write(FHANDLE fh, int position, char* buffer, int size);&lt;br /&gt;
void read(FHANDLE fh, int position, char* buffer, int size);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki  fajl  sistem  koristi  indeksirani  pristup  alokaciji  fajlova  sa  indeksima  u  dva  nivoa, blokom  veličine  512B  i  32-bitnim  adresama  fizičkih  blokova.  Kolika  je  maksimalna  veličina sadržaja fajla u ovom sistemu? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
512B / 4B = 2^7 ulaza u indeksu&lt;br /&gt;
&lt;br /&gt;
maksimalna veličina fajla: 2^7 * 2^7 * 2^9 = 2^23B = 8MB&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Ivan Pešić</name></author>
	</entry>
</feed>