DataMuseum.dk

Presents historical artifacts from the history of:

CR80 Wang WCS documentation floppies

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CR80 Wang WCS documentation floppies

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦e0669ffa5⟧ Wang Wps File

    Length: 40656 (0x9ed0)
    Types: Wang Wps File
    Notes: TJG Forel`sningsnoter     
    Names: »4169A «

Derivation

└─⟦2939611b6⟧ Bits:30006177 8" Wang WCS floppy, CR 0350A
    └─ ⟦this⟧ »4169A « 

WangText



FORM                      SIDE ####
TOMOGRAFISSYSTEM                     
                  TJG 22/10/83
        SYSTEMPROGRAMMERING







    FOREL@SNING…02…:…02…S̲Y̲S̲T̲E̲M̲P̲R̲O̲G̲R̲A̲M̲M̲E̲R̲I̲N̲G̲:̲ ̲K̲O̲R̲U̲T̲I̲N̲E̲R̲,̲
                     P̲R̲O̲C̲E̲S̲S̲E̲R̲,̲ ̲P̲R̲O̲C̲E̲S̲K̲O̲M̲M̲U̲N̲I̲K̲A̲T̲I̲O̲N̲.̲


    INDHOLD:…02……02…:…02…1. Problemstilling:
                        systemprogrammering og multiprogrammer.
                     2. Semaforer.
                     3. Korutiner.
                     4. Korutinemonitor.
                     5. Processer.
                     6. Processer og korutiner.


    1̲.̲ ̲P̲r̲o̲b̲l̲e̲m̲s̲t̲i̲l̲l̲i̲n̲g̲:̲ ̲s̲y̲s̲t̲e̲m̲p̲r̲o̲g̲r̲a̲m̲m̲e̲r̲i̲n̲g̲ ̲o̲g̲ ̲m̲u̲l̲t̲i̲p̲r̲o̲g̲r̲a̲m̲m̲e̲r̲.̲

    …02…En vigtig del af udviklingen af et st]rre programsystem er overvejelserne vedr]rende opdeling
    af programsystemet i mindre, mere overskuelige delsystemer. En m>de at opdele programmerne
    p> er selvf]lgelig opdeling i procedurer, men for st]rre programsystemer er det mere hensigtsm`ssigt
    at implementere programsystemet som e̲t̲ ̲m̲u̲l̲t̲i̲p̲r̲o̲g̲r̲a̲m̲, som kan best> af flere p̲r̲o̲c̲e̲s̲s̲e̲r̲ eller
    k̲o̲r̲u̲t̲i̲n̲e̲r̲ (eller begge dele). Implementeringen kan begynde med udviklingen af det helt ba-
    sale programmel - en korutinemonitor eller en operativ- systemkerne. Oftest vil man dog benytte
    datamaskin- leverand]rens operativsystem. Man skal derfor v`re i stand til at forst> de kommunikations
    og synkroniserings- mekanismer, der stilles til r>dighed i et operativsystem og evt. udvikle
    mere avancerede mekanismer, der bygger p> de basale begreber, der altid findes i et operativsystem.
    Denne form for programmering - udvikling af systemprogrammel - kaldes for s̲y̲s̲t̲e̲m̲p̲r̲o̲g̲r̲a̲m̲m̲e̲r̲i̲n̲g̲.
    Systemprogrammering g>r bl.a. ud p>:

         *   udvikling af b̲a̲s̲i̲s̲p̲r̲o̲g̲r̲a̲m̲m̲e̲l̲, is`r styresystemer,
         *   udvikling af k̲o̲m̲m̲u̲n̲i̲k̲a̲t̲i̲o̲n̲s̲/̲s̲y̲n̲k̲r̲o̲n̲i̲s̲e̲r̲i̲n̲g̲s̲ m̲e̲k̲a̲- n̲i̲s̲m̲e̲r̲, der bygger p> eksisterende
             mekanismer,
         *   udvikling af specielle "̲s̲e̲r̲v̲i̲c̲e̲s̲y̲s̲t̲e̲m̲e̲r̲"̲ - f.eks. specielle filsystemer, der er
             en videreudvikling af eksisterende filsystemer,
         *   implementering af m̲u̲l̲t̲i̲p̲r̲o̲g̲r̲a̲m̲m̲e̲r̲.

    Det er is`r implementering af multiprogrammer og kommunika- tions og synkroniseringsmekanismer,
    der omtales i n`rv`rende forel`sningsnoter. Forel`sningsnoterne har bl.a. til form>l at vise
    hvordan moderne operativsystemer fungerer.


    …02…Et sekventielt program angiver en liste af ordrer som kan eksekveres sekventielt. Udf]relsen
    af et sekventielt program kaldes for e̲n̲ ̲p̲r̲o̲c̲e̲s̲. E̲t̲ ̲m̲u̲l̲t̲i̲p̲r̲o̲g̲r̲a̲m̲ indeholder et, to eller flere
    sekventielle programmer. Et multiprogram kan implementeres som et s`t af p̲a̲r̲a̲l̲l̲e̲l̲l̲e̲ ̲p̲r̲o̲c̲e̲s̲s̲e̲r̲
    eller som et s`t af k̲o̲r̲u̲t̲i̲n̲e̲r̲ som evt. k]rer inden for samme proces. Et multiprogram kan
    udf]res ved at processerne skiftes til at k]re p> samme CPU. Denne form for programafvikling
    kaldes for m̲u̲l̲t̲i̲p̲r̲o̲g̲r̲a̲m̲m̲e̲r̲i̲n̲g̲ og implementeres af en operativ- systemkerne, der multiplexer
    CPU…08…en mellem processerne. Alternativt kunne man dedikere }n CPU til hver proces og bruge
    et f`lles internt lager. Denne form for afvikling af multiprogrammer kaldes for m̲u̲l̲t̲i̲p̲r̲o̲c̲e̲s̲s̲i̲n̲g̲.
    Endelig kan man afvikle multiprogrammer v.h.a. "d̲i̲s̲t̲r̲i̲b̲u̲e̲r̲e̲t̲ ̲p̲r̲o̲c̲e̲s̲s̲i̲n̲g̲" hvor hver proces
    tildeles sin egen datamat (best>ende af CPU og internt lager). Kommunikationen mellem processerne
    under- st]ttes i det sidste tilf`lde af et kommunikationsnetv`rk. De 3 m>der at afvikle multiprogrammer
    p> er illustreret i fig. 1 og fig. 2.














                                          fig. 1
                               afvikling af multiprogrammer
    a) multiprogrammering b) multiprocessing c) distribueret 
                                                processing




         MULTIPROGRAMMERING               MODULER
         MULTIPROCESSING                  PROCEDURER
         DISTRIBUERET PROCESSING          KORUTINER
                                          PROCESSER

                                          fig. 2.
                            systemprogrammering: grundbegreber

    Samarbejdet mellem processerne best>r af to former for informationsudveksling:

         *   p̲r̲o̲c̲e̲s̲k̲o̲m̲m̲u̲n̲i̲k̲a̲t̲i̲o̲n̲ best>r i udveksling af data via buffere; ved proceskommunikationen
             vil afsender- processen p>virke eksekvering af modtagerprocessen,

         *   s̲y̲n̲k̲r̲o̲n̲i̲s̲e̲r̲i̲n̲g̲ er n]dvendig n>r processerne eksekveres med forskellig og ukendt
             relativ hastig- hed; synkronisering bruges n>r f.eks. udelelig ad- gang til f`lles
             variable skal sikres.

    Synkronisering kan betragtes som en udartet form for proces- kommunikation hvor der sendes
    en tom databuffer. Synkro- nisering kan forsinke en proces og den kan garantere at en gruppe
    operationer bliver udf]rt som }n udelelig operation.

    Forst>elsen af multiprogrammer, operativsystemkerner og synkroniseringsmekanismer er af stor
    betydning ved konstruktionen af mere komplicerede datamatiske systemer, is`r proceskontrolsystemer,
    som if]lge sagens natur m> …86…W    …02…    …02…   …02…   …02…   …02…                                           
    overv>ge flere samtidige begivenheder. Udviklingen af multi- programmer og notationer til
    beskrivelse af parallel ud- f]relse af processer har udviklet sig ad to veje:

         *   p̲r̲o̲c̲e̲d̲u̲r̲e̲l̲ ̲n̲o̲t̲a̲t̲i̲o̲n̲ eksemplificeret ved Concurrent Pascal, bygger p> aktive og passive
             objekter (processer og klasser/monitorer). Passive objekter repr`senter f`lles variable
             der kan manipuleres via procedurekald, der implementerer synkronisering og sikrer
             udelelig adgang til data,

         *   b̲e̲s̲k̲e̲d̲o̲r̲i̲e̲n̲t̲e̲r̲e̲t̲ ̲n̲o̲t̲a̲t̲i̲o̲n̲, der kan implementeres i laveller h]jniveau sprog bygger
             p> "s̲e̲n̲d̲" og "r̲e̲c̲e̲i̲v̲e̲" operationer hvorved processerne kan ud- veksle informationer
             i beskedbuffere. 

    Ved beskedorienteret (eng. message passing) notation kan beskedbuffere udveksles p> to forskellige
    m>der:

         *   d̲i̲r̲e̲k̲t̲e̲ ̲n̲a̲v̲n̲g̲i̲v̲n̲i̲n̲g̲ (eng. direct naming) er en me- tode til proceskommunikation
             hvor afsenderprocessen fort`ller hvilken modtagerproces der skal modtage beskedbufferen;
             modtagerprocessen kan p> sin side fort`lle hvilken afsenderproces den forventer
             at f> beskedbufferen fra; som eksempel p> besked- orienteret notation kan man n`vne
             CSP (Communicating Sequential Processes), Gypsy, Plits,

         *   ved i̲n̲d̲i̲r̲e̲k̲t̲e̲ ̲n̲a̲v̲n̲g̲i̲v̲n̲i̲n̲g̲ udveksles informationer ved at processerne bruger p> forh>nd
             aftalte g̲l̲o̲- b̲a̲l̲e̲ n̲a̲v̲n̲e̲ hvor beskedbuffere bliver afleveret og hentet; globale navne
             repr`senter beskedsemaforer ogs> kaldet s̲y̲n̲k̲r̲o̲n̲i̲s̲e̲r̲i̲n̲g̲s̲e̲l̲e̲m̲e̲n̲t̲e̲r̲.



    Brugen af globale navne og beskedsemaforer repr`senter den mest generelle form for processkommunikation,
    der tillader implementering af "mange-til-mange" kommunikation. Forskelle mellem de to former
    for beskedbuffer udveksling fremg>r af fig. 3.













                                          fig. 3.
             a. direkte navngivning
             b. synkroniseringselementer

    Tegnet    repr`senterer et synkroniseringselement.

    De burde v`re klart at brugen af synkroniseringselementer til udveksling af beskedbuffere
    repr`senterer den mest generelle (og den f̲a̲r̲l̲i̲g̲s̲t̲e̲) form for proceskommunikation. Det er
    den foretrukne form for proceskommunikation og synkronisering, is`r til brug for implementering
    af proces- kontrol og datakommunikationssystemer. Denne form for proceskommunikation (og
    operativsystemkerner der bygger p> den), betragtes som "de facto" standard for tidstro opera-
    tivsystemkerner. Mere avancerede og mere restriktive 


    begreber som "direkte navngivning beskedudveksling", monitorer og ADA…08…s rendezvous begreber
    kan implementeres v.h.a. de mere generelle begreber. Derfor er kendskab til beskedsemaforer
    og korutiner (der er en simpel form for processer) en foruds`tning for forst>elsen af nutidens
    operativsystemer og brugen af dem ved implementering af mere komplicererede datamatiske systemer.


    2̲.̲ ̲S̲e̲m̲a̲f̲o̲r̲e̲r̲.̲

    …02…Semaforbegrebet, introduceret af Dijkstra i 1968, var det f]rste fors]g p> at strukturere
    synkroniserings- mekanismer. Man kan egentlig p>st>, at alle synkroniserings- mekanismer
    der er blevet indf]rt senere, bygger p> semafor- begrebet og implementeres som regel v.h.a.
    semaforer, der administreres af en operativsystemkerne. De 2 mest alminde- lige former for
    semaforer gennemg>s nedenunder. Der benyttes en Pascal lignende notation.

    En semafor implementeres v.h.a. en datastruktur og kan be- skrives ved operationer der udf]res
    p> den. Operationerne betegnes normalt "w̲a̲i̲t̲" og "s̲i̲g̲n̲a̲l̲" eller "s̲e̲n̲d̲" og "r̲e̲c̲e̲i̲v̲e̲".

    Man kan betragte flg. situation: et st]rre programsystem ]nskes implementeret og afviklet
    p> en datamat. Program- systemet ]nskes implementeret som et multiprogram, der be- nytter
    sig af procesbegrebet. Processerne har behov for at synkronisere og udveksle data. Dertil
    benyttes semaforer, som omtales nedenunder. Operationerne p> semaforer udf]res som procedurekald
    til c̲e̲n̲t̲r̲a̲l̲l̲o̲g̲i̲k̲k̲e̲n̲, der implementerer udelelelige operationer p> bl.a. semaforer. Centrallogikken
    benytter sig af en r`kke datastrukturer og "variable":

         *   "ready ̲list" er en liste af processer, der er parate til at k]re,

         *   "current ̲process" er identifikationen af den k]rende proces.

    Desuden benyttes der en datatype "pointer", der kan inde- holde pegepinde til alle datastrukturer
    i datamatens interne lager.


    Da operationer p> lister er hj]rnestenen i operativsystem- kerner og i en korutineorienteret
    centrallogik benyttes der nogle simple (forh>bentlig selvforklarende) procedurekald til listemanipulerende
    procedurer, der udf]rer typiske operationer p> lister.
    Proceduren "select ̲candidate" medf]rer udskiftning af den k]rende proces med en proces fra
    "ready ̲list".

    G̲e̲n̲e̲r̲e̲l̲l̲e̲ ̲s̲e̲m̲a̲f̲o̲r̲e̲r̲.̲

    t̲y̲p̲e̲ general ̲semaphore = r̲e̲c̲o̲r̲d̲
                                value : integer;
                                head  : pointer
                                "pointer to process/corutine 
                                 description"
                             e̲n̲d̲; 

    p̲r̲o̲c̲e̲d̲u̲r̲e̲ wait(v̲a̲r̲ s:general ̲semaphore);
    b̲e̲g̲i̲n̲
       i̲f̲ s.value gt 0
            t̲h̲e̲n̲
                s.value:=s.value-1
             e̲l̲s̲e̲
                b̲e̲g̲i̲n̲
                   insert ̲process(s.head, current ̲process);
                   select ̲candidate()
                e̲n̲d̲;
    e̲n̲d̲;

    p̲r̲o̲c̲e̲d̲u̲r̲e̲ signal(v̲a̲r̲ s:general ̲semaphore);
    b̲e̲g̲i̲n̲
       i̲f̲ empty(s.head) 
          t̲h̲e̲n̲
             s.value:=s.value+1
          e̲l̲s̲e̲
             insert ̲process(ready ̲list, first(s.head))
    e̲n̲d̲;



    Virkningerne af signal/wait kaldene kan beskrives p> f]lgende m>de:

         *   w̲a̲i̲t̲ - hvis semaforv`rdien er 0, inds`t den kaldende proces bagest i k]en (processen
             aktiveres n>r en anden proces har kaldt signal), ellers reduc}r t`lleren med 1,

         *   s̲i̲g̲n̲a̲l̲ - hvis procesk]en er tom, for]g t`lleren med 1, ellers flyt f]rste proces
             fra semaforens procesk] til "ready ̲list".


    B̲e̲s̲k̲e̲d̲s̲e̲m̲a̲f̲o̲r̲e̲r̲.̲

    t̲y̲p̲e̲ message ̲semaphore = r̲e̲c̲o̲r̲d̲
                                state : integer;
                                process ̲queue : pointer;
                                message ̲queue : pointer
                             e̲n̲d̲;

         message = r̲e̲c̲o̲r̲d̲
                      next : pointer;
                      data : array (1..msg ̲size) of integer
                   e̲n̲d̲;


    p̲r̲o̲c̲e̲d̲u̲r̲e̲ receive(v̲a̲r̲ op:message;
    …02……02……02…     v̲a̲r̲ s:message ̲semaphore);
    b̲e̲g̲i̲n̲
       i̲f̲ s.state gt 0
          t̲h̲e̲n̲
            b̲e̲g̲i̲n̲
               "message queue is not empty"
               remove ̲message(first(s.message ̲queue), op)
               s.state:=s.state-1
            e̲n̲d̲
          e̲l̲s̲e̲
            b̲e̲g̲i̲n̲
               "message queue is empty"
               insert ̲process2(s.process ̲queue, current ̲process,
                      s.message ̲queue, op);
               s.state:=s.state-1;
               select ̲candidate()
            e̲n̲d̲;
    e̲n̲d̲;

    p̲r̲o̲c̲e̲d̲u̲r̲e̲ send(v̲a̲r̲ op:message; v̲a̲r̲ s:message ̲semaphore);
    b̲e̲g̲i̲n̲
       i̲f̲ s.state ge 0 
          t̲h̲e̲n̲
            "process list is empty"
            insert ̲message(s.message ̲queue, op)
          e̲l̲s̲e̲
            "process list is not empty"
            insert ̲process3(ready ̲list, first(s.process ̲queue),
                            first(s.message ̲queue), op);
       s.state:=s.state+1
    e̲n̲d̲;



    Semaforen repr`senteres af en datastruktur, der best>r af flg. elementer:

         *   p̲r̲o̲c̲e̲s̲s̲k̲]̲ - k]en af processer der venter p> beskeder,

         *   b̲e̲s̲k̲e̲d̲k̲]̲ - k]en af beskeder der venter p> at blive afhentet,
             til ethvert tidspunkt kan der enten v`re beskeder i beskedk]en eller processer i
             procesk]en,

         *   e̲n̲ ̲t̲`̲l̲l̲e̲r̲, der kan antage flg. v`rdier:

             t`ller = 0         b>de processog beskedk]en er
                                tom,
             t`ller = 1,2,...   procesk]en er tom, beskedk]en
                                indeholder beskeder,
             t`ller =-1,-2,...  processk]en indeholder processer
                                beskedk]en er tom.

    Den ovenfor beskrevne semafortype er vist i fig. 4. 











                                          fig. 4.
                                      beskedsemaforer



    Beskedsemaforer kaldes ogs> for o̲p̲e̲r̲a̲t̲i̲o̲n̲s̲s̲e̲m̲a̲f̲o̲r̲e̲r̲ (opera- tion=besked) eller for synkroniseringselementer.
    Besked- semaforer er fuldt ud t̲i̲l̲s̲t̲r̲`̲k̲k̲e̲l̲i̲g̲e̲ til at implementere multiprogrammer: synkronisering
    kan opn>s ved at man sender tomme beskedbuffere, kommunikation implementeres via besked-
    buffere. Der findes ogs> andre semafortyper, men de to oven- for beskrevne er dog de mest
    almindeligt forekommende.
    B̲e̲m̲`̲r̲k̲n̲i̲n̲g̲: de viste signal/send operationer er i̲k̲k̲e̲-̲b̲l̲o̲k̲e̲r̲e̲n̲d̲e̲ operationer, dvs. de implementerer
    a̲s̲y̲n̲k̲r̲o̲n̲ kommunikation. B̲l̲o̲k̲k̲e̲r̲e̲n̲d̲e̲ signal/send implementerer synkron kommunikation.

    Beskedsemaforer kan betragtes som standard synkroniserings og kommunikationsmekanismer i
    moderne operativsystemer. Nogle af >rsagerne til, at beskedudvekslingen er s> popul`r, er:

         *   den er v̲e̲l̲e̲g̲n̲e̲t̲ til s>vel traditionel m̲u̲l̲t̲i̲- p̲r̲o̲g̲r̲a̲m̲m̲e̲r̲i̲n̲g̲ som til m̲u̲l̲t̲i̲p̲r̲o̲c̲e̲s̲s̲i̲n̲g̲
             og d̲i̲s̲t̲r̲i̲b̲u̲e̲r̲e̲t̲ ̲p̲r̲o̲c̲e̲s̲s̲i̲n̲g̲,

         *   den tillader implementering af st]rre program- systemer som et s`t af meget l]st
             forbundne a̲s̲y̲n̲k̲r̲o̲n̲t̲ ̲k̲]̲r̲e̲n̲d̲e̲ ̲p̲r̲o̲c̲e̲s̲s̲e̲r̲, en process kan igang- s`tte en operation
             hos en serviceproces, forts`tte med at k]re, og afhente resultatet af operationen,
             n>r den har behov for det,

         *   andre velstrukturerede synkroniseringsmekanismer som f.eks. monitorer og rendezvous
             kan implementers v.h.a. beskedudveksling.


    3̲.̲ ̲K̲o̲r̲u̲t̲i̲n̲e̲r̲.̲

    …02…Korutiner er en udvidelse af procedure og subrutine be- greberne. Korutiner er delprogrammer
    der kan kalde hinanden - n>r de bliver kaldt forts`tter de fra det sted, de var n>et til.
    I eksemplet nedenunder vises 3 korutiner A, B og C. Korutiner afl]ser hinanden v.h.a. af
    operationen "r̲e̲s̲u̲m̲e̲". Denne operation kan enten v`re direkte imple- menteret i et h]jere
    programmeringssprog, som f.eks. i Simula, eller v`re implementeret som et procedurekald til
    en centrallogik, der kaldes for e̲n̲ ̲k̲o̲r̲u̲t̲i̲n̲e̲m̲o̲n̲i̲t̲o̲r̲. A er den f]rste korutine der aktiveres.

    c̲o̲r̲u̲t̲i̲n̲e̲ A;          c̲o̲r̲u̲t̲i̲n̲e̲ B;         c̲o̲r̲u̲t̲i̲n̲e̲ C;
    b̲e̲g̲i̲n̲                b̲e̲g̲i̲n̲               b̲e̲g̲i̲n̲
     r̲e̲p̲e̲a̲t̲               r̲e̲p̲e̲a̲t̲              r̲e̲p̲e̲a̲t̲
       A1                   B1                  C1
       resume(B);           resume(C);          resume(A);
       A2                   B2                  C2
     f̲o̲r̲e̲v̲e̲r̲;             f̲o̲r̲e̲v̲e̲r̲;              resume(B);
    e̲n̲d̲;                 e̲n̲d̲;                   C3
                                              f̲o̲r̲e̲v̲e̲r̲;
                                             e̲n̲d̲;

                                          fig. 5.
                                  eksempel : 3 korutiner

    A1, A2, B1, B2, C1, C2 og C3 repr`senterer operationer, der udf]res udeleligt. Hvis A aktiveres
    som den f]rste korutine f>r man f]lgende sekvens af operationer:

         A1 B1 C1 A2 A2 B2 B1 C2 B2 B1 C3 C1 A2 A1 B2 B1 ...

    De steder hvor korutiner afl]ser hinanden kaldes v̲e̲n̲t̲e̲- p̲u̲n̲k̲t̲e̲r̲. Et ventepunkt angiver, at
    en korutine ikke ]nsker eller ikke kan forts`tte.


    Man kan p>st>, at hver korutine implementerer en proces. "resume" svarer til en simpel processynkronisering.
    I̲ ̲e̲t̲ k̲o̲r̲u̲t̲i̲n̲e̲s̲y̲s̲t̲e̲m̲ ̲h̲a̲r̲ ̲m̲a̲n̲ ̲p̲>̲ ̲f̲o̲r̲h̲>̲n̲d̲ ̲f̲a̲s̲t̲l̲a̲g̲t̲ ̲a̲l̲l̲e̲ ̲p̲r̲o̲c̲e̲s̲s̲k̲i̲f̲t̲. Korutiner kan derfor betragtes
    som parallelle processer, der k]rer s̲y̲n̲k̲r̲o̲n̲t̲. Det klassiske udelelighedsproblem eksisterer
    simpelthen ikke i et korutinesystem.

    Den skitserede model af et korutinesystem er ret ubrugelig til praktiske anvendelser, og
    de fleste korutinesystemer tillader da ogs> flere operationer end bare "resume". I de fleste
    korutinesystemer, der underst]ttes i h]jere programmeringssprog kan man ogs> udf]re operationer
    som f.eks. "start(corutine)" s>ledes at man kan inds`tte flere korutiner i centrallogikkens
    "ready ̲list". Et virkeligt effektivt system opbygges dog f]rst n>r man benytter besked og
    generelle semaforer. En "signal" eller "send" operation vil bevirke at en korutine flyttes
    til "ready ̲list". En korutine kan aktivere flere korutiner ved at den signalerer til flere
    semaforer. En "wait" eller "receive" operation kan blokere en korutine - den bliver indsat
    i semaforens procesk]. Derved opn>r man at flere korutiner kan v`re i ventepunkter (og endda
    vente p> samme semafor) og der kan ligeledes v`re flere korutiner i "ready ̲list" der kan
    k]re. Beskedsemaforer er ogs> en udm`rket mekanisme til implementering af r̲e̲s̲o̲u̲r̲c̲e̲p̲u̲l̲j̲e̲r̲.
    Man kan f.eks. h`gte en r`kke buffere (beskedbuffere) p> en beskedsemafor og bruge semaforen
    som e̲n̲ ̲b̲u̲f̲f̲e̲r̲p̲u̲l̲j̲e̲:

         "initialiseringsprogram initialiserer bufferpuljen p> flg. m>de:"

         f̲o̲r̲ i:=1 t̲o̲ no ̲buffers d̲o̲
            send(buffer ̲pool, buffer(i));

         "korutiner kan bruge bufferpuljen nu"



         "korutine 1"
             receive(buffer ̲pool, buffer);

             "l`g data i bufferen og aktiver korutine 2"

             send(op ̲sema, buffer);

         "korutine 2"

             "korutinen der venter p> data f>r fat i databuffer ved"

             receive(op ̲sema, buffer);

             "bufferen kan frigives ved"

             send(buffer ̲pool, buffer);

    Bufferpuljer benyttes meget ofte i forbindelse med ko- rutiner, is`r i forbindelse med proceskontrol.
    Dette skyldes, at korutiner i sig selv ikke garanterer at man kan n> at behandle alle data
    fra f.eks. et m>leapparat. Ko- rutiner k]rer synkront, dvs. de afl]ser hinanden i et p> forh>nd
    fastlagt r`kkef]lge. Benytter man et korutinesystem til proceskontrol, m> man v`re forberedt
    p>, at der pludseligt kan komme for mange data til at man kan n> at be- handle dem. Bufferpuljer
    og beskedsemaforer udj`vner i dette tilf`lde tdisafh`ngige variationer i inddatam`ngden.



    For at anskuelligg]re et korutinesystem der benytter sig af generelle og beskedsemaforer
    kan man betragte et meget simpelt system best>ende af 5 korutiner:

         p̲r̲o̲d̲u̲c̲e̲r̲  P  er en korutine, der p> mystisk vis 
                   fremskaffer data, som afhentes af
         i̲n̲p̲u̲t̲t̲e̲r̲  I  forbehandler data og afleverer dem til 
         c̲o̲n̲s̲u̲m̲e̲r̲  C  er en korutine der behandler data og 
                   afleverer dem i samme buffer til 
         o̲u̲t̲p̲u̲t̲t̲e̲r̲ O  korutine der efterbehandler data og bruger
         f̲i̲l̲s̲y̲s̲    F  korutine til opbevaring af det endelige 
                   resultat.

    Alle detaljer ang>ende implementering af afbrydelses- behandling og fysiske inddata/uddata
    transporter er med vilje udeladt. Strukturen af dette korutinesystem er skitseret i fig.
    6. 















                                          fig. 6.
                                 korutinesystem - eksempel
    Tegnet    betegner en beskedsemafor.…86…W    …02…    …02…   …02…   …02…   …02…                                  
            
    Korutinerne i eksemplet kan implementeres som vist neden- under:
         c̲o̲r̲u̲t̲i̲n̲e̲ P;
         b̲e̲g̲i̲n̲
             r̲e̲p̲e̲a̲t̲
                 receive(P ̲buf, buffer ̲pool);
                 "produce data"
                 send(P ̲buf, P ̲I ̲sema);
             f̲o̲r̲e̲v̲e̲r̲;
         e̲n̲d̲;

         c̲o̲r̲o̲u̲t̲i̲n̲e̲ I;
         b̲e̲g̲i̲n̲
             r̲e̲p̲e̲a̲t̲
                 receive(I ̲buf, P ̲I ̲sema);
                 "use data"
                 send(I ̲buf, I ̲C ̲sema);
             f̲o̲r̲e̲v̲e̲r̲;
         e̲n̲d̲;

    P> tilsvarende m>de vil man implementere de resterende ko- rutiner. Korutiner implementeres
    som regel som uendelige l]kker, hvor korutinen venter p> en besked, behandler data og evt.
    sender dem videre til n`ste korutine. Har man brug for at starte og stoppe et korutinesystem
    kan man struk- turere beskeder, der derved f>r karakter som operationer, p> flg. m>de:

    t̲y̲p̲e̲ operation = r̲e̲c̲o̲r̲d̲
                        link    : pointer;
                        command : (start,stop,continue);
                        data    : array (1..size) of integer
                     e̲n̲d̲;



    Korutinen kan fortolke data i operationen og udf]re en aktion angivet ved indholdet af kommandofeltet:

         r̲e̲p̲e̲a̲t̲
             receive(op, sema);
             c̲a̲s̲e̲ op.command o̲f̲
                 start :    "initialize processing" ;
                 stop :     "stop processing" ;
                 continue : "continue processing"
             e̲n̲d̲;
         f̲o̲r̲e̲v̲e̲r̲;

    Som en slags simpel ]velse kan man overveje hvad der sker, hvis korutinesystemet i eksemplet
    skal kunne startes og stoppes. Man kan starte alle korutiner ved at man sender startkommandoer
    til P ̲I ̲sema, I ̲C ̲sema, osv. P korutinen skal vente p> startkommandoen p> en speciel semafor
    P ̲sema.  Det er lidt sv`rere at afslutte "evighedsmaskinen". Man skal sende en stopkommando
    til P, der sender den videre til I, der ... . Til sidst havner stopkommandoen hos F, der
    kan signalere til hovedkorutinen H, der sender start og stop- kommandoer. Hovedkorutinen
    venter p> en ekstern begivenhed. N>r den er indtruffet startes der korutinesystemet. N>r
    man har "trykket p> knappen" for anden gang sendes der en stop- kommando. N>r svaret fra
    F foreligger kan man lukke systemet ned. Systemet er skitseret i fig. 7.



                      fig . 7. - se n`ste side

























                                          fig. 7.
                                 eksemplet - forts`ttelse



    Ovenst>ende betragtninger f]rer til konklusionen, at hvis et korutinesystem skal fungere
    som et effektivt process- kontrolsystem, skal det kunne h>ndtere a̲f̲b̲r̲y̲d̲e̲l̲s̲e̲r̲. Udvides systemet
    i eksemplet med a̲f̲b̲r̲y̲d̲e̲l̲s̲e̲s̲b̲e̲h̲a̲n̲d̲l̲i̲n̲g̲ f>r man et meget simpelt og som regel uhyre effektivt
    styresystem. S>danne systemer benyttes i form>lsbundne mini og mikro- datamater der bruges
    til proceskontrol.      og "timeslicing" mekanisme. Selve centrallogikken bliver et meget simpelt program - nogen
    gange er den p> 100-200 maskininstruktioner. Ved proceskontrol (eller ko- rutineorienterede
    styresystemer) bruges normalt }n korutine til hver ekstern begivenhed, eller m>leapparat
    der kan for- >rsage begivenheden. Som et simpelt eksempel kan man be- tragte en korutine,
    der overv>ger en terminal: n>r der t`ndes for terminalen, signaleres der til en central ko-
    rutine, der opdaterer tilstandstabeller.

    D̲r̲i̲v̲p̲r̲o̲g̲r̲a̲m̲m̲e̲r̲ kan implementeres som en korutine, der venter p> besked fra en anden korutine,
    der har behov for en data- transport. Drivprogrammet vil igangs`tte en operation og vente
    p> en semafor, som afbrydelsesprogrammet signalerer til. Denne helt element`re model af et
    drivprogram er vist i fig. 8.









                                          fig. 8
                                  model af et drivprogram



    Som tidligere n`vnt, h>ndteres variationer i inddatam`ngden i et korutinesystem v.h.a. bufferpuljer.
    En vigtig forud- s`tning for at et korutinesystem kan fungere korrekt og op- fylde sit form>l
    er at korutiner afl]ser hinanden relativt ofte. For at undg> at langvarige beregninger blokerer
    for vigtige korutiner har man i nogle korutinesystemer opera- tionen "reschedule" - et simuleret
    ventepunkt - der ind- s`tter den aktive korutine bagest i "ready ̲list". Fejl i ko- rutiner,
    f.eks. uendelige l]kker, kan f> systemet til at g> i bagl>s. Som et alternativ eller supplement
    til "reschedule" kunne man indf]re en p̲r̲i̲o̲r̲i̲t̲e̲r̲i̲n̲g̲ af korutiner. Udvides dette system med
    "timeslicing", s> er man meget t`t p> et egentligt procesorienteret styresystem.


    4̲.̲ ̲K̲o̲r̲u̲t̲i̲n̲e̲m̲o̲n̲i̲t̲o̲r̲.̲

    …02…Korutinemonitor er centrallogikken i et korutinesystem. En korutinemonitor betjener sig af
    korutineposter, der kan v`re erkl`ret p> flg. m>de:

    t̲y̲p̲e̲ entry ̲point = absolute ̲program ̲address;

         coroutine ̲record = r̲e̲c̲o̲r̲d̲
                               link : coroutine ̲link;
                               "pointer to next coroutine ̲record"
                               context ̲save : context ̲save ̲area;
                               "machine dependent register save
                                area"
                               entry : entry ̲point
                               "jump address necessary to resume 
                                a corutine"
                            e̲n̲d̲;

    Af andre typedefinitioner kan man n`vne:

    t̲y̲p̲e̲ coroutine ̲queue = r̲e̲c̲o̲r̲d̲
                              first,
                              last  : coroutine ̲link
                           e̲n̲d̲;

         message ̲queue   = message ̲link;

    De tidligere definerede semaforer kan erkl`res p> flg. m>de:

    t̲y̲p̲e̲ general ̲semaphore  = r̲e̲c̲o̲r̲d̲
                                 value : integer;
                                 queue : coroutine ̲queue
                              e̲n̲d̲;



          message ̲semaphore = r̲e̲c̲o̲r̲d̲
                                 state   : integer;
                                 c ̲queue : coroutine ̲queue;
                                 m ̲queue : message ̲queue
                              e̲n̲d̲;

    og beskedbuffere kan erkl`res p> flg. m>de:

    t̲y̲p̲e̲ message ̲buffer = r̲e̲c̲o̲r̲d̲
                             link : buffer ̲link;
                             data : array (1..size) of integer
                          e̲n̲d̲;

    Variable "ready ̲list" og "current ̲coroutine" er givet ved:

    v̲a̲r̲ ready ̲list : coroutine ̲queue;
        current ̲coroutine : coroutine ̲link;

    Korutinemonitor kan aktiveres v.h.a. procedurekald i maskinn`re programmeringssprog. Nedenfor
    er der angivet de mest typiske korutinemonitor procedureindgange:

    i̲n̲i̲t̲i̲a̲l̲i̲s̲e̲r̲i̲n̲g̲s̲p̲r̲o̲c̲e̲d̲u̲r̲e̲r̲:

    init ̲coroutine ̲monitor(v̲a̲r̲ c:coroutine ̲record)
         "initialiserer korutinemonitor og `ndrer det kaldende program til en korutine"

    init ̲coroutine(v̲a̲r̲ c:coroutine ̲record; entry:entry ̲point)
    init ̲semaphore(v̲a̲r̲ s:general ̲semaphore; value:integer)
    init ̲m ̲sema(v̲a̲r̲ s:message ̲semaphore)



    s̲e̲m̲a̲f̲o̲r̲o̲p̲e̲r̲a̲t̲i̲o̲n̲e̲r̲:

    signal(v̲a̲r̲ s:general ̲semaphore)
    wait(v̲a̲r̲ s:general ̲semaphore)
    send(v̲a̲r̲ b:buffer ̲link; v̲a̲r̲ s:message ̲semaphore)
    receive(v̲a̲r̲ b:buffer ̲link; v̲a̲r̲ s:message ̲semaphore)


    d̲i̲v̲e̲r̲s̲e̲ ̲o̲p̲e̲r̲a̲t̲i̲o̲n̲e̲r̲:̲

    reschedule() "simuleret ventepunkt"
    remove()     "fjerner den kaldende korutine"



    5̲.̲ ̲P̲r̲o̲c̲e̲s̲s̲e̲r̲.̲

    …02…Ved en proces forst>s udf]relsen af et program. Processerne implementeres p> en datamat af
    en operativ- systemkerne. Processerne implementeres af kernen ved at hver proces tildeles
    en beskrivelse, der indeholder tilstand- svariable, og pegepinde til de datastrukturer, der
    er n]d- vendige for implementeringen af processen. Som eksempler p> de datastrukturer kan
    man n`vne "segment ̲tabeller", "page ̲translation ̲tabeller" og andre datastrukturer, der er
    forud- s`tningen for at et program kan udf]res som en proces. Procesbeskrivelsen vil indeholde
    processens tilstand - k]rende, parat, blokeret, inaktiv, "d]d" - og maskinafh`ngig areal
    til opbevaring af registre, s>ledes at en proces kan afbrydes og igangs`ttes p> et vilk>rligt
    sted. Den maskin- afh`ngige registeropbevaringsareal kaldes "c̲o̲n̲t̲e̲x̲t̲ ̲s̲t̲o̲r̲a̲g̲e̲" og bruges ved
    "c̲o̲n̲t̲e̲x̲t̲ ̲s̲w̲i̲t̲c̲h̲i̲n̲g̲" - processkift, som bruges ved multiprogrammering. Processkift kan skyldes,
    at processens tidskvantum er udl]bet - man taler da om "̲p̲r̲e̲e̲m̲p̲t̲i̲o̲n̲"̲. 

    Udf]relsen af processerne overv>ges af en del af kernen - "p̲r̲o̲c̲e̲s̲s̲ ̲m̲a̲n̲a̲g̲e̲r̲" - der:
         *   tildeler CPU…08…er til processerne (ved multi- processing),
         *   multiplexer CPU…08…en mellem processerne (ved multi- programmering),
         *   flytter procesbeskrivelser mellem lister, der er knyttet til de mulige procestilstande
             - flytning sker som resultat af kernekald, der udf]res af andre processer, eller
             fordi processens tidskvantum er udl]bet.



    Foruden p̲r̲o̲c̲e̲s̲s̲t̲y̲r̲i̲n̲g̲ vil kernen indeholde fasciliteter til:

         *   p̲r̲o̲c̲e̲s̲s̲k̲o̲m̲m̲u̲n̲i̲k̲a̲t̲i̲o̲n̲ ̲o̲g̲ ̲s̲y̲n̲k̲r̲o̲n̲i̲s̲e̲r̲i̲n̲g̲,

         *   r̲e̲s̲o̲u̲r̲c̲e̲k̲o̲n̲t̲r̲o̲l̲ og tildeling,

         *   centraliseret s̲i̲k̲k̲e̲r̲h̲e̲d̲k̲o̲n̲t̲r̲o̲l̲,

         *   l̲a̲g̲e̲r̲s̲t̲y̲r̲i̲n̲g̲ og allokering,

         *   styring af a̲f̲b̲r̲y̲d̲e̲l̲s̲e̲r̲ og ydre enheder.

    Resourcekontrol har til form>l at holde styr p> kernens "resourcer". Som et eksempel p> en
    resource kan man betragte processbeskrivelser. Der findes kun et endeligt antal processbeskrivelser.
    Derfor skal en ny proces, der igang- s`ttes, indikere hvor mange nye processer den vil oprette,
    s>ledes at der kan reserveres et passende antal tomme procesbeskrivelser.

    Sikkerhedskontrol har til hensigt at sikre at fejlbeh`ftede processer ikke ]del`gger hele
    systemet. Foruden addresseringsfejl, der forh>bentlig fanges af materiellet, kan processerne
    signalere til forkerte semaforer, fors]ge at slette synkroniseringselementer, osv.

    Lagerstyringsmekanismer implementerer l̲o̲g̲i̲s̲k̲ ̲a̲d̲r̲e̲s̲s̲e̲r̲u̲m̲ for processerne. Det kan implementeres
    via v̲i̲r̲t̲u̲e̲l̲t̲ ̲l̲a̲g̲e̲r̲ (med eller uden d̲e̲m̲a̲n̲d̲ ̲p̲a̲g̲i̲n̲g̲) og/eller via s̲e̲g̲m̲e̲n̲t̲e̲r̲e̲t̲ ̲l̲a̲g̲e̲r̲.

    Endelig kan kernen indeholde en symbolsk objektkatalog. Kerneobjekter - som kan v`re lagersegmenter,


    synkroniseringselementer, processer - kan altid identi- ficeres af numre, men det er en farlig
    metode. Det er at foretr`kke, at de kan identificeres via symbolske navne, s>ledes at man
    undg>r at skrive
         receive(buf, 2)
    men i stedet skriver
         receive(buf,"io ̲syncel").

    Den ovenfor beskrevne kerne g]r det muligt at implementere e̲t̲ ̲o̲p̲e̲r̲a̲t̲i̲v̲s̲y̲s̲t̲e̲m̲, der f.eks.
    kan v`re et terminal- styresystem eller et mere specielt proceskontrolsystem. T̲i̲d̲s̲t̲r̲o̲ ̲e̲g̲e̲n̲s̲k̲a̲b̲e̲r̲
    ved et operativsystem er egentlig imple- menteret i kernen. Den skal kunne tillade en p̲r̲i̲o̲r̲i̲t̲e̲r̲i̲n̲g̲
    af processerne og g̲a̲r̲a̲n̲t̲e̲r̲e̲ ̲e̲n̲ p̲r̲o̲c̲e̲s̲a̲f̲v̲i̲k̲l̲i̲n̲g̲, der g]r det muligt, at nogle processer meget
    hurtigt f>r CPU tid og f>r lov til at k]re i lang tid ved evt. at blokere for processer med
    lavere prioritet. Kernen skal ligeledes underst]tte e̲n̲ ̲h̲u̲r̲t̲i̲g̲ ̲f̲o̲r̲m̲ ̲f̲o̲r̲ s̲i̲g̲n̲a̲l̲e̲r̲i̲n̲g̲ via f.eks.
    bin`re semaforer. Tidstro systemer skal ligeledes kunne garantere en h̲u̲r̲t̲i̲g̲ ̲b̲e̲h̲a̲n̲d̲l̲i̲n̲g̲ af
    afbrydelser inden for n`rmere angivne tids- gr`nser.

    Det er vigtigt at huske at e̲t̲ ̲o̲p̲e̲r̲a̲t̲i̲v̲s̲y̲s̲t̲e̲m̲ ̲e̲r̲ ̲e̲n̲ ̲p̲r̲o̲c̲e̲s̲, der opretter og nedl`gger andre
    processer. Den f>r tildelt alle systemets resourcer, som den deler ud til sine b]rne- processer.
    Den er aktiv i implementeringen af en sikkerheds- kontrol ved at den giver b]rneprocesserne
    lov til at "r]re" ved bestemte kerneobjekter.Dette kan ske p> to m>der:

         *   ved e̲k̲s̲p̲l̲i̲c̲i̲t̲ ̲o̲p̲r̲e̲m̲s̲n̲i̲n̲g̲ af alle objekter som en b]rneproces kan arbejde p>,
         eller


         *   ved at tildele b]rneprocessen e̲t̲ ̲s̲i̲k̲k̲e̲r̲h̲e̲d̲s̲p̲r̲o̲f̲i̲l̲ der bliver sammenlignet med objekternes
             sikkerheds- profiler p> udf]relsestidspunktet,
         og

         *   ved at angive h̲v̲i̲l̲k̲e̲ ̲f̲u̲n̲k̲t̲i̲o̲n̲e̲r̲, der kan udf]res p> et objekt.

    Nogle systemer vil tillade, at b]rneprocessen igen opretter b]rneprocesser - b]rneprocessen
    fungerer s> som et operativ- system for sine b]rneprocesser. P> den m>de kan man opbygge
    e̲t̲ ̲o̲p̲e̲r̲a̲t̲i̲v̲s̲y̲s̲t̲e̲m̲ ̲h̲i̲e̲r̲a̲r̲k̲i̲ - se fig. 8. Et klassisk eksempel er RC4000 Multiprogramming System.


















                                          fig. 8.
                                      proceshierarki



    Der er to afg]rende forskelle mellem korutiner og processer:

         *   p̲r̲o̲c̲e̲s̲s̲e̲r̲n̲e̲ ̲u̲d̲f̲]̲r̲e̲s̲ ̲p̲a̲r̲a̲l̲l̲e̲l̲t̲, i mods`tning til ko- rutiner, der udf]res "semiparallelt",

         *   processernes l̲o̲g̲i̲s̲k̲e̲ ̲a̲d̲r̲e̲s̲s̲e̲r̲u̲m̲ er som regel totalt f̲y̲s̲i̲s̲k̲ ̲a̲d̲s̲k̲i̲l̲t̲e̲, s>ledes at
             en proces ikke kan, hverken med vilje eller ved et tilf`lde, f> adgang til en anden
             proces…08… adresserum; processerne kan ogs> v`re implementeret p> f̲y̲s̲i̲s̲k̲ ̲u̲a̲f̲h̲`̲n̲g̲i̲g̲e̲
             datamater.

    Den sidste fascilitet plejer at v`re implementeret i materiellet. Kan den sidste betingelse
    ikke opfyldes, skal man helst benytte h]jniveau programmeringssprog (som f.eks. Concurrent
    Pascal, ADA) for at sikre en korrekt implementering af processer. Der er dog en helt klar
    tendens ved udviklingen af moderne datamaskiner: de indeholder meget avancerede fasciliteter
    til implementering af adskilte adresseringsrum.

    …02…Den mest typiske form for proceskommunikation er den tidligere beskrevne beskedudveksling.
    Nogen gange findes der ogs> en "m̲e̲s̲s̲a̲g̲e̲/̲a̲n̲s̲w̲e̲r̲" beskedudveksling - beskeder deles i to grupper
    : "messages" og "answers". Processerne kan sende og modtage beskeder og svar. Ofte vil man
    ogs> finde meka- nismer til simpel synkronisering - generelle semaforer eller is`r bin`re
    semaforer, som ben`vnes "event flags". Besked- udvekslingen v.h.a. synkroniseringselementer
    g]r det muligt at opbygge et programsystem som et s`t af asynkront k]rende, l]st fobundne
    


    processer. I og med at processerne udf]res i adskilte fysiske adresserum kr`ves der en anderledes
    beskedudveksling end den der blev benyttet i et korutinesystem:

         *   synkroniseringselementer kan kun m̲a̲n̲i̲p̲u̲l̲e̲r̲e̲s̲ ̲a̲f̲ k̲e̲r̲n̲e̲n̲, processerne har ikke adgang
             til semafor- v`rdier,

         *   beskedudveksling sker ved k̲o̲p̲i̲e̲r̲i̲n̲g̲ af indholdet af beskeder.

    Selve "send/receive" kaldene bliver ogs> anderledes: man skal stadigv`k angive adressen p>
    beskedbufferen, men synkroniseringselementet identificeres ved et nummer eller ved et symbolsk
    navn. Konsekvenserne af disse kendsgerninger bliver, at man af hensyn til effektiviteten
    kun kan udveksle relativt sm> beskeder - typisk 8-30 ord - samt at besked- udvekslingen er
    relativt tidskr`vende. Meget ofte har man behov for at udveksle betydeligt st]rre datam`ngder
    mellem processerne. Til brug for overf]rsel af st]rre datam`ngder tillader kernen i de fleste
    tilf`lde, at en del af processernes logiske adresserum er samme fysiske lager- segment, se
    fig. 9.












                                          fig. 9.
                                    f`lles lagersegment


    Man taler da om f̲`̲l̲l̲e̲s̲s̲e̲g̲m̲e̲n̲t̲e̲r̲. Administrationen af et s>dant segment overdrages til en
    serviceproces. En proces kan p> normal vis sende en beskedbuffer til service- processen.
    I beskedbufferen angiver processen et ]nske om at bruge en buffer af en given st]rrelse.
    Serviceprocessen svarer tilbage med en beskedbuffer, der kan indeholde informationer om at
    ]nsket kunne im]dekommes og bufferen starter p> en angiven adresse inden for f`llessegmentet.
    Man kan selvf]lgelig ogs> f> et negativt svar. Processen kan bruge bufferen til internt brug,
    eller den kan overf]re data til en anden proces ved at den sender en beskedbuffer der indeholder
    adressen p> bufferen. Til sidst frigives bufferen ved at man sender en passende besked til
    serviceprocessen. Ovenst>ende betragtninger er bare et eksempel p> hvordan man implementerer
    mere avancerede former for proceskommunikation i et multiprogram, der best>r af asynkront
    k]rende processer.



    6̲.̲ ̲P̲r̲o̲c̲e̲s̲s̲e̲r̲ ̲o̲g̲ ̲k̲o̲r̲u̲t̲i̲n̲e̲r̲.̲

    …02…Gennemgangen af processer og korutiner afsluttes med en sammenligning af de to begreber.

    T̲y̲p̲i̲s̲k̲ ̲a̲n̲v̲e̲n̲d̲e̲l̲s̲e̲s̲o̲m̲r̲>̲d̲e̲:

    korutinestyresystem : mindre mini og mikrodatamater med begr`nset intern lagerkapacitet,
    is`r proceskontrol- anvendelser, d>rlig udnyttelse af CPU tiden, dvs. mange ventepunkter,
    "overskud af CPU tid"

    procesorienteret styresystem: store datamater, mini og mikrodatamater, lille til meget stor
    intern lagerkapacitet, alle anvendelser, effektiv udnyttelse af CPU tiden

    K̲o̲m̲m̲u̲n̲i̲k̲a̲t̲i̲o̲n̲:

    korutiner: kommunikation via beskedbuffere og generelle semaforer, eller via navn, adresseoverf]rsel
    processer: kommunikation via beskedbuffere eller via "message/answer" mekanisme, kopiering
    af data

    U̲d̲e̲l̲e̲l̲i̲g̲ ̲a̲d̲g̲a̲n̲g̲ ̲t̲i̲l̲ ̲d̲a̲t̲a̲:

    korutiner: udelelig adgang til data imellem ventepunkter, hvis koden indeholder ventepunkter
    m> man bruge "signal/wait" operationerne
    processer: adgang til data bindes til en "message/answer" beskedudveksling


    K̲r̲i̲t̲i̲s̲k̲e̲ ̲r̲e̲g̲i̲o̲n̲e̲r̲: (kode der skal udf]res udeleligt)

    korutiner: kritiske regioner ligger imellem ventepunkter
    processer: den kritiske region bindes til en "message/answer" beskedudveksling

    C̲P̲U̲ ̲o̲v̲e̲r̲h̲e̲a̲d̲: (spildtid)

    korutiner: meget lille
    processer: en st]rrelsesorden st]rre end ved korutiner

    A̲d̲r̲e̲s̲s̲e̲r̲u̲m̲:

    korutiner: typisk f`lles adresserum
    processer: normalt adskilte adresserum, evt. adskilte datamater

    Man kan stille sig det sp]rgsm>l: k̲a̲n̲ ̲k̲o̲r̲u̲t̲i̲n̲e̲r̲ ̲b̲r̲u̲g̲e̲s̲ ̲i̲n̲d̲e̲n̲ ̲f̲o̲r̲ ̲e̲t̲ ̲p̲r̲o̲c̲e̲s̲o̲r̲i̲e̲n̲t̲e̲r̲e̲t̲ ̲p̲r̲o̲g̲r̲a̲m̲s̲y̲s̲t̲e̲m̲
    ̲?̲
    Svaret er ja, hvis kernen tillader fuldst`ndig asynkron afvikling af processer, dvs. at en
    proces aldrig beh]ver at blive blokeret p> et synkroniseringselement, hvis den ikke ]nsker
    det. For at dette kan lade sig g]re m> en proces v`re i stand til at kunne teste om der er
    ankommet et svar p> et synkroniseringselement uden at blive blokeret. N>r der fore- ligger
    et svar vil udf]relsen af "receive" ikke blokere processen. Har man den mulighed kan man
    i̲m̲p̲l̲e̲m̲e̲n̲t̲e̲r̲e̲ ̲e̲n̲ ̲p̲r̲o̲c̲e̲s̲ ̲s̲o̲m̲ ̲e̲t̲ ̲s̲y̲s̲t̲e̲m̲ ̲a̲f̲ ̲k̲o̲r̲u̲t̲i̲n̲e̲r̲. I et s>dant system vil der v`re to slags
    ventepunkter:

         *   ventepunkter der skyldes "wait/receive" operationer udf]rt p> i̲n̲t̲e̲r̲n̲e̲ semaforer,

         *   ventepunkter der skyldes a̲f̲v̲e̲n̲t̲n̲i̲n̲g̲ ̲a̲f̲ ̲s̲v̲a̲r̲ fra andre processer, dvs. "wait/receive"
             udf]rt p> e̲k̲s̲t̲e̲r̲n̲e̲ semaforer og "message/answer" besked- udvekslinger.


    Korutinemonitoren skal v`re i stand til at h>ndtere b>de i̲n̲t̲e̲r̲n̲e̲ ̲b̲e̲g̲i̲v̲e̲n̲h̲e̲d̲e̲r̲: signalering
    og beskedudveksling via interne semaforer, og e̲k̲s̲t̲e̲r̲n̲e̲ ̲b̲e̲g̲i̲v̲e̲n̲h̲e̲d̲e̲r̲: besked- udveksling via
    eksterne synkroniseringselementer. S> l`nge der er korutiner, der kan k]re skal korutinemonitoren
    give dem lov til at k]re. Hvis alle korutiner bliver blokeret skal korutinemonitoren afs]ge
    eksterne synkroniserings- elementer, uden dog at blive blokeret. N>r der er ankommet et svar
    p> et synkroniseringselement, skal korutinemonitoren afs]ge listen af blokerede korutiner,
    finde den korutine der skal v`kkes og flytte den til "ready ̲list". En s>ledes op- bygget
    proces vil udnytte sit tidskvantum uhyre effektivt. Foruds`tningen for at denne model for
    et korutinesystem fungerer er:

         *   alle kald til eksterne processer g>r via korutine- monitoren,

         *   synkron proceskommunikation ("send" efterfulgt af "receive") skal kunne omdannes
             af korutinemonitoren til ikke blokerende kommunikation.

    Betragt hvad der sker n>r korutinemonitoren opfanger "receive" opertaionen udf]rt p> et eksternt
    synkroniserings- element: den vil flytte korutinen til "blocked ̲list" og knytte en operation
    til den, der fort`ller hvilket synkroniseringselement korutinen venter svar fra. Hvis der
    er korutiner der kan k]re, vil den f]rste korutine i "ready ̲list" blive den k]rende korutine.
    Hvis ingen korutiner kan k]re vil korutinemonitoren unders]ge om der er kommet en besked
    til synkroniseringselementet. Hvis dette er tilf`ldet vil den ventende korutine blive den
    k]rende korutine og vil f> udleveret den ankomne besked.


    Som et andet eksempel betragt en korutine der igangs`tter en synkron datatransport (noget
    i stil med Pascal "write") ved en "message/answer" beskedudveksling med filsystemprocessen.
    Korutinemonitoren skal da igangs`tte operationen, flytte korutinen til "blocked ̲list" og
    f]rst senere afvente svar fra filsystemet. N>r svaret er ankommet kan korutinen fort- s`tte.
    Den sidst beskrevne model for en korutinemonitor er vist i fig. 10.























                                         fig. 10.
                            korutinesystem inden for en proces



    Man kan selvf]lgeligt sp]rge sig selv hvorn>r man har brug for s>danne processer, der indeholder
    korutiner. Som typiske anvendelser kan man n`vne s̲e̲r̲v̲i̲c̲e̲p̲r̲o̲c̲e̲s̲s̲e̲r̲, der betjener flere processer
    og der indeholder mange ventepunkter. Typiske eksempler er f̲i̲l̲s̲y̲s̲t̲e̲m̲e̲r̲ og d̲a̲t̲a̲b̲a̲s̲e̲r̲. Det
    er vig- tigt, at langvarige pauser i udf]relsen af disse processer udnyttes til at behandle
    de beskeder, der ophobes p> synkroniseringselementer. En implementering af et filsystem,
    der f]rst kan behandle en foresp]gsel, n>r den er f`rdig med foreg>ende foresp]rgsel, kan
    v`re ret uheldig. En effektiv serviceproces er i stand til at behandle flere foresp]rgsler
    samtidig, og endda behandle flere foresp]rgsler fra samme proces samtidig.

    Man kan selvf]lgeligt p>st>, at man netop har processer for at man ikke skal bruge korutiner.
    I det ovenfor beskrevne filsystemeksempel kunne man principielt opdele filsystemet i flere
    processer, med det resultat at det vil blive et tungt og usmidigt system. Man skal nemlig
    ikke overbelaste kernen med for mange proceskommunikationer og for mange proces- skift. Korutineskift
    er billig at udf]re og beskedudveksling inden for et korutinesystem er n`sten gratis.




    L̲i̲t̲t̲e̲r̲a̲t̲u̲r̲


    (1) G.R.Andrews, F.B.Schneider:
        Concepts and Notations for Concurrent Programming
        Computing Surveys, Vol. 15, No. 1, marts 1983

    (2) International Purdue Workshop on Industrial Computer
        Systems:
        Technical Report no. 8
        ikke offentliggjort

    (3) P.Wegner, S.A.Smolka:
        Processes, Tasks and Monitors: A Comparative Study of
        Concurrent Programming Primitives
        IEEE Transactions on Software Engineering, Vol. SE-9
        No. 4, juli 1983