Løsningsforslag eksamen høsten 2010 Operativsystemer og Unix

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 sekunder
Under 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 $2^8 -1$, 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)

-SLUTT-



haugerud 2013-05-28