Browse Source

Merge pull request #4 from themultiplexer/hw3

hw3
svantja 8 years ago
parent
commit
cadb0d6dae
No account linked to committer's email address
5 changed files with 229 additions and 1 deletions
  1. 1
    1
      hw3/README.md
  2. 21
    0
      hw3/simu1/ANSWERS.md
  3. 82
    0
      hw3/simu2/ANSWERS.md
  4. 111
    0
      hw3/simu3/ANSWERS.md
  5. 14
    0
      hw3/simu4/ANSWERS.md

+ 1
- 1
hw3/README.md View File

@@ -26,7 +26,7 @@ You find all Files for your simulation homework in the `simuN/` directory.
26 26
 
27 27
 **IMPORTANT**: This time, there is no possibility to give more
28 28
 explanations/comments  AFTER the Code Review. You have to give all the asked
29
-explanations and comments (in German or English) before the code review.
29
+explanations and comments before the code review.
30 30
 
31 31
 The code review starts after the deadline, so you have enough time to extend
32 32
 your answers, if your Pull-Request was quite early. After the deadline there

+ 21
- 0
hw3/simu1/ANSWERS.md View File

@@ -0,0 +1,21 @@
1
+# Simulation 1 - Antworten
2
+
3
+1. Das letzte Segment liegt auf der dezimalen (virtuellen) Adresse 929. Damit dieses Segment in den Adressraum passt, muss dieser mindestens ein Limit von **930** haben.
4
+
5
+2. Der physikalische Adressraum ist 16kB groß und das Limit beträgt 100. 16384 - 100 = 16284
6
+
7
+3. Bei einer Vergrößerung des **Adressraums** (z.B. `-a 2k`) nimmt die Zahl der Segmentation-Fehler zu, da das Programm die Adressen aus einer **größeren Spanne** auswählt, das **Limit** der validen Adressen sich jedoch nicht ändert. Vergrößern wir jedoch die Größe des **physikalischen Speichers**, ändert sich nichts am Ergebnis - die Größe des verfügbaren Speichers hat nämlich *keinen Einfluss* darauf, aus welcher **Reichweite** das Programm Adressen auswählt bzw. bis zu welchem Limit Adressen **valide** sind.
8
+
9
+4.
10
+VA | Seg. Vio.?
11
+---|---
12
+0|no
13
+1|yes
14
+2|no
15
+3|no
16
+4|yes
17
+5|yes
18
+6|yes
19
+7|no
20
+8|yes
21
+9|no

+ 82
- 0
hw3/simu2/ANSWERS.md View File

