themultiplexer 7 年之前
父節點
當前提交
f25de3cdee

+ 33
- 0
hw8/simu2/ANSWERS.md 查看文件

@@ -0,0 +1,33 @@
1
+# hw8 - Simulation 2 - Antworten
2
+
3
+0. Beim Erstellen wird ein Pointer übergeben, welcher dann in einen `int` gecastet werden soll. Dies funktioniert jedoch nicht, da die Größe unterschiedlich ist. Um dies zu beheben, castet man den Pointer einfach zu einem `long int`, dann stimmt die Größe.
4
+
5
+### `main-two-cvs-while.c`
6
+
7
+1. Wenn der Buffer größer wird, ändert sich nichts am Code. Die Zahl der produzierten Werte ist jedoch linear zu den Codezeilen. Das Programm ist also nicht abhängig von der Buffergröße.
8
+
9
+2. Der Producer wird (sofern die Zahl der produzierten Werte größer ist als die Größe des Buffers) den Buffer komplett füllen und der Consumer dann immer ein Item konsumieren. Im Gegensatz dazu hat der Consumer im ersten Test immer sofort konsumiert, d.h. der Buffer läuft nie voll.
10
+
11
+3. Auf der Labshell ist das Verhalten unterschiedlich zu dem auf beispielsweise einem Laptop: Der Consumer braucht auf der Labshell nicht so lange wie auf einem Laptop, da die Laufzeit offensichtlich systemabhängig ist.
12
+
13
+4. Da der Producer 10 Werte produziert, wird 10 mal für je eine Sekunde gewartet. Die zu erwartende Laufzeit liegt also über 10 Sekunden.
14
+
15
+5. Da der Producer immer noch 10 Werte produziert und dies nicht von der Größe des Buffers abhängig ist, ist die Laufzeit mit einer Buffergröße von 3 also gleich groß wie bei **4**.
16
+
17
+6. In diesem Fall werden die produzierten Werte abwechselnd von den einzelnen Consumern konsumiert. Diese warten anschließend für je eine Sekunde. Der Producer produziert 10 Werte, die auf drei Consumer aufgeteilt werden, also `C0: 4, C1: 3, C2: 3`. `C0` wartet 4 mal, also muss die Laufzeit länger als 4 Sekunden dauern.
18
+
19
+7. Wie bei **5** ist die Laufzeit hier nicht von der Größe des Buffers abhängig, da die Werte direkt aus dem Buffer konsumiert werden und dieser somit nie voll wird. Die zu erwartende Laufzeit ist also dieselbe wie bei **6**.
20
+
21
+### `main-one-cv-while.c`
22
+
23
+1. Nein, denn mit einer Condition-Variable und einer while-Schleife können nur Fehler auftreten, wenn ein zweiter Consumer geweckt wird. Da dieser hier jedoch nicht existiert, treten keine Fehler im Programm auf.
24
+
25
+2. 
26
+
27
+### `main-two-cvs-if.c`
28
+
29
+1.
30
+
31
+### `main-two-cvs-while-extra-unlock.c`
32
+
33
+1.

+ 2
- 2
hw8/simu2/main-one-cv-while.c 查看文件

@@ -34,7 +34,7 @@ int do_get() {
34 34
 }
35 35
 
