Oppsummering av IN147 siste del Operativsystemer Parallellisering Veien videre Ark 1 av 12 Forelesning 12.5.1999
Operativsystemer I kurset har vi fokusert på UNIX, men prinsippene gjelder i større eller mindre grad for alle operativsystemer. Hva er en prosess? En prosess er et program under kjøring. Stakk Data Kode Hvordan kommunisere med operativsystemet? En liste systemkall definerer grensesnittet, og dermed egentlig også operativsystemet. UNIX-standarden heter POSIX. Forelesning 12.5.1999 Ark 2 av 12
Hvordan oppstår prosesser Prosesser lages med fork(). De kan endre innhold med execve(program, param-liste, omgivelse). Hvordan dør prosesser? Prosesser avsluttes på én av tre måter: 1. Kall på exit(status). 2. Bruk av return i main. 3. Hovedprogrammet main avsluttes (med uspesifisert statusverdi). Forelesning 12.5.1999 Ark 3 av 12
Hvordan overføres parametre? Programparametrene overføres som de to første parametrene til main: int main(int argc, char *argv[]) Hva er omgivelsen? Omgivelsen er en samling definisjoner om den enkelte bruker og hans eller hennes preferanser. Definisjonene er av typen NAME=dag PATH=/local/bin:/bin:/usr/bin:. PRINTER=prent De overføres på én av to måter: 1. via den globale variabelen extern char **environ; 2. som tredje parameter til main: int main(...,..., char **env) Forelesning 12.5.1999 Ark 4 av 12
Parallellitet Formålet med parallellitetskontrollen er å forhindre kappløp ved å sikre kritiske regioner og hindre vranglås og utsulting. Hvorfor programmerer man parallelt? Noen problemer er naturlig parallelle. For å få opp hastigheten. Teknikker Følgende teknikker er blant de viktigste: UNIX-prosesser med wait(&status) samt UNIX-signaler signal(signalrutine) og pause(). UNIX-rør: pipe(rørvektor), read(rør, buffer, #byte) og write(rør, buffer, #byte). Felles lager, lettvektsprosesser Semaforer Monitorer Meldinger Linda Forelesning 12.5.1999 Ark 5 av 12
Felles lager Et felles lager ligger «utenfor» de prosessene som bruker det: I tillegg trengs synkronisering. Lettvektsprosesser Slike prosesser har kode og data felles: Stakk Stakk Data Kode Synkronisering trengs også her. Forelesning 12.5.1999 Ark 6 av 12
Semaforer En semafor er en datastruktur med en teller og en kø: Verdi Kø - - - Semaforer har to operasjoner: down(&s) Hvis verdien til s er > 0, vil den bli senket med 1. Hvis ikke, vil prosessen bli blokkert og dens nummer lagt til køen til s. up(&s) Hvis køen til s er tom, økes verdien med 1. Hvis ikke, fjernes ett prosessnummer fra køen, og den tilhørende prosessen startes opp igjen. Beskyttelse av kritisk region semaphore mutex = 1; /* Mutual exclusion */. down(&mutex); Kritisk region up(&mutex); Forelesning 12.5.1999 Ark 7 av 12
Monitorer En monitor er en høynivå mekanisme for parallellstyring: Monitor class Eksempel; begin integer I;! Lokal variabel. ; condition C;! Betingelsesvariabel ; procedure P(...);! Operator. ; begiṇ. Wait(C);. Signal(C);. end P; I :=...;! Initiering. ; end Eksempel; ref(eksempel) E; E :- new Eksempel; E.P(...); Forelesning 12.5.1999 Ark 8 av 12
Linda I Linda skjer synkrosineringen og dataoverføringen via et eget tuppellager. Produment-konsumentproblemet med Linda void producer(void) { while (1) { data = produce_item(); in("free"); out("data", data); void consumer(void) { while (1) { in("data",?data); out("free"); consume_item(data); /* Initiering: */ for (i = 1; i <= N; ++i) out("free"); Forelesning 12.5.1999 Ark 9 av 12
Fraktaleksemplet Den «ypperste» utgaven av fraktaleksemplet: Delt lager med en ringbuffer til dataoverføringen. «Oppgaver» hentes fra en egen buffer. Konsumenten void konsument(void) { col_data buf; int cx, iy; for (cx = 0; cx < NX; ++cx) { /* Kritisk region... */ down(full); down(mutex); buf = buffer->data[buffer->outp++]; if (buffer->outp >= BUFSIZE) buffer->outp = 0; up(mutex); up(empty); /*... slutt på kritisk region. */ for (iy = 0; iy < NY; ++iy) { x147plot(buf.xpos, iy, buf.ycol[iy]); x147sync(); Forelesning 12.5.1999 Ark 10 av 12
Produsenten void produsent(void) { float x, y; int ix, iy, fx; col_data buf; while (1) { /* Kritisk region... */ down(xpos); ix = xpos->data[xpos->n++]; up(xpos); /*... slutt på kritisk region. */ if (ix < 0) exit(0); buf.xpos = ix; x = x1 + ix*(x2-x1)/(nx-1); for (iy = 0; iy < NY; ++iy) { y = y1 + iy*(y2-y1)/(ny-1); buf.ycol[iy] = fraktal(x, y, 255.0, MAX); /* Kritisk region... */ down(empty); down(mutex); buffer->data[buffer->inp++] = buf; if (buffer->inp >= BUFSIZE) buffer->inp = 0; up(mutex); up(full); /*... slutt på kritisk region. */ Koden finnes på kursområdet. Forelesning 12.5.1999 Ark 11 av 12
Veien videre Om du liker programmeringsspråk, anbefales IN102 Programmeringslaboratorium IN211 Programmeringsspråk IN310 Kompilatorteknikk operativsystemer, anbefales IN-MOS Moderne operativsystemer IN305 Parallellprogrammering & op.sys parallellitet og kommunikasjon, anbefales IN270 Datakommunikasjon digitalteknikk, anbefales IN240 Digital systemkonstruksjon IN241 VLSI-konstruksjon Forelesning 12.5.1999 Ark 12 av 12