Eksamen høst 2006 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. Oppgavene vil ikke bli vektlagt likt ved sensur. En sannsynlig fordeling er at oppgave 1 teller 20%, oppgave 2 teller 20%, oppgave 3 teller 25% og oppgave 4 teller 35%. De som ønsker det kan besvare oppgavene eller deler av oppgavene på engelsk. Sett gjerne egne forutsetninger dersom du synes oppgaveteksten er uklar. Beskriv forutsetningene og løs oppgaven utifra dem.

Oppgave 1

I denne oppgaven skal du i delspørsmålene der du blir bedt om å gi en kommando, angi en kommando på en linje, slik du ville ha tastet den inn til bash på en Linux-maskin fra tastaturet (du svarer for eksempel mkdir kat hvis du blir spurt: Opprett en katalog med navn kat).

a) Gi en kommando som gir hvilken katalog du står i.

b) Gi en kommando som legger navnet på katalogen du står i inn i variabelen $pwd.

c) Gi en kommando som sender output fra programmet regn til filen res.txt og som dropper alle feilmeldinger.

d) Hvilke brukere kan lese innholdet av filen /tmp/secret.txt?

-rw-r-----  1 haugerud drift 9 Sep  5 15:53 /tmp/secret.txt

Studer manualsiden for kommandoen uniq:

NAME
       uniq - remove duplicate lines from a sorted file
SYNOPSIS
       uniq [OPTION]... [INPUT [OUTPUT]]
DESCRIPTION
       Discard all but one of successive identical lines from INPUT (or 
       standard input), writing to OUTPUT (or standard output).

       -c, --count
              prefix lines by the number of occurrences
       -d, --repeated
              only print duplicate lines
       -D, --all-repeated 
              only print all duplicate lines
       -f, --skip-fields=N
              avoid comparing the first N fields
       -t, --separator=SEP
              use SEParator to delimit fields
       -u, --unique
              only print unique lines
       -W, --check-fields=N
              compare no more than N fields in lines

e) Gitt at du har følgende sorterte fil med navn test

en
to
to
Angi hvordan du kan bruke uniq med opsjoner på filen test slik at output blir
      1 en
      2 to

f) Anta du står i en katalog med fire underkataloger som inneholder tekstversjonen av alle Shakespeares verker og som ser slik ut når du lister dem:

$ ls -l
totalt 4
drwx------  2 haugerud drift 512 2006-11-21 15:32 comedies
drwx------  2 haugerud drift 512 2006-11-21 15:32 histories
drwx------  2 haugerud drift 512 2006-11-21 15:32 poetry
drwx------  2 haugerud drift 512 2006-11-21 15:32 tragedies
$ ls -l poetry/
totalt 265
-rw-------  1 haugerud drift 14366 1992-08-29 07:45 loverscomplaint
-rw-------  1 haugerud drift 84700 1992-08-29 07:46 rapeoflucrece
-rw-------  1 haugerud drift 95662 1992-08-29 07:43 sonnets
-rw-------  1 haugerud drift 18954 1992-08-29 07:46 various
-rw-------  1 haugerud drift 54390 1992-08-29 07:46 venusandadonis
Tilsvarende inneholder de tre andre uderkatalogene tekstfiler med de andre verkene. Gi en Linux-kommando som legger alle disse tekstfilene etter hverandre i samme tekstfil med navn /tmp/alle.txt.

g) Linux-kommandoen tr leser fra standard input og kan brukes til å skifte ut tegn i tekster. Følgende kommando bytter ut alle sekvenser av tegn som ikke er bokstaver med ett linjeskift:

$ echo "Hei, ja    og Hallo dere..." | tr -cs A-Za-z '\n'
Hei
ja
og
Hallo
dere
Dermed overføres en setning til ord fordelt linje for linje. Kommandoen tr kan også brukes til å bytte store bokstaver med små
$ echo "HEisaNN" | tr A-Z a-z
heisann
Lag en sammensatt kommando som gjør begge deler ved å fylle inn det som mangler i kommandoen nedenfor og slik at resultatet blir som angitt:
$ echo "Hei, ja    og Hallo dere..." | ANGI DIN KOMMANDO
hei
ja
og
hallo
dere

