Oppgave 1 - Kommandolinjen (10%)
a) chmod 640 ~/.bashrc
b) mv ~/.bashrc /tmp
c) (ls fil.txt).CreationTime
d) (ls fil.txt).CreationTime.Year
e) Den avslutter alle kjørende prosesser som heter notepad ved å løpe igjennom alle prosesser i en
foreach-løkke og drepe en etter en av prosessene som har dette navnet.
kill -n notepad
gjør det samme.
f) ps | foreach { $sum += $_.Length}; $sum
Oppgave 2 - Prosesser og CPUer (20%)
a)
run()
kjøres tre ganger etter hverandre i en og samme prosess og dermed hele tiden
på samme CPU. Det tar da 5 sekunder
å kjøre hver runde ferdig.
Ferdig etter 5.0 sekunder Ferdig etter 10.0 sekunder Ferdig etter 15.0 sekunder
b) Først kjøres run()
en gang og er ferdig etter 5 sekunder. Kallet på fork()
gjør at en child prosess
startes som på samme måte som parent kjører run()
. Men disse vil kjøre som uavhengige prosesser på hver sin
prosessor og dermed er begge ferdig 5 sekunder senere.
Ferdig etter 5.0 sekunder Ferdig etter 10.0 sekunder Ferdig etter 10.0 sekunder
c) Først gjøres det en fork og parent starter en run-prosess. Child fork'er med en gang den starter opp og dermed vil
to uavhengige prosesser til kjøre run()
. Dermed starter tre uavhengige prosesser samtidig, Darwin kjernen sørger for
at de deler broderlig på de to CPU'ene og dermed blir alle tre ferdig etter 3x5/2 = 7.5 sekunder.
Ferdig etter 7.5 sekunder Ferdig etter 7.5 sekunder Ferdig etter 7.5 sekunderUnder vises resultatet av en virkelig kjøring av programmene. Legg merke til at resultatet fra den siste prosessen printes ut etter at scriptet har avsluttet og promptet er skrevet ut.
hh$ ./sumA.pl Ferdig etter 4.98 sekunder Ferdig etter 9.98 sekunder Ferdig etter 14.95 sekunder hh$ ./sumB.pl Ferdig etter 5.00 sekunder Ferdig etter 10.01 sekunder Ferdig etter 10.01 sekunder hh$ ./sumC.pl Ferdig etter 7.50 sekunder Ferdig etter 7.53 sekunder hh$ Ferdig etter 7.54 sekunder
Oppgave 3 - CPU og registere (30%)
a) Et CPU-register er en minneenheten i CPU'en som brukes direkte i CPU-instruksjoner som ADD, SUB og CMP. De brukes til å lagre data CPU'en jobber med og også selve instruksjonene. CPU-registere er den hurtigste og minste minneenheten i en datamaskin.
b) Med 8 bit kan man lagre heltall fra 0 til , det vil si at det høyeste heltallet er 255.
c) Når en CPU skal gjøre beregninger må den mates med data fra internminnet, men det tar mye lenger tid å hente data fra minnet enn fra registere. Dermed kan ikke data hentes like hurtig som CPU'en kan bruke dem. For å bedre situasjonen bruker man et hurtig cache-minne som et buffer mellom registerne og internminnet. Ofte brukes instruksjoner og data som ligger nær hverandre i minnet og dermed spares mye tid ved å hente over større deler fra internminnet av gangen til cache.
d) Å kompilere et C-program vil si å oversette høynivå-språk til maskininstruksjoner som kan kjøres direkte av CPU'en. Når man på en Linux maskin kompilerer et program som for eksempel heter prog.c, oversetter kompilatoren C-koden til maskinkode og det lages en ny fil a.out som inneholder den genererte maskinkoden.
e) Et operativsystem kan i utgangspunktet ikke vite hva maskininstruksjonene til et program utfører og må derfor la programmet utføres sekvensielt på én CPU. OS kan ikke på egen hånd dele opp programmet og kjøre deler av det på den andre CPUen.
f) En programmerer av et slikt program vil for eksempel kunne dele jobben mellom to uavhengige tråder som oversetter hver sin del av programmet fra assembly til maskinkode. Dermed kan programmet utnytte to CPUer ved at OS setter igang en tråd på hver sin CPU.
g)
if(n == 3){ n += 3; }
h)
00100111 11000001 11110101 01000001
i) Hvis det skjer en context switch etter at M[3] er hentet inn fra minnet, kunne det i prinsippet ha medført en race condition. Men i dette konkrete tilfellet er alt koden gjør å endre variabelens verdi til 6 kun i det spesielle tilfellet at den i utgangspunktet har verdien 3. Dermed kan ikke trådene ødelegge for hverandre hvis det kun er disse to som kjører samtidig. Hvis n ikke er 3 i utgangspunktet vil ingen av trådene gjøre noen endring. Om verdien er 3 vil begge sette den til 6, så de ødelegger ikke for hverandre om begge prøver å gjøre det samtidig. Men om en tredje tråd kjørte samtidig og kunne sette verdien på n ville en race condition oppstått om den tredje tråden satte verdien etter at den første tråden leste den, men før den andre leste den. Å sikre seg mot dette kunne da løses ved en form for mutex-løsning.
Oppgave 4 - Scripting (25%)
a)
#! /bin/bash while [ True ] do if [ ! -f ~/.bashrc ] then cp /etc/bashrc ~/.bashrc chmod 700 ~/.bashrc echo 'alias ll="ls -l"' >> ~/.bashrc echo "$(date) /etc/bashrc kopiert" >> ~/.log fi sleep 300 done
b)
#! /usr/bin/perl open(PS,"ps aux |"); <PS>; while ($line = <PS>){ @arr = split(/\s+/,$line); # @arr = split(" ",$line); virker også if($ARGV[0] eq $arr[0]){ $VSZ += $arr[4]; $RSS += $arr[5]; } } print "VSZ: $VSZ\n"; print "RSS: $RSS\n";
Oppgave 5 - Nettverk (15%)
a) ifconfig
b) 128.39.74.13 er maskinens 32bits IP-adresse.
c) MAC-adressen er 00:0F:1F:8D:70:2A og netmask er 255.255.254.0.
d) Nei, nixy tilhører samme subnet og pakken går defor direkte.
e) Siden netmask er 255.255.254.0 vil subnettet fix tilhører bestå av de 512 IP-adressene
128.39.74.0 - 128.39.75.255. Netmask'en betyr at 23 første bit'ene er nettverksnummeret og de 9 siste er
hostnummeret. Pakken går derfor direkte fordi linus
også tilhører samme subnet.
f) Ja, vorlon
tilhører et annet subnet og pakken må derfor gå innom en gateway for å komme frem.
g)
sender adresse | 129.18.74.13 | fix |
mottager adresse | 128.39.89.71 | vorlon |
source port | 7425 | portnummer generert av ssh-client, større enn 1024 |
destination port | 22 | ønsker å kontakte tjeneste 22, ssh, på server |
SYN | 1 | SYN-flagg settes i første pakke i handshakingen |
ACK | 0 | ACK-flagg er ikke satt i første pakke |
h)
sender adresse | 128.39.89.71 | vorlon |
mottager adresse | 129.18.74.13 | fix |
source port | 22 | ssh-serverens portnummer |
destination port | 7425 | portnummeret som client sendte i forrige pakke |
SYN | 1 | SYN-flagg settes også i andre pakke i handshakingen |
ACK | 1 | ACK-flagg settes i svarpakken (acknowledge) |