Eksamen høsten 2010 Operativsystemer og Unix
Les nøye gjennom oppgavene før du begynner og pass på å besvare alle spørsmålene. Alle trykte og skrevne hjelpemidler er tillatt. Sett gjerne egne forutsetninger dersom du synes oppgaveteksten er uklar. Beskriv forutsetningene og løs oppgaven utifra dem.

Oppgave 1 - Kommandolinjen (10%)

a) Skriv en bash-kommando som gir eieren til filen ~/.bashrc kun skrive og leserettigheter, gruppen kun leserettigheter og alle andre ingen rettigheter.

b) Skriv en bash-kommando som flytter filen ~/.bashrc til mappen /tmp.

c) CreationTime er en property for et PowerShell filobjekt. Gi en PowerShell-kommando som gir hvilket tidspunkt filen fil.txt i mappen du står i ble laget.

d) Gi en PowerShell-kommando som gir hvilket år som filen fil.txt ble laget.

e) Hva gjør følgende PowerShell-kommando? ps | foreach {if($_.name -eq "notepad") {kill $_.Id}}

f) Skriv en PowerShell-kommando som legger sammen lengden(Length) av alle filene i mappen den utføres i og til slutt skriver ut summen.

Oppgave 2 - Prosesser og CPUer (20%)

Følgende Perl-script sum.pl kjører en CPU-intensiv subrutine run() som utfører en regneoppgave. Den bruker en Perl-modul som har en funksjon gettimeofday() som returnerer et flyttall som er antall sekunder som har gått siden 1/1-1970. Dermed vil det når subrutinen run() har blitt kjørt ferdig skrives ut en linje som sier hvor mange sekunder det har gått siden scriptet startet.

#! /usr/bin/perl
use Time::HiRes qw(gettimeofday);
$start = gettimeofday();

# Starter kjøring sum.pl
run();
# kjøring avsluttet

sub run(){
    for ($i = 0;$i < 10200000;$i++){
           $tall = ($i + 1)*($i + 1) - $i*$i;
    }
    $slutt = gettimeofday();
    $tid = $slutt - $start;
    printf("Ferdig etter %4.2f sekunder\n",$tid);
}

Når dette scriptet kjøres på en MacBook med Darwin kjerne 9.8.0 med 2 CPU'er gir det følgende output:

Ferdig etter 5.01 sekunder

Tre andre Perl-script sumA.pl, sumB.pl og sumC.pl er identiske bortsett fra koden mellom kommentarene "Starter kjøring" og "kjøring avsluttet" som ser slik ut:

# Starter kjøring sumA.pl
run();
run();
run();
# kjøring avsluttet
# Starter kjøring sumB.pl
run();
fork();
run();
# kjøring avsluttet
# Starter kjøring sumC.pl
$pid = fork();
if($pid == 0){
    fork();
    run();
}
else{
    run();
}
# kjøring avsluttet

Du skal nå forklare hva output blir når du kjører disse programmene på MacBook'en med to CPU'er. Anta at ingen andre programmer kjører samtidig. Hundredelene i tidsanvisningen vil kunne variere fra kjøring til kjøring, det er nok å oppgi tideler.

a) Skriv ned hva output vil bli når man kjører sumA.pl og forklar kort hvorfor det blir slik.

b) Skriv ned hva output vil bli når man kjører sumB.pl og forklar kort hvorfor det blir slik.

c) Skriv ned hva output vil bli når man kjører sumC.pl og forklar kort hvorfor det blir slik.

Oppgave 3 - CPU og registere (30%)

a) Forklar kort og med egne ord hva et CPU-register er.

b) Anta at du har et 8-bits register som du bruker til å lagre positive heltall. Hva er det største heltallet du kan lagre i dette registeret?

c) Forklar kort og med egne ord hvorfor man bruker cache i CPU'er.

d) Forklar kort og med egne ord hva det vil si å kompilere et C-program og hva som konkret skjer når man gjør det på en Linux-maskin.

Anta du har et program som oversetter assemblykode til maskinkode. Dette programmet oversetter linje for linje og kan gjøre det helt uavhengig av hva andre linjer måtte inneholde.

e) Programmet er opprinnelig laget og kompilert for en maskin med én CPU. Vil et operativsystem kunne sørge for at dette programmet kjører fortere på en maskin med to CPU'er? Forklar kort.