h) Bruk det du lærte fra forrige deloppgave (g) og filen /tmp/alle.txt fra deloppgaven (f) til å lage en enlinjers Linux-kommando som lager en liste over de 5 ordene som Shakespeare brukte mest når han skrev sine verker. Output fra kommandoen skal være på formen

  29854 the
  27554 and
  23357 i
  21075 to
  18520 of
eller ihvertfall inneholde samme informasjon. Resultatet betyr at Shakespeare brukte ordet "the" 29854 ganger og "and" 27554 ganger.

i) Gitt at du har følgende sorterte fil med navn pass

ord1:x:3:etter
ord2:x:3:av
root:x:4:nei
root:x:5:ikke
ulik:x:1:resten

Bruk uniq med opsjoner på filen pass slik at output blir

root:x:4:nei
root:x:5:ikke

j) Bruk uniq med opsjoner på filen pass slik at output blir

ord1:x:3:etter
ord2:x:3:av

Oppgave 2

Brukerne på en Unix-maskin er vanligvis definert i filen /etc/passwd. Starten på denne filen kan se ut som følger

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ftp:x:99:99:Anonymous FTP:/local/iu/ftp:/bin/sync
snort:x:10004:1005:Snort IDS:/var/log/snort:/bin/false
nobody4:x:65534:65534:SunOS 4.x Nobody:/:/bin/sync
mroot:x:0:0:Tcsh Root account:/local/iu:/bin/bash
studwww:x:24:24:web server daemon:/:/bin/bash
snort:x:10044:1005:Snort IDS:/var/log/snort:/bin/false
Skriv et bash-script med navn check.bash som kontroller /etc/passwd og melder ifra om følgende: Du kan få bruk for at sort -n -t: -k3 /etc/passwd sorterer passordfilen numerisk med hensyn på 3. kolonne, UID. Anvendt på passordfilen over skal scriptet gi tilsvarende:
$ check.bash
Scriptet kjører på rex
OS: Linux
-rw-r--r--  1 root root 140317 Nov 20 15:02 /etc/passwd
Antall brukere 2100 /etc/passwd

root (root) har uid = 0
mroot (Tcsh Root account) har uid = 0

Flere tilfeller av samme brukernavn:
snort:x:10004:1005:Snort IDS:/var/log/snort:/bin/false
snort:x:10044:1005:Snort IDS:/var/log/snort:/bin/false

Flere tilfeller av samme UID:
mroot:x:0:0:Tcsh Root account:/local/iu:/bin/bash
root:x:0:0:root:/root:/bin/bash
nobody4:x:65534:65534:SunOS 4.x Nobody:/:/bin/sync
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh

Oppgave 3

a) Forklar kort hvordan to Java-tråder som kjører på en Linux eller Windows-PC med én CPU multithreades eller kjøres samtidig.

b) Forklar kort hva som er fordelen med en applikasjon med flere tråder som kjører på en maskin med flere enn én CPU, sammenlignet med en tradisjonell applikasjon med bare en tråd. Ta ikke med i betraktningen fordeler som er like relevante om de kjørte på en maskin med bare én CPU.

c) En maskin med én CPU skal kjøre to prosesser. Vil alltid multitasking være raskere når man tenker på den total tiden som går før begge prosesser er ferdig, eller kan det tenkes noe tilfelle der singletasking ville vært raskere? Ved først å la den ene prosessen kjøre ferdig og så den andre. Forklar kort.

d) I en Java-tråd er følgende variabler deklarert:

 float sum[] = new float[2];
 public static float total[] = new float[2];
og de brukes i trådens run-metode slik
 total[0] += 1.0;
 sum[0] += 1.0;
Hvis to slike tråder kjører samtidig, er det noen grunn til å serialisere trådene og hvordan kan det isåfall gjøres. Forklar kort.

e) Anta at et Perl-program som kan startes fra web bruker følgende metode for å unngå at to brukere skriver samtidig til en fil:

