I datamaskin-simuleringen skal du få maskinen til å kjøre et lite program. Når en slik kjøring utføres har man oversikt over hver eneste lille komponent som bidrar til at programmet utfører nøyaktig de operasjonene som må til for å få ut riktig resultat.
I obligatoriske oppgaver som kan løses med en enlinjes kommando
er det nok at du skriver inn bare den linjen i rapporten.
- (Oblig)
Last ned filen
latch2.dwm
Hva slags logisk krets er dette(dvs. hva kan denne kretsen brukes til)? Hvilken funksjon har de to input'ene A og B? Forklar og test at forklaringen er riktig ved å velge de fire mulige kombinasjonene av input. (Noen ganger får man en "race condition" i simulatoren. Det er tilfeller hvor det har betydning hviklet signal som kommer først frem og dette bør generelt unngås. Men se bort fra dette i denne oppgaven)
- (Oblig)
Last ned filen
4bitALUtest.dwm
, åpne den og bruk den til å teste ALU'en som er den samme som brukes i den binære datamaskinen i senere oppgaver.
Gå til Uke 10 i menyen til venstre på siden
datamaskinarkitektur
og se på den nederste tabellen. Den viser hva input må være for å kunne få ALU'en til å utføre bestemte operasjoner.
Bruk denne informasjonen til å få ALU'en til å gjøre regnestykket 3 + 4 = 7 og til å øke verdien av A med en.
-
Last ned filen
4bit.dwm
som inneholder et 4-bits register.
Ta utgangspunkt i ALU-test filen over og delete de fire output-LED-lysene. Koble istedet output til et register
ved å legge inn makroen 4bit.dwm du nettop lastet ned ved å bruke "embed macro" knappen fra menyen.
Hva må de relevante input-bit'ene være satt til for å utføre 2+2=4 og lagre resultatet i registeret?
Hvilken funksjon har klokken når denne operasjonen utføres?
- (Oblig)
Last ned filen
machine.dwm
som er en simulering av en 4-bits datamaskin og åpne den i Digital Works.
Høyreklikk på boksene som utgjør denne maskinen, velg "Edit Macro" og prøv å lokalisere ALU. Hva er ALU og hva er dens funksjon?
- (Oblig)
Maskinen som simuleres er en liten CPU som kan kjøre programmer som ligger i boksen merket ROM. Høyreklikk på boksen og velg "Edit Memory Contents". Dette er maskininstruksjonene i programmet fra forelesningen som er en liten for-løkke. Kjør programmet ved å klikke deg igjennom med Step-knappen eller ved å trykke på play. Følg med i ROM og se hvordan instruksjonene blir utført en for en. Hva blir resultatet av beregningen og hvor ligger dette resultatet når beregningen er ferdig?
-
I forelesningsnotatene står det at i den simulerte datamaskinen er det "gjort visse endringer i forhold til von Neumann arkitekturen". Les forelesningsnotater eller let på nettet og finn ut hva som er den viktigste forskjellen på von Neuman arkitekturen og Harvard arkitekturen. Hvilken arkitektur ligner den simulerte datamaskinen mest på?
- (Oblig)
Ta utgangspunkt i DigitalWorks simuleringen av en datamaskin fra forelsningen og endre maskinkoden i ROM slik at løkken gjennomløpes bare to ganger og hvor S økes med to og ikke i, det vil si utfører maskinkode som er den kompilerte versjonen av følgende høynivåkode:
S = 0;
for(i=1;i < 3;i++)
{
S = S + 2;
}
(NB! Når du har endret på bit'ene i en maskininstruksjon i ROM, pass på å flytte deg med piltastene ned til neste instruksjon, ellers vil ikke endringen lagres.)
Hva blir da resultatet og hvor er det lagret etter kjøringen? Hva er sluttverdien til de fire registerne R0, R1, R2 og R3 etter kjøringen?
-
Anta at Digital Works maskinen har en klokkefrekvens på 1GHz. En klokkesyklus utgjøres av to klikk på step-knappen(tiden det tar å utføre en instruksjon). Hvor lang tid bruker da CPU'en på å utføre den opprinnelige beregningen(3 runder i for-løkken)?
-
Ukens ALU-utfordring nr. 1
Prøv å endre maskinkoden slik at den går i en evig løkke der telleren R2 går opp til maks (15) og så fortsetter å telle videre fra null igjen.
-
Ukens ALU-utfordring nr. 2
Skriv maskinkode som tilsvarer høynivåkoden
if(R0 != R1){
R2 += R3;
}
else {
R3 += R2;
}
Du trenger ikke å bevare verdiene av R0 og R1, men etter testen skal R2 og R3 har riktig verdi og programmet skal
kunne kjøre videre med eventuell kode som kommer etter denne testen. Test at programmet virker med
forskjellige og like verdier for R0 og R1.
-
Ukens tøffeste ALU-utfordring
Skriv maskinkode som genererer Fibonacci-rekken 1, 1, 2, 3, 5, 8, 13, der tallene vises fortløpende i to registere, for eksempel R0 og R1. Hvorfor må rekken stoppe her?
-
Gi en Linux-kommando som gir deg brukernavnet ditt.
-
Gi en Linux-kommando som viser host-navnet på maskinen du sitter på.
- (Oblig)
Gi en Linux-kommando som finner ut hvilket operativsystem maskinen din kjører og hvilken versjon det er.
-
Bruk grep på data2500 til å finne alle grupper brukeren haugerud er med i.
- Hva skjer med eierskapet om man kopierer en annens fil?
Prøv ved å kopiere en fil fra en annen bruker, for eksempel /home/haugerud/haugerud.txt på serveren data2500.
- Gir skriverettighet leserettighet?
Har man automatisk leserettigheter hvis man har skriverettighet? Prøv!
- Kan man slette en fil man selv eier, men ikke har skriverettigheter til?
-
Tast inn inn ved shell-promptet de to linjene:
minvar=hei
export DINVAR=HALLO
start et nytt bash-shell med
bash
og taster deretter inn i dette shellet
$ echo $minvar
$ echo $DINVAR
Hva blir output fra de to echo-kommandoene ?
Forklar.
- (Oblig)
Lag et script vari.sh:
#! /bin/bash
min=hei
export DIN=HALLO
som du kjører med
$ ./vari.sh
og taster deretter
$ echo $min
$ echo $DIN
Hva blir output fra de to echo-kommandoene ?
Var det som ventet? Forklar.
- (Oblig)
Prøv nå å gjøre den forrige oppgaven med ChatGPT (https://ki-chat.sikt.no/) ved å kopiere og paste inn
oppgaveteksten. Bruk først GPT-3.5 (velges med "Endre modell" helt øverst på web-siden) og etterpå med GPT-4.0 (som koster 25$ i måneden om du ikke går via Sikt).
Er det noen forskjeller i svarene og kom dere selv frem til samme resultat og forklaring? Diskuter med GPT-4.0 og dere i mellom om dere ikke har samme forklaring.
Og test ut hva dere faktisk får i shellet.
Husk at til eksamen så vil hverken ChatGPT ikke være tilgjengelig, men du kan bli presentert eksempler på hva ChatGPT har svart. Men du vil få tilgang til et Linux shell
der du kan kjøre kommandoer og script i Inspera.
- (Oblig)
Start en editor på data2500. Anta at editoren henger av en eller annen grunn. Logg inn på data2500 i et annet vindu og drep editor-prosessen med kommandoen kill. Hint: Du må finne editorens PID med ps.
- (Oblig)
Bruk uname slik at navnet på OS'et som kjøres legges i variabelen $OS
(etterpå skal echo $OS gi Linux).
-
Legg til katalogen ~/bin i $PATH. Legg endringen til i ~/.bashrc for
at den skal være varig. Legger du senere scriptene du lager i ~/bin kan de da kjøres fra
hvilken som helst katalog. Legg et script i ~/bin og sjekk at det kan kjøres fra hvorsomhelst.
Sjekk om "." (katalogen du står i) er med i $PATH.
Hvis ikke må du skrive
$ ./mittscript for å få kjørt et script som heter mittscript.
Legg i såfall til "." i PATH og lagre endringen i ~/.bashrc. Da kan
du etterpå kjøre scriptet med $ mittscript.
-
Lag et bash-script med navn garbage som sletter alle filer
i katalogen scriptet utføres fra som slutter på .bak, .BAK, % samt
filer som begynner med #. Vær forsiktig ved uttesting!
-
Test ut kommandoene basename og dirname ved å lese manualsiden og å prøve å forstå output fra følgende kommandoer:
$ basename /etc/passwd
$ basename /etc/hosts.allow
$ basename /etc/hosts.allow .allow
$ dirname /usr/bin/find
$ dirname /usr/bin
$ dirname /hva/som/helst
- (Oblig)
Hvis du leter etter filer med navn passwd på data2500 med følgende kommando
data2500:~$ find / -name "passwd"
får du en masse linjer med "Permission denied". Lag en kommando som gjør at bare linjer hvor "passwd" blir funnet vises.
-
Ukens utfordring nr. 1:
Lag et script err.sh som skriver strengen "hallo" til stdout og strengen "Error!" til stdout.
Kjør deretter scriptet slik at "hallo" skrives ut mens "Error!" omdirigeres til filen err.txt.
- (Oblig)
Lag en kommando på data2500 som teller antall ganger ordet systemd forekommer i filen /etc/passwd og legger tallet i filen systemd.txt.
-
Splitt opp følgende eksempel, utfør ledd for ledd (først ps aux, så awk '{print $1}',
så ps -eo user | sort, etc.) og forklar hva hver kommando gjør:
ps aux | awk '{print $1}' | sort | uniq | wc -l
(Forøvrig er ps -eo user et alternativ til ps aux | awk '{print $1}' ) Kommandoen skal gi antall brukere som kjører prosesser på maskinen, men gir en for mye fordi det
står en linje med USER øverst i ps aux listingen. Prøv å fjerne linjen som
inneholder USER med grep, les manualsiden for grep.
-
Ukens utfordring nr. 2:
Lag en kommando som teller opp hvor mange ganger strengen "haugerud" finnes tilsammen i filene /etc/passwd og /etc/group på data2500.
- (Oblig)
Lag et script usrbin.bash:
#! /bin/bash
cd /usr/bin
echo "er i $(pwd)"
som du kjører med
$ ./usrbin.bash
Hvor i filtreet er du etter at scriptet har kjørt? Forklar. Prøv å kjøre scriptet på
en slik måte at
du befinner deg i /usr/bin etter at det har kjørt.
-
Forklar hva filen /proc/meminfo inneholder, du trenger ikke forklare i detalj.
Vi skal nå lage oss et lite verktøy som kan plukke ut en linje fra meminfo og legge til den linjen i bunnen av en fil. Lag deg et script som tar et argument og plukker ut riktig linje fra meminfo.
Eksempel: Det finnes en linje som heter "MemFree:" i meminfo. Da skal jeg kunne kjøre scriptet slik:
$ ./mittscript.sh MemFree
$
Det skal nå finnes en fil som heter "MemFree.dat" som ble opprettet av scriptet og inneholder den linjen fra /proc/meminfo som matchet teksten "MemFree". Dersom jeg kjører kommandoen flere ganger skal filen vokse med en ny linje for hver gang kommandoen ble kjørt. Hint: Finn ut hva gjentatt bruk av kommandoen cat fil >> logfil gjør når fil inneholder noen linjer tekst. Hvis scriptet kjøres slik:
$ ./mittscript.sh MemTotal
$
skal det tilsvarende lages en fil som heter "MemTotal.dat".
-
Ukens utfordring nr. 3:
Når man skal gjenta samme operasjon mange ganger er konstruksjonen for
veldig nyttig. Lag først to tomme filer med touch fil1 fil2 og test ut hvordan
for virker ved å taste inn følgende:
$ for fil in fil1 fil2
> do
> echo Katalogen inneholder $fil
> done
(promptet > skrives ut av shellet) Konstruksjonen er slik at kommandoene
som står mellom do og done utføres en gang
for hvert av ordene som står etter in. Og for hver gang har $fil
verdien til et nytt av disse ordene. $fil er en shell-variabel som du selv bestemmer
navnet til; du kunne f. eks. brukt $filen istedet. I motsetning til i Java, starter alle
variabelnavn i et shell med et $-tegn.
Etter in kan man også bruke wildcards. Test ut hva som skjer
når du bytter ut fil1 fil2 med *.
I en tom katalog med navn ~/tmp
utføres følgende Linux-kommandoer:
$ mkdir dir1
$ mkdir dir2
$ mkdir dir3
$ for nr in * ;do touch $nr/fil$nr;done
$ mv dir1 dir2
$ mv dir3 dir2
(man kan bruke semikolon istedet for return for å adskille kommandoer som i 4. linje)
Bruk kommandoen tree eller tegn en liten skisse som viser katalogstrukturen under ~/tmp
med
navn på alle kataloger og filer etter at disse kommandoene er utført.
-
Ukens utfordring nr. 4:
Anta at du er i en katalog med en mengde filer med filendelse .HTM. Lag et script som endrer fil-endelse på
alle disse filene til .html. Bruk basename fra oppgaven over til å løse dette problemet. Kommandoen $ basename dir/fil.txt gir fil.txt til resultatet. For å legge
resultatet av en kommando inn i en variabel, bruker man apostrofer. Etter
name=`basename dir/fil.txt`
har variabelen $name verdien fil.txt. Legg merke til at det
er forskjell på apostrofene ' og `. Den siste som heller bakover brukes i det siste eksempelet.
Alternativt kan man bruke følgende metode:
name=$(basename dir/fil.txt)
- (Oblig)
Dette er ukens konkurranse-oppgave hvor det mot slutten av semesteret vil bli delt ut premier til de tre som har løst disse oppgavene raskest.
For å løse denne obligatoriske oppgaven må du følge instruksjonene nedenfor. Det viktigste er likevel ikke at du løser den raskt, men at du bruker tid på
å komme frem til løsningen selv, med minst mulig hjelp fra andre. Tilgangen til disse serverene blir først åpnet ca kl
10 på onsdag når konkurransen starter.
Så sjekk først på Canvas hvilken s-gruppe du har blitt tildelt og noter passordet, slik at du er klar når tilgangen til serverene åpnes.
Gå inn på Canvas der du skal ha bli tilordent en s-gruppe. Det er en gruppe som heter noe sånt som s135 hvis du er tilordnet enkeltstudentgruppe nr 135; det skal kun
være en student pr gruppe (vanlige grupper med flere studenter kommer senere).
(Istedet for å lete igjennom alle de 412 gruppene, klikk på grupper i venstremenyen i Canvas, før du går inn i et kurs, da vil du få opp kun de
gruppene du er medlem av.) Du kan da få tilgang til en egen server gjennom passordet som ligger i en annonsering i denne s-gruppen på Canvas.
Hvis du f.eks. er i gruppe s135 kan du logge inn med (svar yes og ok på alle spørsmål):
$ ssh -p 5135 s135@intel3.vlab.cs.oslomet.no
s135@intel3.vlab.cs.oslomet.no's password:
s135@os5135:~$
hvor du skriver passordet som står i kunngjøringen i s135 gruppen. Merk at hvis du bruker putty må du legge inn at portnummeret er 5135 og ikke det
standard ssh-portnummeret 22 (135 + 5000 = 5135 skal kun brukes for student s135, er du i student-gruppe s1 er portnummeret 1 + 5000 = 5001, etc.).
Oppgaven går ut på at det inne på hjemme-mappen til din s-bruker ligger en fil som er skjult på en slik måte at man ikke umiddelbart finner den. Let i hjemmemappen og
prøv å finne filen. Filen inneholder et ord med 10 tegn.
For å sjekke at du har funnet det rette ordet, skriv strengen med 10 tegn inn på siden
os.php uke 5
og du får beskjed om du har skrevet riktig. I tilegg blir du da med på konkurransen om å finne denne koden fortest mulig!
NB! Det er viktig at hvert medlem på gruppen gjør oppgaven på egen s-server. Hvert medlem må finne sitt ord og skrive det inn i rapporten.
Skriv inn ordene sammen med s-nummeret det tilhører. Skriv i tillegg resultatet inn på os.php siden for å få oppgaven godkjent som oblig.