<?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=%D0%94%D0%B5%D1%98%D0%B0%D0%BD+%D0%9A%D0%BE%D0%B2%D0%B0%D1%87%D0%B5%D0%B2%D0%B8%D1%9B</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=%D0%94%D0%B5%D1%98%D0%B0%D0%BD+%D0%9A%D0%BE%D0%B2%D0%B0%D1%87%D0%B5%D0%B2%D0%B8%D1%9B"/>
	<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/%D0%94%D0%B5%D1%98%D0%B0%D0%BD_%D0%9A%D0%BE%D0%B2%D0%B0%D1%87%D0%B5%D0%B2%D0%B8%D1%9B"/>
	<updated>2026-06-04T03:00:17Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9C%D1%83%D0%BB%D1%82%D0%B8%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D0%BE%D1%80%D1%81%D0%BA%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8/%D0%9A1_2020&amp;diff=4970</id>
		<title>Мултипроцесорски системи/К1 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9C%D1%83%D0%BB%D1%82%D0%B8%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D0%BE%D1%80%D1%81%D0%BA%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8/%D0%9A1_2020&amp;diff=4970"/>
		<updated>2022-11-01T19:05:35Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: broj -&amp;gt; veličina&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Prvi kolokvijum 2020. godine&#039;&#039;&#039; održan je 3. novembra i trajao je 105 minuta. Postavka roka je dostupna sa [http://mups.etf.bg.ac.rs/ispiti/2020-2021/si4mps_k1_20202021.pdf stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti promenu principa projektovanja procesora koji favorizuju paralelno procesiranje.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Industrija je naišla na tri glavne prepreke pri povećanju kapaciteta procesora, &#039;&#039;power wall&#039;&#039; (struja je skupa, tranzistori su jeftini), &#039;&#039;memory wall&#039;&#039; (operacije sa memorijom su mnogo skuplje od operacija procesora) i &#039;&#039;ILP wall&#039;&#039; (dobici od paralelizma na nivou instrukcija su sve manji). Tu je uočena potreba da se ide ka slabijim višejezgarnim procesorima umesto jačim jednojezgarnim, pošto performanse procesora napreduju mnogo sporije nego ranije i takt više ne može da raste toliko brzo kao ranije, dok se na paralelizaciji programa mogu dobiti mnogo veći dobici u performansama.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je pretpostavka &#039;&#039;Gustafson&#039;&#039;-ovog zakona? Izvesti i precizno objasniti ovaj zakon.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&#039;&#039;Gustafson&#039;&#039;-ov zakon pretpostavlja da paralelni deo programa raste sa brojem procesora. To znači da ako za procesor sa &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; jezgara uzmemo da se program izvršava &amp;lt;math&amp;gt;T_p = \alpha T + \left(1 - \alpha\right) T&amp;lt;/math&amp;gt; gde je &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; procenat sekvencijalnog koda u aplikaciji, onda se za procesor sa jednim jezgrom taj isti program izvršava &amp;lt;math&amp;gt;T_1 = \alpha T + \left(1 - \alpha\right) pT&amp;lt;/math&amp;gt;. Ubrzanje je onda &amp;lt;math&amp;gt;S_p = \frac{T_1}{T_p} = \frac{\alpha T + \left(1 - \alpha\right) pT}{\alpha T + \left(1 - \alpha\right) T} = \frac{\alpha T + \left(1 - \alpha\right) pT}{T} = \alpha + \left(1 - \alpha\right) p&amp;lt;/math&amp;gt;. Ovo znači da &amp;lt;math&amp;gt;\lim_{p \to +\infty} S_p = +\infty&amp;lt;/math&amp;gt;, ali ova pretpostavka važi samo za skalabilne aplikacije.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Opisati tehnološke trendove u procesorskoj tehnologiji i njihove posledice.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Trend u procesorskoj tehnologiji je bio smanjenje veličine tranzistora. Smanjenjem veličine tranzistora možemo da spakujemo više tranzistora na istu količinu mesta i na taj način pravimo jače procesore. Nažalost, smanjenjem tranzistora oni menjaju svoje elektronske karakteristike, kola u kojima se oni koriste postaju nestabilnija i postoji ograničenje do kojeg se veličina tranzistora može smanjivati.&lt;br /&gt;
* Trend je takođe bio povećanje takta procesora, povećavajući broj izvršenih instrukcija po sekundi. Nažalost, kako su procesori rasli tako je raslo i kašnjenje između logičkih kola, i to predstavlja problem za povećanje takta procesora, koje je poslednje decenije usporilo. Takođe se dešava sa povećavanjem takta da se veća energija disipira na tako maloj površini, pa je procesoru potrebno mnogo bolje hlađenje, i tu takođe nailazimo na &#039;&#039;power wall&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dati uporedni pregled karakteristika programskih modela zajedničke memorije i prenosa poruka. U čemu se razlikuju arhitekture i organizacije sistema koji direktno podržavau&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; ove modele.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Pregled karakteristika&lt;br /&gt;
! Karakteristika&lt;br /&gt;
! Zajednička memorija&lt;br /&gt;
! Prenos poruka&lt;br /&gt;
|-&lt;br /&gt;
! Pristup memoriji&lt;br /&gt;
| Direktan pristup istoj memoriji&lt;br /&gt;
| Direktan pristup svojoj memoriji, posredstvom poruka pristup tuđim memorijama&lt;br /&gt;
|-&lt;br /&gt;
! Sinhronizacija&lt;br /&gt;
| Moraju se koristiti odvojene strukture (kapaciteti operativnog sistema i hardvera) kako bi se pristup memoriji sinhronizovao&lt;br /&gt;
| Implicitna, jer razmenjuju poruke&lt;br /&gt;
|-&lt;br /&gt;
! Kopiranje podataka&lt;br /&gt;
| Nije potrebno, drugi imaju pristup istoj memoriji kao mi&lt;br /&gt;
| Potrebno, jer jedino tako drugi mogu da dobiju sadržaj naše privatne memorije&lt;br /&gt;
|-&lt;br /&gt;
! Identitet&lt;br /&gt;
| Procesi ne (moraju da) znaju jedan za drugog&lt;br /&gt;
| Procesi znaju jedan za drugog&lt;br /&gt;
|-&lt;br /&gt;
! Arhitektura i organizacija&lt;br /&gt;
| Složenija, postoje UMA i NUMA varijante kako bi procesori delili memoriju između sebe i potrebno je održavati koherenciju keš memorija&lt;br /&gt;
| Manje složena, pošto procesori eksplicitno zahtevaju jedni od drugih memoriju koja im je potrebna, ali je zato softver koji to radi složeniji&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem OpenMP tehnologije, paralelizovati funkciju u prilogu koji računa vrednost određenog integrala korišćenjem Simpsonovog 1/3 pravila. Obratiti pažnju na efikasnost i korektnost paralelizacije. Smatrati da su sve promenljive ispravno deklarisane.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float simpsons(float ll, float ul, int n) {&lt;br /&gt;
    float h = (ul - ll) / n, x[10], fx[10];&lt;br /&gt;
    for (int i = 0; i &amp;lt;= n; i++) {&lt;br /&gt;
        x[i] = ll + i * h; fx[i] = func(x[i]);&lt;br /&gt;
    }&lt;br /&gt;
    float res = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt;= n; i++) {&lt;br /&gt;
        if (i == 0 || i == n) res += fx[i];&lt;br /&gt;
        else if (i % 2 != 0) res += 4 * fx[i];&lt;br /&gt;
        else res += 2 * fx[i];&lt;br /&gt;
    }&lt;br /&gt;
    res = res * (h / 3);&lt;br /&gt;
    return res;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Sledeće rešenje je pisano pod uslovom da su deklaracije &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;fx&amp;lt;/code&amp;gt; kao nizove od 10 brojeva simbolične i da &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; zapravo sme da bude veće 10, jer inače paralelizacija ovog programa ne bi imala nikakvog smisla.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; highlight=&amp;quot;3,8&amp;quot;&amp;gt;&lt;br /&gt;
