Notater til Teknik 1.

Notater til Teknik 1
Vidar Jon Bauge
Notater til Teknik
Vidar Jon Bauge
2005
Datamatikeruddannelsen efterår 2005
Side 1 af 54
Notater til Teknik 1
Vidar Jon Bauge
Indholdsfortegnelse
Operativsystemer........................................................................................................................
...............4
Batch systemer...........................................................................................................................
...........4
Time-sharing systemer.......................................................................................................................
...4
Computer Systemer............................................................................................................
.......................6
I/O struktur..............................................................................................................................................
...6
I/O interrupts.........................................................................................................................................
.....6
DMA struktur.....................................................................................................................................
........7
Storage struktur.......................................................................................................................................
...7
Main memory............................................................................................................................................
.8
Operativsystemers struktur...............................................................................................................
.........9
System komponenter...........................................................................................................
......................9
Proces styring...................................................................................................................................
.....9
Main memory management..............................................................................................................
.........9
File management....................................................................................................................................
..10
I/O system management......................................................................................................
....................10
Secondary storage management..............................................................................................
................10
Netværk............................................................................................................................................
........11
Protection system............................................................................................................................
.........11
Command interpreter system..............................................................................................................
.....11
Operativsystem services.....................................................................................................
.....................11
System kald.........................................................................................................................................
.....12
System programmer..............................................................................................................................
...13
System struktur........................................................................................................................
................14
Simple structure..................................................................................................................
................14
Layered approach..............................................................................................................................
..15
Microkernel....................................................................................................................................
.....15
Virtual machines......................................................................................................................
................15
Implementering.........................................................................................................................
..........15
Fordele........................................................................................................................
........................16
Java................................................................................................................................
..........................16
Processer.................................................................................................................................
.................17
Proces status............................................................................................................................................
.17
Proces Control Block (PCB)...........................................................................................
........................18
Process scheduling...............................................................................................................................
....18
Scheduling queues..........................................................................................................
....................19
Schedulers..............................................................................................................................
.............19
Context switch......................................................................................................................
...................20
Process creation....................................................................................................................
...................20
Process termination..................................................................................................................................
20
Cooperating processes..............................................................................................................
...............20
Tråde.................................................................................................................................
.......................22
Fordele........................................................................................................................
........................22
User og kernel tråde.....................................................................................................................
.......22
Tråde i Java.................................................................................................................................
.............24
Tråd behandling..............................................................................................................
....................24
En tråds tilstande...............................................................................................................................
..24
Datamatikeruddannelsen efterår 2005
Side 2 af 54
Notater til Teknik 1
Vidar Jon Bauge
Tråde i JVM.............................................................................................................................
................25
JVM og værtens operativsystem........................................................................................
.....................25
CPU Scheduling - Basic concepts................................................................................................
...........26
CPU-I/O burst cycle..........................................................................................................
......................26
CPU scheduler......................................................................................................................
...................26
Preemptive scheduling...........................................................................................................................
..26
Dispatcher................................................................................................................................
................26
Schedulerings alogritmer..................................................................................................................
.......27
First come, First-served.....................................................................................................
.................27
Shortest job first scheduling.............................................................................................
..................27
Priority Scheduling............................................................................................................
.................27
Round-Robin scheduling....................................................................................................
................27
Proces synkronisering.........................................................................................................................
.....28
Samarbejdende(Cooperating) processer........................................................................................
.....28
Producer - consumer ..............................................................................................................
............28
Kritisk område (Critical section)....................................................................................................
.........29
Semaforer...........................................................................................................................................
......29
Brug..................................................................................................................................................
...29
Deadlocks and starvation......................................................................................................................
...30
Dining philosopher..............................................................................................................
....................30
Fejl brug af semaforer.................................................................................................
............................31
Monitorer..............................................................................................................................
...................31
Java synkronisation..................................................................................................................................
35
Bounded Buffer.................................................................................................................................
..35
Deadlocks...................................................................................................................
.............................37
System model..................................................................................................................................
....37
Deadlock characterization...........................................................................................
.......................37
Betingelser der skal opfyldes.............................................................................................................
.37
Ressource allokerings graf....................................................................................
.............................38
Metoder til at håndtere deadlocks..........................................................................
............................38
Undgåelse af deadlocks.................................................................................................
.....................38
Forebyggelse af deadlocks....................................................................................
.............................38
Memory................................................................................................................................................
....39
Logisk/Fysisk adresse rum...........................................................................................
......................39
Paging.....................................................................................................................
............................40
Virtual memory..............................................................................................................................
..........42
Demand paging......................................................................................................................
.............42
Begreber...................................................................................................................................
...........42
Nødvendig hardware support..................................................................................
...........................43
Page replacement.................................................................................................................
...............43
Implementering.........................................................................................................................
..........44
Filsystemer..........................................................................................................................................
.....47
Filer....................................................................................................................................
.................47
Fil attributter..................................................................................................................
.....................47
Fil operationer..............................................................................................................................
.......47
Filtyper.....................................................................................................................................
...........48
Filstruktur.........................................................................................................................................
...49
Intern filstruktur.........................................................................................................................
.........49
Allokeringsmetoder.....................................................................................................
.......................49
Fortløbende (Contiguous) allokering...........................................................................
......................49
Datamatikeruddannelsen efterår 2005
Side 3 af 54
Notater til Teknik 1
Vidar Jon Bauge
Lenket allokering.................................................................................................................
...............51
Indekseret allokering................................................................................................
..........................51
Performance.........................................................................................................................
...............52
I/O systemer.....................................................................................................................................
........53
I/O operationer..........................................................................................................................
..........53
Polling..................................................................................................................................
...............54
Interrupts................................................................................................................................
.............54
Direct memory access...................................................................................................................
......56
Programmed IO (PIO)...................................................................................................
.....................56
DMA.............................................................................................................................
......................57
Datamatikeruddannelsen efterår 2005
Side 4 af 54
Notater til Teknik 1
Vidar Jon Bauge
Operativsystemer
Operativsystemet er et program der optræder som mellemled mellem hardware og brugeren.
Operativsystemet sætter brugeren i stand til at køre programmer og derved udnytte computeren, eller
hardwaren. Det primære mål for operativsystemet er at gøre computeren nem at bruge, og sørge for
effektiv udnyttelse af hardwaren.
Et computersystem kan groft indeles i 4:
•
Hardware
•
Operativsystemet
•
Applikationsprogrammer
•
Brugere
Operativsystemet kontrollerer og koordinerer brugere og applikationers brug af hardwareressourcer.
Operativsystemer og arkiktektur har haft stor indflydelse på hinanden, og design af begge dele har
påvirket hinanden. En vigtig faktor for design af operativsystemer er forventet brug af systemet.
Batch systemer
De første computere hadde en stor fysisk størrelse, der blev kørt fra en konsol. Almindelige input
enheder var kortlæsere og båndstationer. Almindelige output enheder var linieskrivere, båndstationer
og kort. Brugeren afleverede en job med program, data og kontroldata, i form af hulkort, til
operatøren der kørte den og sendte resultatet tilbage til brugeren.
Operatørens opgave var at overføre kontrollen fra den ene job til den næste. For at øge udnyttelsen af
maskinen, blev jobbene sorteret i batches efter hvilke behov de havde.
På denne måden var CPU'en ofte ledig, da hastigheden på de mekaniske input enheder ikke står i
forhold til CPU'ens regnehastighed.
Med indførelsen af diske, kunde man samle flere jobber på en disk. Med direkte access til flere jobs
var det mulig at indføre job scheduling der gav bedre udnyttelse af hardware.
Det vigtigste apekt ved job scheduling er multiprogramming, så CPU'en kan køre en anden job mens
den første f.eks venter på en I/O operation.
Time-sharing systemer
Time-sharing eller multitasking er en naturlig forlængelse af job-scheduling. Med time-sharing
menes det at CPU'en skifter mellem flere samtidige jobs så hurtig at brugeren kan interagere med de
forskellige programmer samtidig mens de kører.
Et time-sharing system tillader mange samtidige brugere på en computer. Siden en kommando eller
action ofte er hurtig, behøves der ikke meget CPU tid for hver bruger. Eftersom CPU'en skifter hurtig
fra den ene bruger til den næste, fremstår systemet som værende helt til disposition for den enkelte
bruger.
Et time-sharing system bruger CPU scheduling og multiprogramming for at tildele hver bruger
ressourcer. Hver bruger har mindst et program i RAM.
Time-sharing systemer er som regel mere komplicerede end multiprogramming systemer. Begge må
have flere jobber i RAM samtidig. Derfor må de have memory management og protection.
For at holde en acceptabel response tid, må processer kunde flyttes ind og ud fra main memory, så
Datamatikeruddannelsen efterår 2005
Side 5 af 54
Notater til Teknik 1
Vidar Jon Bauge
disken bliver er sekundær opbevaringsplads – virtual memory. En oplagt fordel ved dette er at
programmer kan være større end tilgængelig memory.
En anden måde at løse dette på, er ved at starte en process uden at overføre hele programmet til
memory.
Time-sharing systemer må også have et filsystem, og derved adgang til diske.
Dessuden kræver time-sharing systemer at processer kan køre samtidig, hvilket stiller krav om et
system for CPU scheduling.
Datamatikeruddannelsen efterår 2005
Side 6 af 54
Notater til Teknik 1
Vidar Jon Bauge
Computer Systemer
Et computersystem består af en CPU og en række device controllere der er koblet sammen med en
bus der giver adgang til delt minde (RAM).
Hver device controller styrer en speciel enhed på systemet, f.eks diske, grafikkort, lydenheder osv
CPU'en og device controllerne kan køre samtidig, og dermed konkurrere om memory. For at sikre delt
adgang, er systemet udstyrt med en memory controller der kontrollerer adgang til memory.
Ved opstart overlades kontrollen af systemet til et lille initialiseringsprogram, bootstrap. Dette
programmet må vide hvordan systemets kerne loades og startes. Operativsystemet starter den første
proces, og venter på at en hændelse skal optræde. Optrædelsen af en hændelse viser sig som regel som
en interrupt, udløst enten af en input enhed (hardware interrupt) eller af et kørende program
(software interrupt).
Mange typer hændelser kan udløse en interrupt, som f.eks en I/O operation er f'ærdig, division med
nul, ugyldig minne acces eller anmodning om en operation fra operativsystemet. For hver interrupt er
der en rutine der håndterer den.
Når CPU'en modtager en interrupt, standser den udførelsen af den proces der kører, og overlader
kontrollen til en service rutine for den indkomne interrupt. Når denne er udført fortsætter kørselen af
den proces der blev afbrudt.
Interrupts er en central del i moderne operativsystemer. De rutiner der køres når systemet modtager en
interrupt, ligger som regel på en lav memory adresse. Systemet har en interrupt vector der er en tabel
med pegere til de forskellige rutinerne.
Moderne systemer er interrupt driven hvilket vil sige at når systemet er færdig med de opgaver det
har, vil det begynde at vente på at noget skal ske der udløser en interrupt. F.eks at brugeren flytter
musen eller trykker på tastaturet.
I/O struktur
En device controller for en diskenhed har en buffer der er afhængig af det device den kontrollerer, og
er vanligvis på størrelse med diskens mindste adresserbare størrelse – en sektor.
I/O interrupts
For at starte en I/O operation, loader CPU'en de nødvendige registre i device controlleren. Device
controlleren undersøger så indholdet i disse registrene for at finde ud hvad den skal – om den skal
læse eller skrive. Hvis der skal læses, begynder controlleren at fylde sin buffer. Når dette er færdig,
sender den en interrupt, der informerer CPU'en om at den er klar.
Når systemet modtager er I/O interrupt, er det som regel efter anmodning fra en bruger process.
Behandlingen af denne interrupt kan ske på 2 måder:
•
Synchronous I/O
I/O operationen startes, når den er færdig tilbageføres kontrollen til brugerprocessen
•
Asynchronous I/O
Kontrollen returneres til brugerprocessen før I/O operationen er færdig og I/O operationen
Datamatikeruddannelsen efterår 2005
Side 7 af 54
Notater til Teknik 1
Vidar Jon Bauge
fortsætter mens systemet arbejder med andre ting.
Synchronous I/O forhindrer at flere I/O operationer kan køre samtidig på flere devices, og udelukker
kørsel af andre processer mens systemet venter på en I/O operation.
Derfor er det bedre at I/O operationen starter, og så køre bruger- eller operativsystem kode. Hvis
ingen bruger- eller system processer venter på at blive kørt, kan systemet gå over i en wait tilstand.
Dette betyder at systemet må kunne håndtere mange samtidige interrupts. Til dette formålet har
operativsystemet en device-status table. Hver opføring i tabellen indikerer en devices type, adresse
og status. Eftersom det er mulig for flere processer at anmode om en bestemt device, er der også en
wait queue for hver I/O device.
En I/O enhed sender et interrupt når det trenger service. Operativsystemet bestemmer så hvilken enhe
der har sendt en interrupt og slår opp i device-status table for at bestemme dens status og oppdaterer
tabellen i forhold til det indkomne interrupt. Hvis andre processer ligger i kø til den samme enhed,
gives en af disse adgang til enheden. Hvis en process ventede på at I/O operationen skulle blive
færdig, kan denne processen nu fortsætte, hvis ikke fortsætter en af de andre processerne der er i kø.
Den største fordelen ved asynchronous I/O er øget effeltivitet. Mens en I/O operation udføres, kan
systemet udføre andre processer eller starte andre I/O operationer.
DMA struktur
Devices controllere der håndterer langsomme medier, kan ikke levere data hurtig nok til at holde
CPU'en aktiv med en datastrøm. Dette hånderes ved hjælp af asynchronous I/O der tillader andre
processer at køre parallelt med en I/O operation.
Hurtige enheder, som båndstationer eller netværksenheder, kan levere datastrømme op imod memorys
hastighed. Dermed ville interrupts komme så ofte at der ikke bliver CPU tid til andre processer. For at
løse dette problemet bruges direct memory access for hurtige I/O enheder. Efter at have sat pegere,
buffere og tællere for enheden kan device controlleren overføre blokke med data direkte til memory
uden CPU tid. Der generes kun en interrupt pr blok i stedet for en interrupt pr byte som ved
langsomme enheder.
CPU'ens opgaver er grundlæggende de samme. En proces anmoder om en enhed. En device driver
setter DMA controllerens registre så den bruger den rigtige kilde- og destinationsadresse. DMA
controlleren starter så I/O operationen, og CPU'en er ledig til andre opgaver. Eftersom der bare kan
skrives en byte om gangen til RAM, stjæler DMA kontrolleren RAM cycler fra CPU'en. DMA
controlleren sender et interrupt når operationen er fuldført.
Storage struktur
Programmer må være i RAM for at blive udført. Memory er det eneste store medie CPU'en har
direkte adgang til. RAM implementeres som Dynamic Random Access Memory (DRAM) som en
række memory words eller bytes. Hver byte har sin egen adresse. Skrivning og læsning gennemføres
ved hjælp af load og store instruktioner til bestemte adresser. Load henter en speciell adresse til en af
CPU'ens registre, mens store flytter indholdet i et register til en angivet memory adresse.
En typisk instruktion-eksekution cyclus på et system med Von Neuman arkitektur indebærere en
fetch-decode-execute. Instruktionen hentes ind i CPU'ens instruktionsregister, instruktionen decodes
og kan forårsage at parametre hentes ind fra RAM til andre registre i CPU'en. Efter udførelse af
instruktionen kan data blive skrevet ”tilbage” til RAM.
Ideelt set, var programmer permanent opbevaret i RAM. Dette er imidlertid ikke muligt, da RAM er
Datamatikeruddannelsen efterår 2005
Side 8 af 54
Notater til Teknik 1
Vidar Jon Bauge
et volatilt medie der tømmes når der slukkes for systemet og fordi at RAM som regel ikke er stor nok
til at opbevare alle programmerne.
Derfor har alle systemer et sekundært medie i form af magnetiske diske hvor programmer og data
opbevares og læses ind i RAM når de skal bruges.
Andre medier til opbevaring af programmer og data er cdrom, cache memory, bånd etc. Hvert medie
holder program og data, der kan hentes ind i RAM når de skal bruges. Den vigtigste forskellen er
hastighed, pris, størrelse og mulighed for sletning/endring af de gemte data.
Main memory
CPU'ens egne registre og main memory er de eneste medier CPU'en har direkte adgang til. Der findes
instrukser der tager memory adresser som parametre, men ingen instrukser der tager disk adresser.
Dette betyder at data skal læses fra disken til memory for CPU'en kan få adgang til dem.
For at tillade lettere adgang til I/O enheder anvender mange computersystemer memory-mapped
I/O. I dette tilfælde knyttes områder i memory til device registre. Skrivning og læsning fra enheder
forårsager flytning af data til og fra disse registrene. Memory mapping egner sig for bl.a. hurtige
enheder, serie og parallelporten. CPU'en overfører data til og fra enheder ved at skrive til nogle få
registre, der kaldes I/O porte. For at sende en datastrøm til en enhed, kan CPU'en bare overføre en
byte til det aktuelle register. Enheden tømmer så registeret, og sætter et flag i device controlleren der
informerer om at enheden er klar til at modtage mer. Denne processen gentages såtil datastrømmen er
slut. Hvis CPU'en continuerlig checker kontrol bit'en for at se om enheden er ledig, taler man om
programmed IO. Hvis enheden derimod sender en interrupt når den er klar, er data overføringen
interrupt driven.
Registrene er som regel tilgængelige på en CPU cyklus og de fleste CPU'er kan udføre en eller flere
simple instruktioner på en cyklus. Dette gælder imidlertid ikke RAM. For at hindre at CPU'en står
inaktiv mens den venter på læsning fra RAM bruges en cache af hurtigere RAM mellem CPU'en og
main memory.
Datamatikeruddannelsen efterår 2005
Side 9 af 54
Notater til Teknik 1
Vidar Jon Bauge
Operativsystemers struktur
Operativsystemet fremskaffer et miljø hvordan man kan køre sine programmer. Designet av de
forskellige operativsystemer er imidlertid forskellig. Det at designe et operativsystem er en stor
opgave der må tage udgangspunkt i hvilke opgaver operativsystemet skal løse.
System komponenter
Byggingen af et operativsystem kan kun ske ved at dele det op i mindre, velafgrænsede opgaver eller
dele med nøje definerede funktioner, input og output.
Proces styring
Et program er i sig selv en passiv størrelse, og kan ikke gøre noget med mindre det læses over i
memory og udføres af CPU'en. En process kan defineres bl.a. som et kørende program med en
program counter udførelsen af en proces sker sekventielt en instruktion ad gangen. Systemopgaver,
som f.eks at sende et dokument til printeren eller håndtere I/O, er også processer. En proces kan
betragtes som en arbejdsenhed i systemet. Systemet består af mange processer, hvoraf nogen er
systemprocesser mens andre er brugerprocesser.
En proces trenger visse ressourcer, memory, CPU tid, filer, I/O enheder etc. Disse ressourcerne gives
enten ved opstart eller bliver allokeret under kørsel med parametre, f.eks. filnavn ved en filoperation.
Ressourcerne tilbageføres til systemet når processen afsluttes.
Operativsystem har følgende ansvar for afviklingen af processer:
•
Skabe og slette processer
•
Suspendere og genstarte processer
•
Metode for proces synkronisering
•
Metode for proces kommunikation
•
Metode for håndtering af deadlocks
Main memory management
Memoryens struktur består af en lang række adresser der kan skives og læses fra. Memory er den
eneste lagringsplads CPU'en har direkte adgang til. CPU'en henter instruktioner herfra og udfører dem
(fetch-decode-execute). Hvis CPU'en skal behandle data der ligger på disken, må de først læses over i
memory. For at bedre udnyttelsen af CPU'en og reducere responstid, må der ligge flere programmer i
memory samtidig. Der findes mange algoritmer for memory behandling, de alle har sine stærke og
svage sider. Valget af memory management er bl.a. harware bestemt da de forskellige algoritmerne
kræver sin egen hardware understøttelse.
Operativsystemet er ansvarlig for følgende i forbindelse med memory behandling:
•
Kontrol over hvilke dele av memory der er i brug og af hvem
•
Bestemme hvilke processer der skal læses ind i memory når der bliver ledig plads.
•
Allokere og Deallokere memory efter behov.
Datamatikeruddannelsen efterår 2005
Side 10 af 54
Notater til Teknik 1
Vidar Jon Bauge
File management
Filer kan gemmes på mange forskellige typer medier med hver sine egne karakteristika.
Operativsystemet fremskaffer et ens grænsesnit til disse forskellige enheder ved at abstrahere fra disse
karakteristika og skabe logiske lagringsenheder. Disse kan så tilgås ved hjælp af system kald.
En fil er en samling af data defineret af den der har oprettet filen. Filer kan representere både
programmer og data. De kan være formatteret til at opfylde et specielt formål elle ikke formateret i
det hele taget, som f.eks. en tekstfil. Filbegrebet er et meget abstrakt begreb.
Operativsystemet implementerer dette abstrakte begrebet ved at implementere de enheder der gemmer
filerne. I tillæg har operativsystemet kontrol med hvem der ejer og har adgang til den enkelte fil.
Operativsystemet har følgende ansvar for filbehandling:
•
Oprette og slette filer
•
Oprette og slette mapper
•
Understøtte metoder for at manipulere filer og mapper.
•
Flytte filer til sekundære lagringsenheder
•
Backups af filer til non-volatile medier
I/O system management
Et af formålene ved et operativsystem er at skjule de enkelt hardware enheder for brugeren. I Unix er
der et I/O subsystem der håndterer alle I/O enhder og som består af memory behandling der
inkluderer buffering, caching og spooling, en generell device driver interface og drivere for en enkelte
hardware enhed.
Secondary storage management
Programmer og data må befinde sig i memory for at CPU'en skal kunde eksekvere dem. Der er
imidlertid ikke plads nok i memory til at opbevare alle programmer og data. Dessuden slettes
indholdet i memory når der slukkes for systemet. Derfor opbevares programmer og data permanent på
secondary storage i form af en harddisk eller andet media. Da sekundær lagringsplads bruges ofte er
det vigtig at behandlingen af disse er så effektiv som mulig. Der findes forskellige algoritmer der kan
håndtere dette.
Operativsystemet sørger for følgende i forbindelse med sekundære medier:'
•
Behandling af ledig plads
•
Allokering af plads
•
Disk schedulering
Datamatikeruddannelsen efterår 2005
Side 11 af 54
Notater til Teknik 1
Vidar Jon Bauge
Netværk
Et distribueret system er et system med mange processorer der ikke deler memory, devices eller
klokke. Hver processor har sin egen memory og systemklokke og de kommunikerer over netværk
eller hurtige busser. Processorene i et distribueret system kan variere fra små mikrocomputere til store
computere. Et distribueret system kan få fysiske separerte og forskellige systemer til at fremst samlet
for brugeren der kan udnytte de ressourcer der findes i netværket. Operativsystemer behandler
vanligvis netværksadgang som en slags fil adgang hvor detaljerne omkring netværket er gemt i
enheder. Protokoller for distribuerede systemer er ftp, www, http etc
Protection system
Hvis et system understøtter flere brugere og flere samtidige processer er det nødvendig at beskytte
disse for hverandre. Til dette formaålet har operativsystemet mekanismer der sørger for at filer,
memory områder, CPU og andre ressourcer bare kan benyttes af en om gangen. Memory
adresseringshardware sørger for at hver process får tildelt sit område i memory, timeren sørger for at
hvis en proces får tildelt CPU tid, bliver den nødt til at afgive kontrol.
Protection er enhver mekanisme der kontrollerer adgangen for processer og brugere til de ressourcer
der er sat af til dem. Et system med fokus på sikkerhed, kan skelne mellem autoriseret og ikke
autoriseret brug af systemet.
Command interpreter system
Et vigtig systemprogram for mange operativsystemer er kommandofortolkeren eller shell. Dette
modtager og udfører systemkommandoer. Nogle operativsystemer har shelled indebyget i kernen,
mens andre har det som et eget program – UNIX og MS-Dos.
Nogle operativsystemer starter op i shellet ved opstart, mens andre, som Windows og MacOs starter
op i et grafisk miljø.
Operativsystem services
Akmindelige typer services som operativsystemet yder:
•
Kørsel af programmer
•
I/O operationer
•
Manipulation af filsystem
•
Kommunikation
•
Fejl håndtering
Funktioner til et operativsystem som sikrer effektiv drift af systemet
•
Ressource allokering
•
Logning, overvågning af ressource forbrug
•
Sikkerhed
Datamatikeruddannelsen efterår 2005
Side 12 af 54
Notater til Teknik 1
Vidar Jon Bauge
System kald
System kald giver en interface mellem processer og operativsystemet. Systemkald er som regel
tilgængelige i form af assembler instruktioner, og findes i manualer for assembler programmering.
Nogle systemer tillader system kald direkte fra høj niveau sprog, hvor de fremstår som funktions eller
subrutine kald. Nogle pogrammeringssprog, som C, C++ og Perl, er designet for at erstatte assembler
for system programmering. På Unix systemer kan systemkald udføres direkte fra et C eller C++
program. Under Windows er systemkald en del af Win32 API der er tilgængelig for alle acompilere
der er skrevet for MS Windows.
Java tillader ikke direkte systemkald fordi det kører ovenpå en Java Virtual Machine. Hvis et Java
program har behov for et systemkald gøres dette via JVM, derer designet for de forskellige systemer
og udfører system kald i henhold til disse. Systemkald er under java er implementeret i rutiner skrevet
i C, og kaldes derfor for native methods.
Systemkald kan groft deles op i 5 kategorier:
1. Proces kontrol
•
end, abort
Programmer må kunde afsluttes, enten normal(end) eller som resultat af en fejl(abort), og i så
tilfælde sende en fejlmeddelse eller memory dump
•
load, execute
En kørende proces kan have behov for at hente (load) og eksekvere (execute) en anden proces.
•
create, terminate proces
Disse processerne kan så fortsætte parallelt, mange systemer har et specielt kald for dette
(create process). Eller man har behov for at afslutte en proces der f.eks er blevet unødvendig
(terminate proces)
•
get/set proces attributter
Man skal kunde ændre på en proces' egenskaber under kørsel, f.eks. ændre dens prioritet eller
maksimalt tilladte kørselstid
•
wait
Sætte en process i venteposition
•
wait event, signal event
Sætte en process i venteposition mens den venter på at noget skal indtræffe, f.eks. en I/O
operation, eller vente på et signal om at det den venter på er indtruffet
•
alloker og frigiv memory
2. Fil manipulation
•
create/delete fil
•
open, close
•
read, write, reposition
Datamatikeruddannelsen efterår 2005
Side 13 af 54
Notater til Teknik 1
•
Vidar Jon Bauge
get/set fil attributter
3. Enhedsbehandling
•
anmod om/frigiv enhed
Hvis en proces har behov for en I/O enhed, må den først anmode om den (request), og når den
er ferdig skal den så frgigives igen så andre kan bruge den (release)
•
read, write, reposition
Når enheden så er allokeret, kan processen skrive (write), læse (read) og muligvis også
repositionere enheden
•
get/set enheds attributter
•
monter/afmonter enhed
4. Vedligeholdelse af information
Mange systemkald findes udelukkende for at overføre information mellem bruger programmer og
operativsystemet. De fleste operativsystemer har kald for at få tid og dato. Ellers kan dette dreje sig
om kald der returnerer ledig diskplads, antal brugere, operativsystemets version.
•
get/set tid og dato
•
get/set system data
5. Kommunikation
Der findes to modeller for kommunikation mellem processer. Message-passing model og sharedmemory model.
Ved meesage passing foregår kommunikation mellem processer ved at den ene proces sender en
melding via kernen til den anden proces.
Shared memory model går ud på at to eller flere processer har et fælles område i memory de begge
kan skrive og læse til.
Message passing er egnet til få og korte bekeder. Shared memory er sværere at implementere fordi
det kræver en synchronisering af det mindeområdet der er fælles. Dessuden skal man sikre sig at
processerne virkelig deler det samme område Begge metoderne er almindeligt brugt, og nogle
operativsystemer bruger begge metoder.
•
opret, slet kommunikationsforbindelse
•
send, modtag meldinger
•
overfør status information
•
koble fra/til enheder
System programmer
Til de fleste operativsystemer kommer der en række systemprogrammer
•
Filbehandling
Programmer til at oprette, slette, kopiere, omdøbe, printe, liste, og manipulere filer og mapper.
Datamatikeruddannelsen efterår 2005
Side 14 af 54
Notater til Teknik 1
•
Vidar Jon Bauge
Status information
Programmer til at hente data om systemet, som ledig dato, tid, diskplads, antal brugere, kørende
processer etc og formattere dem og vise dem i en læsbar form.
•
Ændring af filer
Tekst editorer til ændring af filer
•
Understøttelse af programmeringssprog'
Compilere og assemblere for en række programmeingsprog. For nogle systemer skal dette købes
separat.
•
Load og eksekver programmer
Absolute loaders, relocatable loaders, linkage editors, og overlay loaders samt debbugging
software.
•
Kommunikation
Programmer som sørger for virtuelle forbindelser mellem processer, brugere, og andre computer
systemer. De tillader brugere at sende meldinger til hinanden, til at gå på internettet, sende e-mails,
logge ind på en fjern computer eller overføre filer fra en maskine til en anden.
I tillæg til disse kommer bruger applikationer.
En vigtig del av et operativsystem er kommando fortolkeren der modtager en kommando fra brugeren
og udfører den. Nogle kommandofortolkere, som MS Dos comman.com har alle kommandoerne
indebygget, mens andre, som UNIX, bare tager en kommando med parametre og kører et selvstændigt
program. Dette gør den nem at udvide, man lægger bare et program i en folde hvor fortolkeren kan
finde den. Ulempen kan være at syntax er op til den enkelte programmør, noget der kan gøre systemet
inkonsistent. Fordelen ved at implementere kommandoerne inde i kommandofortolkeren er så at man
sikrer en enhetlig syntaks for hver kommando og at det går hutigere. Ulempen er så at det er sværere
at udvide den.
Operativsystemet, er fra brugerens synspunkt heller definert udfra system programmer og interface
end systemkald. Et system med MS Windows og MS-Dos har et vidt forskellig bruger interface men
benytter det samme sæt systemkald. Systemkaldene ser imidlertid anderledes ud, og brugeren ”føres
væk” fra de oprindelige systemkald.
System struktur
Et avanceret system som et moderne operativsystem må designes med omtanke for at fungere godt og
kunde modificeres på en simpel måde. En almindelig måde at gøre dette på er ved at dele opgaven op
i mindre deler heller end at have et stort monolitisk system.
Simple structure
Nogle systemer har ikke en vel afgrænset lagdeling i sin struktur. Dette gælder ofte systemer der
startede som små systemer til begrænset hardware, og blev udvidet efterhånden som harwaren blev
kraftigere.
I MS-Dos er interfaces og de forskellige lag ikke godt afgrænset. Applikationsprogrammer har direkte
adgang til grundlæggende I/O rutiner for skrivning til display og disk drev. Dette gør MS-Dos sårbar
overfor dårlig skrevne programmer, men var et nødvendig kompromis for at give maksimal
funktionalitet på begrænset hardware (Intel 8088)
Datamatikeruddannelsen efterår 2005
Side 15 af 54
Notater til Teknik 1
Vidar Jon Bauge
Det oprindelige UNIX har også lignende problemer. Det består af to separate dele, kernen og system
programmerne. Kernen er yderligere opdelt i en række interfaces og enhedsdrivere der er blevet lagt
til i årenes løb for at understøtte ny hardware. Dette har ført til at en stor mængde funktionalitet er
blevet lagt i et lag – kernen.
Layered approach
Indelingen af et system kan gøres på mange måder, og en af dem er lagdeling. Systemkomponenterne
implementeres som lag der lægges ovenpå hinanden. Debugging sker fra bunden, hvor man kan gå ud
fra at hardware er i orden. Dette indebærer at man altid kan lokalisere fejl, fordi laget under er
debugget og fejlfrit. Den største vanskelighed ved lagdeling er en rigtig in deling i lag. Eftersom et lag
kun har adgang til laget under er nøje planlægning vigtig. F. eks. driveren for diske må ligge lavere
end memory management, da memory management bruger diskene som virtuel memory.
Et andet problem med lagdeling er effektivivitet. Meldinger skal sendes mellem lagene og for hvert
lag skal måske parametre ændres, noget der kan føre til et mindre effektivt system
Microkernel
Efterhånden som UNIX kernen voksede sig stor i løbet af 80-årene, blev der udviklet en
modulariseret mikro kerne (Mach kernel). Alle mindre vigtige komponenter separeret fra kernen og
blev implementeret som system og bruger programmer. Mikro kernens vigtigste funktion er at skabe
kommunikation mellem klient programmerne og de andre services der kører i user space.
Communication sker ved message passing. Hvis f.eks et klient program vil have adgang til en fil, må
det henvende sig til filserveren. Dette sker aldrig direkte, men via kernen.
Fordelen med dette er at det er nemt at udbygge systemet, og ændringer i kernen bliver ændringerne
mindre fordi at kernen er lille. Mikro kernen giver også en højere sikkerhed da de fleste services kører
som bruger- istedenfor som kerne processer. Hvis en service svigter, kan resten af systemet køre
videre
Virtual machines
Begrebsmæssig er en computer bygget op lag, hvor hardware er det nederste lag. Derover ligger
kernen der bruger hardware instruktioner til at lave et sæt med systemkald. Programmer kan enten
henvende sig til hardware i form af systemkald eller harwareinstruktioner. På nogen systemer er
denne lagdeling ført ril det næste logiske skridt, nemlig virtual machines.
Ved at bruge CPU scheduling og virtuelt minde kan man det til at se ud som om hver proces har sin
egen processor med sin egen (virtuelle) memory (IBM VM operativsystem). Den fysiske computer
deler ressourcer ud på hver VM, CPU tid deles, og filsystmet skaber adgang til virtuelle printere etc.
En vanskelighed ved design af et sådant system er fordeling af diskplads. Dette løses ved at operere
med en minidisk for hver bruger ved at allokere diskplads til hver minidisk efter behov.
Implementering
Når VM skal implementeres, må der lægges meget arbejde i at sikre at der laves en nøjaktig kopi af
den underliggende maskine. VM kan køre i to modus, user mode og monitor mode. Programmer kan
kun udføres i user mode. En vsenetlig faktor er tid. En I/O operation kan tage længre eller kortere tid.
Hvis informationen der skal flyttes er spool'et bruges der meget kort tid på I/O operationer. Hvis dette
ikke er tilfælde tager I/O operationer længre tid, fordi VM skal kommunikere med hardware gennem
Datamatikeruddannelsen efterår 2005
Side 16 af 54
Notater til Teknik 1
Vidar Jon Bauge
mange led.
Hvis CPU'en skal servicere mange samtidige VM, kan systemet blive meget langsommere hvis alle
instruktionerne skal simuleres for at skabe ægte virtual machines.
Fordele
Et system med Wm har flere fordele. Hver virtuel maskine kører fuldstendig separat, noget der
eliminerer sikkerhedsproblemer. På den anden side er der heller ingen kommunikation. Dette løses
ved at flere VM kan deles om en minidisk. Dessuden er det mulig at sætte op et virtuelt netværk
mellem de virtuelle maskinerne. Vedligehold på systemet kan udøres på en virtuel maskine, noget der
giver meget lidt afbrud i driften pga vedligehold.
Virtual machines bruges i dag for at løse problemer med kompabilitet. Man kan f.eks lave en MS-Dos
virtual machine så man kan køre dos programmer under helt andre operativsystemer på en heæt anden
arkiktektur end dos er skrevet til (i386).
Java
Java består af tre grundlæggende komponenter
1. Programming language specifikation
Java kan bedst beskrives som et objektorienteret, ikke afhængig af arkitektur, distribueret og multi
trådet programmeringsprog. Java kode kompileres til class filer der består af byte code. Endvidere
kan man i java lave applets der kan køres fra en webbrowser.
2. Applikationer programming interface (API)
Javas API består af en base API og en standard extension API. Base består af understøttelse for
grundlæggende grafik, netværk, I/O og utilities. Standard extension indeholder udover dette støtte
for kommercielle produkt, sikkerhed oh media.
3. Virtual machine specifikation
JVM er specifikationer for en abstrakt computer. JVM består af en class loader og en java
interpreter der udfører byte code. Java platformen består af JVM og og Java API og kan køre
ovenpå mange forskellige operativsystemer, som en del af en web browser eller i hardware
En instans af JVM skabes for hver java program eller applet der startes, eller for hver gang en
main() metode startes. Implementationen af selve platformen er speciel for det enkelte system, men
selve java programmet kan køre på en hvilken som helst JVM.
Javas udviklings milieu består af et compile time enviroment og et run time enviroment
Datamatikeruddannelsen efterår 2005
Side 17 af 54
Notater til Teknik 1
Vidar Jon Bauge
Processer
En proces er et kørende program, enten det er et bruger program eller en tjeneste der kører på
systemet. Hvis der kører flere instanser af et program regnes alle instanserne for en selvstændig
proces.
Proces status
En proces ændrer status under kørselen. En proces' status defineres ud fra aktiviteten til processen
•
New – processen oprettes
•
Running – Processen køres
•
Waiting – Processen venter, f.eks. på fuldførelsen af I/O eller en underproces.
•
Ready – Processen er klar til at fortsætte, f.eks efter fuldførelse af I/O, og venter på CPU tid
•
Terminated – Processen er færdig og afsluttes
Diagram over proces status
Datamatikeruddannelsen efterår 2005
Side 18 af 54
Notater til Teknik 1
Vidar Jon Bauge
Proces Control Block (PCB)
Hver proces er repræsenteret i operativsystemet med en proces control block PCB, eller task control
block. PCB'en indeholder alle informationer om en proces, så de
kan bruges når processen en gang bliver læst ind for videre
Pointer
Process state
eksekvering
•
Pointer
Peger på næste PCB i ready køen
•
Process state
Status kan være new, ready, running, waiting etc
•
Process number
Program counter
Registre
Process number
Processen unikke nummer (PID)
•
Program counter
Peger på den næste instruktion der skal udføres
•
CPU Registre
Indholdet af CPU'ens indhold, dvs registre, akkumulatorer, stack
pointer etc
•
Memory limits
List of open files
:
:
CPU scheduling information
Oplysninger som processens prioritet, pegere til scheduler køer og andre parametre for
schedulering
•
Memory management information
Oplysninger om tilladt forbrug af memory, page tables etc
•
Accounting information
Hvor mange ressourcer processen har brugt, CPU tid, real time, time limits, account numbers,
underprocesser etc.
•
I/O status information
En liste over I/O enheder, åbne filer etc der er tilknyttet processen.
Process scheduling
Formålet med multi programmering er at der altid kører en proces for at maksimere udnyttelsen af
CPU'en. Målet med time sharing er at bytte mellem processer så ofte at brugere kan interagere med
programmer mens de kører. For et system med en CPU, vil kun en proces køre ad gangen, de andre
må vente til CPU'en bliver ledig så de kan rescheduleres.
Datamatikeruddannelsen efterår 2005
Side 19 af 54
Notater til Teknik 1
Vidar Jon Bauge
Scheduling queues
Eftersom processer oprettes, bliver de placeret i en job kø. Processer der befinder sig i main memory
og er klare til at blive kørt placeres i ready køen. Køen er som regel implementeret som en linked list.
En ready queue header indeholder en pointer til den første og sidste PCB. PCB'en indeholder en
pointer til næste PCB i ready køen.
Processer der venter på en I/O enhed, bliver placeret i en device queue. Hver enhed i systemet har sin
egen device queue.
En ny proces placeres i ready queue, hvor den venter på at blive dispatched, dvs blive kørt. Når
processen kører kan en af flere ting indtræffe
•
Processen anmoder om en enhed og bliver placeret i device queue
•
Processen opretter en underproces og venter på at den skal blive færdig.
•
Systemet modtager en interrupt, og processen bliver afbrudt og sendes tilbage til ready queue.
I de to første tilfælderne bliver processerne sendt tilbage til ready køen når se events de venter på er
færdige.
Schedulers
En proces flyttes mellem de forskellige scheduling køerne i løbet af sin livs cyklus. Operativsystemet
må vælge fra disse køerne. Denne udvælgelsen foretages af en scheduler. Man taler om tre typer
schedulers
1. Short term scheduler
Tager processer fra ready køen og dispatcher dem. Denne scheduleren må arbejde så hurtig som
mulig, da den skal dispatche mange processer pr sekund – kører mindst en gang pr 100
millisekund. Jo længere tid et context switch tager, jo mere CPU tid bruges på context switch i
stedet for de opgaver CPU'en skal løse
2. Long term scheduler
Vælger processer fra alle åbne processer, loader dem i memory og sætter dem i ready køen. Denne
scheduleren behøver ikke at være så hurtig, da den ikke skal køre så ofte. Udvælgelsen af processer
er imidlertid meget vigtig her. Der skal altid være en blanding af processor tunge og I/O tunge
processer i ready køen. Hvis der bliver ubalance her, får man en ophobning enten i ready køen eller
device køerne.
3. Intermediate scheduler
Nogle operativsystemer har en intermediate scheduler. Dennes opgave er at flytte processer fra
memory til til sekundært memory for at mindske graden af multi programmering (swappe). Når
aktivitet på systemet bliver lavere, flyttes processerne tilbage til memory så de kan køre færdig.
Swapping kan være nødvendig for at balancere processerne i køen, eller frigive memory hvis dette
er nødvendig
Datamatikeruddannelsen efterår 2005
Side 20 af 54
Notater til Teknik 1
Vidar Jon Bauge
Context switch
Det at skifte den kørende proces indebærer at alle data omkring den kørende proces skal gemmes, og
den nye processen loades. Dette gælder alle data, indhold i registre, pointere, status etc. Disse data
gemmes i processens PCB blok. Dette er en context switch.
Tiden en context switch tager er afhængig af hardware understøttelse. SPARC processoren har flere
sæt registre, og context switch sker ved at ændre en pointer. Hvis der er flere processer end register
sæt, kan context switch selvfølgelig ske på den ”konventionelle måde”.
Process creation
En proces kan, ved hjælp af systemkaldet create proces starte flere nye processer. Processen der
skaber en ny proces kaldes parent og den nye processen kaldes child. Hver proces behøver ressourcer
i form af CPU tid, memory, filer, I/O enheder etc. For nogle systemers vegne tildeles child processer
ressourcer fra parents egne ressourcer. På denne måden kan man begrænse antal child processer pr
proces og på den måden forhindre overbelastning af systemet.
Der er også forskel i måden systemer opretter nye processer på. Nogen systemer laver en kopi af
parent processen der så kan overskrives med et andet program, mens andre starter en ny proces med
program navn.
Process termination
En proces afsluttes normalt efter udførelsen af sidste instruktion ved at processen beder om at blive
slettet ved hjælp af systemkaldet exit. Hvis processen skal returnere data til parent proces sker dette
ved systemkaldet wait.
En proces kan stoppe en anden proces med systemkaldet terminate, men dette er som regel begrænset
til at parent processer kan standse en child proces. Mange systemer tillader ikke child processer at
køre videre hvis parent processen bliver afsluttet – cascading termination.
Cooperating processes
Parallelt kørende processer kan være samarbejdende eller uafhængige. En proces er uafhængig hvis
den ikke kan påvirke eller blive påvirket af andre processer. Uafhængige processer kan heller ikke
udveksle informationer. Samarbejdende processer kan både påvirke hinanden og udveksle
informationer. Dette kan være nødvendig af bl.a. følgende årsager:
•
Udveksling af information Eftersom brugere kan ønske at dele en ressource, f.eks. en fil må man
sørge for samtidig adgang
•
Hastighed Hvis nogle opgave skal kunde afvikles hurtigere, må kan dele den ud på flere processer.
Dette kan dog kun gøres hvis systemet har flere CPU'er eller I/O kanaler
•
Modularitet Man kan ønske at dele systemet op i moduler hvor man deler system funktioner ud til
flere processer.
•
Praktisk En enkel bruger er interesseret i at udføre flere opgaver samtidig, f.eks editere, printe og
kompilere samtidig.
En måde processer kan samarbejde på er ved producer-consumer modellen. En proces producerer
data som bruges af en anden, f.eks et print program der producerer tegn der sendes videre til printer
Datamatikeruddannelsen efterår 2005
Side 21 af 54
Notater til Teknik 1
Vidar Jon Bauge
driveren. For at gøre dette muligt, må man have en buffer, som produceren fylder og consumeren
henter data fra. Producer og consumer må være synkroniseret så consumer ikke kan hente data før de
er produceret Unbounded producer-consumer lægger ingen begrænsninger på bufferens størrelse,
noget der er tilfælde ved bounded producer-consumer. I dette tilfælde må produceren vente hvis
bufferen er fuld og consumeren må vente hvis bufferen er tom.
Datamatikeruddannelsen efterår 2005
Side 22 af 54
Notater til Teknik 1
Vidar Jon Bauge
Tråde
En tråd kaldes også en lætvegts-proces og er en enhed der udnytter CPU'en. En tråd har sin egen
thread ID, program counter, et register sæt og en stack. Den deler, sammen med andre tråde, sin kode
sektion, data sektion og ressourcer, som åbne filer og signaler, der tilhører den processen dr har
oprettet dem.
Mange applikationer benytter tråde til forskellige formål. En net læser kan have en tråd til at vise
indholdet på skærmen, en til at hente data fra netværket osv. Applikationer der skal køre mange
instancer af en opgave samtidig kan benytte tråde til dette. F.eks. en web server der servicerer mange
samtidige brugere.
Da Java ikke understøtter asynkron behandling, bruger man tråde i Java for at få samtidig udførsel af
opgaver.
Fordele
1. Responsiveness
Multithreading af interaktive applikationer tillader programmet at køre videre selvom det pålægges
tunge eller tidkrævende operationer. Dette giver en hurtigere responstid.
2. Deling af ressourcer
Tråde deler de ressourcer der er allokeret til den proces der har oprettet dem. Deling af kode
tillader en applikation at have flere tråde i samme adresse rum.
3. Økonomisk forbrug af ressourcer
Allokeringaf memory og ressourcer er kostbart. Eftersom tråde deler ressourcer er de mere
økonmiske og hurtigere i context switch. I Solaris tager en context switch ca 30 gange så lang tid
som at oprette en tråd.
4. Udnyttelse af multi processor arkiktektur
Hver tråd kører på en parallelt på hver sin processor. På en single processor arkitektur byttes det så
hurtig mellem tråde at det ser ud som om de kører parallelt, selvom bare en kører ad gangen.
User og kernel tråde
User threads
User threads understøttes udenom kernen i form af biblioteker.Drmed er du hurtige at oprette, men
hvis kernen er single threaded vil en låst tråd betyde at systemet bliver låst.
Kernel threads
Kernel threads er direkte understøttet af kernen, både oprettelse, schedulering og kontrol. Dette gør
kerne tråde langsommere at oprette og køre. Hvis en tråd bliver blokkeret, kan kernen schedulere en
anden.
Datamatikeruddannelsen efterår 2005
Side 23 af 54
Notater til Teknik 1
Vidar Jon Bauge
Multi threading models
Der findes 3 modeller for multi threading: Many to one model, One to one model og many to many
model.
Datamatikeruddannelsen efterår 2005
Side 24 af 54
Notater til Teknik 1
Vidar Jon Bauge
Tråde i Java
Alle Java programmer består af mindst en tråd, der startes med main() metoden.
Der er to måder at oprette tråde i Java
1. Oprette en klasse der er en underklasse til Thread klassen i Java. For at oprette selve tråden
oprettes et objekt af klassen. Kald af metoden start() sætter tråden i ready køen, hvor den vil blive
kørt.
2. Oprette en klasse der implementeret Runnable interfacet. For at oprette selve tråden oprettes et
objekt af klassen. Derefter oprettes en tråd (Objekt af klassen Thread) der tager vore nye objekt der
implemementerer Runnable som parameter. Kald af metoden start() sætter tråden i ready køen,
hvor den vil blive kørt.
Tråd behandling
Java tilbyder bl.a. følgende API for behandling af tråde:
•
suspend() - Deprecated. Standser den kørende tråd.
•
sleep(int tidsperiode) Standser den kørende tråd i en given tidsperiode
•
resume() - Deprecated Genstarter en suspenderet tråd.
•
stop() - Deprecated Standser kørselen af en tråd. En tråd der er blevet standset med stop(), kan ikke
genstartes med resume() eller start().
En tråds tilstande
1. New
Dette er den tilstand en tråd er i
når den er oprette ved hjælp af
new().
2. Runnable
Når start() kaldes, bliver der
allokeret memory i JVM for den
nye tråden og tråden run() metode
bliver kaldt. JVM skelner ikke
mellem en tråd der skal til at kør
og en tråd der kører. En kørende
tråd er stadigvæk i status
runnable.
3. Blocked
En tråd blokkeres hvis der kaldes
en kommando for dette, dvs.
suspend() eller sleep(). En I/O
operation der afbryder tråden gør også tråden blocked.
4. Dead
En tråd går over til status dead enten ved kald af stop() metoden eller fordi trådens run() metode er
Datamatikeruddannelsen efterår 2005
Side 25 af 54
Notater til Teknik 1
Vidar Jon Bauge
færdig.
Tråde i JVM
I tillæg til Java programmer med forskellige tråde, kører JVM flere asynkrone tråde der står for JVM's
systemopgaver. Dette er tråde til f.eks
•
Garbage collection
•
Timeren, der f.eks. tæller cyckler til sleep() metoden
•
En der tager sig af grafiske hændelser, som klik på en knap i et vindue etc.
Nogle tråde oprettes eksplicit af Java programmet andre af JVM.
JVM og værtens operativsystem
JVM implementeres vanligvis ovenpå operativsystemet. Dette gør det mulig for JVM at skjule
detaljerne omkring implementeringen pådet specifikke operativsystem og skabe et konsistent og
abstrakt miljø der tillader Java programmer at køre på enhver platform der understøtter Java.
Specifikationerne til JVM siger ikke noget om hvordan tråde implementeres i det underliggende
system. Dette bestemmes for hver platform JVM implementeres på. En Java tråd er typisk en user
level tråd, hvor JVM er ansvarlig for kontrol af den.
Wndows NT bruges one-to-one modellen, hvorfor JVM på Windows NT knyttes til en kerne tråd.
På Solaris implementeres JVM som many to many
Datamatikeruddannelsen efterår 2005
Side 26 af 54
Notater til Teknik 1
Vidar Jon Bauge
CPU Scheduling - Basic concepts
Formålet med multiprogramming er at holde en af processerne kørende hele tiden for at sikre
maksimal udnyttelse af CPU'en. I et system med en CPU, kan kun en proces køre om gangen, mens
de andre er i kø. En proces kører indtil den er nødt til at vente på noget, f.eks. at en I/O operation skal
blive færdig. I et simpelt system ville CPU'en vente – dvs at CPU til vil gå til spilde. Med multi
programmering vil en anden proces blive startet i ventetiden. Flere processer gemmes i memory og er
klare til at blive kørt – hver gang en proces må vente, står en anden klar til at blive kørt
CPU-I/O burst cycle
En proces kører normalt i cykler, der veksler mellem CPU tid, CPU burst, og IO, IO burst. En
kørende proces veksler mellem mange korte CPU bursts og færre, men længere IO bursts.
load
vent
store increment
vent
load store
store
på IO
index
på IO
add store
read from file
CPU burst
write to file
I/O burst
CPU burst
....
read from file
I/O burst
CPU burst
....
CPU scheduler
Når CPU'en bliver ledig, henter operativsystemet en proces fra ready køen. Der findes mange
alhoritmer for udvelgelse af processer, men der er CPU schedulerens opgave at vælge en proces.
Preemptive scheduling
CPU scheduling finder sted under følgende omstændigheder:
1. Den aktive proces går til wait status, f.eks. for at vente på I/O eller at en child proces skal blive
færdig.
2. Når en proces går fra running til ready, f.eks. fordi der kommer et interrupt.
3. Når en proces går fra wait til ready, f.eks. fordi at en I/O operation er færdig.
4. Når en proces afsluttes.
For punkt 1 og 4 er der ikke tale om preemptive scheduling, men nonpreemptive eller cooperative
scheduling, en ny proces må scheduleres.
For punkt 2 og 3, er der imidlertid flere muligheder. Under nonpreemptive scheduling vil en kørende
proces køre indtil den bliver afslutte eller går over i wait tilstand. Under preemptive scheduling bliver
an proces afbrudt for at give plads til andre ventende processer. Dette er en vanskeligere opgave, da
den kræver at en proces bliver afbrudt i det rigtige øjeblik. En proces må f.eks. ikke kunde afbrydes
mens den opdaterer vigtige systemdata som f.eks en I/O kø.
Dispatcher
En anden vigtig komponent ved CPU scheduling er dispatcheren. Dette er den modul som overgiver
Datamatikeruddannelsen efterår 2005
Side 27 af 54
Notater til Teknik 1
Vidar Jon Bauge
kontrollen til den proces der valgt til at blive kørt. Dette indebærer følgende operationer:
•
Switching context
•
Skift til user mode
•
Gå til det rigtige sted i programmet og start det på nyt.
Dispatcheren må være så hurtig som mulig eftersom det køres for hver gang der skiftes proces. Tiden
det tager dispatcheren at stoppe en proces og starte den nye kaldes dispatch latency.
Schedulerings alogritmer
First come, First-served
Dette er den enkleste af alle algoritmer. Den processen der beder om CPU'en først, får den allokeret
først. F.eks. hvis man har en CPU tung proces og mange I/O tunge, vil den ene holde processoren for
de andre.
Shortest job first scheduling
Denne algoritmen beregner længden på processernes næste CPU burst, og den processen med den
mindste allokeres CPU tid. Denne algoritmen giver mindst ventetid, da den gennemsnitlige ventetid
går ned. Det største problemet med denne algoritmen er at beregne længden på næste CPU burst.
Priority Scheduling
SJFS-algoritmen er en variant af denne. En prioritet tilknyttes hver proces, den proces med højest
prioritet allokeres CPU tid. En SJFS-algoritme er bare en prioritet algoritme hvor næste CPU burst er
en omvendt prioritet.
Prioritets scheduling kan både være preemptive eller non-preemprive. Når en proces kommer i køen
sammenlignes dennes prioritet med de øvrige. Hvis den nye processen har højere prioritet end den der
kører, kan den kørende blive afbrudt til fordel for den nye.
Et problem med prioritet scheduling er indefinite blocking eller starvation. Dette kan løses ved
aging. Dette er en teknik hvor man gradvis øger processers prioritet, så de ikke bliver liggende i kø i
det uendelige.
Round-Robin scheduling
Denne algoritmen er udviklet specielt til time-share systemer. Den ligner FCFS, men der er lagt til
preemption, så der kan skiftes mellem processerne. RR scheduling må ha en proces kø der er en FIFO
kø. Scheduleren vælger den første på listen. Hvis denne kun varer en ”tidsenhed” bliver den kørt, men
hvis den varer længre, bliver den afbrudt med et interrupt og den næste i køen bliver scheduleret. Den
afbrudte proces placeres så bagerst i køen.
Datamatikeruddannelsen efterår 2005
Side 28 af 54
Notater til Teknik 1
Vidar Jon Bauge
Proces synkronisering
Samarbejdende(Cooperating) processer
En samarbejdende proces er en proces der påvirkes af andre processer. Samarbejdende processer kan
enten dele data direkte i memory (kode og data) eller indirekte gennem filer. Samtidig adgang til data
kan forårsage inkonsistente data.
Producer - consumer
En måde for processer at samarbejde, er ved producer – consumer, hvor en proces leverer data til en
anden. Dette giver følgende algoritmer:
Consumer:
Producer:
while (count == 0) {
//no op
}//end while
while (count == BUFFER_SIZE) {
//no op
}//end while
--count;
++count;
Selvom disse algoritmerne er korrekt hver for sig, vil de ikke fungere korrekt når de kører samtidig i
hver sin proces. Det der kan ske er at både consumer og producer prøvet at opdatere bufferen samtidig
Da disse operationerne ikke bliver udført atomisk, dvs at alle assembler instruktionerne ikke bliver
fuldført, kan man risikere en race condition.
register1 registe count
r2
S0
producer
execute
register1 = count
5
S1
producer
execute
register1 = register1 + 1
6
S2
consumer
execute
register2 = count
5
S3
consumer
execute
register2 = register2 - 1
4
S4
producer
execute
count = register1
6
S5
consumer
execute
count = register2
4
Ifølge ovenstående ender count op med at registrere 4 buffere, hvor det rigtige er 5, Hvis S4 og S5
byttes om vil count vise 6. Denne situationen, hvor resultatet er afhængig af rækkefølgen
operationerne udføres på kaldes en race condition.
Datamatikeruddannelsen efterår 2005
Side 29 af 54
Notater til Teknik 1
Vidar Jon Bauge
Kritisk område (Critical section)
Det første man gør for at kontrollere adgangen til delte ressourcer, er at oprette kritiske områder, og
regulerer adgangen til disse – Hver tråd har et kode segment der er kritisk, hvor man ændrer på fælles
variabler, opdaterer en tabel, skriver til en fil etc. Udførelsen af dette kritiske segment kan kun gøres
af en tråd, og mens denne gør dette er alle de andre udelukket fra at arbejde på de fælles data. Dette
kaldes mutual exclusion.
Løsningen på problemet omkring kritisk område må indeholde 3 krav:
5. Mutual exclusion
Når en proces arbejder i sit kritiske området er alle andre tråde/processer udelukket fra de fælles
data der arbejdes på.
6. Fremgang
Hvis ingen tråde er i sit kritiske område, og der er nogle tråde der venter på at komme ind i sit
kritiske område, kan kun de tråde der ikke er i sit kritiske område bestemme hvilken tråd der må
komme ind i sit kritiske område. Denne beslutningen kan ikke udskydes i det uændelige.
7. Begrænset ventetid
Det er begrænset hvor mange gange andre tråde må komme ind i sit kritiske område efter at en tråd
har bedt om adgang for sit kritiske område. Dette er for at undgå starvation (udsultning).
Semaforer
En anden løsning på problemet med kritiske områder er brug af semaforer. En semafor er en integer
eller boolean variabel der udover initialisering kun tilgås af 2 meroder, P og V. P står for probieren og
V for verhoegen.
Probieren:
Verhoegen:
P(S) {
V(S) {
while S <= 0
;//Do nothing
S--;
}//End P
S++;
}//End V
Modifikation af integer værdien til semaforen i P og V må ændres individuelt, dvs at kun en tråd har
adgang til semaforen ad gangen. I tillæg må test af værdien i P(S) og den mulige ændring i S-- også
foregå uden indblanding fra andre tråde.
Brug
Semaforer implementeres enten som en integer eller en boolean, eller en semafor der tæller eller er
binær. Værdien til en semafor der tæller kan enten ligge inde i en fastsat
En semafor bruges på følgende måde:
Semaphore S; initialiser semaforen
P(S);
Datamatikeruddannelsen efterår 2005
Side 30 af 54
Notater til Teknik 1
Vidar Jon Bauge
Kritisk kode
V(S)
Den største ulempen ved semaforer er at de alle kræver CPU cykler mens de venter. Derfor kaldes
disse semaforer også for spinlocks. Dette kan løses ved at ændre på semaforens P(S) metode, så i
stedet for at køre en uændelig løkke, blokkeres tråden. Dermed flyttes tråden over i en vente kø (wait
queue). Denne tråde bliver startet igen ved at en af de andre trådene, der er færdig i den kritiske
sektion, sender et wakeup signal til en af, eller alle processerne i vente køen.
Så bliver henholdsvis P(S) og V(S) seende sådan ud:
Probieren:
Verhoegen:
P(S) {
V(S) {
while S <= 0 {
add process to queue;
thread.wait();
}
S--;
}//End P
S++;
if(S <= 0) {
remove process from queue
thread.notify(); eller
notifyAll();
}
}//End V
Kaldet af wait() metoden i P(S) sætter tråden i vente status. Så kan den overføres til en vente kø, der
enkelt kan implementeres ved at lave et link field i trådens PCB blok. En måde at implementere køen
på, er ved en FIFO liste hvor første og sidste tråd er lænket til hverandre. En korrekt implementation
af semaforer er imidlertid ikke afhængig af hvordan køen er implementeret.
Det er meget vigtig ved brug af semaforer at den kritiske koden bliver udført atomisk, dvs at alle
CPU instruktionerne i den kritiske koden bliver udført. På et system med en CPU kan man bare
standse interrupts men den kritiske kode køres. På et system med flere CPU'er må man imidlertid tage
specielle forholdsregler.
Deadlocks and starvation
Implementering af en semafor med ventekø kan føre til at to eller flere processer venter på en event
som bare kan skabes af en af de andre ventende processer. Dette kaldes en deadlock.
Hvis 2 processer, P0 og P1, tilgår hver semaforene s og q som vist i tabellen,
kommer processerne til at vente på hinanden. De er begge i wait status, men
begge venter på at den anden skal slippe låsen på hhv. semafor s og q. Et andet
problem der kan opstå ved brug af semaforer er starvation eller indefinite
blocking, hvis en proces bliver stående uendelig i wait køen fordi den ikke kan
få tilgang til den ressource den venter på.
Dining philosopher
Dining philosopher problematikken kan løses ved hjælp af semaforer, men
dette er ikke tilfredsstillende, da den kan føre til deadlock hvis alle filosofferne
Datamatikeruddannelsen efterår 2005
P0
P1
P(s)
P(q)
P(q)
P(s)
....
....
....
....
V(s)
V(q)
V(q)
V(s)
Side 31 af 54
Notater til Teknik 1
Vidar Jon Bauge
bliver sultne samtidig. Dette kan undgås hvis man:
•
Tillader maks 4 filosoffer ved bordet samtidig
•
Kun tillader en filosof at tage en spisepind hvis begge er ledige
•
Asymmetrisk løsning: Filosof med uligt nummer tager først den højre, men med lige nummer tager
først den venstre.
Fejl brug af semaforer
•
V() - kritisk kode – P() Hvis man bytter om på metodekaldene, så man kalder V() før P(), kan
man risikere at flere processer udfører sin kritiske kode samtidig
•
P() - kritisk kode – P() Hvis man kalder P() i stedet for V(), så rækkefølgen bliver P() - kritisk
kode – P(), får man en deadlock, da låsen aldrig bliver frigivet
Monitorer
For at undgå sådanne problemerhar man i stedet for udviklet monitorer i høj niveau sprog. Monitoren
er konstrueret sådan at kun en proces kan gå ind i den om gangen. Dermed behøver programmøren
ikke at kode synkroniseringen – den er implementeret i selve monitoren.
•
En monitor har et sæt definerede operationer der giver gensidig udelukkelse inde i monitoren, dvs
der kan kun være en tråd inde i den ad gangen
•
Monitoren indeholder et sæt status variabler der definerer hvilken tilstand dets objekt befinder sig
i, f.eks. om det er låst
•
En metode der er defineret inde i en monitor kan kun tilgå de variabler der er erklæret lokalt inde i
monitoren. Alle andre variabler skal sendes med som variabler.
Man kan definere sine egne betingelser inde i en monitor. Hver betingelse får sin egen vente kø.
Adgangen styres ved hjælp af metoder – x.wait flytter en proces over i vente køen, x.signal starter en
proces i køen. Den grundlæggende forskel i Javas implementation afmonitorer er at i Java er der kun
en vente kø.
Datamatikeruddannelsen efterår 2005
Side 32 af 54
Notater til Teknik 1
Vidar Jon Bauge
Java synkronisation
En applikation der sikrer konsistens i data selvom om flere processer tilgår dem kaldes thread safe.
Synkronisering i Java lever op til dette.
Bounded Buffer
Bounded Buffer lider af 2 problemer
1. Både producer og consumer bruger busy wait loops hvis bufferen er hhv fuld eller tom
2. Der er fare for race condition eftersom både producer og consumer bruger count
Busy waiting
Busy wait loop bruger CPU tid bare på at vente. Dette kan forhindres ved at kalde metoden
Thread.yield().
Både brug af yield() og busy wait kan forårsage en deadlock pga. JVM's måde at proritere tråde på.
JVM vil alltid sikre at tråden med højest prioritet bliver startet først. Hvis produceren harhøjest
prioritet og bufferen er fuld, vil produceren måtte vente til en anden tråd med samme prioritet kan
hente noget ud fra bufferen. Hvis consumeren ikke har dette, får man en deadlock.
Race condition
For at undgå race condition – og busy waiting – har Java en særlig beskyttelse af kritisk kode. Ved at
erklære koden synchronised, sørger man for at objektlåsen bliver sat når en tråd går ind i den kritiske
koden.
Hvert Java objekt er
associeret med en
Datamatikeruddannelsen efterår 2005
Side 33 af 54
Notater til Teknik 1
Vidar Jon Bauge
objektlås. En tråd skal have denne for at udføre kritiske kode, og ingen andre tråde har adgang til
koden end den tråd der har låsen.
Hvert objekt har så et entry set af objekter der venter på låsen, og dermed adgang til koden. Objekter
har også et wait set, med de tråde der venter på at få låsen.
En deadlock kan stadig opstå hvis f.eks. en producer prøver at skrive til en fuld buffer og man bruger
yield() til at sætte tråden i wait status. Deadlock kan opstå fordi yield() kun starter endre tråde uden at
frigive låsen.
Løsningen på problemet er at bruge Thread.wait() metoden, der både flytter tråden til wait køen og
frigiver låsen. Nu er tråden tilgængelig for consumer tråden, men denne er blocked, og står i wait
køen.
Derfor har Java en metode Thread.notify() der flytter en tilfældig tråd fra wait til entry og forandrer
dens status fra blocked til running. Alternativt har Java en notifyAll() metode der ”vækker” alle
trådene i wait køen.
Datamatikeruddannelsen efterår 2005
Side 34 af 54
Notater til Teknik 1
Vidar Jon Bauge
Deadlocks
Når flere processer skal have adgang til et begrænset antal ressourcerkan opleve at en proces går over
i wait status og ikke kan komme ud af den igen. Det kan den ikke fordi at en anden ptoces holder på
ressourcen, men kan ikke komme videre f.eks. fordi at den venter på at den første proces skal fuldføre
sin opgave. Dette er en deadlock.
Ressourcer:
•
Fysiske: Memory, CPU cykler, I/O enheder, printer
•
Logiske: Filer, objekt lås, monitors
System model
Et system består af et begrænset antal ressourcer. En proces' brug af en ressource sker i følgende
stadier:
•
Request: Hvis en ressource ikke kan tildeles med det samme, må processen vente til den bliver
ledig.
•
Use: Processens brug af ressourcen
•
Release: Processen frigiver ressourcen.
Et sæt af processer er i deadlock når hver proces i sættet venter på en event der kun kan udføres af en
anden proces i sættet.
Deadlock characterization
Betingelser der skal opfyldes
1. Mutual exclusion: Mindst en proces må være i en tilstand hvor den bruger en ressource der ikke
kan deles, så en anden proces må vente hvis den vil bruge ressourcen
2. Hold-and-wait: Der må findes mindst en ressource der holder på mindst en ressource, og venter
på en anden der holdes af en anden proces.
3. Ingen preemption: En ressource kan ikke fratages en proces. Processen holder på ressourcen
indtil den selv frigiver den, f.eks. ved terminering eller processen går over i wait tilstand.
4. Cirkulær venting: Der må eksistere et sæt af ventende processer, hvor P0 venter på en ressource
som holdes af P1. P1 venter på en ressource som holdes af P2 osv
Datamatikeruddannelsen efterår 2005
Side 35 af 54
Notater til Teknik 1
Vidar Jon Bauge
Ressource allokerings graf
En ressourceallokeringsgraf viser hvilke ressourcer, eller
instancer af ressourcer der er tilknyttet hvilke processer. Hvis
grafen ikke viser nogle cykler er der ikke deadlock. Hvis hver
ressource bare har en instans, viser en cyklus at der er opstået
en deadlock
Metoder til at håndtere deadlocks
Deadlock
Der er principielt tre måder at undgå deadlocks på:
1. En protokol der sikrer at systemet aldrig går ind i en
deadlock
2. Man kan tillade at deadlocks opstår og så tage systemet ud
af den
3. Ignorere problemet, og lade som om deadlocks aldrig opstår
Bruges af de fleste operativsystemer inklusive bl.a. Unix og
Java Virtual Machine
Undgåelse af deadlocks
Uden deadlock
Dette er ikke muligt da det kræver at man kan forudse hvilke
ressourcer processerne kommer til at få brug for.
Forebyggelse af deadlocks
Man kan forebygge deadlocks ved at undgå de fire forudsætninger for at en deadlock skal kunde opstå
1. Mutual exclusion: Undgå at bruge mutual exclusion hvor dette ikke er nødvendig, f.eks. ved
åbning af read only ved læsning af filer. Ellers er dette er ikke mulig i praksis, da der alltid vil være
nogle ressourcer der ikke kan deles, som printere eller synkroniseringsmetoder
2. Hold-and-wait: For at undgå dette må man garantere at en proces ikke beder om flere ressourcer
mens den holder på andre ressourcer. En måde at sikre dette på kan være ved at processer beder om
alle ressourcer de trenger før den begynder, eller at en proces der allerede har en ressource ikke
bede om flere. Et problem med dette er imidlertid at det kan være svært at foudse hvad den skal
bede om. I tilæg kan dette medføre at en proces holder på en ressource unødigt længe. I tilæg kan
dette føre til starvation hvis en proces har stort behov for en populær ressource.
3. Ingen preemption: Hvis en proces, der allerede holder en ressource, beder om en til der ikke er
ledig, så bliver alle processens ressourcer preempted. Dvs. at processen fratages alle sine
ressourcer og kan kun startes igen når den får dem tilbage, plus den ønskede ressource. Dette kan
kun gøres med ressourcer der kan afbrydes og startes igen dvs CPU registre og memory space.
Dette er ikke muligt for hardware enheder og objekter, da de kan blive inkonsistente
4. Cirkulær venting: En metode til at undgå cyklisk venting på er at nummerere alle ressourcer og
kræve at en proces beder om en ressource i strigende orden. Har en proces fået tildelt enressource
med nummer 3, kan den ikke få ressource med nummer lavere end 3.
Datamatikeruddannelsen efterår 2005
Side 36 af 54
Notater til Teknik 1
Vidar Jon Bauge
Memory
Med CPU schedulering kan et system køre mange processer på en gang for at øge dets effektivitet.
Dette kræver at der er mange processer i memory samtidig – shared memory
Adresse binding
Før et program kan blive kørt, kommer det over i input queue, hvor det venter på at blive indlæst i
memory. Compileren binder symbolske adresser til relative adresser, feks. Block start + 14 i memory.
Linkeren binder disse til absolutte adresser i memory. Adresse binding kan ske på 3 tidspunkter:
•
Compile time: Absolut kode, programmet skal befinde sig på et bestemt sted i memory når det
køres. For at forandre på dette skal der rekompileres
•
Load time: Relocatable code. Adresserne kan ændres ved at reloade programmet.
•
Execution time: Binding udsættes til run time. Dermed kan processen flyttes under kørsel. Dette
kræver speciel hardware, og er den mest anvendte metode.
Logisk/Fysisk adresse rum
En adresse der er generet af CPU'en omtales
vanligvis som en logisk adresse, hvor i mod en
adresse i selve RAM klodsen, som den ses af
memory unit, betegnes som en fysisk adresse.
Ved adresse binding på compile time og load
time, får man et miljø hvor de logiske og fysiske
adresser er de samme. Ved binding på execution
time er der forskel på logiske og fysiske
adresser.
Logisk adresserum
Dette er den samlede mængde adresser som et
program generer. Disse adresserne er de eneste
CPU'en kan se. Dette kræver speciel harrware
understøttelse (MMU)
Fysisk adresserum
Den samlede mængde fysiske adresser der svarer til det logiske adresserum. Der er mange forskellige
algoritmer der kan udføre denne mapping.
Datamatikeruddannelsen efterår 2005
Side 37 af 54
Notater til Teknik 1
Vidar Jon Bauge
Paging
Paging er en
metode for
memory
allokering der
tillader at det
fysiske
adresserum til
en proces ikke
behøver at
ligge
fortløbende i
det fysiske
adresserum.
Hver adresse
der generes af
CPU'en består
af et page
nummer og en
page offset. Page number bruges som en indeks til en page table. Page table indeholder den første
adressen til hver side i fysisk memory. Denne adressen og page offet sendes til memory unit der finder
den fysiske adressen. Størrelsen på pages er defineret af hardware, og er vanligvis mellem 512 byts og
16Mb og er et tal ophøjet i 2.
Frames (pageframes)
Den fysiske memory er delt op i blokke af fast længde, kaldet frames. Størrelsen er afhængig af hw
Pages
Den logiske memory er delt op i pages af samme størrelse som frames
Pagetable
En tabel der viser hvilke pages der ligger i hvilke frames i den fysiske memory. Når der ikke er virtuel
memory er pagetabellen 1:1.
Når en proces skal afvikles bliver dens pages loadet ind i tilgængelige frames. Alle adresser der bliver
genereret af CPU'en bliver delt op i 2 dele: Page number der er et index nummer i page tabellen og
page offset der viser hvor langt ind i den aktuelle page man skal.
Den største fordelen ved paging er at der ikke opstår ekstern fragmentering. Enhver ledig frame kan
tildeles en proces.
Af ulemper kan så nævnes intern fragmentering, da pages har en fast størrelse, og man ikke alltid kan
udnytte hele pagen. Dette kan til en vis grad reduceres ved at bruge mindre pages, men dette vil
reducere acces tid, da flere pages skal flyttes med mer tid til I/O operationer
Paging nedsætter context-switch time. Da operaivsystemet opretter en kopi af processens page table,
skal denne læses ind ved contex-switch.
Datamatikeruddannelsen efterår 2005
Side 38 af 54
Notater til Teknik 1
Vidar Jon Bauge
Frame tabel
Opeerativsystemet må have informationer om alle tilgængelige frames i memory. Ikke bare dem der
optræder i en proces' page table. Disse informationerne gemmes i frame table. Her gemmes
informationer om hver frame i memory. Tabellen viser om de er frie, og hvis ikke, hvilken proces de
er tilknyttet.
Datamatikeruddannelsen efterår 2005
Side 39 af 54
Notater til Teknik 1
Vidar Jon Bauge
Virtual memory
Virtual memory er en teknik der tillader kørsel af processer der ikke kan være i memory. Virtual
memory får main memory til at fremstå som en stor lagringsplads, der separerer logisk memory fra
fysisk memory. Denne teknikken frigør programmører fra begrænsninger i memory.
Virtual memory er imidlertid vanskelig at implementere, og kan føre til nedsættelse af performance
hvis det bruges forkert.
Instrukser må være i memory for at kunde blive udført. For at reducere forbruget af memory kan man
anvende dynamic loading. Dette er muligt bl.a. af følgende grunde:
•
Programmer kan have rutiner til fejlbehandling der sjeldent bruges
•
Store tabeller med data er ofte allokeret mere memory end der faktisk bruges
•
Nogle funktioner i et program bruges sjældent
Fordele ved dynamic loading:
•
Et program er ikke begrenset til størrelsen af fysisk memory
•
Flere programmer kan køre samtidig, noget der optimerer udnyttelsen af CPU'en
•
Der bruges mindre I/O på at swappe processer ind og ud
Virtual memory er adskillelse af logisk memory fra fysisk memory. Denne opdelinger betyder at en
stor virtual memory stilles til rådighed selvom man bare har begrænset fysisk memory.
Virtual memory implementeres ofte som demand paging, men kan også implementeres som et
segmentation system. Demand segmentation er imidlertid mere komplekst, da segmenter har
variabel størrelse.
Demand paging
Ett system med demand paging ligner til en vis grad et demand system med swapping. Processer
gemmer i secondary memory, vanligvis en disk. Når en proces skal udføres, bliver den swappet ind i
memory. Istedenfor at swappe hele processen, bruges en lazy swapper. En lazy swapper swapper
aldrig en page ind i memory uden at den skal bruges.
En swapper behandler en hel proces i modsætning til en pager, der kun behandler pages.
Begreber
Når en proces skal swappes ind i memory gætter pageren hvilke pages der skal bruges. For at gøre
dette muligt, må man have hardware support der kan skelne mellem hvilke pages der er i memory og
hvilke der ligger på disken.
Dette kan gøres ved valid-invalid bit der sættes i en pages opføring i page table.Hvis denne er sat til
invalid betyder det at pagen enten ikke ligger i processens logiske adresse rum eller at pagen ligger på
disken. Når man prøver at tilgå en page der er invalid, udløses en page-fault trap. Proceduren for at
håndtere dette er som følgende:
•
Kontroller tabellen i PCB for at fastslå om referencen er gyldig eller ugyldig
•
Hvis referencen er ugyldig bliver processen afbrudt. Hvis den er gyldig skal pagen hentes ind.
Datamatikeruddannelsen efterår 2005
Side 40 af 54
Notater til Teknik 1
Vidar Jon Bauge
•
Der findes en ledig frame, f.eks. i free frame list
•
Der sceduleres en disk operation for at hente pagen ind
•
Når disk operationen er fuldført bliver tabellen og page table modificeret så den viser at page er i
memory
•
Processen startes igen ved deninstruktion den blev afbrudt fra.
Pure demand paging
En proces startes uden at nogen pages er læst ind – ingen pages bliver læst ind for de skal bruges.
Dette kan føre til meget langsom kørsel, hvis der skal indlæses mange pages med instruktioner og
data.
Nødvendig hardware support
1. Page table: Tabellen kan indikere om en page er gyldig eller ikke ved hjælp af en valid-invalid bit
eller et sæt af protection bits.
2. Secondary memory: Her placeres de pages der ikke er i primær memory. Sekundær memory er
ofte på en high speed disk, swap device. Den delen af disken der bruges til dette kaldes swap space
eller backing store.
I tillæg til harware support kræves en betydelig mængde software, bl.a. til at starte processen igen
efter en page fault
Hvis en page fault optræder på en fetch instruktion, kan man bare restarte ved at starte fetch igen.
Men hvis en page fault opstår under fetch af en operand, må man først fetch'e og decode
instruktionen, så fetch'e operanden.
Page replacement
Kørsel af flere processer samtidig, kan føre til over allokering af memory hvis hver proces får tildelt
f.eks. 10 pages men bare bruger 5. Dette kan demand paging reducere, så der bliver plads til flere
processer. Hvis en proces så beder om mange pages, og alle ledige frames er brugt, og der ikke er
mere ledig plads i memory kan der gøres flere ting:
•
Processen lukkes med en fejlmeddelse. Dette strider imidlertid imod ideen om demand paging, da
man ønsker at mange processer skal kunde køre på begrænset memory
•
Man kan swappe ud en hel proces med alle dens frames. Dette er en god løsning under nogle
omstændigheder, f.eks. hvis der er processer der har været inaktive over et stykke tid.
•
Man kan benytte en page replacement algoritme til at frigøre plads
Hvis der ikke findes nogle ledige frames, må man finde en der ikke bruges i øjeblikket, frigive den
ved at flytte dens indhold til swap space, og bruge den til den processen der forårsagede en page-fault
trap
Page fault rutinen skrives om så den kan udføre dette:
1. Find den ønskede pages placering på disken.
2. Find en ledig frame:
a) Hvis der er en ledig frame, så bruges denne
Datamatikeruddannelsen efterår 2005
Side 41 af 54
Notater til Teknik 1
Vidar Jon Bauge
b) Hvis ingen frame er ledig, bruges en page-replacement algoritme til at frigøre en victim frame
c) Skriv victim page til disken, og opdater page og frame tabellen.
3. Læs den ønskede frame ind i den frigjorte pagen, og opdater page og frame tabellen.
4. Genstart bruger processen.
Hvis ingen frames er ledige, kræver dette to page overførsler, en ud og en ind. Dette øger den tiden
det tager at betjene en page-fault trap, og øger acces tiden tilsvarende.
Dette kan reduceres ved hjælp af en modify bit eller dirty bit. Hver page eller frame er associeret
med en modify bit i hardware. Denne sættes hvis der skrives til den aktuelle frame eller page. Når en
page skal pages, kan man undersøge om modify bit er sat. Hvis dette er tilfælde, kræver paging at der
skrives til disken. Ved at vælge en page hvor modify bit ikke er sat, kan man spare en I/O operation,
fordi pagen ligger på disken i uændret form. Denne teknikken gælder også read-only pages, f.eks.
binær kode.
Implementering
Der er to problemer der må løses når man skal implementere demand paging. Der skal bruges en
frame-allokation algoritme og en page-rplacement algoritme. Hvis mange processer befinder sig i
memory må man bestemme hvor mange frames der skal allokeres til hver proces. Designet af disse er
meget vigtig, da I/O bruger mange ressourcer. Man ønsker en algoritme der giver færrest mulige faultpage traps.
•
•
•
FIFO page replacement: Dette er den enkleste algoritme. Når en page skal udskiftes, vælger man
alltid den eldste. Dette kan implementeres som en kø, hvor man sætter ind i toppen og tager fra
bunden.
•
Let at programmere
•
God performance hvis den udvalgte page indeholder en initialiseret variabel der ikke bruges
mer
•
Dårlig performance, hvis den ældste page kan være en der bruges meget
•
Giver aldrig fejl, men kan give mange page swithces, da udvælgelsen ikke alltid er optimal
Optimal Page replacement: Skift den page der ikke vil blive brugt på længst mulig tid.
•
Alltid garanteret mindst antal page-fault traps over en given tidsperiode
•
Meget vanskelig at implementere, da den kræver at man kan se frem i tid.
LRU page replacement: Least recently used. Hver page markeres med hvornår den er sidst brugt,
og den ”ældste” bliver byttet ud. Den kigger tilbage i modsætning til optimal page replacement der
kigger frem.
Implementation af tidsmarkering:
•
Counter: Hvert page felt i page tabellen får et tidsfelt, hvor værdien i CPU timeren kopieres.
Dette opdateres hver gang der refereres til en page, bliver dette feltet opdateret. Den page
med den laveste værdi i time reference field, vælges når en page skal pages.
Denne metoden kræver at page table gennemløbes for at finde den page der er sidst brugt.
•
Stack: Man har en stack af page referencer. Hver gang en page bliver brugt, bliver den
placeret i toppen af stacken. Når en page skal udskiftes, henter man så referencen fra toppen,
så har man den der er sidst brugt.
Datamatikeruddannelsen efterår 2005
Side 42 af 54
Notater til Teknik 1
Vidar Jon Bauge
Stacken implementeres som en dobbelt hægtet list, med en peger til den føste og den sidste.
Ved opdaetring skal man så maksimalt ændre på seks pointere
Implementation af LRU kræver betydelig hardware understøttelse. Opdatering af tids feltet i page
table skal opdateres hver gang der refereres til en page. Hvis dette skulle ske ved hjælp af en
interrupt, vil det nedsætte performance betydelig.
•
LRU Approximation Page replacement: Få computer systemer har den hardware der skal til for
at understøtte LRU. Hvis der ikke fndes nogen harwareunderstøttelse, må man bruge FIFO
algoritmen. De fleste systemer understøtter imidlertid en refernce bit der sættes af hardware når
en page bliver brugt.
Der findes 3 LRU modificerede algoritmer der benytter reference bit. De har alle til fælles at man
kun kan se om en page er blevet brugt, og ikke i hvilken rækkefølge:
1. Additional reference bit algoritme:
Hver page tildeles en 8-bit register byte. Denne sættes til 0 ved opstart. Registeret bliver
opdateret på faste tidsintervaller, og hvis en page er blevet brugt, bliver registeret opdateret med
et 1-tal, ellers med et 0. Opdateringen sker hele tiden af til højre. Dette giver en historik over de
sidste 8 intervaller, og man kan udfra dette bestemme hvilken page der skal udskiftes. Hvis det
findes 2 eller flere ens registre, benyttes FIFO.
Antallet bits i registeret er hardware afhængig
2. Second chance algoritme:
Denne algoritmen er
bygget over en FIFO kø,
men hver page har en
reference bit. Hvis denne er
sat til 0, bliver siden
udskiftet. Hvis reference
bit'en er sat til 1 for den
pågældene page en second
chance:
Bit'en sættes tilbage til 0,
ankomsttid bliver sat og
man går videre til næste
page i listen. Dermed kan
pågældende page ikke
komme i betragtning før
alle andre pages har fået en
second chance
Second chance algoritme som cirkulær kø
Alternativt kan Second
Mulige bitmønstre:
chance algoritmen
R,M
implementeres som en ”klokke” med en
circulær pointer. Pointeren finder næste
page der er sat til 0, udskifter denne med 0,0 – Hverken reference eller modify er sat –
egnet for udksiftning
den ønskede frame. Eftersom pointeren
fortsætter, nulstiller den reference bit'ene.
0,1 – Ikke brugt for nylig, men ændret.
Hvis alle reference bit'ene er sat til 1, vil
Udskiftning kræver skrivning til disken.
alle pages få en second chance, og
1,0 – Nylig brugt, men ikke ændret – vil
sandsynligvis snart blive brugt igen.
Datamatikeruddannelsen efterår 2005
Side 43 af 54
1,1 – Både brugt og ændret for nylig.
Second
chance algoritme
”klokke”
Udskiftning
vil kræve som
skrivning
til disken
Notater til Teknik 1
Vidar Jon Bauge
algoritmen reduceres til en ren FIFO algoritme.
3. Enhanced second chance algoritme: Second chance algoritmen kan udvides med en Modify
bit, så man får to bits, først Reference bit så modify bit
Udvælgelse af page sker på samme måde som ved secoond chance clock algoritmen
Det kan være nødvendig at scanne køen flere gange for at finde den page med de laveste
værdier, da pointeren natutligvis kun ”drejer” en vej. Hvis flere pages har samme værdi, vælges
den første.
Den vigtigste forskel fra den almindelige second chance algoritmen er at her kommer det i
betragtning om en page skal skrives til eller ikke før en ombytning. Dermed kan antallet af I/O
operationer tages i betragtning.
Datamatikeruddannelsen efterår 2005
Side 44 af 54
Notater til Teknik 1
Vidar Jon Bauge
Filsystemer
Filer
Gemmes på et non-volatilt media, dvs data går ikke tabt når der slukkes for maskinen. En fil har en
bestemt struktur, efter hvilke type fil det drejer sig om.
•
Tekstfil – Sekvens af karakterer ordnet i linier og i nogle tilfælde også sider
•
Source fil – Indeholder en sekvens af subrutiner
•
Objekt fil – Sekvens af bytes organiseret i blokke der der kan læses af systemets linker.
•
Executable fil – En serie af kodesektioner loaderen kan læse ind i RAM og eksekvere.
Fil attributter
En fil navngives så det er nemt for den menneskelige bruger at referere til den. I tillæg til dette har en
fil en række attributter der indeholder data omkring filen:
•
Navn – Filens navn. Det eneste der gemmes i et format der kan læses af mennesker.
•
Type – Nødvendig for operativsystemer der understøtter flere filtyper.
•
Lokalisering – Pointer til den enheden filen ligger på, og pointer til placeringen på dette device
•
Størrelse – Aktuel størrelse i bytes, words eller blocks og muligvis også største tilladte størrelse.
•
Protection – Informationer omkring hvem der har adgang til filen – læsning, skrivning, kørsel osv.
•
Tid, dato og bruger(ejer)information – Kan gemme oplysninger som: oprettet, sidst ændret, sidst
brugt.
Fil operationer
En fil er en abstrakt data type. For at definere hvad filer er, er det nødvendig at tage i betragtning
hvilke operationer man kan udføre på dem. Operativsystemet har forskellige system calls for at
oprette, skrive, læse, repositionere, slette og forkorte filer.
Her er seks grundlæggende filoperationer, der må betragtes som et minimumskrav for et filsystem:
1. Oprette en fil - To trind: Først må der findes ledig plads til den nye filen, så skal der oprettes en
placering i en mappe. Placeringen i mappen gemmes sammen med filnavn og placering i
filsystemet.
2. Skrive til en fil – For at skrive til en fil laves et system call hvor man specificerer filens navn og de
data der skal skrives til filen. Med disse oplysningerne gennemsøges filsystemet. Systemet sætter
en write pointer der peger på det sted hvor der skal skrives. Denne pointer må selvfølgelig
opdateres efter hver skrivning.
3. Læse fra en fil - For at skrive til en fil laves et system call hvor man specificerer filens navn og
hvor i RAM man ønsker dataene placeret. Med disse oplysningerne gennemsøges filsystemet.
Systemet sætter en read pointer der peger på det sted hvor der skal læses. Denne pointer må
selvfølgelig opdateres efter hver læsning. Mange operativsystemer bruger en current-file-position
pointer både for læsning og skrivning. Dette sparer plads og gør systemet mindre komplekst
4. Repositionere i en fil (file seek) – Mappen søges for den aktuelle fil, og current-file-position
Datamatikeruddannelsen efterår 2005
Side 45 af 54
Notater til Teknik 1
Vidar Jon Bauge
sættes til en given værdi. Repositionering i en fil, behøver ikke at indebære I/O operationer.
5. Slette en fil – Når en fil skal slettes, gennemsøges mapperne efter den ønskede fil, al plads bliver
frigjort og placeringen i mappen bliver slettet.
6. Forkorte en fil – I nogle tilfælde er det ønskelig at fjerne indholdet i en fil, uden at slette den. I
stedet for at skulle slette filen, og oprette den på nyt, kan man bare nulstille filens længde attribut,
og lade de andre stå urørte.
Dette er de seks grundlæggende filoperationer. Andre almindelige filoperationer er append, rename,
copy. Der finde også operationer dersætter filattributter som ejer, rettigheder osv.
De fleste filoperationer kræver et søg igennem mappestrukturen efter filen. For at spare systemet for
dette, venter mange operativsystemer med at åbne filen til den skal bruges aktivt. Operativsystemet
har en tabel med oplysninger om åbnede filer – open-file table. Ved anmodning om en filoperation
bruges en index i denne tabel så søgning undgås. Når processen lukker filen, fjernes referencen til den
i tabellen.
Nogle systemer åbner en fil implicit når den første reference skabes til den, og lukker filen når
processen der bruger den afsluttes. De fleste systemer kræver imidlertid at en fil åbnes og lukkes
implicit. Systemets open call opretterså bare en pointer i open-file tabellen. Denne pointeren bruges
så ved alle I/O kald i stedet for filens navn.
I flerbruger systemer er open/close kaldene mere komplekse, da flere bruger kan have adgang til en
fil. For at administrere dette bruges der typisk tabeller på to niveauer. Hver proces har sin egen tabel
over de filer den åbner. Disse tabellerne henviser så til system open file table. I tillæg har denne tabel
en open count opføring der indeholder det antal processerder har åbnet den aktuelle fil. Når open
count bliver 0, lukkes filen.
Der er flere informationer associeret til en åbnet fil:
•
File pointer – Systemer der ikke har en file offset som en del af read/write system calls må holde
oversigten over læse/skrive positionen med current-file-position pointer. Denne pointeren er unik
for hver proces der arbejder på filen.
•
File open count – Tæller antal processer der har åbnet en fil. Når open count bliver 0, bliver filen
lukket.
•
Disk location of the file – De fleste filoperationer ændrer filens indhold. Information om filens
placering gemmes i RAM for at undgå at læse/skrive til disken ved sådanne operationer.
Nogle operativsystemer understøtter låsning af dele af en fil og åbne den for mange processer. Eller
lægge dele af en fil i RAM og tillade adgang som om det var en fil. Dette kaldes memory mapping.
Når man lukker en fil der er memory mapped, skrives den så til disken. Flere processer kan memory
mappe den samme fil, for at tillade delt adgang. Hver proces har en pointer der peger på den samme
adresse i RAM, hvor filen ligger. Adgangen styres så ved hjælp af mutual exclusion.
Filtyper
Implementation af filtyper gøres for at systemet skal kunde bestemme handlinger for den enkelte fil.
En enkel måde at implementere filtyper på, er ved at filtypen angives som en del af filnavnet, f.eks.
som Dos 8.3 konvention for filnavn.
Under MacOs har filer en attribut med navnet til det program der oprettede filen, og som sættes under
Datamatikeruddannelsen efterår 2005
Side 46 af 54
Notater til Teknik 1
Vidar Jon Bauge
create kommandoen.
Filstruktur
Filtyper kan også angive filstrukturer. Dette kan dreje sig om specielle formater for eksekverbare filer,
eller hvordan operativsystemet behandler specielle filer.
Det kan være et problem hvis et operativsystem understøtter for mange filtyper. F.eks hvis et
operativsystem understøtter en filstruktur der heder ASCII, kan dette forstyrre behandlingen for f.eks
en fil der indeholder programkode.
MacOs forventer at en fil indeholder en data fork og en ressource fork. Ressource fork'en
indeholder data for brugeren, mens data fork'en indeholder de data der gemmes i filen.
Intern filstruktur
Det at finde offset inde i en fil kan være en kompliceret opgave for operativsystemet. Filsystemet er
delt op i blokke med en fast størrelse (Physical record). Det er imidlertid sjældent at de filer (Logical
record) der skal opbevares matcher blokstørrelsen, og der opstår intern fragmentering.
Mange filsystemer løser dette problemet ved at lægge flere logical records i en physical record. I Unix
betragtes filer som strømme, der kan fordeles over blokke som nødvendig.
Størrelsen på logical records, den fysiske blokstørrelse og metode for pakking afgør hvor mange filer
(logical records) der kan placeres i hver blok.
Allokeringsmetoder
Formålet med disse tre metoderne er at give hurtigst mulig adgang til data, samtidig med at man
reducerer søgetiden og spild af harddisk plads i form af intern og ekstern defragmentering.
Fortløbende (Contiguous) allokering
Filer lægges i efterfølgende blokke på disken, Filer defineres ved første blok og længden på filen.
Fordele
•
Meget hurtig – kræver ingen unødige bevægelse af læsehovedet. Kun fra sidste blok på en sylinder
til første blok på den næste
Ulemper
•
Problemer ved at finde ledig plads til en nye filer – first fit og best fit har vist sig at være hurtigere
end worst fit.
•
Når der skal allokeres plads til en ny fil, må der sikres nok plads til hele filen med det samme.
Dette kan enten ske ved at ”overestimere” filstørrelsen, eller ved at man flytter om på diskens
indhold når en ny fil skal oprettes.
•
Ekstern defragmentering – Efterhånden som filer slettes og oprettes, bliver der ”huller”
filsystemet.
•
Under defragmentering, må systemet lukkes, hvorfor man undgår fortløbende allokering på
produktionsmaskiner
Datamatikeruddannelsen efterår 2005
Side 47 af 54
Notater til Teknik 1
Datamatikeruddannelsen efterår 2005
Vidar Jon Bauge
Side 48 af 54
Notater til Teknik 1
Vidar Jon Bauge
Lenket allokering
Filer fordeles på blokke der ikke nødvendigvis ligger fortløbende på harddisken. Der ligger en pointer
til næste blok ved slutningen på hver blok. Filer kan så nemt udvides ved at lægge flere blokke til ved
filens slutning.
Fordele
•
Løser problemerne ved fortløbende allokering.
•
Ingen ekstern fragmentering. Man kan bruge en hvilken som helst ledig blok.
•
Det er ikke nødvendig at angive størrelse når en fil oprettes, da den bare kan vokse så længe der er
ledig plads
•
Det er ikke nødvendig at defragmentere for at skabe ledig plads til nye filer
Ulemper
•
Det at finde en given blok i en fil kræver at man begynder fra starten og går hver blok igennem.
Dette kræver mange læse- og søgeoperationer for læsehovedet.
•
Pointeren i hver blok bruger i sig selv diskplads. Løsningen på dette er i mange tilfælde at
gruppere blokke i clusters
•
Pålidelighed – Hvis en blok i en fil går tabt, er hele filen ødelagt
En variant af lænket allokering er brug af en fil-allokerings-tabel (FAT), der indeholder en tabel over
alle diskens blokke indekseret med bloknumre. Mappe opføringer indeholder en pointer til den første
blok i filen. De næste opføringer i fat-tabellen indeholder så pointere til den næste blok. Denne kæden
fortsætter til til den sidste blok som har en speciel ”sidste blok” opføring i fat-tabellen. Ved at cache
FAT tabellen undgås mange læsninger til disken.
Indekseret allokering
Hver fil har en index blok med henvisninger til de blokke filen ligger på. For at læse en bestemt blok
i en fil, kan man bare slå op i indexblokken og finde blokken. Når en fil oprettes, sættes alle pegerne
til null. Når der skrives til filen, findes en ledig blok, og dens nummer tilføjes filens index blok.
For at undgå for meget spild, kan man organisere index blokkerne på flere måder:
1. Linked scheme. En index blok er normalt en diskblok. For at tillade store filer, kan man lenke
sammen flere indexblokke.
2. Multilevel scheme. En index blok på første nivå peger på et sæt index blokke på andet nivå der i
sin omgang peger på disk blokke
3. Combined scheme. Nogle index blokke på første nivå peger på andre diskblokke, mens andre
peger på indexblokke på andet nivå.
Fordele
•
Ingen ekstern fragmentering
Datamatikeruddannelsen efterår 2005
Side 49 af 54
Notater til Teknik 1
Vidar Jon Bauge
Ulemper
•
Tap af diskplads ved at index blokken selv forbruger plads
Performance
Alle allokeringsmetoder varierer i akksesstid og lagringseffektivitet, og de forskellige metoder er
egnet til forskellig brug.
Et system med med sequential access bør bruge en anden metode end et system med mere random
access.
Datamatikeruddannelsen efterår 2005
Side 50 af 54
Notater til Teknik 1
Vidar Jon Bauge
I/O systemer
De to vigtigste opgaver for en computer er I/O og data behandling. I mange tilfælde er I/O den
vigtigste funktion, f.eks når man åbner en internetside.
Operativsystemets funktion omkring I/O er at kontrollere I/O operationer og I/O enheder.
Der findes mange typer I/O enheder:
•
Lager enheder: Diske, båndstationer, usb-enheder
•
Transmissionsenheder: Netværkskort, modem
•
Human interface enheder: Mus, tastatur, skærm, printer
Eftersom der er så stor mangfoldighed blant enheder, er det nødvendig med en række forskellige
metoder til dette. Disse metoderne udgør samlet kernens I/O subsystem. For at indkapsle de
forskellige enheders egenskaber, laver man device drivers der håndterer den enkelte enhed i forhold
til kernen.
En enhed kommunikerer med systemet via en port, der f.eks, kan være seriel porten. Hvis flere
enheder bruger samme sæt ledninger, taler man om en bus der er et sæt med ledninger og en protokol
der definerer hvordan meldinger sendes over bussen.
En controller er en elektronisk kreds der kan styre en port, bus eller en enhed. Hvis controlleren
kontrollerer en kompleks enhed, f.eks. en SCSI controller, implementeres den ofte på et eget
kredskort, en host adapter.
Nogle enheder kommer med indebygget controller, som f.eks. en harddisk, hvor controlleren sidder
på et kredsløb på selve disken.
I/O operationer
Controlleren har et eller flere registre for data og kontrolsignaler. CPU'en kommunikerer med
controlleren ved at skrive til disse registrene. Selve IO operationen kan så ske på to måder:
•
Specielle I/O kommandoer der beder om en overførsel af en byte til en I/O port adresse. I/O
instruktionen starter trafik over den rigtige bus til enhedens registre.
•
Memory mapped I/O. Controllerens registre er mapped indenfor CPU'ens adresserum. I/O
operationer igangsættes med standard kommandoer der læser og skriver til registrene.
Mange systemer bruger begge metoder. F.eks grafikkortet, hvor controlleren har har I/O porte til
geundlæggende kontrol operationer, men et stort memory område til skærmens indhold eftersom det
ville kræve millioner af mikro instruktioner hvis dette skulle gøres ved hjælp af specielle I/O
kommandoer.
En I/O port består vanligvis af 4 porte: status, control, data-in og data-out. Status registeret består af
bits der kan læses af controlleren og indikerer status, som f.eks om den pågående operation er færdig
eller ikke. Control registeret kan f.eks benyttes til at ændre enhedens mode. Data-in bruges af host der
læser data der er hentet fra enheden, mens data-out bruges af host til at skrive data der skal gemmes
på enheden. Et data register kan bestå af 1 til 4 bytes.
Datamatikeruddannelsen efterår 2005
Side 51 af 54
Notater til Teknik 1
Vidar Jon Bauge
Polling
Den fuldstændige protokol for kommunikation med en enhed kan være ganske kompleks. Men den
grundlæggende handshaking er ganske simpel. Controlleren indikerer sin status v.h.a busy bit der
sættes når den er optaget med en operation, og sættes til nul når den er færdig og klar til næste
instruktion. Værten signalerer sit ønske ved at sætte busy bit i command registeret når der er en
instruktion til kontrolleren.
1. Værten poller busy bit til den er sat til nul.
2. Værten sætter write bit i command registeret, og lægger værdien i data-out registeret.
3. Værten sætter command-ready bit for at vise controlleren at instruktionen er klar.
4. Når controlleren ser dette, sættes busy bit.
5. Controlleren læser command registeret og ser at det er en write kommando. Så læser den read-out
registeret og udfører I/O på sin enhed.
6. Controlleren nul stiller comman-ready bit og error bit i status registeret for at kommunikere at I/O
er fuldført uden fejl. Så nulstilles busy bit for at kommunikere at controlleren er klar til en ny
instruktion.
Denne procedure gentages for hver byte der skal overføres. I trin et er værten busy-waiting eller
polling. Den er i en loop hvor den læser busy bit for at se om den kan få adgang til enheden. På
mange arkiktekturer kan polling klares med 3 CPU cykler: læs register, logisk og branch hvis ikke
nul.
Polling er effektivt, men tager CPU cykler fra andre, kanskje vigtigere opgaver.
Interrupts
CPU'en har et ben der kaldes interrupt request line (irq), der tjekkes efter hver instruktion. Når
CPU'en modtager et signal over irq, gemmes en del af CPU status, f.eks. indholdet i instruction
pointer. CPU'en går så til en interrupt handler rutine der ligger på et bestemt sted i memory.
Interrupt handler finder årsagen til interruptet, udfører de nødvendige handlinger og returnerer
CPU'en til den status den havde inden den modtog interrupt'et. På denne måden kan CPU'en svare på
en asynkron hændelse, som en device controller der er klar til service.
Moderne operativsystemer har imidlertid behov for en mere avanceret interrupt behandling. For det
første er det nødvendig at kunde forhindre interrupts under udførelsen af kritisk kode.
Dessuden er det nødvendig at kunne dispatche til den rigtige interrupt handler for en enhed uden at
polle enhederne for at se hvilken af dem der har sendt et interrupt.
Systemet må kunne skelne mellem interrupts med høj og lav prioritet og svare med en tilsvarende
grad af prioritet.
I moderne computer hardware findes disse egenskaberne i CPU'en og i interrupt controlleren.
De fleste CPU'er har 2 interrupt linier. En nonmaskable, der er reserveret for hændelser som ikke kan
genoprettes f.eks memory fejl. Den anden irq er maskable, og kan slukkes før udførelse af kritisk
kode der ikke må interruptes. Denne linien bruges af device controlleren for at be om service.
Datamatikeruddannelsen efterår 2005
Side 52 af 54
Notater til Teknik 1
Vidar Jon Bauge
Interrupt handleren tager en adresse, der på de fleste systemer er en offset der bruges til opslag i
interrupt vektoren. Denne indeholder memory adresser til specielle rutiner, interrupt handlers.
Formålet med at bruge en vektor er at eliminere behovet for en enkelt interrupt handler der må søge
efter den rigtige rutine til det indkomne interrupt. De fleste systemer har imidlertid flere interrupt
handlers end der er plads i
interrupt vektoren. Da benytter
man interrupt chaining, hvor
interrupt vektoren peger på en
liste over interrupt handlers. Disse
kaldes så en efter en indtil den
rigtige handler bliver fundet.
Interrupt mekanismen
implementerer også interrupt
priority levels. Dette gør det
muligt at udsætte mindre vigtige
interrupts og afbryde udførelsen af
en mindre vigtig interrupt hvis der
skulle komme en med højere
prioritet.
Interrupt mekanismen håndterer
dessuden en række exceptions
som division med nul, page fault,
alle handlinger der får CPU'en til
at udføre en vigtig fejlrutine.
Page fault er et eksempel på en
exception der sender en interrupt.
Interruptet afbryder den kørende
proces og overlader kontrollen til
interrupt handler der gemmer den
kørende proces og sætter den i
Interrupt signal
wait køen. Derefter køres en pager
der schedulerer en I/O operation
for at hente ind en page, schedulerer en anden proces for kørsel og returnerer fra interruptet.
Et andet eksempel findes i implementering af system calls, dvs funktioner der bruges af programmer
for at bruge en service i kernen. Systemet ”bygger” kaldet ud fra det parametre der er givet og udfører
et software interrupt eller en trap.
Direct memory access
Programmed IO (PIO)
Processen at overføre data. Dette indebærer at overvåge controllerens registre, sætte bits og overføre
data byte for byte til read-out registeret.
Datamatikeruddannelsen efterår 2005
Side 53 af 54
Notater til Teknik 1
Vidar Jon Bauge
DMA
For at aflaste CPU'en for denne opgaven implementerer de fleste systemer en speciel processor der
står for denne opgaven, nemlig direct memory access controller (DMA).
For at starte en overførsel skriver værten en DMA command blok til memory. Blokken indeholder en
pointer til datakilden, målet og antal bytes der skal kopieres. CPU'en skriver command blokkens
adresse til DMA kontrolleren, og fortsætter med sine egne opgaver.
1. Device driver får besked om at overføre
data fra disken til adresse x
2. Device driver beder disk kontrolleren
om at overføre c antal bytes fra disken
til buffer på adresse x.
3. disk kontrolleren initierer en DMA
overførsel
4. disk kontrolleren sender hver byte til
DMA kontrolleren.
5. DMA kontrolleren overfører bytes til
adresse x, icrementerer memory
adressen og decrementerer c indtil c=0
6. Når c=0, sender DMA kontrolleren en
interrupt til CPU'en med besked om at
overførselen er fuldført.
Nogle arkitekturer benytter fysiske memory adresser, mens andre udfører direct virtual-memory
access (DVMA) DVMA kan udføre overførsler mellem to enheder der er memory.mapped udenom
CPU'en.
Eftersom DMA arbejder direkte på memory bussen, kan DMA medføre cycle stealing på denne. Brug
af DMA øger alligevel performance fordi det aflaster CPU'en.
Kernebegreber
Selvom den hardware der skal til for at understøtte DMA er meget kompleks, er de vigtigste begreber:
1. Bussen
2. En kontroller
3. En I/O port med dens registre
4. Handshaking mellem værten og en device kontroller
5. Udførelse af handshaking ved hjælp av polling loops eller interrupts
6. Aflastning af CPU'en ved at overlade overførsler til DMA kontrolleren.
Datamatikeruddannelsen efterår 2005
Side 54 af 54