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:
/etc/bashrc
kopieres til .bashrc
i brukerens hjemmemappe.
.bashrc
gis alle rettigheter for brukeren og ingen rettigheter
for andre.
alias ll="ls -l"
legges til på slutten av .bashrc
.
.log
i
brukerens hjemmemappe. Linjen skal starte med tidspunktet den er skrevet,
gitt ved output fra kommandoen date
.
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 hhSkriv 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.
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å.