160 likes | 306 Views
Swapping og paging. Flytning af processer (swapping) eller dele af processer (paging) mellem arbejdslager og fjernlager. Baggrund: På den ene side skal arbejdslager rumme alle processers procesbillede aht. hurtig overførsel af instruktioner og data til CPU.
E N D
Swapping og paging • Flytning af processer (swapping) eller dele af processer (paging) • mellem arbejdslager og fjernlager. • Baggrund: • På den ene side skal arbejdslager rumme alle processers • procesbillede aht. hurtig overførsel af instruktioner og data til CPU. • På den anden side har arbejdslageret ikke plads nok til alle • processerne ! • Ide / håb: • Swapping: Processer der alligevel ikke kører kan flyttes .. • Paging: Del af procesbillede, der alligevel ikke bruges, kan flyttes ..
I/o-tunge processer => multitasking Mindst fem samtidige processer for at udnytte cpu-en Cpu: I/o: 20% 80%
Sandsynlighedsmodel for cpu-udnyttelse • Antagelser Tanenbaum s. 76-77: • Alle processer har 80% ledighed • Processers ledighed er indbyrdes uafhængig Antal processer Sandsynlighed for ledig cpu 1 0,8 2 0,8 * 0,8 = 0,64 5 0,8*0,8*0,8*0,8*0,8 = ca. 0,32 n 0,8 i n'te
Konklusion på model • Vigtigt at få plads til mange processer i arbejdslager. • Køb ekstra RAM ! • Udnyt hele arbejdslageret. • Swapping. • Paging. • Optimer ved at processer med samme program deles om tekst-segment • Optimer ved at bruge multitrådning.
Udnyt hele arbejdslageret • Processer vokser • stak-segment: rekursive procedurekald. • data-segment: plads til data • f.eks. et tekstbehandlingsprogram som bruges til et redigere • et dokument som bliver større og større • Ikke nok RAM til at alle processer på forhånd kan • allokeres "nok" RAM. • Dynamisk allokering af plads til processer: • en proces kan tildeles mere plads i løbet af dens liv • (men i rimeligt store portioner ad gangen)
Virtuelle vs. fysiske adresser Assembler: LOAD N R1 // [R1] <- [N] ADD R1 RO // R1 indeholder allerede 3 STORE R1 N // [N] <- [R1] C: i = i+3; • Alle processer tror de har maskinen for sig selv • I assembler/maskin-program er adressen på variablen i • lagt fast en gang for alle, ved oversættelsen. • Udgør den virtuelle adresse på variablen ! • Processerne deles rent faktisk om cpu og RAM, • derfor skelnes mellem virtuel adresse og fysisk adresse.
Fysisk adr. = virtuel adr. + base Her ligger processen rent faktisk • Cpu kan bruge et register • med base som lægges til • alle adresser. • Forudsætninger: • flere samtidige processer • den enkelte proces lagres • sammenhængende N+base base Her tror processen den ligger N LOAD N R1 // [R1] = [N+base] ADD R1 RO // R1 indeholder allerede 3 STORE R1 N // [N+base] = [R1]
"Swap disk" Hvis en proces helt (swapping) eller delvist (paging) midlertidigt er slettet fra arbejdslageret, skal stak- og data-segmenterne gemmes på harddisken. (Evt. også tekst-segment). "Swap disk" ell. "swap space" er Linux-slang for et antal blokke som reserveres til dette formål. Processkabelse Program proces Dele af proces gemt på "swap disk" swapping, paging HD RAM
Problemer som skal løses ved swapping • Finde plads i arbejdsplager til nye og ind-swappede processer • Finde plads på swapdisk til ud-swappede processer • Hvis et operativsystem bruger swapping uden paging • allokeres sammenhængende plads i arbejdslageret. • Hurtigere programafvikling (register med offset tilstrækkelig) • Dårlig udnyttelse af arbejdslager (mange "huller").
Lageradministration med hægtede lister Bruges til allokering af sammenhængende plads i arbejdslageret til ny eller ind-swappet proces ((Kan også bruges til at holde styr på data-segmentet for den enkelte proces)) Valgmulighed mellem first-fit, next-fit, best-fit, m.fl. P 0 5 H ? 3 Startadr. Hægte P=proces Længde
Opgave 1: overtjeneren 1. (Svær) Modificer og udvid din løsning af filosofproblemet med et overtjenerprogram og et kundeprogram. Ideen med opgaven er at du skal lave et program som kan håndtere flere samtidige klienter, som tilgår de samme ressourcer - i forenklet form det samme problem som skal løses af en webserver med en e-handelsløsning. I opgaven er overtjenerens formål at modtage kunder. Overtjeneren er den første proces der startes. Derefter startes et eller flere kundeprogrammer. Hvert kundeprogram sender en besked (via en beskedkø) til overtjeneren gående ud på at kunden gerne vil spise. ..
Hvilke processer skal der være ? Besked: Jeg søger en plads ved bordet kunde Over- tjener kunde Filosofproces startes hvis der er plads filosof filosof Beskeder sendes tilbage med status ("spiser", "tænker") • Opdeling i kunde/filosof • påtvunget for at det skal ligne ehandels-server etc. ! • I kan genbruge jeres gamle filosoffer
Overtjener: lytter til beskedkø // overtjener.c .. {opret beskedkø} // navn på kø kendt af kunde .. while (TRUE) { // eller while(OPEN) ?? msgrcv(..); // bloker indtil der er besked help_customer(..); }; .. help_customer(..) { // parametre ? if ({der er ikke plads}) {afvis kunden}; // kan forbedres ! else { {marker plads som optaget}; // og evt. antal retter pid = fork(); switch(pid) { Case -1: {error}; exit(1); Case 0: {start filosof} // nyt program eller p-kald? } } } ..
Hvilke beskedkøer ? 1 beskedkø til alle indkommende beskeder kunde Over- tjener filosof 1 beskedkø per kunde til status m.m. • Hvordan aftale kunde-afhængig beskedkø ? • Forbedringer til at håndtere "alle pladser optaget" ?
Arrays og pointere char txt[] = "hello world!\n";; // skaber txt[0].. txt[14] samt txt // hvor txt er adressen på txt[0] putchar(txt[0]); // vi vil se det 1. Tegn ! putchar(txt[13]); // vi vil se det 14. Tegn ! // txt[13] findes ved at lægge 13 til txt putchar(*(txt)) // samme som txt[0] putchar(*(txt + 13)) // samme som txt[13] • Navnet på et array (txt) er en adresse, nemlig adressen på array-ets • første element (txt[0]) og har således lighedspunkter med en pointer. • C tillader "pointer-aritmetik" både med pointere og arraynavne.
Beregning af længden af en streng // naturligt program int strlen(char s[]) { int pos; for (pos=0; s[pos] != '\0'; pos++); // s + pos lægges sammen i hver iteration return pos; } // optimeret med pointer-aritmetik int strlen(char *s) { char *pos; for (pos = s; *pos != '\0'; pos++); // .. hvilket er sparet væk her ! return (pos - s); }