<?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=WikiEditor</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=WikiEditor"/>
	<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/WikiEditor"/>
	<updated>2026-06-04T01:08:12Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2022&amp;diff=6371</id>
		<title>Програмски преводиоци 1/Јануар 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2022&amp;diff=6371"/>
		<updated>2023-06-28T19:20:14Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* z -&amp;gt; y */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Ispit u januarskom roku 2022. godine&#039;&#039;&#039; održan je 28. januara. Postavka roka je dostupna [http://ir4pp1.etf.rs/Rokovi/2021-2022/pp1-januar-2021-22.pdf sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Odrediti minimalni konačni deterministički automat koji prihvata one i samo one ulazne sekvence koje NE prihvata konačni automat sa slike ali kada se čitaju sa desna u levo. Na primer, dati automat ne prihvata sekvencu ab, to znači da traženi automat treba da prihvati sekvencu ba. Postupak izložiti po koracima, na generalan način koji bi se mogao primeniti i na svaki drugi automat.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Stanje !! a !! b !! Prihvata&lt;br /&gt;
|-&lt;br /&gt;
| → A    || B ||   || 0&lt;br /&gt;
|-&lt;br /&gt;
| B      || C || D || 0&lt;br /&gt;
|-&lt;br /&gt;
| C      ||   ||   || 1&lt;br /&gt;
|-&lt;br /&gt;
| D      ||   || F || 0&lt;br /&gt;
|-&lt;br /&gt;
| F      || F || F || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Za smene 1 i 2 date gramatike navesti koje atribute treba računati i od kojih drugih atributa oni mogu da zavise da bi cela gramatika bila L-atributivna. Pravila navoditi u obliku aa = f(bb, cc, dd,..) gde je aa atribut koji mora da se računa, dok su bb, cc, dd, itd svi drugi atributi od kojih posmatrani može da zavisi. Neterminal &amp;amp;lt;S&amp;gt; ima sintetizovan atribut.&lt;br /&gt;
# Navesti pseudokod za proceduru A u parseru na bazi rekurzivnog spusta. Ostale delove parsera ne navoditi. Preimenovati promenljive da se minimizuje broj pravila kopiranja vrednosti atributa.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
# &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt; → a&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt; &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;z,v,w&amp;lt;/sub&amp;gt; &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; {b&amp;lt;sub&amp;gt;q&amp;lt;/sub&amp;gt;}&lt;br /&gt;
# &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt; → d&amp;lt;sub&amp;gt;y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt; {c&amp;lt;sub&amp;gt;z&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;} &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;v&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, p&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;x,y,z&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt; → a&amp;lt;sub&amp;gt;q&amp;lt;/sub&amp;gt; {c&amp;lt;sub&amp;gt;v&amp;lt;/sub&amp;gt;} &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,z,u&amp;lt;/sub&amp;gt; &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;u,t,y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v \larr x - q&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;x_1 \larr x&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;y \larr y_1&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;z_1 \larr z&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;t,s,s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt; → d&amp;lt;sub&amp;gt;q&amp;lt;/sub&amp;gt; {b&amp;lt;sub&amp;gt;t&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;} a&amp;lt;sub&amp;gt;s&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_1 \larr t&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;(s,s_1) \larr s_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Iz date gramatike možemo zaključiti sledeće o tipovima atributa:&lt;br /&gt;
* Akcije &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; sadrže nasleđene atribute.&lt;br /&gt;
* Neterminal &amp;lt;code&amp;gt;&amp;amp;lt;A&amp;gt;&amp;lt;/code&amp;gt; sadrži tri atributa, od kojih je prvi nasleđen a druga dva sintetizovana.&lt;br /&gt;
Na osnovu toga, u prvoj smeni vidimo da atributi mogu imati sledeće vrednosti:&lt;br /&gt;
* &amp;lt;math&amp;gt;x = f(y, z, v, w, p, q)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;z = f(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;q = f(y, z, v, w, p)&amp;lt;/math&amp;gt;&lt;br /&gt;
a u drugoj smeni sledeće:&lt;br /&gt;
* &amp;lt;math&amp;gt;x1 = f(y_1, z_1, v_1, w_1, p_1)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;z1 = f(y_1)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;v1 = f(y_1, z_1)&amp;lt;/math&amp;gt;&lt;br /&gt;
Kod parsera sa adekvatno preimenovanim atributima dat je ispod:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void A(int x, int&amp;amp; y, int&amp;amp; z) {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
            input = advance();&lt;br /&gt;
            int q = getInputValue();&lt;br /&gt;
            out(&#039;c&#039;, x - q);&lt;br /&gt;
            int u;&lt;br /&gt;
            A(x, z, u);&lt;br /&gt;
            int t;&lt;br /&gt;
            A(u, t, y);&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;d&#039;:&lt;br /&gt;
            input = advance();&lt;br /&gt;
            out(&#039;b&#039;, x);&lt;br /&gt;
            input = advance();&lt;br /&gt;
            y = z = getInputValue();&lt;br /&gt;
            break;&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;
Zadata je gramatika&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;S&amp;gt; b &amp;amp;lt;A&amp;gt;&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;A&amp;gt; a &amp;amp;lt;B&amp;gt; b&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → &amp;amp;lt;B&amp;gt; c &amp;amp;lt;B&amp;gt; d&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → ε&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Konstruisati karaketristični&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; automat LR(0) parsera kao i odgovarajuću kontrolnu tabelu. Da li ima konflikata?&lt;br /&gt;
# Konstruisati kontrolnu tabelu SLR(1) parsera. Da li ima konflikata?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[Датотека:PPR januar 2022 zadatak 3 automat.svg|thumb|Karakteristični LR(0) automat u trećem zadatku.]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Kontrolna tabela LR(0) parsera&lt;br /&gt;
! Stanje              !! Akcija&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;S&#039;&amp;gt;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || &#039;&#039;&#039;R/R konflikt&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;  || SHIFT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;B&amp;gt;&amp;lt;sub&amp;gt;31&amp;lt;/sub&amp;gt; || SHIFT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;  || SHIFT&lt;br /&gt;
|-&lt;br /&gt;
| c&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;       || REDUCE(5)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;B&amp;gt;&amp;lt;sub&amp;gt;32&amp;lt;/sub&amp;gt; || SHIFT&lt;br /&gt;
|-&lt;br /&gt;
| d&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;       || REDUCE(3)&lt;br /&gt;
|-&lt;br /&gt;
| a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;       || REDUCE(5)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;B&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;  || SHIFT&lt;br /&gt;
|-&lt;br /&gt;
| b&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;       || REDUCE(2)&lt;br /&gt;
|-&lt;br /&gt;
| ─┤&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;      || ACCEPT&lt;br /&gt;
|-&lt;br /&gt;
| b&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;       || &#039;&#039;&#039;R/R konflikt&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;  || REDUCE(1)&lt;br /&gt;
|}&lt;br /&gt;
FOLLOW skupovi su sledeći:&lt;br /&gt;
* FOLLOW(&amp;amp;lt;S&amp;gt;) = {─┤, b}&lt;br /&gt;
* FOLLOW(&amp;amp;lt;B&amp;gt;) = {b, c, d}&lt;br /&gt;
* FOLLOW(&amp;amp;lt;A&amp;gt;) = {a} ∪ FOLLOW(&amp;amp;lt;S&amp;gt;) = {─┤, a, b}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Kontrolna tabela SLR(0) parsera&lt;br /&gt;
! Stanje              !! a         !! b                  !! c         !! d         !! ─┤&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;S&#039;&amp;gt;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || REDUCE(4) || &#039;&#039;&#039;R/R konflikt&#039;&#039;&#039; || REDUCE(5) || REDUCE(5) || REDUCE(4)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;  || SHIFT     ||                    ||           ||           ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;B&amp;gt;&amp;lt;sub&amp;gt;31&amp;lt;/sub&amp;gt; ||           ||                    || SHIFT     ||           ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;  ||           || SHIFT              ||           ||           || SHIFT&lt;br /&gt;
|-&lt;br /&gt;
| c&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;       ||           || REDUCE(5)          || REDUCE(5) || REDUCE(5) ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;B&amp;gt;&amp;lt;sub&amp;gt;32&amp;lt;/sub&amp;gt; ||           ||                    ||           || SHIFT     ||&lt;br /&gt;
|-&lt;br /&gt;
| d&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;       || REDUCE(3) || REDUCE(3)          ||           ||           || REDUCE(3)&lt;br /&gt;
|-&lt;br /&gt;
| a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;       ||           || REDUCE(5)          || REDUCE(5) || REDUCE(5) ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;B&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;  ||           || SHIFT              ||           ||           ||&lt;br /&gt;
|-&lt;br /&gt;
| b&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;       ||           || REDUCE(2)          ||           ||           || REDUCE(2)&lt;br /&gt;
|-&lt;br /&gt;
| ─┤&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;      ||           ||                    ||           ||           || ACCEPT&lt;br /&gt;
|-&lt;br /&gt;
| b&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;       || REDUCE(4) || &#039;&#039;&#039;R/R konflikt&#039;&#039;&#039; || REDUCE(5) || REDUCE(5) || REDUCE(4)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;  ||           || REDUCE(1)          ||           ||           || REDUCE(1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je listing programa Januar2022, napisan na programskom jeziku Mikrojava. Sve metode unutrašnjih klasa su virtuelne. Globalne metode se pozivaju statički. Napisati kompletan Mikrojava bajtkod prevoda funkcije &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; za dati program&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
program Januar2022&lt;br /&gt;
	const int K = 2;&lt;br /&gt;
	int add;&lt;br /&gt;
	class A {&lt;br /&gt;
		int fld;&lt;br /&gt;
	{&lt;br /&gt;
		int m(int a)&lt;br /&gt;
		{ return fld * 2; }&lt;br /&gt;
		void met()&lt;br /&gt;
		{ fld = fld + 3; }&lt;br /&gt;
	} }&lt;br /&gt;
	class B extends A {&lt;br /&gt;
	{&lt;br /&gt;
		int m(int b)&lt;br /&gt;
		{ /*T1*/&lt;br /&gt;
			return fld + b;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
	A arr[];&lt;br /&gt;
{&lt;br /&gt;
	int f(int index){&lt;br /&gt;
		add = arr[index].m(K);&lt;br /&gt;
		arr[index].met();&lt;br /&gt;
		return add + K;&lt;br /&gt;
	}&lt;br /&gt;
	void main()&lt;br /&gt;
		B b;&lt;br /&gt;
		int ret;&lt;br /&gt;
	{&lt;br /&gt;
		/*T2*/&lt;br /&gt;
		arr = new A[2];&lt;br /&gt;
		arr[0] = new B;&lt;br /&gt;
		arr[1] = new A;&lt;br /&gt;
		ret = f(0) + f(1);&lt;br /&gt;
		print(arr[0].m(ret));&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enter 1, 1&lt;br /&gt;
getstatic 1&lt;br /&gt;
load_0&lt;br /&gt;
aload&lt;br /&gt;
const_2&lt;br /&gt;
getstatic 1&lt;br /&gt;
load_0&lt;br /&gt;
aload&lt;br /&gt;
getfield 0&lt;br /&gt;
invokevirtual &#039;m&#039; -1&lt;br /&gt;
putstatic 0&lt;br /&gt;
getstatic 1&lt;br /&gt;
load_0&lt;br /&gt;
aload&lt;br /&gt;
dup&lt;br /&gt;
getfield 0&lt;br /&gt;
invokevirtual &#039;m&#039; &#039;e&#039; &#039;t&#039; -1&lt;br /&gt;
getstatic 0&lt;br /&gt;
const_2&lt;br /&gt;
add&lt;br /&gt;
exit&lt;br /&gt;
return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Prikazati izgled tabele simbola u trenucima T1 i T2 na osnovu izvornog koda iz zadatka 4 prema formatu čvorova tabele simbola iz priloga. Universe opseg ne treba crtati. Za T2 dovoljno je naznačiti izmene u odnosu na prethodno stanje tabele. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;500&amp;quot; heights=&amp;quot;500&amp;quot; class=&amp;quot;transparent-svg&amp;quot;&amp;gt;&lt;br /&gt;
  PPR januar 2022 zadatak 5 T1.svg | Tabela simbola u stanju T1.&lt;br /&gt;
  PPR januar 2022 zadatak 5 T2.svg | Tabela simbola u stanju T2.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za dati programski fragment napisati odgovarajući međukod u SSA formi i nacrtati graf toka kontrole na nivou osnovnih blokova.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
a = 1;&lt;br /&gt;
b = 2;&lt;br /&gt;
c = 3;&lt;br /&gt;
for (a = 4; b &amp;lt; c || a &amp;lt; 10; a++) {&lt;br /&gt;
    if (a &amp;gt; b + c) {&lt;br /&gt;
        c++;&lt;br /&gt;
        break;&lt;br /&gt;
    } else if (a &amp;gt; b * c) {&lt;br /&gt;
        b--;&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    else return a;&lt;br /&gt;
}&lt;br /&gt;
a = b * c;&lt;br /&gt;
return a;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[Датотека:PPR januar 2022 zadatak 6 graf.svg|thumb|Karakteristični LR(0) automat u trećem zadatku.]]&lt;br /&gt;
# a1 := 1&lt;br /&gt;
# b1 := 2&lt;br /&gt;
# c1 := 3&lt;br /&gt;
# a2 := 4&lt;br /&gt;
# t1 := Ф(b1, b2)&lt;br /&gt;
# if t1 &amp;lt; c1 goto 8&lt;br /&gt;
# if a2 &amp;gt;= 10 goto 17&lt;br /&gt;
# t2 := t1 + c1&lt;br /&gt;
# if a &amp;lt;= t2 goto 12&lt;br /&gt;
# c2 := c1 + 1&lt;br /&gt;
# goto 17&lt;br /&gt;
# t3 := t1 * c1&lt;br /&gt;
# if a &amp;lt;= t3 goto 16&lt;br /&gt;
# b2 := t1 - 1&lt;br /&gt;
# goto 5&lt;br /&gt;
# return a2&lt;br /&gt;
# t4 := Ф(b1, b2)&lt;br /&gt;
# t5 := Ф(c1, c2)&lt;br /&gt;
# t6 := t1 * t2&lt;br /&gt;
# a3 := t6&lt;br /&gt;
# return a3&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2020&amp;diff=6370</id>
		<title>Програмски преводиоци 1/Јануар 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2020&amp;diff=6370"/>
		<updated>2023-06-28T11:37:50Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* ispravka */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Januarski rok 2021. godine&#039;&#039;&#039; održan je 22. januara. Postavka roka je dostupna [http://ir4pp1.etf.rs/Rokovi/2019-2020/pp1-1920-januar.pdf sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data gramatika opisuje regularne izraze sa operatorima konkatenacije ● i unije |.&lt;br /&gt;
# &amp;amp;lt;E&amp;gt; → &amp;amp;lt;E&amp;gt; | &amp;amp;lt;T&amp;gt;&lt;br /&gt;
# &amp;amp;lt;E&amp;gt; → &amp;amp;lt;T&amp;gt;&lt;br /&gt;
# &amp;amp;lt;T&amp;gt; → &amp;amp;lt;T&amp;gt; ● &amp;amp;lt;P&amp;gt;&lt;br /&gt;
# &amp;amp;lt;T&amp;gt; → &amp;amp;lt;P&amp;gt;&lt;br /&gt;
# &amp;amp;lt;P&amp;gt; → slovo&lt;br /&gt;
# &amp;amp;lt;P&amp;gt; → epsilon&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Konstruisati SLR(1) parser za datu gramatiku.&lt;br /&gt;
# Dopuniti datu gramatiku S-atributivnim pravilima tako da svaki neterminal date gramatike poseduje atribute koji predstavljaju vrednosti funkcija poništiv i prva_pozicija iz algoritma za konstrukciju determinističkog konačnog automata iz regularnog izraza. Terminal &amp;lt;code&amp;gt;slovo&amp;lt;/code&amp;gt; poseduje atribut koji označava poziciju tog terminala u izrazu. Napomena: &amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; je terminal, a ne oznaka prazne sekvence. Takođe su | i ● terminalni simboli.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[Датотека:PPR januar 2020 zadatak 1 automat.svg|thumb|Automat iz prvog zadatka pod a.]]&lt;br /&gt;
Relevantni FIRST i FOLLOW skupovi SLR(1) parsera su:&lt;br /&gt;
* FOLLOW(&amp;amp;lt;E&amp;gt;) = {|, ─┤}&lt;br /&gt;
* FOLLOW(&amp;amp;lt;T&amp;gt;) = {●} ∪ FOLLOW(&amp;amp;lt;E&amp;gt;) = {●, |, ─┤}&lt;br /&gt;
* FOLLOW(&amp;amp;lt;P&amp;gt;) = FOLLOW(&amp;amp;lt;T&amp;gt;) = {●, |, ─┤}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Potisna tabela SLR(1) parsera&lt;br /&gt;
! Stanje&lt;br /&gt;
! &amp;amp;lt;E&amp;gt;             !! &amp;amp;lt;T&amp;gt;              !! &amp;amp;lt;P&amp;gt;             !! slovo             !! epsilon             !! ●             !! &amp;amp;#124; !! ─┤&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| &amp;amp;lt;E&amp;gt;&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt; || &amp;amp;lt;T&amp;gt;&amp;lt;sub&amp;gt;x1&amp;lt;/sub&amp;gt; !! &amp;amp;lt;P&amp;gt;&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt; || slovo&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; || epsilon&amp;lt;sub&amp;gt;6&amp;lt;/sub&amp;gt; ||               ||        ||&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;T&amp;gt;&amp;lt;sub&amp;gt;x1&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||                    ||                   ||                     || ●&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; ||        ||&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;E&amp;gt;&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||                    ||                   ||                     ||               || &amp;amp;#124;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || ─┤&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;P&amp;gt;&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||                    ||                   ||                     ||               ||        ||&lt;br /&gt;
|-&lt;br /&gt;
! slovo&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||                    ||                   ||                     ||               ||        ||&lt;br /&gt;
|-&lt;br /&gt;
! epsilon&amp;lt;sub&amp;gt;6&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||                    ||                   ||                     ||               ||        ||&lt;br /&gt;
|-&lt;br /&gt;
! ●&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     || &amp;amp;lt;P&amp;gt;&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; || slovo&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; || epsilon&amp;lt;sub&amp;gt;6&amp;lt;/sub&amp;gt; ||               ||        ||&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;#124;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    || &amp;amp;lt;T&amp;gt;&amp;lt;sub&amp;gt;x2&amp;lt;/sub&amp;gt; || &amp;amp;lt;P&amp;gt;&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt; || slovo&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; || epsilon&amp;lt;sub&amp;gt;6&amp;lt;/sub&amp;gt; ||               ||        ||&lt;br /&gt;
|-&lt;br /&gt;
! ─┤&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||                    ||                   ||                     ||               ||        ||&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;P&amp;gt;&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||                    ||                   ||                     ||               ||        ||&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;T&amp;gt;&amp;lt;sub&amp;gt;x2&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||                    ||                   ||                     || ●&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; ||        ||&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Kontrolna tabela SLR(1) parsera&lt;br /&gt;
! Stanje&lt;br /&gt;
! slovo !! epsilon !! ●         !! &amp;amp;#124;    !! ─┤&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| SHIFT || SHIFT   ||           ||           ||&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;T&amp;gt;&amp;lt;sub&amp;gt;x1&amp;lt;/sub&amp;gt;&lt;br /&gt;
|       ||         || SHIFT     || REDUCE(2) || REDUCE(2)&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;E&amp;gt;&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;&lt;br /&gt;
|       ||         ||           || SHIFT     || SHIFT&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;P&amp;gt;&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt;&lt;br /&gt;
|       ||         || REDUCE(4) || REDUCE(4) || REDUCE(4)&lt;br /&gt;
|-&lt;br /&gt;
! slovo&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt;&lt;br /&gt;
|       ||         || REDUCE(5) || REDUCE(5) || REDUCE(5)&lt;br /&gt;
|-&lt;br /&gt;
! epsilon&amp;lt;sub&amp;gt;6&amp;lt;/sub&amp;gt;&lt;br /&gt;
|       ||         || REDUCE(6) || REDUCE(6) || REDUCE(6)&lt;br /&gt;
|-&lt;br /&gt;
! ●&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| SHIFT || SHIFT   ||           ||           ||&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;#124;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| SHIFT || SHIFT   ||           ||           ||&lt;br /&gt;
|-&lt;br /&gt;
! ─┤&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|       ||         ||           ||           || ACCEPT&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;P&amp;gt;&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;&lt;br /&gt;
|       ||         || REDUCE(3) || REDUCE(3) || REDUCE(3)&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;T&amp;gt;&amp;lt;sub&amp;gt;x2&amp;lt;/sub&amp;gt;&lt;br /&gt;
|       ||         || SHIFT     || REDUCE(1) || REDUCE(1)&lt;br /&gt;
|}&lt;br /&gt;
Dopunjena gramatika sa atributima izgleda:&lt;br /&gt;
# &amp;amp;lt;E&amp;gt;&amp;lt;sub&amp;gt;pon,prva&amp;lt;/sub&amp;gt; → &amp;amp;lt;E&amp;gt;&amp;lt;sub&amp;gt;pon&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,prva&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt; | &amp;amp;lt;T&amp;gt;&amp;lt;sub&amp;gt;pon&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,prva&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;&lt;br /&gt;
#: &amp;lt;math&amp;gt;pon \larr pon_1 or pon_2&amp;lt;/math&amp;gt;&lt;br /&gt;
#: &amp;lt;math&amp;gt;prva \larr \{prva_1, prva_2\}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;amp;lt;E&amp;gt;&amp;lt;sub&amp;gt;pon,prva&amp;lt;/sub&amp;gt; → &amp;amp;lt;T&amp;gt;&amp;lt;sub&amp;gt;pon&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,prva&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;&lt;br /&gt;
#: &amp;lt;math&amp;gt;pon \larr pon_1&amp;lt;/math&amp;gt;&lt;br /&gt;
#: &amp;lt;math&amp;gt;prva \larr prva_1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;amp;lt;T&amp;gt;&amp;lt;sub&amp;gt;pon,prva&amp;lt;/sub&amp;gt; → &amp;amp;lt;T&amp;gt;&amp;lt;sub&amp;gt;pon&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,prva&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt; ● &amp;amp;lt;P&amp;gt;&amp;lt;sub&amp;gt;pon&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,prva&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;&lt;br /&gt;
#: &amp;lt;math&amp;gt;pon \larr pon_1 and pon_2&amp;lt;/math&amp;gt;&lt;br /&gt;
#: &amp;lt;math&amp;gt;prva \larr pon_1 ? \{prva_1, prva_2\} : prva_1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;amp;lt;T&amp;gt;&amp;lt;sub&amp;gt;pon,prva&amp;lt;/sub&amp;gt; → &amp;amp;lt;P&amp;gt;&amp;lt;sub&amp;gt;pon&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,prva&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;&lt;br /&gt;
#: &amp;lt;math&amp;gt;pon \larr pon_1&amp;lt;/math&amp;gt;&lt;br /&gt;
#: &amp;lt;math&amp;gt;prva \larr prva_1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;amp;lt;P&amp;gt;&amp;lt;sub&amp;gt;pon,prva&amp;lt;/sub&amp;gt; → slovo&amp;lt;sub&amp;gt;poz&amp;lt;/sub&amp;gt;&lt;br /&gt;
#: &amp;lt;math&amp;gt;pon \larr 0&amp;lt;/math&amp;gt;&lt;br /&gt;
#: &amp;lt;math&amp;gt;prva \larr poz&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;amp;lt;P&amp;gt;&amp;lt;sub&amp;gt;pon,prva&amp;lt;/sub&amp;gt; → epsilon&lt;br /&gt;
#: &amp;lt;math&amp;gt;pon \larr 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U standardnoj Mikrojavi, lokalno definisana promenljiva sakriva globalnu promenljivu sa istim imenom. Želimo da uvedemo sledeću modifikaciju: Ako se želi pristupiti sakrivenoj globalnoj promenljivoj, mora se ispred imena navesti operator &amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Na primer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
program P {&lt;br /&gt;
    int X[];&lt;br /&gt;
    void main() int X; { ::X = new int[5]; X = ::X[0];}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Promeniti Mikrojava gramatiku da se dodaju opisane mogućnosti (relevantan deo gramatike dat je u prilogu u EBNF notaciji). Jasno označiti šta je promenjeno.&lt;br /&gt;
# Dodati u mikrojava tabelu simbola metod &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;find_hidden(String name)&amp;lt;/syntaxhighlight&amp;gt; koji se poziva za traženje imena pod dejstvom operatora &amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;. Navesti kompletnu implementaciju ovog metoda. U prilogu je (na sledećoj strani) kao podsetnik dat deo postojeće implementacije klase &amp;lt;code&amp;gt;Tab&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Gde u Mikrojava kompajleru treba ugraditi poziv metoda &amp;lt;code&amp;gt;find_hidden&amp;lt;/code&amp;gt;?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Mikrojava gramatika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DesignatorStatement := Designator &amp;quot;=&amp;quot; Expr.&lt;br /&gt;
DesignatorStatement := Designator &amp;quot;++&amp;quot;.&lt;br /&gt;
DesignatorStatement := Designator &amp;quot;--&amp;quot;.&lt;br /&gt;
Statement := DesignatorStatement &amp;quot;;&amp;quot;.&lt;br /&gt;
Statement := &amp;quot;read&amp;quot; &amp;quot;(&amp;quot; Designator &amp;quot;)&amp;quot; &amp;quot;;&amp;quot;.&lt;br /&gt;
Statement := &amp;quot;print&amp;quot; &amp;quot;(&amp;quot; Expr [“,” number] &amp;quot;)&amp;quot; &amp;quot;;&amp;quot;.&lt;br /&gt;
Expr := [&amp;quot;‐&amp;quot;] Term {Addop Term}.&lt;br /&gt;
Term := Factor {Mulop Factor}.&lt;br /&gt;
Factor := numConst | charConst | &amp;quot;(&amp;quot; Expr &amp;quot;)&amp;quot; | boolConst | &amp;quot;new&amp;quot; Type [ &amp;quot;[&amp;quot; Expr &amp;quot;]&amp;quot; ].&lt;br /&gt;
Factor := Designator [ &amp;quot;(&amp;quot; &amp;quot;)&amp;quot; ].&lt;br /&gt;
Designator := ident [&amp;quot;[&amp;quot; Expr &amp;quot;]&amp;quot; ].&lt;br /&gt;
Addop := &amp;quot;+&amp;quot; | &amp;quot;‐&amp;quot; .&lt;br /&gt;
Mulop := &amp;quot;*&amp;quot; | &amp;quot;/&amp;quot; | &amp;quot;%&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Implementacija klase &amp;lt;code&amp;gt;Tab&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class Tab {&lt;br /&gt;
    public static final Struct&lt;br /&gt;
        noType = new Struct(Struct.None),&lt;br /&gt;
        intType = new Struct(Struct.Int),&lt;br /&gt;
        charType = new Struct(Struct.Char),&lt;br /&gt;
        nullType = new Struct(Struct.Class);&lt;br /&gt;
    public static final Obj noObj = new Obj(Obj.Var, &amp;quot;noObj&amp;quot;, noType);&lt;br /&gt;
    public static Obj chrObj, ordObj, lenObj;&lt;br /&gt;
    public static Scope currentScope; //tekuci opseg&lt;br /&gt;
    private static int currentLevel; //nivo ugnezdavanja tekuceg opsega&lt;br /&gt;
    public static void init() {&lt;br /&gt;
        Scope universe = currentScope = new Scope(null);&lt;br /&gt;
        . . . . .&lt;br /&gt;
        currentLevel = -1;&lt;br /&gt;
    }&lt;br /&gt;
    public static void openScope() {&lt;br /&gt;
        currentScope = new Scope(currentScope);&lt;br /&gt;
        currentLevel++;&lt;br /&gt;
    }&lt;br /&gt;
    public static void closeScope() {&lt;br /&gt;
        currentScope = currentScope.getOuter();&lt;br /&gt;
        currentLevel--;&lt;br /&gt;
    }&lt;br /&gt;
    public static Obj insert(int kind, String name, Struct type) {&lt;br /&gt;
        Obj newObj=new Obj(kind,name,type,0,((currentLevel!=0)?1:0));&lt;br /&gt;
        . . . . .&lt;br /&gt;
    }&lt;br /&gt;
    public static Obj find(String name) {&lt;br /&gt;
        Obj resultObj = null;&lt;br /&gt;
        for (Scope s = currentScope; s != null; s = s.getOuter()) {&lt;br /&gt;
            if (s.getLocals() != null) {&lt;br /&gt;
                resultObj = s.getLocals().searchKey(name);&lt;br /&gt;
                if (resultObj != null) break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return (resultObj != null) ? resultObj : noObj;&lt;br /&gt;
    }&lt;br /&gt;
    public static Scope currentScope() {&lt;br /&gt;
        return currentScope;&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;
U gramatici je potrebno izmeniti sledeću smenu:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Designator := [&amp;quot;::&amp;quot;] ident [&amp;quot;[&amp;quot; Expr &amp;quot;]&amp;quot; ].&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Metoda &amp;lt;code&amp;gt;find_hidden&amp;lt;/code&amp;gt; koja pronalazi promenljive iz globalnog dosega programa može da izgleda ovako:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public static Obj find_hidden(String name) {&lt;br /&gt;
        Scope scope = currentScope;&lt;br /&gt;
        for (int level = currentLevel; level &amp;gt; 0; --level) {&lt;br /&gt;
            scope = scope.getOuter();&lt;br /&gt;
        }&lt;br /&gt;
        Obj resultObj = null;&lt;br /&gt;
        if (scope.getLocals() != null) {&lt;br /&gt;
            resultObj = scope.getLocals().searchKey(name);&lt;br /&gt;
        }&lt;br /&gt;
        return (resultObj != null) ? resultObj : noObj;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
U Mikrojava kompajleru poziv ove metode treba ugraditi tokom semantičke analize, kako bi se odgovarajućem čvoru u apstraktnom sintaksnom stablu dodelio simbol koji odgovara promenljivoj iz globalnog opsega.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Nedeterministički konačni automat sa dešifrovanim stanjima.&lt;br /&gt;
! Stanje !! a !! b !! c !! Prihvata&lt;br /&gt;
|-&lt;br /&gt;
| → A    || A    ||       || C || 0&lt;br /&gt;
|-&lt;br /&gt;
| B      || B, C || D     ||   || 0&lt;br /&gt;
|-&lt;br /&gt;
| C      || A    ||       || D || 1&lt;br /&gt;
|-&lt;br /&gt;
| D      ||      || B, C  ||   || 0&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Deterministički konačni automat sa dešifrovanim stanjima&lt;br /&gt;
! Stanje !! a       !! b     !! c     !! Prihvata&lt;br /&gt;
|-&lt;br /&gt;
| → A, B  || A, B, C || D    || C    || 0&lt;br /&gt;
|-&lt;br /&gt;
| A, B, C || A, B, C || D    || C, D || 1&lt;br /&gt;
|-&lt;br /&gt;
| D       ||         || B, C ||      || 0&lt;br /&gt;
|-&lt;br /&gt;
| C       || A       ||      || D    || 1&lt;br /&gt;
|-&lt;br /&gt;
| C, D    || A       || B, C || D    || 1&lt;br /&gt;
|-&lt;br /&gt;
| B, C    || A, B, C || D    || D    || 1&lt;br /&gt;
|-&lt;br /&gt;
| A       || A       ||      || C    || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je gramatika:&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → a &amp;amp;lt;S&amp;gt; b&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → b &amp;amp;lt;S&amp;gt; c&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → bc&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;S&amp;gt; a&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Transformisati gramatiku u LL(1) i odrediti SELECT skupove tako dobijene gramatike.&lt;br /&gt;
# Konstruisati parser na bazi rekurzivnog spusta za gramatiku dobijenu u tački a).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Transformisana gramatika može izgledati ovako:&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → a &amp;amp;lt;S&amp;gt; b &amp;amp;lt;S&#039;&amp;lt;nowiki /&amp;gt;&#039;&amp;gt;&lt;br /&gt;
#: SELECT(1) = {a}&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → b &amp;amp;lt;S&#039;&amp;gt; c &amp;amp;lt;S&#039;&amp;lt;nowiki /&amp;gt;&#039;&amp;gt;&lt;br /&gt;
#: SELECT(2) = {b}&lt;br /&gt;
# &amp;amp;lt;S&#039;&amp;gt; → &amp;amp;lt;S&amp;gt;&lt;br /&gt;
#: SELECT(3) = {a, b}&lt;br /&gt;
# &amp;amp;lt;S&#039;&amp;gt; → ε&lt;br /&gt;
#: SELECT(3) = {c}&lt;br /&gt;
# &amp;amp;lt;S&#039;&amp;lt;nowiki /&amp;gt;&#039;&amp;gt; → a &amp;amp;lt;S&#039;&amp;lt;nowiki /&amp;gt;&#039;&amp;gt; &lt;br /&gt;
#: SELECT(4) = {a}&lt;br /&gt;
# &amp;amp;lt;S&#039;&amp;lt;nowiki /&amp;gt;&#039;&amp;gt; → ε&lt;br /&gt;
#: SELECT(5) = {c, ─┤}&lt;br /&gt;
Parser na bazi rekurzivnog spusta na gornju gramatiku izgleda ovako:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
char input;&lt;br /&gt;
&lt;br /&gt;
void terminal(char c) {&lt;br /&gt;
    if (input == c) {&lt;br /&gt;
        input = advance();&lt;br /&gt;
    } else {&lt;br /&gt;
        reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void S2() {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
            terminal(&#039;a&#039;);&lt;br /&gt;
            S2();&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;c&#039;:&lt;br /&gt;
        case EOF:&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void S();&lt;br /&gt;
&lt;br /&gt;
void S1() {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
        case &#039;b&#039;:&lt;br /&gt;
            S();&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;c&#039;:&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void S() {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
            terminal(&#039;a&#039;);&lt;br /&gt;
            S();&lt;br /&gt;
            terminal(&#039;b&#039;);&lt;br /&gt;
            S2();&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;b&#039;:&lt;br /&gt;
            terminal(&#039;b&#039;);&lt;br /&gt;
            S1();&lt;br /&gt;
            terminal(&#039;c&#039;);&lt;br /&gt;
            S2();&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main() {&lt;br /&gt;
    input = advance();&lt;br /&gt;
    S();&lt;br /&gt;
    terminal(EOF);&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;
Dat je sledeći deo program na jeziku sličnom Pascal-u:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
procedure proc0;&lt;br /&gt;
    var x, y: integer;&lt;br /&gt;
    procedure proc1(z: integer);&lt;br /&gt;
        procedure proc2;&lt;br /&gt;
        begin&lt;br /&gt;
            y := x + z;&lt;br /&gt;
        end;&lt;br /&gt;
    begin&lt;br /&gt;
        proc2;&lt;br /&gt;
    end;&lt;br /&gt;
    procedure proc3(z: integer);&lt;br /&gt;
        var x: integer;&lt;br /&gt;
        procedure proc4;&lt;br /&gt;
        begin&lt;br /&gt;
            proc1(x);&lt;br /&gt;
        end;&lt;br /&gt;
    begin&lt;br /&gt;
        x := z + 1;&lt;br /&gt;
        proc4;&lt;br /&gt;
    end;&lt;br /&gt;
begin&lt;br /&gt;
    x := 5;&lt;br /&gt;
    proc3(x);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Ako je statičko okruženje za nelokalne promenljive realizovano preko pristupnih veza, nacrtati izgled steka nakon izvršavanja naredbe &amp;lt;code&amp;gt;y := x + z;&amp;lt;/code&amp;gt; iz procedure &amp;lt;code&amp;gt;proc2&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Napisati 80x86 asemblerski kod za naredbu &amp;lt;code&amp;gt;y := x + z;&amp;lt;/code&amp;gt; iz procedure &amp;lt;code&amp;gt;proc2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[Датотека:PPR januar 2020 zadatak 5 stek.svg|thumb|Stek iz petog zadatka pod a.]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
MOV DI, [BP+04]&lt;br /&gt;
MOV AX, [DI+06]&lt;br /&gt;
MOV DI, [DI+04]&lt;br /&gt;
MOV BX, [DI-02]&lt;br /&gt;
ADD AX, BX&lt;br /&gt;
MOV [DI-04], AX&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za dati programski fragment:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Napisati odgovarajući međukod i graf toka kontrole na nivou osnovnih blokova.&lt;br /&gt;
# Napisati međukod u SSA formi.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
x = 1;&lt;br /&gt;
y = 0;&lt;br /&gt;
z = 0;&lt;br /&gt;
for (x = 2; y &amp;gt; z; z = z + 1) {&lt;br /&gt;
    if (x - 2 &amp;gt; y) {&lt;br /&gt;
        x = y - 1;&lt;br /&gt;
    } else if(x &amp;gt; y) {&lt;br /&gt;
        x = z - 1;&lt;br /&gt;
    } else break;&lt;br /&gt;
    y = x * 2;&lt;br /&gt;
}&lt;br /&gt;
x = y + z;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[Датотека:PPR januar 2020 zadatak 6 graf.svg|thumb|Graf iz šestog zadatka pod a.]]&lt;br /&gt;
Međukod:&lt;br /&gt;
# x1 := 1&lt;br /&gt;
# y1 := 0&lt;br /&gt;
# z1 := 0&lt;br /&gt;
# x2 := 2&lt;br /&gt;
# t1 := Ф(y1, y2)&lt;br /&gt;
# if t1 &amp;lt;= z goto 22&lt;br /&gt;
# t2 := Ф(x2, x3, x4)&lt;br /&gt;
# t3 := t2 - 2&lt;br /&gt;
# if t3 &amp;lt;= t1 goto 13&lt;br /&gt;
# t4 := t1 - 1&lt;br /&gt;
# x3 := t4&lt;br /&gt;
# goto 18&lt;br /&gt;
# if t2 &amp;lt;= t1 goto 17&lt;br /&gt;
# t5 := z1 - 1&lt;br /&gt;
# x4 := t3&lt;br /&gt;
# goto 18&lt;br /&gt;
# goto 22&lt;br /&gt;
# t6 := Ф(x3, x4)&lt;br /&gt;
# t7 := t6 * 2&lt;br /&gt;
# y2 := t7&lt;br /&gt;
# goto 5&lt;br /&gt;
# t8 := t1 + z1&lt;br /&gt;
# x5 := t8&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6369</id>
		<title>Програмски преводиоци 1/Јануар 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6369"/>
		<updated>2023-06-28T10:14:12Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* ispravka */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Januarski rok 2021. godine&#039;&#039;&#039; održan je 22. januara. Postavka roka je dostupna [http://ir4pp1.etf.rs/Rokovi/2020-2021/pp1_jan2021_ispit.pdf sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je fragmet&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; gramatike jednog programskog jezika.&lt;br /&gt;
# &amp;amp;lt;var_decl&amp;gt; ::= &amp;amp;lt;type&amp;gt; : &amp;amp;lt;id_list&amp;gt;&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt; ::= &amp;amp;lt;id_list&amp;gt; , Ident | Ident&lt;br /&gt;
# &amp;amp;lt;type&amp;gt; ::= int | char&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Napisati atributivnu gramatiku kojom se određuje tip za svaki identifikator u listi (Ident). Jasno naznačiti koji atributi su sintetizovani, a koji nasleđeni.&lt;br /&gt;
# Da li je dobijena gramatika S-atributivna ili L-atributivna?&lt;br /&gt;
# Dobijenoj atributivnoj gramatici (pod a) dodati neophodne akcije koje obezbeđuju dodavanje simbola u tabelu simbola i postavljanje njihovih tipova. Za pisanje akcija koristiti programski jezik Java i sledeći interfejs tabele simbola.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Struct {&lt;br /&gt;
    static final int None = 0, Int = 1, Char = 2, Arr = 3, Class = 4;&lt;br /&gt;
    int kind; // None, Int, Char, Arr, Class&lt;br /&gt;
    boolean equals (Struct other);&lt;br /&gt;
}&lt;br /&gt;
class Tab {&lt;br /&gt;
    Obj insert (String name, Struct type) throws AlreadyDeclaredException;&lt;br /&gt;
    Obj findSymbol (String name) throws SymbolNotFoundException;&lt;br /&gt;
}&lt;br /&gt;
public class Obj {&lt;br /&gt;
    public static final int Con = 0, Var = 1, Type = 2, Prog = 5;&lt;br /&gt;
    public int kind; // Con, Var, Type, Meth, Fld, Prog&lt;br /&gt;
    public String name;&lt;br /&gt;
    public Struct type;&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Atribut &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; je u sledećoj gramatici sintetizovan, dok su atributi &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;idtype&amp;lt;/code&amp;gt; nasleđeni. Ispod je prikazana gramatika sa označenim atributima i dodatim akcijama.&lt;br /&gt;
# &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; → int&lt;br /&gt;
#: t ← Struct.Int&lt;br /&gt;
# &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; → char&lt;br /&gt;
#: t ← Struct.Char&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt; → &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;, Ident&amp;lt;sub&amp;gt;idtype&amp;lt;/sub&amp;gt; {: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;Tab.insert(new Obj(Obj.Var, ident, new Struct(type)));&amp;lt;/syntaxhighlight&amp;gt; :}&lt;br /&gt;
#: idtype ← type&lt;br /&gt;
#: type&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ← type&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt; → Ident&amp;lt;sub&amp;gt;idtype&amp;lt;/sub&amp;gt; {: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;Tab.insert(new Obj(Obj.Var, ident, new Struct(type)));&amp;lt;/syntaxhighlight&amp;gt; :}&lt;br /&gt;
#: idtype ← type&lt;br /&gt;
# &amp;amp;lt;var_decl&amp;gt; → &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; : &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt;&lt;br /&gt;
#: type ← t&lt;br /&gt;
Dobijena gramatika je L-atributivna, ali nije S-atributivna.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za sve sekvence oblika a&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;(bc)&amp;lt;sup&amp;gt;p&amp;lt;/sup&amp;gt;a&amp;lt;sup&amp;gt;2p&amp;lt;/sup&amp;gt;, k ≥ 0, p &amp;gt; 0&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Napisati gramatiku koja opisuje date sekvence.&lt;br /&gt;
# Prikazati potisni automat kojim se prepoznaje isključivo dati skup sekvenci.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Gramatika koja opisuje date sekvence bi bila:&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;A&amp;gt; &amp;amp;lt;B&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → &amp;amp;lt;A&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → bc &amp;amp;lt;B&amp;gt; aa&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → bcaa&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje S1 potisnog automata za opisivanje sekvenci iz drugog zadatka.&lt;br /&gt;
! Stanje&lt;br /&gt;
! a&lt;br /&gt;
! b&lt;br /&gt;
! c&lt;br /&gt;
! ─┤&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| ADVANCE&lt;br /&gt;
|&lt;br /&gt;
* PUSH(A)&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|&lt;br /&gt;
* PUSH(B)&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
| STATE(S2)&lt;br /&gt;
|&lt;br /&gt;
* PUSH(A)&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje S2 potisnog automata za opisivanje sekvenci iz drugog zadatka.&lt;br /&gt;
! Stanje&lt;br /&gt;
! a&lt;br /&gt;
! b&lt;br /&gt;
! c&lt;br /&gt;
! ─┤&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| ACCEPT&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
|&lt;br /&gt;
* POP&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
|&lt;br /&gt;
* POP&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Formirati parser na principu rekurzivnog spusta koji prepoznaje skup sekvenci predstavljenih sledećim produkcijama.&lt;br /&gt;
# &amp;amp;lt;S’&amp;gt; → &amp;amp;lt;S&amp;gt; ─┤&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;A&amp;gt; a &amp;amp;lt;B&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → a b &amp;amp;lt;B&amp;gt; b&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → &amp;amp;lt;C&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → &amp;amp;lt;D&amp;gt; &amp;amp;lt;C&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;C&amp;gt; → c &amp;amp;lt;C&amp;gt;&lt;br /&gt;
# &amp;amp;lt;C&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;D&amp;gt; → d&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;
char input;&lt;br /&gt;
&lt;br /&gt;
void terminal(char t) {&lt;br /&gt;
    if (input == t) {&lt;br /&gt;
        input = advance();&lt;br /&gt;
    } else {&lt;br /&gt;
        reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void A() {&lt;br /&gt;
    terminal(&#039;a&#039;);&lt;br /&gt;
    terminal(&#039;b&#039;);&lt;br /&gt;
    B();&lt;br /&gt;
    terminal(&#039;b&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void C() {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;c&#039;:&lt;br /&gt;
            terminal(&#039;c&#039;);&lt;br /&gt;
            C();&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void D() {&lt;br /&gt;
    terminal(&#039;d&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void B() {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
        case &#039;c&#039;:&lt;br /&gt;
            C();&lt;br /&gt;
            terminal(&#039;a&#039;);&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;d&#039;:&lt;br /&gt;
            D();&lt;br /&gt;
            C();&lt;br /&gt;
            terminal(&#039;a&#039;);&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;b&#039;:&lt;br /&gt;
        case EOF:&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void S() {&lt;br /&gt;
    A();&lt;br /&gt;
    terminal(&#039;a&#039;);&lt;br /&gt;
    B();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main() {&lt;br /&gt;
    input = advance();&lt;br /&gt;
    S();&lt;br /&gt;
    terminal(EOF);&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;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Dat je listing programa napisanog na programskom jeziku Mikrojava. Sve metode unutrašnjih klasa su virtuelne. Globalne metode se pozivaju statički. Napisati kompletan Mikrojava bajtkod prevoda datog programa. Za svaku liniju koda jasno naznačiti koji deo bajtkoda se odnosi na nju.&lt;br /&gt;
# Odrediti deo koda koji se nalazi na mestu komentara u datom programu, a kome odgovara dati Mikrojava bajtkod.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
program Januar2021&lt;br /&gt;
const int K = 3;&lt;br /&gt;
class CL { int p; }&lt;br /&gt;
CL global;&lt;br /&gt;
{&lt;br /&gt;
 void m(CL arg)&lt;br /&gt;
     int y;&lt;br /&gt;
 {&lt;br /&gt;
     if(y &amp;gt;= K || y == 0)&lt;br /&gt;
         global.p++;&lt;br /&gt;
     else arg.p = K;&lt;br /&gt;
 }&lt;br /&gt;
 void main()&lt;br /&gt;
     int x; int arr[];&lt;br /&gt;
 {&lt;br /&gt;
     global = new CL;&lt;br /&gt;
     arr = new int[3];&lt;br /&gt;
     arr[K-2] = -arr[x];&lt;br /&gt;
     m(global);&lt;br /&gt;
     /* ??? */&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
getstatic 0&lt;br /&gt;
const_2&lt;br /&gt;
load_0&lt;br /&gt;
load_1&lt;br /&gt;
const_0&lt;br /&gt;
aload&lt;br /&gt;
mul&lt;br /&gt;
add&lt;br /&gt;
putfield 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prevedeni bajtkod može da izgleda ovako:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
enter 1 2       # void m(CL arg) int y; {&lt;br /&gt;
load_1          # if (&lt;br /&gt;
const_3&lt;br /&gt;
jge 8           # y &amp;gt;= K&lt;br /&gt;
load_1&lt;br /&gt;
const_0&lt;br /&gt;
jne 18          # y == 0)&lt;br /&gt;
getstatic 0     # global.p++;&lt;br /&gt;
dup&lt;br /&gt;
getfield 1&lt;br /&gt;
const_1&lt;br /&gt;
add&lt;br /&gt;
putfield 1&lt;br /&gt;
jmp 8           # else&lt;br /&gt;
load_0          # arg.p = K;&lt;br /&gt;
const_3&lt;br /&gt;
putfield 1&lt;br /&gt;
exit            # }&lt;br /&gt;
return&lt;br /&gt;
enter 0 2       # void main() int x; int arr[]; {&lt;br /&gt;
new 8           # global = new CL;&lt;br /&gt;
putstatic 0&lt;br /&gt;
const_3         # arr = new int[3];&lt;br /&gt;
newarray 1&lt;br /&gt;
store_1&lt;br /&gt;
load_1          # arr[K-2] = -arr[x];&lt;br /&gt;
const_3&lt;br /&gt;
const_2&lt;br /&gt;
sub&lt;br /&gt;
load_1&lt;br /&gt;
load_0&lt;br /&gt;
aload&lt;br /&gt;
neg&lt;br /&gt;
astore&lt;br /&gt;
getstatic 0     # m(global);&lt;br /&gt;
call ??? (=m)   # Verovatno nisu tražili tačan pomeraj?&lt;br /&gt;
exit            # }&lt;br /&gt;
return&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Linija koda koja fali u programu je:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
global.p = 2 + x * arr[0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je sledeći fragment (bazični blok) međukoda:&lt;br /&gt;
# x = 2&lt;br /&gt;
# z = x + 3&lt;br /&gt;
# y = z – x&lt;br /&gt;
# x = y&lt;br /&gt;
# z = x + y&lt;br /&gt;
# x = z – y&lt;br /&gt;
# z = y – x&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Za svaku instrukciju u kodu odrediti koje su promenljive žive.&lt;br /&gt;
# Korišćenjem algoritma getreg generisati mašinski kod za 80x86 arhitekturu na osnovu datog međukoda i informacija iz tačke a). Pretpostaviti da se koriste dvoadresne mašinske instrukcije gde je prvi operand odredište operacije (oblika ADD dst, src) i da se koriste samo dva registra AX i BX. Rešenje ČITKO upisati u datu tabelu.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela sa traženim informacijama iz zadatka.&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Redni broj&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Ulaz&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Život i sledeća upotreba&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Deskriptori&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | &#039;&#039;getreg&#039;&#039;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Generisani kod&lt;br /&gt;
|-&lt;br /&gt;
! x&lt;br /&gt;
! y&lt;br /&gt;
! z&lt;br /&gt;
! AX&lt;br /&gt;
! BX&lt;br /&gt;
|-&lt;br /&gt;
| 1. || x = 2     || ž2 || m- || m- || x || - || AX || MOV AX, 2&lt;br /&gt;
|-&lt;br /&gt;
| 2. || z = x + 3 || ž3 || m- || ž3 || x || z || BX || MOV BX, AX; ADD BX, 3&lt;br /&gt;
|-&lt;br /&gt;
| 3. || y = z - x || m- || ž4 || m- || x || y || BX || SUB BX, AX&lt;br /&gt;
|-&lt;br /&gt;
| 4. || x = y     || ž5 || ž5 || m- || x || y || AX || MOV AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 5. || z = x + y || m- || ž6 || ž6 || z || y || AX || ADD AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 6. || x = z - y || ž7 || ž7 || m- || x || y || AX || SUB AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 7. || z = y - x || ž- || ž- || ž- || x || z || BX || MOV y, BX; SUB BX, AX&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
| MOV x, AX; MOV z, BX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6368</id>
		<title>Програмски преводиоци 1/Јануар 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6368"/>
		<updated>2023-06-28T01:01:17Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* ispravka */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Januarski rok 2021. godine&#039;&#039;&#039; održan je 22. januara. Postavka roka je dostupna [http://ir4pp1.etf.rs/Rokovi/2020-2021/pp1_jan2021_ispit.pdf sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je fragmet&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; gramatike jednog programskog jezika.&lt;br /&gt;
# &amp;amp;lt;var_decl&amp;gt; ::= &amp;amp;lt;type&amp;gt; : &amp;amp;lt;id_list&amp;gt;&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt; ::= &amp;amp;lt;id_list&amp;gt; , Ident | Ident&lt;br /&gt;
# &amp;amp;lt;type&amp;gt; ::= int | char&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Napisati atributivnu gramatiku kojom se određuje tip za svaki identifikator u listi (Ident). Jasno naznačiti koji atributi su sintetizovani, a koji nasleđeni.&lt;br /&gt;
# Da li je dobijena gramatika S-atributivna ili L-atributivna?&lt;br /&gt;
# Dobijenoj atributivnoj gramatici (pod a) dodati neophodne akcije koje obezbeđuju dodavanje simbola u tabelu simbola i postavljanje njihovih tipova. Za pisanje akcija koristiti programski jezik Java i sledeći interfejs tabele simbola.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Struct {&lt;br /&gt;
    static final int None = 0, Int = 1, Char = 2, Arr = 3, Class = 4;&lt;br /&gt;
    int kind; // None, Int, Char, Arr, Class&lt;br /&gt;
    boolean equals (Struct other);&lt;br /&gt;
}&lt;br /&gt;
class Tab {&lt;br /&gt;
    Obj insert (String name, Struct type) throws AlreadyDeclaredException;&lt;br /&gt;
    Obj findSymbol (String name) throws SymbolNotFoundException;&lt;br /&gt;
}&lt;br /&gt;
public class Obj {&lt;br /&gt;
    public static final int Con = 0, Var = 1, Type = 2, Prog = 5;&lt;br /&gt;
    public int kind; // Con, Var, Type, Meth, Fld, Prog&lt;br /&gt;
    public String name;&lt;br /&gt;
    public Struct type;&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Atribut &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; je u sledećoj gramatici sintetizovan, dok su atributi &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;idtype&amp;lt;/code&amp;gt; nasleđeni. Ispod je prikazana gramatika sa označenim atributima i dodatim akcijama.&lt;br /&gt;
# &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; → int&lt;br /&gt;
#: t ← Struct.Int&lt;br /&gt;
# &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; → char&lt;br /&gt;
#: t ← Struct.Char&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt; → &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;, Ident&amp;lt;sub&amp;gt;idtype&amp;lt;/sub&amp;gt; {: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;Tab.insert(new Obj(Obj.Var, ident, new Struct(type)));&amp;lt;/syntaxhighlight&amp;gt; :}&lt;br /&gt;
#: idtype ← type&lt;br /&gt;
#: type&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ← type&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt; → Ident&amp;lt;sub&amp;gt;idtype&amp;lt;/sub&amp;gt; {: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;Tab.insert(new Obj(Obj.Var, ident, new Struct(type)));&amp;lt;/syntaxhighlight&amp;gt; :}&lt;br /&gt;
#: idtype ← type&lt;br /&gt;
# &amp;amp;lt;var_decl&amp;gt; → &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; : &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt;&lt;br /&gt;
#: type ← t&lt;br /&gt;
Dobijena gramatika je L-atributivna, ali nije S-atributivna.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za sve sekvence oblika a&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;(bc)&amp;lt;sup&amp;gt;p&amp;lt;/sup&amp;gt;a&amp;lt;sup&amp;gt;2p&amp;lt;/sup&amp;gt;, k ≥ 0, p &amp;gt; 0&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Napisati gramatiku koja opisuje date sekvence.&lt;br /&gt;
# Prikazati potisni automat kojim se prepoznaje isključivo dati skup sekvenci.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Gramatika koja opisuje date sekvence bi bila:&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;A&amp;gt; &amp;amp;lt;B&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → &amp;amp;lt;A&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → bc &amp;amp;lt;B&amp;gt; aa&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → bcaa&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje S1 potisnog automata za opisivanje sekvenci iz drugog zadatka.&lt;br /&gt;
! Stanje&lt;br /&gt;
! a&lt;br /&gt;
! b&lt;br /&gt;
! c&lt;br /&gt;
! ─┤&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| ADVANCE&lt;br /&gt;
|&lt;br /&gt;
* PUSH(A)&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|&lt;br /&gt;
* PUSH(B)&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
| STATE(S2)&lt;br /&gt;
| PUSH(A)&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje S2 potisnog automata za opisivanje sekvenci iz drugog zadatka.&lt;br /&gt;
! Stanje&lt;br /&gt;
! a&lt;br /&gt;
! b&lt;br /&gt;
! c&lt;br /&gt;
! ─┤&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| ACCEPT&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
|&lt;br /&gt;
* POP&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
|&lt;br /&gt;
* POP&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Formirati parser na principu rekurzivnog spusta koji prepoznaje skup sekvenci predstavljenih sledećim produkcijama.&lt;br /&gt;
# &amp;amp;lt;S’&amp;gt; → &amp;amp;lt;S&amp;gt; ─┤&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;A&amp;gt; a &amp;amp;lt;B&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → a b &amp;amp;lt;B&amp;gt; b&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → &amp;amp;lt;C&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → &amp;amp;lt;D&amp;gt; &amp;amp;lt;C&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;C&amp;gt; → c &amp;amp;lt;C&amp;gt;&lt;br /&gt;
# &amp;amp;lt;C&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;D&amp;gt; → d&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;
char input;&lt;br /&gt;
&lt;br /&gt;
void terminal(char t) {&lt;br /&gt;
    if (input == t) {&lt;br /&gt;
        input = advance();&lt;br /&gt;
    } else {&lt;br /&gt;
        reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void A() {&lt;br /&gt;
    terminal(&#039;a&#039;);&lt;br /&gt;
    terminal(&#039;b&#039;);&lt;br /&gt;
    B();&lt;br /&gt;
    terminal(&#039;b&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void C() {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;c&#039;:&lt;br /&gt;
            terminal(&#039;c&#039;);&lt;br /&gt;
            C();&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void D() {&lt;br /&gt;
    terminal(&#039;d&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void B() {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
        case &#039;c&#039;:&lt;br /&gt;
            C();&lt;br /&gt;
            terminal(&#039;a&#039;);&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;d&#039;:&lt;br /&gt;
            D();&lt;br /&gt;
            C();&lt;br /&gt;
            terminal(&#039;a&#039;);&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;b&#039;:&lt;br /&gt;
        case EOF:&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void S() {&lt;br /&gt;
    A();&lt;br /&gt;
    terminal(&#039;a&#039;);&lt;br /&gt;
    B();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main() {&lt;br /&gt;
    input = advance();&lt;br /&gt;
    S();&lt;br /&gt;
    terminal(EOF);&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;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Dat je listing programa napisanog na programskom jeziku Mikrojava. Sve metode unutrašnjih klasa su virtuelne. Globalne metode se pozivaju statički. Napisati kompletan Mikrojava bajtkod prevoda datog programa. Za svaku liniju koda jasno naznačiti koji deo bajtkoda se odnosi na nju.&lt;br /&gt;
# Odrediti deo koda koji se nalazi na mestu komentara u datom programu, a kome odgovara dati Mikrojava bajtkod.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
program Januar2021&lt;br /&gt;
const int K = 3;&lt;br /&gt;
class CL { int p; }&lt;br /&gt;
CL global;&lt;br /&gt;
{&lt;br /&gt;
 void m(CL arg)&lt;br /&gt;
     int y;&lt;br /&gt;
 {&lt;br /&gt;
     if(y &amp;gt;= K || y == 0)&lt;br /&gt;
         global.p++;&lt;br /&gt;
     else arg.p = K;&lt;br /&gt;
 }&lt;br /&gt;
 void main()&lt;br /&gt;
     int x; int arr[];&lt;br /&gt;
 {&lt;br /&gt;
     global = new CL;&lt;br /&gt;
     arr = new int[3];&lt;br /&gt;
     arr[K-2] = -arr[x];&lt;br /&gt;
     m(global);&lt;br /&gt;
     /* ??? */&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
getstatic 0&lt;br /&gt;
const_2&lt;br /&gt;
load_0&lt;br /&gt;
load_1&lt;br /&gt;
const_0&lt;br /&gt;
aload&lt;br /&gt;
mul&lt;br /&gt;
add&lt;br /&gt;
putfield 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prevedeni bajtkod može da izgleda ovako:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
enter 1 2       # void m(CL arg) int y; {&lt;br /&gt;
load_1          # if (&lt;br /&gt;
const_3&lt;br /&gt;
jge 8           # y &amp;gt;= K&lt;br /&gt;
load_1&lt;br /&gt;
const_0&lt;br /&gt;
jne 18          # y == 0)&lt;br /&gt;
getstatic 0     # global.p++;&lt;br /&gt;
dup&lt;br /&gt;
getfield 1&lt;br /&gt;
const_1&lt;br /&gt;
add&lt;br /&gt;
putfield 1&lt;br /&gt;
jmp 8           # else&lt;br /&gt;
load_0          # arg.p = K;&lt;br /&gt;
const_3&lt;br /&gt;
putfield 1&lt;br /&gt;
exit            # }&lt;br /&gt;
return&lt;br /&gt;
enter 0 2       # void main() int x; int arr[]; {&lt;br /&gt;
new 8           # global = new CL;&lt;br /&gt;
putstatic 0&lt;br /&gt;
const_3         # arr = new int[3];&lt;br /&gt;
newarray 1&lt;br /&gt;
store_1&lt;br /&gt;
load_1          # arr[K-2] = -arr[x];&lt;br /&gt;
const_3&lt;br /&gt;
const_2&lt;br /&gt;
sub&lt;br /&gt;
load_1&lt;br /&gt;
load_0&lt;br /&gt;
aload&lt;br /&gt;
neg&lt;br /&gt;
astore&lt;br /&gt;
getstatic 0     # m(global);&lt;br /&gt;
call ??? (=m)   # Verovatno nisu tražili tačan pomeraj?&lt;br /&gt;
exit            # }&lt;br /&gt;
return&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Linija koda koja fali u programu je:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
global.p = 2 + x * arr[0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je sledeći fragment (bazični blok) međukoda:&lt;br /&gt;
# x = 2&lt;br /&gt;
# z = x + 3&lt;br /&gt;
# y = z – x&lt;br /&gt;
# x = y&lt;br /&gt;
# z = x + y&lt;br /&gt;
# x = z – y&lt;br /&gt;
# z = y – x&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Za svaku instrukciju u kodu odrediti koje su promenljive žive.&lt;br /&gt;
# Korišćenjem algoritma getreg generisati mašinski kod za 80x86 arhitekturu na osnovu datog međukoda i informacija iz tačke a). Pretpostaviti da se koriste dvoadresne mašinske instrukcije gde je prvi operand odredište operacije (oblika ADD dst, src) i da se koriste samo dva registra AX i BX. Rešenje ČITKO upisati u datu tabelu.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela sa traženim informacijama iz zadatka.&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Redni broj&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Ulaz&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Život i sledeća upotreba&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Deskriptori&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | &#039;&#039;getreg&#039;&#039;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Generisani kod&lt;br /&gt;
|-&lt;br /&gt;
! x&lt;br /&gt;
! y&lt;br /&gt;
! z&lt;br /&gt;
! AX&lt;br /&gt;
! BX&lt;br /&gt;
|-&lt;br /&gt;
| 1. || x = 2     || ž2 || m- || m- || x || - || AX || MOV AX, 2&lt;br /&gt;
|-&lt;br /&gt;
| 2. || z = x + 3 || ž3 || m- || ž3 || x || z || BX || MOV BX, AX; ADD BX, 3&lt;br /&gt;
|-&lt;br /&gt;
| 3. || y = z - x || m- || ž4 || m- || x || y || BX || SUB BX, AX&lt;br /&gt;
|-&lt;br /&gt;
| 4. || x = y     || ž5 || ž5 || m- || x || y || AX || MOV AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 5. || z = x + y || m- || ž6 || ž6 || z || y || AX || ADD AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 6. || x = z - y || ž7 || ž7 || m- || x || y || AX || SUB AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 7. || z = y - x || ž- || ž- || ž- || x || z || BX || MOV y, BX; SUB BX, AX&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
| MOV x, AX; MOV z, BX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6367</id>
		<title>Програмски преводиоци 1/Јануар 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6367"/>
		<updated>2023-06-28T00:18:27Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* Postavka */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Januarski rok 2021. godine&#039;&#039;&#039; održan je 22. januara. Postavka roka je dostupna [http://ir4pp1.etf.rs/Rokovi/2020-2021/pp1_jan2021_ispit.pdf sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je fragmet&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; gramatike jednog programskog jezika.&lt;br /&gt;
# &amp;amp;lt;var_decl&amp;gt; ::= &amp;amp;lt;type&amp;gt; : &amp;amp;lt;id_list&amp;gt;&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt; ::= &amp;amp;lt;id_list&amp;gt; , Ident | Ident&lt;br /&gt;
# &amp;amp;lt;type&amp;gt; ::= int | char&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Napisati atributivnu gramatiku kojom se određuje tip za svaki identifikator u listi (Ident). Jasno naznačiti koji atributi su sintetizovani, a koji nasleđeni.&lt;br /&gt;
# Da li je dobijena gramatika S-atributivna ili L-atributivna?&lt;br /&gt;
# Dobijenoj atributivnoj gramatici (pod a) dodati neophodne akcije koje obezbeđuju dodavanje simbola u tabelu simbola i postavljanje njihovih tipova. Za pisanje akcija koristiti programski jezik Java i sledeći interfejs tabele simbola.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Struct {&lt;br /&gt;
    static final int None = 0, Int = 1, Char = 2, Arr = 3, Class = 4;&lt;br /&gt;
    int kind; // None, Int, Char, Arr, Class&lt;br /&gt;
    boolean equals (Struct other);&lt;br /&gt;
}&lt;br /&gt;
class Tab {&lt;br /&gt;
    Obj insert (String name, Struct type) throws AlreadyDeclaredException;&lt;br /&gt;
    Obj findSymbol (String name) throws SymbolNotFoundException;&lt;br /&gt;
}&lt;br /&gt;
public class Obj {&lt;br /&gt;
    public static final int Con = 0, Var = 1, Type = 2, Prog = 5;&lt;br /&gt;
    public int kind; // Con, Var, Type, Meth, Fld, Prog&lt;br /&gt;
    public String name;&lt;br /&gt;
    public Struct type;&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Atribut &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; je u sledećoj gramatici sintetizovan, dok su atributi &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;idtype&amp;lt;/code&amp;gt; nasleđeni. Ispod je prikazana gramatika sa označenim atributima i dodatim akcijama.&lt;br /&gt;
# &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; → int&lt;br /&gt;
#: t ← Struct.Int&lt;br /&gt;
# &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; → char&lt;br /&gt;
#: t ← Struct.Char&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt; → &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;, Ident&amp;lt;sub&amp;gt;idtype&amp;lt;/sub&amp;gt; {: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;Tab.insert(new Obj(Obj.Var, ident, new Struct(type)));&amp;lt;/syntaxhighlight&amp;gt; :}&lt;br /&gt;
#: idtype ← type&lt;br /&gt;
#: type&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ← type&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt; → Ident&amp;lt;sub&amp;gt;idtype&amp;lt;/sub&amp;gt; {: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;Tab.insert(new Obj(Obj.Var, ident, new Struct(type)));&amp;lt;/syntaxhighlight&amp;gt; :}&lt;br /&gt;
#: idtype ← type&lt;br /&gt;
# &amp;amp;lt;var_decl&amp;gt; → &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; : &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt;&lt;br /&gt;
#: type ← t&lt;br /&gt;
Dobijena gramatika je L-atributivna, ali nije S-atributivna.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za sve sekvence oblika a&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;(bc)&amp;lt;sup&amp;gt;p&amp;lt;/sup&amp;gt;a&amp;lt;sup&amp;gt;2p&amp;lt;/sup&amp;gt;, k ≥ 0, p &amp;gt; 0&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Napisati gramatiku koja opisuje date sekvence.&lt;br /&gt;
# Prikazati potisni automat kojim se prepoznaje isključivo dati skup sekvenci.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Gramatika koja opisuje date sekvence bi bila:&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;A&amp;gt; &amp;amp;lt;B&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → &amp;amp;lt;A&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → bc &amp;amp;lt;B&amp;gt; aa&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → bcaa&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje S1 potisnog automata za opisivanje sekvenci iz drugog zadatka.&lt;br /&gt;
! Stanje&lt;br /&gt;
! a&lt;br /&gt;
! b&lt;br /&gt;
! c&lt;br /&gt;
! ─┤&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| ADVANCE&lt;br /&gt;
|&lt;br /&gt;
* PUSH(A)&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|&lt;br /&gt;
* PUSH(B)&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
| STATE(S2)&lt;br /&gt;
| PUSH(A)&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje S2 potisnog automata za opisivanje sekvenci iz drugog zadatka.&lt;br /&gt;
! Stanje&lt;br /&gt;
! a&lt;br /&gt;
! b&lt;br /&gt;
! c&lt;br /&gt;
! ─┤&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| ACCEPT&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
|&lt;br /&gt;
* POP&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
|&lt;br /&gt;
* POP&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Formirati parser na principu rekurzivnog spusta koji prepoznaje skup sekvenci predstavljenih sledećim produkcijama.&lt;br /&gt;
# &amp;amp;lt;S’&amp;gt; → &amp;amp;lt;S&amp;gt; ─┤&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;A&amp;gt; a &amp;amp;lt;B&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → a b &amp;amp;lt;B&amp;gt; b&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → &amp;amp;lt;C&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → &amp;amp;lt;D&amp;gt; &amp;amp;lt;C&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;C&amp;gt; → c &amp;amp;lt;C&amp;gt;&lt;br /&gt;
# &amp;amp;lt;C&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;D&amp;gt; → d&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;
char input;&lt;br /&gt;
&lt;br /&gt;
void terminal(char t) {&lt;br /&gt;
    if (input == t) {&lt;br /&gt;
        input = advance();&lt;br /&gt;
    } else {&lt;br /&gt;
        reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void A() {&lt;br /&gt;
    terminal(&#039;a&#039;);&lt;br /&gt;
    terminal(&#039;b&#039;);&lt;br /&gt;
    B();&lt;br /&gt;
    terminal(&#039;b&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void C() {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;c&#039;:&lt;br /&gt;
            terminal(&#039;c&#039;);&lt;br /&gt;
            C();&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void D() {&lt;br /&gt;
    terminal(&#039;d&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void B() {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
        case &#039;c&#039;:&lt;br /&gt;
            C();&lt;br /&gt;
            terminal(&#039;a&#039;);&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;d&#039;:&lt;br /&gt;
            D();&lt;br /&gt;
            C();&lt;br /&gt;
            terminal(&#039;a&#039;);&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;b&#039;:&lt;br /&gt;
        case EOF:&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void S() {&lt;br /&gt;
    A();&lt;br /&gt;
    terminal(&#039;a&#039;);&lt;br /&gt;
    B();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main() {&lt;br /&gt;
    input = advance();&lt;br /&gt;
    S();&lt;br /&gt;
    terminal(EOF);&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;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Dat je listing programa napisanog na programskom jeziku Mikrojava. Sve metode unutrašnjih klasa su virtuelne. Globalne metode se pozivaju statički. Napisati kompletan Mikrojava bajtkod prevoda datog programa. Za svaku liniju koda jasno naznačiti koji deo bajtkoda se odnosi na nju.&lt;br /&gt;
# Odrediti deo koda koji se nalazi na mestu komentara u datom programu, a kome odgovara dati Mikrojava bajtkod.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
program Januar2021&lt;br /&gt;
const int K = 3;&lt;br /&gt;
class CL { int p; }&lt;br /&gt;
CL global;&lt;br /&gt;
{&lt;br /&gt;
 void m(CL arg)&lt;br /&gt;
     int y;&lt;br /&gt;
 {&lt;br /&gt;
     if(y &amp;gt;= K || y == 0)&lt;br /&gt;
         global.p++;&lt;br /&gt;
     else arg.p = K;&lt;br /&gt;
 }&lt;br /&gt;
 void main()&lt;br /&gt;
     int x; int arr[];&lt;br /&gt;
 {&lt;br /&gt;
     global = new CL;&lt;br /&gt;
     arr = new int[3];&lt;br /&gt;
     arr[K-2] = -arr[x];&lt;br /&gt;
     m(global);&lt;br /&gt;
     /* ??? */&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
getstatic 0&lt;br /&gt;
const_2&lt;br /&gt;
load_0&lt;br /&gt;
load_1&lt;br /&gt;
const_0&lt;br /&gt;
aload&lt;br /&gt;
mul&lt;br /&gt;
add&lt;br /&gt;
putfield 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prevedeni bajtkod može da izgleda ovako:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
enter 1 2       # void m(CL arg) int y; {&lt;br /&gt;
load_1          # if (&lt;br /&gt;
const_3&lt;br /&gt;
jge 8           # y &amp;gt;= K&lt;br /&gt;
load_1&lt;br /&gt;
const_0&lt;br /&gt;
jne 20          # y == 0)&lt;br /&gt;
getstatic 0     # global.p++;&lt;br /&gt;
getfield 1&lt;br /&gt;
const_1&lt;br /&gt;
add&lt;br /&gt;
getstatic 0&lt;br /&gt;
putfield 1&lt;br /&gt;
jmp 8           # else&lt;br /&gt;
load_0          # arg.p = K;&lt;br /&gt;
const_3&lt;br /&gt;
putfield 1&lt;br /&gt;
exit            # }&lt;br /&gt;
return&lt;br /&gt;
enter 0 2       # void main() int x; int arr[]; {&lt;br /&gt;
new 8           # global = new CL;&lt;br /&gt;
putstatic 0&lt;br /&gt;
const_3         # arr = new int[3];&lt;br /&gt;
newarray 1&lt;br /&gt;
store_1&lt;br /&gt;
load_1          # arr[K-2] = -arr[x];&lt;br /&gt;
const_3&lt;br /&gt;
const_2&lt;br /&gt;
sub&lt;br /&gt;
load_1&lt;br /&gt;
load_0&lt;br /&gt;
aload&lt;br /&gt;
neg&lt;br /&gt;
astore&lt;br /&gt;
getstatic 0     # m(global);&lt;br /&gt;
call ??? (=m)   # Verovatno nisu tražili tačan pomeraj?&lt;br /&gt;
exit            # }&lt;br /&gt;
return&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Linija koda koja fali u programu je:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
global.p = 2 + x * arr[0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je sledeći fragment (bazični blok) međukoda:&lt;br /&gt;
# x = 2&lt;br /&gt;
# z = x + 3&lt;br /&gt;
# y = z – x&lt;br /&gt;
# x = y&lt;br /&gt;
# z = x + y&lt;br /&gt;
# x = z – y&lt;br /&gt;
# z = y – x&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Za svaku instrukciju u kodu odrediti koje su promenljive žive.&lt;br /&gt;
# Korišćenjem algoritma getreg generisati mašinski kod za 80x86 arhitekturu na osnovu datog međukoda i informacija iz tačke a). Pretpostaviti da se koriste dvoadresne mašinske instrukcije gde je prvi operand odredište operacije (oblika ADD dst, src) i da se koriste samo dva registra AX i BX. Rešenje ČITKO upisati u datu tabelu.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela sa traženim informacijama iz zadatka.&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Redni broj&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Ulaz&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Život i sledeća upotreba&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Deskriptori&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | &#039;&#039;getreg&#039;&#039;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Generisani kod&lt;br /&gt;
|-&lt;br /&gt;
! x&lt;br /&gt;
! y&lt;br /&gt;
! z&lt;br /&gt;
! AX&lt;br /&gt;
! BX&lt;br /&gt;
|-&lt;br /&gt;
| 1. || x = 2     || ž2 || m- || m- || x || - || AX || MOV AX, 2&lt;br /&gt;
|-&lt;br /&gt;
| 2. || z = x + 3 || ž3 || m- || ž3 || x || z || BX || MOV BX, AX; ADD BX, 3&lt;br /&gt;
|-&lt;br /&gt;
| 3. || y = z - x || m- || ž4 || m- || x || y || BX || SUB BX, AX&lt;br /&gt;
|-&lt;br /&gt;
| 4. || x = y     || ž5 || ž5 || m- || x || y || AX || MOV AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 5. || z = x + y || m- || ž6 || ž6 || z || y || AX || ADD AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 6. || x = z - y || ž7 || ž7 || m- || x || y || AX || SUB AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 7. || z = y - x || ž- || ž- || ž- || x || z || BX || MOV y, BX; SUB BX, AX&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
| MOV x, AX; MOV z, BX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6366</id>
		<title>Програмски преводиоци 1/Јануар 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6366"/>
		<updated>2023-06-28T00:16:39Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* 2 -&amp;gt; 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Januarski rok 2021. godine&#039;&#039;&#039; održan je 22. januara. Postavka roka je dostupna [http://ir4pp1.etf.rs/Rokovi/2020-2021/pp1_jan2021_ispit.pdf sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je fragmet&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; gramatike jednog programskog jezika.&lt;br /&gt;
# &amp;amp;lt;var_decl&amp;gt; ::= &amp;amp;lt;type&amp;gt; : &amp;amp;lt;id_list&amp;gt;&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt; ::= &amp;amp;lt;id_list&amp;gt; , Ident | Ident&lt;br /&gt;
# &amp;amp;lt;type&amp;gt; ::= int | char&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Napisati atributivnu gramatiku kojom se određuje tip za svaki identifikator u listi (Ident). Jasno naznačiti koji atributi su sintetizovani, a koji nasleđeni.&lt;br /&gt;
# Da li je dobijena gramatika S-atributivna ili L-atributivna?&lt;br /&gt;
# Dobijenoj atributivnoj gramatici (pod a) dodati neophodne akcije koje obezbeđuju dodavanje simbola u tabelu simbola i postavljanje njihovih tipova. Za pisanje akcija koristiti programski jezik Java i sledeći interfejs tabele simbola.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Struct {&lt;br /&gt;
    static final int None = 0, Int = 1, Char = 2, Arr = 3, Class = 4;&lt;br /&gt;
    int kind; // None, Int, Char, Arr, Class&lt;br /&gt;
    boolean equals (Struct other);&lt;br /&gt;
}&lt;br /&gt;
class Tab {&lt;br /&gt;
    Obj insert (String name, Struct type) throws AlreadyDeclaredException;&lt;br /&gt;
    Obj findSymbol (String name) throws SymbolNotFoundException;&lt;br /&gt;
}&lt;br /&gt;
public class Obj {&lt;br /&gt;
    public static final int Con = 0, Var = 1, Type = 2, Prog = 5;&lt;br /&gt;
    public int kind; // Con, Var, Type, Meth, Fld, Prog&lt;br /&gt;
    public String name;&lt;br /&gt;
    public Struct type;&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Atribut &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; je u sledećoj gramatici sintetizovan, dok su atributi &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;idtype&amp;lt;/code&amp;gt; nasleđeni. Ispod je prikazana gramatika sa označenim atributima i dodatim akcijama.&lt;br /&gt;
# &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; → int&lt;br /&gt;
#: t ← Struct.Int&lt;br /&gt;
# &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; → char&lt;br /&gt;
#: t ← Struct.Char&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt; → &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;, Ident&amp;lt;sub&amp;gt;idtype&amp;lt;/sub&amp;gt; {: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;Tab.insert(new Obj(Obj.Var, ident, new Struct(type)));&amp;lt;/syntaxhighlight&amp;gt; :}&lt;br /&gt;
#: idtype ← type&lt;br /&gt;
#: type&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ← type&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt; → Ident&amp;lt;sub&amp;gt;idtype&amp;lt;/sub&amp;gt; {: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;Tab.insert(new Obj(Obj.Var, ident, new Struct(type)));&amp;lt;/syntaxhighlight&amp;gt; :}&lt;br /&gt;
#: idtype ← type&lt;br /&gt;
# &amp;amp;lt;var_decl&amp;gt; → &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; : &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt;&lt;br /&gt;
#: type ← t&lt;br /&gt;
Dobijena gramatika je L-atributivna, ali nije S-atributivna.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za sve sekvence oblika a&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;(bc)&amp;lt;sup&amp;gt;p&amp;lt;/sup&amp;gt;a&amp;lt;sup&amp;gt;2p&amp;lt;/sup&amp;gt;, k ≥ 0, p &amp;gt; 0&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Napisati gramatiku koja opisuje date sekvence.&lt;br /&gt;
# Prikazati potisni automat kojim se prepoznaje isključivo dati skup sekvenci.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Gramatika koja opisuje date sekvence bi bila:&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;A&amp;gt; &amp;amp;lt;B&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → &amp;amp;lt;A&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → bc &amp;amp;lt;B&amp;gt; aa&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → bcaa&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje S1 potisnog automata za opisivanje sekvenci iz drugog zadatka.&lt;br /&gt;
! Stanje&lt;br /&gt;
! a&lt;br /&gt;
! b&lt;br /&gt;
! c&lt;br /&gt;
! ─┤&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| ADVANCE&lt;br /&gt;
|&lt;br /&gt;
* PUSH(A)&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|&lt;br /&gt;
* PUSH(B)&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
| STATE(S2)&lt;br /&gt;
| PUSH(A)&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje S2 potisnog automata za opisivanje sekvenci iz drugog zadatka.&lt;br /&gt;
! Stanje&lt;br /&gt;
! a&lt;br /&gt;
! b&lt;br /&gt;
! c&lt;br /&gt;
! ─┤&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| ACCEPT&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
|&lt;br /&gt;
* POP&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
|&lt;br /&gt;
* POP&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Formirati parser na principu rekurzivnog spusta koji prepoznaje skup sekvenci predstavljenih sledećim produkcijama.&lt;br /&gt;
# &amp;amp;lt;S’&amp;gt; → &amp;amp;lt;S&amp;gt; ─┤&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;A&amp;gt; a &amp;amp;lt;B&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → a b &amp;amp;lt;B&amp;gt; b&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → &amp;amp;lt;C&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → &amp;amp;lt;D&amp;gt; &amp;amp;lt;C&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;C&amp;gt; → c &amp;amp;lt;C&amp;gt;&lt;br /&gt;
# &amp;amp;lt;C&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;D&amp;gt; → d&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;
char input;&lt;br /&gt;
&lt;br /&gt;
void terminal(char t) {&lt;br /&gt;
    if (input == t) {&lt;br /&gt;
        input = advance();&lt;br /&gt;
    } else {&lt;br /&gt;
        reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void A() {&lt;br /&gt;
    terminal(&#039;a&#039;);&lt;br /&gt;
    terminal(&#039;b&#039;);&lt;br /&gt;
    B();&lt;br /&gt;
    terminal(&#039;b&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void C() {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;c&#039;:&lt;br /&gt;
            terminal(&#039;c&#039;);&lt;br /&gt;
            C();&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void D() {&lt;br /&gt;
    terminal(&#039;d&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void B() {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
        case &#039;c&#039;:&lt;br /&gt;
            C();&lt;br /&gt;
            terminal(&#039;a&#039;);&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;d&#039;:&lt;br /&gt;
            D();&lt;br /&gt;
            C();&lt;br /&gt;
            terminal(&#039;a&#039;);&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;b&#039;:&lt;br /&gt;
        case EOF:&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void S() {&lt;br /&gt;
    A();&lt;br /&gt;
    terminal(&#039;a&#039;);&lt;br /&gt;
    B();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main() {&lt;br /&gt;
    input = advance();&lt;br /&gt;
    S();&lt;br /&gt;
    terminal(EOF);&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;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Dat je listing programa napisanog na programskom jeziku Mikrojava. Sve metode unutrašnjih klasa su virtuelne. Globalne metode se pozivaju statički. Napisati kompletan Mikrojava bajtkod prevoda datog programa. Za svaku liniju koda jasno naznačiti koji deo bajtkoda se odnosi na nju.&lt;br /&gt;
# Odrediti deo koda koji se nalazi na mestu komentara u datom programu, a kome odgovara dati Mikrojava bajtkod.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
program Januar2021&lt;br /&gt;
const int K = 3;&lt;br /&gt;
class CL { int p; }&lt;br /&gt;
CL global;&lt;br /&gt;
{&lt;br /&gt;
 void m(CL arg)&lt;br /&gt;
     int y;&lt;br /&gt;
 {&lt;br /&gt;
     if(y &amp;gt;= K || y == 0)&lt;br /&gt;
         global.p++;&lt;br /&gt;
     else arg.p = K;&lt;br /&gt;
 }&lt;br /&gt;
 void main()&lt;br /&gt;
     int x; int arr[];&lt;br /&gt;
 {&lt;br /&gt;
     global = new CL;&lt;br /&gt;
     arr = new int[3];&lt;br /&gt;
     arr[K-2] = -arr[x];&lt;br /&gt;
     m(global);&lt;br /&gt;
     /* ??? */&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
getstatic 0&lt;br /&gt;
const_2&lt;br /&gt;
load_0&lt;br /&gt;
load_1&lt;br /&gt;
const_0&lt;br /&gt;
aload&lt;br /&gt;
mul&lt;br /&gt;
add&lt;br /&gt;
putfield 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prevedeni bajtkod može da izgleda ovako:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
enter 1 2       # void m(CL arg) int y; {&lt;br /&gt;
load_1          # if (&lt;br /&gt;
const_3&lt;br /&gt;
jge 8           # y &amp;gt;= K&lt;br /&gt;
load_1&lt;br /&gt;
const_0&lt;br /&gt;
jne 20          # y == 0)&lt;br /&gt;
getstatic 0     # global.p++;&lt;br /&gt;
getfield 1&lt;br /&gt;
const_1&lt;br /&gt;
add&lt;br /&gt;
getstatic 0&lt;br /&gt;
putfield 1&lt;br /&gt;
jmp 8           # else&lt;br /&gt;
load_0          # arg.p = K;&lt;br /&gt;
const_3&lt;br /&gt;
putfield 1&lt;br /&gt;
exit            # }&lt;br /&gt;
return&lt;br /&gt;
enter 0 2       # void main() int x; int arr[]; {&lt;br /&gt;
new 8           # global = new CL;&lt;br /&gt;
putstatic 0&lt;br /&gt;
const_3         # arr = new int[3];&lt;br /&gt;
newarray 1&lt;br /&gt;
store_1&lt;br /&gt;
load_1          # arr[K-2] = -arr[x];&lt;br /&gt;
const_3&lt;br /&gt;
const_2&lt;br /&gt;
sub&lt;br /&gt;
load_1&lt;br /&gt;
load_0&lt;br /&gt;
aload&lt;br /&gt;
neg&lt;br /&gt;
astore&lt;br /&gt;
getstatic 0     # m(global);&lt;br /&gt;
call ??? (=m)   # Verovatno nisu tražili tačan pomeraj?&lt;br /&gt;
exit            # }&lt;br /&gt;
return&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Linija koda koja fali u programu je:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
global.p = 2 + x * arr[0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je sledeći fragment (bazični blok) međukoda:&lt;br /&gt;
# x = 2&lt;br /&gt;
# z = x + 3&lt;br /&gt;
# y = z – x&lt;br /&gt;
# x = y&lt;br /&gt;
# z = x + y&lt;br /&gt;
# x = z – y&lt;br /&gt;
# z = y – x&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Za svaku instrukciju u kodu odrediti koje su promenljive žive.&lt;br /&gt;
# Korišćenjem algoritma getreg generisati mašinski kod za 80x86 arhitekturu na osnovu datog međukoda i informacija iz tačke a). Pretpostaviti da se koriste dvoadresne mašinske instrukcije gde je prvi operand odredište operacije (oblika ADD dst, src) i da se koriste samo dva registra AX i BX. Rešenje ČITKO upisati u datu tabelu.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela sa traženim informacijama iz zadatka.&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Redni broj&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Ulaz&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Život i sledeća upotreba&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Deskriptori&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | &#039;&#039;getreg&#039;&#039;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Generisani kod&lt;br /&gt;
|-&lt;br /&gt;
! x&lt;br /&gt;
! y&lt;br /&gt;
! z&lt;br /&gt;
! AX&lt;br /&gt;
! BX&lt;br /&gt;
|-&lt;br /&gt;
| 1. || x = 2     || ž2 || m- || m- || x || - || AX || MOV AX, 2&lt;br /&gt;
|-&lt;br /&gt;
| 2. || z = x + 3 || ž3 || m- || ž3 || x || z || BX || MOV BX, AX; ADD BX, 3&lt;br /&gt;
|-&lt;br /&gt;
| 3. || y = z - x || m- || ž4 || m- || x || y || BX || SUB BX, AX&lt;br /&gt;
|-&lt;br /&gt;
| 4. || x = y     || ž5 || ž5 || m- || x || y || AX || MOV AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 5. || z = x + y || m- || ž6 || ž6 || z || y || AX || ADD AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 6. || x = z - y || ž7 || ž7 || m- || x || y || AX || SUB AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 7. || z = y - x || ž- || ž- || ž- || x || z || BX || MOV y, BX; SUB BX, AX&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
| MOV x, AX; MOV z, BX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6365</id>
		<title>Програмски преводиоци 1/Јануар 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6365"/>
		<updated>2023-06-28T00:16:15Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* 4. zadatak - fali deo postavke*/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Januarski rok 2021. godine&#039;&#039;&#039; održan je 22. januara. Postavka roka je dostupna [http://ir4pp1.etf.rs/Rokovi/2020-2021/pp1_jan2021_ispit.pdf sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je fragmet&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; gramatike jednog programskog jezika.&lt;br /&gt;
# &amp;amp;lt;var_decl&amp;gt; ::= &amp;amp;lt;type&amp;gt; : &amp;amp;lt;id_list&amp;gt;&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt; ::= &amp;amp;lt;id_list&amp;gt; , Ident | Ident&lt;br /&gt;
# &amp;amp;lt;type&amp;gt; ::= int | char&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Napisati atributivnu gramatiku kojom se određuje tip za svaki identifikator u listi (Ident). Jasno naznačiti koji atributi su sintetizovani, a koji nasleđeni.&lt;br /&gt;
# Da li je dobijena gramatika S-atributivna ili L-atributivna?&lt;br /&gt;
# Dobijenoj atributivnoj gramatici (pod a) dodati neophodne akcije koje obezbeđuju dodavanje simbola u tabelu simbola i postavljanje njihovih tipova. Za pisanje akcija koristiti programski jezik Java i sledeći interfejs tabele simbola.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Struct {&lt;br /&gt;
    static final int None = 0, Int = 1, Char = 2, Arr = 3, Class = 4;&lt;br /&gt;
    int kind; // None, Int, Char, Arr, Class&lt;br /&gt;
    boolean equals (Struct other);&lt;br /&gt;
}&lt;br /&gt;
class Tab {&lt;br /&gt;
    Obj insert (String name, Struct type) throws AlreadyDeclaredException;&lt;br /&gt;
    Obj findSymbol (String name) throws SymbolNotFoundException;&lt;br /&gt;
}&lt;br /&gt;
public class Obj {&lt;br /&gt;
    public static final int Con = 0, Var = 1, Type = 2, Prog = 5;&lt;br /&gt;
    public int kind; // Con, Var, Type, Meth, Fld, Prog&lt;br /&gt;
    public String name;&lt;br /&gt;
    public Struct type;&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Atribut &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; je u sledećoj gramatici sintetizovan, dok su atributi &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;idtype&amp;lt;/code&amp;gt; nasleđeni. Ispod je prikazana gramatika sa označenim atributima i dodatim akcijama.&lt;br /&gt;
# &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; → int&lt;br /&gt;
#: t ← Struct.Int&lt;br /&gt;
# &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; → char&lt;br /&gt;
#: t ← Struct.Char&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt; → &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;, Ident&amp;lt;sub&amp;gt;idtype&amp;lt;/sub&amp;gt; {: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;Tab.insert(new Obj(Obj.Var, ident, new Struct(type)));&amp;lt;/syntaxhighlight&amp;gt; :}&lt;br /&gt;
#: idtype ← type&lt;br /&gt;
#: type&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ← type&lt;br /&gt;
# &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt; → Ident&amp;lt;sub&amp;gt;idtype&amp;lt;/sub&amp;gt; {: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;Tab.insert(new Obj(Obj.Var, ident, new Struct(type)));&amp;lt;/syntaxhighlight&amp;gt; :}&lt;br /&gt;
#: idtype ← type&lt;br /&gt;
# &amp;amp;lt;var_decl&amp;gt; → &amp;amp;lt;type&amp;gt;&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; : &amp;amp;lt;id_list&amp;gt;&amp;lt;sub&amp;gt;type&amp;lt;/sub&amp;gt;&lt;br /&gt;
#: type ← t&lt;br /&gt;
Dobijena gramatika je L-atributivna, ali nije S-atributivna.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za sve sekvence oblika a&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;(bc)&amp;lt;sup&amp;gt;p&amp;lt;/sup&amp;gt;a&amp;lt;sup&amp;gt;2p&amp;lt;/sup&amp;gt;, k ≥ 0, p &amp;gt; 0&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Napisati gramatiku koja opisuje date sekvence.&lt;br /&gt;
# Prikazati potisni automat kojim se prepoznaje isključivo dati skup sekvenci.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Gramatika koja opisuje date sekvence bi bila:&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;A&amp;gt; &amp;amp;lt;B&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → &amp;amp;lt;A&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → bc &amp;amp;lt;B&amp;gt; aa&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → bcaa&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje S1 potisnog automata za opisivanje sekvenci iz drugog zadatka.&lt;br /&gt;
! Stanje&lt;br /&gt;
! a&lt;br /&gt;
! b&lt;br /&gt;
! c&lt;br /&gt;
! ─┤&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| ADVANCE&lt;br /&gt;
|&lt;br /&gt;
* PUSH(A)&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|&lt;br /&gt;
* PUSH(B)&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
| STATE(S2)&lt;br /&gt;
| PUSH(A)&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje S2 potisnog automata za opisivanje sekvenci iz drugog zadatka.&lt;br /&gt;
! Stanje&lt;br /&gt;
! a&lt;br /&gt;
! b&lt;br /&gt;
! c&lt;br /&gt;
! ─┤&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| ACCEPT&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
|&lt;br /&gt;
* POP&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
|&lt;br /&gt;
* POP&lt;br /&gt;
* ADVANCE&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
| REJECT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Formirati parser na principu rekurzivnog spusta koji prepoznaje skup sekvenci predstavljenih sledećim produkcijama.&lt;br /&gt;
# &amp;amp;lt;S’&amp;gt; → &amp;amp;lt;S&amp;gt; ─┤&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;A&amp;gt; a &amp;amp;lt;B&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → a b &amp;amp;lt;B&amp;gt; b&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → &amp;amp;lt;C&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → &amp;amp;lt;D&amp;gt; &amp;amp;lt;C&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;C&amp;gt; → c &amp;amp;lt;C&amp;gt;&lt;br /&gt;
# &amp;amp;lt;C&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;D&amp;gt; → d&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;
char input;&lt;br /&gt;
&lt;br /&gt;
void terminal(char t) {&lt;br /&gt;
    if (input == t) {&lt;br /&gt;
        input = advance();&lt;br /&gt;
    } else {&lt;br /&gt;
        reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void A() {&lt;br /&gt;
    terminal(&#039;a&#039;);&lt;br /&gt;
    terminal(&#039;b&#039;);&lt;br /&gt;
    B();&lt;br /&gt;
    terminal(&#039;b&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void C() {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;c&#039;:&lt;br /&gt;
            terminal(&#039;c&#039;);&lt;br /&gt;
            C();&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void D() {&lt;br /&gt;
    terminal(&#039;d&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void B() {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
        case &#039;c&#039;:&lt;br /&gt;
            C();&lt;br /&gt;
            terminal(&#039;a&#039;);&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;d&#039;:&lt;br /&gt;
            D();&lt;br /&gt;
            C();&lt;br /&gt;
            terminal(&#039;a&#039;);&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;b&#039;:&lt;br /&gt;
        case EOF:&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            reject();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void S() {&lt;br /&gt;
    A();&lt;br /&gt;
    terminal(&#039;a&#039;);&lt;br /&gt;
    B();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main() {&lt;br /&gt;
    input = advance();&lt;br /&gt;
    S();&lt;br /&gt;
    terminal(EOF);&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;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Dat je listing programa napisanog na programskom jeziku Mikrojava. Sve metode unutrašnjih klasa su virtuelne. Globalne metode se pozivaju statički. Napisati kompletan Mikrojava bajtkod prevoda datog programa. Za svaku liniju koda jasno naznačiti koji deo bajtkoda se odnosi na nju.&lt;br /&gt;
# Odrediti deo koda koji se nalazi na mestu komentara u datom programu, a kome odgovara dati Mikrojava bajtkod.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
program Januar2021&lt;br /&gt;
const int K = 3;&lt;br /&gt;
class CL { int p; }&lt;br /&gt;
CL global;&lt;br /&gt;
{&lt;br /&gt;
 void m(CL arg)&lt;br /&gt;
     int y;&lt;br /&gt;
 {&lt;br /&gt;
     if(y &amp;gt;= K || y == 0)&lt;br /&gt;
         global.p++;&lt;br /&gt;
     else arg.p = K;&lt;br /&gt;
 }&lt;br /&gt;
 void main()&lt;br /&gt;
     int x; int arr[];&lt;br /&gt;
 {&lt;br /&gt;
     global = new CL;&lt;br /&gt;
     arr = new int[3];&lt;br /&gt;
     arr[K-2] = -arr[x];&lt;br /&gt;
     m(global);&lt;br /&gt;
     /* ??? */&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
getstatic 0&lt;br /&gt;
const_2&lt;br /&gt;
load_0&lt;br /&gt;
load_1&lt;br /&gt;
const_0&lt;br /&gt;
aload&lt;br /&gt;
mul&lt;br /&gt;
add&lt;br /&gt;
putfield 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prevedeni bajtkod može da izgleda ovako:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
enter 1 2       # void m(CL arg) int y; {&lt;br /&gt;
load_1          # if (&lt;br /&gt;
const_3&lt;br /&gt;
jge 8           # y &amp;gt;= K&lt;br /&gt;
load_1&lt;br /&gt;
const_0&lt;br /&gt;
jne 20          # y == 0)&lt;br /&gt;
getstatic 0     # global.p++;&lt;br /&gt;
getfield 1&lt;br /&gt;
const_1&lt;br /&gt;
add&lt;br /&gt;
getstatic 0&lt;br /&gt;
putfield 1&lt;br /&gt;
jmp 8           # else&lt;br /&gt;
load_0          # arg.p = K;&lt;br /&gt;
const_3&lt;br /&gt;
putfield 1&lt;br /&gt;
exit            # }&lt;br /&gt;
return&lt;br /&gt;
enter 0 2       # void main() int x; int arr[]; {&lt;br /&gt;
new 8           # global = new CL;&lt;br /&gt;
putstatic 0&lt;br /&gt;
const_3         # arr = new int[3];&lt;br /&gt;
newarray 1&lt;br /&gt;
store_1&lt;br /&gt;
load_1          # arr[K-2] = -arr[x];&lt;br /&gt;
const_3&lt;br /&gt;
const_2&lt;br /&gt;
sub&lt;br /&gt;
load_1&lt;br /&gt;
load_0&lt;br /&gt;
aload&lt;br /&gt;
neg&lt;br /&gt;
astore&lt;br /&gt;
getstatic 0     # m(global);&lt;br /&gt;
call ??? (=m)   # Verovatno nisu tražili tačan pomeraj?&lt;br /&gt;
exit            # }&lt;br /&gt;
return&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Linija koda koja fali u programu je:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
global.p = 2 + x * arr[0];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je sledeći fragment (bazični blok) međukoda:&lt;br /&gt;
# x = 2&lt;br /&gt;
# z = x + 3&lt;br /&gt;
# y = z – x&lt;br /&gt;
# x = y&lt;br /&gt;
# z = x + y&lt;br /&gt;
# x = z – y&lt;br /&gt;
# z = y – x&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Za svaku instrukciju u kodu odrediti koje su promenljive žive.&lt;br /&gt;
# Korišćenjem algoritma getreg generisati mašinski kod za 80x86 arhitekturu na osnovu datog međukoda i informacija iz tačke a). Pretpostaviti da se koriste dvoadresne mašinske instrukcije gde je prvi operand odredište operacije (oblika ADD dst, src) i da se koriste samo dva registra AX i BX. Rešenje ČITKO upisati u datu tabelu.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela sa traženim informacijama iz zadatka.&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Redni broj&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Ulaz&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Život i sledeća upotreba&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Deskriptori&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | &#039;&#039;getreg&#039;&#039;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Generisani kod&lt;br /&gt;
|-&lt;br /&gt;
! x&lt;br /&gt;
! y&lt;br /&gt;
! z&lt;br /&gt;
! AX&lt;br /&gt;
! BX&lt;br /&gt;
|-&lt;br /&gt;
| 1. || x = 2     || ž2 || m- || m- || x || - || AX || MOV AX, 2&lt;br /&gt;
|-&lt;br /&gt;
| 2. || z = x + 3 || ž3 || m- || ž3 || x || z || BX || MOV BX, AX; ADD BX, 2&lt;br /&gt;
|-&lt;br /&gt;
| 3. || y = z - x || m- || ž4 || m- || x || y || BX || SUB BX, AX&lt;br /&gt;
|-&lt;br /&gt;
| 4. || x = y     || ž5 || ž5 || m- || x || y || AX || MOV AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 5. || z = x + y || m- || ž6 || ž6 || z || y || AX || ADD AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 6. || x = z - y || ž7 || ž7 || m- || x || y || AX || SUB AX, BX&lt;br /&gt;
|-&lt;br /&gt;
| 7. || z = y - x || ž- || ž- || ž- || x || z || BX || MOV y, BX; SUB BX, AX&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
| MOV x, AX; MOV z, BX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%88%D1%83%D0%BB_2021&amp;diff=6099</id>
		<title>Заштита података/Јул 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%88%D1%83%D0%BB_2021&amp;diff=6099"/>
		<updated>2023-04-20T00:28:48Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* 1. zadatak */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{nerešeno}}&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
Ana i Branko razmenjuju ključ Diffie-Hellman algoritmom. Za tu svrhu koriste prost broj 10007 i njegov primitivni koren 3073. Ana je za svoj privatni broj odredila 3072, a Branko 520. Odrediti:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Javni broj koji je izračunala Ana &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;3374&amp;lt;/span&amp;gt;&lt;br /&gt;
# Javni broj koji je izračunao Branko &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;5388&amp;lt;/span&amp;gt;&lt;br /&gt;
# Ključ koji je razmenjen &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;1876&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
Marko treba da plati uslugu n bitkoina u blokčejnu koji koristi SHA-256 heš funkciju i stoga formira transakciju t&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; sa iznosom n kojim se plaća usluga. Kako bi smanjio svoju obavezu i prevario prodavca usluge Marko želi da napravi drugu transakciju t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; čija je vrednost manja od n i da je podmetne umesto t&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;. Koliko če različitih transakcija Marko morati da napravi da bi sa verovatnoćom 0.5 uspeo da napravi zadovoljavajuću transakciju t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
Podrazumeva se da zamena transakcije treba da bude takva da nema novog rudarenja. Odgovor upisati u polje, operacija stepenovanja treba da se&lt;br /&gt;
označi simbolom ^.&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;nerešeno&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ako se zna da blokčejn ima u svakom bloku 2048 transakcija, koliko je heš operacija potrebno da se izvrši da bi se izračunao &amp;quot;Transaction hash&amp;quot; ?&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;nerešeno&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
Na slici je dat prvi deo Kerberos v4 autentikacije:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; (1) \quad \mathbf{C \rightarrow AS} \quad ID_c \parallel ID_{tgs} \parallel TS_1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; (2) \quad \mathbf{AS \rightarrow C} \quad E\left( K_c, \left[ \qquad \parallel TS_2 \parallel Lifetime_2 \parallel Ticket_{tgs} \right] \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \qquad Ticket_{tgs} = E\left( K_{tgs}, \left[ \qquad \parallel TS_2 \parallel Lifetime_2 \right]  \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Elementi koji nedostaju u poruci (2) (ne i u Ticket&amp;lt;sub&amp;gt;tgs&amp;lt;/sub&amp;gt;) su:&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;
# identifikator servera AS&lt;br /&gt;
# identifikator TGS&lt;br /&gt;
# identifikator klijenta C&lt;br /&gt;
# IP adresa servera V&lt;br /&gt;
# IP adresa klijenta C&lt;br /&gt;
# IP adresa servera AS&lt;br /&gt;
# ključ kojim komuniciraju klijent i autentikacioni server AS&lt;br /&gt;
# ključ kojim komuniciraju klijent i server V&lt;br /&gt;
# identifikator servera V&lt;br /&gt;
# ključ kojim komuniciraju klijent i TGS&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
: &#039;&#039;Isti zadatak kao sa [[Заштита података/К 2022#5. zadatak|kolokvijuma za RTI 2022. godine]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
MAC algoritam koji daje MAC kod veličine 32 bita ima ključ veličine 100 bita. Ako je raspodela MAC kodova koji daje algoritam uniformna i sve vrednosti su jednako verovatne, da bi otkrio ključ koji se koristi za generisanje MAC kodova napadaču će trebati:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt; različita para/različitih parova (poruka,MAC(poruka)).&lt;br /&gt;
&lt;br /&gt;
Da izvrši &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt; MAC operacija (za prikaz operacije stepenovanja koristiti simbol ^).&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
Firma F ima centralu koja se nalazi u Helsinkiju. Na centralnoj lokaciji se nalazi 5 web aplikacija kojima se pružaju interne poslovne usluge. Sve aplikacije koriste HTTPS. F ima 10 zaposlenih u svojoj ispostavi u Pragu. Ako se zna da svi zaposleni u ispostavi svakog radnog dana koriste svih 5 aplikacija na centralnoj lokaciji i da se povezuju na svaku od aplikacija dva puta: jednom na početku radnog dana i jednom nakon pauze, tokom svakog&lt;br /&gt;
radnog dana će se:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# generisati ukupno &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt; različitih kriptografskih ključeva potrebnih za zaštitu web saobraćaja TLS-om svih web sesija (uneti broj)&lt;br /&gt;
# izvršiti &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt; razmena ključeva (uneti broj)&lt;br /&gt;
# Ako se između lokacija firme u Helsinkiju i Pragu za zaštitu podataka između radnika i web aplikacija koristi site-to-site IPsec sa main modom razmene koji se vrši svake prve nedelje u mesecu u 23:00 i quick modom koji se vrši svaki dan u ponoć i ne koristi se TLS na web aplikacijama, onda če se svaki dan izvršiti &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt; razmena ključeva. (uneti broj)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
Kod kojih od navedenih kriptografskih algoritama učestanost pojavljivanja simbola/slova u šifrovanom tekstu ima istu raspodelu kao učestanost&lt;br /&gt;
pojavljivanja slova u originalnom tekstu?&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;
# RSA algoritam &lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;Row transposition&#039;&#039; algoritam&amp;lt;/span&amp;gt;&lt;br /&gt;
# &#039;&#039;Vigenere&#039;&#039; algoritam sa autokey poboljšanjem&lt;br /&gt;
# Rotor mašina/Enigma&lt;br /&gt;
# Monoalfabetska šifra sa Gausovim poboljšanjem&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Monoalfabetska šifra&amp;lt;/span&amp;gt;&lt;br /&gt;
# &#039;&#039;Playfair&#039;&#039; algoritam&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;Rail-fence&#039;&#039; algoritam&amp;lt;/span&amp;gt;&lt;br /&gt;
# &#039;&#039;Vigenere&#039;&#039; algoritam&lt;br /&gt;
# &#039;&#039;One-time pad&#039;&#039;&lt;br /&gt;
# &#039;&#039;Hill&#039;&#039;-ov algoritam&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Cezarov algoritam&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
Data je šema El Gamalovog algoritma za digitalno potpisivanje (m je hash poruke M):&lt;br /&gt;
Za ovako formiran digitalni potpis važi sledeće:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S_1 = \alpha^K mod q  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S_2 = K^{-1}\left( m - X_AS_1 \right) mod (q-1) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Izaberite jedan ili više odgovora:&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;
# Vrednosti koje su potrebne prijemnoj strani za proveru digitalnog potpisa su: k, α i q&lt;br /&gt;
# Za jednu poruku M može da postoji više različitih ispravnih vrednosti digitalnog potpisa (S1 ,S2)&lt;br /&gt;
# Vrednosti koje su potrebne prijemnoj strani za proveru digitalnog potpisa su: α, q,i Y&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
# Ukoliko se promeni poruka M, promeniće se vrednost celog digitalnog potpisa i S1 i S2&lt;br /&gt;
# Potpis je ispravan ukoliko je S1=S2&lt;br /&gt;
# Ukoliko se promeni poruka M, promeniće se vrednost S2&lt;br /&gt;
# Za jednu poruku M postoji tačno jedna ispravna vrednost digitalnog potpisa (S1 ,S2)&lt;br /&gt;
# Vrednosti koje su potrebne prijemnoj strani za proveru digitalnog potpisa su: k, α, q i Y&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
# Ukoliko se promeni poruka M, promeniće se vrednost S1&lt;br /&gt;
# Vrednosti koje su potrebne prijemnoj strani za proveru digitalnog potpisa su: α i q&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
Originalnu poruku 00111100b propustiti kroz SDES algoritam korišćenjem ključa 0011001100b. Detalji algoritma dati su u nastavku.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ PC1:&lt;br /&gt;
| 3 || 5 || 2 || 7 || 4 || 10 || 1 || 9 || 8 || 6&lt;br /&gt;
|}&lt;br /&gt;
Rotacija: 1. iteracija za 1, 2. iteracija za 2&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ PC2:&lt;br /&gt;
| 6 || 3 || 7 || 4 || 8 || 5 || 10 || 9&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ IP:&lt;br /&gt;
| 2 || 6 || 3 || 1 || 4 || 8 || 5 || 7&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ IP&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;:&lt;br /&gt;
| 4 || 1 || 3 || 5 || 7 || 2 || 8 || 6&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ E:&lt;br /&gt;
| 4 || 1 || 2 || 3 || 2 || 3 || 4 || 1&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ S1:&lt;br /&gt;
| 1 || 0 || 3 || 2&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 2 || 1 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 2 || 1 || 3&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 1 || 0 || 2&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ S2:&lt;br /&gt;
| 0 || 1 || 2 || 3&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 0 || 1 || 3&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 0 || 1 || 2&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 1 || 0 || 3&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ P:&lt;br /&gt;
| 2 || 4 || 3 || 1&lt;br /&gt;
|}&lt;br /&gt;
Napomena: Sve vrednosti pisati u binarnom obliku bez sufiksa &amp;quot;b&amp;quot;.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Koja je vrednost ključa prve iteracije &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;01011100&amp;lt;/span&amp;gt;&lt;br /&gt;
# Koja je vrednost ključa druge iteracije &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;11000000&amp;lt;/span&amp;gt;&lt;br /&gt;
# Koja je vrednost poruke nakon inicijalne permutacije &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;01101010&amp;lt;/span&amp;gt;&lt;br /&gt;
# Koja je vrednost poruke nakon prolaska kroz funkciju iteracije za prvu iteraciju &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;11001010&amp;lt;/span&amp;gt;&lt;br /&gt;
# Koja je vrednost poruke nakon prve iteracije &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;10101100&amp;lt;/span&amp;gt;&lt;br /&gt;
# Koja je vrednost šifrovane poruke &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;11010001&amp;lt;/span&amp;gt;&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;Pretpostavlja se da se u stavci pod d mislilo na izlaz &amp;lt;math&amp;gt;f_K&amp;lt;/math&amp;gt; bloka, a u stavci pod e na izlaz &amp;lt;math&amp;gt;SW&amp;lt;/math&amp;gt; bloka.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
Na slici je dat deo PGP šeme na strani slanja za obezbeđivanje &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt; poruke.&lt;br /&gt;
&lt;br /&gt;
Z predstavlja operaciju kompresije, a operacije EC i EP su operacije šifrovanja.&lt;br /&gt;
[[Датотека:ZP jul 2021 zadatak 10.svg|center|frame|PGP šema u desetom zadatku.]]&lt;br /&gt;
Ako stranu slanja označimo sa X, a stranu prijema sa Y onda:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;Ks,PUx,PUy,PRx,PRy&amp;quot;&amp;gt;&lt;br /&gt;
# na mestu označenom brojem 1 se koristi ključ &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt;&lt;br /&gt;
# na mestu označenom brojem 2 se koristi ključ &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Ukoliko se šemom obezbeđuje i kompresija tada se poruka propušta kroz ZIP algoritam na poziciji &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 11. zadatak ==&lt;br /&gt;
&lt;br /&gt;
== 12. zadatak ==&lt;br /&gt;
Za svaki od sledećih scenarija, odrediti o kom malicioznom softveru je reč.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;logička bomba,zadnja vrata,zombi,keylogger,flooder,downloader,adware,ransomware&amp;quot;&amp;gt;&lt;br /&gt;
# Dati maliciozni kod se propagira na druge mašine korišćenjem crva. Nakon propagacije, cilj datog softvera je da koristi zaraženu mašinu za napade na druge mašine. Maliciozni softver koji je opisan je &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt;.&lt;br /&gt;
# Nikoli, studentu Elektrotehničkog fakulteta, poslat je mejl sa linkom ka sajtu preko kojeg može da preuzme desktop verziju eStudent aplikacije. Kada je Nikola preuzeo i pokrenuo aplikaciju, svi podaci sa Nikolinog računara su postali ograničeni samo na napadače, koji poseduju odgovarajući ključ. Maliciozni softver koji je Nikola iskoristio je &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;ransomware&amp;lt;/span&amp;gt;.&lt;br /&gt;
# Marina je preko USBa postavila maliciozni softver na nastavnički računar u sale 309 u toku pauze između časova. Dok je trajao čas, nastavnik se prijavio na Moodle sistem kako bi studentima pokazao rešenja zadataka sa kolokvijuma. Maliciozni softver je zapamtio podatke koje je uneo nastavnik i omogućio Marini da vidi pitanja za popravni kolokvijum. Maliciozni softver koji je Marina iskoristila je &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;keylogger&amp;lt;/span&amp;gt;. Koji tip napadača je Marina? &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 13. zadatak ==&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Заштита података]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D0%B1_%D0%B4%D0%B8%D0%B7%D0%B0%D1%98%D0%BD&amp;diff=4524</id>
		<title>Веб дизајн</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D0%B1_%D0%B4%D0%B8%D0%B7%D0%B0%D1%98%D0%BD&amp;diff=4524"/>
		<updated>2022-07-14T13:39:23Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: Веб дизајн&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С112ВД, 13С113ВД&lt;br /&gt;
| семестар  = 4, 6, 8&lt;br /&gt;
| статус    = изборни&lt;br /&gt;
| страница  = [https://rti.etf.bg.ac.rs/rti/si2vd/ rti.etf.rs/rti/si2vd]&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Веб дизајн&#039;&#039;&#039; је изборни предмет у четвртом, шестом и осмом семестру на СИ.&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;
* &#039;&#039;&#039;Први блок:&#039;&#039;&#039; &#039;&#039;HTML&#039;&#039;, &#039;&#039;CSS&#039;&#039; и &#039;&#039;Bootstrap 5&#039;&#039; (предавања и вежбе обрађују исто градиво, али су вежбе довољне)&lt;br /&gt;
На колоквијуму долази један задатак тежине сличне као што је рађено на последњим вежбама, време израде је 90 минута, вреди 25 поена. Доступна online документација, као и презентације са предавања и вежби. Презентације са вежби су јако корисне. Често може доћи нешто одатле. &lt;br /&gt;
* &#039;&#039;&#039;Други блок:&#039;&#039;&#039; &#039;&#039;JavaScript&#039;&#039; и &#039;&#039;JQuery&#039;&#039; (предавања и вежбе обрађују исто градиво, али су вежбе довољне)&lt;br /&gt;
На колоквијуму долази један задатак, на пример у виду игрице, време израде је 90 минута, вреди 25 поена. HTML је веома једноставан и дизајн се уопште не тражи, док је акценат на &#039;&#039;JavaScript&#039;&#039;. Одређен део задатка је обавезно урадити коришћењем &#039;&#039;JQuery&#039;&#039; библиотеке. За овај део градива не постоје тако корисне презентације са вежби као за први блок, али су на колоквијуму доступне све презентације са предавања и вежби и online документација.&lt;br /&gt;
* &#039;&#039;&#039;Трећи блок:&#039;&#039;&#039; &#039;&#039;Vue.js framework&#039;&#039; (само на вежбама) и основе графичког дизајна (само на предавањима). &lt;br /&gt;
На колоквијуму долази један задатак из &#039;&#039;Vue&#039;&#039;, тежине јако сличне као што је рађено на последњим вежбама, вреди 15 поена и један задатак који покрива градиво са предавања из овог блока градива, вреди 10 поена. Укупно време израде је 90 минута. Од материјала на самом колоквијуму, доступно је оно што је доступно за први и други колоквијум. Никакви материјали ни документација нису били доступни за &#039;&#039;Vue&#039;&#039;, као ни презентације са предавања за трећи блок.&lt;br /&gt;
&lt;br /&gt;
Презентације са предавања и вежби могу се наћи на страници предмета, у одељку Материјали.&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Пројекат вреди 15 поена. Потребно је направити веб сајт на задату тему. Ради се у пару или самостално. Излази у мају и могуће је бранити га у јуну и јулу. Одбрана представља кратко презентовање пројекта. &lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
Лабораторијска вежба вреди 10 поена и се састоји од једног домаћег задатка који је потребно одрадити коришћењем &#039;&#039;JavaScript&#039;&#039;-а. Оцењује се и дизајн и захтеване функционалности. Постоји само један рок за предају, у мају. Не постоји одбрана, већ асистетни оцењују предат домаћи.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
На страници предмета су доступне [https://rti.etf.bg.ac.rs/rti/si2vd/rokovi/ поставке рокова,] али решења нису доступна за сваки рок. Следећи рокови су доступни са викија:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| namespace   =&lt;br /&gt;
| category    = Веб дизајн&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| format      = ,\n* [[%PAGE%|²{#invoke:String|sub|%PAGE%|12|-1}²]],,&lt;br /&gt;
| ordermethod = title&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; — бодови са првог и другог колоквијума (сваки по 25 бодова)&lt;br /&gt;
* &amp;lt;math&amp;gt;L_2&amp;lt;/math&amp;gt; — бодови са друге лабораторијске вежбе (10 бодова)&lt;br /&gt;
* &amp;lt;math&amp;gt;Pr&amp;lt;/math&amp;gt; — бодови са пројекта (15 бодова)&lt;br /&gt;
* &amp;lt;math&amp;gt;K_3&amp;lt;/math&amp;gt; — бодови са испита (25 бодова)&lt;br /&gt;
* Коначни бодови: &amp;lt;math&amp;gt;P = K_1 + K_2 + L_2 + Pr + K_3&amp;lt;/math&amp;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;, док је од јулског рока могуће радити само &amp;lt;math&amp;gt;K_3&amp;lt;/math&amp;gt; или интегрални испит.&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|postavke}}&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2018&amp;diff=2969</id>
		<title>ОС1/Јун 2018</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_2018&amp;diff=2969"/>
		<updated>2021-09-22T22:28:18Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* i ovde ide prev */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2018/jun/Jun%202018.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti razliku između pojmova &#039;&#039;proces&#039;&#039; i &#039;&#039;nit&#039;&#039; (engl. &#039;&#039;thread&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Proces je jedno izvršavanje programa sa jednim adresnim prostorom. Nit (&#039;&#039;thread&#039;&#039;) ili laki proces je tok kontrole koji teče uporedo sa drugim tokovima kontrole, ali koji deli virtuelni adresni prostor sa nekim drugim tokom ili tokovima kontrole.&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 &#039;&#039;wait&#039;&#039; 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;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void Event::wait() {&lt;br /&gt;
    if (val == 1) {&lt;br /&gt;
        val = 0;&lt;br /&gt;
    } else {&lt;br /&gt;
        if (setjmp(Thread::running-&amp;gt;context) == 0) {&lt;br /&gt;
            blocked.put(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;
}&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;exec&amp;lt;/code&amp;gt;, napisati funkciju &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt; koja kreira proces nad programom u fajlu sa zadatom putanjom i vraća negativnu vrednost u slučaju greške, a &amp;lt;code&amp;gt;pid&amp;lt;/code&amp;gt; kreiranog procesa u slučaju uspeha pri &amp;lt;code&amp;gt;fork&amp;lt;/code&amp;gt;. Ukoliko ne uspe &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;, kreirani proces-dete treba ugasiti.&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 run(char* path) {&lt;br /&gt;
    pid_t pid = fork();&lt;br /&gt;
    if (pid &amp;lt; 0) {&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    if (pid == 0) {&lt;br /&gt;
        int t = exec(path);&lt;br /&gt;
        if (t &amp;lt; 0) {&lt;br /&gt;
            exit(-2);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return pid;&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;
Dva procesa pristupaju kritičnoj sekciji. Dat je presudokod jednog od njih, koji bi trebalo da obezbedi međusobno isključenje uposlenim čekanjem (kod drugog procesa izgleda analogno). Da li ovo rešenje obezbeđuje međusobno isključenje? Da li ima neki problem (ako ima, koji)?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
process P1&lt;br /&gt;
begin&lt;br /&gt;
    loop&lt;br /&gt;
        flag1 := true;&lt;br /&gt;
        while flag2 = true do null end;&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovo rešenje ne valja jer se dešava &#039;&#039;livelock&#039;&#039; odnosno oba procesa se međusobno zaključaju i ni jedan ni drugi se neće dalje izvršavati. To se desi kada proces P1 postavi &amp;lt;code&amp;gt;flag1&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; a zatim se desi promena konteksta i P2 postavi &amp;lt;code&amp;gt;flag2&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za koju od ove dve tehnike, dinamičko učitavanje (&#039;&#039;dynamic loading&#039;&#039;) ili preklopi (&#039;&#039;overlays&#039;&#039;), se može očekivati duže izvršavanje istog programa u najgorem slučaju? Precizno obrazložiti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Duže vreme izvršavanja u najgorem slučaju se može očekivati kod preklopa jer će program stalno učitavati iz memorije iznova i iznova, dok će dinamičko učitavanje zauzeti više memorije, svaki potreban modul će učitati po jednom.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu primenjuje se &#039;&#039;worst-fit&#039;&#039; algoritam kontinualne alokacije memorije. Inicijalno je prostor veličine 256KB potpuno slobodan za alokaciju korisničkih procesa. Potom su različiti procesi zadavali sledeće zahteve (slovna oznaka označava proces koji je postavio zahtev, brojna oznaka označava veličinu alociranog prostora u KB, a minus označava gašenje procesa i oslobađanje njegove memorije): A64, B16, C128, D32, A-, E8, F32, B-&lt;br /&gt;
&lt;br /&gt;
Odgovoriti na sledeća pitanja koja se odnose na stanje memorije nakon ove sekvence zahteva: &lt;br /&gt;
# Koliko je ukupno slobodnih fragmenata?&lt;br /&gt;
# Kolika je veličina najmanjeg slobodnog fragmenta?&lt;br /&gt;
# Kolika je veličina najvećeg slobodnog fragmenta?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Jedno slovo označava 8KB prostora.&lt;br /&gt;
 AAAAAAAA------------------------&lt;br /&gt;
 AAAAAAAABB----------------------&lt;br /&gt;
 AAAAAAAABBCCCCCCCCCCCCCCCC------&lt;br /&gt;
 AAAAAAAABBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 --------BBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 E-------BBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 EFFFF---BBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 EFFFF-----CCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
* Slobodnih fragmenata: 2&lt;br /&gt;
* Najmanji slobodan fragment: 16KB&lt;br /&gt;
* Najveći slobodan fragment: 40KB&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Prilikom preslikavanja virtuelne adrese, procesor je generisao izuzetak zbog pokušaja upisa na tu adresu koji je u deskriptoru stranice označen kao zabranjen. Operativni sistem ipak neće ugasiti taj proces. Precizno objasniti zašto.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Neće ugasiti program jer se zapravo radi o tehnici &#039;&#039;copy-on-write&#039;&#039; odnosno kopiranja na upis. U ovoj tehnici, MMU vidi tu memoriju kao zabranjenu za upis. Prilikom generisanja greške, OS proverava da li je zabranjena, i kako vidi da zapravo nije nije, to znači da se radi o tehnici kopiranja na upis pa će operativni sistem kopirati stranicu i reći MMU da je dozvoljena za upis.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti tri usluge vezane za realno vreme koje operativni sistem može da nudi i predložiti i kratko objasniti funkcije – sistemske pozive za te usluge.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# Informacija o tekućem realnom vremenu:&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;time_t time (time_t* tloc);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: Vraća broj sekundi koje su protekle od 1. 1. 1970. u 0 časova. Postoje i bibliotečke funkcije u &amp;lt;code&amp;gt;time.h&amp;lt;/code&amp;gt; koje vraćaju “kalendarsko” vreme, rastavljeno na datum i sat itd, a oslanjaju se na ovaj sistemski poziv: &amp;lt;code&amp;gt;asctime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ctime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gmtime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;localtime&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Suspenzija pozivajućeg procesa (“uspavljivanje”) za zadato vreme&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;unsigned int sleep (unsigned int seconds);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Čekanje na događaje, uslove ili na sinhronizacione primitive, ali vremenski ograničeno (tzv. &#039;&#039;timeout&#039;&#039; kontrole); ako se proces ne deblokira u zadatom vremenu, biće deblokiran zbog isteka vremenske kontrole; npr. za semafore:&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;int sem_timedwait (sem_t *sem, const struct timespec *abs_timeout);&amp;lt;/syntaxhighlight&amp;gt;&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 putanja do fajla koji taj proces otvara davanjem putanje &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;
Raščlanimo relativnu putanju na delove:&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;: idemo u direktorijum &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;, sada je putanja &amp;lt;code&amp;gt;/a/b/c/d&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; idemo jedan direktorijum iznad, sada je putanja &amp;lt;code&amp;gt;/a/b/c&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; idemo jedan direktorijum iznad, sada je putanja &amp;lt;code&amp;gt;/a/b&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; idemo u direktorijum &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;, sada je putanja &amp;lt;code&amp;gt;/a/b/e&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;f.txt&amp;lt;/code&amp;gt; posećujemo fajl &amp;lt;code&amp;gt;f.txt&amp;lt;/code&amp;gt;, krajnja putanja je &amp;lt;code&amp;gt;/a/b/e/f.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Fajl sistem primenjuje ulančanu alokaciju, s tim da se i slobodni blokovi ulančavaju u listu. U strukturi FCB polje &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; sadrži broj prvog bloka sa sadržajem fajla, a polje &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; veličinu sadržaja. Funkcija jezgra &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt; prima kao argument broj prvog bloka u lancu blokova koje treba proglasiti slobodnim. Napisati funkciju jezgra &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt; koja briše sadržaj fajla na čiji &amp;lt;code&amp;gt;FCB&amp;lt;/code&amp;gt; ukazuje argument.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pretpostavimo da &amp;lt;code&amp;gt;free_head&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;free_tail&amp;lt;/code&amp;gt; predstavljaju pokazivače na početak i kraj ulančane liste slobodnih blokova.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void truncate(FCB *f) {&lt;br /&gt;
	if (f-&amp;gt;head == NULL) return;&lt;br /&gt;
	int numOfBlocks = f-&amp;gt;size / BLOCK_SIZE, i = 0, cur = f-&amp;gt;head, tmp_head = f-&amp;gt;head, prev;&lt;br /&gt;
	while (i &amp;lt; numOfBlocks) {&lt;br /&gt;
		free(cur);&lt;br /&gt;
        prev = cur;&lt;br /&gt;
		cur = cur-&amp;gt;next;&lt;br /&gt;
		i++;&lt;br /&gt;
	}&lt;br /&gt;
	if (free_head == NULL) free_head = tmp_head;&lt;br /&gt;
    else free_tail-&amp;gt;next = prev;&lt;br /&gt;
	free_tail = prev;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2018&amp;diff=2963</id>
		<title>ОС1/Јун 2018</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_2018&amp;diff=2963"/>
		<updated>2021-09-22T15:40:47Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* 10. zadatak */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2018/jun/Jun%202018.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti razliku između pojmova &#039;&#039;proces&#039;&#039; i &#039;&#039;nit&#039;&#039; (engl. &#039;&#039;thread&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Proces je jedno izvršavanje programa sa jednim adresnim prostorom. Nit (&#039;&#039;thread&#039;&#039;) ili laki proces je tok kontrole koji teče uporedo sa drugim tokovima kontrole, ali koji deli virtuelni adresni prostor sa nekim drugim tokom ili tokovima kontrole.&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 &#039;&#039;wait&#039;&#039; 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;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void Event::wait() {&lt;br /&gt;
    if (val == 1) {&lt;br /&gt;
        val = 0;&lt;br /&gt;
    } else {&lt;br /&gt;
        if (setjmp(Thread::running-&amp;gt;context) == 0) {&lt;br /&gt;
            blocked.put(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;
}&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;exec&amp;lt;/code&amp;gt;, napisati funkciju &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt; koja kreira proces nad programom u fajlu sa zadatom putanjom i vraća negativnu vrednost u slučaju greške, a &amp;lt;code&amp;gt;pid&amp;lt;/code&amp;gt; kreiranog procesa u slučaju uspeha pri &amp;lt;code&amp;gt;fork&amp;lt;/code&amp;gt;. Ukoliko ne uspe &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;, kreirani proces-dete treba ugasiti.&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 run(char* path) {&lt;br /&gt;
    pid_t pid = fork();&lt;br /&gt;
    if (pid &amp;lt; 0) {&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    if (pid == 0) {&lt;br /&gt;
        int t = exec(path);&lt;br /&gt;
        if (t &amp;lt; 0) {&lt;br /&gt;
            exit(-2);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return pid;&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;
Dva procesa pristupaju kritičnoj sekciji. Dat je presudokod jednog od njih, koji bi trebalo da obezbedi međusobno isključenje uposlenim čekanjem (kod drugog procesa izgleda analogno). Da li ovo rešenje obezbeđuje međusobno isključenje? Da li ima neki problem (ako ima, koji)?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
process P1&lt;br /&gt;
begin&lt;br /&gt;
    loop&lt;br /&gt;
        flag1 := true;&lt;br /&gt;
        while flag2 = true do null end;&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovo rešenje ne valja jer se dešava &#039;&#039;livelock&#039;&#039; odnosno oba procesa se međusobno zaključaju i ni jedan ni drugi se neće dalje izvršavati. To se desi kada proces P1 postavi &amp;lt;code&amp;gt;flag1&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; a zatim se desi promena konteksta i P2 postavi &amp;lt;code&amp;gt;flag2&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za koju od ove dve tehnike, dinamičko učitavanje (&#039;&#039;dynamic loading&#039;&#039;) ili preklopi (&#039;&#039;overlays&#039;&#039;), se može očekivati duže izvršavanje istog programa u najgorem slučaju? Precizno obrazložiti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Duže vreme izvršavanja u najgorem slučaju se može očekivati kod preklopa jer će program stalno učitavati iz memorije iznova i iznova, dok će dinamičko učitavanje zauzeti više memorije, svaki potreban modul će učitati po jednom.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu primenjuje se &#039;&#039;worst-fit&#039;&#039; algoritam kontinualne alokacije memorije. Inicijalno je prostor veličine 256KB potpuno slobodan za alokaciju korisničkih procesa. Potom su različiti procesi zadavali sledeće zahteve (slovna oznaka označava proces koji je postavio zahtev, brojna oznaka označava veličinu alociranog prostora u KB, a minus označava gašenje procesa i oslobađanje njegove memorije): A64, B16, C128, D32, A-, E8, F32, B-&lt;br /&gt;
&lt;br /&gt;
Odgovoriti na sledeća pitanja koja se odnose na stanje memorije nakon ove sekvence zahteva: &lt;br /&gt;
# Koliko je ukupno slobodnih fragmenata?&lt;br /&gt;
# Kolika je veličina najmanjeg slobodnog fragmenta?&lt;br /&gt;
# Kolika je veličina najvećeg slobodnog fragmenta?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Jedno slovo označava 8KB prostora.&lt;br /&gt;
 AAAAAAAA------------------------&lt;br /&gt;
 AAAAAAAABB----------------------&lt;br /&gt;
 AAAAAAAABBCCCCCCCCCCCCCCCC------&lt;br /&gt;
 AAAAAAAABBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 --------BBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 E-------BBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 EFFFF---BBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 EFFFF-----CCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
* Slobodnih fragmenata: 2&lt;br /&gt;
* Najmanji slobodan fragment: 16KB&lt;br /&gt;
* Najveći slobodan fragment: 40KB&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Prilikom preslikavanja virtuelne adrese, procesor je generisao izuzetak zbog pokušaja upisa na tu adresu koji je u deskriptoru stranice označen kao zabranjen. Operativni sistem ipak neće ugasiti taj proces. Precizno objasniti zašto.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Neće ugasiti program jer se zapravo radi o tehnici &#039;&#039;copy-on-write&#039;&#039; odnosno kopiranja na upis. U ovoj tehnici, MMU vidi tu memoriju kao zabranjenu za upis. Prilikom generisanja greške, OS proverava da li je zabranjena, i kako vidi da zapravo nije nije, to znači da se radi o tehnici kopiranja na upis pa će operativni sistem kopirati stranicu i reći MMU da je dozvoljena za upis.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti tri usluge vezane za realno vreme koje operativni sistem može da nudi i predložiti i kratko objasniti funkcije – sistemske pozive za te usluge.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# Informacija o tekućem realnom vremenu:&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;time_t time (time_t* tloc);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: Vraća broj sekundi koje su protekle od 1. 1. 1970. u 0 časova. Postoje i bibliotečke funkcije u &amp;lt;code&amp;gt;time.h&amp;lt;/code&amp;gt; koje vraćaju “kalendarsko” vreme, rastavljeno na datum i sat itd, a oslanjaju se na ovaj sistemski poziv: &amp;lt;code&amp;gt;asctime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ctime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gmtime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;localtime&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Suspenzija pozivajućeg procesa (“uspavljivanje”) za zadato vreme&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;unsigned int sleep (unsigned int seconds);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Čekanje na događaje, uslove ili na sinhronizacione primitive, ali vremenski ograničeno (tzv. &#039;&#039;timeout&#039;&#039; kontrole); ako se proces ne deblokira u zadatom vremenu, biće deblokiran zbog isteka vremenske kontrole; npr. za semafore:&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;int sem_timedwait (sem_t *sem, const struct timespec *abs_timeout);&amp;lt;/syntaxhighlight&amp;gt;&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 putanja do fajla koji taj proces otvara davanjem putanje &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;
Raščlanimo relativnu putanju na delove:&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;: idemo u direktorijum &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;, sada je putanja &amp;lt;code&amp;gt;/a/b/c/d&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; idemo jedan direktorijum iznad, sada je putanja &amp;lt;code&amp;gt;/a/b/c&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; idemo jedan direktorijum iznad, sada je putanja &amp;lt;code&amp;gt;/a/b&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; idemo u direktorijum &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;, sada je putanja &amp;lt;code&amp;gt;/a/b/e&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;f.txt&amp;lt;/code&amp;gt; posećujemo fajl &amp;lt;code&amp;gt;f.txt&amp;lt;/code&amp;gt;, krajnja putanja je &amp;lt;code&amp;gt;/a/b/e/f.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Fajl sistem primenjuje ulančanu alokaciju, s tim da se i slobodni blokovi ulančavaju u listu. U strukturi FCB polje &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; sadrži broj prvog bloka sa sadržajem fajla, a polje &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; veličinu sadržaja. Funkcija jezgra &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt; prima kao argument broj prvog bloka u lancu blokova koje treba proglasiti slobodnim. Napisati funkciju jezgra &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt; koja briše sadržaj fajla na čiji &amp;lt;code&amp;gt;FCB&amp;lt;/code&amp;gt; ukazuje argument.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pretpostavimo da &amp;lt;code&amp;gt;free_head&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;free_tail&amp;lt;/code&amp;gt; predstavljaju pokazivače na početak i kraj ulančane liste slobodnih blokova.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void truncate(FCB *f) {&lt;br /&gt;
	if (f-&amp;gt;head == NULL) return;&lt;br /&gt;
	int numOfBlocks = size / BLOCK_SIZE, i = 0, cur = f-&amp;gt;head, tmp_head = f-&amp;gt;head;&lt;br /&gt;
	while (i &amp;lt; numOfBlocks) {&lt;br /&gt;
		free(cur);&lt;br /&gt;
		cur = cur-&amp;gt;next;&lt;br /&gt;
		i++;&lt;br /&gt;
	}&lt;br /&gt;
	if (free_head == NULL) free_head = tmp_head;&lt;br /&gt;
    else free_tail-&amp;gt;next = tmp_head;&lt;br /&gt;
	free_tail = tmp_head;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</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=2962</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=2962"/>
		<updated>2021-09-22T15:32:34Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: dodato resenje za 6.&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 interakcija sa korisnicima preko terminala. Ona je u početku imala probleme sporog i neravnomernog odziva za korisnike, pa su uvedeni koncepti preotimanja procesora i &#039;&#039;time sharing&#039;&#039; mehanizam, koji su omogućili brz i ravnomeran odziv korisnicima.&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;
&amp;lt;syntaxhighlight lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
FreeSegment* getBestFit(size_t s) {&lt;br /&gt;
	int minDif = INT_MAX;&lt;br /&gt;
	FreeSegment *tmp = freeSeghead, *ans = 0;&lt;br /&gt;
	while (tmp) {&lt;br /&gt;
		if (tmp-&amp;gt;size == s) return tmp;&lt;br /&gt;
		if (tmp-&amp;gt;size &amp;gt; s) {&lt;br /&gt;
			if (tmp-&amp;gt;size - s &amp;lt; minDif) {&lt;br /&gt;
				minDif = tmp-&amp;gt;size - s;&lt;br /&gt;
				ans = tmp;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		tmp = tmp-&amp;gt;next;&lt;br /&gt;
	}&lt;br /&gt;
	return ans;&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;
&amp;lt;code&amp;gt;page: 4KB -&amp;gt; 12b&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;VA(32) : page1(10) : page2(10) : offset(12)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;pmt1_size&amp;lt;/code&amp;gt; = &amp;lt;math&amp;gt;2^{10} \cdot 4B = 4KB&amp;lt;/math&amp;gt;&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>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2014&amp;diff=2961</id>
		<title>ОС1/Фебруар 2014</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2014&amp;diff=2961"/>
		<updated>2021-09-22T15:22:10Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2014/feb/OS1%20Feb%202014.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti zašto je i kako uvođenje magnetnih diskova bilo od ključnog značaja kod prelaska sa paketnih sistema na sisteme sa multiprogramiranjem.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
OS može da pristupa disku direktno, u proizvoljnom redosledu, bez značajnih razlika u vremenu odziva kao kod traka (zbog premotavanja) bez obzira na to kako su podaci smešteni na samom disku. Disk je blokovski orijentisan ulazno-izlazni uređaj. Podaci se mogu i učitavati sa diska i upisivati na njega, ali se prenose isključivo u blokovima fiksne veličine. Zbog ovoga je skup poslova koji su podneti na izvršavanje mogao da se snimi na disk a da OS sa njega učitava one koje odluči da će se izvršavati, na osnovu zauzeća procesora i memorije, a ne na osnovu redosleda kojim su podneti. &lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti kako se međusobno isključenje kritičnih sekcija jezgra operativnog sistema može &lt;br /&gt;
obezbediti kod jednosprocesorskih, a kako kod višeprocesorskih sistema. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
#jednosprocesorski sistemi:&lt;br /&gt;
#*maskirati prekide&lt;br /&gt;
#*zabraniti preuzimanje&lt;br /&gt;
#*optimistički pristup&lt;br /&gt;
#višeprocesorski sistemi:&lt;br /&gt;
#*test-and-set&lt;br /&gt;
#*swap&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem  standardnih  sistemskih  poziva  &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;  i  &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt;  napisati  C  program  koji  kreira  tačno  &#039;&#039;N&#039;&#039;  procesa  svoje  dece,  gde  je  &#039;&#039;N&#039;&#039;  parametar  programa,  a  potom  čeka  da  se  sva  deca  završe. Procesi-deca samo ispišu neku poruku na standardni izlaz i potom se završavaju.&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;stdio.h&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;
	int pid[N];&lt;br /&gt;
	for(int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
		pid[i] = fork();&lt;br /&gt;
		if(pid[i] &amp;lt; 0)&lt;br /&gt;
			return -2;&lt;br /&gt;
		else if(pid[i] == 0) {&lt;br /&gt;
			printf(&amp;quot;Child %d&amp;quot;, i);&lt;br /&gt;
			exit(0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	for(int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
		wait(pid[i]);&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 sinhronizaciju proizvođača i potrošača sa neograničenim baferom. (Kod za smeštanje i uzimanje elemenata ne treba pisati, već samo naznačiti njegovo mesto.)&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 mutex(1), spaceAvailable(N), itemAvailable(0);&lt;br /&gt;
&lt;br /&gt;
void append(Data* d) {&lt;br /&gt;
	spaceAvailable.wait();&lt;br /&gt;
	mutex.wait();&lt;br /&gt;
	&amp;lt;add&amp;gt;&lt;br /&gt;
	mutex.signal();&lt;br /&gt;
	itemAvailable.signal();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Data* take() {&lt;br /&gt;
	itemAvailable.wait();&lt;br /&gt;
	mutex.wait();&lt;br /&gt;
	&amp;lt;get data&amp;gt;&lt;br /&gt;
	mutex.signal();&lt;br /&gt;
	spaceAvailable.signal();&lt;br /&gt;
	return data;&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;
Ukratko objasniti osnovnu razliku između tehnika dinamičkog učitavanja (&#039;&#039;dynamic loading&#039;&#039;) 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;
Šta je eksterna fragmentacija kod alokacije memorije? Da li je ona moguća kod segmentno-stranične alokacije memorije? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Eksterna fragmentacija nastaje kada se procesi učitavaju u memoriju a zatim dealociraju. Kako se delovi proizvoljnih dimenzija zauzimaju i oslobađaju dinamički, slobodni fragmenti se stvaraju i nazivaju eksternim. &lt;br /&gt;
Nije moguća eksterna fragmentacija kod segmentno-stranične organizacije jer alociraju blokovi iste veličine.&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;
Videti zadatak iz [[ОС1/Јануар 2015#7. zadatak|januarskog roka 2015]].&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti tehniku &#039;&#039;spooling&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kada neki nedeljivi spori uređaj želi da odradi posao, prvo se zatraži korišćenje tog uređaja sistemskim pozivom, OS tada pravi poseban fajl na određenom mestu u svom fajl sistemu u koji će preusmeriti sve ulazne operacije tog procesa sa štampačem i vraća kontrolu procesu. OS predaje fajl na obradu posebnom procesu ili niti (spuleru) koji će jedan po jedan fajl da uzima i njihove sadržaje da šalje datom uređaju.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dati  procenu  kompleksnosti  u  najgorem  slučaju  sledećih  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;
{{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 a) indeksna, pri čemu je indeks fajla uvek u dva nivoa, a na blok sa indeksom prvog nivoa ukazuje polje u FCB, b) FAT, pri čemu je cela FAT u memoriji? FCB fajla je u memoriji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
a) 3&lt;br /&gt;
b) 1&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</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_2014&amp;diff=2960</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%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2014&amp;diff=2960"/>
		<updated>2021-09-22T15:18:57Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2014/jan/OS1%20Jan%202014.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta označava termin &#039;&#039;multiprogramiranje&#039;&#039;, a šta termin &#039;&#039;multiprocesiranje&#039;&#039;? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Multiprogramiranje označava izvršavanje uporedo više procesa na jednom procesoru. Dok jedan proces čeka na izvršavanje I/O operacije, procesor izvršava druge poslove.&lt;br /&gt;
&lt;br /&gt;
Multiprocesiranje označava izvršavanje procesa fizički paralelno na više procesora.&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;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. &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(jump_buf old, jump_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;
Na programskom jeziku Java implementirati nit (&#039;&#039;thread&#039;&#039;) koja izvršava praznu petlju sve dok joj se pozivom operacije ne kaže da stane. Napisati i kod koji pravi i pokreće &#039;&#039;N&#039;&#039; takvih uporednih niti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class Main() {&lt;br /&gt;
	public static void main(string[] args) {&lt;br /&gt;
		int n = Integer.ParseInt(args[0]);&lt;br /&gt;
		for(int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
			Thread thread = new Thread() {&lt;br /&gt;
				@Override&lt;br /&gt;
				public void run() {&lt;br /&gt;
					try {&lt;br /&gt;
						while(!isInterrupted) {}&lt;br /&gt;
					} catch(InterruptedException e) {};					&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			thread.start();&lt;br /&gt;
		}	&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 napisati kod za uslovnu sinhronizaciju dva uporedna procesa od kojih jedan ispunjava neki logički uslov, a drugi ne sme da prođe određenu tačku ako taj uslov nije ispunjen&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 := 0;&lt;br /&gt;
	semB : Semaphore := 0;&lt;br /&gt;
	flag : boolean := false;&lt;br /&gt;
	&lt;br /&gt;
process A:&lt;br /&gt;
	begin&lt;br /&gt;
		loop&lt;br /&gt;
			...&lt;br /&gt;
			flag = true;&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;
			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;
Ako  tokom  svog  prvog  prolaza  linker  u  svojoj  tabeli  pronađe prethodno definisan 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;
Da, jer se već nalazi u tabeli simbola i dolazi do konflikta imena.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je interna fragmentacija kod alokacije memorije? Da li je ona moguća kod kontinualne alokacije memorije?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Interna fragmentacija predstavlja neiskorišćen deo memorije unutar alociranih blokova zbog ograničavanja dozvoljene veličine bloka.&lt;br /&gt;
Kod kontinualne alokacije postoji problem eksterne ali ne i interne fragmentacije jer proces zauzima tačno onoliko prostora koliko mu je potrebno.&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  adresa  je 64-bitna. Posmatraju se dva (teorijska) granična slučaja: a) neki proces koristi ceo svoj virtuelni prostor;  b)  neki  proces  koristi  samo  nekoliko  susednih  stranica  svog  virtuelnog  prostora.  Koji pristup  organizacije  PMT  zauzima  manje  memorije  za  PMT  za svaki od ova dva slučaja: PMT organizovana u jednom nivou (linearno) ili PMT organizovana u više nivoa? Kratko obrazložiti&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Manje prostora bi zauzimala PMT organizovana u jednom nivou jer bi organizovanje u dva nivoa izazvalo alociranje cele tabele prvog i zatim određen broj tabela 2. nivoa.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kojom  tehnikom  se  može  blokovski  orijentisani  ulazni  uređaj  koristiti  kao  znakovno orijentisani ulazni tok? Kratko objasniti kako. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tehnikom baferisanja: poseban proces koji kontroliše uređaj. Sa uređaja se uzima blok po blok podataka i stavlja u bafer. Korisnik uzima znak po znak kao znakovno orijentisani ulazni tok.&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;
fread(f1,buffer1,n1);    &lt;br /&gt;
fwrite(f1,buffer2,n2);&lt;br /&gt;
fread(f2,buffer1,n1);&lt;br /&gt;
fwrite(f2,buffer2,n2);&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;
fread(f1,buffer1,n1);    uspešan&lt;br /&gt;
fwrite(f1,buffer2,n2);   neuspešan&lt;br /&gt;
fread(f2,buffer1,n1);    uspešan&lt;br /&gt;
fwrite(f2,buffer2,n2);   uspešan&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Predložiti i ukratko objasniti neki način vođenja evidencije slobodnih blokova na disku koji ne koristi nikakav dodatni prostor za tu evidenciju (osim tih slobodnih blokova).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prvi slobodan blok sadrži broj slobodnih blokova i pokazivač na sledeći.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</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=2959</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=2959"/>
		<updated>2021-09-22T15:13:54Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: &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;
# 1&lt;br /&gt;
# 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</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=2958</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=2958"/>
		<updated>2021-09-22T15:07:53Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* isto */&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;
&amp;lt;math&amp;gt; 2^8 \cdot 4B + 2 \cdot 2^8 \cdot 4B = 3KB&amp;lt;/math&amp;gt;&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;
Koristi se kod sprege uređaja ili tokova kontrole koji su jako različiti po brzini transfera ili jedinici prenosa. Uvode se 2 bafera. &lt;br /&gt;
&lt;br /&gt;
U prvoj fazi bafer A je ulazni bafer, bafer za proizvođača, a bafer B je izlazni bafer, bafer za potrošača. Kada oba učesnika završe fazu punjenja tj. pražnjenja svog bafera, baferi A i B menjaju uloge.&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;
Operacija 2. će se izvršiti neuspešno, a ostale uspešno.&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;
# 3&lt;br /&gt;
# n&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</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=2957</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=2957"/>
		<updated>2021-09-22T14:58:08Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* isto */&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;
&amp;lt;syntaxhighlight lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int main (int argc, const char *argv[]) {&lt;br /&gt;
	if (argc &amp;lt; 2) return -1;&lt;br /&gt;
	pid_t pid = fork();&lt;br /&gt;
	if (pid == 0) {&lt;br /&gt;
		int s = execlp(argv[1], NULL);&lt;br /&gt;
		if (s &amp;lt; 0) 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;
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;
Videti zadatak iz [[ОС1/Септембар 2011#5. zadatak|septembarskog roka 2011]].&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;
Dvostruko ulančana lista slobodnih fragmenata uređenih po poziciji u memoriji, jer je potrebno ulančati sa slobodnim fragmentom iznad i ispod tog segmenta memorije koji dealociramo uz eventualno spajanje.&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;
&amp;lt;code&amp;gt;VA(32) = 8 (page1)|8 (page2)| 16 (offset)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2^8 \cdot 4B + 2 \cdot 2^8 \cdot 4B = 3 \cdot 2^{10}B = 3KB&amp;lt;/math&amp;gt;&lt;br /&gt;
&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&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;
&amp;lt;math&amp;gt;\frac{512B}{4B} = 2^7B&amp;lt;/math&amp;gt; ulaza u indeksu&lt;br /&gt;
&lt;br /&gt;
maksimalna veličina fajla: &amp;lt;math&amp;gt;2^7 \cdot 2^7 \cdot 2^9 = 2^{23}B = 8MB&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</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=2956</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=2956"/>
		<updated>2021-09-22T14:39:01Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* dodata resenja koja su falila - potrebno proveriti */&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;
Odgovor: 8&lt;br /&gt;
* P1 pravi dete P2 i inkrementira svoje &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
* P2 je dete, te &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; vraća 0 u kontekstu deteta i završava se program.&lt;br /&gt;
* P1 pravi dete P3 i inkrementira svoje &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
* P1 pravi dete P4 i inkrementira svoje &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
* P1 pravi dete P5 i inkrementira svoje &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
* P1 pravi dete P6 i inkrementira svoje &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
* P1 pravi dete P7 i inkrementira svoje &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
* P1 pravi dete P8 i inkrementira svoje &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
* P3, P4, P5, P6, P7, P8 se isto završavaju kao proces P2.&lt;br /&gt;
* P1 završava svoj &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; ciklus jer je &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; postalo 7.&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 izvrš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 - mora da obezbedi da je base registar dostupan i za čitanje i za upis, kako bi OS tu prilikom promene konteksta upisao baznu adresu tekućeg procesa, a u slučaju realokacije procesa OS menja vrednost bazne adrese za taj proces u svojoj evidenciji koju ima za svaki proces.&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;
&amp;lt;math&amp;gt; t_{TLB} = 0.1 t_{RAM} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; 0.9 \cdot (t_{TLB} + t_{RAM}) + 0.1 \cdot (t_{TLB} + 4 \cdot t_{RAM}) = 1.4 t_{RAM} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odnos: &amp;lt;math&amp;gt; (1.4 - 1) / 1 = 40\% &amp;lt;/math&amp;gt;&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;
#&amp;lt;code&amp;gt;int getc(FILE * f)&amp;lt;/code&amp;gt; Učitava i vraća 1 znak iz ulaznog toka. &lt;br /&gt;
#&amp;lt;code&amp;gt;int putc(int c, FILE * f)&amp;lt;/code&amp;gt; Šalje 1 znak na zadati izlazni tok.. &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;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
write(FHANDLE f, int position, char* b, int size) {&lt;br /&gt;
	int curSize = size(f);&lt;br /&gt;
	if (position + size &amp;gt; curSize) &lt;br /&gt;
		append(f, position + size - curSize);&lt;br /&gt;
	seek(f, position);&lt;br /&gt;
	write(f, b, size);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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>WikiEditor</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=2955</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=2955"/>
		<updated>2021-09-22T14:10:34Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* 5. zadatak predlog resenja */&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/objekat/podatak 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;
Kada pravi .exe fajl linker mora da završi posao bez nerazrešenih simbola, a .lib može da ima simbole koje uvozi.&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;
&amp;lt;math&amp;gt; 0.9 \cdot (10 + 50) + 0.1 \cdot (10 + 4 \cdot 50) = 75ns &amp;lt;/math&amp;gt;&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;
&amp;lt;math&amp;gt; (512 + 512 \cdot 512) \cdot blockSize &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</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=2954</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=2954"/>
		<updated>2021-09-22T13:58:48Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* Rešenje valjda? */&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;
Procesor će generisati izuzetak &#039;&#039;write prohibited&#039;&#039;, jer je u desktriptoru ove stranice označeno da ona nije dozvoljena za upis zbog tek kreiranog procesa deteta.&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;
Deljeni (shared) ključ.&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>WikiEditor</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=2953</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=2953"/>
		<updated>2021-09-22T13:57:17Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* 7. zadatak predlog resenja */&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;
Procesor će generisati izuzetak &#039;&#039;write prohibited&#039;&#039;, jer je u desktriptoru ove stranice označeno da ona nije dozvoljena za upis zbog tek kreiranog procesa deteta.&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>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2017&amp;diff=2952</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%BB_2017&amp;diff=2952"/>
		<updated>2021-09-22T13:50:27Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* 2-&amp;gt;1 ?*/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2017/jul/Jul%202017.pdf Zadaci sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je hard, a šta soft sistem za rad u realnom vremenu (real-time system)?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tvrdi sistemi za rad u realnom vremenu su sistemi u kojima odziv mora da stigne u određenom vremenu (&#039;&#039;deadline&#039;&#039;). Prekoračenje može dovesti do rezličitih katastrofa. Meki sistemi za rad u realnom vremenu su sistemi kojima je rok bitan ali smeju ga prekoračiti dok god performanse ulaze u zadate okvire.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti značenje mašinske instrukcije tipa &#039;&#039;test-and-set&#039;&#039; i njenu upotrebu u jezgru operativnog sistema.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;code&amp;gt;test_and_set&amp;lt;/code&amp;gt; je instrukcija koja omogućava sinhronizaciju na hardverskom nivou. Služi za međusobno isključenje izvršavanja na više procesora. Ona atomično čita i vraća sadržaj zadate memorijske lokacije, i u tu lokaciju upisuje vrednost 1. Može da se koristi u implementaciji &amp;lt;code&amp;gt;lock()&amp;lt;/code&amp;gt; funkcije.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem školskog jezgra 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 &#039;&#039;n*k&#039;&#039;, tako što svaka nit obrađuje &#039;&#039;k&#039;&#039; elemanata&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; (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;
class ArrThread : Thread {&lt;br /&gt;
    public:&lt;br /&gt;
        ArrThread(int* a, int s, int f): arr(a), start(s), finish(f) {}&lt;br /&gt;
        void run() {&lt;br /&gt;
            for (int i = start; i &amp;lt; finish; i++) {&lt;br /&gt;
                arr[i] *= arr[i];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    private:&lt;br /&gt;
        int* arr;&lt;br /&gt;
        int start;&lt;br /&gt;
        int finish;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    ArrThread* t[n];&lt;br /&gt;
    int start = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        t[i] = new ArrThread(array, start, start + k);&lt;br /&gt;
        start += k;&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        delete t[i];&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;
Videti zadatak iz [[ОС1/Јул 2019#4. zadatak|julskog roka 2019]].&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 ujednom). Obrazloženje ilustrovati primerom.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Linkerov zadatak je da spoji sve fajlove u jedan izvršni, ali da bi to uradio, linker mora naći sve simbole koji se uvoze odnosno izvoze.&lt;br /&gt;
&lt;br /&gt;
U prvom prolazu analizira ulazne fajlove, veličinu njihovog binarnog sadržaja (prevoda), i pravi mapu &#039;&#039;exe&#039;&#039; fajla; osim toga, sakuplja infomacije iz tabela simbola &#039;&#039;obj&#039;&#039; fajlova i izgrađuje svoju tabelu simbola; u tu tabelu simbola unosi izvezene simbole iz &#039;&#039;obj&#039;&#039; fajlova, za koje odmah može da izračuna adresu u odnosu na ceo &#039;&#039;exe&#039;&#039; fajl. U drugom prolazu spaja sve te fajlove u jedan, i ujedno razrešava nerazrešena adresna polja mašinskih instrukcija na osnovu informacija o adresama u koje se preslikavaju simboli iz njegove tabele simbola.&lt;br /&gt;
&lt;br /&gt;
Primer: Recimo da imamo dva objektna fajla, &amp;lt;code&amp;gt;a.obj&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;b.obj&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;a.obj&amp;lt;/code&amp;gt; izvozi simbol &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; i uvozi simbol &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Linker će iz prvog objektnog fajla dodati u tabelu simbol &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;b.obj&amp;lt;/code&amp;gt; uvozi simbol &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; i izvozi simbol &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, pa će linker u svoju tabelu dodati simbol &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. U drugom prolazu će linker razrešiti &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; polje u &amp;lt;code&amp;gt;a.obj&amp;lt;/code&amp;gt; i polje &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; u &amp;lt;code&amp;gt;b.obj&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti uslugu koju program očekuje od operativnog sistema ako koristi preklope (&#039;&#039;overlay&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Obaveza OS-a je samo da obezbedi uslugu (sistemski poziv) koji alocira deo (virtuelnog) adresnog prostora procesa, kao i uslugu kojom u dati prostor procesa učitava sadržaj iz nekog binarnog fajla i sadržaj iz memorije upisuje u neki fajl (uobičajene sistemske usluge za rad sa fajlovima); OS ne zna za šta se te usluge koriste, tj. ne zna da se one upotrebljavaju baš za dinamičko učitavanje i zamenu delova procesa.&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 2543h.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
VA(30) : seg(18) offset(12)&lt;br /&gt;
&lt;br /&gt;
Virtuelna adresa 2543h tj. 0010 | 0101 0100 0011b pripada 2. segmentu koji počinje od fizičke adrese 10000h i završava na 10800h. &lt;br /&gt;
&lt;br /&gt;
Fizička adresa se dobija sabiranjem bazne adrese u fizičkom adresnom prostoru i offsetnog dela virtuelne adrese:&lt;br /&gt;
PA = 10000h + 543h = 10543h.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2021#6. zadatak|junskog roka 2021. godine]].&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2020#7. zadatak|junskog roka 2020. godine]].&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;
Pošto je blok veličine &amp;lt;math&amp;gt;2^{19}B&amp;lt;/math&amp;gt; a adresa &amp;lt;math&amp;gt;2^3B&amp;lt;/math&amp;gt; to znači da u jedan indeks može da stane &amp;lt;math&amp;gt;2^{16}&amp;lt;/math&amp;gt; adresa blokova. Konačan broj bajtova koji je na ovaj način mogu adresirati jeste &amp;lt;math&amp;gt;2^{16} \cdot 2^{16} \cdot 2^{19} = 2^{51}B = 2PB&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2018&amp;diff=2951</id>
		<title>ОС1/Јун 2018</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_2018&amp;diff=2951"/>
		<updated>2021-09-22T13:47:16Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* predlog resenja */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2018/jun/Jun%202018.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti razliku između pojmova &#039;&#039;proces&#039;&#039; i &#039;&#039;nit&#039;&#039; (engl. &#039;&#039;thread&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Proces je jedno izvršavanje programa sa jednim adresnim prostorom. Nit (&#039;&#039;thread&#039;&#039;) ili laki proces je tok kontrole koji teče uporedo sa drugim tokovima kontrole, ali koji deli virtuelni adresni prostor sa nekim drugim tokom ili tokovima kontrole.&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 &#039;&#039;wait&#039;&#039; 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;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void Event::wait() {&lt;br /&gt;
    if (val == 1) {&lt;br /&gt;
        val = 0;&lt;br /&gt;
    } else {&lt;br /&gt;
        if (setjmp(Thread::running-&amp;gt;context) == 0) {&lt;br /&gt;
            blocked.put(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;
}&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;exec&amp;lt;/code&amp;gt;, napisati funkciju &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt; koja kreira proces nad programom u fajlu sa zadatom putanjom i vraća negativnu vrednost u slučaju greške, a &amp;lt;code&amp;gt;pid&amp;lt;/code&amp;gt; kreiranog procesa u slučaju uspeha pri &amp;lt;code&amp;gt;fork&amp;lt;/code&amp;gt;. Ukoliko ne uspe &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;, kreirani proces-dete treba ugasiti.&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 run(char* path) {&lt;br /&gt;
    pid_t pid = fork();&lt;br /&gt;
    if (pid &amp;lt; 0) {&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    if (pid == 0) {&lt;br /&gt;
        int t = exec(path);&lt;br /&gt;
        if (t &amp;lt; 0) {&lt;br /&gt;
            exit(-2);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return pid;&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;
Dva procesa pristupaju kritičnoj sekciji. Dat je presudokod jednog od njih, koji bi trebalo da obezbedi međusobno isključenje uposlenim čekanjem (kod drugog procesa izgleda analogno). Da li ovo rešenje obezbeđuje međusobno isključenje? Da li ima neki problem (ako ima, koji)?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
process P1&lt;br /&gt;
begin&lt;br /&gt;
    loop&lt;br /&gt;
        flag1 := true;&lt;br /&gt;
        while flag2 = true do null end;&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovo rešenje ne valja jer se dešava &#039;&#039;livelock&#039;&#039; odnosno oba procesa se međusobno zaključaju i ni jedan ni drugi se neće dalje izvršavati. To se desi kada proces P1 postavi &amp;lt;code&amp;gt;flag1&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; a zatim se desi promena konteksta i P2 postavi &amp;lt;code&amp;gt;flag2&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za koju od ove dve tehnike, dinamičko učitavanje (&#039;&#039;dynamic loading&#039;&#039;) ili preklopi (&#039;&#039;overlays&#039;&#039;), se može očekivati duže izvršavanje istog programa u najgorem slučaju? Precizno obrazložiti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Duže vreme izvršavanja u najgorem slučaju se može očekivati kod preklopa jer će program stalno učitavati iz memorije iznova i iznova, dok će dinamičko učitavanje zauzeti više memorije, svaki potreban modul će učitati po jednom.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu primenjuje se &#039;&#039;worst-fit&#039;&#039; algoritam kontinualne alokacije memorije. Inicijalno je prostor veličine 256KB potpuno slobodan za alokaciju korisničkih procesa. Potom su različiti procesi zadavali sledeće zahteve (slovna oznaka označava proces koji je postavio zahtev, brojna oznaka označava veličinu alociranog prostora u KB, a minus označava gašenje procesa i oslobađanje njegove memorije): A64, B16, C128, D32, A-, E8, F32, B-&lt;br /&gt;
&lt;br /&gt;
Odgovoriti na sledeća pitanja koja se odnose na stanje memorije nakon ove sekvence zahteva: &lt;br /&gt;
# Koliko je ukupno slobodnih fragmenata?&lt;br /&gt;
# Kolika je veličina najmanjeg slobodnog fragmenta?&lt;br /&gt;
# Kolika je veličina najvećeg slobodnog fragmenta?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Jedno slovo označava 8KB prostora.&lt;br /&gt;
 AAAAAAAA------------------------&lt;br /&gt;
 AAAAAAAABB----------------------&lt;br /&gt;
 AAAAAAAABBCCCCCCCCCCCCCCCC------&lt;br /&gt;
 AAAAAAAABBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 --------BBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 E-------BBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 EFFFF---BBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 EFFFF-----CCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
* Slobodnih fragmenata: 2&lt;br /&gt;
* Najmanji slobodan fragment: 16KB&lt;br /&gt;
* Najveći slobodan fragment: 40KB&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Prilikom preslikavanja virtuelne adrese, procesor je generisao izuzetak zbog pokušaja upisa na tu adresu koji je u deskriptoru stranice označen kao zabranjen. Operativni sistem ipak neće ugasiti taj proces. Precizno objasniti zašto.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Neće ugasiti program jer se zapravo radi o tehnici &#039;&#039;copy-on-write&#039;&#039; odnosno kopiranja na upis. U ovoj tehnici, MMU vidi tu memoriju kao zabranjenu za upis. Prilikom generisanja greške, OS proverava da li je zabranjena, i kako vidi da zapravo nije nije, to znači da se radi o tehnici kopiranja na upis pa će operativni sistem kopirati stranicu i reći MMU da je dozvoljena za upis.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti tri usluge vezane za realno vreme koje operativni sistem može da nudi i predložiti i kratko objasniti funkcije – sistemske pozive za te usluge.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# Informacija o tekućem realnom vremenu:&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;time_t time (time_t* tloc);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: Vraća broj sekundi koje su protekle od 1. 1. 1970. u 0 časova. Postoje i bibliotečke funkcije u &amp;lt;code&amp;gt;time.h&amp;lt;/code&amp;gt; koje vraćaju “kalendarsko” vreme, rastavljeno na datum i sat itd, a oslanjaju se na ovaj sistemski poziv: &amp;lt;code&amp;gt;asctime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ctime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gmtime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;localtime&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Suspenzija pozivajućeg procesa (“uspavljivanje”) za zadato vreme&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;unsigned int sleep (unsigned int seconds);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Čekanje na događaje, uslove ili na sinhronizacione primitive, ali vremenski ograničeno (tzv. &#039;&#039;timeout&#039;&#039; kontrole); ako se proces ne deblokira u zadatom vremenu, biće deblokiran zbog isteka vremenske kontrole; npr. za semafore:&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;int sem_timedwait (sem_t *sem, const struct timespec *abs_timeout);&amp;lt;/syntaxhighlight&amp;gt;&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 putanja do fajla koji taj proces otvara davanjem putanje &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;
Raščlanimo relativnu putanju na delove:&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;: idemo u direktorijum &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;, sada je putanja &amp;lt;code&amp;gt;/a/b/c/d&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; idemo jedan direktorijum iznad, sada je putanja &amp;lt;code&amp;gt;/a/b/c&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; idemo jedan direktorijum iznad, sada je putanja &amp;lt;code&amp;gt;/a/b&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; idemo u direktorijum &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;, sada je putanja &amp;lt;code&amp;gt;/a/b/e&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;f.txt&amp;lt;/code&amp;gt; posećujemo fajl &amp;lt;code&amp;gt;f.txt&amp;lt;/code&amp;gt;, krajnja putanja je &amp;lt;code&amp;gt;/a/b/e/f.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Fajl sistem primenjuje ulančanu alokaciju, s tim da se i slobodni blokovi ulančavaju u listu. U strukturi FCB polje &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; sadrži broj prvog bloka sa sadržajem fajla, a polje &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; veličinu sadržaja. Funkcija jezgra &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt; prima kao argument broj prvog bloka u lancu blokova koje treba proglasiti slobodnim. Napisati funkciju jezgra &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt; koja briše sadržaj fajla na čiji &amp;lt;code&amp;gt;FCB&amp;lt;/code&amp;gt; ukazuje argument.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pretpostavimo da &amp;lt;code&amp;gt;free_head&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;free_tail&amp;lt;/code&amp;gt; predstavljaju pokazivače na početak i kraj ulančane liste slobodnih blokova.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void truncate(FCB *f) {&lt;br /&gt;
	if (f-&amp;gt;head == NULL) return;&lt;br /&gt;
	int numOfBlocks = size / BLOCK_SIZE, i = 0, cur = f-&amp;gt;head, tmp_head = f-&amp;gt;head;&lt;br /&gt;
	while (i &amp;lt; numOfBlocks) {&lt;br /&gt;
		free(cur);&lt;br /&gt;
		cur = cur-&amp;gt;next;&lt;br /&gt;
		i++;&lt;br /&gt;
	}&lt;br /&gt;
	if (free_head == NULL) free_head = tmp_head;&lt;br /&gt;
    else free_tail-&amp;gt;next = tmp_head;&lt;br /&gt;
	free_tail = tmp_head;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</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=2950</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=2950"/>
		<updated>2021-09-22T13:30:03Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* 6. zadatak pogresan tekst */&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;
Da li se količina memorije koju program zahteva u najgorem slučaju njegovog izvršavanja smanjuje primenom tehnike dinamičkog učitavanja (u odnosu na količinu koju zahteva kada se ta tehnika ne koristi)? Kratko obrazložiti. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ne smanjuje se, jer u najgorem slučaju on zahteva sve svoje potprograme i strukture, a tehnika dinamičkog učitavanja obezbeđuje da delovi ne moraju da se učitavaju samo dok se prvi put ne javi potreba za njima.&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>WikiEditor</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=2948</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=2948"/>
		<updated>2021-09-21T22:05:31Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* male izmene */&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 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>WikiEditor</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%BF%D1%80%D0%B5%D0%B4%D1%80%D0%BE%D0%BA_2019&amp;diff=2872</id>
		<title>ОС1/Модификације предрок 2019</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%BF%D1%80%D0%B5%D0%B4%D1%80%D0%BE%D0%BA_2019&amp;diff=2872"/>
		<updated>2021-09-11T23:48:52Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: neki glupi test&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
&lt;br /&gt;
Следеће модификације су се појавиле на одбрани пројекта у предроку 2019.&lt;br /&gt;
&lt;br /&gt;
== 20 поена ==&lt;br /&gt;
* Проширити класу &amp;lt;code&amp;gt;Semaphore&amp;lt;/code&amp;gt; статичком методом &amp;lt;code&amp;gt;addOwner()&amp;lt;/code&amp;gt; и нестатичком методом &amp;lt;code&amp;gt;removeOwner(ID id)&amp;lt;/code&amp;gt; које додају и уклањају власнике семафора, респективно.&lt;br /&gt;
* &amp;lt;code&amp;gt;addOwner()&amp;lt;/code&amp;gt; додаје текућу нит као власника. &amp;lt;code&amp;gt;removeOwner(ID id)&amp;lt;/code&amp;gt; уклања нит са задатим &amp;lt;code&amp;gt;ID&amp;lt;/code&amp;gt;- јем уколико је она била власник.&lt;br /&gt;
* Уколико методе &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; позове нит која не припада скупу власника, оне немају ефекта. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Решење ==&lt;br /&gt;
&lt;br /&gt;
Пример теста.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;thread.h&amp;quot;&lt;br /&gt;
#include &amp;quot;intLock.h&amp;quot;&lt;br /&gt;
#include &amp;quot;semaphor.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Semaphore sem(1);&lt;br /&gt;
&lt;br /&gt;
class testThread : public Thread {&lt;br /&gt;
public:&lt;br /&gt;
	testThread(int i) : Thread() { this-&amp;gt;ind = i; }&lt;br /&gt;
	~testThread() { waitToComplete(); }&lt;br /&gt;
&lt;br /&gt;
protected:&lt;br /&gt;
	void run() {&lt;br /&gt;
		if (ind % 2) sem.addOwner();&lt;br /&gt;
		while (1) {&lt;br /&gt;
			if (sem.wait(0) != -1) {&lt;br /&gt;
				intLock&lt;br /&gt;
				printf(&amp;quot;%d Usao u kriticnu sekciju\n&amp;quot;, ind);&lt;br /&gt;
				intUnlock&lt;br /&gt;
                &lt;br /&gt;
				sem.signal();&lt;br /&gt;
&lt;br /&gt;
				intLock&lt;br /&gt;
				printf(&amp;quot;%d Izasao iz kriticne sekcije\n&amp;quot;, ind);&lt;br /&gt;
				intUnlock&lt;br /&gt;
&lt;br /&gt;
				sem.removeOwner(Thread::getRunningId());&lt;br /&gt;
			}&lt;br /&gt;
			else break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
	int ind;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void tick() {}&lt;br /&gt;
&lt;br /&gt;
const int N = 20;&lt;br /&gt;
&lt;br /&gt;
int userMain(int argc, char* argv[]) {&lt;br /&gt;
	testThread *thrs[N];&lt;br /&gt;
&lt;br /&gt;
	for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
		thrs[i] = new testThread(i);&lt;br /&gt;
		thrs[i]-&amp;gt;start();&lt;br /&gt;
	}&lt;br /&gt;
	for (int j = 0; j &amp;lt; N; j++) {&lt;br /&gt;
		delete thrs[j];&lt;br /&gt;
	}&lt;br /&gt;
	printf(&amp;quot;Kraj!\n&amp;quot;);&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>WikiEditor</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_%D1%98%D1%83%D0%BD_2021&amp;diff=2871</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_%D1%98%D1%83%D0%BD_2021&amp;diff=2871"/>
		<updated>2021-09-11T21:37:00Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Следеће модификације су се појавиле на одбрани пројекта у јунском року 2021.&lt;br /&gt;
&lt;br /&gt;
== 20 поена ==&lt;br /&gt;
* Следећа ставка иста је као 1. задатак са другог колоквијума у јунском року 2017. године: Школско језгро треба проширити концептом &#039;&#039;баријере&#039;&#039; (&amp;quot;ограда&amp;quot;, &amp;quot;рампа&amp;quot;, енгл. &#039;&#039;barrier&#039;&#039;) чији је интерфејс дат доле. Семантика овог концепта и операција над њим је следећа:&lt;br /&gt;
** Баријера може бити у једном од два стања: &#039;&#039;отворена&#039;&#039; или &#039;&#039;затворена&#039;&#039;. Баријера се иницијализује задатим стањем (аргумент конструктора). Нит у чијем контексту се креира баријера (тј. извршава конструктор) је њен &#039;&#039;власник&#039;&#039;.&lt;br /&gt;
** &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;void Barrier::pass()&amp;lt;/syntaxhighlight&amp;gt;: уколико позивајућа нит није власник ове баријере, ова операција нема ефекта - нит наставља своје извршавање; уколико је позивајућа нит власник баријере, а баријера затворена, нит се суспендује (блокира) све док се баријера не отвори; ако је баријера отворена, нит наставља извршавање без блокаде;&lt;br /&gt;
** &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;void Barrier::close()&amp;lt;/syntaxhighlight&amp;gt;: затвара баријеру;&lt;br /&gt;
** &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;void Barrier::open()&amp;lt;/syntaxhighlight&amp;gt;: отвара баријеру и евентуално деблокира нит која је на баријери блокирана.&lt;br /&gt;
* Написати јавни тест са две нити A и B. Нит B прави глобални семафор са вредношћу 0 и глобалну баријеру са вредношћу 1, а нит A упослено чека док се они не направе. Нит A треба циклично да позива &amp;lt;code&amp;gt;Barrier::open()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Barrier::pass()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Semaphore::wait(0)&amp;lt;/code&amp;gt;, док нит B треба циклично да позива &amp;lt;code&amp;gt;Barrier::pass()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Barrier::close()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Semaphore::signal()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class Barrier {&lt;br /&gt;
public:&lt;br /&gt;
    Barrier (int open=1);&lt;br /&gt;
    void open();&lt;br /&gt;
    void close();&lt;br /&gt;
    void pass();&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Оквирно решење може се наћи као решење поменутог колоквијума.&lt;br /&gt;
Тест описан текстом задатка.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;quot;thread.h&amp;quot;&lt;br /&gt;
#include &amp;quot;semaphor.h&amp;quot;&lt;br /&gt;
#include &amp;quot;barrier.h&amp;quot;&lt;br /&gt;
#include &amp;quot;intLock.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Semaphore *s = 0;&lt;br /&gt;
Barrier *b = 0;&lt;br /&gt;
Semaphore waiter(0);&lt;br /&gt;
&lt;br /&gt;
class MyA : public Thread {&lt;br /&gt;
public:&lt;br /&gt;
	MyA() : Thread() {}&lt;br /&gt;
	~MyA() { waitToComplete(); }&lt;br /&gt;
protected:&lt;br /&gt;
	void run() {&lt;br /&gt;
		while (s == 0 || b == 0) {}&lt;br /&gt;
&lt;br /&gt;
		while (1) {&lt;br /&gt;
			b-&amp;gt;open();&lt;br /&gt;
			intLock&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;A opened the barrier&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
			intUnlock&lt;br /&gt;
			b-&amp;gt;pass();&lt;br /&gt;
			intLock&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;A passed the barrier&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
			intUnlock&lt;br /&gt;
			s-&amp;gt;wait(0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class MyB : public Thread {&lt;br /&gt;
public:&lt;br /&gt;
	MyB() : Thread() {}&lt;br /&gt;
	~MyB() { waitToComplete(); }&lt;br /&gt;
protected:&lt;br /&gt;
	void run() {&lt;br /&gt;
		s = new Semaphore(0);&lt;br /&gt;
		b = new Barrier(1);&lt;br /&gt;
		while (1) {&lt;br /&gt;
&lt;br /&gt;
			b-&amp;gt;pass();&lt;br /&gt;
			intLock&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;B passed the barrier&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
			intUnlock&lt;br /&gt;
			b-&amp;gt;close();&lt;br /&gt;
			intLock&lt;br /&gt;
			cout &amp;lt;&amp;lt; &amp;quot;B closed the barrier&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
			intUnlock&lt;br /&gt;
			s-&amp;gt;signal();&lt;br /&gt;
			waiter.wait(30);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void tick() {}&lt;br /&gt;
&lt;br /&gt;
int userMain(int argc, char *argv[]) {&lt;br /&gt;
	MyA a;&lt;br /&gt;
	MyB b;&lt;br /&gt;
	a.start();&lt;br /&gt;
	b.start();&lt;br /&gt;
	a.waitToComplete();&lt;br /&gt;
	b.waitToComplete();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 30 поена ==&lt;br /&gt;
* Направити да се након позива &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; као следећа нит за извршавање изабере дете (пре изласка из &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; у родитељској нити). Такође, форсирати да се прво бирају нити без деце.&lt;br /&gt;
* Написати тест пример који тестира задату функционалност. На пример, може да изгледа попут:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int result = Thread::fork();&lt;br /&gt;
if (result != -1) {&lt;br /&gt;
    if (result == 0) {&lt;br /&gt;
        intLock&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Child!&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
        intUnlock&lt;br /&gt;
        Thread::exit();&lt;br /&gt;
    } else {&lt;br /&gt;
        intLock&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Parent!&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
        intUnlock&lt;br /&gt;
        Thread::waitForForkChildren();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
* Решење за бирање детета јесте да се у &amp;lt;code&amp;gt;PCB&amp;lt;/code&amp;gt; дода показивач на дете које је изабрано који се поставља на новонаправљено дете у &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;, проверава да ли је &amp;lt;code&amp;gt;nullptr&amp;lt;/code&amp;gt; у тајмеру (у који се ушло позивом функције &amp;lt;code&amp;gt;dispatch()&amp;lt;/code&amp;gt; унутар функције &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;), ако није онда се нит која је следећа за извршавање поставља на то дете и показивач се враћа на &amp;lt;code&amp;gt;nullptr&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Једно решење за форсирање нити које немају децу јесте да се, уколико се не дешава бирање детета, из &amp;lt;code&amp;gt;Scheduler&amp;lt;/code&amp;gt; ваде нити док се не пронађе нит без деце (која се одмах постави као нит за извршавање) или док се не избаце све нити, ако су извађене нити са децом оне се убацују у другу листу и на крају се враћају назад у &amp;lt;code&amp;gt;Scheduler&amp;lt;/code&amp;gt;. Уколико нит без деце није пронађена, између вађења и враћања нити проверава се да ли је извучена иједна нит без деце и вади се једна нит са децом уколико није.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2017&amp;diff=2841</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%BB_2017&amp;diff=2841"/>
		<updated>2021-08-31T19:59:27Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* isto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2017/jul/Jul%202017.pdf Zadaci sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je hard, a šta soft sistem za rad u realnom vremenu (real-time system)?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tvrdi sistemi za rad u realnom vremenu su sistemi u kojima odziv mora da stigne u određenom vremenu (&#039;&#039;deadline&#039;&#039;). Prekoračenje može dovesti do rezličitih katastrofa. Meki sistemi za rad u realnom vremenu su sistemi kojima je rok bitan ali smeju ga prekoračiti dok god performanse ulaze u zadate okvire.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti značenje mašinske instrukcije tipa &#039;&#039;test-and-set&#039;&#039; i njenu upotrebu u jezgru operativnog sistema.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;code&amp;gt;test_and_set&amp;lt;/code&amp;gt; je instrukcija koja omogućava sinhronizaciju na hardverskom nivou. Služi za međusobno isključenje izvršavanja na više procesora. Ona atomično čita i vraća sadržaj zadate memorijske lokacije, i u tu lokaciju upisuje vrednost 1. Može da se koristi u implementaciji &amp;lt;code&amp;gt;lock()&amp;lt;/code&amp;gt; funkcije.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem školskog jezgra 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 &#039;&#039;n*k&#039;&#039;, tako što svaka nit obrađuje &#039;&#039;k&#039;&#039; elemanata&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; (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;
class ArrThread : Thread {&lt;br /&gt;
    public:&lt;br /&gt;
        ArrThread(int* a, int s, int f): arr(a), start(s), finish(f) {}&lt;br /&gt;
        void run() {&lt;br /&gt;
            for (int i = start; i &amp;lt; finish; i++) {&lt;br /&gt;
                arr[i] *= arr[i];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    private:&lt;br /&gt;
        int* arr;&lt;br /&gt;
        int start;&lt;br /&gt;
        int finish;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    ArrThread* t[n];&lt;br /&gt;
    int start = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        t[i] = new ArrThread(array, start, start + k);&lt;br /&gt;
        start += k;&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        delete t[i];&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;
Videti zadatak iz [[ОС1/Јул 2019#4. zadatak|julskog roka 2019]].&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 ujednom). Obrazloženje ilustrovati primerom.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Linkerov zadatak je da spoji sve fajlove u jedan izvršni, ali da bi to uradio, linker mora naći sve simbole koji se uvoze odnosno izvoze.&lt;br /&gt;
&lt;br /&gt;
U prvom prolazu analizira ulazne fajlove, veličinu njihovog binarnog sadržaja (prevoda), i pravi mapu &#039;&#039;exe&#039;&#039; fajla; osim toga, sakuplja infomacije iz tabela simbola &#039;&#039;obj&#039;&#039; fajlova i izgrađuje svoju tabelu simbola; u tu tabelu simbola unosi izvezene simbole iz &#039;&#039;obj&#039;&#039; fajlova, za koje odmah može da izračuna adresu u odnosu na ceo &#039;&#039;exe&#039;&#039; fajl. U drugom prolazu spaja sve te fajlove u jedan, i ujedno razrešava nerazrešena adresna polja mašinskih instrukcija na osnovu informacija o adresama u koje se preslikavaju simboli iz njegove tabele simbola.&lt;br /&gt;
&lt;br /&gt;
Primer: Recimo da imamo dva objektna fajla, &amp;lt;code&amp;gt;a.obj&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;b.obj&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;a.obj&amp;lt;/code&amp;gt; izvozi simbol &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; i uvozi simbol &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Linker će iz prvog objektnog fajla dodati u tabelu simbol &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;b.obj&amp;lt;/code&amp;gt; uvozi simbol &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; i izvozi simbol &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, pa će linker u svoju tabelu dodati simbol &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. U drugom prolazu će linker razrešiti &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; polje u &amp;lt;code&amp;gt;a.obj&amp;lt;/code&amp;gt; i polje &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; u &amp;lt;code&amp;gt;b.obj&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti uslugu koju program očekuje od operativnog sistema ako koristi preklope (&#039;&#039;overlay&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Obaveza OS-a je samo da obezbedi uslugu (sistemski poziv) koji alocira deo (virtuelnog) adresnog prostora procesa, kao i uslugu kojom u dati prostor procesa učitava sadržaj iz nekog binarnog fajla i sadržaj iz memorije upisuje u neki fajl (uobičajene sistemske usluge za rad sa fajlovima); OS ne zna za šta se te usluge koriste, tj. ne zna da se one upotrebljavaju baš za dinamičko učitavanje i zamenu delova procesa.&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 2543h.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
VA(30) : seg(18) offset(12)&lt;br /&gt;
&lt;br /&gt;
Virtuelna adresa 2543h tj. 0010 | 0101 0100 0011b pripada 2. segmentu koji počinje od fizičke adrese 10000h i završava na 10800h. &lt;br /&gt;
&lt;br /&gt;
Fizička adresa se dobija sabiranjem bazne adrese u fizičkom adresnom prostoru i offsetnog dela virtuelne adrese:&lt;br /&gt;
PA = 10000h + 543h = 10543h.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2021#6. zadatak|junskog roka 2021. godine]].&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2020#7. zadatak|junskog roka 2020. godine]].&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;
Pošto je blok veličine &amp;lt;math&amp;gt;2^{19}B&amp;lt;/math&amp;gt; a adresa &amp;lt;math&amp;gt;2^3B&amp;lt;/math&amp;gt; to znači da u jedan indeks može da stane &amp;lt;math&amp;gt;2^{16}&amp;lt;/math&amp;gt; adresa blokova. Konačan broj bajtova koji je na ovaj način mogu adresirati jeste &amp;lt;math&amp;gt;2^{16} \cdot 2^{16} \cdot 2^{19} = 2^{51}B = 1PB&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2019&amp;diff=2840</id>
		<title>ОС1/Јул 2019</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_2019&amp;diff=2840"/>
		<updated>2021-08-31T19:16:45Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* nema waitToComplete u skolskom jezgru */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2019/jul/Jul%202019.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta se smatra multiprocesorskim računarskim sistemom? Šta je simetričan multiprocesorski sistem?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Multiprocesorski sistem je sistem sa više procesora koji imaju zajedničku memoriju. Simetričan multiprocesorski sistem znači da su svi procesori opšte namene, jednaki i imaju isto vreme pristupa operativnoj memoriji. Asimetrični multiprocesorski sistem ima i specijalizovane procesore ili procesore sa različitim vremenom pristupa memoriji.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki procesor prilikom obrade prekida prebacuje svoje izvršavanje na korišćenje posebnog pokazivača steka koji se koristi u privilegovanom režimu rada, i pritom čuva sve registre na steku na čiji vrh ukazuje ovaj pokazivač. Operativni sistem na ovom procesoru koristi samo jedan sistemski stek za izvršavanje celog kernel koda. Da li se kontekst izvršavanja procesa (kontekst procesora) može čuvati na ovom steku?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem niti u školskom jezgru napisati funkciju &amp;lt;code&amp;gt;sum&amp;lt;/code&amp;gt; koja kreira nit koja će sabrati sve elemente zadatog niza zadate dužine i rezultat upisati na traženo mesto; u slučaju greške ove funkcije vraćaju negativnu vrednost.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int sum (int array[], size_t size, long* result);&amp;lt;/syntaxhighlight&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;
class SumThread {&lt;br /&gt;
    public:&lt;br /&gt;
        SumThread(int* arr, size_t _size, long* res): array(arr), size(_size), result(res) {}&lt;br /&gt;
        void run() {&lt;br /&gt;
            long res = 0;&lt;br /&gt;
            for (size_t i = 0; i &amp;lt; size; i++) {&lt;br /&gt;
                res += array[i];&lt;br /&gt;
            }&lt;br /&gt;
            *result = res;&lt;br /&gt;
        }&lt;br /&gt;
    private:&lt;br /&gt;
        int* array;&lt;br /&gt;
        size_t size;&lt;br /&gt;
        long* result;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int sum (int array[], size_t size, long* result) {&lt;br /&gt;
    if (result == nullptr) return -1;&lt;br /&gt;
    SumThread* st = new SumThread(array, size, result);&lt;br /&gt;
    st-&amp;gt;start();&lt;br /&gt;
    delete st;&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;
Napisati pseudokod koji obezbeđuje međusobno isključenje pristupa kritičnoj sekciji dva procesa pomoću Petersonovog algoritma.&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;
process P1&lt;br /&gt;
begin&lt;br /&gt;
    loop&lt;br /&gt;
        flag1 := true;&lt;br /&gt;
        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;
process P2&lt;br /&gt;
begin&lt;br /&gt;
    loop&lt;br /&gt;
        flag2 := true;&lt;br /&gt;
        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;
Zbog čega operativni sistem ne radi zamenu (&#039;&#039;swapping&#039;&#039;) procesa njegovim izbacivanjem iz memorije prilikom svake promene konteksta, kada procesu koji je izgubio procesor memorija svakako nije potrebna?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Zato što je pristup hard disku vrlo spor te će takva implementacija znatno uticati na performanse. Ovo se primenjivalo na &#039;&#039;[[wikipedia:Windows 3.1|Windows 3.1]]&#039;&#039;, i bilo je vrlo sporo. Danas, &#039;&#039;swapping&#039;&#039; se koristi kada nema dovoljno mesta u operativnoj memoriji.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je kompakcija kod kontinualne alokacije memorije?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kod kontinualne alokacije može doći do eksterne fragmentacije, odnosno da su slobodni fragmenti toliko mali da ni jedan proces ne može stati na tom delu, ali zbirno ih ima dovoljno za neki procos. Kompakcija rešava taj problem realokacijom svih zauzetih delova i spajanjem svih slobodnih fragmenata u jedan veliki slobodan fragment. Dok se dešava kompakcija, nijedan proces koji se pomera se ne može izvršavati.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelni adresni prostor je velične 8GB, a adresibilna jedinica je 16-bitna reč. Stranica je veličine 4KB, a preslikavanje je u dva nivoa, s tim da PMT prvog nivoa ima dva puta manje ulaza nego PMT drugog nivoa. Prikazati strukturu virtuelne adrese i označiti širinu svakog polja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
VA(32): Page1(10), Page2(11), Offset(11)&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti tipične usluge operativnog sistema vezane za pristup blokovski orijentisanom ulaznom uređaju sa direktnim pristupom i predložiti potpise odgovarajućih funkcija za te sistemske pozive.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Osnovne usluge jesu pisanje i čitanje.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int readBlock(int fd, BlockNo block, void* buffer);&lt;br /&gt;
int writeBlock(int fd, BlockNo block, void* buffer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti koncept ACL (&#039;&#039;access control list&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Da bi se fajlovi zaštitili, jedan način je da se ograniče prava pristupa korisnika. Potrebno je definisati koji korisnik (ili grupa korisnika) može da izvršava koju operaciju. Jedan pristup je svakom fajlu pridružiti listu ovih parova (korisnik i operacija). Takva lista je lista kontrole pristupa (ACL).&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Fajl sistem primenjuje FAT alokaciju, s tim da se i slobodni blokovi ulančavaju u listu. U strukturi FCB polje &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; sadrži broj prvog bloka sa sadržajem fajla, a polje &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; veličinu sadržaja. Globalna promenljiva &amp;lt;code&amp;gt;fat_free_head&amp;lt;/code&amp;gt; sadrži broj prvog bloka (glavu liste), a &amp;lt;code&amp;gt;fat_free_tail&amp;lt;/code&amp;gt; poslednjeg bloka (rep liste) u lancu slobodnih. FAT je u memoriju učitana kao niz. Napisati funkciju jezgra &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt; koja briše sadržaj fajla na čiji FCB ukazuje argument.&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;
const unsigned long FAT_SIZE = ...;&lt;br /&gt;
unsigned long FAT[FAT_SIZE];&lt;br /&gt;
&lt;br /&gt;
void truncate(FCB* file) {&lt;br /&gt;
    unsigned long b = file-&amp;gt;head;&lt;br /&gt;
    for (unsigned long i = 0; i &amp;lt; file-&amp;gt;size; ++i) {&lt;br /&gt;
        unsigned long next = FAT[b];&lt;br /&gt;
        FAT[b] = 0;&lt;br /&gt;
        // Ovde se smatra da fat_free_tail pokazuje na blok 0 kada nema slobodnih blokova.&lt;br /&gt;
        if (fat_free_tail) {&lt;br /&gt;
            FAT[fat_free_tail] = b;&lt;br /&gt;
            fat_free_tail = b;&lt;br /&gt;
        } else {&lt;br /&gt;
            fat_free_head = b;&lt;br /&gt;
            fat_free_tail = b;&lt;br /&gt;
        }&lt;br /&gt;
        b = next;&lt;br /&gt;
    }&lt;br /&gt;
    file-&amp;gt;size = 0;&lt;br /&gt;
    file-&amp;gt;head = 0;&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>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2017&amp;diff=2838</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%BB_2017&amp;diff=2838"/>
		<updated>2021-08-30T16:21:38Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* Izmena resenja ako moze jos neko da proveri da nisam pogresila izmenom */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2017/jul/Jul%202017.pdf Zadaci sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je hard, a šta soft sistem za rad u realnom vremenu (real-time system)?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tvrdi sistemi za rad u realnom vremenu su sistemi u kojima odziv mora da stigne u određenom vremenu (&#039;&#039;deadline&#039;&#039;). Prekoračenje može dovesti do rezličitih katastrofa. Meki sistemi za rad u realnom vremenu su sistemi kojima je rok bitan ali smeju ga prekoračiti dok god performanse ulaze u zadate okvire.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti značenje mašinske instrukcije tipa &#039;&#039;test-and-set&#039;&#039; i njenu upotrebu u jezgru operativnog sistema.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;code&amp;gt;test_and_set&amp;lt;/code&amp;gt; je instrukcija koja omogućava sinhronizaciju na hardverskom nivou. Služi za međusobno isključenje izvršavanja na više procesora. Ona atomično čita i vraća sadržaj zadate memorijske lokacije, i u tu lokaciju upisuje vrednost 1. Može da se koristi u implementaciji &amp;lt;code&amp;gt;lock()&amp;lt;/code&amp;gt; funkcije.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem školskog jezgra 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 &#039;&#039;n*k&#039;&#039;, tako što svaka nit obrađuje &#039;&#039;k&#039;&#039; elemanata&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; (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;
class ArrThread : Thread {&lt;br /&gt;
    public:&lt;br /&gt;
        ArrThread(int* a, int s, int f): arr(a), start(s), finish(f) {}&lt;br /&gt;
        void run() {&lt;br /&gt;
            for (int i = start; i &amp;lt; finish; i++) {&lt;br /&gt;
                arr[i] *= arr[i];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    private:&lt;br /&gt;
        int* arr;&lt;br /&gt;
        int start;&lt;br /&gt;
        int finish;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    ArrThread* t[n];&lt;br /&gt;
    int start = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        t[i] = new ArrThread(array, start, start + k);&lt;br /&gt;
        start += k;&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        t[i]-&amp;gt;waitToComplete();&lt;br /&gt;
        delete t[i];&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;
Videti zadatak iz [[ОС1/Јул 2019#4. zadatak|julskog roka 2019]].&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 ujednom). Obrazloženje ilustrovati primerom.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Linkerov zadatak je da spoji sve fajlove u jedan izvršni, ali da bi to uradio, linker mora naći sve simbole koji se uvoze odnosno izvoze.&lt;br /&gt;
&lt;br /&gt;
U prvom prolazu analizira ulazne fajlove, veličinu njihovog binarnog sadržaja (prevoda), i pravi mapu &#039;&#039;exe&#039;&#039; fajla; osim toga, sakuplja infomacije iz tabela simbola &#039;&#039;obj&#039;&#039; fajlova i izgrađuje svoju tabelu simbola; u tu tabelu simbola unosi izvezene simbole iz &#039;&#039;obj&#039;&#039; fajlova, za koje odmah može da izračuna adresu u odnosu na ceo &#039;&#039;exe&#039;&#039; fajl. U drugom prolazu spaja sve te fajlove u jedan, i ujedno razrešava nerazrešena adresna polja mašinskih instrukcija na osnovu informacija o adresama u koje se preslikavaju simboli iz njegove tabele simbola.&lt;br /&gt;
&lt;br /&gt;
Primer: Recimo da imamo dva objektna fajla, &amp;lt;code&amp;gt;a.obj&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;b.obj&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;a.obj&amp;lt;/code&amp;gt; izvozi simbol &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; i uvozi simbol &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Linker će iz prvog objektnog fajla dodati u tabelu simbol &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;b.obj&amp;lt;/code&amp;gt; uvozi simbol &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; i izvozi simbol &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, pa će linker u svoju tabelu dodati simbol &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; i razrešiti polje &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; u &amp;lt;code&amp;gt;b.obj&amp;lt;/code&amp;gt; u prvom prolazu. U drugom prolazu će linker razrešiti &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; polje u &amp;lt;code&amp;gt;a.obj&amp;lt;/code&amp;gt;, što nije mogao da odradi bez dva prolaza.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti uslugu koju program očekuje od operativnog sistema ako koristi preklope (&#039;&#039;overlay&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Obaveza OS-a je samo da obezbedi uslugu (sistemski poziv) koji alocira deo (virtuelnog) adresnog prostora procesa, kao i uslugu kojom u dati prostor procesa učitava sadržaj iz nekog binarnog fajla i sadržaj iz memorije upisuje u neki fajl (uobičajene sistemske usluge za rad sa fajlovima); OS ne zna za šta se te usluge koriste, tj. ne zna da se one upotrebljavaju baš za dinamičko učitavanje i zamenu delova procesa.&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 2543h.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
VA(30) : seg(18) offset(12)&lt;br /&gt;
&lt;br /&gt;
Virtuelna adresa 2543h tj. 0010 | 0101 0100 0011b pripada 2. segmentu koji počinje od fizičke adrese 10000h i završava na 10800h. &lt;br /&gt;
&lt;br /&gt;
Fizička adresa se dobija sabiranjem bazne adrese u fizičkom adresnom prostoru i offsetnog dela virtuelne adrese:&lt;br /&gt;
PA = 10000h + 543h = 10543h.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2021#6. zadatak|junskog roka 2021. godine]].&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2020#7. zadatak|junskog roka 2020. godine]].&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;
Pošto je blok veličine &amp;lt;math&amp;gt;2^{19}B&amp;lt;/math&amp;gt; a adresa &amp;lt;math&amp;gt;2^3B&amp;lt;/math&amp;gt; to znači da u jedan indeks može da stane &amp;lt;math&amp;gt;2^{16}&amp;lt;/math&amp;gt; adresa blokova. Konačan broj bajtova koji je na ovaj način mogu adresirati jeste &amp;lt;math&amp;gt;2^{16} \cdot 2^{16} \cdot 2^{19} = 2^{51}B = 1PB&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</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_2020&amp;diff=2802</id>
		<title>ОС1/Октобар 2020</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_2020&amp;diff=2802"/>
		<updated>2021-08-24T20:53:34Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* mislim da je falilo mutex polje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2020/oktobar/Okt%202020.pdf Zadaci sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem makroa &amp;lt;code&amp;gt;test_and_set&amp;lt;/code&amp;gt; koji u svojoj implementaciji izvršava odgovarajuću instrukciju procesora tipa &#039;&#039;test-and-set&#039;&#039;, implementirati međusobno isključenje kritične sekcije za višeprocesorski pristup.&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;
// Globalna&lt;br /&gt;
bool lock;&lt;br /&gt;
&lt;br /&gt;
// Ulazak u kritičnu sekciju&lt;br /&gt;
while (test_and_set(&amp;amp;lock));&lt;br /&gt;
// Kritična sekcija&lt;br /&gt;
lock = false;&lt;br /&gt;
// ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora implementirati klasu sa dve operacije, &#039;&#039;tick&#039;&#039; i &#039;&#039;tock&#039;&#039;, tako da se one mogu izvršavati iz konkurentnih procesa međusobno isključivo i samo u sledećem poretku: &#039;&#039;tick&#039;&#039;, &#039;&#039;tick&#039;&#039;, &#039;&#039;tock&#039;&#039;, &#039;&#039;tick&#039;&#039;, &#039;&#039;tick&#039;&#039;, &#039;&#039;tock&#039;&#039;...&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;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Clock {&lt;br /&gt;
    public:&lt;br /&gt;
        Clock() : tickSem(0), tockSem(2), mutex(1),&lt;br /&gt;
                  allowedTock(false) {}&lt;br /&gt;
        void tick();&lt;br /&gt;
        void tock();&lt;br /&gt;
        bool allowedTock;&lt;br /&gt;
    private:&lt;br /&gt;
        Semaphore tickSem;&lt;br /&gt;
        Semaphore tockSem;&lt;br /&gt;
        Semaphore mutex;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void Clock::tick() {&lt;br /&gt;
    tockSem.wait();&lt;br /&gt;
    mutex.wait();&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;tick&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    if (allowedTock) {&lt;br /&gt;
        tickSem.signal();&lt;br /&gt;
    }&lt;br /&gt;
    allowedTock = !allowedTock;&lt;br /&gt;
    mutex.signal();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Clock::tock() {&lt;br /&gt;
    tickSem.wait();&lt;br /&gt;
    mutex.wait();&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;tock&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    tockSem.signal();&lt;br /&gt;
    tockSem.signal();&lt;br /&gt;
    mutex.signal();&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;
U definiciji semantike jezika C++ piše da pokušaj indirektnog upisa u objekat konstantnog tipa (označen kao &amp;lt;code&amp;gt;const&amp;lt;/code&amp;gt;), recimo preko pokazivača na nekonstantu, ima „nedefinisan efekat“, što zapravo znači da se ostavlja mogućnost da različite implementacije prevodioca i različite platforme (hardver i OS) ovakve situacije tretiraju na različite načine. Navesti i precizno objasniti kakve tačno efekte ovakav upis može da ima i na koji način dolazi do tih efekata.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# Može da se desi da prevodilac više konstanti iste vrednosti alocira na istom mestu (kao što na primer postoji &#039;&#039;string pool&#039;&#039; u Javi) pa se upisom u jednu konstantu menjaju i sve ostale.&lt;br /&gt;
# Može da se desi da se te konstante čuvaju na stranici koja nije dozvoljena za upis (stranica sa kodom) pa se prilikom tog upisa generiše greška u pristupu stranici i operativni sistem ugasi proces.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu sa straničnom organizacijom virtuelne memorije virtuelna i fizička adresa su 30-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 prvih 256 i poslednjih 256 stranica? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* VA(30): Page1(7) Page2(7) Offset(16)&lt;br /&gt;
* PA(30): Frame(14) Offset(16)&lt;br /&gt;
Pošto se iz jednog PMT može adresirati ukupno &amp;lt;math&amp;gt;2^7&amp;lt;/math&amp;gt; ulaza u PMT, i svaki ulaz zauzima &amp;lt;math&amp;gt;2^2B&amp;lt;/math&amp;gt;, to znači da jedan PMT ukupno zauzima &amp;lt;math&amp;gt;2^9B&amp;lt;/math&amp;gt;. Za adresiranje 256 stranica potrebno je dva PMT drugog nivoa, tako da se ukupno stvara 5 PMT, i ukupna zauzeta veličina je &amp;lt;math&amp;gt;5 * 2^9 = 2.5KB&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Da li je drajver uređaja (&#039;&#039;device driver&#039;&#039;) softverska ili hardverska komponenta računara? Ako je softverska, da li je komponenta operativnog sistema ili korisničkog programa? Ako je hardverska, da li je komponenta vezana za funkcionisanje operativne memorije ili ulazno/izlaznog uređaja?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Drajver je softverska komponenta koja može ali ne mora biti deo operativnog sistema (npr. mikrokernelski operativni sistemi) i služi za standardizovanu komunikaciju sa ulaznim i izlaznim uređajima. Drajvere obično proizvode proizvođači uređaja za koji su ti drajveri pravljeni i obično se pokreću u privilegovanom režimu (ali to ne mora biti slučaj).&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti koncept „tvrde veze“ (&#039;&#039;hard link&#039;&#039;) u fajl sistemu koji podržava strukture direktorijuma tipa usmerenog acikličkog grafa (DAG).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tvrda veza je veza na datoteku koja služi tome da održava datoteku u fajl sistemu, jer dok god postoje tvrde veze na neku datoteku ona i dalje postoji, i kad se sve tvrde veze obrišu ona prestaje da postoji.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kako se kod FAT fajl sistema implementira evidencija slobodnih blokova?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kod FAT fajl sistema se u FAT tabeli mogu ulančavati slobodni blokovi, ili jednostavno biti označeni posebnim &#039;&#039;null&#039;&#039; vrednostima.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2021&amp;diff=2801</id>
		<title>ОС1/Јул 2021</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_2021&amp;diff=2801"/>
		<updated>2021-08-24T17:38:12Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: dopune&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.rs/OS1/rokovi/2021/jul/Jul%202021.pdf Zadaci na stranici predmeta.] Svi zadaci vrede 3 poena.&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je &#039;&#039;preotimanje procesora&#039;&#039; (engl. &#039;&#039;preemption&#039;&#039;) i koji hardverski mehanizam ga omogućuje? Šta se postiže uvođenjem ove tehnike u računarske sisteme?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* &#039;&#039;&#039;Preotimanje procesora&#039;&#039;&#039; je prekidanje izvršavanja jednog procesa na procesoru da bi se izvršio kernel kod ili neki drugi proces.&lt;br /&gt;
* &#039;&#039;&#039;Mehanizam prekida&#039;&#039;&#039; omogućuje preotimanje procesora - procesor dobija signal da prekine trenutni proces i pređe na kod kernela. Preotimanjem se postiže multiprogramiranje sa boljom raspodelom vremena i vremenom odziva. &lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je potpis jednog sistemskog poziva na sistemima nalik sistemu Unix. Kratko, ali prezino objasniti šta radi ovaj sistemski poziv i značenje svakog parametra i rezultata.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt; je sistemski poziv koji mapira fajl ili uređaj u memoriju. Značenja parametara:&lt;br /&gt;
* &amp;lt;code&amp;gt;void *addr&amp;lt;/code&amp;gt; je (željena) početna adresa mapiranja. Ukoliko je &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, operativni sistem sam bira početnu adresu.&lt;br /&gt;
* &amp;lt;code&amp;gt;size_t length&amp;lt;/code&amp;gt; je dužina mapirane memorije&lt;br /&gt;
* &amp;lt;code&amp;gt;int prot&amp;lt;/code&amp;gt; je fleg koji označava dozvoljene načine pristupa mapiranoj memoriji (da li sme da se čita, upisuje, izvršava) i mora se slagati sa načinom pristupa fajla.&lt;br /&gt;
* &amp;lt;code&amp;gt;int flags&amp;lt;/code&amp;gt; je fleg koji označava da li je mapirana memorija vidljiva ostalim procesima koji mapiraju isti fajl, da li se promene u memoriji upisuju u fajl itd.&lt;br /&gt;
* &amp;lt;code&amp;gt;int fd&amp;lt;/code&amp;gt; je ručka fajla&lt;br /&gt;
* &amp;lt;code&amp;gt;off_t offset&amp;lt;/code&amp;gt; je pomeraj od početka fajla od kojeg se vrši mapiranje&lt;br /&gt;
Ukoliko je poziv uspešan, vraća se void pokazivač na memoriju koja je mapirana.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta se postiže tehnikom “kopiranja pri upisu” kod upravljanja memorijom? Kratko, ali precizno objasniti način rada ove tehnike.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tehnikom &#039;&#039;copy-on-write&#039;&#039; postiže se &#039;&#039;&#039;ušteda memorije&#039;&#039;&#039;, tako što se memorija koja se koristi u više procesa ne kopira dok je jedan proces ne promeni. Implementira se tako što se deskriptor logičkog segmenta koji se deli između procesa označi kao dozvoljen za upis, ali u ulazu PMT-a kao zabranjen za upis. U situaciju kada se desi upis, hardver generiše izuzetak koji se obrađuje od strane OS-a. OS zaključuje da se radi o kopiranju pri upisu iz deskriptora logičkog segmenta i vrši kopiranje, usmeravanje PMT-a drugog procesa na kopiju i u deskriptorima stranica obe kopije dozvoljava upis. &lt;br /&gt;
&lt;br /&gt;
== 4. 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; 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;
&amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; u kontekstu roditelja vraća pravi &amp;lt;code&amp;gt;pid&amp;lt;/code&amp;gt; deteta, a u kontekstu deteta vraća 0. Odgovor je 4: &amp;lt;code&amp;gt;child1&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;child3&amp;lt;/code&amp;gt; u &#039;&#039;parent&#039;&#039;, &amp;lt;code&amp;gt;child2&amp;lt;/code&amp;gt; u &#039;&#039;child1&#039;&#039; i &amp;lt;code&amp;gt;child1&amp;lt;/code&amp;gt; u &#039;&#039;child3&#039;&#039;.&lt;br /&gt;
[[Датотека:OS1 jul 2021 4. zadatak objašnjenje.svg|оквир|центар|Objašnjenje]]&lt;br /&gt;
&lt;br /&gt;
== 5. 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 (engl. &#039;&#039;race condition&#039;&#039;). (Dati kod samo jednog procesa sa međusobnim isključenjem pomoću ovog algoritma.)&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Petersonov algoritam:&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pretpostavimo da algoritam ne obezbeđuje međusobno isključenje. Ako algoritam NE obezbeđuje međusobno isključenje, dogodiće se situacija da su oba procesa ušla u kritičnu sekciju. Ako se to desilo, to znači da su oba uslova petlji uposlenog čekanja &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Pošto oba procesa odmah pred ulazak u petlju postavljaju svoj &amp;lt;code&amp;gt;flag&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, jedini način da uslov za petlju bude netačan je da uslov sa &amp;lt;code&amp;gt;turn&amp;lt;/code&amp;gt; bude netačan, a pošto su oba uslova netačna, to bi značilo da promenljiva &amp;lt;code&amp;gt;turn&amp;lt;/code&amp;gt; nema ni vrednost 1 ni vrednost 2. Pošto promenljivu &amp;lt;code&amp;gt;turn&amp;lt;/code&amp;gt; koriste samo ova dva procesa i samo postavljaju vrednost na 1 ili 2, do ovoga nikako ne može doći. Time dobijamo kontradikciju na početnu pretpostavku i dobijamo da algoritam zaista omogućava međusobno isključenje.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je &#039;&#039;simbolička veza&#039;&#039; (&#039;&#039;symbolic link&#039;&#039;, &#039;&#039;soft link&#039;&#039;) u fajl sistemu? Kako se ona implementira? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&#039;&#039;&#039;Simbolička veza&#039;&#039;&#039; je veza do nekog fajla u fajl sistemu koja se ne ažurira automatski. Implementira se kao &#039;&#039;&#039;fajl sa posebnim tretmanom&#039;&#039;&#039; od strane operativnog sistema i u sebi sadrži apsolutnu i relativnu putanju do nekog fajla u fajl sistemu. Razlikuje se od tvrde veze tako što ne pokazuje direktno do FCB-a i može da postane prekinuta tj. landarava, ako se &#039;&#039;target&#039;&#039; fajl premesti ili preimenuje.&lt;br /&gt;
&lt;br /&gt;
== 7. 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 16 TB sa blokom veličine 512B.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* 16 TB = 2&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; * 2&amp;lt;sup&amp;gt;40&amp;lt;/sup&amp;gt; B = 2&amp;lt;sup&amp;gt;44&amp;lt;/sup&amp;gt; B.&lt;br /&gt;
* 2&amp;lt;sup&amp;gt;44&amp;lt;/sup&amp;gt; B / 512 B = 2&amp;lt;sup&amp;gt;44&amp;lt;/sup&amp;gt; B / 2&amp;lt;sup&amp;gt;9&amp;lt;/sup&amp;gt; = 2&amp;lt;sup&amp;gt;35&amp;lt;/sup&amp;gt; blokova.&lt;br /&gt;
* 2&amp;lt;sup&amp;gt;35&amp;lt;/sup&amp;gt; / 8 bita u B = 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt; = 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; * 2&amp;lt;sup&amp;gt;30&amp;lt;/sup&amp;gt; = &#039;&#039;&#039;4 GB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2021&amp;diff=2800</id>
		<title>ОС1/Јун 2021</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_2021&amp;diff=2800"/>
		<updated>2021-08-24T14:02:04Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* fork -&amp;gt; pid valjda */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2021/jun/Jun%202021.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je sistemski poziv, a šta sistemski program?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Sistemski poziv je određena funkcionalnost koju operativni sistem pruža korisničkim programima. Korisnički programi mogu pozvati sistemski poziv, često korišćenjem mehanizma softverskih prekida, kako bi od operativnog sistema zatražili neke osnovne usluge kojima najčešće iz korisničkog režima i nemaju pristup. Primer sistemskog poziva bi bio &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; na &#039;&#039;Unix-like&#039;&#039; sistemima.&lt;br /&gt;
&lt;br /&gt;
Sistemski program je program koji obavlja osnovne operacije sa korisničkim sistemom, na primer brisanje fajlova (&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; na &#039;&#039;Unix-like&#039;&#039; sistemima).&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta su nedostaci organizacije memorije sa particijama?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Pojavljuje se interna fragmentacija, jer ako procesu ne treba ceo svoj memorijski prostor onda je rezervisani deo prostora koji taj proces ne koristi bespotrebno bačen.&lt;br /&gt;
* Balansira se između veličine adresnog prostora jednog procesa i ukupnog broja procesa.&lt;br /&gt;
* Stepen multiprogramiranja (broj aktivnih procesa koji su u memoriji i koji se mogu uporedo izvršavati) je ograničen brojem particija.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korisnik nekog računara radi u veb pregledaču (&#039;&#039;web browser&#039;&#039;) u kom je otvorio veliki broj kartica (&#039;&#039;tab&#039;&#039;) u kojima pregleda različite sajtove. Primetio je da mu se računar ponaša neobično, da sporo reaguje na akcije (ima veliko vreme odziva), da sporo prikazuje sadržaj stranica itd.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &#039;&#039;Precizno&#039;&#039; objasniti zašto se ovo dešava.&lt;br /&gt;
# Korisnik je dalje primetio da kada zatvori većinu kartica i ostavi svega dve-tri, računar se ne ponaša ništa bolje. Ali kada ugasi ceo pregledač, računar se ponovo ponaša valjano. &#039;&#039;Precizno&#039;&#039; objasniti uzrok oba ova ponšaanja&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Veb pregledači obično za svaki tab pokrenu odvojenu nit, tako da se sa više tabova češće dešava promena konteksta. Pored toga, veće je zauzeće memorije, i može da se dešava da se sve stranice u fizičkom adresnom prostoru potroše pa mora da se radi zamena stranica, što zahteva spore operacije upisa i čitanja sa spoljašnje memorije i više promašaja keša, a može doći i do batrganja.&lt;br /&gt;
# Moguće je da pretraživač ne oslobodi sve resurse koje je zauzeo, pa se gašenjem tabova ne oslobodi korišćena memorija. Kada se ugasi ceo proces, operativni sistem će osloboditi sve resurse koje je proces koristio pa će moći da nastavi sa normalnijim radom.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. 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.&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;
        // Korisnička greška.&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pid_t pid = fork();&lt;br /&gt;
    if (pid &amp;lt; 0) {&lt;br /&gt;
        // Nije uspeo fork().&lt;br /&gt;
        return -2;&lt;br /&gt;
    } else if (pid == 0) {&lt;br /&gt;
        char* args[] = {argv[0], argv[1]};&lt;br /&gt;
        execlp(argv[0], args);&lt;br /&gt;
        // Nije uspeo execlp().&lt;br /&gt;
        return -3;&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;
== 5. 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:&lt;br /&gt;
* A: upisuje vrednost u deljene promenljive &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, a zatim čeka da proces B upiše zbir &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; u promenljivu &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; čiju vrednost onda ispisuje na standardni izlaz;&lt;br /&gt;
* B: čeka da proces A upiše vrednosti u deljene promenljive &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, zatim ove dve vrednosti sabira i zbir upisuje u deljenu promenljivu &amp;lt;code&amp;gt;z&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;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Semaphore waitA(0);&lt;br /&gt;
Semaphore waitB(0);&lt;br /&gt;
&lt;br /&gt;
class A : public Thread {&lt;br /&gt;
public:&lt;br /&gt;
    virtual void run() {&lt;br /&gt;
        while (true) {&lt;br /&gt;
            x = 1;&lt;br /&gt;
            y = 2;&lt;br /&gt;
            waitA.signal();&lt;br /&gt;
            waitB.wait();&lt;br /&gt;
            std::cout &amp;lt;&amp;lt; z &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class B : public Thread {&lt;br /&gt;
public:&lt;br /&gt;
    virtual void run() {&lt;br /&gt;
        while (true) {&lt;br /&gt;
            waitA.wait();&lt;br /&gt;
            z = x + y;&lt;br /&gt;
            waitB.signal();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    A a;&lt;br /&gt;
    B b;&lt;br /&gt;
    a.start();&lt;br /&gt;
    b.start();&lt;br /&gt;
    a.join();&lt;br /&gt;
    b.join();&lt;br /&gt;
    return 0;&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;
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;
Tehnikom &#039;&#039;spooling&#039;&#039; se nedeljevi uređaj može učiniti virtuelno deljivim, i klasičan primer takvog uređaja je štampač.&lt;br /&gt;
&lt;br /&gt;
== 7. 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;
Maksimalna veličina fajla se dostiže kada svi ulazi u indeks prvog nivoa pokazuju na indekse drugog nivoa, a svi indeksi drugog nivoa pokazuju na zauzete blokove. Indeksi prvog i drugog nivoa su veličine jednog bloka, tako da se broj ulaza u indeksu dobija deljenjem veličine bloka (&amp;lt;math&amp;gt;256KB = 2^{18}B&amp;lt;/math&amp;gt;) i veličine ulaza (&amp;lt;math&amp;gt;64b = 8B = 2^3B&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;\frac{2^{18}B}{2^3B} = 2^{15}&amp;lt;/math&amp;gt;. To znači da je moguće adresirati &amp;lt;math&amp;gt;2^{15}&amp;lt;/math&amp;gt; indeksa drugog nivoa, i iz svakog indeksa drugog nivoa adresirati &amp;lt;math&amp;gt;2^{15}&amp;lt;/math&amp;gt; blokova, a u svakom bloku ima &amp;lt;math&amp;gt;2^{18}B&amp;lt;/math&amp;gt;, tako da je krajnja maksimalna veličina jednaka &amp;lt;math&amp;gt;2^{15+15+18} = 2^{48} = 256TB&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2021&amp;diff=2799</id>
		<title>ОС1/Јун 2021</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_2021&amp;diff=2799"/>
		<updated>2021-08-24T13:49:29Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* dopuna */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2021/jun/Jun%202021.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je sistemski poziv, a šta sistemski program?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Sistemski poziv je određena funkcionalnost koju operativni sistem pruža korisničkim programima. Korisnički programi mogu pozvati sistemski poziv, često korišćenjem mehanizma softverskih prekida, kako bi od operativnog sistema zatražili neke osnovne usluge kojima najčešće iz korisničkog režima i nemaju pristup. Primer sistemskog poziva bi bio &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; na &#039;&#039;Unix-like&#039;&#039; sistemima.&lt;br /&gt;
&lt;br /&gt;
Sistemski program je program koji obavlja osnovne operacije sa korisničkim sistemom, na primer brisanje fajlova (&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; na &#039;&#039;Unix-like&#039;&#039; sistemima).&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta su nedostaci organizacije memorije sa particijama?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Pojavljuje se interna fragmentacija, jer ako procesu ne treba ceo svoj memorijski prostor onda je rezervisani deo prostora koji taj proces ne koristi bespotrebno bačen.&lt;br /&gt;
* Balansira se između veličine adresnog prostora jednog procesa i ukupnog broja procesa.&lt;br /&gt;
* Stepen multiprogramiranja (broj aktivnih procesa koji su u memoriji i koji se mogu uporedo izvršavati) je ograničen brojem particija.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korisnik nekog računara radi u veb pregledaču (&#039;&#039;web browser&#039;&#039;) u kom je otvorio veliki broj kartica (&#039;&#039;tab&#039;&#039;) u kojima pregleda različite sajtove. Primetio je da mu se računar ponaša neobično, da sporo reaguje na akcije (ima veliko vreme odziva), da sporo prikazuje sadržaj stranica itd.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &#039;&#039;Precizno&#039;&#039; objasniti zašto se ovo dešava.&lt;br /&gt;
# Korisnik je dalje primetio da kada zatvori većinu kartica i ostavi svega dve-tri, računar se ne ponaša ništa bolje. Ali kada ugasi ceo pregledač, računar se ponovo ponaša valjano. &#039;&#039;Precizno&#039;&#039; objasniti uzrok oba ova ponšaanja&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Veb pregledači obično za svaki tab pokrenu odvojenu nit, tako da se sa više tabova češće dešava promena konteksta. Pored toga, veće je zauzeće memorije, i može da se dešava da se sve stranice u fizičkom adresnom prostoru potroše pa mora da se radi zamena stranica, što zahteva spore operacije upisa i čitanja sa spoljašnje memorije i više promašaja keša, a može doći i do batrganja.&lt;br /&gt;
# Moguće je da pretraživač ne oslobodi sve resurse koje je zauzeo, pa se gašenjem tabova ne oslobodi korišćena memorija. Kada se ugasi ceo proces, operativni sistem će osloboditi sve resurse koje je proces koristio pa će moći da nastavi sa normalnijim radom.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. 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.&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;
        // Korisnička greška.&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pid_t pid = fork();&lt;br /&gt;
    if (fork &amp;lt; 0) {&lt;br /&gt;
        // Nije uspeo fork().&lt;br /&gt;
        return -2;&lt;br /&gt;
    } else if (fork == 0) {&lt;br /&gt;
        char* args[] = {argv[0], argv[1]};&lt;br /&gt;
        execlp(argv[0], args);&lt;br /&gt;
        // Nije uspeo execlp().&lt;br /&gt;
        return -3;&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;
== 5. 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:&lt;br /&gt;
* A: upisuje vrednost u deljene promenljive &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, a zatim čeka da proces B upiše zbir &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; u promenljivu &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; čiju vrednost onda ispisuje na standardni izlaz;&lt;br /&gt;
* B: čeka da proces A upiše vrednosti u deljene promenljive &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, zatim ove dve vrednosti sabira i zbir upisuje u deljenu promenljivu &amp;lt;code&amp;gt;z&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;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Semaphore waitA(0);&lt;br /&gt;
Semaphore waitB(0);&lt;br /&gt;
&lt;br /&gt;
class A : public Thread {&lt;br /&gt;
public:&lt;br /&gt;
    virtual void run() {&lt;br /&gt;
        while (true) {&lt;br /&gt;
            x = 1;&lt;br /&gt;
            y = 2;&lt;br /&gt;
            waitA.signal();&lt;br /&gt;
            waitB.wait();&lt;br /&gt;
            std::cout &amp;lt;&amp;lt; z &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class B : public Thread {&lt;br /&gt;
public:&lt;br /&gt;
    virtual void run() {&lt;br /&gt;
        while (true) {&lt;br /&gt;
            waitA.wait();&lt;br /&gt;
            z = x + y;&lt;br /&gt;
            waitB.signal();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    A a;&lt;br /&gt;
    B b;&lt;br /&gt;
    a.start();&lt;br /&gt;
    b.start();&lt;br /&gt;
    a.join();&lt;br /&gt;
    b.join();&lt;br /&gt;
    return 0;&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;
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;
Tehnikom &#039;&#039;spooling&#039;&#039; se nedeljevi uređaj može učiniti virtuelno deljivim, i klasičan primer takvog uređaja je štampač.&lt;br /&gt;
&lt;br /&gt;
== 7. 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;
Maksimalna veličina fajla se dostiže kada svi ulazi u indeks prvog nivoa pokazuju na indekse drugog nivoa, a svi indeksi drugog nivoa pokazuju na zauzete blokove. Indeksi prvog i drugog nivoa su veličine jednog bloka, tako da se broj ulaza u indeksu dobija deljenjem veličine bloka (&amp;lt;math&amp;gt;256KB = 2^{18}B&amp;lt;/math&amp;gt;) i veličine ulaza (&amp;lt;math&amp;gt;64b = 8B = 2^3B&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;\frac{2^{18}B}{2^3B} = 2^{15}&amp;lt;/math&amp;gt;. To znači da je moguće adresirati &amp;lt;math&amp;gt;2^{15}&amp;lt;/math&amp;gt; indeksa drugog nivoa, i iz svakog indeksa drugog nivoa adresirati &amp;lt;math&amp;gt;2^{15}&amp;lt;/math&amp;gt; blokova, a u svakom bloku ima &amp;lt;math&amp;gt;2^{18}B&amp;lt;/math&amp;gt;, tako da je krajnja maksimalna veličina jednaka &amp;lt;math&amp;gt;2^{15+15+18} = 2^{48} = 256TB&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2017&amp;diff=2783</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%BB_2017&amp;diff=2783"/>
		<updated>2021-08-19T15:25:35Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: Rešenje 7. zadatka ako nisam nesto pogrešila&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2017/jul/Jul%202017.pdf Zadaci sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je hard, a šta soft sistem za rad u realnom vremenu (real-time system)?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tvrdi sistemi za rad u realnom vremenu su sistemi u kojima odziv mora da stigne u određenom vremenu (&#039;&#039;deadline&#039;&#039;). Prekoračenje može dovesti do rezličitih katastrofa. Meki sistemi za rad u realnom vremenu su sistemi kojima je rok bitan ali smeju ga prekoračiti dok god performanse ulaze u zadate okvire.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti značenje mašinske instrukcije tipa &#039;&#039;test-and-set&#039;&#039; i njenu upotrebu u jezgru operativnog sistema.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;code&amp;gt;test_and_set&amp;lt;/code&amp;gt; je instrukcija koja omogućava sinhronizaciju na hardverskom nivou. Služi za međusobno isključenje izvršavanja na više procesora. Ona atomično čita i vraća sadržaj zadate memorijske lokacije, i u tu lokaciju upisuje vrednost 1. Može da se koristi u implementaciji &amp;lt;code&amp;gt;lock()&amp;lt;/code&amp;gt; funkcije.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem školskog jezgra 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 &#039;&#039;n*k&#039;&#039;, tako što svaka nit obrađuje &#039;&#039;k&#039;&#039; elemanata&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; (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;
class ArrThread : Thread {&lt;br /&gt;
    public:&lt;br /&gt;
        ArrThread(int* a, int s, int f): arr(a), start(s), finish(f) {}&lt;br /&gt;
        void run() {&lt;br /&gt;
            for (int i = start; i &amp;lt; finish; i++) {&lt;br /&gt;
                arr[i] *= arr[i];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    private:&lt;br /&gt;
        int* arr;&lt;br /&gt;
        int start;&lt;br /&gt;
        int finish;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    ArrThread* t[n];&lt;br /&gt;
    int start = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        t[i] = new ArrThread(array, start, start + k);&lt;br /&gt;
        start += k;&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        t[i]-&amp;gt;waitToComplete();&lt;br /&gt;
        delete t[i];&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;
Videti zadatak iz [[ОС1/Јул 2019#4. zadatak|julskog roka 2019]].&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 ujednom). Obrazloženje ilustrovati primerom.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Linkerov zadatak je da spoji sve fajlove u jedan izvršni, ali da bi to uradio, linker mora naći sve simbole koji se uvoze odnosno izvoze.&lt;br /&gt;
&lt;br /&gt;
U prvom prolazu analizira ulazne fajlove, veličinu njihovog binarnog sadržaja (prevoda), i pravi mapu &#039;&#039;exe&#039;&#039; fajla; osim toga, sakuplja infomacije iz tabela simbola &#039;&#039;obj&#039;&#039; fajlova i izgrađuje svoju tabelu simbola; u tu tabelu simbola unosi izvezene simbole iz &#039;&#039;obj&#039;&#039; fajlova, za koje odmah može da izračuna adresu u odnosu na ceo &#039;&#039;exe&#039;&#039; fajl. U drugom prolazu spaja sve te fajlove u jedan, i ujedno razrešava nerazrešena adresna polja mašinskih instrukcija na osnovu informacija o adresama u koje se preslikavaju simboli iz njegove tabele simbola.&lt;br /&gt;
&lt;br /&gt;
Primer: Recimo da imamo dva objektna fajla, &amp;lt;code&amp;gt;a.obj&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;b.obj&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;a.obj&amp;lt;/code&amp;gt; izvozi simbol &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; i uvozi simbol &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Linker će iz prvog objektnog fajla dodati u tabelu simbol &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;b.obj&amp;lt;/code&amp;gt; uvozi simbol &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; i izvozi simbol &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, pa će linker u svoju tabelu dodati simbol &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. U drugom prolazu će linker razrešiti &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; polje u &amp;lt;code&amp;gt;a.obj&amp;lt;/code&amp;gt; i polje &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; u &amp;lt;code&amp;gt;b.obj&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti uslugu koju program očekuje od operativnog sistema ako koristi preklope (&#039;&#039;overlay&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Obaveza OS-a je samo da obezbedi uslugu (sistemski poziv) koji alocira deo (virtuelnog) adresnog prostora procesa, kao i uslugu kojom u dati prostor procesa učitava sadržaj iz nekog binarnog fajla i sadržaj iz memorije upisuje u neki fajl (uobičajene sistemske usluge za rad sa fajlovima); OS ne zna za šta se te usluge koriste, tj. ne zna da se one upotrebljavaju baš za dinamičko učitavanje i zamenu delova procesa.&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 2543h.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
VA(30) : seg(18) offset(12)&lt;br /&gt;
&lt;br /&gt;
Virtuelna adresa 2543h tj. 0010 | 0101 0100 0011b pripada 2. segmentu koji počinje od fizičke adrese 10000h i završava na 10800h. &lt;br /&gt;
&lt;br /&gt;
Fizička adresa se dobija sabiranjem bazne adrese u fizičkom adresnom prostoru i offsetnog dela virtuelne adrese:&lt;br /&gt;
PA = 10000h + 543h = 10543h.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2021#6. zadatak|junskog roka 2021. godine]].&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2020#7. zadatak|junskog roka 2020. godine]].&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;
Pošto je blok veličine &amp;lt;math&amp;gt;2^{19}B&amp;lt;/math&amp;gt; a adresa &amp;lt;math&amp;gt;2^6B&amp;lt;/math&amp;gt; to znači da u jedan indeks može da stane &amp;lt;math&amp;gt;2^{13}&amp;lt;/math&amp;gt; adresa blokova. Konačan broj bajtova koji je na ovaj način mogu adresirati jeste &amp;lt;math&amp;gt;2^{13} \cdot 2^{13} \cdot 2^{19} = 2^{45}B = 32TB&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2020&amp;diff=2782</id>
		<title>ОС1/Јул 2020</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_2020&amp;diff=2782"/>
		<updated>2021-08-19T13:27:19Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* 2^2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2020/jul/Jul%202020.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na asembleru nekog zamišljenog RISC procesora sa &#039;&#039;load/store&#039;&#039; arhitekturom napisati program koji vrši prenos bloka podataka iz memorije na izlazni uređaj tehnikom programiranog izlaza korišćenjem prozivanja (&#039;&#039;polling&#039;&#039;). Samostalno usvojiti potrebne detaljne pretpostavke.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pretpostavke:&lt;br /&gt;
* Memorija se prenosi sa adrese 1000h&lt;br /&gt;
* Ulazno/izlazni i adresni prostor su razdvojeni&lt;br /&gt;
* Kontrolni registar uređaja je na FF00h, registar podataka na FF01h a statusni registar na FF02h&lt;br /&gt;
* Adresiranje je bajtovsko&lt;br /&gt;
* Blok je veličine 100h bajtova&lt;br /&gt;
* Registri su veličine 16 bita i kad se čita ili piše iz memorije ili na uređaj koristi se najnižih 8 bita&lt;br /&gt;
* Najniži bit kontrolnog registra je bit &#039;&#039;Start&#039;&#039;, najniži bit statusnog registra je bit &#039;&#039;Ready&#039;&#039;&lt;br /&gt;
* Periferija automatski postaje nespremna za upis sledećeg podatka kada se u nju upiše podatak koji se još nije preneo&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
        load r0, #1000h             ; adresa&lt;br /&gt;
        load r1, #100h              ; brojač&lt;br /&gt;
        load r2, #0                 ; nula&lt;br /&gt;
        load r3, #1                 ; privremeni registar&lt;br /&gt;
        out FF00h, r3               ; pokrećemo periferiju&lt;br /&gt;
loop:   in FF02h, r3                ; čitamo statusni registar&lt;br /&gt;
        and r3, r3, #1              ; proveravamo ready bit&lt;br /&gt;
        jz loop                     ; ako je ready = 0 čitamo ponovo&lt;br /&gt;
        load r3, (r0)               ; učitavamo podatak iz memorije&lt;br /&gt;
        out FF01h, r3               ; šaljemo podatak na periferiju&lt;br /&gt;
        inc r0                      ; inkrementiramo adresu&lt;br /&gt;
        dec r1                      ; dekrementiramo brojač (postavlja se PSW)&lt;br /&gt;
        jnz loop                    ; ako brojač != 0 vraćamo se na čekanje&lt;br /&gt;
        load r3, #0                 ; gasimo periferiju&lt;br /&gt;
        out FF00h, r3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem školskog jezgra napisati kod klase koja apstrahuje nit koja, ukoliko se kreira sa neparnim celobrojnim parametrom, kreira još jednu takvu istu nit, samo sa za jedan manjim istim celobrojnim parametrom (sve dok ne stigne do 0), a u suprotnom se samo završava.&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;
class ForkThread : public Thread {&lt;br /&gt;
    public:&lt;br /&gt;
        ForkThread(unsigned n) : n(n) {}&lt;br /&gt;
        virtual void run();&lt;br /&gt;
    private:&lt;br /&gt;
        unsigned n;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void ForkThread::run() {&lt;br /&gt;
    if (n % 2) {&lt;br /&gt;
        ForkThread thr(n-1);&lt;br /&gt;
        thr.start();&lt;br /&gt;
        thr.join();&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;
U nekom sistemu primenjuje se &#039;&#039;best-fit&#039;&#039; algoritam kontinualne alokacije memorije. Inicijalno je prostor veličine 512KB potpuno slobodan za alokaciju korisničkih procesa. Potom su različiti procesi zadavali sledeće zahteve (slovna oznaka označava proces koji je postavio zahtev, brojna oznaka označava veličinu alociranog prostora u KB, a minus označava gašenje procesa i oslobađanje njegove memorije):&lt;br /&gt;
: A128, B32, C256, D64, A-, E16, F64, B-&lt;br /&gt;
Odgovoriti na sledeća pitanja koja se odnose na stanje memorije nakon ove sekvence zahteva:&lt;br /&gt;
# Koliko je ukupno slobodnih fragmenata?&lt;br /&gt;
# Kolika je veličina najmanjeg slobodnog fragmenta?&lt;br /&gt;
# Kolika je veličina najvećeg slobodnog fragmenta?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Po koracima, alokacija memorije će izgledati ovako (jedno slovo = 16KB):&lt;br /&gt;
 AAAAAAAABBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 --------BBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 --------BBCCCCCCCCCCCCCCCCDDDDE-&lt;br /&gt;
 FFFF----BBCCCCCCCCCCCCCCCCDDDDE-&lt;br /&gt;
 FFFF------CCCCCCCCCCCCCCCCDDDDE-&lt;br /&gt;
# 2 su slobodna fragmenta.&lt;br /&gt;
# Najmanji slobodan fragment je 16KB.&lt;br /&gt;
# Najveći slobodan fragment je 96KB.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelna memorija organizovana je stranično, a adresibilna jedinica je bajt. Virtuelna adresa je 32-bitna, stranica je veličine 4KB, PMT je organizovana u dva nivoa, deskriptor stranice je 32-bitni u tabelama oba nivoa, pri čemu je polje za straničenje prvog nivoa veličine 8 bita. Koliki prostor bi ukupno zauzimala PMT nekog procesa kada bi taj proces:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# koristio ceo svoj virtuelni adresni prostor?&lt;br /&gt;
# alocirao samo jedan logički segment veličine samo jedne stranice?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Adresa ima strukturu VA(32): Page1(8) Page2(12) Offset(12). PMT prvog nivoa ima &amp;lt;math&amp;gt;2^8&amp;lt;/math&amp;gt; ulaza, a PMT drugog nivoa &amp;lt;math&amp;gt;2^{12}&amp;lt;/math&amp;gt;, i oba imaju ulaze veličine &amp;lt;math&amp;gt;2^2&amp;lt;/math&amp;gt; bajtova.&lt;br /&gt;
* &amp;lt;math&amp;gt;2^8 * 2^{12} * 2^2 + 2^8 * 2^2 = 2^{22} + 2^{10} = 4M + 1K&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^8 * 2^2 + 2^{12} * 2^2 = 2^{10} + 2^{14} = 1K + 16K = 17K&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Umesto tehnike &#039;&#039;spooling&#039;&#039;, pristup uporednih procesa štampaču u nekom sistemu omogućuje se međusobnim isključenjem pomoću operacije rezervacije: svaki proces, pre nego što zatraži bilo koju operaciju sa štampačem, mora da ga rezerviše, a tu rezervaciju otpušta tek kada završi sa celim jednim poslom štampe. Šta je nedostatak ove tehnike?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Nedostatak ove tehnike je što se procesi dok čekaju na štampač blokiraju, a za to vreme su mogli da rade nešto korisnije.&lt;br /&gt;
&lt;br /&gt;
== 6. 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;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;FHANDLE open(char* filename)&amp;lt;/syntaxhighlight&amp;gt; Otvara fajl sa datim imenom.&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void close(FHANDLE)&amp;lt;/syntaxhighlight&amp;gt; Zatvara dati fajl.&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;int size(FHANDLE)&amp;lt;/syntaxhighlight&amp;gt; Vraća trenutnu veličinu sadržaja fajla u znakovima.&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void append(FHANDLE, int)&amp;lt;/syntaxhighlight&amp;gt; Proširuje sadržaj fajla za dati broj znakova na kraju.&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void seek(FHANDLE, int)&amp;lt;/syntaxhighlight&amp;gt; Postavlja kurzor datog fajla na datu poziciju (redni broj znaka počev od 0).&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void write(FHANDLE, char*)&amp;lt;/syntaxhighlight&amp;gt; Na poziciju kurzora datog fajla upisuje dati niz znakova, ne uključujući završni znak ‘\0’, i pomera kurzor iza upisanog niza znakova.&lt;br /&gt;
Napisati program koji na kraj postojećeg fajla sa imenom &amp;lt;code&amp;gt;proba.txt&amp;lt;/code&amp;gt; upisuje sve što je uneseno preko standardnog ulaza, sve dok se na ulazu ne unese znak ’X’. Zanemariti sve potencijalne greške u ulazu/izlazu.&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(void) {&lt;br /&gt;
    FHANDLE file = open(&amp;quot;proba.txt&amp;quot;);&lt;br /&gt;
    seek(file, size(file));&lt;br /&gt;
    char buf[2];&lt;br /&gt;
    buf[1] = &#039;\0&#039;;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        buf[0] = getchar();&lt;br /&gt;
        if (buf[0] == &#039;X&#039;) {&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        append(file, 1);&lt;br /&gt;
        write(file, buf);&lt;br /&gt;
    }&lt;br /&gt;
    close(file);&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;
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;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# FAT, pri čemu je FAT uvek inicijalno učitana u memoriju prilikom montiranja fajl sistema,&lt;br /&gt;
# indeksna, pri čemu je ceo indeks fajla u jednom bloku, a broj tog bloka zapisan je u FCB koji je učitan prilikom otvaranja fajla?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# 1, jer je FAT već u memoriji pa se samo treba pristupiti bloku koji je tražen.&lt;br /&gt;
# 2, jedan da se pročita blok sa indeksom i jedan da se pristupi bloku koji je tražen.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</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_2020&amp;diff=2781</id>
		<title>ОС1/Октобар 2020</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_2020&amp;diff=2781"/>
		<updated>2021-08-19T12:53:01Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* 32b = 2^3B*/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2020/oktobar/Okt%202020.pdf Zadaci sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem makroa &amp;lt;code&amp;gt;test_and_set&amp;lt;/code&amp;gt; koji u svojoj implementaciji izvršava odgovarajuću instrukciju procesora tipa &#039;&#039;test-and-set&#039;&#039;, implementirati međusobno isključenje kritične sekcije za višeprocesorski pristup.&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;
// Globalna&lt;br /&gt;
bool lock;&lt;br /&gt;
&lt;br /&gt;
// Ulazak u kritičnu sekciju&lt;br /&gt;
while (test_and_set(&amp;amp;lock));&lt;br /&gt;
// Kritična sekcija&lt;br /&gt;
lock = false;&lt;br /&gt;
// ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora implementirati klasu sa dve operacije, &#039;&#039;tick&#039;&#039; i &#039;&#039;tock&#039;&#039;, tako da se one mogu izvršavati iz konkurentnih procesa međusobno isključivo i samo u sledećem poretku: &#039;&#039;tick&#039;&#039;, &#039;&#039;tick&#039;&#039;, &#039;&#039;tock&#039;&#039;, &#039;&#039;tick&#039;&#039;, &#039;&#039;tick&#039;&#039;, &#039;&#039;tock&#039;&#039;...&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;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Clock {&lt;br /&gt;
    public:&lt;br /&gt;
        Clock() : tickSem(0), tockSem(2), mutex(1),&lt;br /&gt;
                  allowedTock(false) {}&lt;br /&gt;
        void tick();&lt;br /&gt;
        void tock();&lt;br /&gt;
        bool allowedTock;&lt;br /&gt;
    private:&lt;br /&gt;
        Semaphore tickSem;&lt;br /&gt;
        Semaphore tockSem;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void Clock::tick() {&lt;br /&gt;
    tockSem.wait();&lt;br /&gt;
    mutex.wait();&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;tick&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    if (allowedTock) {&lt;br /&gt;
        tickSem.signal();&lt;br /&gt;
    }&lt;br /&gt;
    allowedTock = !allowedTock;&lt;br /&gt;
    mutex.signal();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Clock::tock() {&lt;br /&gt;
    tickSem.wait();&lt;br /&gt;
    mutex.wait();&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;tock&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    tockSem.signal();&lt;br /&gt;
    tockSem.signal();&lt;br /&gt;
    mutex.signal();&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;
U definiciji semantike jezika C++ piše da pokušaj indirektnog upisa u objekat konstantnog tipa (označen kao &amp;lt;code&amp;gt;const&amp;lt;/code&amp;gt;), recimo preko pokazivača na nekonstantu, ima „nedefinisan efekat“, što zapravo znači da se ostavlja mogućnost da različite implementacije prevodioca i različite platforme (hardver i OS) ovakve situacije tretiraju na različite načine. Navesti i precizno objasniti kakve tačno efekte ovakav upis može da ima i na koji način dolazi do tih efekata.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# Može da se desi da prevodilac više konstanti iste vrednosti alocira na istom mestu (kao što na primer postoji &#039;&#039;string pool&#039;&#039; u Javi) pa se upisom u jednu konstantu menjaju i sve ostale.&lt;br /&gt;
# Može da se desi da se te konstante čuvaju na stranici koja nije dozvoljena za upis (stranica sa kodom) pa se prilikom tog upisa generiše greška u pristupu stranici i operativni sistem ugasi proces.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu sa straničnom organizacijom virtuelne memorije virtuelna i fizička adresa su 30-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 prvih 256 i poslednjih 256 stranica? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* VA(30): Page1(7) Page2(7) Offset(16)&lt;br /&gt;
* PA(30): Frame(14) Offset(16)&lt;br /&gt;
Pošto se iz jednog PMT može adresirati ukupno &amp;lt;math&amp;gt;2^7&amp;lt;/math&amp;gt; ulaza u PMT, i svaki ulaz zauzima &amp;lt;math&amp;gt;2^3B&amp;lt;/math&amp;gt;, to znači da jedan PMT ukupno zauzima &amp;lt;math&amp;gt;2^{10}B&amp;lt;/math&amp;gt;. Za adresiranje 256 stranica potrebno je dva PMT drugog nivoa, tako da se ukupno stvara 5 PMT, i ukupna zauzeta veličina je &amp;lt;math&amp;gt;5 * 2^{10} = 5KB&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Da li je drajver uređaja (&#039;&#039;device driver&#039;&#039;) softverska ili hardverska komponenta računara? Ako je softverska, da li je komponenta operativnog sistema ili korisničkog programa? Ako je hardverska, da li je komponenta vezana za funkcionisanje operativne memorije ili ulazno/izlaznog uređaja?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Drajver je softverska komponenta koja može ali ne mora biti deo operativnog sistema (npr. mikrokernelski operativni sistemi) i služi za standardizovanu komunikaciju sa ulaznim i izlaznim uređajima. Drajvere obično proizvode proizvođači uređaja za koji su ti drajveri pravljeni i obično se pokreću u privilegovanom režimu (ali to ne mora biti slučaj).&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti koncept „tvrde veze“ (&#039;&#039;hard link&#039;&#039;) u fajl sistemu koji podržava strukture direktorijuma tipa usmerenog acikličkog grafa (DAG).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tvrda veza je veza na datoteku koja služi tome da održava datoteku u fajl sistemu, jer dok god postoje tvrde veze na neku datoteku ona i dalje postoji, i kad se sve tvrde veze obrišu ona prestaje da postoji.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kako se kod FAT fajl sistema implementira evidencija slobodnih blokova?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kod FAT fajl sistema se u FAT tabeli mogu ulančavati slobodni blokovi, ili jednostavno biti označeni posebnim &#039;&#039;null&#039;&#039; vrednostima.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2021&amp;diff=2780</id>
		<title>ОС1/Јул 2021</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_2021&amp;diff=2780"/>
		<updated>2021-08-19T12:18:24Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* tajpo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.rs/OS1/rokovi/2021/jul/Jul%202021.pdf Zadaci na stranici predmeta.] Svi zadaci vrede 3 poena.&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je &#039;&#039;preotimanje procesora&#039;&#039; (engl. &#039;&#039;preemption&#039;&#039;) i koji hardverski mehanizam ga omogućuje? Šta se postiže uvođenjem ove tehnike u računarske sisteme?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* &#039;&#039;&#039;Preotimanje procesora&#039;&#039;&#039; je prekidanje izvršavanja jednog procesa na procesu da bi se izvršio kernel kod ili neki drugi proces.&lt;br /&gt;
* &#039;&#039;&#039;Mehanizam prekida&#039;&#039;&#039; omogućuje preotimanje procesora - procesor dobija signal da prekine trenutni proces i pređe na kod kernela. Preotimanjem se postiže multiprocesiranje sa boljom raspodelom vremena i vremenom odziva. &lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je potpis jednog sistemskog poziva na sistemima nalik sistemu Unix. Kratko, ali prezino objasniti šta radi ovaj sistemski poziv i značenje svakog parametra i rezultata.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt; je sistemski poziv koji mapira fajl ili uređaj u memoriju. Značenja parametara:&lt;br /&gt;
* &amp;lt;code&amp;gt;void *addr&amp;lt;/code&amp;gt; je (željena) početna adresa mapiranja. Ukoliko je &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, operativni sistem sam bira početnu adresu.&lt;br /&gt;
* &amp;lt;code&amp;gt;size_t length&amp;lt;/code&amp;gt; je dužina mapirane memorije&lt;br /&gt;
* &amp;lt;code&amp;gt;int prot&amp;lt;/code&amp;gt; je fleg koji označava dozvoljene načine pristupa mapiranoj memoriji (da li sme da se čita, upisuje, izvršava) i mora se slagati sa načinom pristupa fajla.&lt;br /&gt;
* &amp;lt;code&amp;gt;int flags&amp;lt;/code&amp;gt; je fleg koji označava da li je mapirana memorija vidljiva ostalim procesima koji mapiraju isti fajl, da li se promene u memoriji upisuju u fajl itd.&lt;br /&gt;
* &amp;lt;code&amp;gt;int fd&amp;lt;/code&amp;gt; je ručka fajla&lt;br /&gt;
* &amp;lt;code&amp;gt;off_t offset&amp;lt;/code&amp;gt; je pomeraj od početka fajla od kojeg se vrši mapiranje&lt;br /&gt;
Ukoliko je poziv uspešan, vraća se void pokazivač na memoriju koja je mapirana.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta se postiže tehnikom “kopiranja pri upisu” kod upravljanja memorijom? Kratko, ali precizno objasniti način rada ove tehnike.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tehnikom &#039;&#039;copy-on-write&#039;&#039; postiže se &#039;&#039;&#039;ušteda memorije&#039;&#039;&#039;, tako što se memorija koja se koristi u više procesa ne kopira dok je jedan proces ne promeni. Implementira se tako što se u deskriptor logičkog segemtna koja se deli između procesa označi kao dozvoljen za upis, ali u ulazu PMT-a kao zabranjen za upis. U situaciju kada se desi upis, hardver generiše izuzetak koji se obrađuje od strane OS-a. OS zaključuje da se radi o kopiranju pri upisu iz deskriptora logičkog segmenta i vrši kopiranje, usmeravanje PMT-a drugog procesa na kopiju i u deskriptorima stranica obe kopije dozvoljava upis. &lt;br /&gt;
&lt;br /&gt;
== 4. 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; 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;
&amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt; u kontekstu roditelja vraća pravi &amp;lt;code&amp;gt;pid&amp;lt;/code&amp;gt; deteta, a u kontekstu deteta vraća 0. Odgovor je 4: &amp;lt;code&amp;gt;child1&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;child3&amp;lt;/code&amp;gt; u &#039;&#039;parent&#039;&#039;, &amp;lt;code&amp;gt;child2&amp;lt;/code&amp;gt; u &#039;&#039;child1&#039;&#039; i &amp;lt;code&amp;gt;child1&amp;lt;/code&amp;gt; u &#039;&#039;child3&#039;&#039;.&lt;br /&gt;
[[Датотека:OS1 jul 2021 4. zadatak objašnjenje.svg|оквир|центар|Objašnjenje]]&lt;br /&gt;
&lt;br /&gt;
== 5. 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 (engl. &#039;&#039;race condition&#039;&#039;). (Dati kod samo jednog procesa sa međusobnim isključenjem pomoću ovog algoritma.)&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Petersonov algoritam:&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pretpostavimo da algoritam ne obezbeđuje međusobno isključenje. Ako algoritam NE obezbeđuje međusobno isključenje, dogodiće se situacija da su oba procesa ušla u kritičnu sekciju. Ako se to desilo, to znači da su oba uslova petlji uposlenog čekanja &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Pošto oba procesa odmah pred ulazak u petlju postavljaju svoj &amp;lt;code&amp;gt;flag&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, jedini način da uslov za petlju bude netačan je da uslov sa &amp;lt;code&amp;gt;turn&amp;lt;/code&amp;gt; bude netačan, a pošto su oba uslova netačna, to bi značilo da promenljiva &amp;lt;code&amp;gt;turn&amp;lt;/code&amp;gt; nema ni vrednost 1 ni vrednost 2. Pošto promenljivu &amp;lt;code&amp;gt;turn&amp;lt;/code&amp;gt; koriste samo ova dva procesa i samo postavljaju vrednost na 1 ili 2, do ovoga nikako ne može doći. Time dobijamo kontradikciju na početnu pretpostavku i dobijamo da algoritam zaista omogućava međusobno isključenje.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je &#039;&#039;simbolička veza&#039;&#039; (&#039;&#039;symbolic link&#039;&#039;, &#039;&#039;soft link&#039;&#039;) u fajl sistemu? Kako se ona implementira? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&#039;&#039;&#039;Simbolička veza&#039;&#039;&#039; je veza do nekog fajla u fajl sistemu koja se ne ažurira automatski. Implementira se kao &#039;&#039;&#039;fajl sa posebnim tretmanom&#039;&#039;&#039; od strane operativnog sistema i u sebi sadrži apsolutnu i relativnu putanju do nekog fajla u fajl sistemu. Razlikuje se od tvrde veze tako što ne pokazuje direktno do FCB-a i može da postane prekinuta tj. landarava.&lt;br /&gt;
&lt;br /&gt;
== 7. 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 16 TB sa blokom veličine 512B.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* 16 TB = 2&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; * 2&amp;lt;sup&amp;gt;40&amp;lt;/sup&amp;gt; B = 2&amp;lt;sup&amp;gt;44&amp;lt;/sup&amp;gt; B.&lt;br /&gt;
* 2&amp;lt;sup&amp;gt;44&amp;lt;/sup&amp;gt; B / 512 B = 2&amp;lt;sup&amp;gt;44&amp;lt;/sup&amp;gt; B / 2&amp;lt;sup&amp;gt;9&amp;lt;/sup&amp;gt; = 2&amp;lt;sup&amp;gt;35&amp;lt;/sup&amp;gt; blokova.&lt;br /&gt;
* 2&amp;lt;sup&amp;gt;35&amp;lt;/sup&amp;gt; / 8 bita u B = 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt; = 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; * 2&amp;lt;sup&amp;gt;30&amp;lt;/sup&amp;gt; = &#039;&#039;&#039;4 GB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2132</id>
		<title>Вероватноћа и статистика/Јун 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2132"/>
		<updated>2021-06-20T13:12:51Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* sad je oki */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Испитни део - Статистика ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека су Х и Y независне случајне променљиве са &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелом и нека важи за случајне променљиве U и V важи U = 2X + 4Y, V = X - Y. Одредити коефицијент корелације за &amp;lt;math&amp;gt;\rho (U, V)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;-0.316&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека случајна променљива Х има расподелу &amp;lt;math&amp;gt;Bin(100, p)&amp;lt;/math&amp;gt;) са вероватноћом успеха p, 0 &amp;lt; p &amp;lt; 1. На основу узорка 34, 28, 47, 38, 53 броја реализованих успеха наћи оцену непознатог параметра p користећи метод максималне веродостпојности.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{2}{5}&amp;lt;/math&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
1) Дати дефиницију карактеристичне функције случајне променљиве Х.&lt;br /&gt;
&lt;br /&gt;
2) Дати исказ теореме која описује особину карактеристичне функције збира две случајне променљиве.&lt;br /&gt;
&lt;br /&gt;
3) Нека су Х и Y независне случајне променљиве, где Х има &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелу, а Y је дата законом расподеле&lt;br /&gt;
&amp;lt;math&amp;gt;Y : \left(\begin{array}{ll}&lt;br /&gt;
    1 &amp;amp; 2 \\&lt;br /&gt;
    0.5 &amp;amp; 0.5 \\&lt;br /&gt;
\end{array}\right)&amp;lt;/math&amp;gt;. Доказати да случајна променљива Z = X + Y има &amp;lt;math&amp;gt;Unif(1, 3)&amp;lt;/math&amp;gt; расподелу.&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Број студената на предавањима је случајна променљива са &amp;lt;math&amp;gt;Poiss(36)&amp;lt;/math&amp;gt; расподелом. &lt;br /&gt;
1) Колико треба да има места у учионици да би са вероватноћом бар 99% сви присутни студенти могли да седе? &lt;br /&gt;
&lt;br /&gt;
2) Која апроксимација је коришћена под 1)? Објаснити како се дошло до те апроскимације.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Минималан број места је 50. Коришћена је апроксимација Пуасонове расподеле нормалном &amp;lt;math&amp;gt;N(36, 36)&amp;lt;/math&amp;gt; расподелом.&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
На основу узорка обима 121 из &amp;lt;math&amp;gt;N(\mu, \sigma^2)&amp;lt;/math&amp;gt; расподеле добијено је &amp;lt;math&amp;gt;\hat{\mu} = 1.2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s^2 = 2.25&amp;lt;/math&amp;gt;. Тестираати хипотезу &amp;lt;math&amp;gt;H_0: \mu = 1&amp;lt;/math&amp;gt; против алтернативне хипотезе &amp;lt;math&amp;gt;H_1: \mu &amp;gt; 1&amp;lt;/math&amp;gt; са нивоом значајности 0.05. Објаснити поступак.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Хипотеза &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; се не одбацује.&lt;br /&gt;
[[Категорија:Вероватноћа_и_статистика]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2129</id>
		<title>Вероватноћа и статистика/Јун 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2129"/>
		<updated>2021-06-20T13:08:42Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* sredite samo ovaj deo pliz */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Испитни део - Статистика ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека су Х и Y независне случајне променљиве са &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелом и нека важи за случајне променљиве U и V важи U = 2X + 4Y, V = X - Y. Одредити коефицијент корелације за &amp;lt;math&amp;gt;\rho (U, V)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;-0.316&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека случајна променљива Х има расподелу &amp;lt;math&amp;gt;Bin(100, p)&amp;lt;/math&amp;gt;) са вероватноћом успеха p, 0 &amp;lt; p &amp;lt; 1. На основу узорка 34, 28, 47, 38, 53 броја реализованих успеха наћи оцену непознатог параметра p користећи метод максималне веродостпојности.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{2}{5}&amp;lt;/math&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
1) Дати дефиницију карактеристичне функције случајне променљиве Х.&lt;br /&gt;
&lt;br /&gt;
2) Дати исказ теореме која описује особину карактеристичне функције збира две случајне променљиве.&lt;br /&gt;
&lt;br /&gt;
3) Нека су Х и Y независне случајне променљиве, где Х има &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелу, а Y је дата са законом расподеле&lt;br /&gt;
&amp;lt;math&amp;gt; \left \( \begin{tabular}{ccc} 1 &amp;amp; 2 \\  0.5 &amp;amp; 0.5 \\ \end{tabular} \right \) &amp;lt;/math&amp;gt;  (0.5, 2 0.5). Доказати да случајна променљива Z = X + Y има &amp;lt;math&amp;gt;Unif(1, 3)&amp;lt;/math&amp;gt; расподелу.&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Број студената на предавањима је случајна променљива са &amp;lt;math&amp;gt;Poiss(36)&amp;lt;/math&amp;gt; расподелом. &lt;br /&gt;
1) Колико треба да има места у учионици да би са вероватноћом бар 99% сви присутни студенти могли да седе? &lt;br /&gt;
&lt;br /&gt;
2) Која апроксимација је коришћена под 1)? Објаснити како се дошло до те апроскимације.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Минималан број места је 50. Коришћена је апроксимација Пуасонове расподеле нормалном &amp;lt;math&amp;gt;N(36, 36)&amp;lt;/math&amp;gt; расподелом.&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
На основу узорка обима 121 из &amp;lt;math&amp;gt;N(\mu, \sigma^2)&amp;lt;/math&amp;gt; расподеле добијено је &amp;lt;math&amp;gt;\hat{\mu} = 1.2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s^2 = 2.25&amp;lt;/math&amp;gt;. Тестираати хипотезу &amp;lt;math&amp;gt;H_0: \mu = 1&amp;lt;/math&amp;gt; против алтернативне хипотезе &amp;lt;math&amp;gt;H_1: \mu &amp;gt; 1&amp;lt;/math&amp;gt; са нивоом значајности 0.05. Објаснити поступак.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Хипотеза &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; се не одбацује.&lt;br /&gt;
[[Категорија:Вероватноћа_и_статистика]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2126</id>
		<title>Вероватноћа и статистика/Јун 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2126"/>
		<updated>2021-06-20T12:59:14Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* Испитни део - Статистика */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Испитни део - Статистика ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека су Х и Y независне случајне променљиве са &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелом и нека важи за случајне променљиве U и V важи U = 2X + 4Y, V = X - Y. Одредити коефицијент корелације за &amp;lt;math&amp;gt;\rho (U, V)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;-0.316&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека случајна променљива Х има расподелу &amp;lt;math&amp;gt;Bin(100, p)&amp;lt;/math&amp;gt;) са вероватноћом успеха p, 0 &amp;lt; p &amp;lt; 1. На основу узорка 34, 28, 47, 38, 53 броја реализованих успеха наћи оцену непознатог параметра p користећи метод максималне веродостпојности.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{2}{5}&amp;lt;/math&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
1) Дати дефиницију карактеристичне функције случајне променљиве Х.&lt;br /&gt;
&lt;br /&gt;
2) Дати исказ теореме која описује особину карактеристичне функције збира две случајне променљиве.&lt;br /&gt;
&lt;br /&gt;
3) Нека су Х и Y независне случајне променљиве, где Х има &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелу, а Y је дата са законом расподеле (1 0.5, 2 0.5). Доказати да случајна променљива Z = X + Y има &amp;lt;math&amp;gt;Unif(1, 3)&amp;lt;/math&amp;gt; расподелу.&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Број студената на предавањима је случајна променљива са &amp;lt;math&amp;gt;Poiss(36)&amp;lt;/math&amp;gt; расподелом. &lt;br /&gt;
1) Колико треба да има места у учионици да би са вероватноћом бар 99% сви присутни студенти могли да седе? &lt;br /&gt;
&lt;br /&gt;
2) Која апроксимација је коришћена под 1)? Објаснити како се дошло до те апроскимације.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Минималан број места је 50. Коришћена је апроксимација Пуасонове расподеле нормалном &amp;lt;math&amp;gt;N(36, 36)&amp;lt;/math&amp;gt; расподелом.&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
На основу узорка обима 121 из &amp;lt;math&amp;gt;N(\mu, \sigma^2)&amp;lt;/math&amp;gt; расподеле добијено је &amp;lt;math&amp;gt;\hat{\mu} = 1.2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s^2 = 2.25&amp;lt;/math&amp;gt;. Тестираати хипотезу &amp;lt;math&amp;gt;H_0: \mu = 1&amp;lt;/math&amp;gt; против алтернативне хипотеѕе &amp;lt;math&amp;gt;H_1: \mu &amp;gt; 1&amp;lt;/math&amp;gt; са нивоом значајности 0.05. Објаснити поступак.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Хипотеза &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; се не одбацује.&lt;br /&gt;
[[Категорија:Вероватноћа_и_статистика]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2125</id>
		<title>Вероватноћа и статистика/Јун 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2125"/>
		<updated>2021-06-20T12:58:41Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* jos sitnica */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Испитни део - Статистика ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека су Х и Y независне случајне променљиве са &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелом и нека важи за случајне променљиве U и V важи U = 2X + 4Y, V = X - Y. Одредити коефицијент корелације за &amp;lt;math&amp;gt;\rho (U, V)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;-0.316&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека случајна променљива Х има расподелу &amp;lt;math&amp;gt;Bin(100, p)&amp;lt;/math&amp;gt;) са вероватноћом успеха p, 0 &amp;lt; p &amp;lt; 1. На основу узорка 34, 28, 47, 38, 53 броја реализованих успеха наћи оцену непознатог параметра p користећи метод максималне веродостпојности.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{2}{5}&amp;lt;/math&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
1) Дати дефиницију карактеристичне функције случајне променљиве Х.&lt;br /&gt;
&lt;br /&gt;
2) Дати исказ теореме која описује особину карактеристичне функције збира две случајне променљиве.&lt;br /&gt;
&lt;br /&gt;
3) Нека су Х и Y независне случајне променљиве, где Х има &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелу, а Y је дата са законом расподеле (1 0.5, 2 0.5). Доказати да случајна променљива Z = X + Y има &amp;lt;math&amp;gt;Unif(1, 3)&amp;lt;/math&amp;gt; расподелу.&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Број студената на предавањима је случајна променљива са &amp;lt;math&amp;gt;Poiss(36)&amp;lt;/math&amp;gt; расподелом. &lt;br /&gt;
1) Колико треба да има места у учионици да би са вероватноћом бар 99% сви присутни студенти могли да седе? &lt;br /&gt;
&lt;br /&gt;
2) Која апроксимација је коришћена под 1)? Објаснити како се дошло до те апроскимације.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Минималан број места је 50. Коришћена је апроксимација Пуасонове расподеле нормалном &amp;lt;math&amp;gt;N(36, 36)&amp;lt;/math&amp;gt; расподелом.&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
На основу узорка обима 121 из &amp;lt;math&amp;gt;N(\mu^2, \sigma)&amp;lt;/math&amp;gt; расподеле добијено је &amp;lt;math&amp;gt;\hat{\mu} = 1.2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s^2 = 2.25&amp;lt;/math&amp;gt;. Тестираати хипотезу &amp;lt;math&amp;gt;H_0: \mu = 1&amp;lt;/math&amp;gt; против алтернативне хипотеѕе &amp;lt;math&amp;gt;H_1: \mu &amp;gt; 1&amp;lt;/math&amp;gt; са нивоом значајности 0.05. Објаснити поступак.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Хипотеза &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; се не одбацује.&lt;br /&gt;
[[Категорија:Вероватноћа_и_статистика]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2124</id>
		<title>Вероватноћа и статистика/Јун 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2124"/>
		<updated>2021-06-20T12:54:02Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* slovo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Испитни део - Статистика ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека су Х и Y независне случајне променљиве са &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелом и нека важи за случајне променљиве U и V важи U = 2X + 4Y, V = X - Y. Одредити коефицијент корелације за &amp;lt;math&amp;gt;\rho (U, V)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;-0.316&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека случајна променљива Х има расподелу &amp;lt;math&amp;gt;Bin(100, p)&amp;lt;/math&amp;gt;) са вероватноћом успеха p, 0 &amp;lt; p &amp;lt; 1. На основу узорка 34, 28, 47, 38, 53 броја реализованих успеха наћи оцену непознатог параметра p користећи метод максималне веродостпојности.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{2}{5}&amp;lt;/math&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
1) Дати дефиницију карактеристичне функције случајне променљиве Х.&lt;br /&gt;
&lt;br /&gt;
2) Дати исказ теореме која описује особину карактеристичне функције збира две случајне променљиве.&lt;br /&gt;
&lt;br /&gt;
3) Нека су Х и Y независне случајне променљиве, где Х има &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелу, а Y је дата са законом расподеле (1 0.5, 2 0.5). Доказати да случајна променљива Z = X + Y има &amp;lt;math&amp;gt;Unif(1, 3)&amp;lt;/math&amp;gt; расподелу.&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Број студената на предавањима је случајна променљива са &amp;lt;math&amp;gt;Poiss(36)&amp;lt;/math&amp;gt; расподелом. &lt;br /&gt;
1) Колико треба да има места у учионици да би са вероватноћом бар 99% сви присутни студенти могли да седе? &lt;br /&gt;
&lt;br /&gt;
2) Која апроксимација је коришћена под 1)? Објаснити како се дошло до те апроскимације.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Минималан број места је 50. Коришћена је апроксимација Пуасонове расподеле нормалном &amp;lt;math&amp;gt;N(36, 36)&amp;lt;/math&amp;gt; расподелом.&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
На основу узорка обима 121 из &amp;lt;math&amp;gt;N(36, 36)&amp;lt;/math&amp;gt; расподеле добијено је &amp;lt;math&amp;gt;\mu = 1.2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s^2 = 2.25&amp;lt;/math&amp;gt;. Тестираати хипотезу &amp;lt;math&amp;gt;H_0: \mu = 1&amp;lt;/math&amp;gt; против алтернативне хипотеѕе &amp;lt;math&amp;gt;H_1: \mu &amp;gt; 1&amp;lt;/math&amp;gt; са нивоом значајности 0.05. Објаснити поступак.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Хипотеза &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; се не одбацује.&lt;br /&gt;
[[Категорија:Вероватноћа_и_статистика]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2122</id>
		<title>Вероватноћа и статистика/Јун 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2122"/>
		<updated>2021-06-20T12:49:49Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Испитни део - Статистика ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека су Х и Y независне случајне променљиве са &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелом и нека важи за случајне променљиве U и V важи U = 2X + 4Y, V = X - Y. Одредити коефицијент корелације за &amp;lt;math&amp;gt;\phi (U, V)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;-0.316&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека случајна променљива Х има расподелу &amp;lt;math&amp;gt;Bin(100, p)&amp;lt;/math&amp;gt;) са вероватноћом успеха p, 0 &amp;lt; p &amp;lt; 1. На основу узорка 34, 28, 47, 38, 53 броја реализованих успеха наћи оцену непознатог параметра p користећи метод максималне веродостпојности.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{2}{5}&amp;lt;/math&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
1) Дати дефиницију карактеристичне функције случајне променљиве Х.&lt;br /&gt;
&lt;br /&gt;
2) Дати исказ теореме која описује особину карактеристичне функције збира две случајне променљиве.&lt;br /&gt;
&lt;br /&gt;
3) Нека су Х и Y независне случајне променљиве, где Х има &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелу, а Y је дата са законом расподеле (1 0.5, 2 0.5). Доказати да случајна променљива Z = X + Y има &amp;lt;math&amp;gt;Unif(1, 3)&amp;lt;/math&amp;gt; расподелу.&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Број студената на предавањима је случајна променљива са &amp;lt;math&amp;gt;Poiss(36)&amp;lt;/math&amp;gt; расподелом. &lt;br /&gt;
1) Колико треба да има места у учионици да би са вероватноћом бар 99% сви присутни студенти могли да седе? &lt;br /&gt;
&lt;br /&gt;
2) Која апроксимација је коришћена под 1)? Објаснити како се дошло до те апроскимације.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Минималан број места је 50. Коришћена је апроксимација Пуасонове расподеле нормалном &amp;lt;math&amp;gt;N(36, 36)&amp;lt;/math&amp;gt; расподелом.&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
На основу узорка обима 121 из &amp;lt;math&amp;gt;N(36, 36)&amp;lt;/math&amp;gt; расподеле добијено је &amp;lt;math&amp;gt;\mu = 1.2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s^2 = 2.25&amp;lt;/math&amp;gt;. Тестираати хипотезу &amp;lt;math&amp;gt;H_0: \mu = 1&amp;lt;/math&amp;gt; против алтернативне хипотеѕе &amp;lt;math&amp;gt;H_1: \mu &amp;gt; 1&amp;lt;/math&amp;gt; са нивоом значајности 0.05. Објаснити поступак.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Хипотеза &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; се не одбацује.&lt;br /&gt;
[[Категорија:Вероватноћа_и_статистика]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2121</id>
		<title>Вероватноћа и статистика/Јун 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%BD%D0%BE%D1%9B%D0%B0_%D0%B8_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2121"/>
		<updated>2021-06-20T12:49:25Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: ViS Ispit iz statistike jun 2021&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Испитни део - Статистика ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека су Х и Y независне случајне променљиве са &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелом и нека важи за случајне променљиве U и V важи U = 2X + 4Y, V = X - Y. Одредити коефицијент корелације за &amp;lt;math&amp;gt;\phi (U, V)&amp;lt;/math&amp;gt;.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;-0.316&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Нека случајна променљива Х има расподелу &amp;lt;math&amp;gt;Bin(100, p)&amp;lt;/math&amp;gt;) са вероватноћом успеха p, 0 &amp;lt; p &amp;lt; 1. На основу узорка 34, 28, 47, 38, 53 броја реализованих успеха наћи оцену непознатог параметра p користећи метод максималне веродостпојности.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{2}{5}&amp;lt;/math&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
1) Дати дефиницију карактеристичне функције случајне променљиве Х.&lt;br /&gt;
&lt;br /&gt;
2) Дати исказ теореме која описује особину карактеристичне функције збира две случајне променљиве.&lt;br /&gt;
&lt;br /&gt;
3) Нека су Х и Y независне случајне променљиве, где Х има &amp;lt;math&amp;gt;Unif(0, 1)&amp;lt;/math&amp;gt; расподелу, а Y је дата са законом расподеле (1 0.5, 2 0.5). Доказати да случајна променљива Z = X + Y има &amp;lt;math&amp;gt;Unif(1, 3)&amp;lt;/math&amp;gt; расподелу.&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Број студената на предавањима је случајна променљива са &amp;lt;math&amp;gt;Poiss(36)&amp;lt;/math&amp;gt; расподелом. &lt;br /&gt;
1) Колико треба да има места у учионици да би са вероватноћом бар 99% сви присутни студенти могли да седе? &lt;br /&gt;
&lt;br /&gt;
2) Која апроксимација је коришћена под 1)? Објаснити како се дошло до те апроскимације.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Минималан број места је 50. Коришћена је апроксимација Пуасонове расподеле нормалном &amp;lt;math&amp;gt;N(36, 36)&amp;lt;/math&amp;gt; расподелом.&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
На основу узорка обима 121 из &amp;lt;math&amp;gt;N(36, 36)&amp;lt;/math&amp;gt; расподеле добијено је &amp;lt;math&amp;gt;\mu = 1.2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s^2 = 2.25&amp;lt;/math&amp;gt;. Тестираати хипотезу &amp;lt;math&amp;gt;H_0: \mu = 1&amp;lt;/math&amp;gt; против алтернативне хипотеѕе &amp;lt;math&amp;gt;H_1: \mu &amp;gt; 1&amp;lt;/math&amp;gt; са нивоом значајности 0.05. Објаснити поступак.&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Џипотеза &amp;lt;math&amp;gt;H_0&amp;lt;/math&amp;gt; се не одбацује.&lt;br /&gt;
[[Категорија:Вероватноћа_и_статистика]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A3_2017&amp;diff=1688</id>
		<title>АСП2/К3 2017</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A3_2017&amp;diff=1688"/>
		<updated>2021-02-16T19:33:20Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* jos jedna izmena */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_k3_2016.pdf Postavka zadataka sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kako izgleda niz sa slike nakon prvih pet iteracija &#039;&#039;shakersort&#039;&#039; algoritma?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Niz nakon pet iteracija &#039;&#039;shakersort&#039;&#039; algoritma&lt;br /&gt;
| 12 || 3 || 34 || 83 || 21 || 95 || 34 || 1 || 18 || 20 || 83 || 17 || 44 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 12 || 34 || 21 || 83 || 34 || 1 || 18 || 20 || 83 || 17 || 44 || 39 || 95&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || 12 || 34 || 21 || 83 || 34 || 17 || 18 || 20 || 83 || 39 || 44 || 95&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || 12 || 21 || 34 || 34 || 17 || 18 || 20 || 83 || 39 || 44 || 83 || 95&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || 12 || 17 || 21 || 34 || 34 || 18 || 20 || 39 || 83 || 44 || 83 || 95&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || 12 || 17 || 21 || 34 || 18 || 20 || 34 || 39 || 44 || 83 || 83 || 95&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je heš tabela sa 10 ulaza. U tabelu se unose ključevi koje se mogu sastojati od velikih i malih slova. Primarna heš funkcija je &#039;&#039;H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(K) = (1 + len(K)) mod 10&#039;&#039;, gde &#039;&#039;len(K)&#039;&#039; vraća broj slova u prosleđenom ključu &#039;&#039;K&#039;&#039;. Vremenska lokalnost je veoma izražena, jer se nakon umetanja svakog ključa javlja veliki broj pretraživanja na taj ključ pre nego što se umetne sledeći. Kolizije se razrešavaju nestandardnom primenom dvostrukog heširanja kod koga je sekundarna funkcija &#039;&#039;H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(K) = 3 + up_case_cnt(K)&#039;&#039;, gde &#039;&#039;up_case_cnt(K)&#039;&#039; vraća ukupan broj velikih slova u ključu &#039;&#039;K&#039;&#039;.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Predložiti modifikaciju načina za razrešavanje kolizije tako da se minimizuje vreme uspešnog pretraživanja u datim uslovima.&lt;br /&gt;
# Primenom predloženog rešenja u donju tabelu umetnuti sledeće ključeve:&lt;br /&gt;
#: ČoKoLaDa, PalAčINka, kafA, TORtA, RoLaT, SLadoled, koLAČ&lt;br /&gt;
#: Prikazati finalno stanje heš tabele i celokupan postupak primenom tehnike opisane u rešenju pod a).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Prilikom razrešavanja kolizije, postojeće ključeve možemo pomeriti da budu niže u ispitnom nizu duplim heširanjem a novoumetnuti ključ staviti na njegov početak kako bi se sa što manjim brojem kolizija dolazilo do najskorije umetnutih ključeva.&lt;br /&gt;
# Umetanje u tabelu ide ovako:&lt;br /&gt;
## ČoKoLaDa se umeće na mesto 9&lt;br /&gt;
## PalAčINka se umeće na mesto 0&lt;br /&gt;
## kafA se umeće na mesto 5&lt;br /&gt;
## TORtA se umeće na mesto 6&lt;br /&gt;
## RoLaT se umeće na mesto 6, TORtA se pomera na mesto 3&lt;br /&gt;
## SLadoled se umeće na mesto 9, ČoKoLaDa se pomera na mesto 6, RoLaT se pomera na mesto 2&lt;br /&gt;
## koLAČ se umeće na mesto 6, ČoKoLaDa se pomera na mesto 3, TORtA se pomera na mesto 0, PalAčINka se pomera na mesto 7&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Konačni izgled heš tabele nakon umetanja&lt;br /&gt;
! 0&lt;br /&gt;
| TORtA&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| RoLaT&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ČoKoLaDa&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| kafA&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| koLAČ&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| PalAčINka&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 9&lt;br /&gt;
| SLadoled&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati iterativnu implementaciju &#039;&#039;quicksort&#039;&#039; algoritma. U telu funkcije QUICKSORT koja će predstavljati ovu implementaciju, nakon izbora pivota, pozivati funkciju PARTITION koja vraća konačnu poziciju pivota u nizu. Algoritam realizovati &amp;lt;u&amp;gt;što efikasnije&amp;lt;/u&amp;gt;, a za pivot uzeti element niza koji je srednji po vrednosti u izboru između elemenata sa prve tri pozicije u particiji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pošto se pominje velika efikasnost, bitno je da na stek guramo veće particije a direktno obilazimo manje kako bi dubina steka bila što manja.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
QUICKSORT(arr, n)&lt;br /&gt;
STACK_INIT(S_down)&lt;br /&gt;
STACK_INIT(S_up)&lt;br /&gt;
down = 1&lt;br /&gt;
up = n&lt;br /&gt;
from_stack = false&lt;br /&gt;
while (not STACK_EMPTY(S_down)) or (not from_stack) do&lt;br /&gt;
    if from_stack then&lt;br /&gt;
        down = POP(S_down)&lt;br /&gt;
        up = POP(S_up)&lt;br /&gt;
    end_if&lt;br /&gt;
    if up - down = 1 then&lt;br /&gt;
        if arr[up] &amp;lt; arr[down] then&lt;br /&gt;
            arr[up] ↔ arr[down]&lt;br /&gt;
        end_if&lt;br /&gt;
        from_stack = true&lt;br /&gt;
        continue&lt;br /&gt;
    end_if&lt;br /&gt;
    first = arr[up]&lt;br /&gt;
    second = arr[up+1]&lt;br /&gt;
    third = arr[up+2]&lt;br /&gt;
    if (first ≤ second ≤ third) or (third ≤ second ≤ first) then&lt;br /&gt;
        pivot = 2&lt;br /&gt;
    else if (second ≤ first ≤ third) or (third ≤ first ≤ second) then&lt;br /&gt;
        pivot = 1&lt;br /&gt;
    else&lt;br /&gt;
        pivot = 3&lt;br /&gt;
    end_if&lt;br /&gt;
    pivot_pos = PARTITION(arr, down, up, pivot)&lt;br /&gt;
    lower_down = down&lt;br /&gt;
    lower_up = pivot_pos-1&lt;br /&gt;
    higher_down = pivot_pos+1&lt;br /&gt;
    higher_up = up&lt;br /&gt;
    if (lower_up - lower_down &amp;lt; 1) and (higher_up - higher_down &amp;lt; 1) then&lt;br /&gt;
        from_stack = true&lt;br /&gt;
    else if lower_up - lower_down &amp;lt; higher_up - higher_down then&lt;br /&gt;
        up = lower_up&lt;br /&gt;
        down = lower_down&lt;br /&gt;
        from_stack = false&lt;br /&gt;
        PUSH(S_down, higher_down)&lt;br /&gt;
        PUSH(S_up, higher_up)&lt;br /&gt;
    else&lt;br /&gt;
        up = higher_up&lt;br /&gt;
        down = higher_down&lt;br /&gt;
        from_stack = false&lt;br /&gt;
        PUSH(S_down, lower_down)&lt;br /&gt;
        PUSH(S_up, lower_up)&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pošto je rečeno da se izbor pivota radi u QUICKSORT, pretpostavićemo da se taj pivot zatim prosleđuje PARTITION kao parametar.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
PARTITION(arr, down, up, pivot_pos)&lt;br /&gt;
i = down&lt;br /&gt;
j = up&lt;br /&gt;
pivot = arr[pivot_pos]&lt;br /&gt;
while i &amp;lt; j do&lt;br /&gt;
    while (arr[i] ≤ pivot) and (i &amp;lt; j) do&lt;br /&gt;
        i = i + 1&lt;br /&gt;
    end_while&lt;br /&gt;
    while arr[j] &amp;gt; pivot do&lt;br /&gt;
        j = j - 1&lt;br /&gt;
    end_while&lt;br /&gt;
    if i &amp;lt; j then&lt;br /&gt;
        arr[i] ↔ arr[j]&lt;br /&gt;
    end_while&lt;br /&gt;
end_while&lt;br /&gt;
arr[pivot_pos] ↔ arr[j]&lt;br /&gt;
return j&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu funkciju za dekrementiranje ključa koji se nalazi u binarnom nerastućem (max) hipu. Smatrati da je hip smešten u nizu čiji indeksi počinju od 0. Funkcija kao svoj parametar dobija indeks ključa u nizu koga treba dekrementirati.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
HEAP KEY DEC(i)&lt;br /&gt;
arr[i] = arr[i]-1&lt;br /&gt;
left = 2 * i + 1&lt;br /&gt;
right = 2 * i + 2&lt;br /&gt;
while ((left ≤ n) and (arr[left] &amp;gt; arr[i])) or ((right ≤ n) and (arr[right] &amp;gt; arr[i])) do&lt;br /&gt;
    if right ≤ n then&lt;br /&gt;
        if arr[right] &amp;gt; arr[left] then&lt;br /&gt;
            high = right&lt;br /&gt;
        else&lt;br /&gt;
            high = left&lt;br /&gt;
        end_if&lt;br /&gt;
    else&lt;br /&gt;
        high = left&lt;br /&gt;
    end_if&lt;br /&gt;
    arr[i] ↔ arr[high]&lt;br /&gt;
    i = high&lt;br /&gt;
    left = 2 * i + 1&lt;br /&gt;
    right = 2 * i + 2&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Podaci se smeštaju u heš tabelu sa 7 ulaza primenom heš funkcije h&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt;(K) = K mod 7. Za razrešavanje kolizija se koristi metoda dvostrukog heširanja sa sekundarnom heš funkcijom h&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;(K) = 4 + K mod 2. Obrazložiti na koji način u ovom slučaju može doći do sekundarnog grupisanja i navesti sekvencu od tri ključa koja proizvodi ovaj efekat u konkretnom slučaju. Navedene ključeve uneti u tabelu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U ovom slučaju može doći do sekundarnog grupisanja kada uneti ključevi daju isti ostatak pri deljenju sa 7 i pri deljenju sa 2. Takvi su recimo ključevi 0, 14 i 28.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela sa unetim ključevima&lt;br /&gt;
! 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| 14&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| 28&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Fibonačijev hip&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Koja je razlika između dodavanja u binomni hip i Fibonačijev hip? Objasniti kratko i precizno, u jednoj do dve rečenice.&lt;br /&gt;
# U prazan Fibonačijev hip dodaju se elementi 10, 5, 17, 3, 12, 11, 1, potom se briše element sa vrednošću 1, nakon čega se dodaju elementi 7 i 2. Nacrtati izgled hipa nakon prvih sedam umetanja i nakon svake naredne izmene hipa.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Pri dodavanju u Fibonačijev hip uneti čvor se samo ulančava, a grupisanje slično binomnom hipu se dešava tek kod izbacivanja najmanjeg elementa.&lt;br /&gt;
# Ispod su dati izgledi hipa nakon date četiri operacije.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
  ASP2 K3 2017 zadatak 6 hip umetanje 1.png | Izgled hipa nakon umetanja 10, 5, 17, 3, 12, 11, 1.&lt;br /&gt;
  ASP2 K3 2017 zadatak 6 hip brisanje.png | Izgled hipa nakon brisanja 1.&lt;br /&gt;
  ASP2 K3 2017 zadatak 6 hip umetanje 2.png | Izgled hipa nakon umetanja 7.&lt;br /&gt;
  ASP2 K3 2017 zadatak 6 hip umetanje 3.png | Izgled hipa nakon umetanja 2.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Podaci se smeštaju u heš tabelu sa &#039;&#039;n&#039;&#039; ulaza primenom heš funkcije h(K) = K mod n. Za razrešavanje kolizija se koristi metoda kvadratnog pretraživanja, ali nije dozvoljeno koristiti operaciju množenja (kvadriranja). Predložiti metod brisanja i napisati pseudokodove operacija brisanja i umetanja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Možemo primetiti da &amp;lt;math&amp;gt;2^2 - 1^2 = 3, 3^2 - 2^2 = 5, 4^2 - 3^2 = 7, ...&amp;lt;/math&amp;gt; što znači da umesto kvadriranja možemo da radimo samo sabiranje sa sledećim neparnim brojem.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
DELETE(H, key)&lt;br /&gt;
i = init = H(key)&lt;br /&gt;
step = 3&lt;br /&gt;
while T[i] ≠ key do&lt;br /&gt;
    if (step ≠ 3) and (i = init) then&lt;br /&gt;
        return&lt;br /&gt;
    end_if&lt;br /&gt;
    i = i + step&lt;br /&gt;
    step = step + 2&lt;br /&gt;
end_while&lt;br /&gt;
T[i] = deleted&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
INSERT(H, key)&lt;br /&gt;
i = init = H(key)&lt;br /&gt;
step = 3&lt;br /&gt;
while T[i] ≠ empty or T[i] ≠ deleted do&lt;br /&gt;
    if (step ≠ 3) and (i = init) then&lt;br /&gt;
        ERROR(Tabela puna)&lt;br /&gt;
    end_if&lt;br /&gt;
    i = i + step&lt;br /&gt;
    step = step + 2&lt;br /&gt;
end_while&lt;br /&gt;
T[i] = key&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti kako se može modelirati ponašanje algoritama sortiranja poređenjem. Za dati model izvesti teorijsku granicu složenosti u najgorem slučaju.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ponašanje algoritma se može modelirati stablom odlučivanja. Svako odlučivanje se modeluje unutrašnjim čvorom a svaki ishod listom, tako da složenost u najgorem slučaju dobijamo kao visinu tog stabla. Pošto je broj ishoda ovakvog stabla odlučivanja jednak &amp;lt;math&amp;gt;n!&amp;lt;/math&amp;gt;, a najveći broj listova u stablu visine &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; jednak &amp;lt;math&amp;gt;2^h&amp;lt;/math&amp;gt;, možemo da izjednačimo &amp;lt;math&amp;gt;n! = 2^h&amp;lt;/math&amp;gt;. Kad logaritmujemo obe strane jednačine i primenimo Stirlingovu aproksimaciju (&amp;lt;math&amp;gt;n! &amp;gt; \left(\frac{n}{e}\right)^n&amp;lt;/math&amp;gt;) dobijamo &amp;lt;math&amp;gt;h = \log(n!) &amp;gt; n \log\left(\frac{n}{e}\right) &amp;gt; n \log n - n \log e = O(n \log n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A3_2017&amp;diff=1686</id>
		<title>АСП2/К3 2017</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A3_2017&amp;diff=1686"/>
		<updated>2021-02-16T19:23:26Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* mala izmena */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_k3_2016.pdf Postavka zadataka sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kako izgleda niz sa slike nakon prvih pet iteracija &#039;&#039;shakersort&#039;&#039; algoritma?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Niz nakon pet iteracija &#039;&#039;shakersort&#039;&#039; algoritma&lt;br /&gt;
| 12 || 3 || 34 || 83 || 21 || 95 || 34 || 1 || 18 || 20 || 83 || 17 || 44 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 12 || 34 || 21 || 83 || 34 || 1 || 18 || 20 || 83 || 17 || 44 || 39 || 95&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || 12 || 34 || 21 || 83 || 34 || 17 || 18 || 20 || 83 || 39 || 44 || 95&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || 12 || 21 || 34 || 34 || 17 || 18 || 20 || 83 || 39 || 44 || 83 || 95&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || 12 || 17 || 21 || 34 || 34 || 18 || 20 || 39 || 83 || 44 || 83 || 95&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || 12 || 17 || 21 || 34 || 18 || 20 || 34 || 39 || 44 || 83 || 83 || 95&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je heš tabela sa 10 ulaza. U tabelu se unose ključevi koje se mogu sastojati od velikih i malih slova. Primarna heš funkcija je &#039;&#039;H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(K) = (1 + len(K)) mod 10&#039;&#039;, gde &#039;&#039;len(K)&#039;&#039; vraća broj slova u prosleđenom ključu &#039;&#039;K&#039;&#039;. Vremenska lokalnost je veoma izražena, jer se nakon umetanja svakog ključa javlja veliki broj pretraživanja na taj ključ pre nego što se umetne sledeći. Kolizije se razrešavaju nestandardnom primenom dvostrukog heširanja kod koga je sekundarna funkcija &#039;&#039;H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(K) = 3 + up_case_cnt(K)&#039;&#039;, gde &#039;&#039;up_case_cnt(K)&#039;&#039; vraća ukupan broj velikih slova u ključu &#039;&#039;K&#039;&#039;.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Predložiti modifikaciju načina za razrešavanje kolizije tako da se minimizuje vreme uspešnog pretraživanja u datim uslovima.&lt;br /&gt;
# Primenom predloženog rešenja u donju tabelu umetnuti sledeće ključeve:&lt;br /&gt;
#: ČoKoLaDa, PalAčINka, kafA, TORtA, RoLaT, SLadoled, koLAČ&lt;br /&gt;
#: Prikazati finalno stanje heš tabele i celokupan postupak primenom tehnike opisane u rešenju pod a).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Prilikom razrešavanja kolizije, postojeće ključeve možemo pomeriti da budu niže u ispitnom nizu duplim heširanjem a novoumetnuti ključ staviti na njegov početak kako bi se sa što manjim brojem kolizija dolazilo do najskorije umetnutih ključeva.&lt;br /&gt;
# Umetanje u tabelu ide ovako:&lt;br /&gt;
## ČoKoLaDa se umeće na mesto 9&lt;br /&gt;
## PalAčINka se umeće na mesto 0&lt;br /&gt;
## kafA se umeće na mesto 5&lt;br /&gt;
## TORtA se umeće na mesto 6&lt;br /&gt;
## RoLaT se umeće na mesto 6, TORtA se pomera na mesto 3&lt;br /&gt;
## SLadoled se umeće na mesto 9, ČoKoLaDa se pomera na mesto 6, RoLaT se pomera na mesto 2&lt;br /&gt;
## koLAČ se umeće na mesto 6, ČoKoLaDa se pomera na mesto 3, TORtA se pomera na mesto 0, PalAčINka se pomera na mesto 7&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Konačni izgled heš tabele nakon umetanja&lt;br /&gt;
! 0&lt;br /&gt;
| TORtA&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| RoLaT&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ČoKoLaDa&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| kafA&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| koLAČ&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| PalAčINka&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 9&lt;br /&gt;
| SLadoled&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati iterativnu implementaciju &#039;&#039;quicksort&#039;&#039; algoritma. U telu funkcije QUICKSORT koja će predstavljati ovu implementaciju, nakon izbora pivota, pozivati funkciju PARTITION koja vraća konačnu poziciju pivota u nizu. Algoritam realizovati &amp;lt;u&amp;gt;što efikasnije&amp;lt;/u&amp;gt;, a za pivot uzeti element niza koji je srednji po vrednosti u izboru između elemenata sa prve tri pozicije u particiji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pošto se pominje velika efikasnost, bitno je da na stek guramo veće particije a direktno obilazimo manje kako bi dubina steka bila što manja.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
QUICKSORT(arr, n)&lt;br /&gt;
STACK_INIT(S_down)&lt;br /&gt;
STACK_INIT(S_up)&lt;br /&gt;
down = 1&lt;br /&gt;
up = n&lt;br /&gt;
from_stack = false&lt;br /&gt;
while (not STACK_EMPTY(S_down)) or (not from_stack) do&lt;br /&gt;
    if from_stack then&lt;br /&gt;
        down = POP(S_down)&lt;br /&gt;
        up = POP(S_up)&lt;br /&gt;
    end_if&lt;br /&gt;
    if up - down = 1 then&lt;br /&gt;
        if arr[up] &amp;lt; arr[down] then&lt;br /&gt;
            arr[up] ↔ arr[down]&lt;br /&gt;
        end_if&lt;br /&gt;
        from_stack = true&lt;br /&gt;
        continue&lt;br /&gt;
    end_if&lt;br /&gt;
    first = arr[up]&lt;br /&gt;
    second = arr[up+1]&lt;br /&gt;
    third = arr[up+2]&lt;br /&gt;
    if (first ≤ second ≤ third) or (third ≤ second ≤ first) then&lt;br /&gt;
        pivot = 2&lt;br /&gt;
    else if (second ≤ first ≤ third) or (third ≤ first ≤ second) then&lt;br /&gt;
        pivot = 1&lt;br /&gt;
    else&lt;br /&gt;
        pivot = 3&lt;br /&gt;
    end_if&lt;br /&gt;
    pivot_pos = PARTITION(arr, down, up, pivot)&lt;br /&gt;
    lower_down = down&lt;br /&gt;
    lower_up = pivot_pos-1&lt;br /&gt;
    higher_down = pivot_pos+1&lt;br /&gt;
    higher_up = up&lt;br /&gt;
    if (lower_up - lower_down &amp;lt; 1) and (higher_up - higher_down &amp;lt; 1) then&lt;br /&gt;
        from_stack = true&lt;br /&gt;
    else if lower_up - lower_down &amp;lt; higher_up - higher_down then&lt;br /&gt;
        up = lower_up&lt;br /&gt;
        down = lower_down&lt;br /&gt;
        from_stack = false&lt;br /&gt;
        PUSH(S_down, higher_down)&lt;br /&gt;
        PUSH(S_up, higher_up)&lt;br /&gt;
    else&lt;br /&gt;
        up = higher_up&lt;br /&gt;
        down = higher_down&lt;br /&gt;
        from_stack = false&lt;br /&gt;
        PUSH(S_down, lower_down)&lt;br /&gt;
        PUSH(S_up, lower_up)&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pošto je rečeno da se izbor pivota radi u QUICKSORT, pretpostavićemo da se taj pivot zatim prosleđuje PARTITION kao parametar.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
PARTITION(arr, down, up, pivot_pos)&lt;br /&gt;
i = down&lt;br /&gt;
j = up&lt;br /&gt;
pivot = arr[pivot_pos]&lt;br /&gt;
while i &amp;lt; j do&lt;br /&gt;
    while (arr[i] ≤ pivot) and (i &amp;lt; j) do&lt;br /&gt;
        i = i + 1&lt;br /&gt;
    end_while&lt;br /&gt;
    while arr[j] &amp;gt; pivot do&lt;br /&gt;
        j = j - 1&lt;br /&gt;
    end_while&lt;br /&gt;
    if i &amp;lt; j then&lt;br /&gt;
        arr[i] ↔ arr[j]&lt;br /&gt;
    end_while&lt;br /&gt;
end_while&lt;br /&gt;
arr[pivot_pos] ↔ arr[j]&lt;br /&gt;
return j&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu funkciju za dekrementiranje ključa koji se nalazi u binarnom nerastućem (max) hipu. Smatrati da je hip smešten u nizu čiji indeksi počinju od 0. Funkcija kao svoj parametar dobija indeks ključa u nizu koga treba dekrementirati.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
HEAP KEY DEC(i)&lt;br /&gt;
arr[i] = arr[i]-1&lt;br /&gt;
left = 2 * i + 1&lt;br /&gt;
right = 2 * i + 2&lt;br /&gt;
while ((left ≤ n) and (arr[left] &amp;gt; arr[i])) or ((right ≤ n) and (arr[right] &amp;gt; arr[i])) do&lt;br /&gt;
    if right ≤ n then&lt;br /&gt;
        if arr[right] &amp;gt; arr[left] then&lt;br /&gt;
            high = right&lt;br /&gt;
        else&lt;br /&gt;
            high = left&lt;br /&gt;
        end_if&lt;br /&gt;
    else&lt;br /&gt;
        high = left&lt;br /&gt;
    end_if&lt;br /&gt;
    arr[i] ↔ arr[high]&lt;br /&gt;
    i = high&lt;br /&gt;
    left = 2 * i + 1&lt;br /&gt;
    right = 2 * i + 2&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Podaci se smeštaju u heš tabelu sa 7 ulaza primenom heš funkcije h&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt;(K) = K mod 7. Za razrešavanje kolizija se koristi metoda dvostrukog heširanja sa sekundarnom heš funkcijom h&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;(K) = 4 + K mod 2. Obrazložiti na koji način u ovom slučaju može doći do sekundarnog grupisanja i navesti sekvencu od tri ključa koja proizvodi ovaj efekat u konkretnom slučaju. Navedene ključeve uneti u tabelu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U ovom slučaju može doći do sekundarnog grupisanja kada uneti ključevi daju isti ostatak pri deljenju sa 7 i pri deljenju sa 2. Takvi su recimo ključevi 0, 14 i 28.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela sa unetim ključevima&lt;br /&gt;
! 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| 14&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| 28&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Fibonačijev hip&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Koja je razlika između dodavanja u binomni hip i Fibonačijev hip? Objasniti kratko i precizno, u jednoj do dve rečenice.&lt;br /&gt;
# U prazan Fibonačijev hip dodaju se elementi 10, 5, 17, 3, 12, 11, 1, potom se briše element sa vrednošću 1, nakon čega se dodaju elementi 7 i 2. Nacrtati izgled hipa nakon prvih sedam umetanja i nakon svake naredne izmene hipa.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Pri dodavanju u Fibonačijev hip uneti čvor se samo ulančava, a grupisanje slično binomnom hipu se dešava tek kod izbacivanja najmanjeg elementa.&lt;br /&gt;
# Ispod su dati izgledi hipa nakon date četiri operacije.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
  ASP2 K3 2017 zadatak 6 hip umetanje 1.png | Izgled hipa nakon umetanja 10, 5, 17, 3, 12, 11, 1.&lt;br /&gt;
  ASP2 K3 2017 zadatak 6 hip brisanje.png | Izgled hipa nakon brisanja 1.&lt;br /&gt;
  ASP2 K3 2017 zadatak 6 hip umetanje 2.png | Izgled hipa nakon umetanja 7.&lt;br /&gt;
  ASP2 K3 2017 zadatak 6 hip umetanje 3.png | Izgled hipa nakon umetanja 2.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Podaci se smeštaju u heš tabelu sa &#039;&#039;n&#039;&#039; ulaza primenom heš funkcije h(K) = K mod n. Za razrešavanje kolizija se koristi metoda kvadratnog pretraživanja, ali nije dozvoljeno koristiti operaciju množenja (kvadriranja). Predložiti metod brisanja i napisati pseudokodove operacija brisanja i umetanja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Možemo primetiti da &amp;lt;math&amp;gt;2^2 - 1^2 = 3, 3^2 - 2^2 = 5, 4^2 - 3^2 = 7, ...&amp;lt;/math&amp;gt; što znači da umesto kvadriranja možemo da radimo samo sabiranje sa sledećim neparnim brojem.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
DELETE(H, key)&lt;br /&gt;
i = init = H(key)&lt;br /&gt;
step = 3&lt;br /&gt;
while T[i] ≠ key do&lt;br /&gt;
    if (step ≠ 3) and (i = init) then&lt;br /&gt;
        return&lt;br /&gt;
    end_if&lt;br /&gt;
    i = i + step&lt;br /&gt;
    step = step + 2&lt;br /&gt;
end_while&lt;br /&gt;
T[i] = empty&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
INSERT(H, key)&lt;br /&gt;
i = init = H(key)&lt;br /&gt;
step = 3&lt;br /&gt;
while T[i] ≠ empty do&lt;br /&gt;
    if (step ≠ 3) and (i = init) then&lt;br /&gt;
        ERROR(Tabela puna)&lt;br /&gt;
    end_if&lt;br /&gt;
    i = i + step&lt;br /&gt;
    step = step + 2&lt;br /&gt;
end_while&lt;br /&gt;
T[i] = key&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti kako se može modelirati ponašanje algoritama sortiranja poređenjem. Za dati model izvesti teorijsku granicu složenosti u najgorem slučaju.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ponašanje algoritma se može modelirati stablom odlučivanja. Svako odlučivanje se modeluje unutrašnjim čvorom a svaki ishod listom, tako da složenost u najgorem slučaju dobijamo kao visinu tog stabla. Pošto je broj ishoda ovakvog stabla odlučivanja jednak &amp;lt;math&amp;gt;n!&amp;lt;/math&amp;gt;, a najveći broj listova u stablu visine &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; jednak &amp;lt;math&amp;gt;2^h&amp;lt;/math&amp;gt;, možemo da izjednačimo &amp;lt;math&amp;gt;n! = 2^h&amp;lt;/math&amp;gt;. Kad logaritmujemo obe strane jednačine i primenimo Stirlingovu aproksimaciju (&amp;lt;math&amp;gt;n! &amp;gt; \left(\frac{n}{e}\right)^n&amp;lt;/math&amp;gt;) dobijamo &amp;lt;math&amp;gt;h = \log(n!) &amp;gt; n \log\left(\frac{n}{e}\right) &amp;gt; n \log n - n \log e = O(n \log n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%91%D0%B0%D0%B7%D0%B5_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0_1&amp;diff=1657</id>
		<title>Базе података 1</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%91%D0%B0%D0%B7%D0%B5_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0_1&amp;diff=1657"/>
		<updated>2021-02-09T20:39:44Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: &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;
* [https://rti.etf.bg.ac.rs/rti/bp1/ Страница предмета]&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
{{Материјали&lt;br /&gt;
| vuk      = 1haJaA9fzRFoEn2cmcUc-l-NKenLG_8n5&lt;br /&gt;
| beastweb = baze-podataka-1 Старије&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Лаб вежбе ==&lt;br /&gt;
Током семестра организују се две лабораторијске вежбе. На првој лабораторијској вежби се ради повезивање на SQLite базу кроз програмски језик C++ и извршавање једноставних упита над њом, док се на другој лабораторијској вежби раде напреднији упити у [[#Cactus|&#039;&#039;Cactus&#039;&#039;-u]].&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = Базе_података_1/Лаб&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦17¦-1}²]],,&lt;br /&gt;
| noresultsheader = Тренутно нема лабораториских вежби.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Претходни испитни рокови се могу наћи на страници предмета. Нажалост, нису нарочито погодни за вежбу јер сви имају решења већ означена. Испод можете наћи испитне рокове са странице предмета без означених решења:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| namespace       = File&lt;br /&gt;
| titleregexp     = ^BP1 .*\.pdf$&lt;br /&gt;
| noresultsheader = Тренутно нема нерешених рокова.&lt;br /&gt;
| format          = ,\n* [[Медиј:%TITLE%|²{#invoke:String¦sub¦%TITLE%¦4¦-5}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Cactus ==&lt;br /&gt;
&#039;&#039;Cactus&#039;&#039; је софтвер који се на лабораторијској вежби и испиту користи као алат за проверавање тачности упита. У тим приликама студентима биће дат cSQL фајл који у себи садржи тест примере који студенту помажу да провери да ли откуцани упит ради оно што се од њега очекује. Пролазак јавног тест примера, додуше, не значи да је цео упит тачан, јер се тестира и на тајним тест примерима.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Cactus&#039;&#039; је писан користећи Java 10, и генерално не ради са осталим Java верзијама. Готове архиве са спакованим &#039;&#039;Cactus&#039;&#039;-ом заједно са Java 10 су доступне за [https://studentetfbgacrs-my.sharepoint.com/:u:/g/personal/sa190595d_student_etf_bg_ac_rs/EYS6i0XcbWZAv_7fhlqIQA0BCqTM1m_Il409uFGTv1Zi4g Windows] и за [https://studentetfbgacrs-my.sharepoint.com/:u:/g/personal/sa190595d_student_etf_bg_ac_rs/EdzDtvWgB2xEn11Ydap3KWwBTk31IBX_MqFHCIT5QCOxmQ Linux,] (након преузимања отпакујте архиву и покрените &amp;lt;code&amp;gt;pokreni.bat&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;pokreni.sh&amp;lt;/code&amp;gt;) али можете и такође само [https://www.oracle.com/java/technologies/java-archive-javase10-downloads.html преузети JRE 10] (одељак &amp;quot;Java SE Runtime Environment 10.0.2&amp;quot;) за ваш оперативни систем и преко њега покренути &#039;&#039;Cactus&#039;&#039; са [https://rti.etf.bg.ac.rs/rti/bp1/materijali/Cactus.jar странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &#039;&#039;&#039;K1&#039;&#039;&#039;, &#039;&#039;&#039;K2&#039;&#039;&#039; — Бодови са првог и другог колоквијума максимално 20 за први колоквијум и максимално 10 за други. Могу се поправити у следећем колоквијумском или испитном року.&lt;br /&gt;
* &#039;&#039;&#039;I&#039;&#039;&#039; — Бодови са испита, максимално 50.&lt;br /&gt;
* &#039;&#039;&#039;L1&#039;&#039;&#039;, &#039;&#039;&#039;L2&#039;&#039;&#039; — Бодови са лабораторијских вежби, прва носи 5 а друга 15 бодова.&lt;br /&gt;
* &#039;&#039;&#039;P&#039;&#039;&#039; — Коначан број бодова: &amp;lt;math&amp;gt;P = K_1 + K_2 + I + L_1 + L_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Услов за полагање:&#039;&#039;&#039; &amp;lt;math&amp;gt;I \geq 25&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;
[[Категорија:Базе података 1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%9E1/%D0%9A1_2020&amp;diff=1431</id>
		<title>ОО1/К1 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%9E1/%D0%9A1_2020&amp;diff=1431"/>
		<updated>2020-11-17T16:45:43Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: /* Dodaci za G1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
* Za pitanja sa više odgovora, tačni odgovori su &amp;lt;span class=&amp;quot;solution-example&amp;quot;&amp;gt;podebljani i uokvireni&amp;lt;/span&amp;gt;.&lt;br /&gt;
* Za pitanja za koje se odgovori unose, tačni odgovori su podvučeni i sakriveni: &amp;lt;span class=&amp;quot;spoiler-example&amp;quot;&amp;gt;ovako&amp;lt;/span&amp;gt;.&lt;br /&gt;
* Pritisnite na sledeće dugme kako biste ih sakrili ili otkrili: &amp;lt;span class=&amp;quot;unhide-spoilers unhide-solutions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== G1 ==&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
Koji je tip promenljive &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; u sledećem programu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int main(void) {&lt;br /&gt;
    int i = 1;&lt;br /&gt;
    const int k = i;&lt;br /&gt;
    auto p = new int + k;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;const int&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&amp;lt;code&amp;gt;int*&amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;const int*&amp;lt;/code&amp;gt;&lt;br /&gt;
# Program se ne prevodi.&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
Šta ispisuje sledeći program na jeziku C++?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
int &amp;amp;f(int &amp;amp;x){&lt;br /&gt;
  return ++x;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
  std::cout &amp;lt;&amp;lt; f(2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# 6&lt;br /&gt;
# 0&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Program se ne prevodi.&amp;lt;/span&amp;gt;&lt;br /&gt;
# 5&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
Ime simbol predstavlja niz referenci na nepromenljiv pokazivač na int. Kako se deklariše u kodu?&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# ...&lt;br /&gt;
# ...&lt;br /&gt;
# &amp;lt;code&amp;gt;int * const &amp;amp;simbol[]&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Deklaracija za simbol se ne prevodi.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ?. zadatak ===&lt;br /&gt;
Zaokružiti tačna tvrđenja u vezi sa preklapanjem imena funkcija na jeziku C++:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Kada dve funkcije imaju isti naziv, statički tokom prevođenja programa se određuje koja funkcija će biti pozvana.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Kada dve funkcije imaju isti naziv, dinamički tokom izvršenja programa se određuje koja funkcija će biti pozvana.&lt;br /&gt;
# Kada dve funkcije imaju isti naziv, statički tokom izvršenja programa se određuje koja funkcija će biti pozvana.&lt;br /&gt;
# Kada dve funkcije imaju isti naziv, dinamički tokom prevođenja programa se određuje koja funkcija će biti pozvana.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ?. zadatak ===&lt;br /&gt;
Koje od navedenih parova potpisa funkcija mogu postojati u istom programu, a da prevodilac ne prijavljuje grešku?&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&amp;lt;code&amp;gt; int &amp;amp; f(int i, int j);&amp;lt;/code&amp;gt;  i  &amp;lt;code&amp;gt; int &amp;amp;&amp;amp; f(int i, int j); &amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&amp;lt;code&amp;gt; int const f(int i, int j);&amp;lt;/code&amp;gt;  i  &amp;lt;code&amp;gt; int f(int i, int j); &amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt; float volatile f(int i, int j);&amp;lt;/code&amp;gt;  i  &amp;lt;code&amp;gt; int volatile f(int i, int j); &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. zadatak ===&lt;br /&gt;
Šta ispisuje sledeći program na programskom jeziku C++:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class K {&lt;br /&gt;
    static int staticId;&lt;br /&gt;
    int id = staticId++;&lt;br /&gt;
public: &lt;br /&gt;
    K() = default;&lt;br /&gt;
    K(const K&amp;amp;) {}&lt;br /&gt;
    int m(K arg) {&lt;br /&gt;
        return arg.id;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int K::staticId = 1;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    K a;&lt;br /&gt;
    K b;&lt;br /&gt;
    K c(a);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.m(c);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# 1&lt;br /&gt;
# 2&lt;br /&gt;
# 5&lt;br /&gt;
# 3&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt;&lt;br /&gt;
# Više od 5.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== G2 ==&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
Zaokružiti tačne tvrdnje u vezi sa referencama na jeziku C++:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Moguće je definisati referencu na pokazivač.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Moguće je definisati niz referenci.&lt;br /&gt;
# Moguće je definisati referencu na referencu.&lt;br /&gt;
# Moguće je definisati pokazivač na referencu.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
Šta ispisuje sledeći program na jeziku C++?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
int &amp;amp;f(int &amp;amp;x){&lt;br /&gt;
  return x++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
  int x = 5;&lt;br /&gt;
  std::cout &amp;lt;&amp;lt; f(x);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# 6&lt;br /&gt;
# 0&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Program se ne prevodi.&amp;lt;/span&amp;gt;&lt;br /&gt;
# 5&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
Povezati tvrdnje u vezi sa modifikatorima metoda:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Modifikatori&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;volatile &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;
&lt;br /&gt;
&amp;lt;code&amp;gt;const &amp;lt;/code&amp;gt; &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;e.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp; &amp;lt;/code&amp;gt; &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;g.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &amp;amp;&amp;amp; &amp;lt;/code&amp;gt; &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;f.&amp;lt;/span&amp;gt;&lt;br /&gt;
|| &amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Metoda se može zvati samo ako je tekući objekat pokazivač.&lt;br /&gt;
# Oznaka kompajleru da ne vrši optimizacije.&lt;br /&gt;
# Oznaka kompajleru da vrši optimizacije.&lt;br /&gt;
# Metoda je mutator.&lt;br /&gt;
# Metoda je inspektor.&lt;br /&gt;
# Metoda se može zvati samo ako je tekući objekat dvrednost.&lt;br /&gt;
# Metoda se može zvati samo ako je tekući objekat lvrednost.&lt;br /&gt;
# Metoda se može zvati samo ako je tekući objekat konstantan.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 5. zadatak ===&lt;br /&gt;
Zaokružiti tačne tvrdnje u vezi sa pomerajućim konstruktorom na jeziku C++:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Definisanjem podrazumevanog konstruktora briše se ugrađeni premeštajući konstruktor.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Definisanjem kopirajućeg konstruktora briše se ugrađeni premeštajući konstruktor.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Pomerajući konstruktor mora da ima samo jedan parametar.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6. zadatak ===&lt;br /&gt;
Zaokružiti tačne tvrdnje u vezi sa funkcijama na jeziku C++:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Mogu se definisati više funkcija istog imena ako imaju različiti broj parametara bez podrazumevanih vrednosti. &amp;lt;/span&amp;gt;&lt;br /&gt;
# Mogu se definisati više funkcija istog imena ako su im različite povratne vrednosti.&lt;br /&gt;
# Ne mogu se definisati više funkcija istog imena, jer kompajler ne bi mogao da ih raspozna.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Mogu se definisati više funkcija istog imena ako imaju različite tipove parametara. &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. zadatak ===&lt;br /&gt;
Šta ispisuje sledeći program na programskom jeziku C++:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class L {&lt;br /&gt;
    L(const &amp;amp;L l) = delete;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class K {&lt;br /&gt;
    static int staticId;&lt;br /&gt;
    int id = staticId++;&lt;br /&gt;
    L l;&lt;br /&gt;
public: &lt;br /&gt;
    K() = default;&lt;br /&gt;
    K(const K&amp;amp;) {}&lt;br /&gt;
    int m(K arg) {&lt;br /&gt;
        return arg.id;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int K::staticId = 1;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    K a;&lt;br /&gt;
    K b;&lt;br /&gt;
    K c(a);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.m(c);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# 1&lt;br /&gt;
# 2&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Program se ne prevodi&amp;lt;/span&amp;gt;&lt;br /&gt;
# 3&lt;br /&gt;
# 4&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8. zadatak ===&lt;br /&gt;
Šta ispisuje sledeći program na programskom jeziku C++?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Klasa {&lt;br /&gt;
    static Klasa *napravi()&lt;br /&gt;
    {&lt;br /&gt;
        cout &amp;lt;&amp;lt; 1;&lt;br /&gt;
        return new Klasa{0};&lt;br /&gt;
    }&lt;br /&gt;
    Klasa *clan = napravi();&lt;br /&gt;
    public:&lt;br /&gt;
        Klasa() { cout &amp;lt;&amp;lt; 2; }&lt;br /&gt;
        Klasa(int a) : clan(nullptr) { cout &amp;lt;&amp;lt; 3; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Klasa k;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;132&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 9. zadatak ===&lt;br /&gt;
Dopuniti XXX sa linijom tako da je program ispravan:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class A {&lt;br /&gt;
        A(const A&amp;amp; a) = delete;&lt;br /&gt;
    public:&lt;br /&gt;
        int n = 1;&lt;br /&gt;
        A() = default;&lt;br /&gt;
        A(A&amp;amp;&amp;amp; a) { };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void f(A a) {&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; a.n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    XXX&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt; f(); &amp;lt;/code&amp;gt; &lt;br /&gt;
# &amp;lt;code&amp;gt; A a; f(a); &amp;lt;/code&amp;gt; &lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; &amp;lt;code&amp;gt;f(A()); &amp;lt;/code&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;f(A); &amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 10. zadatak ===&lt;br /&gt;
Zaokružiti tačne tvrdnje u vezi sa statičkim poljima u klasama na jeziku C++:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# U definiciji klase se mogu definisati promenljiva statička polja.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Doseg imena statičkog polja je klasa.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Statičkom polju s iz klase K se pristupa koristeći izraz K.s.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОО1]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94&amp;diff=1419</id>
		<title>НАД</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94&amp;diff=1419"/>
		<updated>2020-11-15T15:15:19Z</updated>

		<summary type="html">&lt;p&gt;WikiEditor: &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://numdis.etf.rs/nadSI.html Страница предмета за нумеричку анализу]&lt;br /&gt;
* [http://discretmat.etf.bg.ac.rs Страница предмета за дискретну математику]&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
{{Материјали&lt;br /&gt;
| vuk            = 1-sLpI_AC78xSPWCEG8bYRpnDTkhi5uF8&lt;br /&gt;
| box            = 8374949993&lt;br /&gt;
| scientificmind = IR2NUMDIS&lt;br /&gt;
| beastweb       = numericka-analiza-i-diskretna-matematika&lt;br /&gt;
}}&lt;br /&gt;
&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;
=== Колоквијум 1 ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = НАД/К1&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]]\n,,&lt;br /&gt;
}}&lt;br /&gt;
=== Колоквијум 2 ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = НАД/К2&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]]\n,,&lt;br /&gt;
}}&lt;br /&gt;
=== Колоквијум 3 ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = НАД/К3&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]]\n,,&lt;br /&gt;
}}&lt;br /&gt;
=== Интегрални испит ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = НАД/Испит&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]]\n,,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
&amp;lt;!-- Сажет начина оцењивања на предмету, колико бодова носи која активност и како се на крају додељују оцене на основу бодова. --&amp;gt;&lt;br /&gt;
*[http://numdis.etf.rs/PDF/13S082NAD_2020-2021-2.pdf Начин полагања испита у 2020/2021. години]&lt;br /&gt;
[[Категорија:Трећи семестар]]&lt;br /&gt;
[[Категорија:Изборни предмети]]&lt;br /&gt;
[[Категорија:НАД]]&lt;/div&gt;</summary>
		<author><name>WikiEditor</name></author>
	</entry>
</feed>