`touch /tmp/lockfile`;   # Lager /tmp/lockfile
while(-f /tmp/lockfile) {}
# skriver til en felles fil
`rm /tmp/lockfile`;      # Fjerner /tmp/lockfile
Vil denne metoden alltid virke? Forklar kort.

f) Forklar kort hvordan semaforer implementert i OS hindrer at flere enn en prosess eller tråd er inne i kritisk avsnitt samtidig.

g) Hvilke numeriske verdier vil en semafor S initialisert til 1 kunne ha under normal bruk?

h) I din egen Java-applikasjon med flere tråder, implementerer du en semafor med metoden

public void wait(){ 
   S--;
   if ( S < 0 ){
      // Setter tråden til å vente i en kø
}
og en signal() metode som øker den felles variabelen S og eventuelt tar tråden ut av køen. Hvis trådene dine bruker wait() og signal() riktig, vil dette alltid hindre at trådene ikke går inn i kritisk avsnitt samtidig når du kjører på et multitasking OS? Vil systemet alltid virke slik du ønsker? Forklar kort.

i) Anta at en prosess bestemmer seg for å vinne kappløpet om en felles ressurs og kaller signal(S) fem ganger før den går inn i kritisk avsnitt med wait(S). Klarer den å vinne kappløpet? Diskuter kort om denne strategien er fornuftig for prosessen.

Oppgave 4

a) Du er lei av å få spørsmål fra kryssord av typen "Vet du om et dyr på 5 bokstaver som begynner på ti og slutter på r?" fra din svigermor. Derfor vil du skrive et lite Perl-program kryss.pl som slår opp i tekstfilen /usr/share/dict/bokmal. Denne filen inneholder 545665 norske ord som er alfabetisk sortert og har ett ord på hver linje. Skriv dette Perl-programmet slik at mønsteret for det ukjente ordet gis som argument til programmet med punktum '.' for å angi de ukjente bokstavene. Det skal i bruk se slik ut:

$ kryss.pl ti..r
tider
tiger
timer
tiner
Hvis programmet ikke gis nøyaktig ett argument, skal det avsluttes med en passende feilmelding.

b) På linuxmaskinen rex.iu.hio.no starter du følgende Perl-server og lar den stå og kjøre:

#! /usr/bin/perl
use IO::Socket::INET;
$socket = IO::Socket::INET->new(LocalPort=>9449,Listen=>5);

while ($newsocket = $socket->accept())
  {
    $string = <$newsocket>;
    print $newsocket "Mottok $string";
    close($newsocket);
  }
Du eksperimenterer litt med serveren og prøver å skrive inn et par URL'er i en browser på en annen maskin. Dette gir følgende:

URL skrevet i browser Output i browser-vindu
http://rex.iu.hio.no:9449/noetekst Mottok GET /noetekst HTTP/1.1
http://rex.iu.hio.no:9449/..et..s. Mottok GET /..et..s. HTTP/1.1

Bruk dette og koden du skrev i forrige deloppgave til å lage en kryssordserver som kan brukes fra hvilken som helst browser og som eksempelvis gir

URL skrevet i browser Output i browser-vindu
http://rex.iu.hio.no:9449/n.t..g nattog
  nyting
  nyttig

helt tilsvarende Perl-programmet i forrige deloppgave (bare send vanlig tekst til browseren, du trenger ikke sende HTML, det virker likevel).

c) Utvid programmet kryss.pl i deloppgave a) til å kunne lete etter alle muligheter i to ord som krysser hverandre og hvor den felles bokstaven er ukjent og kalles X, slik som på figuren.

Figure: Kryssord med ukjent bokstav X
\includegraphics[width=4cm]{x.eps}
Ved kjøring av programmet finnX.pl for å finne mulige ord for problemet i figuren, kan de to ukjente ordene angis som to argumenter og output se slik ut:
$finnX.pl m..X.n .lX..l

Match for bokstav X=y
menyen
flydel flygel

Match for bokstav X=u
misunn
plural

Match for bokstav X=o
masomn masovn moloen moroen
flomål floral global
Du trenger ikke å kontrollere antall argumenter.

-SLUTT-



Hårek Haugerud 2006-11-28