float simpsons(float ll, float ul, int n) {&lt;br /&gt;
    float h = (ul - ll) / n, x[10], fx[10];&lt;br /&gt;
    #pragma omp parallel for default(none) shared(x, fx, ll, ul, n, h)&lt;br /&gt;
    for (int i = 0; i &amp;lt;= n; i++) {&lt;br /&gt;
        x[i] = ll + i * h; fx[i] = func(x[i]);&lt;br /&gt;
    }&lt;br /&gt;
    float res = 0;&lt;br /&gt;
    #pragma omp parallel for default(none) shared(fx) reduction(+:res)&lt;br /&gt;
    for (int i = 0; i &amp;lt;= n; i++) {&lt;br /&gt;
        if (i == 0 || i == n) res += fx[i];&lt;br /&gt;
        else if (i % 2 != 0) res += 4 * fx[i];&lt;br /&gt;
        else res += 2 * fx[i];&lt;br /&gt;
    }&lt;br /&gt;
    res = res * (h / 3);&lt;br /&gt;
    return res;&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;
Da li i na koji način OpenMP podržava ugneždeni paralelizam? Da li je moguće u okviru paralelnog regiona pokrenuti novi paralelni region i pod kojim uslovima?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
OpenMP podržava ugneždeni paralelizam, u smislu da je moguće ugnezditi paralelni region unutar drugog paralelnog regiona. Pri ugneždavanju će se stvoriti tim niti sa jednom niti u njemu, osim ukoliko ugneždavanje nije omogućeno korišćenjem &amp;lt;code&amp;gt;omp_set_nested(true)&amp;lt;/code&amp;gt; funkcije, ili &amp;lt;code&amp;gt;OMP_NESTED&amp;lt;/code&amp;gt; promenljive okruženja. Neke implementacije ne podržavaju ove metode ugneždavanja, i u njima će ugneždeni tim niti uvek imati jednu nit.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se posmatra jedna aplikacija za prikupljanje i agregaciju podataka sa interneta. Aplikacija se sastoji od veb tragača (&#039;&#039;web crawler&#039;&#039;) koji prikuplja određene informacije na internetu, a zatim se radi obrada. Nakon merenja performansi sekvencijalne implementacije posmatrane aplikacije pri uobičajenoj upotrebi, dobijeni su sledeći rezultati: aplikacija 45% vremena provodi obavljajući ulazno-izlazne operacije (sekvencijalno prikupljanje podataka iz jednog izvora), a 55% vremena provodi u obradi podataka. Tipično vreme obrade jednog paketa podataka korišćenjem jednog jezgra je 1s.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Ukoliko se aplikacija paralelizuje za izvršavanje na SMP sistemu sa 8 jezgara na 2GHz sa 32GB memorije, navesti formulu za Amdalov zakon i odrediti maksimalno moguće ubrzanje koje se može postići za zadatu aplikaciju.&lt;br /&gt;
# Da li i na koji način može organizovati paralelno izvršavanje sekvencijalnog dela aplikacije, ukoliko paketi sa interneta mogu nezavisno da se obrađuju? Smatrati da paketi imaju neujednačeno vreme obrade i diskutovati moguće načine paralelne obrade.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Formula za Amdalov zakon glasi:&lt;br /&gt;
* &amp;lt;math&amp;gt;T_p = \alpha T_1 + (1 - \alpha) \frac{T_1}{p}&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;S_p = \frac{T_1}{T_P} = \frac{1}{\alpha + \frac{1 - \alpha}{p}} = \frac{p}{\alpha p + 1 - \alpha}&amp;lt;/math&amp;gt;&lt;br /&gt;
Kako je nama ovde &amp;lt;math&amp;gt;\alpha = 0.45&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;p = 8&amp;lt;/math&amp;gt; maksimalno ubrzanje koje možemo da postignemo je &amp;lt;math&amp;gt;S_p = \frac{8}{0.45 \cdot 8 + 1 - 0.45} \approx 1.93&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aplikacija može da održava osam niti, od kojih jedna nit radi primanje podataka preko interneta i kako pristižu paketi ubacuje ih u neku deljenu strukturu i nekom sinhronizacionom primitivom signalizira da ima paketa za obradu (slično &#039;&#039;bag of tasks&#039;&#039; pristupu korišćenjem programskog modela deljene memorije). Ostalih sedam niti mogu da iz ove vreće zadataka preuzimaju pakete za obradu i obrađuju ih paralelno. Bez obzira na to što paketi imaju neujednačeno vreme obrade, niti ne moraju da čekaju jedna na drugu tako da dok jedna nit obrađuje zahtevniji paket ostale niti ne zavise od nje (ne postoji &#039;&#039;bottleneck&#039;&#039;). Više od osam niti verovatno neće ubrzati aplikaciju jer će svesti na klasičan &#039;&#039;time-sharing&#039;&#039; umesto paralelne obrade.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Мултипроцесорски системи]]&lt;/div&gt;</summary>
		<author><name>Дејан Ковачевић</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/%D0%9A2_2022&amp;diff=4510</id>
		<title>Веб дизајн/К2 2022</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/%D0%9A2_2022&amp;diff=4510"/>
		<updated>2022-07-10T11:18:37Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: додат К2 2022 из Веб дизајна&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
Потребно је направити игру меморије. Треба направити квадрат 3x3 и слајдер за избор броја случајно генерисаних поља. Игра почиње тако што се генерише изабрани број случајних поља и поља се обоје у плаво (поља се боје једно по једно, и држе се обојена 1 s након чега се враћају у белу боју). Након тога треба да се изаберу та поља притиском миша. Све док се бирају добра поља она се боје у зелено, када се први пут изабере поље које није генерисано сва изабрана поља се боје у црвено и држе се тако 1 s након чега се враћају у белу боју. Треба омогућити да се након тога поново могу погађати поља. Ако се погоде сва поља треба исписати поруку да је игра завршена и омогућити да се поново могу генерисати поља.&lt;br /&gt;
&lt;br /&gt;
== Решење ==&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Веб дизајн]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Дејан Ковачевић</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2022&amp;diff=4037</id>
		<title>Пројектовање софтвера/Фебруар 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2022&amp;diff=4037"/>
		<updated>2022-02-22T19:17:00Z</updated>

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

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

		<summary type="html">&lt;p&gt;Дејан Ковачевић: valjda se gledalo da li je tekući rok otvoren za prijavu predmeta ako ne grešim&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Prva nadoknada druge laboratorijske vežbe 2022. godine&#039;&#039;&#039; održana je početkom februara 2022. godine. Baza je takođe bila identična kao prethodnih godina.&lt;br /&gt;
&lt;br /&gt;
== Postavka ==&lt;br /&gt;
Za deo baze podataka fakulteta kreirati servis sa sledećim krajnjim tačkama:&lt;br /&gt;
* &#039;&#039;(8 poena)&#039;&#039; &amp;lt;code&amp;gt;POST .../prijava/{idPredmeta}&amp;lt;/code&amp;gt;&lt;br /&gt;
** &#039;&#039;request body:&#039;&#039; prazno&lt;br /&gt;
** &#039;&#039;response body:&#039;&#039; prazno&lt;br /&gt;
** Pravo za izvršavanje ove metode ima samo student. Student može da prijavi predmet samo ukoliko prati taj predmet, za tekući rok je omogućena prijava predmeta i rok prijave predmeta je u istom semestru kao i sam predmet.&lt;br /&gt;
* &#039;&#039;(4 poena)&#039;&#039; &amp;lt;code&amp;gt;POST .../admin/&amp;lt;/code&amp;gt;&lt;br /&gt;
** &#039;&#039;request body:&#039;&#039; (&amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt;) Sve informacije su u sledećem formatu: &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;korisnik&amp;gt;&lt;br /&gt;
    &amp;lt;imeKor&amp;gt;...&amp;lt;/imeKor&amp;gt;&lt;br /&gt;
    &amp;lt;sifra&amp;gt;...&amp;lt;/sifra&amp;gt;&lt;br /&gt;
&amp;lt;/korisnik&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** &#039;&#039;response body:&#039;&#039; prazno&lt;br /&gt;
** Pravo za izvršavanje ove metode ima samo admin. Metoda kreijra novog admina sa datim informacijama.&lt;br /&gt;
&lt;br /&gt;
== ER dijagram ==&lt;br /&gt;
: &#039;&#039;Baza i skripta ispod su identični kao na [[Информациони системи 1/Лаб 2 2020|drugoj laboratorijskoj vežbi 2020. godine]].&#039;&#039;&lt;br /&gt;
Na slici je dat model dela baze podataka fakulteta.&lt;br /&gt;
[[Датотека:IS1 lab 2 2020 dijagram.svg|center|frame|Дати ЕР дијаграм базе података.]]&lt;br /&gt;
Status u &amp;lt;code&amp;gt;semestar&amp;lt;/code&amp;gt; ima vrednosti:&lt;br /&gt;
* &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; — nije u toku&lt;br /&gt;
* &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; — omogućena nova praćenja predmeta&lt;br /&gt;
* &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; — u toku&lt;br /&gt;
Status u &amp;lt;code&amp;gt;rok&amp;lt;/code&amp;gt; ima vrednosti:&lt;br /&gt;
* &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; — nije u toku&lt;br /&gt;
* &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; — omogućena prijava predmeta&lt;br /&gt;
* &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; — u toku&lt;br /&gt;
&lt;br /&gt;
=== SQL ===&lt;br /&gt;
Sledeća SQL skripta pravi bazu prikazanu na dijagramu iznad zajedno sa podacima koji mogu da se koriste za testiranje.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE `korisnik` (&lt;br /&gt;
    `id` INT PRIMARY KEY AUTO_INCREMENT,&lt;br /&gt;
    `korisnicko_ime` VARCHAR(45),&lt;br /&gt;
    `sifra` VARCHAR(45)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE `admin` (&lt;br /&gt;
    `korisnik_id` INT PRIMARY KEY,&lt;br /&gt;
    FOREIGN KEY (`korisnik_id`) REFERENCES `korisnik` (`id`)&lt;br /&gt;
        ON DELETE CASCADE&lt;br /&gt;
        ON UPDATE NO ACTION&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE `student` (&lt;br /&gt;
    `korisnik_id` INT PRIMARY KEY,&lt;br /&gt;
    `indeks` VARCHAR(45),&lt;br /&gt;
    `ime_prezime` VARCHAR(45) NOT NULL,&lt;br /&gt;
    `godina` INT,&lt;br /&gt;
    FOREIGN KEY (`korisnik_id`) REFERENCES `korisnik` (`id`)&lt;br /&gt;
        ON DELETE CASCADE&lt;br /&gt;
        ON UPDATE NO ACTION&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE `nastavnik` (&lt;br /&gt;
    `korisnik_id` INT PRIMARY KEY,&lt;br /&gt;
    `ime_prezime` VARCHAR(45),&lt;br /&gt;
    FOREIGN KEY (`korisnik_id`) REFERENCES `korisnik` (`id`)&lt;br /&gt;
        ON DELETE CASCADE&lt;br /&gt;
        ON UPDATE NO ACTION&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE `semestar` (&lt;br /&gt;
    `id` INT PRIMARY KEY AUTO_INCREMENT,&lt;br /&gt;
    `naziv` VARCHAR(45) NOT NULL,&lt;br /&gt;
    `status` VARCHAR(1)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE `predmet` (&lt;br /&gt;
    `id` INT PRIMARY KEY AUTO_INCREMENT,&lt;br /&gt;
    `sifra` VARCHAR(45) NOT NULL,&lt;br /&gt;
    `naziv` VARCHAR(45) NOT NULL,&lt;br /&gt;
    `semestar_id` INT NOT NULL,&lt;br /&gt;
    `godina` INT,&lt;br /&gt;
    FOREIGN KEY (`semestar_id`) REFERENCES `semestar` (`id`)&lt;br /&gt;
        ON DELETE CASCADE&lt;br /&gt;
        ON UPDATE NO ACTION&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE `predaje` (&lt;br /&gt;
    `nastavnik_korisnik_id` INT,&lt;br /&gt;
    `predmet_id` INT,&lt;br /&gt;
    PRIMARY KEY (`nastavnik_korisnik_id`, `predmet_id`),&lt;br /&gt;
    FOREIGN KEY (`nastavnik_korisnik_id`) REFERENCES `nastavnik` (`korisnik_id`)&lt;br /&gt;
        ON DELETE CASCADE&lt;br /&gt;
        ON UPDATE NO ACTION,&lt;br /&gt;
    FOREIGN KEY (`predmet_id`) REFERENCES `predmet` (`id`)&lt;br /&gt;
        ON DELETE CASCADE&lt;br /&gt;
        ON UPDATE NO ACTION&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE `prati` (&lt;br /&gt;
    `id` INT PRIMARY KEY AUTO_INCREMENT,&lt;br /&gt;
    `predmet_id` INT NOT NULL,&lt;br /&gt;
    `student_korisnik_id` INT NOT NULL,&lt;br /&gt;
    FOREIGN KEY (`predmet_id`) REFERENCES `predmet` (`id`)&lt;br /&gt;
        ON DELETE CASCADE&lt;br /&gt;
        ON UPDATE NO ACTION,&lt;br /&gt;
    FOREIGN KEY (`student_korisnik_id`) REFERENCES `student` (`korisnik_id`)&lt;br /&gt;
        ON DELETE CASCADE&lt;br /&gt;
        ON UPDATE NO ACTION&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE `rok` (&lt;br /&gt;
    `id` INT PRIMARY KEY AUTO_INCREMENT,&lt;br /&gt;
    `naziv` VARCHAR(45) NOT NULL,&lt;br /&gt;
    `semestar_id` INT NOT NULL,&lt;br /&gt;
    `status` VARCHAR(1),&lt;br /&gt;
    FOREIGN KEY (`semestar_id`) REFERENCES `semestar` (`id`)&lt;br /&gt;
        ON DELETE CASCADE&lt;br /&gt;
        ON UPDATE NO ACTION&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE `prijava` (&lt;br /&gt;
    `id` INT PRIMARY KEY AUTO_INCREMENT,&lt;br /&gt;
    `prati_id` INT NOT NULL,&lt;br /&gt;
    `rok_id` INT NOT NULL,&lt;br /&gt;
    FOREIGN KEY (`prati_id`) REFERENCES `prati` (`id`)&lt;br /&gt;
        ON DELETE CASCADE&lt;br /&gt;
        ON UPDATE NO ACTION,&lt;br /&gt;
    FOREIGN KEY (`rok_id`) REFERENCES `rok` (`id`)&lt;br /&gt;
        ON DELETE CASCADE&lt;br /&gt;
        ON UPDATE NO ACTION&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE `ocena` (&lt;br /&gt;
    `id` INT PRIMARY KEY AUTO_INCREMENT,&lt;br /&gt;
    `ocena` INT,&lt;br /&gt;
    `prijava_id` INT NOT NULL,&lt;br /&gt;
    FOREIGN KEY (`prijava_id`) REFERENCES `prijava` (`id`)&lt;br /&gt;
        ON DELETE CASCADE&lt;br /&gt;
        ON UPDATE NO ACTION&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `korisnik` (`korisnicko_ime`, `sifra`) VALUES&lt;br /&gt;
(&#039;admin&#039;, &#039;admin&#039;),         -- 1&lt;br /&gt;
(&#039;pera&#039;, &#039;peric&#039;),          -- 2&lt;br /&gt;
(&#039;mika&#039;, &#039;mikic&#039;),          -- 3&lt;br /&gt;
(&#039;zika&#039;, &#039;zikic&#039;),          -- 4&lt;br /&gt;
(&#039;cmilos&#039;, &#039;cmilos&#039;),       -- 5&lt;br /&gt;
(&#039;tasha&#039;, &#039;tasha&#039;),         -- 6&lt;br /&gt;
(&#039;stubic&#039;, &#039;stubic&#039;),       -- 7&lt;br /&gt;
(&#039;tartalja&#039;, &#039;tartalja&#039;);   -- 8&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `admin` (`korisnik_id`) VALUES (1);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `student` (`korisnik_id`, `indeks`, `ime_prezime`, `godina`) VALUES&lt;br /&gt;
(2, &#039;0001&#039;, &#039;Pera Perić&#039;, 2019),&lt;br /&gt;
(3, &#039;0002&#039;, &#039;Mika Mikić&#039;, 2020),&lt;br /&gt;
(4, &#039;0010&#039;, &#039;Žika Žikić&#039;, 2018);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `nastavnik` (`korisnik_id`, `ime_prezime`) VALUES&lt;br /&gt;
(5, &#039;Miloš Cvetanović&#039;),&lt;br /&gt;
(6, &#039;Tamara Šekularac&#039;),&lt;br /&gt;
(7, &#039;Stefan Tubić&#039;),&lt;br /&gt;
(8, &#039;Igor Tartalja&#039;);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `semestar` (`naziv`, `status`) VALUES&lt;br /&gt;
(&#039;Peti semestar 2019&#039;, &#039;N&#039;),    -- 1&lt;br /&gt;
(&#039;Peti semestar 2021&#039;, &#039;T&#039;),    -- 2&lt;br /&gt;
(&#039;Treći semestar 2021&#039;, &#039;T&#039;),   -- 3&lt;br /&gt;
(&#039;Drugi semestar 2022&#039;, &#039;P&#039;),   -- 4&lt;br /&gt;
(&#039;Četvrti semestar 2022&#039;, &#039;P&#039;); -- 5&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `predmet` (`sifra`, `naziv`, `semestar_id`, `godina`) VALUES&lt;br /&gt;
(&#039;13S113IS1&#039;, &#039;Informacioni sistemi 1&#039;, 2, 2021),                   -- 1&lt;br /&gt;
(&#039;13E114IS1&#039;, &#039;Informacioni sistemi 1&#039;, 2, 2021),                   -- 2&lt;br /&gt;
(&#039;13S112OO1&#039;, &#039;Objektno orijentisano programiranje 1&#039;, 3, 2021),    -- 3&lt;br /&gt;
(&#039;13E112OO1&#039;, &#039;Objektno orijentisano programiranje 1&#039;, 3, 2021),    -- 4&lt;br /&gt;
(&#039;13S112OO2&#039;, &#039;Objektno orijentisano programiranje 2&#039;, 5, 2022),    -- 5&lt;br /&gt;
(&#039;13E112OO2&#039;, &#039;Objektno orijentisano programiranje 2&#039;, 5, 2022);    -- 6&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `predaje` (`nastavnik_korisnik_id`, `predmet_id`) VALUES&lt;br /&gt;
(8, 3),&lt;br /&gt;
(8, 4),&lt;br /&gt;
(8, 5),&lt;br /&gt;
(8, 6),&lt;br /&gt;
(5, 1),&lt;br /&gt;
(5, 2),&lt;br /&gt;
(6, 1),&lt;br /&gt;
(6, 2),&lt;br /&gt;
(7, 1),&lt;br /&gt;
(7, 2);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `prati` (`predmet_id`, `student_korisnik_id`) VALUES&lt;br /&gt;
(1, 2), -- 1: Pera prati IS1&lt;br /&gt;
(2, 3), -- 2: Mika prati IS1&lt;br /&gt;
(3, 3), -- 3: Mika prati OO1&lt;br /&gt;
(3, 4); -- 4: Žika prati OO1&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `rok` (`naziv`, `semestar_id`, `status`) VALUES&lt;br /&gt;
(&#039;Januar&#039;, 1, &#039;N&#039;),     -- 1&lt;br /&gt;
(&#039;Januar&#039;, 2, &#039;T&#039;),     -- 2&lt;br /&gt;
(&#039;Januar&#039;, 3, &#039;T&#039;),     -- 3&lt;br /&gt;
(&#039;Februar&#039;, 2, &#039;P&#039;),    -- 4&lt;br /&gt;
(&#039;Februar&#039;, 3, &#039;P&#039;);    -- 5&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `prijava` (`prati_id`, `rok_id`) VALUES&lt;br /&gt;
(1, 2), -- 1: Pera prijavio IS1 za januar&lt;br /&gt;
(1, 4), -- 2: Pera prijavio IS1 za februar&lt;br /&gt;
(2, 2), -- 3: Mika prijavio IS1 za februar&lt;br /&gt;
(3, 5), -- 4: Mika prijavio OO1 za februar&lt;br /&gt;
(4, 3); -- 5: Žika prijavio OO1 za januar&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `ocena` (`ocena`, `prijava_id`) VALUES&lt;br /&gt;
(5, 1),&lt;br /&gt;
(10, 5);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rešenje ==&lt;br /&gt;
=== &amp;lt;code&amp;gt;persistence.xml&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Definiše jedinicu perzistencije &amp;lt;code&amp;gt;mypu&amp;lt;/code&amp;gt;. Pretpostavlja se postojanje resursa &amp;lt;code&amp;gt;fakultetResource&amp;lt;/code&amp;gt; koji je povezan na odgovarajući Connection Pool na Glassfish.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;persistence version=&amp;quot;2.2&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/persistence&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;persistence-unit name=&amp;quot;mypu&amp;quot; transaction-type=&amp;quot;JTA&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;jta-data-source&amp;gt;fakultetResource&amp;lt;/jta-data-source&amp;gt;&lt;br /&gt;
        &amp;lt;exclude-unlisted-classes&amp;gt;false&amp;lt;/exclude-unlisted-classes&amp;gt;&lt;br /&gt;
    &amp;lt;/persistence-unit&amp;gt;&lt;br /&gt;
&amp;lt;/persistence&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;models&amp;lt;/code&amp;gt; paket ===&lt;br /&gt;
Ovde su generisane klase entiteta iz baze priložene iznad sa podrazumevanim podešavanjima.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;filters&amp;lt;/code&amp;gt; paket ===&lt;br /&gt;
==== &amp;lt;code&amp;gt;BasicAuthFilter.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;resources&amp;lt;/code&amp;gt; paket ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Информациони системи 1]]&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>Дејан Ковачевић</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A0%D0%A22&amp;diff=3035</id>
		<title>ОРТ2</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A0%D0%A22&amp;diff=3035"/>
		<updated>2021-10-05T15:47:37Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: prepisan rok&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Основи рачунарске технике 2&#039;&#039;&#039; је обавезан предмет у трећем семестру.&lt;br /&gt;
&lt;br /&gt;
== Странице ==&lt;br /&gt;
* [https://rti.etf.bg.ac.rs/rti/ir2ort2/ Страница предмета]&lt;br /&gt;
* [https://elearning.rcub.bg.ac.rs/moodle/course/view.php?id=604 &#039;&#039;Moodle&#039;&#039; курс]&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
{{Материјали&lt;br /&gt;
| vuk = 1-4dW6LftaVw6CtwuuXwUEVrnrH9TgfER&lt;br /&gt;
| box = 8374329465&lt;br /&gt;
}}&lt;br /&gt;
* [https://sourceforge.net/projects/circuit/ &#039;&#039;Logisim&#039;&#039;] — Симулатор дигиталне логике који се користи при изради пројекта, као и за решења рокова на викију.&lt;br /&gt;
* &#039;&#039;[[github:reds-heig/logisim-evolution|Logisim-evolution]]&#039;&#039; — Унапређена верзија &#039;&#039;Logisim&#039;&#039;&lt;br /&gt;
* [https://mega.nz/folder/As1A1TZY#z-SnQ4VsucNAwTLQgZjFug Рокови и решења (РТИ)]&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Пројекат се од 2020/21. године ради на &#039;&#039;Logisim&#039;&#039; симулатору дигиталне логике. У одељку [[#Корисне везе|Корисне везе]] изнад доступне су везе за преузимање &#039;&#039;Logisim&#039;&#039; и &#039;&#039;Logisim-evolution&#039;&#039; симулатора, а потребне су и ЕТФ библиотеке са компонентама које су доступне за:&lt;br /&gt;
* Стари &#039;&#039;Logisim&#039;&#039;, на страници предмета под одељком &amp;quot;Пројекат&amp;quot;&lt;br /&gt;
* [[Медиј:ORT2 ETF-evolution.circ|&#039;&#039;Logisim-evolution&#039;&#039;]] - препоручује се именовање преузете датотеке као &amp;lt;code&amp;gt;ETF-evolution.circ&amp;lt;/code&amp;gt;&lt;br /&gt;
Ове библиотеке је најбоље поставити у исти директоријум као шеме које преузимате са викија, али ће вас &#039;&#039;Logisim&#039;&#039; свакако питати да изаберете путању до ових библиотека уколико то не урадите.&lt;br /&gt;
&lt;br /&gt;
За пројекат школске 2020/21. године је доступан [[ОРТ2/Пројекат 2021|водич]], а могуће је да ће и следећих година информације из њега остати релевантне.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
=== Колоквијум 1 ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = ОРТ2/К1&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦6¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Колоквијум 2 ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = ОРТ2/К2&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦6¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Колоквијум 3 ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = ОРТ2/К3&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦6¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Испит ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = ОРТ2/Јануар&lt;br /&gt;
| titleregexp     = ОРТ2/Фебруар&lt;br /&gt;
| titleregexp     = ОРТ2/Јул&lt;br /&gt;
| titleregexp     = ОРТ2/Август&lt;br /&gt;
| titleregexp     = ОРТ2/Септембар&lt;br /&gt;
| titleregexp     = ОРТ2/Октобар&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦6¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Лаб вежбе ==&lt;br /&gt;
На предмету се одржавају две лабораторијске вежбе од којих свака носи по 5 бодова. Лабораторијска вежба почиње улазним тестом на &#039;&#039;Moodle&#039;&#039; платформи од 10 минута и 3 питања, за који се примери могу наћи на страници предмета у одељку &amp;quot;Лабораторијске вежбе&amp;quot; (питалице су истог облика као на лабораторијској вежби). После улазног теста се прелази на рад у симулатору и за тај део се пишу одговори на задата питања у вези са задатим програмом у документу који се на крају вежбе предаје на мрежни диск. Током лабораторијске вежбе демонстратор такође испитује студента за 3 бода. Уколико је студент на улазном тесту освојио 2 бода, на бодове демонстратора се додаје 1 бод, а уколико је освојио 3 бода, на бодове демонстратора се додају 2 бода. Ако је студент освојио 0 или 1 бод на улазном тесту, не наставља с радом лабораторијске вежбе и добија 0 бодова. Збир бодова са улазног теста и од демонстратора се скалира са процентом урађености дела лабораторијске вежбе са симулатором, и тако се израчунавају коначни бодови на тој лабораторијској вежби.&lt;br /&gt;
&lt;br /&gt;
Укратко:&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — Бодови освојени на улазном тесту (од 0 до 3)&lt;br /&gt;
* &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; — Бодови освојени од демонстратора (од 0 до 3)&lt;br /&gt;
* &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — Проценат урађености дела лабораторијске вежбе са симулатором (од 0 до 1)&lt;br /&gt;
* Коначна оцена: &amp;lt;math&amp;gt;\left\{\begin{array}{ll} 0 &amp;amp; T &amp;lt; 2 \\ (T - 1 + D) \cdot S &amp;amp; T \geq 2 \end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &#039;&#039;&#039;K1&#039;&#039;&#039;, &#039;&#039;&#039;K2&#039;&#039;&#039;  — Бодови са првог и другог колоквијума, носе по 20 бодова.&lt;br /&gt;
* &#039;&#039;&#039;L1&#039;&#039;&#039;, &#039;&#039;&#039;L2&#039;&#039;&#039; — Бодови са лабораторијских вежби, носе по 5 бодова.&lt;br /&gt;
* &#039;&#039;&#039;I&#039;&#039;&#039; — Испитни део, носи 20 бодова.&lt;br /&gt;
* &#039;&#039;&#039;Pr&#039;&#039;&#039; — Носи 30 бодова.&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 + Pr&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;
* {{zadaci|postavke}}&lt;br /&gt;
* {{zadaci|rešenja}}&lt;br /&gt;
*: Рокови који су преписани а нису решени су: {{rokovi|нерешени}}&lt;br /&gt;
*: Рокови којима недостаје понеко решење су: {{rokovi|делимично решени}}&lt;br /&gt;
*: Од решења лошијег квалитета које би требало преписати на вики доступан је [https://cdn.discordapp.com/attachments/693906682228506634/774674602785767424/ORT2_KLK1_2018.zip К1 2018.]&lt;br /&gt;
* Пошто су задаци за први колоквијум обично шаблонски, али је први колоквијум обично најтежи, од користи би био водич за решавање првог колоквијума.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Трећи семестар]]&lt;br /&gt;
[[Категорија:Обавезни предмети]]&lt;br /&gt;
[[Категорија:ОРТ2]]&lt;/div&gt;</summary>
		<author><name>Дејан Ковачевић</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A0%D0%A22/%D0%9A3_%D0%90%D0%B2%D0%B3%D1%83%D1%81%D1%82_2021&amp;diff=3003</id>
		<title>ОРТ2/К3 Август 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A0%D0%A22/%D0%9A3_%D0%90%D0%B2%D0%B3%D1%83%D1%81%D1%82_2021&amp;diff=3003"/>
		<updated>2021-09-30T18:09:58Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: dodat sadrzaj&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
Посматра се део рачунара који чине меморија и процесор. Меморија је капацитета 2&amp;lt;sup&amp;gt;16&amp;lt;/sup&amp;gt; бајтова. Ширина меморијске речи је 1 бајт. Процесор је са једноадресним форматом инструкција. Адресе и подаци су дужине 16 бита и заузимају по две суседне меморијске локације, при чему се старији бајт налаѕи на вишој, а млађи на нижој адреси.&lt;br /&gt;
&lt;br /&gt;
У процесору постоји регистар програмског бројача PC дужине 2 бајта, адресни регистар меморије MAR дужине 2 бајта, прихватни регистар података меморије MDR дужине 1 бајт, прихватни регистар инструкције IR дужине 3 бајта, акумулатор А дужине 2 бајта, прихватни регистар података B дужине 2 бајта, регистри опште намене R0 до R3 дужине 2 бајта, програмска статусна реч PSW дужине 1 бајт. Програмска статусна реч PSW садржи битове N, Z, C и V који се ажурирају приликом рада процесора. Инструкције су дужине 1, 2 или 3 бајта.&lt;br /&gt;
&lt;br /&gt;
Битови 7, 6 и 5 првог бајта инструкције су 000 за све инструкције скока. Код инструкција условног скока бит 4 првог бајта инструкције је 0, док код инструкција безусловног скока бит 4 првог бајта инструкције је 1. Инструкција условног скока је инструкција условног скока уколико је резултат већи (BGRT - &#039;&#039;not((PSWN xor PSWV) or PSWZ)&#039;&#039;) и инструкције безусловног скока су инструкција безусловног скока (JMP) и инструкција скока на потпрограм (JSR). Битовима 3 до 0 првог бајта инструкције специфира се код инструкције и на освову тога су за инструкције BGRT, JMP и JSR усвојени кодови операције 00000000, 00010000 и 00010001, респективно. Инструкције JMP и JSR се реализују као апсолутни скокови, при чему је адреса дата другим и трећим бајтом инструкције. Дужина инструкција је 3 бајта. Инструкција BGRT се реализује као релативни скок у односу на текућу вредност програмског бројача PC, а померај је 8-битна целобројна величина са знаком дата другим бајтом инструкције. Дужина инструкције је 2 бајта.&lt;br /&gt;
&lt;br /&gt;
Битови 7, 6 и 5 првог бајта инструкције су 001 за све безадресне инструкције. Безадресне инструкције су инструкције стављања садржаја акумулатора на стек (PUSH), пуњења акумулатора садржајем са стека (POP) и инструкција декрементирања акумулатора (DEC). Битовима 4 до 0 првог бајта инструкције специфира се код операције за безадресне инструкције. На основу тога су за инструкције PUSH, POP и DEC усвојени кодови операција 00100000, 00100001 и 00100010, респективно. Дужина инструкција је 1 бајт.&lt;br /&gt;
&lt;br /&gt;
Битови 7, 6 и 5 првог бајта инструкције имају вредности од 010 до 111 за адресне инструкције. Адресне инструкције су инструкција преноса у акумулатор (LD), инструкција преноса из акумулатора (ST), инструкција аритметичког померања удесно за једно место (ASR), инструкција упоређивања акумулатора са операндом (CMP), инструкција сабирања (ADD) и инструкција одузимања (SUB). На основу тога су за инструкције LD, ST, ASR, CMP, ADD и SUB усвојени кодови операција 010, 011, 100, 101, 110 и 111, респективно. Дужина инструкција је 2 или 3 бајта и зависи од специфичног начина адресирања.&lt;br /&gt;
&lt;br /&gt;
Начини адресирања су специфирани битовима 4, 3 и 2 првог бајта инструкције и то на следећи начин: 000-меморијско директно адресирање (memdir), 001-меморијско индиректно адресирање (memind), 010-регистарско директно адресирање (regdir), 011-регистарско инсиректно адресирање (regind), 100-релативно адресирање са померајем (pcrel), 101-непосредно адресирање (immed) и 110-регистарско индиректно адресирање са преинкрементирањем (preincr). Код меморијског директног и меморијског индиректног адресирања 16-битна адреса меморијске локације је дата другим и трећим бајтом инструкције. Битови 1 и 0 првог бајта инструкције се не користе. Дужина инструкције је 3 бајта. Регистарско директно, регистарско индиректно и регистарско индиректно адресирање са преинкрементирањем користе неке од регистара опште намене R0 до R3 специфиране битовима 1 и 0 првог бајта. Дужина инструкција је 1 бајт. Код релативног адресирања са померајем други бајт инструкције садржи 8-битни померај који је дат као целобројна величина са знаком. Битови 1 и 0 првог бајта инструкције се не користе. Дужина инструкција је 2 бајта. Код непосредног адресирања 16-битни операнд дат је другим и трећим бајтом инструкције. Битови 1 и 0 првог бајта инструкције се не користе. Дужина инструкција је 3 бајта.&lt;br /&gt;
&lt;br /&gt;
Стек расте према вишим меморијским локацијама, а регистар SP указује на прву слободну меморијску локацију. Процесор нема могућност обраде прекида.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
#Пројектовати део операционе јединице процесора (фазе: FETCH, ADDR и EXEC) која је потребна да се изврши инструкција &#039;&#039;&#039;CMP (PC)pom&#039;&#039;&#039;. Померај &#039;&#039;&#039;pom&#039;&#039;&#039; је целобројна величина са знаком који је дат другим бајтом инструкције. Цртати само неопходне компоненте које су потребне за извршавање наведене инструкције.&lt;br /&gt;
#Дати су почетни садржаји регистара и индикатора: PC = 1000h, SP = 2000h, ACC = 0010h, R0 = 0000h, R1 = 0001h, R2 = 0002h, R3 = 0003h, N = 0, Z = 0, V = 0 и C = 0. Индикатори статусне речи на које инструкција не утиче треба да остану непромењени. Извршити 7 сукцесивних наредби и за сваку наредбу одредити следеће: у фази читања инструкције - меморијске адресе са којих је прочитана инструкција, садржај регистара IR, инструкцију која је прочитана и нови садржај регистра PC; у фази одрђивања адресе операнда и читања операнда - меморијске адресе са којих је прочитана адреса операнда, меморијске адресе са којих је прочитан операнд, вредност операнда и нови садржај регистара опште намене који су у овој фази промењени; у фази извршавања операције - меморијске адресе којима се у овој фази приступа, садржај акумулатора А и индикатора N, Z, V и C након извршавања инструкције и нови садржај регистара и меморијских локација који су у овој фази промењени. Резултате представити у табелама 1, 2 и 3 формулара.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ОРТ2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Дејан Ковачевић</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A0%D0%A22/%D0%9A3_%D0%90%D0%B2%D0%B3%D1%83%D1%81%D1%82_2021&amp;diff=3002</id>
		<title>ОРТ2/К3 Август 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A0%D0%A22/%D0%9A3_%D0%90%D0%B2%D0%B3%D1%83%D1%81%D1%82_2021&amp;diff=3002"/>
		<updated>2021-09-30T18:00:34Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: Нова страница: == Поставка == Посматра се део рачунара који чине меморија и процесор. Меморија је капацитета…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Поставка ==&lt;br /&gt;
Посматра се део рачунара који чине меморија и процесор. Меморија је капацитета 2&amp;lt;sup&amp;gt;16&amp;lt;/sup&amp;gt; бајтова. Ширина меморијске речи је 1 бајт. Процесор је са једноадресним форматом инструкција. Адресе и подаци су дужине 16 бита и заузимају по две суседне меморијске локације, при чему се старији бајт налаѕи на вишој, а млађи на нижој адреси.&lt;br /&gt;
&lt;br /&gt;
У процесору постоји регистар програмског бројача PC дужине 2 бајта, адресни регистар меморије MAR дужине 2 бајта, прихватни регистар података меморије MDR дужине 1 бајт, прихватни регистар инструкције IR дужине 3 бајта, акумулатор А дужине 2 бајта, прихватни регистар података B дужине 2 бајта, регистри опште намене R0 до R3 дужине 2 бајта, програмска статусна реч PSW дужине 1 бајт. Програмска статусна реч PSW садржи битове N, Z, C и V који се ажурирају приликом рада процесора. Инструкције су дужине 1, 2 или 3 бајта.&lt;br /&gt;
&lt;br /&gt;
Битови 7, 6 и 5 првог бајта инструкције су 000 за све инструкције скока. Код инструкција условног скока бит 4 првог бајта инструкције је 0, док код инструкција безусловног скока бит 4 првог бајта инструкције је 1. Инструкција условног скока је инструкција условног скока уколико је резултат већи (BGRT - &#039;&#039;not((PSWN xor PSWV) or PSWZ)&#039;&#039;) и инструкције безусловног скока су инструкција безусловног скока (JMP) и инструкција скока на потпрограм (JSR). Битовима 3 до 0 првог бајта инструкције специфира се код инструкције и на освову тога су за инструкције BGRT, JMP и JSR усвојени кодови операције 00000000, 00010000 и 00010001, респективно. Инструкције JMP и JSR се реализују као апсолутни скокови, при чему је адреса дата другим и трећим бајтом инструкције. Дужина инструкција је 3 бајта. Инструкција BGRT се реализује као релативни скок у односу на текућу вредност програмског бројача PC, а померај је 8-битна целобројна величина са знаком дата другим бајтом инструкције. Дужина инструкције је 2 бајта.&lt;br /&gt;
&lt;br /&gt;
Битови 7, 6 и 5 првог бајта инструкције су 001 за све безадресне инструкције. Безадресне инструкције су инструкције стављања садржаја акумулатора на стек (PUSH), пуњења акумулатора садржајем са стека (POP) и инструкција декрементирања акумулатора (DEC). Битовима 4 до 0 првог бајта инструкције специфира се код операције за безадресне инструкције. На основу тога су за инструкције PUSH, POP и DEC усвојени кодови операција 00100000, 00100001 и 00100010, респективно. Дужина инструкција је 1 бајт.&lt;br /&gt;
&lt;br /&gt;
Битови 7, 6 и 5 првог бајта инструкције имају вредности од 010 до 111 за адресне инструкције. Адресне инструкције су инструкција преноса у акумулатор (LD), инструкција преноса из акумулатора (ST), инструкција аритметичког померања удесно за једно место (ASR), инструкција упоређивања акумулатора са операндом (CMP), инструкција сабирања (ADD) и инструкција одузимања (SUB). На основу тога су за инструкције LD, ST, ASR, CMP, ADD и SUB усвојени кодови операција 010, 011, 100, 101, 110 и 111, респективно. Дужина инструкција је 2 или 3 бајта и зависи од специфичног начина адресирања.&lt;br /&gt;
&lt;br /&gt;
Начини адресирања су специфирани битовима 4, 3 и 2 првог бајта инструкције и то на следећи начин: 000-меморијско директно адресирање (memdir), 001-меморијско индиректно адресирање (memind), 010-регистарско директно адресирање (regdir), 011-регистарско инсиректно адресирање (regind), 100-релативно адресирање са померајем (pcrel), 101-непосредно адресирање (immed) и 110-регистарско индиректно адресирање са преинкрементирањем (preincr). Код меморијског директног и меморијског индиректног адресирања 16-битна адреса меморијске локације је дата другим и трећим бајтом инструкције. Битови 1 и 0 првог бајта инструкције се не користе. Дужина инструкције је 3 бајта. Регистарско директно, регистарско индиректно и регистарско индиректно адресирање са преинкрементирањем користе неке од регистара опште намене R0 до R3 специфиране битовима 1 и 0 првог бајта. Дужина инструкција је 1 бајт. Код релативног адресирања са померајем други бајт инструкције садржи 8-битни померај који је дат као целобројна величина са знаком. Битови 1 и 0 првог бајта инструкције се не користе. Дужина инструкција је 2 бајта. Код непосредног адресирања 16-битни операнд дат је другим и трећим бајтом инструкције. Битови 1 и 0 првог бајта инструкције се не користе. Дужина инструкција је 3 бајта.&lt;br /&gt;
&lt;br /&gt;
Стек расте према вишим меморијским локацијама, а регистар SP указује на прву слободну меморијску локацију. Процесор нема могућност обраде прекида.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
#Пројектовати део операционе јединице процесора (фазе: FETCH, ADDR и EXEC) која је потребна да се изврши инструкција &#039;&#039;&#039;CMP (PC)pom&#039;&#039;&#039;. Померај &#039;&#039;&#039;pom&#039;&#039;&#039; је целобројна величина са знаком који је дат другим бајтом инструкције. Цртати само неопходне компоненте које су потребне за извршавање наведене инструкције.&lt;br /&gt;
#Дати су почетни садржаји регистара и индикатора: PC = 1000h, SP = 2000h, ACC = 0010h, R0 = 0000h, R1 = 0001h, R2 = 0002h, R3 = 0003h, N = 0, Z = 0, V = 0 и C = 0. Индикатори статусне речи на које инструкција не утиче треба да остану непромењени. Извршити 7 сукцесивних наредби и за сваку наредбу одредити следеће: у фази читања инструкције - меморијске адресе са којих је прочитана инструкција, садржај регистара IR, инструкцију која је прочитана и нови садржај регистра PC; у фази одрђивања адресе операнда и читања операнда - меморијске адресе са којих је прочитана адреса операнда, меморијске адресе са којих је прочитан операнд, вредност операнда и нови садржај регистара опште намене који су у овој фази промењени; у фази извршавања операције - меморијске адресе којима се у овој фази приступа, садржај акумулатора А и индикатора N, Z, V и C након извршавања инструкције и нови садржај регистара и меморијских локација који су у овој фази промењени. Резултате представити у табелама 1, 2 и 3 формулара.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ОРТ2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Дејан Ковачевић</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2013&amp;diff=2973</id>
		<title>ОС1/Јул 2013</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2013&amp;diff=2973"/>
		<updated>2021-09-23T18:17:21Z</updated>

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

		<summary type="html">&lt;p&gt;Дејан Ковачевић: ipak je bolje po starom&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 = tmp_head;&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>Дејан Ковачевић</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=2968</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=2968"/>
		<updated>2021-09-22T21:06:16Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: free_tail treba da pokazuje na poslednji a ne na head&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 = tmp_head;&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>Дејан Ковачевић</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_2012&amp;diff=2964</id>
		<title>ОС1/Фебруар 2012</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_2012&amp;diff=2964"/>
		<updated>2021-09-22T17:51:16Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: treba proveriti ovo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2012/februar/Feb%202012.doc Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na asembleru nekog dvoadresnog RISC procesora sa LOAD/STORE arhitekturom napisati prevod sledeće funkcije:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int log (int n) {&lt;br /&gt;
  if (n&amp;lt;2) return 0;&lt;br /&gt;
  else return 1+log(n/2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
log:	LD R1, #n[SP]&lt;br /&gt;
		CMP R1, #2&lt;br /&gt;
		JGE else&lt;br /&gt;
		LD R0, #0&lt;br /&gt;
		RTS&lt;br /&gt;
else:	LD R0, #1&lt;br /&gt;
		ASL R1, R0&lt;br /&gt;
		PUSH R1&lt;br /&gt;
		CALL log&lt;br /&gt;
		POP R1&lt;br /&gt;
		ADD R0, R1&lt;br /&gt;
		RTS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na koji način se u programu koga izvršava procesor može znati da je DMA završio operaciju koja mu je zadata?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
#Ispitivanjem indikatora u statusnom registru DMA kontrolera.&lt;br /&gt;
#Kada DMA kontroler završi sa radom, generiše prekid.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti najmanje tri slučaja (uzroka) u kojima tekući proces gubi procesor.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
#Eksplicitnim zahtevom za promenu konteksta - dispatch, yield - sinhrono.&lt;br /&gt;
#Isteklo je dodeljeno CPU vreme - time exceeded - asinhrono.&lt;br /&gt;
#Prekid - maskirajući ili nemaskirajući - asinhrono.&lt;br /&gt;
#Zbog operacije na nekoj sinhronizacionoj primitivi tj. semaforu ili događaju - sinhrono.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Proces &#039;&#039;P&#039;&#039; treba da sačeka da sva tri procesa &#039;&#039;X&#039;&#039;, &#039;&#039;Y&#039;&#039; i &#039;&#039;Z&#039;&#039; ispune neki svoj uslov, u bilo kom redosledu. Napisati deo koda procesa &#039;&#039;P&#039;&#039; i bilo kog od druga tri procesa, uz potrebne deklaracije, koji obezbeđuju ovu uslovnu sinhronizaciju pomoću jednog standardnog brojačkog semafora.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
var sem : Semaphore := 0, semX, semY, semZ : Semaphore := 1;&lt;br /&gt;
&lt;br /&gt;
process P&lt;br /&gt;
	begin&lt;br /&gt;
		...&lt;br /&gt;
		wait(sem);&lt;br /&gt;
		wait(sem);&lt;br /&gt;
		wait(sem);&lt;br /&gt;
		...&lt;br /&gt;
		signal(semX);&lt;br /&gt;
		signal(semY);&lt;br /&gt;
		signal(semZ);&lt;br /&gt;
	end&lt;br /&gt;
end P;&lt;br /&gt;
&lt;br /&gt;
process X 		// ali isto i Y i Z&lt;br /&gt;
	begin&lt;br /&gt;
		wait(semX);&lt;br /&gt;
		...&lt;br /&gt;
		signal(sem);&lt;br /&gt;
		...&lt;br /&gt;
	end&lt;br /&gt;
end X;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
float base = 2.0; &lt;br /&gt;
float log(float); &lt;br /&gt;
float ln(float);&lt;br /&gt;
float log(float x) {&lt;br /&gt;
  return ln(x)/ln(base); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#Koliko nerazrešenih adresnih polja instrukcija prevodilac ostavlja u ovom fajlu?&lt;br /&gt;
#Koje simbole izvozi ovaj fajl? &lt;br /&gt;
#Koje simbole uvozi ovaj fajl?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# Prevodilac ostavlja 2 nerazrešena polja, jer se dva puta poziva funkcija ln, pa će se u asemblerskom kodu dva puta naći red call ?.&lt;br /&gt;
# Izvoze se log i base.&lt;br /&gt;
# Uvozi se ln.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti osnovne sličnosti i osnovne razlike između tehnike dinamičkog učitavanja memorije i preklopa (&#039;&#039;overlays&#039;&#039;).&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelna memorija organizovana je stranično, a adresibilna jedinica je bajt. Virtuelna adresa je 32-bitna, stranica je veličine 4KB, deskriptor stranice je 32-bitni, a PMT je organizovana u dva nivoa, pri čemu je polje za straničenje prvog nivoa veličine 8 bita. U koje ulaze PMT prvog nivoa i drugog nivoa se preslikava stranica broj 5423Dh?&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti princip dvostrukog baferisanja kod ulazno-izlaznih operacija.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U jedan bafer proizvođač upisuje podatke a iz drugog potrošač izvlači podatke. Kada oba učesnika završe fazu - punjenje odnosno pražnjenje, baferi zamenjuju uloge.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Da li je veličina fajla ograničena ako je način alokacije blokova za fajlove na disku:&lt;br /&gt;
#ulančani&lt;br /&gt;
#indeksirani&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
#ne&lt;br /&gt;
#da&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki fajl sistem koristi indeksirani pristup alokaciji blokova za fajlove na disku, sa kombinovanom tehnikom indeksiranja u jednom, dva i tri nivoa, kao kod UNIX &#039;&#039;inode&#039;&#039; strukture. Pretpostavljajući da disk ima uniformno srednje vreme pristupa do bilo kog bloka na disku, da li je vreme pristupa do različitih delova veoma velikih fajlova jednako? Ako jeste, precizno objasniti zašto jeste, a ako nije, objasniti kako se i zašto razlikuje.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Nije. Vreme pristupa za blokove bliže kraju velikog fajla je veće nego na početni deo fajla jer se mora prolaziti kroz višestruke indekse.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Дејан Ковачевић</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2012&amp;diff=2945</id>
		<title>ОС1/Јун 2012</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2012&amp;diff=2945"/>
		<updated>2021-09-20T17:51:41Z</updated>

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

		<summary type="html">&lt;p&gt;Дејан Ковачевић: /* addOwner -&amp;gt; removeOwner */&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;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Дејан Ковачевић</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=2856</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=2856"/>
		<updated>2021-09-03T13:13:11Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: /* 2. 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;
Event::wait() {&lt;br /&gt;
    if(val == 1) {&lt;br /&gt;
        val = 0;&lt;br /&gt;
    }&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;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Дејан Ковачевић</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=2855</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=2855"/>
		<updated>2021-09-03T13:10:49Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: resen pogresan zadatak, sad ispravljeno&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>Дејан Ковачевић</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=2854</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=2854"/>
		<updated>2021-09-03T13:09:30Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: /* Rešenje */&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;
{{delimično rešeno}}&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;
Event::wait() {&lt;br /&gt;
    if(val == 1) {&lt;br /&gt;
        val = 0;&lt;br /&gt;
    }&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;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Дејан Ковачевић</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=2853</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=2853"/>
		<updated>2021-09-03T13:08:40Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: /* Rešenje */&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;
&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>Дејан Ковачевић</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=2852</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=2852"/>
		<updated>2021-09-03T13:05:15Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: /* Rešenje */&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;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Event::wait() {&lt;br /&gt;
    if(val == 1) {&lt;br /&gt;
        val = 0;&lt;br /&gt;
    }&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 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>Дејан Ковачевић</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2681</id>
		<title>Архитектура рачунара/Јун 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D1%80%D0%B0%D1%87%D1%83%D0%BD%D0%B0%D1%80%D0%B0/%D0%88%D1%83%D0%BD_2021&amp;diff=2681"/>
		<updated>2021-07-08T16:20:42Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: /* Штампарске грешке */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; У посматраном рачунарском систему процесор има 3 пара линија по којима улазно/излазни уређаји могу процесору да шаљу захтеве за прекид и од процесора добијају сигнале потврда. У датом систему има 8 улазно/излазних уређаја које треба некако повезати помоћу та 3 пара линија на процесор и омогућити за сваки улазно/излазни уређај скок на одговарајућу прекидну рутину векторисаним механизмом прекида. &lt;br /&gt;
# Нацртати како тих 8 улазно/излазних уређаја треба повезати помоћу та 3 пара линија на процесор. &lt;br /&gt;
# Нацртати интерну структуру контролера периферије који дозвољава серијско слање прекида наредној периферији у ланцу.&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Haписати оптималну секвенцу инструкција неопходних за срачунавање израза: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int a,b,c,d,e,f;&lt;br /&gt;
...&lt;br /&gt;
a = (b+c) - (d+e);&lt;br /&gt;
if (a == 0) f = (b+c);&lt;br /&gt;
else f = (d+e);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
На располаrању је процесор код кога аритметичке, логичке и померачке инструкције имају формат: ОС reg, reg, reg/imm где је ОС код операције, одредишни операнд и први операнд морају бити у регистру (reg), док други може бити или у регистру или дат непосредно (reg/imm). Инструкција LOAD има формат: LOAD reg, mem где је првим операндом дат одредишни регистар (reg), a другим извориште. Инструкцијa STORE има формат: STORE reg, mem где је првим операндом дат изворишни регистар (reg), a другим одредиште. А, В, С, D, E и F су глобалне променљиве које одговарају симболичким ознакама адреса меморијских локација у којима се налазе операнди. Садржај меморијских локација означених адресама В, С, D и Е треба да остане непромењен, садржај одговарајућих регистара је дозвољено мењати. На располагању стоји 8 регистара опште намене. Претпоставити да су сви подаци и адресе исте дужине која је једнака адресибилној јединици&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
        LOAD R1, b&lt;br /&gt;
        LOAD R2, c&lt;br /&gt;
        ADD R1, R1, R2&lt;br /&gt;
        LOAD R2, d&lt;br /&gt;
        LOAD R3, e&lt;br /&gt;
        ADD R2, R2, R3&lt;br /&gt;
        SUB R3, R1, R2&lt;br /&gt;
        STORE R3, a&lt;br /&gt;
        JNZ else&lt;br /&gt;
        STORE R1, f&lt;br /&gt;
        JMP end&lt;br /&gt;
else:   STORE R2, f&lt;br /&gt;
end:    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Написати оптималну секвенцу инструкција која одговара следећој стандардној библиотечкој С функцији која копира &#039;&#039;n&#039;&#039; бајта низа &#039;&#039;src&#039;&#039; y низ &#039;&#039;dst&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;void *memсру (void *dst, const void *src, int n);&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
Функција као резултат враћа показивач на одредишни низ &#039;&#039;dst&#039;&#039;. Формати инструкција и података су као у задатку 2. На располагању стоје и сложене инструкције.&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[25п]&#039;&#039;&#039; У рачунарском систему се налази једноадресни процесор, меморија и периферије РЕR0, PER1 до РERN. Cматрати да број N припада скупу од 1 до 15 и да може да се користи као непосредна вредност у програму (#N). Периферији РER0 jе придружен DMA0 контролер. Све компоненте рачунара су повезане системском магистралом са 16 битном адресном и 16 битном магистралом података. Адресирање је на нивоу 16 битних речи. Сви подаци и адресе су ширине 16 бита. Узети да је тип података &#039;&#039;&#039;іnt&#039;&#039;&#039; дужине 16 бита. Улазно-излазни адресни простор и меморијски адресни простор су преклопљени. Адресе релевантних регистара периферија РER0 и DМА0 контролера су:&lt;br /&gt;
{|&lt;br /&gt;
| PER0_CONTROL || F000h || DMA0_CONTROL || F003h || DMA0_ADDR || F006h&lt;br /&gt;
|-&lt;br /&gt;
| PER0_STATUS  || F001h || DMA0_STATUS  || F004h || DMA0_CNT  || F007h&lt;br /&gt;
|-&lt;br /&gt;
| PER0_DATA    || F002h || DMA0_DATA    || F005h&lt;br /&gt;
|}&lt;br /&gt;
Адресе релевантних регистара периферија РER1 до РERN се добијају као резултат потпрограма &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;int* getPеrRegAddr (unsigned int N, unsigned int typе);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
где N представља број периферије, type представља тип регистра (1 - ENTRY, 2 - CONTROL, 3 - STATUS, 4 - DATA). Потпрограм &#039;&#039;getPerRegAddr&#039;&#039; не треба имплементирати, већ само позивати на одговарајућем месту у програму.&lt;br /&gt;
&lt;br /&gt;
У управљачким регистрима бит 0 је &#039;&#039;Start&#039;&#039; којим се дозвољава почетак операције, бит 1 одрeђују тип преноса података (1 - улаз (&#039;&#039;input&#039;&#039;), 0 - излаз (&#039;&#039;output&#039;&#039;)), бит 2 је &#039;&#039;Enable&#039;&#039; којим се дозвољава прекид. Бит 3 управљачког регистра контролера DMA0 се задаје режим рада (0-блоковски (&#039;&#039;burst&#039;&#039;), 1-циклус по циклус (&#039;&#039;сусle stealing&#039;&#039;)). У статусним регистрима бит 0 је &#039;&#039;Ready&#039;&#039; који сигнализира спремност контролера периферије.&lt;br /&gt;
&lt;br /&gt;
Написати главни програм, одговарајући потпрограм и прекидну рутину којима се обавља следећи пренос. &lt;br /&gt;
&lt;br /&gt;
Периферија РER0 шаље низ од 100h означених целих бројева који се смештају у меморију почев од адресе 5000h. Hакон учитаног низа у меморију потребно је проследити максималну вредност низа периферијама РER1 до РЕRN. Пренос максималне вредности периферијама треба обављати у паралели, чим периферија буде спремна да прими податак. Након што је свака периферија примила максималну вредност, потребно је да РER0 учита нов низ (од 100h означених целих бројева који се смештају у меморију почев од адресе 5000h), да се проследи нова максимална вредност низа периферијама РER1 до PERN и тако циклично да ради програм.&lt;br /&gt;
&lt;br /&gt;
Периферије PER1 до РERN када се једном укључе, није дозвољено да се потом искључе. Ради евиденције којoј периферији је прослеђена тренутна максимална вредност низа потребно је увести променљиву &#039;&#039;mask&#039;&#039;. Bредност бита &#039;&#039;mask&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; треба да има вредност 1 уколико је тренутна максимална вредност низа прослеђена периферији РER&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, a да има вредност 0 уколико тренутна максимална вредност низа није још прослеђена периферији РER&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;. Након прослеђене максималне вредности свим периферијама, вредност променльиву &#039;&#039;mask&#039;&#039; треба ресетовати на 0.&lt;br /&gt;
&lt;br /&gt;
Потребно је имплементирати и у програму на одговарајуhем месту позвати потпрограм &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;int max (int* arrAddr, unsigned int length);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Који враћа максималну вредност низа задатом почетном адресом аrrAddr и дужине length eлемената.&lt;br /&gt;
&lt;br /&gt;
Примање података са периферије РERO реализовати коришћењем DMА0 контролера у блоковском режиму рада. Слање података на периферије РER1 до РERN peализовати испитивањем бита спремности.&lt;br /&gt;
&lt;br /&gt;
Сматрати да су доступни регистри ВР и SP приликом писања потпрограма. Обратити пажњу да потпрограм не сме да користи глобалне променљиве, већ само параметре потпрограма и локане променљиве. Позивалац потпрограма је дужан да уклони параметре са стека. Резултат потпрограма се враћа кроз акумулатор. Процесор не поседује регистре опште намене, као ни регистар IМR. Стек расте од виших ка нижим локацијама, а SP указује на последњу заузету локацију. Дозвољено је користити додатне променљиве, али њихове називе треба писати описно и семантички исправно. &#039;&#039;&#039;Обавезно је писање концизних коментара над семантичким целинама.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Архитектура рачунара]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Дејан Ковачевић</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9A1_2020&amp;diff=1424</id>
		<title>НАД/К1 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9A1_2020&amp;diff=1424"/>
		<updated>2020-11-15T18:56:16Z</updated>

		<summary type="html">&lt;p&gt;Дејан Ковачевић: /* Мислим да су били ови бројеви */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
== Теорија ==&lt;br /&gt;
=== 1. питање ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Исказати и доказати теорему о потребним и довољним условима за постојање и јединстевеност непокретне тачке функције g(x) на интервалу [a, b].&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&#039;&#039;&#039;Теорема 2.2&#039;&#039;&#039; на 15. страни из књиге.&lt;br /&gt;
&lt;br /&gt;
=== 2. питање ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Како је помоћу LU композиције матрице А могуће израчунати њену детерминатну? (Подразумевало се да је већ извршена декомпозиција) &lt;br /&gt;
==== Решење ====&lt;br /&gt;
Одељак &#039;&#039;&#039;Одређивање детерминатне матрице LU декомпозицијом&#039;&#039;&#039; на 46. страни из књиге.&lt;br /&gt;
&lt;br /&gt;
=== 3. питање ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Исказати услове теореме за матрицу коефицијената система под којим Јакобијева и Гаус-Зајделова итеративна метода конвергирају ка решењу линеарног система једначина. &lt;br /&gt;
==== Решење ====&lt;br /&gt;
&#039;&#039;&#039;Теорема 3.1&#039;&#039;&#039; на 57. страни из књиге.&lt;br /&gt;
Било је потребно дефинати и строгу дијагоналну доминантност матрице - &#039;&#039;&#039;Дефиниција 3.3&#039;&#039;&#039; на 48. страни из књиге.&lt;br /&gt;
&lt;br /&gt;
=== 4. питање ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Извести Лагранжов интерполациони полином. &lt;br /&gt;
==== Решење ====&lt;br /&gt;
Одељак &#039;&#039;&#039;Лагранжов интерполациони полином&#039;&#039;&#039; на 67. и 68. страни из књиге.&lt;br /&gt;
&lt;br /&gt;
== Задаци ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функција &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; је задата следећом табелом:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; &lt;br /&gt;
| 18.0 || 18.1 || 18.2 || 18.3 || 18.4 || 18.5 || 18.6&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;&lt;br /&gt;
| 0.0621 || 0.0599 || 0.0640 || 0.0740 || 0.0892 || 0.1098 || 0.1413&lt;br /&gt;
|}&lt;br /&gt;
Формирајући одговарајући Њутнов интерполациони полином трећег степена, израчунати &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;(18,09) и проценити грешку интерполације у тачки 18,09.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
Поступак сличан &#039;&#039;&#039;14. задатку&#039;&#039;&#039; на 82. страни из књиге. За &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt; узети 18.&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Њутновом методом са тачношћу &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;, одредити највеће негативно решење једначине&lt;br /&gt;
&amp;lt;math&amp;gt;e^x = \sin\frac{\pi x}{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&#039;&#039;&#039;9. задатак&#039;&#039;&#039; на 25. страни у књизи. x је приближно -3,0454.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:НАД]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Дејан Ковачевић</name></author>
	</entry>
</feed>