`
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)