Multitasking

Fra Wikipedia, den frie encyklopædi
Gå til: navigation, søg

Multitasking er udførelse af flere opgaver på samme tid på en computer. På maskiner med en enkelt processor sker det ved, at de forskellige programmer, der kører på maskinen, på skift får rådighed over processoren i et lille stykke tid, inden en anden opgave får mulighed for at køre. Er der flere processorer, kan flere opgaver reelt afvikles samtidigt (parallel afvikling), men normalt er antallet af processer større end antallet af processorer til rådighed. Tildeling af køretid kan ske efter forskellige principper. Computerens operativsystem og evt. også andre mekanismer skal sikre, at de forskellige opgaver ikke forstyrrer hinanden eller får systemet til at gå i baglås eller ligefrem ”gå ned”.

Moderne desktop operativ systemer kan håndtere et stort antal opgaver samtidigt. Dette skærmbillede viser Linux Mint der samtidigt afvikler adskillige applikationer.

Multitasking kan give en bedre udnyttelse af en større computer, idet ventetid på en opgave kan udnyttes til at afvikle andre opgaver. Derved kan man skabe en illusion af, at en bruger råder over en hel computer (timesharing), eller på nyere personlige computere illusionen af, at maskinen eller brugeren kan arbejde med adskille opgaver samtidig.

Historisk[redigér | redigér wikikode]

I computerens barndom (og i høj grad også i dag på store maskiner) var en computer kostbar, og tiden på en computer var kostbar. Så når et program ventede på en langsom ydre enhed som f.eks. en printer, var der computertid, der gik til spilde. Den første maskine, der søgte at udnytte denne ledige tid, var den britiske LEO III, udviklet af J. Lyons and Co., der udelukkende anvendtes til batchprogrammer. Multitasking gjorde det muligt at få flere programmer afviklet i løbet af en given periode, end det ellers ville have været muligt, hvis de skulle have ventet på hinanden (seriel afvikling).

