Vi skal innom mange temaer i denne uken og teste dem ut i praksis. Dette inkluderer et eksempel på hvordan man kan sette opp en container og bruke denne til å teste effektiviteten til forskjellige programmeringsspråk.
Pga tidlig eksamen har vi blitt nødt til å halvere omfanget av oblig 3 og sette innleveringsfristen en uke tidligere. Oppgavene denne uken som er merket med (Oblig), utgjør dermed de siste oppgavene i obligatorisk innlevering nummer 3. Oblig 3 består av alle oppgaver merket (Oblig) fra og med uke 11 til og med uke 12 (altså kun 2 uker!) og har innleveringsfrist fredag 28. mars. Det er veldig viktig at denne obligen leveres i tide, da tirsdag 22. april er absolutt siste frist for oss å rapportere inn hvem som har fått godkjent alle obliger og kan gå opp til eksamen. Det betyr i praksis at dette må være klart før påske, det vil si fredag 11. april.
Hint: hvis du leser manualsiden for proc vil du se at det finnes en side /proc/[number]/stat der [number] er en PID. Finn så fra manualsiden hvilke kolonner som gir tallene du er ute etter. Ticks omtales ofte også som jiffies under Linux. Se deretter hvordan en kommando som
cat /proc/2192/stat | cut -d' ' -f 2kan plukke ut verdier fra kolonner.
sudo apt-get install linux-sourceDette er gjort på data2500 og kildekoden ligger der i
/usr/src/linux-source-5.10Finn ut fra filen
/usr/src/linux-source-6.1/arch/x86/entry/syscalls/syscall_64.tblhvor mange systemkall det er i denne versjonen av Linux-kjernen. I mappen over er det en fil som heter entry_64.S . Hvilken funksjon har koden i denne filen og hvilket språk er den skrevet i?
sudo snap install scceller med en binærfil direkte lastet ned. Den er installert på data2500, utfør der følgende kommando:
@data2500:~$ /snap/bin/scc /home/haugerud/linux-source-6.1/*(scc kan ikke kjøres utenfor /home, kjør det derfor på denne kopien. NB! Dette fungerer ikke om man ikke først kopierer denne mappen til sin egen mappe. Alternativt, se løsningsforslaget. Den vil etter noen sekunder gi litt statistikk om innholdet av Linux kildekoden (mens du venter på svar: Hvor mange språk tror du er representert og hva tror du er det mest brukte programmeringsspråket?): Hvis læreboken, Tanenbaum, har 40 linjer pr side og 1000 sider, hvor mange slike bøker vil Linux-kildekoden fylle? Og hvor stort er estimatet for hva det vil koste å utvikle denne koden?
group70@os70:~$ taskset -c 0 ./regn& group70@os70:~$ taskset -c 0 ./regn&
Forklar hva taskset gjør med prosessene. Sjekk gjerne at det stemmer ved å kjøre top, taste f, gå med piltaster ned til P = Last Used Cpu, taste space og så Esc. Hvor stor andel CPU-tid får de nå hver?
Stopp så regn-jobbene og start to nye medgroup70@os70:~$ killall regn group70@os70:~$ taskset -c 0 ./regn& group70@os70:~$ taskset -c 0 nice -n 19 ./regn&Hvor stor andel CPU-tid får de nå hver?
#include <stdio.h> |
Modifiser denne koden og lag et C-program som ved
hjelp av fork()
lager en child-prosess. Denne prosessen skal skrive ut sin
egen og parent-prosessen sin PID, sove i 5 sekunder (sleep(5);
) og deretter
ved hjelp av fork()
lage en ny child-prosess. Denne prosessen blir "grandchild"
av den opprinnelige prosessen. Grandchild-prosessen skal skrive ut sin egen
og parent-prosessen sin PID, sove i 5 sekunder og deretter avslutte.
Alle prosesser skal vente på sine children og si ifra når de avslutter.
ppid = getppid(); printf(" Jeg er child (mypid = %d) av parent med pid = %d.\n",mypid,ppid);rett før den avslutter. Hva kan det komme av at parent id nå har endret seg til pid = 1?
apt-get install build-essential apt-get install default-jdk apt-get install python3Hvis du får en feilmelding av typen
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?legg til --fix-missing når du kjører apt-get update i starten av Dockerfile. Det vil si, bruk:
RUN apt-get --fix-missing -y updateHint: Hvis installasjonen spør interaktivt om tidssone og byggingen henger; Legg inn riktig tidsone som andre og tredje linje i Dockerfile:
ENV TZ=Europe/Oslo RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneEtter at du har laget en Dockerfile som gjør dette og laster ned git-repositoriet sum, start containeren, gå inn i sum-mappen og sjekk at du kan kompilere og kjøre java-programmet med:
javac Sum.java java SumOg at du kan kompilere med gcc og kjøre C-programmet på vanlig måte. Vider skal du kunne kjøre
./sum.perl python3 sum.py
Hvis du står fast på denne oppgaven, kan du se de tre videoene i ukens linux-forelesning som viser et forsøk på å løse denne og litt av de følgende oppgavene med samme tema. (de hadde den gang andre oppgavenummer).
root@33256e20c0ee:/sum# time ./sum.bash Ferdig, sum: 250000000000 real 0m5.564s user 0m5.518s sys 0m0.037sResultatet du bør se på er user + sys som vanligvis er det samme som real (for de andre programmene er stort sett sys = 0) og det brukte altså 5.5 sekunder (ett desimal holder).
Hvis tiden real er mye større enn user + sys betyr det at andre programmer bruker mye CPU. Det kan innvirke på resultatet hvis den underliggende VM-serveren er tungt belastet, men den har 4 uavhengige CPUer, så det vil trolig stort sett ikke være et problem. Sett gjerne variabelen
TIMEFORMAT="Real:%R User:%U System:%S %P%%"for å få et mer kompakt tidsresultat. Ved å bruke kommandoen time på de andre programmene skal du nå lage en tabell over hvor mange ganger raskere de andre programmene er enn sum.bash. Om de andre programmene ikke bruker 5.5 sekunder(eller den tiden du måler for sum.bash så kan du prøve å endre størrelsen på TIMES slik at programmet bruker ca like lang tid som sum.bash. Hvis f. eks. time sum.perl bruker 11 sekunder, så kan du halvere verdien på TIMES og prøve igjen, da bruker det trolig ca 5.5 sekunder. Etter å ha tilpasset TIMES slik at alle programmene bruker omtrent like lang tid som bash-scriptet, vil verdien på TIMES for et program si hvor mange ganger raskere det er enn bash-scriptet. Lag en tabell over hvor mange ganger raskere C, PHP, Python og java-programmene er enn bash-programmet. Sammenlign med resultatene fra en forelesning for noen år siden, listet nedenfor og kommenter.
2010
Språk | CPU-tid i sekunder på cube | TIMES |
---|---|---|
bash | 5.7 | 1 |
php | 5.6 | 21 |
perl | 5.6 | 75 |
Java | 5.6 | 13500 |
C/C++ | 5.6 | 63000 |
sum.bash: TIMES = 1; sum.perl: $TIMES = 40; sum.py: TIMES = 46 sum.php: $TIMES = 155; sum.c: int TIMES = 4200; Sum.java:int TIMES = 15000; sumO.c: int TIMES = 25000;
Strengen med 10 tegn som du skal finne ligger i en docker container som en gang har kjørt på din s-server. På containeren er det registrert en bruker med brukernavn os. Strengen du skal finne er relatert til hvilket passord denne brukeren må skrive for å kunne logge inn på containeren.
Logg inn som tidligere med noe tilsvarende som følgende:
$ ssh -p 5135 s135@intel3.vlab.cs.oslomet.no s135@intel3.vlab.cs.oslomet.no's password: s135@os5135:~$
For å sjekke at du har funnet det rette ordet, skriv strengen med 10 tegn inn på siden os.php uke 12 og du får beskjed om du har skrevet riktig. I tilegg blir du da med på konkurransen om å finne denne koden fortest mulig!