36 36
 void *producer(void *arg) {
37
-    int id = (int) arg;
37
+    long int id = (long int) arg;
38 38
     // make sure each producer produces unique values
39 39
     int base = id * loops; 
40 40
     int i;
@@ -51,7 +51,7 @@ void *producer(void *arg) {
51 51
 }
52 52
                                                                                
53 53
 void *consumer(void *arg) {
54
-    int id = (int) arg;
54
+    long int id = (long int) arg;
55 55
     int tmp = 0;
56 56
     int consumed_count = 0;
57 57
     while (tmp != END_OF_STREAM) { c0;

+ 2
- 2
hw8/simu2/main-two-cvs-if.c 查看文件

@@ -34,7 +34,7 @@ int do_get() {
34 34
 }
35 35
 
36 36
 void *producer(void *arg) {
37
-    int id = (int) arg;
37
+    long int id = (long int) arg;
38 38
     // make sure each producer produces unique values
39 39
     int base = id * loops; 
40 40
     int i;
@@ -51,7 +51,7 @@ void *producer(void *arg) {
51 51
 }
52 52
                                                                                
53 53
 void *consumer(void *arg) {
54
-    int id = (int) arg;
54
+    long int id = (long int) arg;
55 55
     int tmp = 0;
56 56
     int consumed_count = 0;
57 57
     while (tmp != END_OF_STREAM) { c0;

+ 2
- 2
hw8/simu2/main-two-cvs-while-extra-unlock.c 查看文件

@@ -35,7 +35,7 @@ int do_get() {
35 35
 }
36 36
 
37 37
 void *producer(void *arg) {
38
-    int id = (int) arg;
38
+    long int id = (long int) arg;
39 39
     // make sure each producer produces unique values
40 40
     int base = id * loops; 
41 41
     int i;
@@ -54,7 +54,7 @@ void *producer(void *arg) {
54 54
 }
55 55
                                                                                
56 56
 void *consumer(void *arg) {
57
-    int id = (int) arg;
57
+    long int id = (long int) arg;
58 58
     int tmp = 0;
59 59
     int consumed_count = 0;
60 60
     while (tmp != END_OF_STREAM) { c0;

+ 2
- 2
hw8/simu2/main-two-cvs-while.c 查看文件

@@ -36,7 +36,7 @@ int do_get() {
36 36
 }
37 37
 
38 38
 void *producer(void *arg) {
39
-    int id = (int) arg;
39
+    long int id = (long int) arg;
40 40
     // make sure each producer produces unique values
41 41
     int base = id * loops; 
42 42
     int i;
@@ -53,7 +53,7 @@ void *producer(void *arg) {
53 53
 }
54 54
                                                                                
55 55
 void *consumer(void *arg) {
56
-    int id = (int) arg;
56
+    long int id = (long int) arg;
57 57
     int tmp = 0;
58 58
     int consumed_count = 0;
59 59
     while (tmp != END_OF_STREAM) { c0;

+ 35
- 0
hw8/task1/ANSWERS.md 查看文件

@@ -0,0 +1,35 @@
1
+# Proof of Work 2.0
2
+
3
+
4
+#### 1. Wie ist die Ausgabe von time zu interpretieren, wenn mehrere Threads laufen?
5
+
6
+Die user-time ist immer deutlich höher als die real-time.
7
+Das heißt, dass die Threads nicht nebenläufig, sondern parallel laufen.
8
+
9
+#### 2. Welche unterschiedlichen Ergebnisse erhalten Sie bei der Option timings? Wie stehen diese im Zusammenhang mit den Ergebnissen von time?
10
+
11
+
12
+Die Option `timings` variiert stark von den Ergebnissen von **time**. Das unix-Kommando time bezieht die Ausführungszeit des gesamten Codes mt ein.
13
+Also auch Aufrufe von *sys-info* oder zum Beispiel das Parsen der Argumente, welches *clap* durchführt.
14
+
15
+#### 3. Welche quantitativen Auswirkungen hat die Synchronisierung (Warum)? Welche Auswirkungen haben Ihre zusätzlichen Parameter?
16
+
17
+#### 4. Wie variieren -s und -w die Messungen?
18
+
19
+Mit `-s` und `-v`:
20
+  ```text
21
+  Sum Loops in Producers:       66106870
22
+  Sum Duration in Producers:    25s / 25160ms / 25160747us
23
+  ```
24
+
25
+Ohne `-s` und `-v`:
26
+
27
+Wartet der Consumer bis jeder Thread eine *Solution* gefunden hat. Dies ist sehr deutlich an den Loop-anzahl und der Zeit erkennbar.
28
+  ```text
29
+  Sum Loops in Producers:       147581082
30
+  Sum Duration in Producers:    37s / 37244ms / 37244327us
31
+  ```
32
+ 
33
+#### 5. Welche sonstigen Arten der Synchronisierung bieten sich für die Problemstellung "Lösung gefunden (-s)" an? Was sind deren Vor- und Nachteile gegenüber Ihrer gewählten Lösung?
34
+
35
+Man könnte anstatt dem Arc und dem AtomicBool im Consumer aktiv alle Threads töten, sobald eine Lösung gefunden wurde. 

Loading…
取消
儲存