Eksamen våren 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) Hva er feil i denne bash-kommandoen:

$filinfo = ls -l fil.txt

b) I bash gir ls -l følgende i en mappe:

-rw-r--r--  1 hh  staff  10686 Apr 28 11:43 h.tex
Forklar kort ut ifra dette hvordan rettighetene er satt for denne filen og hvilke brukere som har disse rettighetene.

c) Skriv en bash-kommando som setter samme rettigheter til filen h2.tex som filen h.tex i forrige deloppgave hadde.

d) Hva blir output av følgende bash-kommando?

echo "en to tre" | sort | grep to | grep tre

e) Hva blir output av følgende bash-kommando?

for tall in $(seq 1 5); do echo -n $tall; done

f) Anta at fil.txt er en Windows tekstfil i mappen du står i. Hva gir følgende PowerShell-kommando?

PS> ls fil.txt | Get-Member

Oppgave 2 - Prosesser og scheduling (20%)

a) Linux-kjernen konfigurerer vanligvis hardware-timeren til å sende et interrupt hvert hundredels sekund. Forklar kort hvorfor dette timer-interruptet er nødvendig for at Linux-kjernen skal kunne fordele CPU-tid mellom alle prosessene uten at en av disse prosessene kan ta over styringen.

b) En hardware-timer deler tiden inn i jiffies eller ticks. En jiffy er tiden mellom hvert interrupt mellom fra timeren, ett hundredels sekund i eksempelet i forrige delspørsmål. Forklar kort hvordan et operativsystem kan prioritere prosesser forskjellig ved hjep av denne tidsinndelingen.

Tre 100% CPU-avhengige prosesser A, B og C kjører på en Linux-PC med kun én CPU. Ved starten av en epoke er alle tre klare til å kjøre og de er de eneste prosessene i ready-list. Prosess A har en tildelt timeslice på 30 ticks/jiffies, B har 20 og C har 10.

c) Forklar kort hvordan disse prosessene kjøres og hvordan fordelingen av CPU-tid vil skje for disse tre prosessene i løpet av epoken. Anta at det ikke forekommer andre interrupts enn fra timeren og at prosessene ikke gjør noen systemkall.

d) Forklar kort hvor mange timer-interrupts og context switches som vil skje i denne epoken.

e) Hva skjer når epoken er over? Vil prosessene nødvendigvis få tildelt samme antall ticks som før? Forklar kort.

f) Linux 2.6 kjernen deler dynamisk prosessene inn i 140 forkjellige prioritetsklasser. Hver prioritetsklasse tilsvarer et antall tildelte ticks i starten av en epoke. Hver gang scheduleren kalles, velges prosessen som har høyest prioritet og den kjører til den har brukt opp alle sine tildelte ticks. Deretter kalles scheduleren på nytt. Men hvis det i løpet av epoken kommer et interrupt, for eksempel fra tastaturet, vil et flagg need_resched bli satt og scheduler på grunn av dette kjøres etter neste timer-tick. Forklar kort hvorfor need_resched er viktig for at interaktive prosesser skal ha rask responstid.

g) Forklar kort med bakgrunn i forrige delspørsmål omtrent hvor lang tid det maksimalt vil ta fra en bruker taster et tegn på tastaturet til det synes på skjermen når en teksteditor kjører under Linux 2.6 kjernen. Hvordan vil en endring av lengden av en jiffy påvirke tiden det tar?

h) Anta at den minste mulige time-slice en prosess kan tildeles er 10 ticks = 100ms. Prosesser i laveste prioritetsklasse vil da ha 10 ticks. Anta videre at de eneste aktive prosessene er en teksteditor kjører samtidig med en regnejobb-prosess som er 100% CPU avhengig. Regnejobben havner derfor raskt havne i laveste prioritetsklasse. Hvis 2.6 kjernen ikke brukte need_resched, omtrent hvor mange millisekunder ville det gjennomsnittlig ta fra et trykk på tastaturet til et tegn vises i teksteditoren? Omtrent hvor mange millisekunder ville det gjennomsnittlig ta når need_resched brukes? Forklar kort.

Oppgave 3 - Prosesser og CPUer (25%)

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 < 10000000;$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å tre forskjellige maskiner:

A
Linux ubuntu 2.6.18 med én CPU
B
MacBook Darwin Kernel Version 9.8.0 med 2 CPU'er
C
Linux Debian 2.6.18 med fire CPU'er
gir det følgende output:
A
Ferdig etter 6.22 sekunder
B
Ferdig etter 4.89 sekunder
C
Ferdig etter 3.97 sekunder

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

# Starter kjøring sum1.pl
run();
run();
# kjøring avsluttet
# Starter kjøring sum2.pl
$pid = fork();
if($pid == 0){
    run()
}
else{
    run();
}
# kjøring avsluttet
# Starter kjøring sum3.pl
$pid = fork();
if($pid == 0){
    run()
}
else{
    fork();
    run();
}
# kjøring avsluttet

Scriptene sum1.pl, sum2.pl og sum3.pl kjøres på hver av maskinen A, B og C og det gir de ni forskjellige output som vist under. Din oppgave er på grunnlag av den gitte informasjonen å avgjøre hvilke kombinasjoner av script og maskin som har gitt hvert resultat med en kort begrunnelse og forklaring av output til hver.

a) Ferdig etter 7.31 sekunder Ferdig etter 7.34 sekunder Ferdig etter 7.36 sekunder

b) Ferdig etter 4.84 sekunder Ferdig etter 9.67 sekunder

c) Ferdig etter 18.39 sekunder Ferdig etter 18.53 sekunder Ferdig etter 18.58 sekunder

