themultiplexer 8 vuotta sitten
vanhempi
commit
92a0f12458
4 muutettua tiedostoa jossa 92 lisäystä ja 0 poistoa
  1. 20
    0
      hw7/simu1/ANSWERS.md
  2. 9
    0
      hw7/task1/Cargo.toml
  3. 13
    0
      hw7/task1/src/hash256.rs
  4. 50
    0
      hw7/task1/src/main.rs

+ 20
- 0
hw7/simu1/ANSWERS.md Näytä tiedosto

@@ -0,0 +1,20 @@
1
+# hw7 - Simulation 1 - Antworten
2
+
3
+### `flag.s`
4
+1. 1.1. Der Assembler-Code versucht, mithilfe einer Variable `flag` einen Lock zu implementieren.
5
+
6
+    1.2. Mit den Standardeinstellungen (`./x86.py -p flag.s -M flag,count -R ax,bx`) funktioniert `flag.s` wie erwartet.
7
+
8
+    1.3. Es wird ein korrekter Output erzeugt, da `count` pro Thread einmal inkrementiert wird und deswegen am Ende den Wert `2` haben muss.
9
+
10
+    1.4. Am Ende der einzelnen Threads wird der Wert `0` in `flag` stehen, da jeder Thread diesen Wert vor Beendigung auf `0` setzt.
11
+
12
+2. Beispielsweise mit der Option `-a bx=40,bx=40` sollte das Programm eigentlich am Ende den Wert `80` in `count` stehen haben. Dies ist jedoch nicht der Fall, denn es steht `70` in `count`. Der Lock kann also nicht wie erwartet funktionieren.
13
+
14
+3. Wenn wir die Interrupt-Rate auf z.B. `-i 5` setzen (d.h. alle 5 Zyklen ein Interrupt), steht am Ende nur der Wert `40` in `count` (erwartet war `80`). Mit `-i 90` bekommen wir am Ende den Wert `71`. Dies lässt darauf schließen, dass häufige Interrupts eine stärkere Verfälschung des erwarteten Ergebnisses zur Folge haben, während besonders hohe Werte nahezu bis gar keine Auswirkung darauf haben. Je häufiger ein Interrupt auftritt, desto höher ist auch die Wahrscheinlichkeit, einen veralteten Wert zu lesen bzw. zu schreiben. Bei einer sehr hohen Interruptrate (z.B. `-i 1`) bekommen wir daher nur noch die Hälfte des eigentlich erwarteten Ergebnisses, in unserem Fall `40`.
15
+
16
+### `test-and-set.s`
17
+
18
+Hier wird der Lock durch das Vertauschen des Wertes in `mutex` mit dem Register `ax` gesetzt. Aufgehoben wird der Lock, in dem eine `0` in die Mutex-Variable (`mutex`) geschrieben wird.
19
+
20
+1. Das Programm liefert nun immer den erwarteten Wert. Sowohl mit `./x86.py -p test-and-set.s -M mutex,count -R ax,bx -i 1 -a bx=40,bx=40` als auch mit nur `-i 1000` steht am Ende der Wert `80` in `count`.

+ 9
- 0
hw7/task1/Cargo.toml Näytä tiedosto

@@ -0,0 +1,9 @@
1
+[package]
2
+name = "task1"
3
+version = "0.1.0"
4
+authors = ["Lorenz Bung <lorenz.bung@googlemail.com>"]
5
+
6
+[dependencies]
7
+sha2 = "0.7.0"
8
+clap = "2.28"
9
+time = "0.1"

+ 13
- 0
hw7/task1/src/hash256.rs Näytä tiedosto

@@ -0,0 +1,13 @@
1
+use hasher_sha256;
2
+
3
+struct Solution {
4
+    number: usize,
5
+    hash: String,
6
+}
7
+
8
+pub fn verify_product(base: usize, number: usize, difficulty: String) -> Option<Solution> {
9
+    if let x = hasher_sha256::Hasher::hash(((base * number) as i32)).hex().ends_with(difficulty) {
10
+        Some(Solution{ number: (base * number), hash: x,});
11
+    }
12
+    None
13
+}

+ 50
- 0
hw7/task1/src/main.rs Näytä tiedosto

@@ -0,0 +1,50 @@
1
+extern crate clap;
2
+extern crate time;
3
+use clap::{Arg, App, SubCommand};
4
+mod hasher_sha256;
5
+mod hash256;
6
+
7
+pub fn main(/*base: usize, */number: usize, diff: String) {
8
+    let matches = create_app().get_matches();
9
+    let base;
10
+    match matches.value_of("base") {
11
+        Some(x) => {base = u64::from(x)}
12
+        None => {panic!()}
13
+    };
14
+    match hash256::verify_product(base, number, diff) {
15
+        Some(x) => { println!("{}", diff); }
16
+        None => { println!("None"); }
17
+    }
18
+}
19
+
20
+fn create_app<'a, 'b>() -> App<'a, 'b> {
21
+    App::new("Hash256")
22
+        .version("1.0")
23
+        .author("Lorenz Bung & Joshua Rutschmann")
24
+        .about("Calculates the Hashvalue of the given base, number and difficulty.")
25
+        .arg(Arg::with_name("base")
26
+            .short("b")
27
+            .long("base")
28
+            .value_name("VALUE")
29
+            .help("The base of the hash to be calculated on.")
30
+            .takes_value(true)
31
+            .required(true))
32
+        .arg(Arg::with_name("number")
33
+            .short("n")
34
+            .long("number")
35
+            .value_name("VALUE")
36
+            .help("The number of the hash to be calculated on.")
37
+            .takes_value(true)
38
+            .required(true))
39
+        .arg(Arg::with_name("difficulty")
40
+            .short("d")
41
+            .long("difficulty")
42
+            .value_name("VALUE")
43
+            .help("The difficulty of the calculated hash.")
44
+            .takes_value(true)
45
+            .required(true))
46
+        .subcommand(SubCommand::with_name("timings")
47
+            .about("controls timing features")
48
+            .version("1.0")
49
+            .author("Lorenz Bung & Joshua Rutschmann"))
50
+}

Loading…
Peruuta
Tallenna