Løsningsforslag til eksamen våren 2003 Operativsystemer og UNIX
OBS! Ikke korrekturlest; muligheten for trykkfeil er foreløpig stor......

Oppgave 1

a) cp /tmp/scan.pl .

b) chmod 751 scan.pl

c) 3, 5 og 6

d)

tar xfz luckroot.tgz # pakker ut filen luckroot.tgz som er et gzip'et tar-arkiv 
                     # med kommandoen tar. x = extract, f = file, z = gunzip
cd luckroot          # Går til katalogen luckroot som tar lagde
./luckgo 	     # Kjører programmet luckgo som tar la i denne katalogen

Oppgave 2

#! /bin/bash

if [ $# -ne 1 ]
then
   echo "Syntaks: $0 portnummer" # Eller portnavn.bash istedetfor $0
   exit
fi
port=$1

while read navn portProto rest
do
   if [ "$portProto" == "$port/tcp" ]
   then
       echo "TCP-tjenesten $navn er på port $port";
       exit 
   fi
done < /etc/services

lynx -source http://www.iana.org/assignments/port-numbers | 
while read navn portProto rest
do
     if [ "$portProto" == "$port/tcp" ]
     then
         echo "IANA: TCP-tjenesten $navn er på port $port";
         break
     fi
done

Oppgave 3

a) (Time, finished, Proc nr, etc. ikke viktig)

Time 1 Proc 1 print 1
Time 2 Proc 2 start 1
Time 3 Proc 2 print 2
Time 4 Proc 1 echo 2
Time 5 Proc 2 exit 3
finished Proc 2 Time 5 CPUtime 3
Time 6 Proc 1 end 3
finished Proc 1 Time 6 CPUtime 3

b) Det finnes flere mulige resultater, avhengig av hvor i readylist en ny prosess legges:

Ny prosess sist i ready-list:
Time 1 Proc 1 print 1
Time 2 Proc 2 fork 1
Time 3 Proc 1 echo 2
Time 4 Proc 3 fork 2
Time 5 Proc 2 fork 2
Time 6 Proc 1 end 3
Time 7 Proc 4 exit 3
Time 8 Proc 3 exit 3
Time 9 Proc 5 exit 3
Time 10 Proc 2 exit 3
Ny prosess først i ready-list:
Time 1 Proc 1 print 1
Time 2 Proc 2 fork 1
Time 3 Proc 3 fork 2
Time 4 Proc 4 exit 3
Time 5 Proc 1 echo 2
Time 6 Proc 2 fork 2
Time 7 Proc 5 exit 3
Time 8 Proc 3 exit 3
Time 9 Proc 1 end 3
Time 10 Proc 2 exit 3
Ready-list sortert etter Proc-nummer:
Time 1 Proc 1 print 1
Time 2 Proc 2 fork 1
Time 3 Proc 3 fork 2
Time 4 Proc 4 exit 3
Time 5 Proc 1 echo 2
Time 6 Proc 2 fork 2
Time 7 Proc 3 exit 3
Time 8 Proc 5 exit 3
Time 9 Proc 1 end 3
Time 10 Proc 2 exit 3

c)

Time 1 Proc 1 wait 1
Time 2 Proc 2 add 1
Time 3 Proc 1 critical 2
Time 4 Proc 2 wait 1
Time 5 Proc 1 critical 3
Time 6 Proc 1 signal 1
Time 7 Proc 2 crit 3
Time 8 Proc 1 stop 5
Time 9 Proc 2 crit 4
Time 10 Proc 2 signal 1
Time 11 Proc 2 exit 5

d) At en prosess venter i en while-løkke til en annen prosess er ferdig med et kritisk avsnitt. Prosessen vil da bruke CPU til å sjekke om og om igjen om ressursen den ønsker er ferdig og dermed sløse bort mye CPU-tid.

e) Kode som må fullføres av prosessen som utfører den uten at andre prosesser bruker samme felles ressurs.

f) Hvis filen /tmp/lockfile eksisterer betyr det at en annen prosess skriver til den felles filen og prosessen som ønsker å skrive står og venter helt til den andre prosessen er ferdig og sletter /tmp/lockfile. Da oppretter den ventende prosessen filen på nytt for å sikre at ingen andre får tilgang.

Anta at en context switch skjer etter while-løkken er passert og rett før /tmp/lockfile lages. Hvis en annen prosess da kjører denne koden vil den også passer while-løkken og begge skrive samtidig. Men det vil skje veldig sjelden og metoden gir i praksis en brukbar beskyttelse og mye bedre enn om man overser problemet.

g) Algoritmene sørger for at mutual exclusion blir oppfylt, det er ikke mulig for noen av prosessene å komme samtidig inn i kritisk avsnitt, for prosessene har vært sitt flagg som den andre sjekker om er satt før den går inn i kritisk avsnitt. Men en context switch etter

flag[t] = true;
for en prosess blir fatalt hvis den andre prosessen da prøver å gå inn i kritisk avsnitt og også utfører
flag[t] = true;
for begge flaggene blir true og begge prosessene blir stående og spinne i while-løkken til evig tid......

Oppgave 4

a)

sub erTall()
{
    if($_[0] =~ /^\d+$/)
    {
        if($_[0] > $_[1] and $_[0] < $_[2])
        {
            return("OK");
        }
    }
    return();
}

b)

sub portOK()
{
    $max = 65536;
    ($portA,$portB) = split("-",$_[0]);
    if( erTall("$portA","0","$max") and erTall("$portB","0","$max") and $portB >= $portA)
    {
        return($portA,$portB);
    }
    return(0,0);
}

c)

sub IPOK()
{
    $max = 256;
    ($A,$B,$C,$D) = split('\.',$_[0]);
    if(erTall($A,-1,$max) and erTall($B,-1,$max) and erTall($C,-1,$max) and erTall($D,-1,$max))
    {
        return("OK");
    }
    return();
}

Oppgave 5

#! /bin/perl

use IO::Socket::INET;
if($#ARGV != 1)
{
    die("Syntaks: scan IP minport-maxport\n");
}

$host = $ARGV[0];
if(! IPOK($host))
{
    die("IP-adressn $host er ikke gyldig\n");
}

($portMin,$portMaks) = portOK($ARGV[1]);
if($portMin == 0)
{
    die("Port-angivelsen $ARGV[1] er ikke gyldig\n");
}

for($port = $portMin; $port <= $portMaks; $port++)
{
    if($socket = IO::Socket::INET->new(PeerAddr => $host,PeerPort => $port))
    {
        $info = `s.bash $port`;
        chomp($info);
        print "$info og er åpen for tilkobling\n";
        close($socket);
    }
    else
    {
       $closed++;
    }
}
print "Det var $closed porter som var lukket\n\n.";



Hårek Haugerud 2003-02-21