Uke 11 - Scheduling, trap, systemkall og ticks, Dockerfiles

Oppgaver til mandag 10. - fredag 14. mars

Denne uken er fokuset først på hvordan et moderne operativsystem i praksis klarer å kjøre flere prosesser samtidig på en CPU. Deretter noen oppgaver om containere og hvordan man kan bruke Dockerfiles til å bygge containere. Dette er den vanligste metoden for å bygge containere; det gir en detaljert oversikt over hva en container inneholder og dermed hvordan den kan brukes. Og det er første steget mot infrastructure as a service, IaaS, hvor man bygger opp infrastrukturen på grunnlag av kode, slik at det er enkelt å reprodusere hele oppsettet på nytt.
  1. (Oblig) Se på CPU-usage på en Linux-VM. Hvor mye av CPU'en brukes vanligvis? Her ser det ut til å være mye ressurser til overs. Hvordan kan de utnyttes bedre, eller gjør de allerede det?
  2. Hva er en trap-instruksjon? Forklar kort hva den brukes til i et operativsystem.
  3. Linux-kjernen deler tiden opp i ticks eller jiffies som vanligvis varer i 10 millisekunder eller ett hundredels sekund. Dette er tiden som går mellom hver gang hardwaretimeren sender et interrupt. Denne hardwaretimeren er faktisk programmerbar, slik at OS-kjernen kan sette verdien for denne når maskinen booter. Det har variert litt hva som har vært standard lengde på en jiffie, men i det siste har det vært 10 ms. I noen tidligere versjoner var det 2.5 ms. Det er mulig å konfigurere Linux kjerneversjon 2.6 til å bruke jiffie-lengde 10, 2.5 og 1 ms. Prøv å vurdere hva som er fordeler og ulemper med en kortest mulig jiffie/tick lengde.
  4. Linux-kjernen konfigurerer vanligvis hardware-timeren til å sende et interrupt hvert hundredels sekund. Forklar kort hvorfor dette timer-interruptet er nødvendig for at Linux-kjernen skal kunne fordele CPU-tid mellom alle prosessene uten at en av disse prosessene kan ta over styringen.
  5. En hardware-timer deler tiden inn i jiffies eller ticks. En jiffy er tiden mellom hvert interrupt fra timeren, ett hundredels sekund i eksempelet i forrige spørsmål. Forklar kort hvordan et operativsystem kan prioritere prosesser forskjellig ved hjep av denne tidsinndelingen.
  6. (Oblig) Problem 1.15 i Tanenbaum: Hva er den viktigste forskjellen mellom en trap og et interrupt? (I simuleringen som demonstrerer multitasking av forelesning og vaffelrørelaging, forskjellen på når vaffelprosessen ønsket å knuse et egg og på avbruddene fra timeren og fra melkemannen når melken leveres)
  7. (Oblig) Problem 1.18 i Tanenbaum: Hva er hensikten med et systemkall i et operativsystem? (I simuleringen som demonstrerer multitasking av forelesning og vaffelrørelaging: Vaffelprosessen ønsket å knuse et egg)
  8. (Oblig) Tre 100% CPU-avhengige prosesser A, B og C kjører på en Linux-PC med kun én CPU og med en Linux 2.6 kjerne. Ved starten av en epoke er alle tre klare til å kjøre og de er de eneste prosessene i ready-list. Prosess A har en tildelt timeslice på 30 ticks/jiffies, B har 20 og C har 10. Forklar kort hvordan disse prosessene kjøres og hvordan fordelingen av CPU-tid vil skje for disse tre prosessene i løpet av epoken. Anta at det ikke forekommer andre interrupts enn fra timeren og at prosessene ikke gjør noen systemkall.
  9. Forklar kort hvor mange timer-interrupts og context switches som vil skje i denne epoken.
  10. Hva skjer når epoken er over? Vil prosessene nødvendigvis få tildelt samme antall ticks som før? Forklar kort.
  11. Ukens nøtt nr. 1: Linux 2.6 kjernen deler dynamisk prosessene inn i 140 forkjellige prioritetsklasser. Hver prioritetsklasse tilsvarer et antall tildelte ticks i starten av en epoke. Hver gang scheduleren kalles, velges prosessen som har høyest prioritet og den kjører til den har brukt opp alle sine tildelte ticks. Deretter kalles scheduleren på nytt. Men hvis det i løpet av epoken kommer et interrupt, for eksempel fra tastaturet, vil et flagg need_resched bli satt og scheduler på grunn av dette kjøres etter neste timer-tick. Forklar kort hvorfor need_resched er viktig for at interaktive prosesser skal ha rask responstid.
  12. Ukens nøtt nr. 2: Forklar kort med bakgrunn i forrige spørsmål omtrent hvor lang tid det maksimalt vil ta fra en bruker taster et tegn på tastaturet til det synes på skjermen når en teksteditor kjører under Linux 2.6 kjernen. Hvordan vil en endring av lengden av en jiffy påvirke tiden det tar?
  13. Ukens nøtt nr. 3: Anta at den minste mulige time-slice en prosess kan tildeles er 10 ticks = 100ms. Prosesser i laveste prioritetsklasse vil da ha 10 ticks. Anta videre at de eneste aktive prosessene er en teksteditor kjører samtidig med en regnejobb-prosess som er 100% CPU avhengig. Regnejobben havner derfor raskt havne i laveste prioritetsklasse. Hvis 2.6 kjernen ikke brukte need_resched, omtrent hvor mange millisekunder ville det gjennomsnittlig ta fra et trykk på tastaturet til et tegn vises i teksteditoren? Omtrent hvor mange millisekunder ville det gjennomsnittlig ta når need_resched brukes? Forklar kort.
  14. (Oblig) Lag et script som først stopper alle kjørende docker containere og deretter fjerner dem og alle image. Det er viktig at dere jevnlig fjerne gamle containere og image som ikke er i bruk siden serveren har lite diskplass og risikerer å bli helt full om man ikke rydder jevnlig.
  15. (Oblig) I denne oppgaven skal du på samme måte som i oppgaven fra forrige uke lage en docker containere som kjører en apache2 webserver på port 80 og en annen docker container som kjører apache2 webserver på port 443. De to containerene skal begge kjøre på os-gruppens Linux VM. Men denne gangen skal du først lage en Dockerfile som sørger for at apache2 installeres på et ubuntu-image og at image'et bygges videre på dette grunnlaget.

    Hint nr 2: Kommandoen som er spesifisert med CMD er den kommandoen man ønsker å kjøre når containeren starter og om denne stoppes, vil containeren avsluttes. Derfor kan ikke apache startes med 'service apache2 start' for denne kommandoen avsluttes og containeren stoppes. Bruk derfor 'apachectl -D FOREGROUND' istedet som fortsetter å kjøre i forgrunnen og dermed fortsetter også containeren å kjøre. (Start containeren med -d og ikke med -it og /bin/bash. Hvis du gjør det site tar /bin/bash over som container-kommandoen, apachectl utføres ikke og apache startes ikke.)

  16. Ukens nøtt nr 4:

    Skriv et bash-script som tilsvarer forrige ukes utfordring og starter opp 9 containere med apache web-server på portnummer 8081, 8081, 8083, ..., 8089 og som har en tekst på web-siden som viser hvilken webserver det er (ligger i /var/www/html/index.html for apache). Men nå skal ett image lages med en Dockerfile og 9 docker volume skal lages slik at innholdet for hver webserver ligger på hvert sitt volum etter at de har startet opp.
  17. (Oblig)

    Dette er ukens OS-konkurranse. Inne på din s-VM ble det tirsdag 11 mars startet en ubuntu docker-container. Åpne et shell Inne på denne containeren. Nederst i en konfigurasjonsfil for bash-shell hvor brukeren root kan sette aliaser, miljøvariabler og andre shell-innstillinger, ligger den 10 tegns koden du skal finne.

    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 11 og du får beskjed om du har skrevet riktig. I tilegg blir du da med på konkurransen om å finne denne koden fortest mulig!