[OS] Discussion for exam questions ...

Immo immo.hellwig at stud.uni-goettingen.de
Wed Feb 6 18:18:36 CET 2019


Dear Mr. Tuma,

In this mail I'll also try to provide answers/questions to some of the 
questions from the first test and would be glad about a short notice 
about their correctness. Please excuse the potential of already asked 
questions again, because I can only roughly follow your czech 
conversation by the use of Google Translator.

*Implement a semaphore with passive waiting. You can rely on the 
existence of spin locks and suitable functions that**
**can make a thread or a process go to sleep and wake up, together with 
common data types such as collections, but with**
**no support for concurrent access.*

void wait(Sem *semaphore) { lock(semaphore->spinlock); 
semaphore->value--; if (semaphore->value < 0) { do { 
cond_wait(semaphore->cond, semaphore->spinlock); } while 
(semaphore->wakeups < 1); semaphore->wakeups--; } 
unlock(semaphore->spinlock); } void signal(Sem *semaphore) { 
lock(semaphore->spinlock); semaphore->value++; if (semaphore->value <= 
0) { semaphore->wakeups++; cond_signal(semaphore->cond); } 
unlock(semaphore->spinlock); } /I'd consider this implementation to be 
active waiting, because of the use of spinlocks. But if we can't rely on 
the existence of a mutex (not mentioned in the task description) I am 
not really sure how to make the waiting passive instead. Or is the 
waiting actually passive in this case? /*Describe the priority 
scheduling algorithm with dynamic priorities. Choose reasonable details 
and write pseudocode of a hypothetical GetProcessToRun function, called 
internally by the operating system to decide what process to run and how 
long to run it.*/getProcesstoRun: if (ReadyQueue.isEmpty) return 
Exception; process highest; for (process p in ReadyQueue): if (highest 
is unassigned OR ///getPrio(p) > getPrio(highest)/): highest = p; return 
highest; "Details" targets the way Prioritys are dynamicly altered? For 
Example CFS? /*Imagine you have just implemented a binary search tree. 
Each tree node is represented by an instance of class Node,****which has 
exactly three attributes – a pointer to the value stored in the node, 
and two pointers to the left and right****subtrees. The individual 
objects are allocated on a standard heap. Estimate memory consumption 
when the tree is used****to store 1000 integer values. Choose reasonable 
values for details such as the size of a pointer or the size of an 
integer,****and justify your estimate. */Integer & Pointer are 4 
Bytes(32bit int) each. Taking kalisto as an example each block contains 
size, free-indication, pointer to heap itself and magic each 32 bit as 
well, while the footer only contains size and magic. So one node-block 
has an estimated size of 36 bytes. -> 1000 Nodes have size of 36000 
bytes ~ 36 kB. *Assume a computer with a clock device that issues an 
interrupt request on every clock tick. Assume the clock signal period is 
configurable – what period would you choose if the signal is to be used 
in the usual way (real time tracking, scheduling, timeouts and so on) by 
the operating system ? */ /Would for example 1000 kHz be reasonable 
choice, so every tick equals exactly one millisecond?/

/*Assume further that the period is configured by programming a hardware 
counter, which gets incremented on each tick of an internal clock signal 
and issues an interrupt request (and returns to initial value) on 
overflow – what initial value would you program into the counter if the 
internal clock frequency is 1 MHz and the counter is 32 bits wide ?*/ 
/Initial Value: 2^32 + 2^31 + ... 2^0 - 1000 -> Every Rotation is one 
second/ *Pick a file system. Assume an application that keeps a large 
list of files in memory, each file is in a different directory,****the 
directory depth is always 4 (for example “/A/B/C/D/e.txt”). The 
application accesses the files from the list in a****random order, and 
always reads the first 16 bytes before going to the next file. Estimate 
the average number of disk****accesses (counted as individual sector 
reads) that the operating system has to make per file. */For each folder 
a dentry is made after it was accessed first, so the number of disc 
accesses made is two per file (dentry + fileaccess) Thank you for your 
help, kind regards, Immo Hellwig /**

**

On 06.02.19 08:28, Petr Tůma wrote:
> Dobry den,
>
>>> Zkuste hrubě odhadnout, jak rychle se bude zvětšovat hodnota 
>>> proměnné i oproti situaci, kdy by pouze jedno vlákno vykonávalo 
>>> cyklus while (true) i++;. U odhadu se očekává hlavně zdůvodnění
>>> (co a proč bude kolikrát rychlejší nebo pomalejší), konkrétní
>>> hodnoty mají pouze rámcový význam.
>> Vzhledem k tomu, ze kazde vlakno bezi na svem procesoru, muzeme bez 
>> ujmy na obecnosti prohlasit, ze jakakoliv situace, ktera muze
>> nastat, bude ekvivalentni situaci, ve ktere se prvnimu vlaknu vzdycky
>> podari zamknout zamek a inkrementovat promennou a ostatnim vlaknum se
>> zamek nikdy nepodari zamknout? Pokud ano, muzeme prohlasit, ze pro
>> jednu inkrementaci promenne je potreba zamek prave jednou odemknout
>> a zamknout. Pokud celkovy pocet operaci na odemknuti a zamknuti
>> zamku oznacime jako X, muzeme prohlasit, ze se hodnota promenne bude 
>> zvetsovat X-krat pomaleji, protoze samotnou rezii inkrementace
>> muzeme zanedbat?
>
> Tohle ramcove neni spatne, az na drobne nepresne vyjadreni ke konci 
> (presneji by bylo treba "pokud odemknuti a zamknuti zamku dohromady 
> trvaji X, oproti 1 na inkrement, pak se bude i zvetsovat X-krat 
> pomaleji" - matematikove by vam rekli, ze pokud cas na inkrementaci 
> zanedbate, pak jakmile X > 0, bude vse nekonecnekrat pomalejsi :-). 
> Ale z meho pohledu to splnuje jeden zakladni element spravne odpovedi, 
> totiz uvedomit si, ze vlakna mohou zrychlit jen vykonavani tech casti 
> programu, ktere mohou bezet paralelne, coz vnitrek kriticke sekce 
> pochopitelne neni.
>
> Dalsim krokem by mohlo byt odhadnout hodnotu X, coz lze ve velmi 
> hrubem priblizeni udelat treba pocitanim pristupu do pameti - nejmene 
> jeden R-W pristup udela lock, jeden W pristup udela unlock, jeden R-W 
> pristup udela i++, takze treba X=2 nebo X=3 nemusi na prvni pohled 
> vypadat tak nesmyslne.
>
> Pokud by chtel clovek koukat na celou otazku hloubeji, mohl by se 
> zabyvat napriklad existenci caches. Kdyz bych predpokladal klasicke 
> koherentni MESI caches u vsech jader procesoru, pak cyklus "while 
> (true) i++" v izolovanem pripade pobezi s hodnotou i v L1 cache, 
> zatimco cyklus se zamky bude muset na promennou indikujici stav zamku 
> vyvolat RFO cteni a nasledny zapis. Pokud predpokladam, ze se ostatni 
> jadra budou o danou promennou take uchazet, bude to znamenat o jeden 
> az dva rady pomalejsi pristup. Pokud se navic budou jadra stridat i v 
> pristupu k i (tedy nebude platit vas predpoklad, ze vzdy vyhraje 
> stejne vlakno), tak i tento pristup bude vyzadovat RFO cteni a 
> nasledny zapis, takze se cela uloha oproti izolovanem prikladu muze 
> zpomalit treba 200 krat. Skutecnost bude o neco lepsi podle toho, jak 
> se vlaknum bude darit se predbihat.
>
> Tuto cast uvahy bych ale u standardni odpovedi moc necekal, i kdyz 
> nekteri studenti se alespon obecne zminili, ze cela vec "muze byt 
> pomalejsi kvuli synchronizaci caches".
>
>>> Strankovani Spočítejte, kolik výpadků ve vámi zvolené TLB může v 
>>> nejlepším a v nejhorším případě způsobit program, který sekvenčně 
>>> projde zřetězený seznam o 10 položkách, kde každá položka se
>>> skládá z jedné programem čtené hodnoty typu int a jednoho ukazatele
>>> na další položku, poslední položka má tento ukazatel nastaven na
>>> NULL. Uvažujte pouze přístup k datům, nikoliv k instrukcím
>>> programu
>> Mam dohromady 10 pointeru, ktere potrebuji projit, budu tedy 
>> potrebovat 10 prekladu z virtualni adresy na fyzickou. V nejlepsim 
>> pripade budou v TLB zaznam pro kazdy pointer, nedojde tedy k zadnemu 
>> vypadku; v nejhorsim pripade v TLB nebude zadny zaznam, dojde tedy k 
>> deseti vypadkum. Je tato uvaha spravne?
>
> Nejlepsi pripad je jasny, ano, i kdyz mirne presnejsi by asi bylo 
> rict, ze v TLB bude zaznam pro stranky vsech polozek (take se muze 
> stat, ze se vsechny polozky ulozi do jedne stranky, pak bude stacit 
> jediny zaznam, coz formulace "zaznam pro kazdy pointer" nepopisuje 
> uplne dobre).
>
> Nejhorsi pripad je jeste o neco horsi, protoze kazda polozka muze 
> lezet na hranici dvou stranek, pak by doslo nejhure k 20 vypadkum v 
> TLB. Ale odhad 10 neni uplne katastrofalne spatne.
>
>>> Sprava pameti Uvažujte heap alokátor bez možnosti přesunu 
>>> alokovaných bloků, u kterého můžete zanedbat režii na alokaci
>>> bloku (jako kdyby alokované bloky neměly hlavičky a nebyly
>>> zarovnávané). Máte k dispozici 1000000 bajtů heapu. Navrhněte
>>> postup (načrtněte pseudokód), kterým na tomto heapu obsadíte co
>>> nejméně paměti, ale přitom již nepůjde alokovat žádný blok s
>>> velikostí 100 bajtů nebo více. Nemusíte řešit, kam uložit případné
>>> pomocné datové struktury
>> Chapu dobre, ze otazka je polozena tak, ze mame k dispozici neznamy 
>> heap a alokator, ktery pouziva neznamou strategii alokace a nasim 
>> ukolem je pomoci sikovne alokace a dealokce pameti dosahnout toho,
>> ze na konci bude na heapu jednak co nejvice volneho mista a druhak 
>> nepujde naalokovat blok vetsi nez 100 bajtu? Pokud ano, je spravnym 
>> resenim situace, ve ktere je prvnich 99 bajtu heapu volnych,
>> nasledne je 1 bajt naalokovany, nasledne je dalsich 99 volnych bajtu
>> a takto az do konce heapu? Pokud ano, byl by spravny algoritmus na
>> vyrobu takove haldy napriklad malloc 100 bajtu a nasledne postupne
>> uvolneni 99 bajtu?
>
> Uvaha o tom, jak ma na konci vypadat heap, je zcela spravne - idealni 
> stav je vzdy 99 bajtu volnych a 1 bajt obsazeny. Spravne jste si take 
> uvedomil, ze kdyz neznate strategii prace alokatoru, algoritmicke 
> reseni muze byt obtiznejsi nez kdybyste vedel ze alokator je napriklad 
> first fit (rada odevzdanych reseni tak nejak na first fit spolehala). 
> Vas navrzeny algoritmus je ale nepresny a nezda se, ze by fungoval - 
> pokud udelate malloc 100 bajtu najednou, pak nemuzete postupne uvolnit 
> 99 z nich, protoze alokatory predpokladaji, ze uvolnujete stejne 
> bloky, jako jste alokoval. Maximalne byste mohl zkusit doufat, ze mate 
> volani realloc, ktere zmeni velikost jiz alokovaneho bloku, pak by 
> reseni bylo alokovat 10k bloku o velikosti 100 bajtu (pozor, toto zase 
> predpoklada nejakou minimalni inteligenci na strane alokacni 
> strategie) a pak je vsechny zmenit na 1 bajt prave pomoci realloc. A 
> nebo jeste primocarejsi reseni, proste alokovat jeden milion 
> jednobajtovych bloku a pak podle jejich adresy ty spravne uvolnit tak, 
> aby vznikl vzor, ktery popisujete (toto reseni je myslim jedine mozne, 
> ktere nema zadne naroky na alokacni strategii).
>
>>> Systemy souboru Aplikace potřebuje ukládat na disk zhruba milion 
>>> souborů s délkou pouze 16 bajtů, jména souborů jsou devítimístná 
>>> čísla. Zvolte si systém souborů a odhadněte diskový prostor obsazený 
>>> tímto množstvím souborů (všechen prostor, který po
>>> uložení souborů již nebude k dispozici pro jiné využití).
>> Uvazujme ext2 a velikost fyzicke stranky 4 kB. Na jeden soubor tedy 
>> bude potreba 1 fyzicka stranka a 10 bajtu na null-terminated string 
>> pro jmeno souboru. Celkem tedy 4 GB pro stranky a 10 MB pro jmena 
>> souboru. Plus jeste overhead na samotny souborovy system (inody a 
>> tak, nicmene to asi lze zanedbat. Je tato uvaha spravna?
>
> V implementaci ext2 sice existuje vazba mezi velikosti stranky a 
> velikosti alokacnich bloku, ale tu bych mozna radeji zanedbal a bavil 
> se jen o blocich, tedy beru ze uvazujete velikost bloku 4 kB. Zakladni 
> odpoved je zhruba jak uvadite, tedy jeden blok na data kazdeho souboru 
> a jedna adresarova polozka, jejimz hlavnim komponentem je jmeno, plus 
> jeden inode na kazdy soubor (a pak drobnosti jako jeden inode na 
> adresar, ale ty uz se neresi).
>
> Pokud by clovek chtel odpovedet presneji, pak asi zacatek by byl 
> podivat se na velikost inode. Ta byva v default instalacich 128 bajtu, 
> takze jeste 128 MB na ulozeni inodes (coz, kdyz vas zajimalo 10 MB na 
> adresare, neni uplne zanedbatelne). Pak je jeste mozne, ze vas 
> filesystem byl konfigurovan s nastavenim inline_data, dostupne tusim 
> od ext4 a cca roku 2011, pak by mohla byt inode size 256 bajtu a data 
> souboru by se vesla do inode, celkova spotreba tedy 256 MB plus adresar.
>
> A konecne kdybychom chteli zpresnit ten odhad velikosti adresare, pak 
> 10 bajtu na jmeno je fajn, ale jeste budete potrebovat nejmene jeden 
> int na cislo inode, kde soubor daneho jmena lezi (to je docela zasadni 
> soucast adresarove polozky), ve skutecnosti v polozce najdete jeste 
> celkem 8 bajtu dodatecne informace a jmeno neni zero terminated, takze 
> na nej staci 9 bajtu, plus nejake pozadavky na zarovnani, ktere by asi 
> bylo primo trestuhodne pamatovat si z hlavy. Cili presnejsi odhad by 
> byl nekde kolem 20 MB na adresar. Odhad delky adresare s hash tree 
> indexem jiz necham, jak rikaji matematici, k domacimu procviceni 
> laskaveho ctenare :-)
>
> Jak jste si asi vsimnul, vsechny otazky lze zodpovedet do ruzne 
> hloubky detailu. Pri hodnoceni je mi docela jedno, jestli si dobre 
> zapamatujete delku inode v ext2, kdybyste napsal 128B nebo zhruba 100B 
> nebo 256B tak bych vse z toho akceptoval, uplne mi staci, ze z 
> odpovedi je jasne, ze vite o inodes. Pokud byste ale napriklad tvrdil, 
> ze na systemu souboru zvolite bloky 16B a tedy kazdy soubor bude 
> zabirat presne 16B, tuto odpoved bych neakceptoval, protoze dana delka 
> bloku je prakticky nesmyslna. A tak dale, i u vsech ostatnich otazek. 
> Jinymi slovy - vase odpovedi podle tohoto mailu by mozna ztratily 
> nejake male mnozstvi bodu, ale celkove bych je povazoval za spise 
> spravne.
>
> Petr Tuma
> _______________________________________________
> NSWI004 mailing list
> NSWI004 at d3s.mff.cuni.cz
> https://d3s.mff.cuni.cz/mailman/listinfo/nswi004
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://d3s.mff.cuni.cz/pipermail/nswi004/attachments/20190206/60e7f7f5/attachment-0001.html>


More information about the NSWI004 mailing list