190 likes | 283 Views
Flerbrugermaskine. Fælles maskine. Root: webserver. Peter: uploader filer. Pia: programudvikling. Mange kortlivede processer. 1 langvarig interaktiv proces Af og til 1 langvarig cpu-tung proces. 1 langvarig proces, evt. med børneprocesser skiftende behov
E N D
Flerbrugermaskine Fælles maskine Root: webserver Peter: uploader filer Pia: programudvikling • Mange kortlivede • processer • 1 langvarig interaktiv • proces • Af og til 1 langvarig • cpu-tung proces • 1 langvarig proces, • evt. med børneprocesser • skiftende behov • for cpu og i/o
Skedulerings-målsætning • Retfærdighed (fairness): • alle processer (httpd, ftp, ls, cc) får • lige meget CPU-tid • opmuntrer til processkabelse • retfærdighed ift. samlet forbrug ?? httpd ftp ls cc Skal måske have forrang
Målsætninger for skedulering • Effektivitet (cpu-udnyttelse) • CPU-en aktiv hele tiden • processer der venter på i/o skal give plads til andre • høj prioritet til processer der skifter tilstand fra blokeret til klar ?? • Lav svartid (interaktive brugere) • lille kvantum • retfærdighed ift. samlet forbrug ! • Effektivitet (færdiggørelse af processer) • stort kvantum
To-niveau skedulering kørende Lav-niveau skedulator udvælger klar proces i arbejdsplager blokeret klar Høj-niveau skedulator udvælger processer til arbejds- lager blokeret (ej i arb.lager) klar (ej i arb.lager)
Simpel skeduleringsmulighed:Round-Robin indenfor 1 kø kørende klar Lav-niveau skedulator bruger simpel kø (FIFO) af processer der er klar ls ftp cc ftp cc ls cc ls ftp
Virkemidler for (lav-niveau) skedulator • Størrelsen af tidskvantum • hvor længe en proces råder over cpu-en • (medmindre den blokeres) • Statisk prioritet • generel forrang for udvalgte processer f.eks. webserver • Dynamisk prioritet • prioritering mellem processer med normal statisk prioritet • default er "Round Robin", modificeres for at fremme • "klargjorte" processer (retfærdighed ift. løbende tidsforbrug) • nye processer (retfærdighed ift. samlet tidsforbrug)
Fordel ved stort tidskvantum ... P1 (1 kvantum) Proces- skift P2 (1 kvantum) Proces- skift Minimering af spildtid - tid til processkift er lille i forhold til tidskvantum
Fordel ved lille tidskvantum Hvornår bliver det min tur ? ... P117 P1 Proces- skift P2 Proces- skift • Et lille tidskvantum er vigtigt for lavere svartid til interaktive processer • forudsat: • det pgld. input kan behandles inden for 1 tidskvantum • der er mange processer • processer, der har været i/o-blokerede, ikke prioriteres systematisk
Dynamisk prioritet: placering af "klare" processer i prioritetsklasser Prioritet 4 Har ventet på disk input ls Prioritet 3 ftp Har ventet på terminal input Prioritet 2 Prioritet 1 cc Har brugt megen cpu-tid Httpd ikke med da den er i klasse for sig pga. høj statisk prioritet
Tildeling af dynamisk prioritet ud fra forbrugt cpu-tid • Formål: • at begunstige nye processer • Princip: • jo mere forbrugt cpu-tid, desto lavere prioritet • Pragmatik: • alle processer der har kørt 2-3 sek. har kørt "længe" • Implementation: • Formel: New Priority = Base + CPU-usage (Tanenbaum s. 302) • Tid i sidste sekund tæller 100%, tid i forrige tæller 50%, etc.
Skedulering - opsummering • Enkelte særligt vigtige processer kan give forrang med • statisk prioritet • f.eks. webserverproces • Alle andre processer har principielt lige adgang til cpu-en • Størrelsen af tidskvantum vælges som kompromis • Dynamisk prioritet bruges til finjustering • undgå nedprioritering af processer der blokeres ofte • sikre en (begrænset) nedprioritering af processer der har kørt længe
Hvordan foregår proces-skift ? P1 Proces- skift P2 Proces- skift Skift fra P1 til skedulator: 1. Interrupt sendes af timer eller anden hw-komponent f.eks. HD 2. Interrupt registreres af cpu efter færdiggjort cpu-cyklus 3. Udskiftning af PC (implementeret i hardware) 4. Udskiftning af øvrige registre (program skrevet direkte i assembler) 5. Start af skedulator (program skrevet i C og oversat til maskinsprog) Skift fra skedulator til P2: ….
Implementation af "test og sæt lås" med semafor(forenklet) semaphore sem; down(sem); up(sem); ..; første tilgang af ressource; .. sidste tilgang til ressource; ..; • Hvad er en semafor ? • Har talværdi som altid er større end eller lig nul. • Har atomisk "down" operation som trækker 1 fra hvis muligt, ellers blokeres. • Har atomisk "up" operation som lægger 1 til og vækker blokerede processer.
Hvorfor er semaforer nødvendige? Multiple processer Tilgængelige, fælles ressourcer Automatisk ("preemptive") skedulering Race conditions (kritisk region) Procesblokering f.eks. v.hj.a. semaforer Fejl, inkonsistens Baglås (evt. udsultning)
Problem som kan løses med pointere // to parameteroverførte tal skrives ud sorteret #include <stdio.h> void swap(int *,int *); main(int argc,char *argv[]) { int a,b; a = atoi(argv[1]); // tolker tekststreng som heltal b = atoi(argv[2]); if (a > b) swap(&a,&b); printf("Mindste tal: %d. Største tal: %d. \n",a,b); } swap(int *pa,int *pb) {..}
Brug af pointere i swap() Kaldsomgivelser a: 3 b: 2 Kaldt funktion swap(int *pa,int *pb) { {ombyt det pa og pa peger på} } pa: pb:
getchar(), putchar()(jf. Kernighan/Ritchie s. 16) #include <stdio.h> main() { int c = 'A'; while (c != EOF) { c = getchar(); putchar(c); } • EOF er defineret i stdio.h (vhja. #define) som et bestemt heltal. • putchar() og getchar() skriver/læser til/fra stdout/stdin • Når alm. tegn lagres som heltal arbejdes med tegnets ASCII-værdi. • Specielle 'tegn' har specielle talværdier som evt. overskrider hvad • der kan lagres som 1 tegn (7 bits).
Lavniveau-læsning fra fil #include <stdio.h> #include <fcntl.h> #include <stdlib.h> main () { int c = 'A', fd, count = 1; char myfile[] = "low_level_io.c"; fd = open(myfile,O_RDONLY); if (fd < 0) exit(1); while (count > 0) { count = read(fd,&c,1); write(1,&c,1); } close(fd); } • open/read/write/close arbejder med fildeskriptorer og tegnarrays.
Højniveau-læsning fra fil #include <stdio.h> #include <stdlib.h> main () { int c = 'A'; char myfile[] = "high_level_io.c"; FILE *stream; stream = fopen(myfile,"r"); while (c != EOF) { c = fgetc(stream)) putchar(c); // eller fputc(stdout,c) } fclose(stream); } • fopen/fclose/fgetc/putchar m.fl. arbejder med streams og tilbyder • pænere grænseflade