@@ -0,0 +1,82 @@
1
+## Warmup
2
+
3
+| VA Number | Virtual Adress     | Physical Adress     | Valid |
4
+| --------- | :----------------- | ------------------- | ----- |
5
+| VA  0     | 0x11  --> 0010001  | 000010001 --> 0x011 | YES   |
6
+| VA  1     | 0x6c  --> 1101100  | 111101100 --> 0x1ec | YES   |
7
+| VA  2     | 0x61  --> 1100001  | 111100001 --> 0x1e1 | NO    |
8
+| VA  3     | 0x20  --> 0100000  | 00100000 --> 0x020  | NO    |
9
+| VA  4     | 0x3f   --> 0111111 | 00111111 --> 0x03f  | NO    |
10
+
11
+
12
+
13
+```
14
+ --------------- 0x00000000
15
+ |  Segment 0  |
16
+ |-------------| 0x00000014
17
+ |             |
18
+ |             |
19
+ |             |
20
+ |             |
21
+ |-------------| 0x000001ec
22
+ |  Segment 1  |
23
+ |-------------| 0x00000200
24
+```
25
+
26
+
27
+
28
+## Antworten
29
+
30
+1.  Die höchste erlaubte Adresse in Segment 0 ist 0x00000013. Die niedrigste valide Addresse des Segments 1 ist 0x000001ec. Die niedrigste illegale Adresse ist 0x0000014 und die höchste illegale Adresse ist 0x000001eb im gesamten Adressraum. Um zu testen ob das stimmt kann mann alle validen  virtuellen Adressen der Segmente UND jeweils (mindestens) eine über dem Limit mit `-A` angeben.
31
+
32
+     `-A 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,`
33
+
34
+     `106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127`
35
+
36
+
37
+2.   Der Aufruf muss wie folgt aussehen:
38
+
39
+    > ./segmentation.py -a 16 -p 128 -A 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 **--b0 0 --l0 2 --b1 16 --l1 2** -c
40
+
41
+    Die Flags `-l0` und `-l1` setzten jeweils das Limit für das Segment auf 2:
42
+
43
+    ​	Segment 0 nimmt also die virtuellen Adressen 0 und 1 an und
44
+
45
+    ​	Segment 1 nimmt die Adressen 14 und 15 an
46
+
47
+3.   Man sollte das Limit `-l` so wählen, dass es 90% der Adressen des Adressraums `-a` abdeckt. Dann werden die restlichen 10% der virtuellen Adressen über das gesetzte Limit gehen und einen Segmentation Fault auslösen.
48
+
49
+4.  Man setzt die Limits der Segmente mit `-l 0` auf 0, dann ist keine virtuelle Adresse valide. 
50
+
51
+5.  Im folgenden wird VA für virtuelle Adresse und PA für physikalische Adresse benutzt.
52
+
53
+    `Segment 0: 0x0000 bis 0x0040`
54
+
55
+    `Segment 1: 0x0380 bis 0x0400`
56
+
57
+    Höchste VA **0x16C** -> (mappt auf) höchste PA **0x400**
58
+
59
+    1024 - 364 = 660 (Segment 1 Offset)
60
+
61
+    | VA Nr. | VA HEX     | VA BIN          | Physical Address HEX   | PA DEC |
62
+    | ------ | ---------- | --------------- | ---------------------- | :----: |
63
+    | 0      | 0x0000005c | 00\|1011100     | Segmentation Violation |   -    |
64
+    | 1      | 0x00000011 | 00\|0010001     | **0x00000011**         |   17   |
65
+    | 2      | 0x00000043 | 00\|1000011     | Segmentation Violation |   -    |
66
+    | 3      | 0x00000021 | 00\|0100001     | **0x00000021**         |   33   |
67
+    | 4      | 0x0000006c | 00\|1101100     | Segmentation Violation |   -    |
68
+    | 5      | 0x0000007a | 00\|1111010     | Segmentation Violation |   -    |
69
+    | 6      | 0x00000050 | 00\|1010000     | Segmentation Violation |   -    |
70
+    | 7      | 0x00000037 | 00\|0110111     | **0x00000037**         |   55   |
71
+    | 8      | 0x000000ff | **01**\|1111111 | **0x00000393**         |  915   |
72
+    | 9      | 0x000000e9 | **01**\|1101001 | Segmentation Violation |   -    |
73
+    | 10     | 0x00000001 | 00\|0000001     | **0x00000001**         |   1    |
74
+    | 11     | 0x0000014c | **10**\|1001100 | **0x000003e0**         |  992   |
75
+    | 12     | 0x000000b4 | **01**\|0110100 | Segmentation Violation |   -    |
76
+    | 13     | 0x000000cf | **01**\|1001111 | Segmentation Violation |   -    |
77
+    | 14     | 0x0000012b | **10**\|0101011 | **0x000003bf**         |  959   |
78
+    | 15     | 0x00000084 | **01**\|0000100 | Segmentation Violation |   -    |
79
+
80
+    Zuerst überprüft man in welchem Segment die VA liegt, indem man auf das höchste bit der binären VA schaut. Wenn sie im Segment 0 liegt dann ist VA => PA und man kann prüfen, ob die Adresse im oben berechneten physikalischen Adressbereich von Segment 0 liegt. Wenn nicht => SEG FAULT.
81
+
82
+    Wenn die VA in Segment 1 liegt, dann muss man vorher den berechneten Offset vonn dezimal 660 oder hexadezimal 0x258 aufaddieren. Dann hat man die PA und kann dann schauen ob sie im physikalischen Adressbereich von Segment 1 liegt. Wenn nicht => SEG FAULT.

