HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring Eksamensdato: 26. mai 2004 Varighet: 0900-200 Fagnummer: LO249D Fagnavn: Operativsystemer med Linux Klasse(r): ing, hk, fu Studiepoeng: 6 Faglærer(e): Geir Maribu (ing), Tore Mallaug (hk), Walter Keim (fu) Hjelpemidler: Ingen hjelpemidler tillatt Oppgavesettet: 3 oppgaver Vedlegg består av: Ingen vedlegg Alle deloppgavene teller likt! Oppgave : Linux a) Oppretting av en fil i Linux innebærer at det må skaffes til veie en inode for filen. Hva er en inode og hva er koblingen mellom inoden, filnavn, administrasjonsdata om filen og innholdet til filen. Svar: Inoden er en datastruktur som inneholder informasjon om filen og adressepekere til filens datablokker. Katalogene i Linux inneholder navnet til filen og nummeret til inoden. Dette nummeret peker til et område på disken som inneholder alle inodene. Hver fil har altså sitt unike inodenummer som peker til inoden. b) Fra og med kjerneversjon 2.6 for Linux er også kjernen blitt preemptive. Hva menes det med dette? Svar: Preemptiv betyr at kjørende prosesser kan avbrytes av operativsystemet. I tidligere versjoner av Linux var det slik at kun brukerprosesser kunne avbrytes av operativsystemet, f.eks når tidskvantet utløper. Kjerneprosesser derimot kunne kjøre helt til de selv sa at de var ferdige. Det nye med kjerneversjon 2.6 er at også kjerneprosesser kan avbrytes, f.eks dersom det kommer prosesser med høyere prioritet. c) I operativsystemer skiller en mellom kjernemodus og brukermodus når programkode kjøres. Hva menes det med dette skillet og hvorfor har vi et slikt skille? Svar: Tenk deg et c-program som du har skrevet. I dette programmet finnes det variabler som programmet bruker når det kjører, f.eks ved at programmet sette innhold i disse variablene. Det kan skje ved at det leses inn et tall eller en tekst fra tastaturet, eller det kan skje ved at programmet beregner en verdi og lagrer denne beregnede verdien i variabelen. I tilfeller som dette sier vi at programmet opererer i brukermodus. Men dersom programmet skal skrive ut data til skjerm, lagre data på disken eller lignende må programmet over i kjernemodus. Dette skjer ved at programmet kaller opp et systemkall, f.eks write, read eller lignende. Da opererer programmet i kjernemodus fordi instruksjonene som Side av 6
da kjøres er operativsystemets egne instruksjoner, og disse instruksjonene opererer mot operativsystemets egne datastrukturer (variabler). Det er ikke tillatt for brukerprogrammets egne instruksjoner å operere direkte mot disse datastrukturene. Dette skillet har vi for bl.a å kunne gjøre slike fellesoperasjoner som skriving og lesing fra harddisken. Dette må gjøres i beskyttede omgivelser innenfor operativsystemet. Dersom brukerprogrammene skulle kunne operere direkte mot disse datastrukturene vil en risikere feil bruk av datastrukturene og dermed mange feilsituasjoner i operativsystemet. d) Hva er forskjellen på en hard lenke og en symbolsk lenke i Linux (-filsystem)? Forklar forskjellen ut fra følgende eksempel: ln test.txt test2.txt ln s test.txt test2.txt Svar: En hard lenke viser til inoden til filene. Som du sikkert husker en inodenummeret en unik identifikator for filen. En hard lenke er bare et annet filnavn som peker til den samme inoden. Begrensningen for harde lenker er at de må befinne seg på samme diskpartisjon fordi inodenummereringen starter på nytt for hver diskpartisjon. En symbolsk lenke er en helt ny fil og dermed også med et eget inodenummer. Denne filen, kalt en symbolsk lenke, inneholder ikke annet enn komplett katalogsti fram til den filen som den peker på. Det er ingen begrensninger hvor denne filen kan ligge, gjerne på en annen diskpartisjon. e) En katalogfil har vanligvis kun ei datablokk. Hvorfor? Noen ganger har den flere. Når? Svar: Fordi katalogfilen inneholder svært begrenset med data. For hver fil som finnes i katalogen lagres det data i katalogfilene tilsvarende filnavn, inode-nummer pluss noen data om hvor langt fillnavnet er. Det betyr at for de alle fleste katalogene rekker det med ei datablokk. Kun dersom katalogene inneholder mange filer får en bruk for flere datablokker. La oss se på et eksempel. Nedenfor er et utdrag fra en ls-utskrift i katalogen /usr. Størrelsen til katalogene varierer fra 53248 byte til 4096 bytes ( datablokk er lik 4096 bytes) drwxr-xr-x 2 root root 53248 2005-05-7 6:5 bin drwxr-xr-x 2 root root 2288 2005-05-09 20:08 doc drwxr-xr-x 2 root root 4096 2005-03-03 2:50 games drwxr-xr-x 7 root root 892 2005-05-09 20:08 include Katalogen games inneholder 8 filer og greier seg med en datablokk. Katalogen doc inneholder 85 filer men bruker så mye som tre datablokker. Dette kommer av at filnavnene i katalogen doc er så mye lengre enn i katalogen games. Katalogen bin derimot har over 2000 filer og bruker derfor hele 3 datablokker. Men de aller fleste katalogene inneholder relativt få filer og filnavnene er relativt korte, og derfor greier de seg med kun en datablokk. Sjekk selv på din egen hjemmekatalog med kommandoen ls l. Oppgave 2: Prosesser og prosesskommunikasjon a) Prosesser opprettes i Linux med fork- og exec-systemkallet. Forklar kort hvordan disse systemkallene virker. Gi et kort eksempel som demonstrerer virkemåten. Side 2 av 6
Svar: En prosess som bruker systemkallet fork kloner seg selv, dvs lager en kopi av seg selv. Det betyr at etter at dette systemkallet er kjørt ferdig er det to identiske prosesser i systemet (men de har forskjellig prosess-id). Dette er Linux sin metode for å opprette nye prosesser. Men for at dette skal fungere i praksis må den nye prosessene skifte ut programkoden sin med annen programkoden enn den arvet fra foreldreprosessen. Dette gjør den selv ved å kalle opp exec-systemkallet. En av argumentene i exec-kallet er filnavn som inneholder aktuelt filnavn til programkoden. Eks: int nr; nr = fork() if (nr!= 0) her legger du inne programlinjer for foreldre-prosess else her kommer programmlinjer for barne-prosess, bl.a exec b) Gitt et utdrag av utskriften fra ps-kommandoen slik som vist nedenfor. Forklar hva kommandoen gjør, og hva utskriften fra kommandoen forteller oss. Si også noe om hvilke relasjoner det er mellom prosessene [geir@gremlin:~]$ ps -ef UID PID PPID C STIME TTY TIME CMD geir 8832 8827 0 07:24? 00:00:00 [sshd] geir 8833 8832 0 07:24 pts/5 00:00:00 -bash geir 06 8833 0 07:28 pts/5 00:00:00 ps -ef [geir@gremlin:~]$ Svar: ps-kommandoen skriver ut innholdet til prosess-deskriptoren. Hvilke deler av prosessdeskriptoren du ønsker skrevet ut styres ved hjelp av argumenter til ps-kommandoen. I dette tilfellet med argumentene ef er det snakk om alle prosessene (e for every) og du ønsker full utlisting (f for full). Kommandoen gir oss et bilde av status til prosessene i systemet. I utdraget ovenfor ser du at det kjøres en sshd, dvs en daemon-prosess som mottar secure shell-innlogginger. Denne sshd har opprettet en bash-skall som barneprosess. Det ser du av forholdet mellom PID og PPID (PID står for process-id mens PPID står for parent processid). Videre ser vi at innenfor dette bash-skallet er det gitt en ps-kommando. Dette ser du fordi ps-kommandoen har 8833 som PPID som er det samme som PID til bash. c) Hva menes med et kritisk område (region) for en prosess, og hvorfor er dette viktig å ta hensyn til? Svar: Dette er det området av programkoden som aksesserer et felles dataområde. Det er altså de programinstruksjonene som leser fra eller skriver til felles dataområde. NB! Kritisk region må ikke forveksles med felles dataområde. d) Hva er en semafor? Forklar! Side 3 av 6
Svar: En semafor er en mekanisme som brukes til kommunikasjon mellom prosesser, f.eks sikre at bare en prosess aksesserer felles dataområde om gangen. De kan også brukes til synkronisering ved at vi styrer rekkefølgen som prosesser aksesserer et felles dataområde. Semaforen består av en heltallsverdi og en kø av prosesser. Dersom heltallsverdien er betyr det at prosessene kan kjøre videre, f.eks aksessere felles dataområde. Er den 0 betyr det at prosessen ikke kommer videre men må inn i kø på semaforen. e) Anta at en tellende semafor mutex med startverdi lik brukes av tre prosesser som jobber mot et felles dataområde. Prosessene kaller alltid først wait-operasjonen, opererer deretter mot det felles dataområdet, og avslutter med signal-operasjonen. Forklar, gjerne ved hjelp av figur, hvilke forskjellige tilstander semaforen mutex kan ha mens prosessene kjører. Svar: Første prosess som ankommer dekrementerer semaforen til 0 (wait) og fortsetter inn i felles dataområde. Går den ut igjen før annen prosess ankommer setter den semaforen tilbake igjen til med signal-operasjonen. Men dersom det kommer flere prosesser mens den første fortsatt er inne i felles dataområde, vil hver av disse dekrementere semaforen med, finne at den er mindre eller lik 0 og dermed opptatt, og selv gå inn i kø på semaforen. For hver ny prosess som ankommer, mens den første ennå er inne i felles dataområde vil semaforen minke med, og antall prosesser i semaforkøen vil øke tilsvarende. Tallverdien til semaforen sier hvor mange prosesser som står i kø. Er semaforen -3 betyr det at 3 prosesser står i kø. Når den første prosessen går ut igjen vil signal-operasjonen inkrementere semaforen, finne at semaforen fortsatt er mindre enn, og derfor hente fram neste prosess i semafor-køen og gjøre den aktiv igjen, dvs sette den i cpu-køen. f) Trådprosesser ble innført bl.a for å gjøre kommunikasjon mellom prosesser enklere. Forklar hva det tenkes på her. Svar: Trådprosesser jobber innenfor samme adresseområde, og trådprosessene kan derfor selv organisere tilgangen til det felles dataområdet uten å måtte bruke formaliserte og administrativt tunge mekanismener for å styre tilgangen til det felles dataområdet. g) Hva menes med et kontekstskifte (også kalt prosesskifte) ifbm med prosesser og tråder? Svar: Kontekstskift betyr å skifte hvilken prosess som kjører. Det betyr å bytte ut prosessdeskriptorer for kjørende prosess, og innebærer bl.a å skifte inn innholdet i cpuregistrene slik at de inneholder verdiene til den nye prosessen som skal kjøre (dette er de samme verdiene som ble gjemt unna forrige gang prosessen kjørte), skifte hvilken sidetabell som nå skal gjelde etc. h) Hvorfor er et kontekstskifte mellom tråder mye raskere enn mellom prosesser? Svar: Fordi en trådprosess er en del av en større prosess. Tråden skifter bare ut den konteksten som har med kjøringen på cpu å gjøre. Når det gjelder alle andre ressurser (som f.kes minne, i/o-ressurser etc) så er dette prosessens ansvar og utføres kun dersom det er snakk om prosesskifte (og ikke ved trådskifte) i) Redegjør for forskjellen mellom kontekstskifte mellom tråder internt i en prosess og mellom tråder i forskjellige prosesser. Side 4 av 6
Svar: Et skifte mellom tråder i forskjellige prosesser er det samme som et prosesskifte. Altså skifte av full kontekst. Skifte mellom tråder internt i en prosess derimot er mye mindre krevende, kun litt utskifting av cup-registre. Oppgave 3: Minneadministrasjon a) En cpu bruker 20-bits registre for å adressere seg fram i minnet. Hvor mange Mbyte kan da adresseres? Trenger ikke eksakt kalkulatorsvar her. Det holder med en cirka-verdi. Svar: Svaret finner du ved å regne ut 2 20. Utregnet blir dette 048576. Cirkaverdier finner du ved å vite at 2 6 er 64K (ja dette er noe alle skal vite). Fro hver økning i potense, dvs til 7, 9, 9 og 20 fordobles tallet 64K, dvs til 28, 256, 52 og 024, dvs vi ender på 024K som er det samme som 048576. Svaret er altså 024K eller omregnet til antall byte er det 048576. b) Forklar forskjellen på fysisk minneadressering og logisk minneadressering. Svar: Fysisk adresser refererer til adresser i fysisk minne, mens logiske (virtuelle) adresser refererer til adresse i programmet slik det er lagt ut på disken. Virtuelle adresser opererer i området fra 0 til en max-adresse, og er det samme for alle programmene uansett hvor i fysisk minne programmet er plasert når det kjører. Dette krever en omregning fra virtuell adresse til fysisk adresse når programmet kjører. Dette er oppgaven til minneadministrasjonen. c) Gitt en tilstand i et sidedelt system som vist på figuren nedenfor med et virtuelt minne på 8 sider og et fysisk minne på 4 sider. Sidetabellen er vist uten innhold. Oppgaven er å tegne sidetabellen med innhold for systemet slik det er vist i figuren nedenfor. Virtuelt minne 0 side 0 side 2 side 2 3 side 3 4 side 4 5 side 5 6 side 6 7 side 7 Sidetabell Fysisk minne 0 side 7 2 side 2 3 side 5 Svar: Sidetabell 0 2 2 3 4 5 3 6 7 0 Side 5 av 6
d) Sidene i fysisk minne er lagt inn etter FIFO-algoritmen i rekkefølgen 2, 5 og 7. De neste sidene som etterspørres er 6, 4,3, 2 i denne gitte rekkefølgen. Tegn innholdet i sidetabell og i fysisk minne etter at sidene 6, 4, 3, 2 er etterspurt. Svar: Side 6 kommer inn i ledig blokk. Når side 4 etterspørres er det fullt i fysisk minne, og side 2 i blokk 2 må ut da den kom først inn. Det betyr at side 4 plasseres i blokk 2. Neste side som etterspørres er 3. Det er fullt i minnet og side 5 kastes ut da den var først inn av de som er der nå, dvs side 3 i blokk 3. Til slutt kommer side 2 som skyver ut side 7 og plasserer seg i blokk 0. 0 2 3 4 5 6 7 Sidetabell 0 3 2 Fysisk minne 0 side 2 side 6 2 side 4 3 side 3 e) Hva menes med sidefeil (page fault)? Svar: Sidefeil oppstår når det i prosessen refereres til en side som ikke finnes i fysisk minne. Prosessen må da stoppe opp og vente til den aktuelle siden er hentet inn i minnet. f) Hvorfor er det enklere og mer naturlig å dele kode og data mellom prosesser i et system med virtuelt minne enn i et system som kun opererer med fysisk minne? Forklar. Svar: I system virtuelt minne opererer en med side- og segmenttabeller, og da er det enkelt å la det samme kode- eller datasegmentet inngå i flere prosesser sine tabeller. Da vil alle disse prosessene kunne bruke det samme data- eller kodesegmentet. Slutt! Side 6 av 6