Løsningsforslag Eksamen høst 2006 Operativsystemer og UNIX(LO141A)
NB! Tekstens apostrofer: ` er en liten \ mens ' er en liten /

Oppgave 1

a) pwd

b) pwd=`pwd`

c) regn > res.txt 2> /dev/null

d) Brukeren haugerud og alle brukere som tilhører gruppen drift.

e) uniq -c test

f) cat */* >> /tmp/alle.txt

g) echo "Hei, ja og Hallo dere..." | tr -cs A-Za-z '\n' | tr A-Z a-z

h) cat /tmp/alle.txt | tr -cs A-Za-z '\n' | tr A-Z a-z | sort | uniq -c | sort -rn | head -n 5

i) uniq -t: -D -W 1 pass

j) uniq -t: -D -W 1 -f 2 pass

Oppgave 2

#! /bin/bash

passwd=/etc/passwd
echo "Scriptet kjører på `hostname`"
echo "OS: `uname`"
if [ ! -f $passwd ]
then
    echo "Passordfilen finnes ikke!"
    exit
fi
if [ ! -r $passwd ]
then
    echo "Passordfilen er ikke lesbar !"
    exit
fi
ls -l $passwd
echo "Antall brukere `wc -l $passwd`"
echo
# root:x:0:0:root:/root:/bin/bash
IFS=:
cat $passwd |
while read user x uid gid fnavn home shell
do
   if [ "$uid" -eq 0 ]
   then
        echo "$user ($fnavn) har uid = 0"
   fi
done

echo
echo "Flere tilfeller av samme brukernavn:"
sort $passwd | uniq -t: -W 1 -D

echo
echo "Flere tilfeller av samme UID:"
sort -n -t: -k3 $passwd  | uniq -t: -f 2 -W 1 -D

Oppgave 3

a) Den virtuelle maskinen som kjører trådene (JVM) overlater til det underliggende operativsystemet å kjøre dem samtidig. Dermed vil hver tråd scheduleres som en selvstendig enhet og inngå i operativsystemets Round Robin kø og dermed tildeles biter av CPU tid sammen med alle andre kjørende prosesser og tråder på systemet. Enkelte (og typisk eldre) versjoner av JVM, schedulerer trådene selv, og da betrakter OS disse som en prosess.

b) Den vesentligste fordelen er at trådene kan fordeles på maskinens CPU'er og dermed virkelig kjøre samtidig. Applikasjonen kan dermed utføre sine oppgavre vesentlig raskere en en single threaded applikasjon som vil måtte klare seg med den ene CPU'en den blir tildelt.

c) Hvis begge prosessene er 100% CPU intensive og til enhver tid utnytter alt de kan av CPU-tid, vil tiden som går med til context switching være ren overhead. Det ville da gått fortere å kjøre en prosess av gangen, siden man ville tjent inn tiden som går med til context switching.

d) Arrayet Sum er en lokal variabel for hver tråd og bruken av den gir ingen grunn til serialisering. Arrayet total er derimot felles for de to trådene. Instruksjonen som øker verdien av total[0] består av flere bytekode instruksjoner og en context switch under utførelsen av disse kan føre til overskriving av data. Dermed må trådene serialiseres med hensyn på dette og det kan gjøres ved hjelp av synchronized:

synchronized(total) {total[0] += 1.0;}
Et alternativ er å implementere egne mutex algoritmer.

e) Metoden vil aldri virke fordi lockfile lages først og dermed vil prosessen alltid bli stående i en evig løkke. Om man utførte while-løkken først, ville det gitt en god, men ikke perfekt beskyttelse.

f) En semafor S initialiseres til 1 og hver gang en prosesse eller tråd skal inn i kritisk avsnitt, må den kalle wait(). Da minkes S med 1. Hvis S blir 0 kan prosessen gå rett inn i kritsik avsnitt. Hvis den blir 0 eller mindre betyr det at en annen prosess allerede er i kritisk avsnitt og OS tar da prosessen ut av Ready list. Den får da ikke fortsette før alle foran i køen er ferdig, noe de signaliserer ved å kalle signal() som øker S med 1.

g) 1, 0 og negative heltall.

h) Siden S først minskes med en før det testes om tråden kan fortsette, vil ikke flere tråder kunne gå inn i kritisk avsnitt samtidig. Men hvis S er 1 og en context switch skjer rett etter S--, vil en annen tråd kunne senke S til -1 og bli lagt i kø. Når det switches tilbake til den første tråden, vil S være mindre enn 0 og også den legges i kø. Og der vil begge bli liggende.

i) Med mindre det er mer enn 5 andre prosesser foran i køen, vil den vinne kappløpet og gå inn i kritisk avsnitt. Men det er temmelig meningsløst; den kan jo uansett velge å la være å bruke semaforsystemet og gå rett inn i kritisk avsnitt. Det eneste den oppnår i tillegg er å ødelegge systemet for andre prosesser også. Semaforer er et tilbud som gjør det mulig for prosesser å samarbeide, men ikke nødvendigvis tvinger dem til det.

Oppgave 4

a)

b)

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

while ($newsocket = $socket->accept())
  {
    $string = <$newsocket>;
    $string =~ /GET \/(.*?) HTTP/;
    $match = $1;
    open(DICT,"/usr/share/dict/bokmal");
    while($line = <DICT>)
      {
        print $newsocket $line if($line =~ /^$match$/);
      }
    close($newsocket);
  }

c)




Hårek Haugerud 2006-11-29