En mere udviklet form for multitasking blev taget i brug med monitoren til PDP-8 og med MULTICS i 1964 og med OS/360 fra [[IBM] i 1967. UNIX fra 1969 gjorde multitasking almindeligt til mellemstore maskiner. De små computere, ofte kaldet hjemmecomputere og personlige computere, tilbød ikke multitasking før ret sent. Maskinernes hardware understøttede ikke rigtigt dette (dog havde f.eks. MS-DOS en spool-funktion, der multitaskede med brugerens program). Den første Macintosh og Amigaen tilbød multitasking.

Tidsdeling[redigér | redigér wikikode]

Tidsdeling lader et program eller en del af et program køre i et kortere tidsrum, hvorefter programmet afbrydes, dets tilstand, dvs. cpu'ens registre m.v., gemmes på stakken, stackpointeren gemmes, programmet sættes i en til senere afvikling, hvorefter et andet program, der står i kø, får indlæst sin sidste tilstand (inklusive dette programs gamle stackpointer) og får lov til at køre videre på cpu'en.

Tidsdelingen kan ske frivilligt, dvs. det kørende program udfører af og til et kald til maskinens operativsystem, der lader et andet program få mulighed for at køre, hvis et andet program er til rådighed. Eller tidsdelingen kan være tvungen, dvs. at en timer (en slags vækkeur) udløser en afbrydelse, et interrupt, af det kørende program og overdrager kontrollen til operativsystemet, der så undersøger, om andre programmer står i kø og er klare til at køre. I givet fald får et af disse programmer køretid. I modsat fald får det nyligt afbrudte program lov at køre videre.

Frivillig tidsdeling er ofte uhensigtsmæssig, da en programmeringsfejl i det kørende program kan gøre, at ingen andre programmer kan komme til, hvis det kald, der skulle give operativsystemet kontrollen, aldrig udføres. Maskinen ”hænger”. Frivillig tidsdeling er derfor sjældent benyttet i dag. Den første Macintosh benyttede dog frivillig tidsdeling.

Simula[redigér | redigér wikikode]

I programmeringssproget Simula, der blev udviklet til simuleringsopgaver, benyttes frivillig tidsdeling inden for et program.

IO[redigér | redigér wikikode]

Desuden kan en afbrydelse af et kørende program ske, når dette program starter en io-operation (input-output til ydre enheder som f.eks. printer, disk eller tape). Det vil medføre, at programmet skal vente, mens langsomme ydre enheder gør sig færdige. IO startes ved et kald til operativsystemet, der dels klargør det arbejde, som io-operationen kræver, dels sætter programmet i ventekø og lader et andet program komme til, indtil den ønskede io-operation er afsluttet. Dette meddeles normalt ved et særligt signal, et interrupt, fra den ydre enhed til cpu'en. Dette signal reagerer operativsystemet så på.

Når der ovenfor tales om programmer, der står i kø for ”samtidig” afvikling på maskinen, så kan de på mange operativsystemer deles i to grupper.

Proces[redigér | redigér wikikode]

En proces er et program, der har sit eget lager, beskyttet mod andre programmer af maskinen og operativsystemet. Andre programmer kan normalt ikke læse eller skrive til dette lager. I nogle tilfælde kan dele af lageret dog gøres tilgængeligt for flere programmer. Hvis to processer skal afvikle de samme instruktioner, den samme programkode, og dette sæt af instruktioner ikke ændres undervejs (ikke selvmodificerende kode) – programmet siges at være reentrant, så kan man spare lagerplads ved kun at have et eksemplar af programkoden, som de forskellige processer så udfører fælles og helt uafhængigt af hinanden.

Tråd[redigér | redigér wikikode]

Den anden type program er en tråd. En tråd omtales ofte som en letvægts-proces. En tråd får køretid og står i kø, ganske som en proces, men flere tråde kan udgøre én proces og deles om det samme lager og de samme data. Det vil altså være nødvendigt at have mekanismer, der forhindrer, at de enkelte tråde i et program ødelægger data for hinanden.

Tråde kunne f.eks. benyttes i et tekstbehandlingsprogram, hvor en tråd tog sig af indtastningen, en anden tråd præsenterede det indtastede på skærmen, mens en tredje tråd kunne foretage kontrol af stavning og andre mulige fejl.

Forskellige metoder for tildeling af køretid[redigér | redigér wikikode]

Der kan benyttes flere strategier, når operativsystemet skal udvælge hvilket program, der skal have lov at benytte cpu'en næste gang. Den simpleste er round robin, hvor de enkelte programmer kommer til efter tur.

Men ofte vil de ventende programmer have forskellige prioriteter. Programmer, der er vigtige, skal have køretid oftere end andre. Det kan være et spørgsmål om at undgå, at computeren virker påfaldende sløv over for brugerne, eller der kan være tale om særdeles kritiske opgave, hvis forsinkelse kan medføre ulykker. I nogle tilfælde kan der være en tidsfrist for, hvornår et program skal være afsluttet. På den anden side kan man heller ikke altid tillade, at enkelte programmer slet ikke får lov til at køre. Der vil altså være tale om en kø (eller flere køer) med ventende programmer, der ikke er ”retfærdig”, men hvor programmer kan springe frem i køen afhængig af deres prioritet eller hvor længe de har ventet, eller de flyttes til en anden kø med en anden prioritet. En rutine i operativsystemet, ofte kaldet scheduleren, foretager dette valg.

Derudover vil der være køer med programmer, der venter på io, og derfor ikke skal køre endnu. Evt. kan de vente på, at den ydre enhed bliver tilgængelig, eller på at der sker et eller andet, som de venter på.

Endelig kan operativsystemet have en kø af programmer, der skal startes på et bestemt klokkeslæt. Det kan f.eks. være en periodisk kørt sikkerhedskopiering.

Beskyttelse[redigér | redigér wikikode]

Når er computer udfører multitasking, anses det for ønskeligt, at de forskellige programmer beskyttes, lige som operativsystemet skal beskyttes. Det betyder, at et program ikke må kunne læse eller skrive til lager, der tilhører et andet program, uanset om dette forsøg skyldes en fejl eller ondsindet programkode. I modsat fald ville ét program kunne forvanske data eller instruktioner i et andet program eller operativsystemet, eller læse fortrolige oplysninger.

Dette søges undgået ved at computerens lager opdeles i sider, der tilhører et bestemt program. Ligeledes kan hver side have skrive og/eller læseadgang. Forsøges tilgang til lager, der ikke tilhører eget program, er der en mekanisme i computerens lagerstyring, ofte en særskilt memory management unit, der afbryder det formastelige program og overgiver kontrollen til maskinens operativsystem. Dette vil så enten sende et signal til det pågældende program, eller afbryde dette helt.

Tilsvarende er der visse maskininstruktioner (sådanne der kan justere inddelingen af lageret, pille ved cpu'ens sikkerhedsindstillinger eller direkte tilgår ydre enheder), der er privilegerede instruktioner. De kan kun udføres af operativsystemet. Et forsøg på at udføre en sådan instruktion, vil også medføre en afbrydelse. Skal sådanne instruktioner udføres, så skal kontrollen først overdrages til operativsystemet på en bestemt måde. Ofte er dette implementeret ved at have ”ringe” af privilegier. Den yderste ring er de instruktioner, som alle programmer må udføre, den inderste ring er de mest farlige instruktioner, som kun den centrale del af operativsystemet, kernen, må udføre.

Det er dog ikke et krav for multitasking, at sådanne beskyttelsesmekanismer findes på maskinen. Men hvis de ikke findes eller ikke er benyttet korrekt i designet af operativsystemet, er der stor risiko for fejl og nedbrud.

Tildeling af fælles ressourcer[redigér | redigér wikikode]

Når flere programmer afvikles samtidigt på samme maskine, uanset om de sker på en eller flere processorer, kan der opstå problemer, hvis de benytter de samme ressourcer. F.eks. kan to programmer ikke skrive samtidigt til den samme fil uden risiko for, at det ene programs skrivninger helt eller delvist overskrives af det andet programs. Under alle omstændigheder vil filens tilstand bagefter være uklar. Tilsvarende kan flere programmer ikke samtidig benytte en bestemt båndstation eller printer. Også det at læse fra en fil, mens et andet program ændrer filen, kan give problemer for det program, der evt. læser noget inkonsistent.

Mange af disse problemer kan håndteres af et databasesystem, der bl.a. skal sikre flere programmer eller brugere muligheder for at læse og opdatere oplysninger i én database uden at ødelægge databasen eller præsentere inkonsistente data.

Men ellers håndteres problemerne ved, at hvert program reserverer (låser) de ressourcer, det skal bruge, inden det begynder at bruge dem. Reserveringen kan være eksklusiv (ingen andre må bruge ressourcen før den igen frigives) eller ikke-eksklusiv (hvis der f.eks. kun skal læses, og andre gerne må læse samtidig. Dog kan andre ikke opdatere en sådan ressource).

Baglås[redigér | redigér wikikode]

Denne låsning af ressourcer introducerer imidlertid et andet problem. Hvis to programmer begge skal bruge to ressourcer A og B, og de ikke låser dem i samme rækkefølge, kan de komme til at vente i al evighed på at komme til at låse ressource nummer 2, som det andet program har låst. De to programmer er gået i baglås. Detektering af sådanne låste programmer (i så fald må det ene program termineres) og metoder til at undgå at baglås opstår (hvilket er at foretrække), er en opgave for operativsystemet.

Synkronisering[redigér | redigér wikikode]

To eller flere processer, uanset om der er tale om særskilte processer eller blot tråde inden for samme proces, vil ofte have behov for at udveksle data. Det er da vigtigt, at den ene ikke forsøger at læse data, før de er helt færdigskrevet af den anden. Til dette formål findes forskellige mekanismer, der sikrer at kun én proces kan tilgå dataene. Af sådanne teknikker kan nævnes semafor og monitor.

Virtuelt lager[redigér | redigér wikikode]

Når flere programmer deles om den samme computer samtidig, øges også behovet for lager til programmerne. Dette behov kan imødekommes ved at have virtuelt lager på maskinen. Denne mekanisme gør det muligt, hvis der mangler plads i computerens lager, midlertidigt at skrive dele af lageret ud på et baggrundslager, for så senere, når behovet melder sig, at flytte nogle andre oplysninger ud på baggrundslageret og kopiere oplysningerne tilbage til lageret. Virtuelt lager er dog en teknik, der ikke hænger fast sammen med multitasking (multitasking kan laves uden virtuelt lager og virtuelt lager kan udnyttes uden multitasking).

Se også[redigér | redigér wikikode]