<?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=Jaksa</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=Jaksa"/>
	<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/Jaksa"/>
	<updated>2026-06-04T06:10:34Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%88%D1%83%D0%BD_2023&amp;diff=7644</id>
		<title>АОР2/Јун 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%88%D1%83%D0%BD_2023&amp;diff=7644"/>
		<updated>2024-06-02T17:25:46Z</updated>

		<summary type="html">&lt;p&gt;Jaksa: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Јунски рок 2023. године&#039;&#039;&#039; одржан је 5. јуна и трајао је 120 минута.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Описати технику оптимизације векторских инструкција која се заснива на коришћењу регистра маски вектора (&#039;&#039;&#039;&#039;&#039;Vector mask registers&#039;&#039;&#039;&#039;&#039;). На примеру израчунавања максимума кореспондентних елемената низа (&amp;lt;code&amp;gt;Z[i] = MAX(X[i], Y[i])&amp;lt;/code&amp;gt;) приказати коришћење овог регистра.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Регистар маске вектора служи како би се одређене операције над векторима извршиле само над њиховим одређеним члановима, тиме што на одређеним битовима регистра маске стоје нуле или јединице. На пример, следећи код за рачунање максимума:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i = 0; i &amp;lt; n; ++i)&lt;br /&gt;
    if (X[i] &amp;gt; Y[i])&lt;br /&gt;
        Z[i] = X[i];&lt;br /&gt;
    else&lt;br /&gt;
        Z[i] = Y[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
би могао да се преведе у следећу секвенцу векторских инструкција:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
LV V1, X        # Учитавамо део низа X у вектор V1&lt;br /&gt;
LV V2, Y        # Учитавамо део низа Y у вектор V2&lt;br /&gt;
SGTVS.D V1, V2  # Постављамо регистар маске на 1 на местима где важи X[i] &amp;gt; Y[i]&lt;br /&gt;
MOVVV.D V3, V1  # Постављамо елементе V3 на елементе V1 на местима где је маска 1&lt;br /&gt;
MVFM V1, VM     # Учитавамо маску у V1&lt;br /&gt;
NOTV V1         # Негирамо V1&lt;br /&gt;
MVTM V1, VM     # Учитавамо V1 у маску&lt;br /&gt;
MOVVV.D V3, V2  # Постављамо елементе V3 на елементе V2 на местима где је маска 1&lt;br /&gt;
SV V3, Z        # Уписујемо део низа Z&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Посматра се предвиђање скока коришћењем &#039;&#039;gshare&#039;&#039; предиктора. Описати рад овог предиктора. Упоредити рад овог предиктора и корелисаног предиктора који користи исти број бита одговарајућих улазних података.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;gshare&#039;&#039; предиктор садржи следеће елементе:&lt;br /&gt;
* &#039;&#039;Branch History Register&#039;&#039; (BHR) који функционише као &#039;&#039;shift&#039;&#039; регистар који чува глобалну историју скокова (да ли је услов испуњен или није),&lt;br /&gt;
* &#039;&#039;Pattern History Table&#039;&#039; (PHT) која садржи аутомате стања који одређују крајња предвиђања, и&lt;br /&gt;
* хеш функцију која комбинује BHR и битове адресе скока како би адресирала PHT.&lt;br /&gt;
За разлику од &#039;&#039;gshare&#039;&#039;, корелисани предиктор одвојено адресира једну од више PHT помоћу BHR, а затим један од аутомата у оквиру PHT помоћу адресе скока. Може се приметити да је корелисани предиктор, због свог већег броја PHT, за исте ширине улазних података доста скупљи од &#039;&#039;gshare&#039;&#039;. Такође се показало да је већина улаза у овакве PHT неискоришћено, па је &#039;&#039;gshare&#039;&#039; направљен како би побољшао ово искоришћење и смањио цену производње корелисаног предиктора.&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[10п]&#039;&#039;&#039; Разматра се рачунарски систем у коме се извршавање одређене инструкција одвија у 6 фаза помоћу измењеног процесора са стандардном проточном обрадом (слика 3.1.). У процесор са стандардом проточном обрадом је додата као други степен јединица PD (&#039;&#039;Instruction PreDecode&#039;&#039;) који&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; обавља трансформацију инструкција задате архитектуре у инструкције RISC архитектуре. Сматрати да приступ меморији траје два сигнала такта. Архитектура процесора дефинише 16 регистра&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; опште намене. Адресе и подаци су величине 16 бита.&lt;br /&gt;
[[Датотека:AOR2 organizacija PreDecode.svg|thumb|center|500px|Слика 4.1.&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; — организација процесора]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Написати секвенцу инструкција (микроинструкција) циљне RISC архитектуре у коју се обавља пресликавање за део инструкцијског сета из табеле 3.1. изворишне CISC архитектуре. Уколико је потребно проширити број регистара опште намене у регистарском фајлу, онда треба за сваки додат регистар написати чему служи. Регистар R13 представља указивач на врх стека (SP) и показује на последњу слободну локацију. Стек расте према вишим адресама. Регистар R14 представља указивач на базну адресу стека (BP). Регистар R0 се користи као акумулатор, регистар R12 се користи као бројачки регистар и као такав има посебне инструкције које га користе. У табели 3.1. акције нису оптимизовано написане, већ описно.&lt;br /&gt;
# Нацртати формат инструкција циљне RISC архитектуре (на основу инструкција из табеле 3.1.).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Табела 3.1. — део инструкцијског сета процесора&lt;br /&gt;
! Асемблерска инструкција&lt;br /&gt;
! Акција&lt;br /&gt;
! Микро инструкције&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SWP Rx&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 MEM[Rx] ↔ ACC&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DEC&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = ACC - 1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTS&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 POP PC&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LOOP disp&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 R12 = R12 - 1&lt;br /&gt;
 IF R12 == 0 THEN&lt;br /&gt;
     PC = PC + disp&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;JMP adr&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 PC = adr&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ADD (adr)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = ACC + MEM[MEM[adr]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LDB Rx&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = 0.Rx&amp;lt;sub&amp;gt;7..0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;STRLEN adr&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = 0&lt;br /&gt;
 WHILE MEM[adr] != 0 DO&lt;br /&gt;
     ACC = ACC + 1&lt;br /&gt;
     adr = adr + 1&lt;br /&gt;
 END WHILE&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VECADD adr&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 R1 = R1 + MEM[adr]&lt;br /&gt;
 R2 = R2 + MEM[adr]&lt;br /&gt;
 R3 = R3 + MEM[adr]&lt;br /&gt;
 R4 = R4 + MEM[adr]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MUL R1&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 TMP = ACC&lt;br /&gt;
 ACC = 0&lt;br /&gt;
 FOR X = 0; X &amp;lt; R1; X++ DO&lt;br /&gt;
     ACC = ACC + TMP&lt;br /&gt;
 END FOR&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Претпоставља се да се под AX регистром у задатку мисли на акумулатор. Уводимо регистре:&lt;br /&gt;
* R16: привремени регистар&lt;br /&gt;
* R17: вредност 0&lt;br /&gt;
* R18: још један привремени регистар&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Решење трећег задатка.&lt;br /&gt;
! Асемблерска инструкција&lt;br /&gt;
! Акција&lt;br /&gt;
! Микро инструкције&lt;br /&gt;
! Коментар&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SWP Rx&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 MEM[Rx] ↔ ACC&lt;br /&gt;
|&lt;br /&gt;
 LD R0, (Rx)0&lt;br /&gt;
 ADDIS R16, R0, #0&lt;br /&gt;
 ST R16, (Rx)0&lt;br /&gt;
| Уколико би после ове секвенце микроинструкција дошла микроинструкција која користи меморију, то би био хазард по подацима.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DEC&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = ACC - 1&lt;br /&gt;
|&lt;br /&gt;
 ADDIS R0, R0, #-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTS&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 POP PC&lt;br /&gt;
|&lt;br /&gt;
 LD R16, (R13)-1&lt;br /&gt;
 ADDI R13, R13, #-1&lt;br /&gt;
 BEQZ R17, (R17+R16)&lt;br /&gt;
| У последњој инструкцији се кроз горњи мултиплексер пропушта вредност R17 (0), која се користи и као услов скока, а кроз доњи вредност R16, која садржи жељену вредност PC, па стога и специфичан начин обележавања (који је еквивалентан са &amp;lt;code&amp;gt;(R16)0&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LOOP disp&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 R12 = R12 - 1&lt;br /&gt;
 IF R12 == 0 THEN&lt;br /&gt;
     PC = PC + disp&lt;br /&gt;
|&lt;br /&gt;
 SUB R12, R12, #1&lt;br /&gt;
 BEQZPI R12, (PC)disp&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;JMP adr&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 PC = adr&lt;br /&gt;
|&lt;br /&gt;
 BEQZI R17, (R17)adr&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ADD (adr)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = ACC + MEM[MEM[adr]]&lt;br /&gt;
|&lt;br /&gt;
 LD R16, (R17)adr&lt;br /&gt;
 LD R16, (R16)0&lt;br /&gt;
 ADDS R0, R0, R16&lt;br /&gt;
| Дешава се хазард по подацима између прве и друге и између друге и треће микроинструкције.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LDB Rx&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = 0.Rx&amp;lt;sub&amp;gt;7..0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ANDIS R0, RX, #00FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;STRLEN adr&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = 0&lt;br /&gt;
 WHILE MEM[adr] != 0 DO&lt;br /&gt;
     ACC = ACC + 1&lt;br /&gt;
     adr = adr + 1&lt;br /&gt;
 END WHILE&lt;br /&gt;
|&lt;br /&gt;
 ADDI R0, R17, #0&lt;br /&gt;
 LD R16, (R0)adr&lt;br /&gt;
 ADDIS R0, R0, #1&lt;br /&gt;
 BNEZPI R16, (PC)-3 * len(mInst)&lt;br /&gt;
 ADDI R0, R0, #-1&lt;br /&gt;
| За ову ставку је речено на колоквијуму да може да се претпостави како PC броји микроинструкције уместо инструкције. Главне идеје су да се уклони хазард тиме што радимо &amp;lt;code&amp;gt;ADD&amp;lt;/code&amp;gt; инструкцију испод &amp;lt;code&amp;gt;LD&amp;lt;/code&amp;gt;, да се акумулатор користи уместо неког новог регистра за чување &amp;lt;code&amp;gt;adr&amp;lt;/code&amp;gt; (јер се свакако увећава сваке итерације) и да након петље која обухвата другу, трећу и четврту микроинструкцију морамо смањити акумулатор за један, јер нам је претходна петља ефективно била &#039;&#039;do-while&#039;&#039; уместо &#039;&#039;while&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VECADD adr&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 R1 = R1 + MEM[adr]&lt;br /&gt;
 R2 = R2 + MEM[adr]&lt;br /&gt;
 R3 = R3 + MEM[adr]&lt;br /&gt;
 R4 = R4 + MEM[adr]&lt;br /&gt;
|&lt;br /&gt;
 LD R16, (R17)adr&lt;br /&gt;
 ADDI R18, R17, #adr&lt;br /&gt;
 LD R16, (R18)1&lt;br /&gt;
 ADD R1, R1, R16&lt;br /&gt;
 LD R16, (R18)2&lt;br /&gt;
 ADD R2, R2, R16&lt;br /&gt;
 LD R16, (R18)3&lt;br /&gt;
 ADD R3, R3, R16&lt;br /&gt;
 ADD R4, R4, R16&lt;br /&gt;
| Разлог из ког ова секвенца микроинструкција може изгледати чудно јесте избегавање хазарда по подацима. Са учитавањем првог податка почиње се већ у првој микроинструкцији, али како у међувремену треба обавити чување &amp;lt;code&amp;gt;adr&amp;lt;/code&amp;gt; у новом привременом регистру и започињање новог учитавања, она се не сабира са регистром R1 до четврте микроинструкције (када је та вредност и даље доступна у одговарајућем регистру). Након тога се логика понавља неколико пута: започели смо учитавање наредног податка, а док се тај податак учитава ми радимо сабирање претходно учитаног податка са одговарајућим регистром. Како је до девете микроинструкције завршено учитавање и последњег податка, можемо извршити последње сабирање.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MUL R1&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 TMP = ACC&lt;br /&gt;
 ACC = 0&lt;br /&gt;
 FOR X = 0; X &amp;lt; R1; X++ DO&lt;br /&gt;
     ACC = ACC + TMP&lt;br /&gt;
 END FOR&lt;br /&gt;
|&lt;br /&gt;
 ADDI R16, R0, #0&lt;br /&gt;
 ADDIS R0, R17, #0&lt;br /&gt;
 ADDI R18, R1, #0&lt;br /&gt;
 ADDS R0, R0, R16&lt;br /&gt;
 ADDI R18, R18, #-1&lt;br /&gt;
 BNEZPI R18, (PC)-3 * len(mInst)&lt;br /&gt;
 SUB R0, R0, R16&lt;br /&gt;
| Идеја јесте да R16 користимо као претходну вредност акумулатора и R18 као бројач итерација који почиње од R1 и завршава се са 0. Уколико би нам провера за &amp;lt;code&amp;gt;R18 == 0&amp;lt;/code&amp;gt; била на врху, наша петља би се састојала из четири микроинструкције: провере, сабирања, декрементирања и безусловног скока. Уместо тога, проверу стављамо на дно па се наша петља састоји од три микроинструкције (резултујући у мањем укупном броју извршених микроинструкција), али због тога што смо опет ефективно направили &#039;&#039;do-while&#039;&#039; петљу ефекат последње итерације морамо да поништимо на крају. Као и за &amp;lt;code&amp;gt;STRLEN&amp;lt;/code&amp;gt;, за ову ставку може да се претпостави како PC броји микроинструкције уместо инструкције. (На колоквијуму је накнадно речено да је податак у R1 означен, али то у овом решењу није узето у обзир јер такво коришћење и нема смисла.)&lt;br /&gt;
|}&lt;br /&gt;
Користимо укупно седам RISC инструкција у овом сету:&lt;br /&gt;
# LD&lt;br /&gt;
# ST&lt;br /&gt;
# ADD&lt;br /&gt;
# SUB&lt;br /&gt;
# AND&lt;br /&gt;
# BEQZ&lt;br /&gt;
# BNEZ&lt;br /&gt;
Ово нам оставља следећи формат инструкције:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Формат инструкције у четвртом задатку&lt;br /&gt;
! 36 !! 35 !! 34 !! 33 !! 32 !! 31 !! 30 !! 29 !! 28 !! 27 !! 26 !! 25 !! 24 !! 23 !! 22 !! 21 !! 20 !! 19 !! 18 !! 17 !! 16 !! 15 !! 14 !! 13 !! 12 !! 11 !! 10 !! 9 !! 8 !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Код&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | PIS флегови&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | Одредишни регистар&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | Изворишни регистар 1&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | Изворишни регистар 2&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; | Непосредна вредност&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АОР2]]&lt;/div&gt;</summary>
		<author><name>Jaksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%88%D1%83%D0%BD_2023&amp;diff=7643</id>
		<title>АОР2/Јун 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%9E%D0%A02/%D0%88%D1%83%D0%BD_2023&amp;diff=7643"/>
		<updated>2024-06-02T16:52:23Z</updated>

		<summary type="html">&lt;p&gt;Jaksa: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Јунски рок 2023. године&#039;&#039;&#039; одржан је 5. јуна и трајао је 120 минута.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Описати технику оптимизације векторских инструкција која се заснива на коришћењу регистра маски вектора (&#039;&#039;&#039;&#039;&#039;Vector mask registers&#039;&#039;&#039;&#039;&#039;). На примеру израчунавања максимума кореспондентних елемената низа (&amp;lt;code&amp;gt;Z[i] = MAX(X[i], Y[i])&amp;lt;/code&amp;gt;) приказати коришћење овог регистра.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Регистар маске вектора служи како би се одређене операције над векторима извршиле само над њиховим одређеним члановима, тиме што на одређеним битовима регистра маске стоје нуле или јединице. На пример, следећи код за рачунање максимума:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (int i = 0; i &amp;lt; n; ++i)&lt;br /&gt;
    if (X[i] &amp;gt; Y[i])&lt;br /&gt;
        Z[i] = X[i];&lt;br /&gt;
    else&lt;br /&gt;
        Z[i] = Y[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
би могао да се преведе у следећу секвенцу векторских инструкција:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
LV V1, X        # Учитавамо део низа X у вектор V1&lt;br /&gt;
LV V2, Y        # Учитавамо део низа Y у вектор V2&lt;br /&gt;
SGTVS.D V1, V2  # Постављамо регистар маске на 1 на местима где важи X[i] &amp;gt; Y[i]&lt;br /&gt;
MOVVV.D V3, V1  # Постављамо елементе V3 на елементе V1 на местима где је маска 1&lt;br /&gt;
MVFM V1, VM     # Учитавамо маску у V1&lt;br /&gt;
NOTV V1         # Негирамо V1&lt;br /&gt;
MVTM V1, VM     # Учитавамо V1 у маску&lt;br /&gt;
MOVVV.D V3, V2  # Постављамо елементе V3 на елементе V2 на местима где је маска 1&lt;br /&gt;
SV V3, Z        # Уписујемо део низа Z&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[5п]&#039;&#039;&#039; Посматра се предвиђање скока коришћењем &#039;&#039;gshare&#039;&#039; предиктора. Описати рад овог предиктора. Упоредити рад овог предиктора и корелисаног предиктора који користи исти број бита одговарајућих улазних података.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;gshare&#039;&#039; предиктор садржи следеће елементе:&lt;br /&gt;
* &#039;&#039;Branch History Register&#039;&#039; (BHR) који функционише као &#039;&#039;shift&#039;&#039; регистар који чува глобалну историју скокова (да ли је услов испуњен или није),&lt;br /&gt;
* &#039;&#039;Pattern History Table&#039;&#039; (PHT) која садржи аутомате стања који одређују крајња предвиђања, и&lt;br /&gt;
* хеш функцију која комбинује BHR и битове адресе скока како би адресирала PHT.&lt;br /&gt;
За разлику од &#039;&#039;gshare&#039;&#039;, корелисани предиктор одвојено адресира једну од више PHT помоћу BHR, а затим један од аутомата у оквиру PHT помоћу адресе скока. Може се приметити да је корелисани предиктор, због свог већег броја PHT, за исте ширине улазних података доста скупљи од &#039;&#039;gshare&#039;&#039;. Такође се показало да је већина улаза у овакве PHT неискоришћено, па је &#039;&#039;gshare&#039;&#039; направљен како би побољшао ово искоришћење и смањио цену производње корелисаног предиктора.&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;&#039;[10п]&#039;&#039;&#039; Разматра се рачунарски систем у коме се извршавање одређене инструкција одвија у 6 фаза помоћу измењеног процесора са стандардном проточном обрадом (слика 3.1.). У процесор са стандардом проточном обрадом је додата као други степен јединица PD (&#039;&#039;Instruction PreDecode&#039;&#039;) који&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; обавља трансформацију инструкција задате архитектуре у инструкције RISC архитектуре. Сматрати да приступ меморији траје два сигнала такта. Архитектура процесора дефинише 16 регистра&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; опште намене. Адресе и подаци су величине 16 бита.&lt;br /&gt;
[[Датотека:AOR2 organizacija PreDecode.svg|thumb|center|500px|Слика 4.1.&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; — организација процесора]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Написати секвенцу инструкција (микроинструкција) циљне RISC архитектуре у коју се обавља пресликавање за део инструкцијског сета из табеле 3.1. изворишне CISC архитектуре. Уколико је потребно проширити број регистара опште намене у регистарском фајлу, онда треба за сваки додат регистар написати чему служи. Регистар R13 представља указивач на врх стека (SP) и показује на последњу слободну локацију. Стек расте према вишим адресама. Регистар R14 представља указивач на базну адресу стека (BP). Регистар R0 се користи као акумулатор, регистар R12 се користи као бројачки регистар и као такав има посебне инструкције које га користе. У табели 3.1. акције нису оптимизовано написане, већ описно.&lt;br /&gt;
# Нацртати формат инструкција циљне RISC архитектуре (на основу инструкција из табеле 3.1.).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Табела 3.1. — део инструкцијског сета процесора&lt;br /&gt;
! Асемблерска инструкција&lt;br /&gt;
! Акција&lt;br /&gt;
! Микро инструкције&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SWP Rx&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 MEM[Rx] ↔ ACC&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DEC&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = ACC - 1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTS&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 POP PC&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LOOP disp&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 R12 = R12 - 1&lt;br /&gt;
 IF R12 == 0 THEN&lt;br /&gt;
     PC = PC + disp&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;JMP adr&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 PC = adr&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ADD (adr)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = ACC + MEM[MEM[adr]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LDB Rx&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = 0.Rx&amp;lt;sub&amp;gt;7..0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;STRLEN adr&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = 0&lt;br /&gt;
 WHILE MEM[adr] != 0 DO&lt;br /&gt;
     ACC = ACC + 1&lt;br /&gt;
     adr = adr + 1&lt;br /&gt;
 END WHILE&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VECADD adr&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 R1 = R1 + MEM[adr]&lt;br /&gt;
 R2 = R2 + MEM[adr]&lt;br /&gt;
 R3 = R3 + MEM[adr]&lt;br /&gt;
 R4 = R4 + MEM[adr]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MUL R1&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 TMP = ACC&lt;br /&gt;
 ACC = 0&lt;br /&gt;
 FOR X = 0; X &amp;lt; R1; X++ DO&lt;br /&gt;
     ACC = ACC + TMP&lt;br /&gt;
 END FOR&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Претпоставља се да се под AX регистром у задатку мисли на акумулатор. Уводимо регистре:&lt;br /&gt;
* R16: привремени регистар&lt;br /&gt;
* R17: вредност 0&lt;br /&gt;
* R18: још један привремени регистар&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Решење трећег задатка.&lt;br /&gt;
! Асемблерска инструкција&lt;br /&gt;
! Акција&lt;br /&gt;
! Микро инструкције&lt;br /&gt;
! Коментар&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SWP Rx&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 MEM[Rx] ↔ ACC&lt;br /&gt;
|&lt;br /&gt;
 LD R0, (Rx)0&lt;br /&gt;
 ADDIS R16, R0, #0&lt;br /&gt;
 ST R16, (Rx)0&lt;br /&gt;
| Уколико би после ове секвенце микроинструкција дошла микроинструкција која користи меморију, то би био хазард по подацима.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DEC&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = ACC - 1&lt;br /&gt;
|&lt;br /&gt;
 ADDIS R0, R0, #-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTS&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 POP PC&lt;br /&gt;
|&lt;br /&gt;
 LD R16, (R13)-1&lt;br /&gt;
 ADDI R13, R13, #-1&lt;br /&gt;
 BEQZ R17, (R17+R16)&lt;br /&gt;
| У последњој инструкцији се кроз горњи мултиплексер пропушта вредност R17 (0), која се користи и као услов скока, а кроз доњи вредност R16, која садржи жељену вредност PC, па стога и специфичан начин обележавања (који је еквивалентан са &amp;lt;code&amp;gt;(R16)0&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LOOP disp&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 R12 = R12 - 1&lt;br /&gt;
 IF R12 == 0 THEN&lt;br /&gt;
     PC = PC + disp&lt;br /&gt;
|&lt;br /&gt;
 SUB R12, R12, #1&lt;br /&gt;
 BEQZPI R12, (PC)disp&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;JMP adr&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 PC = adr&lt;br /&gt;
|&lt;br /&gt;
 BEQZI R17, (R17)adr&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ADD (adr)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = ACC + MEM[MEM[adr]]&lt;br /&gt;
|&lt;br /&gt;
 LD R16, (R17)adr&lt;br /&gt;
 LD R16, (R16)0&lt;br /&gt;
 ADDS R0, R0, R16&lt;br /&gt;
| Дешава се хазард по подацима између прве и друге и између друге и треће микроинструкције.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LDB Rx&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = 0.Rx&amp;lt;sub&amp;gt;7..0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ANDIS R0, RX, #00FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;STRLEN adr&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 ACC = 0&lt;br /&gt;
 WHILE MEM[adr] != 0 DO&lt;br /&gt;
     ACC = ACC + 1&lt;br /&gt;
     adr = adr + 1&lt;br /&gt;
 END WHILE&lt;br /&gt;
|&lt;br /&gt;
 ADDI R0, R17, #0&lt;br /&gt;
 LD R16, (R0)adr&lt;br /&gt;
 ADDI R0, R0, #1&lt;br /&gt;
 BNEZPI R16, (PC)-3 * len(mInst)&lt;br /&gt;
 ADDIS R0, R0, #-1&lt;br /&gt;
| За ову ставку је речено на колоквијуму да може да се претпостави како PC броји микроинструкције уместо инструкције. Главне идеје су да се уклони хазард тиме што радимо &amp;lt;code&amp;gt;ADD&amp;lt;/code&amp;gt; инструкцију испод &amp;lt;code&amp;gt;LD&amp;lt;/code&amp;gt;, да се акумулатор користи уместо неког новог регистра за чување &amp;lt;code&amp;gt;adr&amp;lt;/code&amp;gt; (јер се свакако увећава сваке итерације) и да након петље која обухвата другу, трећу и четврту микроинструкцију морамо смањити акумулатор за један, јер нам је претходна петља ефективно била &#039;&#039;do-while&#039;&#039; уместо &#039;&#039;while&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VECADD adr&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 R1 = R1 + MEM[adr]&lt;br /&gt;
 R2 = R2 + MEM[adr]&lt;br /&gt;
 R3 = R3 + MEM[adr]&lt;br /&gt;
 R4 = R4 + MEM[adr]&lt;br /&gt;
|&lt;br /&gt;
 LD R16, (R17)adr&lt;br /&gt;
 ADDI R18, R17, #adr&lt;br /&gt;
 LD R16, (R18)1&lt;br /&gt;
 ADD R1, R1, R16&lt;br /&gt;
 LD R16, (R18)2&lt;br /&gt;
 ADD R2, R2, R16&lt;br /&gt;
 LD R16, (R18)3&lt;br /&gt;
 ADD R3, R3, R16&lt;br /&gt;
 ADD R4, R4, R16&lt;br /&gt;
| Разлог из ког ова секвенца микроинструкција може изгледати чудно јесте избегавање хазарда по подацима. Са учитавањем првог податка почиње се већ у првој микроинструкцији, али како у међувремену треба обавити чување &amp;lt;code&amp;gt;adr&amp;lt;/code&amp;gt; у новом привременом регистру и започињање новог учитавања, она се не сабира са регистром R1 до четврте микроинструкције (када је та вредност и даље доступна у одговарајућем регистру). Након тога се логика понавља неколико пута: започели смо учитавање наредног податка, а док се тај податак учитава ми радимо сабирање претходно учитаног податка са одговарајућим регистром. Како је до девете микроинструкције завршено учитавање и последњег податка, можемо извршити последње сабирање.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MUL R1&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 TMP = ACC&lt;br /&gt;
 ACC = 0&lt;br /&gt;
 FOR X = 0; X &amp;lt; R1; X++ DO&lt;br /&gt;
     ACC = ACC + TMP&lt;br /&gt;
 END FOR&lt;br /&gt;
|&lt;br /&gt;
 ADDI R16, R0, #0&lt;br /&gt;
 ADDIS R0, R17, #0&lt;br /&gt;
 ADDI R18, R1, #0&lt;br /&gt;
 ADDS R0, R0, R16&lt;br /&gt;
 ADDI R18, R18, #-1&lt;br /&gt;
 BNEZPI R18, (PC)-3 * len(mInst)&lt;br /&gt;
 SUB R0, R0, R16&lt;br /&gt;
| Идеја јесте да R16 користимо као претходну вредност акумулатора и R18 као бројач итерација који почиње од R1 и завршава се са 0. Уколико би нам провера за &amp;lt;code&amp;gt;R18 == 0&amp;lt;/code&amp;gt; била на врху, наша петља би се састојала из четири микроинструкције: провере, сабирања, декрементирања и безусловног скока. Уместо тога, проверу стављамо на дно па се наша петља састоји од три микроинструкције (резултујући у мањем укупном броју извршених микроинструкција), али због тога што смо опет ефективно направили &#039;&#039;do-while&#039;&#039; петљу ефекат последње итерације морамо да поништимо на крају. Као и за &amp;lt;code&amp;gt;STRLEN&amp;lt;/code&amp;gt;, за ову ставку може да се претпостави како PC броји микроинструкције уместо инструкције. (На колоквијуму је накнадно речено да је податак у R1 означен, али то у овом решењу није узето у обзир јер такво коришћење и нема смисла.)&lt;br /&gt;
|}&lt;br /&gt;
Користимо укупно седам RISC инструкција у овом сету:&lt;br /&gt;
# LD&lt;br /&gt;
# ST&lt;br /&gt;
# ADD&lt;br /&gt;
# SUB&lt;br /&gt;
# AND&lt;br /&gt;
# BEQZ&lt;br /&gt;
# BNEZ&lt;br /&gt;
Ово нам оставља следећи формат инструкције:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Формат инструкције у четвртом задатку&lt;br /&gt;
! 36 !! 35 !! 34 !! 33 !! 32 !! 31 !! 30 !! 29 !! 28 !! 27 !! 26 !! 25 !! 24 !! 23 !! 22 !! 21 !! 20 !! 19 !! 18 !! 17 !! 16 !! 15 !! 14 !! 13 !! 12 !! 11 !! 10 !! 9 !! 8 !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Код&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | PIS флегови&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | Одредишни регистар&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | Изворишни регистар 1&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; | Изворишни регистар 2&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; | Непосредна вредност&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АОР2]]&lt;/div&gt;</summary>
		<author><name>Jaksa</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=6458</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=6458"/>
		<updated>2023-08-27T08:58:39Z</updated>

		<summary type="html">&lt;p&gt;Jaksa: /* Rešenje */&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;
&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;
        SHR R1, R0&lt;br /&gt;
        PUSH R1&lt;br /&gt;
        CALL log&lt;br /&gt;
        POP R1&lt;br /&gt;
        ADD R0, #1 //zato sto se nakon poziva f-je log, povratna vrednost nalazi u registru R0&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;pascal&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 &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Uvozi se &amp;lt;code&amp;gt;ln&amp;lt;/code&amp;gt;.&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;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti rešenje [[ОС1/Јул 2011#5. zadatak|5. zadatka iz julskog roka 2011. godine]].&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;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti princip dvostrukog baferisanja kod ulazno-izlaznih operacija.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti [[ОС1/Јун 2013#8. zadatak|8. zadatak iz junskog roka 2013. godine]].&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>Jaksa</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=6457</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=6457"/>
		<updated>2023-08-27T08:58:12Z</updated>

		<summary type="html">&lt;p&gt;Jaksa: /* Rešenje */&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;
&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;
        SHR R1, R0&lt;br /&gt;
        PUSH R1&lt;br /&gt;
        CALL log&lt;br /&gt;
        POP R1&lt;br /&gt;
        ADD R0, #1&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;pascal&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 &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Uvozi se &amp;lt;code&amp;gt;ln&amp;lt;/code&amp;gt;.&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;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti rešenje [[ОС1/Јул 2011#5. zadatak|5. zadatka iz julskog roka 2011. godine]].&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;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti princip dvostrukog baferisanja kod ulazno-izlaznih operacija.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti [[ОС1/Јун 2013#8. zadatak|8. zadatak iz junskog roka 2013. godine]].&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>Jaksa</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=6456</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=6456"/>
		<updated>2023-08-27T08:55:50Z</updated>

		<summary type="html">&lt;p&gt;Jaksa: /* Rešenje */&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;
&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;
        SHR 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;pascal&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 &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Uvozi se &amp;lt;code&amp;gt;ln&amp;lt;/code&amp;gt;.&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;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti rešenje [[ОС1/Јул 2011#5. zadatak|5. zadatka iz julskog roka 2011. godine]].&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;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti princip dvostrukog baferisanja kod ulazno-izlaznih operacija.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti [[ОС1/Јун 2013#8. zadatak|8. zadatak iz junskog roka 2013. godine]].&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>Jaksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2017&amp;diff=6455</id>
		<title>ОС1/Јул 2017</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2017&amp;diff=6455"/>
		<updated>2023-08-26T17:58:16Z</updated>

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

		<summary type="html">&lt;p&gt;Jaksa: /* 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;
Ne. Ukoliko bi se na tom steku čuvao kontekst prekinutog procesa, jedino na njega bismo se mogli i vratiti jer bi svi ostali konteksti bili ispod kontekteksta trenutnog procesa na steku.&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: public Thread {&lt;br /&gt;
    public:&lt;br /&gt;
        SumThread(int* arr, size_t _size, long* res): array(arr), size(_size), result(res) {}&lt;br /&gt;
    protected:&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>Jaksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2020&amp;diff=6453</id>
		<title>ОС1/Јул 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BB_2020&amp;diff=6453"/>
		<updated>2023-08-26T17:19:34Z</updated>

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

		<summary type="html">&lt;p&gt;Jaksa: /* Rešenje */&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 R0, #0      ;Registar u kome se nalazi povratna vrednost&lt;br /&gt;
      LD R1, #n[SP]&lt;br /&gt;
      CMP R1, R0&lt;br /&gt;
      JG else&lt;br /&gt;
      RTS&lt;br /&gt;
else: LD R2, #1&lt;br /&gt;
      SUB R1, R2&lt;br /&gt;
      PUSH R1&lt;br /&gt;
      call f         ;nakon zavrsetka funkcije f, u R0 se nalazi rezultat&lt;br /&gt;
      POP R1&lt;br /&gt;
      ADD R0, R2&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;pascal&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&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&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;
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;
Odgovor: &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;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;int size(FHANDLE)&amp;lt;/syntaxhighlight&amp;gt; Vraća trenutnu veličinu sadržaja fajla u znakovima. &lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void append(FHANDLE, int)&amp;lt;/syntaxhighlight&amp;gt; Proširuje sadržaj fajla za dati broj znakova na kraju.&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void seek(FHANDLE, int)&amp;lt;/syntaxhighlight&amp;gt; Postavlja kurzor datog fajla na datu poziciju (redni broj znaka počev od 0).&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void write(FHANDLE, char*, int size)&amp;lt;/syntaxhighlight&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  proširuje na potrebnu veličinu ukoliko bi zadata pozicija ili zadati upis prekoračio trenutnu veličinu sadržaja fajla. Zanemariti sve moguće greške u ulazu/izlazu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void write(FHANDLE f, int position, char* s, int size){&lt;br /&gt;
    int curSize = size(f);&lt;br /&gt;
    if(position + size &amp;gt; curSize){&lt;br /&gt;
        append(f, position + size - curSize);&lt;br /&gt;
    }&lt;br /&gt;
    seek(f, position);&lt;br /&gt;
    write(f, s, size);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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>Jaksa</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=6451</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=6451"/>
		<updated>2023-08-26T14:03:13Z</updated>

		<summary type="html">&lt;p&gt;Jaksa: /* Rešenje */&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 R0, #0      ;Registar u kome se nalazi povratna vrednost&lt;br /&gt;
      LD R1, #n[SP]&lt;br /&gt;
      CMP R1, R0&lt;br /&gt;
      JG else&lt;br /&gt;
      RTS&lt;br /&gt;
else: LD R2, #1&lt;br /&gt;
      SUB R1, R2&lt;br /&gt;
      PUSH R1&lt;br /&gt;
      call f         ;nakon zavrsetka funkcije f, u R0 se nalazi rezultat&lt;br /&gt;
      POP R1&lt;br /&gt;
      ADD R0, R2&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;pascal&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&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&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;
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;
Odgovor: &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;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;int size(FHANDLE)&amp;lt;/syntaxhighlight&amp;gt; Vraća trenutnu veličinu sadržaja fajla u znakovima. &lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void append(FHANDLE, int)&amp;lt;/syntaxhighlight&amp;gt; Proširuje sadržaj fajla za dati broj znakova na kraju.&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void seek(FHANDLE, int)&amp;lt;/syntaxhighlight&amp;gt; Postavlja kurzor datog fajla na datu poziciju (redni broj znaka počev od 0).&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void write(FHANDLE, char*, int size)&amp;lt;/syntaxhighlight&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  proširuje na potrebnu veličinu ukoliko bi zadata pozicija ili zadati upis prekoračio trenutnu veličinu sadržaja fajla. Zanemariti sve moguće greške u ulazu/izlazu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void write(FHANDLE f, int position, char* s, int size){&lt;br /&gt;
    int curSize = size(f);&lt;br /&gt;
    if(position + size &amp;gt;= curSize){&lt;br /&gt;
        append(f, position + size + 1 - curSize);&lt;br /&gt;
    }&lt;br /&gt;
    seek(f, position);&lt;br /&gt;
    write(f, s, size);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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>Jaksa</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=6450</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=6450"/>
		<updated>2023-08-26T14:02:59Z</updated>

		<summary type="html">&lt;p&gt;Jaksa: /* Rešenje */&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 R0, #0      ;Registar u kome se nalazi povratna vrednost&lt;br /&gt;
      LD R1, #n[SP]&lt;br /&gt;
      CMP R1, R0&lt;br /&gt;
      JG else&lt;br /&gt;
      RTS&lt;br /&gt;
else: LD R2, #1&lt;br /&gt;
      SUB R1, R2&lt;br /&gt;
      PUSH R1&lt;br /&gt;
      call f         ;nakon zavrsetka funkcije f, u R0 se nalazi rezultat&lt;br /&gt;
      POP R1&lt;br /&gt;
      ADD R0, R2&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;pascal&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&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&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;
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;
Odgovor: &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;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;int size(FHANDLE)&amp;lt;/syntaxhighlight&amp;gt; Vraća trenutnu veličinu sadržaja fajla u znakovima. &lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void append(FHANDLE, int)&amp;lt;/syntaxhighlight&amp;gt; Proširuje sadržaj fajla za dati broj znakova na kraju.&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void seek(FHANDLE, int)&amp;lt;/syntaxhighlight&amp;gt; Postavlja kurzor datog fajla na datu poziciju (redni broj znaka počev od 0).&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void write(FHANDLE, char*, int size)&amp;lt;/syntaxhighlight&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  proširuje na potrebnu veličinu ukoliko bi zadata pozicija ili zadati upis prekoračio trenutnu veličinu sadržaja fajla. Zanemariti sve moguće greške u ulazu/izlazu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void write(FHANDLE f, int position, char* s, int size){&lt;br /&gt;
    int curSize = size(f);&lt;br /&gt;
    if(position + size &amp;gt; curSize){&lt;br /&gt;
        append(f, position + size + 1 - curSize);&lt;br /&gt;
    }&lt;br /&gt;
    seek(f, position);&lt;br /&gt;
    write(f, s, size);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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>Jaksa</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=6449</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=6449"/>
		<updated>2023-08-26T13:57:56Z</updated>

		<summary type="html">&lt;p&gt;Jaksa: /* Rešenje */&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 R0, #0      ;Registar u kome se nalazi povratna vrednost&lt;br /&gt;
      LD R1, #n[SP]&lt;br /&gt;
      CMP R1, R0&lt;br /&gt;
      JG else&lt;br /&gt;
      RTS&lt;br /&gt;
else: LD R2, #1&lt;br /&gt;
      SUB R1, R2&lt;br /&gt;
      PUSH R1&lt;br /&gt;
      call f         ;nakon zavrsetka funkcije f, u R0 se nalazi rezultat&lt;br /&gt;
      POP R1&lt;br /&gt;
      ADD R0, R2&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;pascal&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&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&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;
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;
Odgovor: &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;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;int size(FHANDLE)&amp;lt;/syntaxhighlight&amp;gt; Vraća trenutnu veličinu sadržaja fajla u znakovima. &lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void append(FHANDLE, int)&amp;lt;/syntaxhighlight&amp;gt; Proširuje sadržaj fajla za dati broj znakova na kraju.&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void seek(FHANDLE, int)&amp;lt;/syntaxhighlight&amp;gt; Postavlja kurzor datog fajla na datu poziciju (redni broj znaka počev od 0).&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void write(FHANDLE, char*, int size)&amp;lt;/syntaxhighlight&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  proširuje na potrebnu veličinu ukoliko bi zadata pozicija ili zadati upis prekoračio trenutnu veličinu sadržaja fajla. Zanemariti sve moguće greške u ulazu/izlazu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void write(FHANDLE f, int position, char* s, int size){&lt;br /&gt;
    int curSize = size(f);&lt;br /&gt;
    if(position + size &amp;gt; curSize){&lt;br /&gt;
        append(f, position + size - curSize);&lt;br /&gt;
    }&lt;br /&gt;
    seek(f, position);&lt;br /&gt;
    write(f, s, size);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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>Jaksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2014&amp;diff=6448</id>
		<title>ОС1/Јун 2014</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2014&amp;diff=6448"/>
		<updated>2023-08-26T12:33:18Z</updated>

		<summary type="html">&lt;p&gt;Jaksa: /* Rešenje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2014/jun/OS1%20jun%202014.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti značenje pojmova multiprogramiranje i multiprocesiranje.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јануар 2014#1. zadatak|januarskog roka 2014]].&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih bibliotečnih funkcija &amp;lt;code&amp;gt;setjmp()&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;longjmp()&amp;lt;/code&amp;gt; implementirati funkciju &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void yield(jmp_buf old, jmp_buf new)&amp;lt;/syntaxhighlight&amp;gt; koja vrši promenu konteksta procesora.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void yield(jmp_buf old, jmp_buf new) {&lt;br /&gt;
    if (setjmp(old) == 0) {&lt;br /&gt;
        longjmp(new, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem niti u školskom jezgru (klasa &amp;lt;code&amp;gt;Thread&amp;lt;/code&amp;gt;) napisati kod koji konkurentno i rekurzivno obilazi binarno stablo tako što tekuća nit nastavlja da obilazi levo podstablo, a kreira novu nit koja će obići desno podstablo. Struktura &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;Node {Node *left, *right}&amp;lt;/syntaxhighlight&amp;gt; predstavlja čvor stabla&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
class MyThread : public Thread {&lt;br /&gt;
    public:&lt;br /&gt;
        MyThread(Node* root) {&lt;br /&gt;
            this-&amp;gt;root = root;&lt;br /&gt;
            start();&lt;br /&gt;
        }&lt;br /&gt;
    protected:&lt;br /&gt;
        void run() {&lt;br /&gt;
            visit(root);&lt;br /&gt;
        }&lt;br /&gt;
    private:&lt;br /&gt;
        Node* root;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void visit(Node* root) {&lt;br /&gt;
    if (root-&amp;gt;right) {&lt;br /&gt;
        new MyThread(root-&amp;gt;right);&lt;br /&gt;
    }&lt;br /&gt;
    if (root-&amp;gt;left) {&lt;br /&gt;
        visit(root-&amp;gt;left);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora napisati kod za kontrolu kritične sekcije koju uporedo sme da izvršava najviše &#039;&#039;N&#039;&#039; procesa. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2013#4. zadatak|junskog roka 2013]].&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je osnovni razlog toga (osnovni problem koji se rešava time) što linker svoj posao obavlja u dva prolaza? Precizno i kratko objasniti. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti rešenje [[ОС1/Јул 2017#5. zadatak|5. zadatka iz jula 2017. godine]].&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti kako se kod kontinualne alokacije memorije obezbeđuje zaštita memorijskog prostora drugih procesa od ilegalnog adresiranja jednog procesa. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Zaštita memorijskog prostora drugih procesa od ilegalnog adresiranja jednog procesa kod kontinualne alokacije se obezbeđuje limit registrom. U ovaj registar procesora OS upisuje vrednost prilikom promene konteksta.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu sa straničnom organizacijom virtuelne memorije virtuelna i fizička adresa su 32-bitne, adresibilna jedinica je bajt, a stranica je veličine 64 KB. PMT je organizovana u dva nivoa i jedan ulaz u PMT oba nivoa zauzima po jednu 32-bitnu reč. PMT oba nivoa su iste veličine. Koliko ukupno zauzimaju PMT za proces koji je alocirao samo svoju prvu i poslednju stranicu? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;math&amp;gt;2^8 \cdot 4B + 2 \cdot 2^8 \cdot 4B = 3KB&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti tehniku dvostrukog baferisanja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Koristi se kod sprege uređaja ili tokova kontrole koji su jako različiti po brzini transfera ili jedinici prenosa. Uvode se 2 bafera. &lt;br /&gt;
&lt;br /&gt;
U prvoj fazi bafer A je ulazni bafer, bafer za proizvođača, a bafer B je izlazni bafer, bafer za potrošača. Kada oba učesnika završe fazu punjenja tj. pražnjenja svog bafera, baferi A i B menjaju uloge.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki fajl sistem koristi dve vrste ključeva za fajlove, deljene i ekskluzivne, i fajlove zaključava prilikom otvaranja fajla, u zavisnosti od najavljenog načina korišćenja fajla. Procesi A, B, C i D izvršavaju sistemske pozive otvaranja i zatvaranja istog fajla u sledećem redosledu (neki proces izvršava poziv zatvaranja fajla samo ako ga je uspešno otvorio):&lt;br /&gt;
# A: open(READ)&lt;br /&gt;
# B: open(WRITE)&lt;br /&gt;
# C: open(READ)&lt;br /&gt;
# A: close&lt;br /&gt;
# C: close&lt;br /&gt;
# D: open(WRITE)&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Operacija 2. će se izvršiti neuspešno, a ostale uspešno.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koliko pristupa blokovima na disku treba izvršiti za pristup &#039;&#039;n&#039;&#039;-tom logičkom bloku sadržaja fajla ako je alokacija fajla &lt;br /&gt;
# indeksna, pri čemu je indeks fajla uvek u dva nivoa, a na blok sa indeksom prvog nivoa ukazuje polje u FCB, &lt;br /&gt;
# ulančana lista, pri čemu je glava liste u FCB? FCB fajla je u memoriji. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# 3&lt;br /&gt;
# n&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Jaksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2014&amp;diff=6447</id>
		<title>ОС1/Јун 2014</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2014&amp;diff=6447"/>
		<updated>2023-08-26T12:32:58Z</updated>

		<summary type="html">&lt;p&gt;Jaksa: /* Rešenje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2014/jun/OS1%20jun%202014.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti značenje pojmova multiprogramiranje i multiprocesiranje.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јануар 2014#1. zadatak|januarskog roka 2014]].&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih bibliotečnih funkcija &amp;lt;code&amp;gt;setjmp()&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;longjmp()&amp;lt;/code&amp;gt; implementirati funkciju &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void yield(jmp_buf old, jmp_buf new)&amp;lt;/syntaxhighlight&amp;gt; koja vrši promenu konteksta procesora.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void yield(jmp_buf old, jmp_buf new) {&lt;br /&gt;
    if (setjmp(old) == 0) {&lt;br /&gt;
        longjmp(new, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem niti u školskom jezgru (klasa &amp;lt;code&amp;gt;Thread&amp;lt;/code&amp;gt;) napisati kod koji konkurentno i rekurzivno obilazi binarno stablo tako što tekuća nit nastavlja da obilazi levo podstablo, a kreira novu nit koja će obići desno podstablo. Struktura &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;Node {Node *left, *right}&amp;lt;/syntaxhighlight&amp;gt; predstavlja čvor stabla&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
class MyThread : public Thread {&lt;br /&gt;
    public:&lt;br /&gt;
        MyThread(Node* root) {&lt;br /&gt;
            this-&amp;gt;root = root;&lt;br /&gt;
            start();&lt;br /&gt;
        }&lt;br /&gt;
    protected:&lt;br /&gt;
        void run() {&lt;br /&gt;
            visit(root);&lt;br /&gt;
        }&lt;br /&gt;
    private:&lt;br /&gt;
        Node* root;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void visit(Node* root) {&lt;br /&gt;
    if (root-&amp;gt;right) {&lt;br /&gt;
        new MyThread(root-&amp;gt;right);&lt;br /&gt;
    }&lt;br /&gt;
    if (root-&amp;gt;left) {&lt;br /&gt;
        visit(root-&amp;gt;left);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora napisati kod za kontrolu kritične sekcije koju uporedo sme da izvršava najviše &#039;&#039;N&#039;&#039; procesa. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јун 2013#4. zadatak|julskog roka 2013]].&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je osnovni razlog toga (osnovni problem koji se rešava time) što linker svoj posao obavlja u dva prolaza? Precizno i kratko objasniti. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti rešenje [[ОС1/Јул 2017#5. zadatak|5. zadatka iz jula 2017. godine]].&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti kako se kod kontinualne alokacije memorije obezbeđuje zaštita memorijskog prostora drugih procesa od ilegalnog adresiranja jednog procesa. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Zaštita memorijskog prostora drugih procesa od ilegalnog adresiranja jednog procesa kod kontinualne alokacije se obezbeđuje limit registrom. U ovaj registar procesora OS upisuje vrednost prilikom promene konteksta.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu sa straničnom organizacijom virtuelne memorije virtuelna i fizička adresa su 32-bitne, adresibilna jedinica je bajt, a stranica je veličine 64 KB. PMT je organizovana u dva nivoa i jedan ulaz u PMT oba nivoa zauzima po jednu 32-bitnu reč. PMT oba nivoa su iste veličine. Koliko ukupno zauzimaju PMT za proces koji je alocirao samo svoju prvu i poslednju stranicu? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;math&amp;gt;2^8 \cdot 4B + 2 \cdot 2^8 \cdot 4B = 3KB&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti tehniku dvostrukog baferisanja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Koristi se kod sprege uređaja ili tokova kontrole koji su jako različiti po brzini transfera ili jedinici prenosa. Uvode se 2 bafera. &lt;br /&gt;
&lt;br /&gt;
U prvoj fazi bafer A je ulazni bafer, bafer za proizvođača, a bafer B je izlazni bafer, bafer za potrošača. Kada oba učesnika završe fazu punjenja tj. pražnjenja svog bafera, baferi A i B menjaju uloge.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki fajl sistem koristi dve vrste ključeva za fajlove, deljene i ekskluzivne, i fajlove zaključava prilikom otvaranja fajla, u zavisnosti od najavljenog načina korišćenja fajla. Procesi A, B, C i D izvršavaju sistemske pozive otvaranja i zatvaranja istog fajla u sledećem redosledu (neki proces izvršava poziv zatvaranja fajla samo ako ga je uspešno otvorio):&lt;br /&gt;
# A: open(READ)&lt;br /&gt;
# B: open(WRITE)&lt;br /&gt;
# C: open(READ)&lt;br /&gt;
# A: close&lt;br /&gt;
# C: close&lt;br /&gt;
# D: open(WRITE)&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Operacija 2. će se izvršiti neuspešno, a ostale uspešno.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koliko pristupa blokovima na disku treba izvršiti za pristup &#039;&#039;n&#039;&#039;-tom logičkom bloku sadržaja fajla ako je alokacija fajla &lt;br /&gt;
# indeksna, pri čemu je indeks fajla uvek u dva nivoa, a na blok sa indeksom prvog nivoa ukazuje polje u FCB, &lt;br /&gt;
# ulančana lista, pri čemu je glava liste u FCB? FCB fajla je u memoriji. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# 3&lt;br /&gt;
# n&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Jaksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2014&amp;diff=6440</id>
		<title>ОС1/Октобар 2014</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2014&amp;diff=6440"/>
		<updated>2023-08-25T21:48:21Z</updated>

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

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

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

		<summary type="html">&lt;p&gt;Jaksa: /* Rešenje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2016/jun/Jun%202016.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta se smatralo najvećim nedostatkom prvobitnih paketnih (&#039;&#039;batch&#039;&#039;) sistema i kako je taj nedostatak rešen?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prvobitni batch sistemi su efikasno delili resurse ali nisu interaktivni. Osnovni nedostatak bio je slabo iskorišćenje glavnog resursa računara - procesora. Nedostatak je rešen uvođenjem deljenja vremena.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem funkcije &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;yield(jmp_buf old, jmp_buf new)&amp;lt;/syntaxhighlight&amp;gt; koja čuva kontekst jedne niti i predaje procesor drugoj niti, realizovati operaciju &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; na brojačkom semaforu u školskom jezgru.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Октобар 2013#2. zadatak|oktobarskog roka 2013]].&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za sledeće slučajeve navesti u koje stanje prelazi tekući (&#039;&#039;running&#039;&#039;) proces i naznačiti da li se to dešava kao posledica sistemskog poziva od strane tog tekućeg procesa ili spoljašnjeg prekida. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Slučaj&lt;br /&gt;
! Tekući proces prelazi u stanje&lt;br /&gt;
! Uzrok (prekid ili sistemski poziv)&lt;br /&gt;
|-&lt;br /&gt;
| Istek vremenskog kvantuma kod &#039;&#039;time-sharing&#039;&#039; sistema&lt;br /&gt;
| &#039;&#039;ready&#039;&#039;&lt;br /&gt;
| prekid&lt;br /&gt;
|-&lt;br /&gt;
| Operacija &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; na semaforu koji ima vrednost 0&lt;br /&gt;
| &#039;&#039;blocked&#039;&#039;&lt;br /&gt;
| sistemski poziv&lt;br /&gt;
|-&lt;br /&gt;
| Došlo vreme aktivacije prioritetnijeg periodičnog procesa&lt;br /&gt;
| &#039;&#039;ready&#039;&#039;&lt;br /&gt;
| prekid&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati kod koji realizuje Petersonov algoritam međusobnog isključenja dva uporedna procesa pomoću uposlenog čekanja. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
shared var turn : integer := 1, flag1, flag2 : boolean := false;&lt;br /&gt;
&lt;br /&gt;
process P1&lt;br /&gt;
begin&lt;br /&gt;
    loop&lt;br /&gt;
        flag1 := true; turn := 2;&lt;br /&gt;
        while flag2 and turn = 2 do null;&lt;br /&gt;
        &amp;lt;critical section&amp;gt;&lt;br /&gt;
        flag1 := false;&lt;br /&gt;
        &amp;lt;non-critical section&amp;gt;&lt;br /&gt;
    end&lt;br /&gt;
end P1;&lt;br /&gt;
&lt;br /&gt;
process P2&lt;br /&gt;
begin&lt;br /&gt;
    loop&lt;br /&gt;
        flag2 := true; turn := 1;&lt;br /&gt;
        while flag1 and turn = 1 do null;&lt;br /&gt;
        &amp;lt;critical section&amp;gt;&lt;br /&gt;
        flag2 := false;&lt;br /&gt;
        &amp;lt;non-critical section&amp;gt;&lt;br /&gt;
    end&lt;br /&gt;
end P2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Precizno objasniti zašto klasičan linker svoj posao obavlja u dva prolaza (a ne može samo u jednom). Obrazloženje ilustrovati primerom. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti rešenje [[ОС1/Јул 2017#5. zadatak|5. zadatka iz jula 2017. godine]].&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelni adresni prostor sistema je 8GB, adresibilna jedinica je 16-bitna reč, a virtuelni adresni prostor je organizovan stranično sa stranicom veličine 32KB. Fizički adresni prostor je veličine 2GB. Tabele preslikavanja stranica su organizovane u dva nivoa, s tim da tabela prvog nivoa ima 2K ulaza. Svaki ulaz u PMT oba nivoa zauzima samo onoliko koliko je potrebno da se smesti broj okvira (PMT drugog nivoa je poravnata na okvir). Koliko memorije zauzimaju ukupno PMT procesa koji je alocirao svojih prvih 128 stranica?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Virtuelni adresni prostor je &amp;lt;math&amp;gt;2^{33}B&amp;lt;/math&amp;gt;, a adresibilna jedinica dva bajta, tako da dobijamo da je virtuelna adresa 32 bita.&lt;br /&gt;
* Veličina stranice je &amp;lt;math&amp;gt;32KB = 2^{15}B&amp;lt;/math&amp;gt;, tako da je za stranicu u virtuelnoj adresi potrebno odvojiti 14 bita.&lt;br /&gt;
* Fizički adresni prostor je &amp;lt;math&amp;gt;2GB = 2^{31}B&amp;lt;/math&amp;gt;, tako da je fizička adresa 30 bitova.&lt;br /&gt;
* PMT prvog nivoa ima &amp;lt;math&amp;gt;2K = 2^{11}&amp;lt;/math&amp;gt; ulaza, tako da je to 11 bita adrese potrebno za PMT prvog nivoa.&lt;br /&gt;
* Iz toga dobijamo da je struktura VA: page1(11) page2(7) offset(14)&lt;br /&gt;
* Za 128 stranica potreban je jedan PMT prvog nivoa i jedan drugog, tako da je to ukupno &amp;lt;math&amp;gt;2^{11} * 2^2B + 2^7 * 2^2 = 8.5KB&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki sistem sa straničnom organizacijom memorije koristi tehniku &#039;&#039;copy on write&#039;&#039;. Jedan proces je tek kreirao drugi proces pozivom &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;. Ako novokreirani proces odmah po pokretanju izvrši operaciju upisa u memoriju, koji izuzetak će generisati procesor, &#039;&#039;page fault&#039;&#039; ili neki drugi i koji? Precizno objasniti zašto i kako.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Procesor će generisati izuzetak &#039;&#039;access violation&#039;&#039;, jer je u desktriptoru ove stranice označeno da ona nije dozvoljena za upis zbog tek kreiranog procesa deteta.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati program  koji  prenosi  blok podataka zadate dužine sa zadate adrese na izlazni uređaj korišćenjem programiranog ulaza/izlaza sa prozivanjem (&#039;&#039;polling&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
        LD R1, blockAddr&lt;br /&gt;
        LD R2, cnt&lt;br /&gt;
        ST [ctrl], #0..1&lt;br /&gt;
wait:   LD R0, [status]&lt;br /&gt;
        AND R0, #1..0&lt;br /&gt;
        JZ wait&lt;br /&gt;
        LD R0, [R1]&lt;br /&gt;
        ST [data], R0&lt;br /&gt;
        INC R1&lt;br /&gt;
        DEC R2&lt;br /&gt;
        JNZ wait&lt;br /&gt;
        ST [ctrl], R0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako fajl sistem koristi dve vrste ključeva, deljeni (&#039;&#039;shared&#039;&#039;) i ekskluzivni (&#039;&#039;exclusive&#039;&#039;), sa implicitnim zaključavanjem prilikom otvaranja fajla, koji ključ će biti zahtevan od strane procesa koji otvara fajl sa najavom samo operacije čitanja?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Deljeni (&#039;&#039;shared&#039;&#039;) ključ.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki sistem evidentira slobodne blokove fajl sistema tako što u jedan slobodan blok smešta spisak (indeks) do &#039;&#039;n&#039;&#039; narednih slobodnih blokova (najmanje 0, najviše &#039;&#039;n&#039;&#039;), kao i broj sledećeg takvog indeksnog bloka. Koliki je broj blokova kojima sistem treba da pristupi (na čitanje ili upis) u najgorem slučaju prilikom alokacije jednog slobodnog bloka za sadržaj fajla? Broj prvog takvog bloka u lancu je globalni podatak koji se nalazi u memoriji i njegova eventualna izmena se ne broji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Broj blokova kojima sistem treba da pristupi je u svakom slučaju 1. Kada se na spisku nalazi bar jedan slobodan blok, on se alocira i briše sa spiska. Kada se na spisku ne nalazi nijedan slobodan blok, blok u kome se nalazi spisak se alocira kao slobodan blok i u memoriji se menja pokazivač sa njega na sledeći blok sa spiskom.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Jaksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2016&amp;diff=6436</id>
		<title>ОС1/Јун 2016</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2016&amp;diff=6436"/>
		<updated>2023-08-25T18:43:06Z</updated>

		<summary type="html">&lt;p&gt;Jaksa: /* Rešenje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2016/jun/Jun%202016.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta se smatralo najvećim nedostatkom prvobitnih paketnih (&#039;&#039;batch&#039;&#039;) sistema i kako je taj nedostatak rešen?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prvobitni batch sistemi su efikasno delili resurse ali nisu interaktivni. Osnovni nedostatak bio je slabo iskorišćenje glavnog resursa računara - procesora. Nedostatak je rešen uvođenjem deljenja vremena.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem funkcije &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;yield(jmp_buf old, jmp_buf new)&amp;lt;/syntaxhighlight&amp;gt; koja čuva kontekst jedne niti i predaje procesor drugoj niti, realizovati operaciju &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; na brojačkom semaforu u školskom jezgru.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Октобар 2013#2. zadatak|oktobarskog roka 2013]].&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za sledeće slučajeve navesti u koje stanje prelazi tekući (&#039;&#039;running&#039;&#039;) proces i naznačiti da li se to dešava kao posledica sistemskog poziva od strane tog tekućeg procesa ili spoljašnjeg prekida. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Slučaj&lt;br /&gt;
! Tekući proces prelazi u stanje&lt;br /&gt;
! Uzrok (prekid ili sistemski poziv)&lt;br /&gt;
|-&lt;br /&gt;
| Istek vremenskog kvantuma kod &#039;&#039;time-sharing&#039;&#039; sistema&lt;br /&gt;
| &#039;&#039;ready&#039;&#039;&lt;br /&gt;
| prekid&lt;br /&gt;
|-&lt;br /&gt;
| Operacija &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; na semaforu koji ima vrednost 0&lt;br /&gt;
| &#039;&#039;blocked&#039;&#039;&lt;br /&gt;
| sistemski poziv&lt;br /&gt;
|-&lt;br /&gt;
| Došlo vreme aktivacije prioritetnijeg periodičnog procesa&lt;br /&gt;
| &#039;&#039;ready&#039;&#039;&lt;br /&gt;
| prekid&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati kod koji realizuje Petersonov algoritam međusobnog isključenja dva uporedna procesa pomoću uposlenog čekanja. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
shared var turn : integer := 1, flag1, flag2 : boolean := false;&lt;br /&gt;
&lt;br /&gt;
process P1&lt;br /&gt;
begin&lt;br /&gt;
    loop&lt;br /&gt;
        flag1 := true; turn := 2;&lt;br /&gt;
        while flag2 and turn = 2 do null;&lt;br /&gt;
        &amp;lt;critical section&amp;gt;&lt;br /&gt;
        flag1 := false;&lt;br /&gt;
        &amp;lt;non-critical section&amp;gt;&lt;br /&gt;
    end&lt;br /&gt;
end P1;&lt;br /&gt;
&lt;br /&gt;
process P2&lt;br /&gt;
begin&lt;br /&gt;
    loop&lt;br /&gt;
        flag2 := true; turn := 1;&lt;br /&gt;
        while flag1 and turn = 1 do null;&lt;br /&gt;
        &amp;lt;critical section&amp;gt;&lt;br /&gt;
        flag2 := false;&lt;br /&gt;
        &amp;lt;non-critical section&amp;gt;&lt;br /&gt;
    end&lt;br /&gt;
end P2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Precizno objasniti zašto klasičan linker svoj posao obavlja u dva prolaza (a ne može samo u jednom). Obrazloženje ilustrovati primerom. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti rešenje [[ОС1/Јул 2017#5. zadatak|5. zadatka iz jula 2017. godine]].&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelni adresni prostor sistema je 8GB, adresibilna jedinica je 16-bitna reč, a virtuelni adresni prostor je organizovan stranično sa stranicom veličine 32KB. Fizički adresni prostor je veličine 2GB. Tabele preslikavanja stranica su organizovane u dva nivoa, s tim da tabela prvog nivoa ima 2K ulaza. Svaki ulaz u PMT oba nivoa zauzima samo onoliko koliko je potrebno da se smesti broj okvira (PMT drugog nivoa je poravnata na okvir). Koliko memorije zauzimaju ukupno PMT procesa koji je alocirao svojih prvih 128 stranica?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Virtuelni adresni prostor je &amp;lt;math&amp;gt;2^{33}B&amp;lt;/math&amp;gt;, a adresibilna jedinica dva bajta, tako da dobijamo da je virtuelna adresa 32 bita.&lt;br /&gt;
* Veličina stranice je &amp;lt;math&amp;gt;32KB = 2^{15}B&amp;lt;/math&amp;gt;, tako da je za stranicu u virtuelnoj adresi potrebno odvojiti 14 bita.&lt;br /&gt;
* Fizički adresni prostor je &amp;lt;math&amp;gt;2GB = 2^{31}B&amp;lt;/math&amp;gt;, tako da je fizička adresa 30 bitova.&lt;br /&gt;
* PMT prvog nivoa ima &amp;lt;math&amp;gt;2K = 2^{11}&amp;lt;/math&amp;gt; ulaza, tako da je to 11 bita adrese potrebno za PMT prvog nivoa.&lt;br /&gt;
* Iz toga dobijamo da je struktura VA: page1(11) page2(7) offset(14)&lt;br /&gt;
* Za 128 stranica potreban je jedan PMT prvog nivoa i jedan drugog, tako da je to ukupno &amp;lt;math&amp;gt;2^(11) * 2^2B + 2^7 * 2^2 = 8.5KB&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki sistem sa straničnom organizacijom memorije koristi tehniku &#039;&#039;copy on write&#039;&#039;. Jedan proces je tek kreirao drugi proces pozivom &amp;lt;code&amp;gt;fork()&amp;lt;/code&amp;gt;. Ako novokreirani proces odmah po pokretanju izvrši operaciju upisa u memoriju, koji izuzetak će generisati procesor, &#039;&#039;page fault&#039;&#039; ili neki drugi i koji? Precizno objasniti zašto i kako.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Procesor će generisati izuzetak &#039;&#039;access violation&#039;&#039;, jer je u desktriptoru ove stranice označeno da ona nije dozvoljena za upis zbog tek kreiranog procesa deteta.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na asembleru nekog zamišljenog RISC procesora sa LOAD/STORE arhitekturom napisati program  koji  prenosi  blok podataka zadate dužine sa zadate adrese na izlazni uređaj korišćenjem programiranog ulaza/izlaza sa prozivanjem (&#039;&#039;polling&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
        LD R1, blockAddr&lt;br /&gt;
        LD R2, cnt&lt;br /&gt;
        ST [ctrl], #0..1&lt;br /&gt;
wait:   LD R0, [status]&lt;br /&gt;
        AND R0, #1..0&lt;br /&gt;
        JZ wait&lt;br /&gt;
        LD R0, [R1]&lt;br /&gt;
        ST [data], R0&lt;br /&gt;
        INC R1&lt;br /&gt;
        DEC R2&lt;br /&gt;
        JNZ wait&lt;br /&gt;
        ST [ctrl], R0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako fajl sistem koristi dve vrste ključeva, deljeni (&#039;&#039;shared&#039;&#039;) i ekskluzivni (&#039;&#039;exclusive&#039;&#039;), sa implicitnim zaključavanjem prilikom otvaranja fajla, koji ključ će biti zahtevan od strane procesa koji otvara fajl sa najavom samo operacije čitanja?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Deljeni (&#039;&#039;shared&#039;&#039;) ključ.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki sistem evidentira slobodne blokove fajl sistema tako što u jedan slobodan blok smešta spisak (indeks) do &#039;&#039;n&#039;&#039; narednih slobodnih blokova (najmanje 0, najviše &#039;&#039;n&#039;&#039;), kao i broj sledećeg takvog indeksnog bloka. Koliki je broj blokova kojima sistem treba da pristupi (na čitanje ili upis) u najgorem slučaju prilikom alokacije jednog slobodnog bloka za sadržaj fajla? Broj prvog takvog bloka u lancu je globalni podatak koji se nalazi u memoriji i njegova eventualna izmena se ne broji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Broj blokova kojima sistem treba da pristupi je u svakom slučaju 1. Kada se na spisku nalazi bar jedan slobodan blok, on se alocira i briše sa spiska. Kada se na spisku ne nalazi nijedan slobodan blok, blok u kome se nalazi spisak se alocira kao slobodan blok i u memoriji se menja pokazivač sa njega na sledeći blok sa spiskom.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Jaksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2017&amp;diff=6435</id>
		<title>ОС1/Јун 2017</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2017&amp;diff=6435"/>
		<updated>2023-08-25T17:39:50Z</updated>

		<summary type="html">&lt;p&gt;Jaksa: /* Rešenje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2017/jun/Jun%202017.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je multiprogramiranje, a šta multiprocesiranje? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Јануар 2014#1. zadatak|januarskog roka 2014]].&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti kako se obezbeđuje međusobno isključenje pristupa kritičnim sekcijama jezgra operativnog sistema od strane uporednih tokova kontrole (niti) koji se izvršavaju na istom, odnosno na različitim procesorima.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[ОС1/Фебруар 2014#2. zadatak|februarskog roka 2014]].&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem sistemskog poziva &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;create_thread(void(*f)(void*),void* p)&amp;lt;/syntaxhighlight&amp;gt; koji kreira nit koja izvršava datu funkciju &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; sa datim argumentom &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, na jeziku C napisati program koji u &#039;&#039;n&#039;&#039; uporednih niti izračunava kvadrat svakog elementa nekog celobrojnog niza (&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;a[i]*=a[i]&amp;lt;/syntaxhighlight&amp;gt;) veličine &amp;lt;code&amp;gt;n*k&amp;lt;/code&amp;gt;, tako što svaka nit obrađuje &#039;&#039;k&#039;&#039; elemanata (jednu particiju niza).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int n = ...;&lt;br /&gt;
int k = ...;&lt;br /&gt;
int a[n * k];&lt;br /&gt;
&lt;br /&gt;
void square(void* p) {&lt;br /&gt;
    int part = *(int*)(p);&lt;br /&gt;
    free(p);&lt;br /&gt;
    part *= k;&lt;br /&gt;
    for (int i = 0; i &amp;lt; k; i++) {&lt;br /&gt;
        a[part + i] *= a[part + i];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main() {&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        int* context = malloc(sizeof(int));&lt;br /&gt;
        *context = i;&lt;br /&gt;
        create_thread(square, context);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih brojačkih semafora u školskom jezgru, na jeziku C++ napisati implementaciju ograničenog bafera (&#039;&#039;bounded buffer&#039;&#039;). &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti sedmi zadatak zadatak iz [[ОС1/Јул 2011#4. zadatak|jula 2011]].&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako u svom C programu ni u jednom fajlu ne definišete funkciju &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;, ko će prijaviti grešku i kog tipa, prevodilac ili linker? Precizno obrazložiti na osnovu čega se ta greška prijavljuje. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Linker prijavljuje grešku o nedefinisanom simbolu &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;. Kada se povezuje C/C++ program, lista obj fajlova mora da sadrži i obavezno generiše modul koji poziva funkciju &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, pa je zato i referiše kao spoljni simbol kog uvozi, što dovodi do greške ako ga nema.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Da li se količina memorije koju program zahteva u najgorem slučaju njegovog izvršavanja smanjuje primenom tehnike dinamičkog učitavanja (u odnosu na količinu koju zahteva kada se ta tehnika ne koristi)? Kratko obrazložiti. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ne smanjuje se, jer u najgorem slučaju on zahteva sve svoje potprograme i strukture, a tehnika dinamičkog učitavanja obezbeđuje da delovi ne moraju da se učitavaju samo dok se prvi put ne javi potreba za njima.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Virtuelni adresni prostor je veličine 1GB, organizovan je segmentno, sa maksimalnom veličinom segmenta od 4KB, adresibilna jedinica je bajt. Svi segmenti nekog procesa su stvarne veličine od po 2KB i u fizičku memoriju smešteni su odmah jedan iza drugog, pri čemu segment broj 0 počinje od fizičke adrese F000h. Prikazati logičku strukturu virtuelne adrese i izračunati u koju fizičku adresu se preslikava virtuelna adresa 2564h.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Virtuelni adresni prostor je &amp;lt;math&amp;gt;2^{30}B&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Segment od 4KB, odnosno &amp;lt;math&amp;gt;2^{12}B&amp;lt;/math&amp;gt;, znači da će deo za pomeraj zauzeti 12 bita, tako da struktura izgleda VA(30): segment(18) offset(12).&lt;br /&gt;
* Virtuelna adresa 2564h označava adresu sa segmentom 2 i pomerajem 564h. Ako na F000h dodamo još 2 puta veličinu fizičkog segmenta, što je 2KB, dobijamo fizičku adresu 10564h.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti kako se znakovno orijentisani sekvencijalni ulazni uređaj može učiniti (virtuelno) istim takvim, ali sa direktnim pristupom?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako je tekući direktorijum nekog procesa &amp;lt;code&amp;gt;/a/b/c&amp;lt;/code&amp;gt;, koja je apsolutna staza do fajla koga ovaj proces otvara zadajući sledeću stazu: &amp;lt;code&amp;gt;../../d/e/../f.txt&amp;lt;/code&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;code&amp;gt;/a/d/f.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki fajl sistem koristi kombinovani indeksirani pristup alokaciji fajlova sa indeksima od jednog do tri nivoa. Objasniti zašto taj fajl sistem pokušava da alocira blokove za sadržaj fajla što bliže jedan drugome na disku, kad god je to moguće? &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Da bi vreme pristupa blokovima bilo što kraće.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>Jaksa</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=6429</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=6429"/>
		<updated>2023-08-21T17:54:14Z</updated>

		<summary type="html">&lt;p&gt;Jaksa: /* Rešenje */&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 R0, #0      ;Registar u kome se nalazi povratna vrednost&lt;br /&gt;
      LD R1, #n[SP]&lt;br /&gt;
      CMP R1, R0&lt;br /&gt;
      JG else&lt;br /&gt;
      RTS&lt;br /&gt;
else: LD R2, #1&lt;br /&gt;
      SUB R1, R2&lt;br /&gt;
      PUSH R1&lt;br /&gt;
      call f         ;nakon zavrsetka funkcije f, u R0 se nalazi rezultat&lt;br /&gt;
      POP R1&lt;br /&gt;
      ADD R0, R2&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;pascal&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&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&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;
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;
Odgovor: &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;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;int size(FHANDLE)&amp;lt;/syntaxhighlight&amp;gt; Vraća trenutnu veličinu sadržaja fajla u znakovima. &lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void append(FHANDLE, int)&amp;lt;/syntaxhighlight&amp;gt; Proširuje sadržaj fajla za dati broj znakova na kraju.&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void seek(FHANDLE, int)&amp;lt;/syntaxhighlight&amp;gt; Postavlja kurzor datog fajla na datu poziciju (redni broj znaka počev od 0).&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;void write(FHANDLE, char*, int size)&amp;lt;/syntaxhighlight&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  proširuje na potrebnu veličinu ukoliko bi zadata pozicija ili zadati upis prekoračio trenutnu veličinu sadržaja fajla. Zanemariti sve moguće greške u ulazu/izlazu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 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>Jaksa</name></author>
	</entry>
</feed>