Eksamen høst 2004 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 10%, oppgave 2 teller 30%, oppgave 3 teller 20% og oppgave 4 teller 40%. 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 antas det at man kjører bash på en Linux-maskin.

a) Gi en kommando som flytter filen /tmp/fil.txt til katalogen du står i

b) Gi en kommando som gir antall linjer i filen /etc/group

c) Gitt følgende

cube$ cat IQ.txt
134 toreo
78 haugerud
120 sigmunds
112 mark
cube$ sort IQ.txt | head -n 2
Hva blir output fra sort-kommandoen?

d) Forklar kort feilmeldingen fra kommandoen cp:

$ whoami
hh
$ ls -l
d--x------    2 hh       hh           4096 Nov 28 12:16 dir
-rw-r--r--    1 hh       hh              0 Nov 28 12:16 fil
$ cp fil dir
cp: cannot create regular file `dir/fil': Permission denied

e) Kommandosekvensen fortsettes med

$ chmod 200 dir
$ ls -l
d-w-------    2 hh       hh           4096 Nov 28 12:16 dir
-rw-r--r--    1 hh       hh              0 Nov 28 12:16 fil
$ cp fil dir
cp: cannot stat `dir/fil': Permission denied
Forklar kort feilmeldingen fra kommandoen cp.

f) I fortsettelsen av eksempelet i forrige deloppgave, gi en kommando som setter det minmum av rettigheter katalogen dir må ha for at cp fil dir skal kunne utføres uten feilmeldinger.

g) Studer følgende eksempel:

$ ls -l
drwx------    2 hh       hh           4096 Nov 28 12:24 dir
-rw-r--r--    1 hh       hh              0 Nov 28 12:16 fil
-rw-r--r--    1 hh       hh              0 Nov 28 13:01 fil.txt
$ cp fil dir
$ cp -p fil.txt dir
$ ls -l dir
-rw-r--r--    1 hh       hh              0 Nov 28 13:03 fil
-rw-r--r--    1 hh       hh              0 Nov 28 13:01 fil.txt
Forklar ut fra dette kort hva som er forskjellen på kommandoene cp og cp -p.

Oppgave 2

Det er lurt å gjøre de 4 siste deloppgavene i oppgave 1 før du gjør denne oppgaven. Ofte er det nyttig å ta vare på eldre versjoner av filer, for eksempel et program under utvikling eller loggfiler. Men om man ikke fjerner de eldste versjonene, kan man risikere at disken fylles opp. I denne oppgaven skal du lage et bash-script med navn rotate som skal kopiere en fil (gitt som argument 1) til en katalog (gitt som argument 2). Hvis det fra før ligger en fil med samme navn i denne katalogen (en tidligere versjon) skal det lages en kopi av denne filen med versjonsnummer 1 og eventuelle andre versjoner roteres slik at alle får et høyere versjonsnummer. Inntil 10 gamle versjoner av filen skal lagres. Noen eksempler viser best hvordan scriptet skal virke om man utfører

$ rotate fil.txt dir

Følgende finnes i dir Etter rotate skal følgende finnes
Ingen fil med navn fil.txt fil.txt
fil.txt fil.txt (ny) og fil.txt.1 (het før fil.txt)
fil.txt, fil.txt.1 fil.txt (ny) og fil.txt.1 (før fil.txt), fil.txt.2 (før fil.txt.1)
fil.txt, fil.txt.1, fil.txt.2 fil.txt, fil.txt.1, fil.txt.2, fil.txt.3
fil.txt, fil.txt.1, ... ,fil.txt.9 fil.txt, fil.txt.1, ...,fil.txt.10
fil.txt, fil.txt.1, ... ,fil.txt.10 fil.txt, fil.txt.1, ...,fil.txt.10



I det siste eksempelet skal fil.txt.10 ikke bevares, slik at det maksimalt skal lagres 10 gamle versjoner. Filen som angis i første argument kan være gitt med en path før filnavnet som i

$ rotate /tmp/fil.txt dir
Scriptet skal avlutte med en passende feilmelding hvis

Oppgave 3

a) En av fordelene med de nye 64-bits x64 prosessorene og Itanium er at de kan adressere mer RAM. Hvor mange byte internminne kan man maksimalt adressere med et 32-bits adresseregister som de fleste av dagens 32-bits prosessorer har?

b) Du kjører Jbuilder og et par andre programmer som krever mye internminne. Når du bruker disse programmene kjører de etterhvert veldig sakte og du hører at harddisken brukes hele tidene, selvom programmene ikke lagrer eller leser filer. Hva kan dette skyldes? Forklar kort.