+ 111
- 0
hw3/simu3/ANSWERS.md View File

@@ -0,0 +1,111 @@
1
+# Warmup
2
+
3
+Die Entwicklung des Speichers nach ausführen von `./malloc.py -n 10 -H 0 -p BEST -s` 
4
+
5
+```
6
+ --------------- 1000
7
+ |             |
8
+ |             |
9
+ |-------------| 1100
10
+```
11
+
12
+```
13
+ --------------- 1000
14
+ |   alloc'd   |
15
+ |-------------| 1003
16
+ |             |
17
+ |             |
18
+ |    FREE     |
19
+ |             |
20
+ |             |
21
+ |-------------| 1100
22
+```
23
+
24
+```
25
+ --------------- 1000
26
+ |    FREE     |
27
+ |-------------| 1003
28
+ |             |
29
+ |             |
30
+ |    FREE     |
31
+ |             |
32
+ |             |
33
+ |-------------| 1100
34
+```
35
+
36
+```
37
+ --------------- 1000
38
+ |    FREE     |
39
+ |-------------| 1003
40
+ |   alloc'd   |
41
+ |-------------| 1008
42
+ |             |
43
+ |    FREE     |
44
+ |             |
45
+ |-------------| 1100
46
+```
47
+```
48
+ --------------- 1000
49
+ |    FREE     |
50
+ |-------------| 1003
51
+ |    FREE     |
52
+ |-------------| 1008
53
+ |             |
54
+ |    FREE     |
55
+ |             |
56
+ |-------------| 1100
57
+```
58
+```
59
+ --------------- 1000
60
+ |    FREE     |
61
+ |-------------| 1003
62
+ |    FREE     |
63
+ |-------------| 1008
64
+ |   alloc'd   |
65
+ |-------------| 1016
66
+ |    FREE     |
67
+ |-------------| 1100
68
+```
69
+```
70
+ --------------- 1000
71
+ |    FREE     |
72
+ |-------------| 1002
73
+ |   alloc'd   |
74
+ |-------------| 1003
75
+ |    FREE     |
76
+ |-------------| 1008
77
+ |    FREE     |
78
+ |-------------| 1016
79
+ |    FREE     |
80
+ |-------------| 1100
81
+```
82
+```
83
+ --------------- 1000
84
+ |    FREE     |
85
+ |-------------| 1002
86
+ |   alloc'd   |
87
+ |-------------| 1003
88
+ |    FREE     |
89
+ |-------------| 1008
90
+ |   alloc'd   |
91
+ |-------------| 1015
92
+ |    FREE     |
93
+ |-------------| 1016
94
+ |    FREE     |
95
+ |-------------| 1100
96
+```
97
+
98
+Wie man sieht hat die Fragmentierung des Speichers bzw. der Free-Liste zugenommen.
99
+
100
+# Antworten
101
+
102
+1. Wenn zwei mal ein gleich großes Speicherstück alloziiert wird, dann wird nicht das wieder freigewordene Fragment genutzt, sondern ein neues reserviert. Auch Alloziierungen von kleineren Stücken bekommen keine Teile von wieder freigegebenem Platz. Also ensteht im allgemeinen eine höhere Fragmentierung als mit **BEST**.
103
+2. Die Struktur der Free-Liste ändert sich nicht, aber es werden weniger Elemente (Speicherblöcke) gesucht, bevor die Adresse zurückgeliefert wird. Je größer die Free-Liste, desto länger dauert es, diese zu durchsuchen. Das Flag **FIRST** verkürzt also die Suchzeit und somit auch die insgesamte alloc-Zeit.
104
+3. Die verschiedenen Sortiermechanismen:
105
+   - **ADDRSORT** sortiert die Liste mit dem freien Speicher nach der höhe der Adresse. Es verändert sich nichts zu vorher mit anderen Policies.
106
+   - Bei **SIZESORT+** sind die kleinsten *Stücke* vorne in der Liste. Bei **BEST** ist dann oft der Verschnitt, also 1-Byte-Blöcke am Anfang. 
107
+   - Bei **SIZESORT-** wird die Speicherliste absteigend nach der Größe der Blöcke sortiert. Diese Sortierung ist vorteilhaft für die Policy **FIRST**, da große Blöcke direkt am Anfang gefunden werden die sehr häufig für den angeforderten Speicher ausreichen. 
108
+4. Bei größeren Speicheranforderungen schlägt malloc fehl, mit dem Rückgabewert `-1` und die Free-Liste ist sehr groß. Wenn man nun die Verschmelzung von freiem Speicher mit `-C`  aktiviert, dann schlägt keine Allozierung mehr fehl und die Liste des freien Speichers ist kleiner. Die Sortierung der Liste spielt keine Rolle, da keine Fragmente über andere Adressen hinweg miteinander verschmolzen werden können.
109
+5. Wenn ein Faktor von über 50% erlaubt wird, dann bleibt die Liste klein, da der Speicher nicht wieder freigegeben wird. Bei Werten bis zu 100% kommt es definitiv zu einem Fehler bei der Alloziierung, da nicht genug freier Speicher vorhanden ist. Bei Werten, die gegen 0 gehen wird nach jedem **alloc** ein **free** aufgerufen und es ist immer wieder freier Speicher vorhanden.
110
+6. ​In dem man bei jedem **alloc** ein Byte mehr Speicher als davor anfordert, muss immer ein neuer "Block" angefangen werden. Dabei hilft die Policy BEST auch nichts mehr, da die neuen Allozierungen nie in die wieder frei gewordene kleinere Speicherstücke passt.
111
+