d) Ferdig etter 3.98 sekunder Ferdig etter 7.94 sekunder

e) Ferdig etter 11.80 sekunder Ferdig etter 12.50 sekunder

f) Ferdig etter 5.02 sekunder Ferdig etter 5.03 sekunder

g) Ferdig etter 4.01 sekunder Ferdig etter 4.05 sekunder Ferdig etter 4.05 sekunder

h) Ferdig etter 4.08 sekunder Ferdig etter 4.18 sekunder

i) Ferdig etter 6.24 sekunder Ferdig etter 12.49 sekunder

Besvarelsen skal altså bestå av ni linjer eller avsnitt av typen:

output 1: sum1.pl kjørt på C. Fordi C har fire CPU'er vil.... etc.
Eksempelet er ikke riktig svar. Om du vil kan du gi en generell innledende forklaring slik at du ikke trenger å forklare så mye under hvert punkt.

Oppgave 4 - Scripting og internminne (30%)

a) Linux-kommandoen free viser hvor mye ledig minnet det er og output kan se slik ut:

$ free -m
             total       used       free     shared    buffers     cached
Mem:           398        386         12          0         25        100
-/+ buffers/cache:        260        138
Swap:          349         57        292
Her er buffers antall MBytes brukt til I/O buffere og cached antall MBytes brukt til disk-cache. Kjernen kan dynamisk minske sin bruk av I/O-buffere og disk-cache ved behov for minne til andre formål. Verdien 138 Mbytes i andre linje i free-kolonnen er free + buffers + cached fra første linje. Forklar kort hvorfor dette er et tall som viser hvor mye minne som er ledig for applikasjoner.

b) Skriv et Perl-script free.pl som fra output av kommandoen free -m skriver ut verdien som viser tilgjengelig minne for applikasjoner fra andre linje i free-kolonnen, tallet 138 i eksempelet i forrige delspørsmål.

c) Skriv et bash-script som starter 10 instanser av programmet xcal(en kalkulator). Etter at en instans av xcalc er startet skal scriptet vente i 10 sekunder og så skrive ut hvor mye av det frie applikasjonsminnet som har blitt brukt opp siden scriptet startet. Scriptet skal bruke perl-scriptet free.pl fra forrige delspørsmål til å finne tilgjengelig applikasjonsminne. Deretter skal det fortsette på samme måte til alle 10 instansene har startet. Til slutt skal det stoppe alle kjørende xcalc-prosesser. Kan resultatet fra en kjøring av dette scriptet si noe om hvorvidt programmet xcalc deler minne med andre xcalc prosesser?

d) I PowerShell gir ps | gm blant annet følgende

PM                         AliasProperty  PM = PagedMemorySize
WS                         AliasProperty  WS = WorkingSet
Skriv et PowerShell-script som legger sammen PagedMemorySize og WorkingSet for alle Windows-prosessene som kjører og skriver ut den totale summen for begge verdiene.

e) Når du kjører scriptet, får du følgende output som viser totalt antall bytes:

WS: 257339392
PM: 497008640
PagedMemorySize for en prosess er den delen av minnet til en prosess som er paged ut til disk (Windows page file). Hva er Working Set? Denne Windowsmaskinen har ca 360 MByte internminne. Sammenlign de totale summene WS og PM med størrelsen på totalt minne. Er det et problem om WS eller PM er større enn totalt minne?

Oppgave 5 - Perl sockets (15%)

a) Anta at du lager en Perl socket-server som lytter på port 9999. For hver gang det kommer en oppkobling leser serveren en linje fra socketen, sender linjen den mottok uendret tilbake og lukker oppkoblingen. Hvis du nå i en browser på en annen maskin skriver inn som URL:

http://host.domene:9999/uname
der host.domene er Linux-maskinen du kjører serveren på, vil output i browseren bli:
GET /uname HTTP/1.1
Ordet du skriver inn i browseren mottas altså av serveren og det serveren sender blir vist i browseren. Skriv en slik server slik at den gjør at du kan utføre Linux-kommandoer på Linux-maskinen Perl-serveren kjører på fra en hvilken som helst browser. For eksempel skal
http://host.domene:9999/ps
gi noe slik som
 PID TTY          TIME CMD
 1841 pts/1    00:00:33 firefox
 5042 pts/1    00:00:00 bash
11343 pts/1    00:00:00 s.pl

b) Når du eksperimenterer mer med den opprinnelige serveren finner du følgende:

http://host.domene:9999/ls -l   gir  GET /ls%20-l HTTP/1.1
http://host.domene:9999/"|>$<;'/   gir   GET /%22|%3E$%3C;%27/ HTTP/1.1
Bruk dette til å endre serveren slik at du også kan bruke mellomrom og de andre tegnene i kommandoene du sender fra browseren. Sørg i tillegg for at web-shellet får et passende prompt slik at
http://host.domene:9999/ls -l
gir
Webshell$ ls -l
totalt 120
-rw------- 1 haugerud syslog   249 2010-05-20 21:20 1cpu.txt
-rwx------ 1 haugerud syslog   333 2010-05-20 20:22 sum1.pl
-rwx------ 1 haugerud syslog   380 2010-05-20 20:22 sum2.pl
-rwx------ 1 haugerud syslog   400 2010-05-20 21:23 server.pl
i browseren. Klarer du med denne serveren fra browseren å skrive et script på Linux-serveren og kjøre det? Forklar kort.

c) Diskuter kort de sikkerhetsmessige aspektene ved dette webshellet. Implementer en metode i serveren som gjør at du må sende med et egetdefinert passord i URL'en i browseren for å få utført en kommando.

-SLUTT-



haugerud 2011-05-12