Funksjonalitet og oppbygning av et OS (og litt mer om Linux)
Hovedfunksjoner i et OS OS skal sørge for: Styring av maskinvaren Deling av maskinens ressurser Abstraksjon vekk fra detaljer om maskinvaren Dette skal gjøres ved: Håndtering av maskinvaren internt i OS-et Funksjoner/systemkall som tilbys applikasjoner og brukere OS-ets viktigste oppgaver kan deles opp i: Prosesshåndtering Minnehåndtering Filhåndtering Utstyrshåndtering Interprosesskommunikasjon (Meldingshåndtering)
Prosesshåndtering* Prosess: Program som kjører/eksekverer OS må kunne håndtere mange prosesser samtidig, inkludert interaktiv dialog med bruker(e) Håndtering av prosesser kan deles opp i: Opprette og fjerne prosesser Starte og stoppe prosesser Synkronisere prosesser Fordele CPU'ens regnekraft mellom prosessene Prioritere prosesser som brukere/applikasjoner ønsker skal utføres raskere/mer effektivt enn andre * Kapitlene 4, 6 og 7 i læreboken
Minnehåndtering* Minne: Begrenset ressurs for lagring av både data og programkode Må deles mellom prosessene Håndtering og tildeling av minne må: Fungere både statisk (ved oppstart av prosess) og dynamisk (mens prosessen kjører). Ha en god strategi for fordeling av minnet når alle prosessene samlet krever mer enn det som er tilgjengelig. Beskytte minnet som er reservert for én prosess mot lesing og endring fra andre prosesser (men også dele minne mellom prosesser hvis dette er ønskelig). Effektivisere minnebruk ved å legge lite brukte minneområder midlertidig ut på disk for å frigjøre plass til andre prosesser (paging/virtual memory). * Kapittel 5 i læreboken%
Filhåndtering* Fil: En samling data som logisk hører sammen og som skal lagres permanent, på disk eller annet medium**. OS skal tilby et filsystem som gir en logisk organisering av filene, og som er mest mulig uavhengig av hardware og av type eksternt lagringsmedium. Filsystemet skal: Være katalogbasert, slik at filene kan samles i mapper. Være hierarkisk, slik at katalogene kan inneholde både filer og kataloger Tildele filer og kataloger navn, tidsdata og eier(e) Tilby sikkerhetsmekanismer for beskyttelse av data Være effektivt, slik at filhåndtering ikke blir en flaskehals i OS'et * Kapittel 8 i læreboken ** Alternativ definisjon i Linux: «Alt er filer»
Utstyrshåndtering OS leveres med kode for å håndtere både «faste komponenter» (CPU, DMA...) og en rekke standard «plug-ins» (grafikk-kort, printere...). OS tilbyr et Service Provider Interface (SPI) for å kunne håndtere ny/ukjent maskinvare ved å installere medfølgende drivere i OS-et. En driver (Device Driver) inneholder bl.a. avbruddsrutine(r) som skal kalles når utstyrskomponenten varsler over kontrollbussen at den trenger «betjening» (oftest I/O). OS-et tilbyr applikasjonene et felles grensesnitt mot I/O-enheter, der «alle enheter behandles likt».
Interprosesskommunikasjon* Mekanismer/metoder for å sende data mellom prosessene/trådene som kjører på en (eller flere) datamaskin(er) Krever bruk av synkroniseringmekanismer Kan gjøres på mange ulike måter**, f.eks. «Pipe» i Unix/Linux som bruker standard input/output til å sende tekstlige data tegn for tegn mellom to prosesser «Named pipe» i Windows, som bruker filsystemet til å utveksle data mellom prosesser «Sockets» i Java-programmer * «Meldingshåndtering» i læreboken ** Se f.eks «Inter-process communication» i Wikipedia
Litt om filtre og interprosesskommunikasjon i Linux Mange systemprogram og verktøy i Linux er tegnbaserte filterprogrammer: Leser input linje for linje fra standard innenhet (stdin) Gjør «et eller annet med» (filtrerer) input Skriver output linjevis til standard utenhet (stdout) stdin er i i utgangspunktet tastaturet* stdout er i utgangspunktet skjermen* (terminalen) stdin og stdout kan redirigeres slik at det leses eller skrives til/fra filer eller mellom prosesser i stedet. * Dette er ikke helt sant. «Alt er filer» i Linux, og stdin/stdout er egentlig systemfiler som representerer tastatur og terminalvindu.
Noen Linux-filtre cat se på innholdet av/slå sammen filer++ grep lete etter tegnmønstre i input sort sortere linjene i input more «bla gjennom» en tekstfil cut plukke ut deler/felter av linjene i input head se på begynnelsen av en fil/input tail se på slutten av en fil/input tr «rediger» linjene i input
Redirigering av I/O og interprosesskommunikasjon i Linux Kan bruke noen spesialtegn på kommandolinjen for å endre stdin/stdout: > filnavn stdout settes til å være en fil < filnavn stdin settes til å være en fil >> filnavn legg til output på slutten av fil I tillegg kan vi bruke «piping», der output fra en prosess sendes som input til en annen: cat < fil.txt grep Jan Tegnet ' ' kalles «pipe» i Linux
Noen krav til et godt konstruert OS Effektivitet Vedlikehold Korrekthet Standardisering Grensenitt og abstraksjon
Effektivitet Et OS gjør ikke noe produktivt arbeid i seg selv. OS må gjøre utføre sine oppgaver effektivt, for å overlate mesteparten av maskinens ressurser til applikasjonene. OS må derfor være optimalisert mht. effektivitet Et OS inneholder mange kompliserte og effektive algoritmer for å håndtere maskinvaren, f.eks.: Timesharing: Deling av én CPU på mange programmer og brukere. Utnytting av «idle-tid», f.eks. overlapping av prosessering med input og output
Vedlikehold Et OS er et svært stort programvaresystem: Ca. 50 millioner kodelinjer i Windows 7 («guesstimate») Ca. 13 millioner kodelinjer fordelt på 35 000 filer i Linuxkjernen (i 2012) Stort antall utviklere involvert Koordineringskostnad og -tid bør minimeres Et OS må konstrueres modulært: God og logisk oppdeling i moduler Modulene må i stor grad kunne vedlikeholdes uavhengig av hverandre
Korrekthet Vi må kunne stole på at OS-et fungerer korrekt: Feil i OS kan gjøre maskinen «ubrukelig» Må kunne håndtere tilfeldighet og uforutsigbarhet Må ha gode mekanismer for feilhåndtering Krever: Solid teoretisk fundament for implementasjonen God modularisering internt i koden Godt og sikkert grensesnitt mot applikasjonene Gode og omfattende rutiner for testing og feilretting
Standardisering Tjenestene som et OS tilbyr må følge standarder for samhandling med annen programvare: Hvilke tjenester skal tilbys? Hvordan skal de brukes? Hvordan skal tjenestene implementeres i høynivåspråk som f.eks. Java? Hvordan skal filene organiseres? Hvilke dataformater (tegnsett og tall) skal støttes? Hvordan skal eksekverbare programmer lagres?
Standarder i Windows og Linux Windows: Egen standard: «Kompatibelt med seg selv» Bakoverkompatibelt mht. både dataformater og kjøring av programmer Linux: Følger fullt ut POSIX-standarden for «portable, UNIX-lignende operativsystemer» POSIX angir bl.a. hvorledes programmer skrevet i programmingsspråket C (som alle bør lære seg...) skal kunne bruke tjenestene som OS tilbyr
Grensesnitt og abstraksjon OS må tilby et godt grensesnitt, både mot brukere og utviklere av applikasjoner, som: Følger kjente og mye brukte standarder Er stabilt Skjuler intern virkemåte av OS-et (jfr. Wine) Ivaretar kompabilitet selv om maskinvare endres Analogi til OOP/Java-objekter: Klasseobjekter tilbyr et grensesnitt i form av metoder som kan kalles «fra utsiden» Implementasjon av metodene inkapsles/skjules i selve koden for klasseobjektet
Oppbygning av et OS: Noen andre viktige ting å kjenne til Konfigurasjonsmuligheter: Gir fleksibilitet i forhold til bruk og omgivelser Enkel rekonfigurering bør gjøres uten omstart Mikrokjerneteknologi Oppstart / Bootstrapping Krever permanent lagring av instruksjoner i ROM Fyrer opp BIOS som sjekker hardware og deretter starter selve OS-et Bootstrap-sekvensen kan også konfigureres