c) Anta at du skal lage et CPU-intensivt program som skal utføre en stor matematisk beregning. Du vurderer å bruke språkene bash, C++, Java og Perl. Ranger antatt hastighet for disse programmene fra 1 til 4 med 1 som hurtigste og 4 som sakteste.

d) Anta at du har en Linux og en Windows maskin som kjøer på samme type x86-hardware og en Sun Solaris-maskin som kjører på sparc. Alle har installert Java. I følgende tabell er det et kryss i første rute fordi et Java-program kompilert på Windows-maskinen kan kjøres på Windowsmaskinen. Fyll ut tilsvarende der du mener det skal være kryss.

Java-program kompilert på Windows Linux Solaris
Kjører på Windows X    
Kjører på Linux      
Kjører på Solaris      

e) Anta samme maskiner som i forrige deloppgave, men nå har alle en C-kompilator. Siden et C-program som er kompilert på Windows-maskinen vil kjøre på Windows-maskinen, er det fylt ut et kryss i første rute. Fyll ut tilsvarende der du mener det skal være kryss.

C-program kompilert på Windows Linux Solaris
Kjører på Windows X    
Kjører på Linux      
Kjører på Solaris      

f) Et brukerprogram kjører under et multitasking OS på en maskin med bare en CPU. I maskinkoden til programmet er det en evig løkke som gjør at den samme koden kjøres om og om igjen. Hvordan sørger OS for at andre prosesser slipper til i CPU-løkken? Forklar kort.

g) Når et brukerprogram skal lese en fil, må modusbit switches til superusermodus for at kjernekode skal utføres. Anta at dette ble gjort med følgende maskin-instruksjoner i brukerprogrammet:

switchToSuperuserModus
JMP readfile
hvor det i den andre instruksjonen hoppes til kjernekoden. Hva er problemet med denne løsningen og hvordan løses det i moderene OS? Forklar kort.

Oppgave 4

a) Lag en Perl subrutine addLine() som tar to argumenter. Det første er et filnavn og det andre er en tekststreng. Subrutinene skal åpne filen, legge til tekststrengen på slutten av filen og lukke filen igjen. Hvis det ikke lykkes å åpne filen for skriving, skal den skrive ut en feilmelding om det til STDERR. Du skal bruke use strict;.

b) I denne deloppgaven skal du skrive klient-delen av et Perl chat-program som skal kunne brukes mellom to vilkårlige Unix-maskiner på Internett. Koden for server-delen heter server og ser slik ut:

#! /bin/perl
use strict;
use IO::Socket::INET;

my $serverPort = 9002;
my $socket = IO::Socket::INET->new(LocalPort => $serverPort,
                                Reuse     => 1,           
                                Listen    => 5)
   or die "Kan ikke starte chat-server på port $serverPort!\n";

while (my $socketConnection = $socket->accept())
{
    while(my $line = <$socketConnection>)
    {
        addLine("/tmp/chat",$line);
    }
    $socketConnection->close();
}
Koden for subrutinen addLine() er den fra oppgave a) og er tenkt inkludert til slutt i server. Begge de to maskinene det skal chattes mellom skal kjøre en slik server. En typisk chat mellom brukeren haugerud på host rex og brukeren os på host cube kan se slik ut for haugerudrex:
rex$ ./server&
rex$ ./client cube
haugerud@rex> Hei!
haugerud@rex> Er du der?
haugerud@rex> OK. Jeg må stikke.
haugerud@rex> Med quit
haugerud@rex>     quit
rex$
og for os på host cube:
cube$ ./server&
cube$ ./client rex
os@cube> Jada...
os@cube> Greit, hvordan avslutter man?
os@cube> OK
os@cube> quit
cube$
Begge vil når de starter client få opp et xterm-vindu som fortløpende viser det som begge taster inn slik:
haugerud@rex> Hei!
haugerud@rex> Er du der?
os@cube> Jada...
haugerud@rex> OK. Jeg må stikke.
os@cube> Greit, hvordan avslutter man?
haugerud@rex>  Med quit
os@cube> OK
Dette skal gjennomføres ved at programmet client (som du skal skrive) åpner en socket på port 9002 til serveren. Navnet på serveren som client skal koble seg til skal bli gitt som første argument. Deretter sender client hver linje som brukeren taster inn over denne socketen til server. I tillegg skriver client hver linje til filen /tmp/chat med subrutinen addLine() fra oppgave a). Ikke skriv inn addLine() på nytt. Dette gjør at filen /tmp/chat på begge serverene vil fylles opp med alle linjene som de to brukerene taster inn. De to chat'erne ser alt som skrives inn ved å kjøre kommandoen
tail -f /tmp/chat
i et terminalvindu. Da vises linje for linje av det som legges til filen /tmp/chat. Scriptet client skal sørge for følgende:

-SLUTT-



Hårek Haugerud 2004-12-14