+ 14
- 0
hw3/simu4/ANSWERS.md View File

@@ -0,0 +1,14 @@
1
+# Simulation 4 - Antworten
2
+
3
+1.1. Die Tabellengröße kann mit folgender Gleichung beschrieben werden: `T = a/P` mit `T` = Tabellengröße, `a` = Adressraumgröße und `P` = Seitengröße.
4
+
5
+1.2. Aus obiger Formel lässt sich schließen: Mit wachsendem Adressraum sollte die Tabellengröße mit gleichem Faktor wachsen, mit wachsender Seitengröße sollte die Tabellengröße mit gleichem Faktor sinken.
6
+
7
+1.3. Bei einem Kontextwechsel muss bei großer Seitengröße mehr geladen werden. Das benötigt Zeit.
8
+
9
+2. Je größer der Anteil der zum Adressraum zugeordneten Seiten wird, desto weniger Segmentation-Fehler treten auf.
10
+
11
+3. Der Parameter `-P 1m -a 256m -p 512m -v -s 3` ist unrealistisch, da eine Seitengröße von 1MB Größe viel zu groß ist, um praktikabel zu sein.
12
+
13
+4. Wenn der Adressraum größer als der physikalische Speicher ist, gibt das Programm eine Fehlermeldung aus.
14
+Weitere Fehler können manuell provoziert werden, wenn zum Beispiel eine negative Seitengröße (`math domain error`) oder die Seitengröße mit 0 angegeben werden (`float division by 0`). Auch beim angeben eines leeren Adressraums tritt ein Fehler auf (`must specify a non-zero address-space size`), genauso auch bei der physikalischen Speichergröße. Außerdem bekommt man einen Index-Fehler (`array index out of bounds`), wenn man eine sehr große (z.B. `2^31`) Seitengröße verwendet.

Loading…
Cancel
Save