f) Vil programmereren av et slikt program kunne skrive det om slik at det kjører fortere på en maskin med to CPU'er? Forklar kort.

Anta at at følgende program er assemblykode laget for den lille 4-bits maskinen som det ble kjørt en simulering av på forelesning og som ble brukt i ukeoppgavene. Anta videre at heltallet n ligger i RAM på adresse 3.

0 MOV R0 <- M[3] (Kopierer tallet fra adresse 3 i RAM til register R0) 
1 MOVI R1 <- 3 (tallet 3 legges i R1)
2 CMP R0 R1 
3 JNE 5 (Jump Not Equal 5, hopp til linje 5 hvis R0 != R1) 
4 ADD R0 <- R0 + R1
5 MOV M[3] <- R0 (Kopierer R0 til adresse 3 i RAM)

g) Skriv ned høynivåkode med C eller Java-syntaks som kunne gitt tilsvarende assemblykode som vist over om den ble kompilert for denne CPU-arkitekturen.

h) For å kunne kjøre koden må CPU'en ha maskinkode. Bruk tabellen nedenfor og oversett linje 1-4 i assemblykoden vist over til maskinkode.

binært Nr operand1 operand2 Nr Navn
0010 DR tall 2 MOVI
0100 DR SR 4 ADD
1100 DR SR 12 CMP
1111 nr nr 15 JNE


i) Tenk deg at denne kodebiten ble kjørt av to forskjellige tråder og at variabelen n i M[3] er en felles variabel som begge trådene kan aksessere. Forklar kort om det kan oppstå en race condition hvis de to trådene kjøres samtidig og hvordan problemet isåfall kan løses.

Oppgave 4 - Scripting (25%)

a) Skriv et bash-script som når det startes av en bruker og kjøres i bakgrunnen gjør følgende hvert femte minutt: Hvis filen .bashrc ikke finnes i brukerens hjemmemappe utføres følgende:

b) På en MacBook kan output fra bash-kommandoen ps aux se slik ut:

USER       PID %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
hh         680   0.0  0.1   601808   2148 s000  S+   10:08AM   0:00.63 jed fil.txt
hh         599   0.0  0.0   600252    956 s001  S     9:38AM   0:00.09 -bash
root       598   0.0  0.1    76592   1096 s001  Ss    9:38AM   0:00.01 login -pf hh
hh         561   0.0  0.0   600252    948 s000  S     9:25AM   0:00.03 -bash
root       560   0.0  0.1    76592   1096 s000  Ss    9:25AM   0:00.02 login -pf hh
Skriv et Perl-script som tar et brukernavn som argument og som summerer og skriver ut den totale summen av kolonnene VSZ og RSS for prosesser eid av denne brukeren.

Oppgave 5 - Nettverk (15%)

Følgende er litt av output fra en Linux-kommandoen utført på en Linux-maskin med navnet fix:

eth0      Link encap:Ethernet  HWaddr 00:0F:1F:8D:70:2A
          inet addr:128.39.74.13  Bcast:128.39.75.255  Mask:255.255.254.0

a) Hvilken Linux-kommando er dette?

b) Hva er 128.39.74.13 og hvor mange bits brukes for å lagre det?

c) Hva er MAC-adressen og netmask for denne maskinen?

d) Når fix sender en nettverkspakke til nixy(128.39.74.71), vil pakken gå innom en gateway? Forklar kort.

e) Når fix sender en nettverkspakke til linus(128.39.75.71), vil pakken gå innom en gateway? Forklar kort.

f) Når fix sender en nettverkspakke til vorlon(128.39.89.71), vil pakken gå innom en gateway? Forklar kort.

g) Når en bruker på fix logger seg inn på vorlon(128.39.89.71) med ssh, startes opprettelsen av forbindelsen ved at det sendes en nettverkspakke til vorlon. Figuren viser noen av feltene i IP og TCP-headeren for en slik pakke. Skriv ned verdien for følgende felt i første pakke til vorlon: sender adresse, mottager adresse, source port, destination port, SYN og ACK. En av verdiene kan du ikke vite nøyaktig, men skriv ned en typisk verdi.

\includegraphics[width=9cm]{i.eps}

h) Neste pakke som sendes er svaret fra vorlon. Skriv ned verdien for de samme feltene som i forrige delspørsmål for denne pakken også.

-SLUTT-



haugerud 2013-05-28