Xinu: primi esempi

  • Esempio 1
  • Esempio 2: due nuovi processi
  • Compilazione esempi
  • Esempio 3: due processi eseguono lo stesso codice
  • Esempio 4: memoria condivisa
  • Esempio 5: sincronizzazione

  • Esempio 1

    #include <conf.h>
    
    xmain()   // è il processo iniziale Xinu!
    {
    	putc(CONSOLE,'h');
    	putc(CONSOLE,'i');
    	putc(CONSOLE,'\n');
    }

    Esempio 2: due nuovi processi

    #include <conf.h>
    #include <kernel.h>
    
    void prA(void)
    {
       while (1)
          putc(CONSOLE, 'A');
    }
    
    void prB(void)
    {
       while (1)
          putc(CONSOLE, 'B');
    }
    
    xmain(void)
    {
       resume( create(prA, INITSTK, INITPRIO, "proc 1", 0) );  // vedi system calls manual
       resume( create(prB, INITSTK, INITPRIO, "proc 2", 0) );
       xdone();
    }

    Compilazione esempi:

    [0] C:\USER\pcx\MAIN> make ex2.exe
    MAKE Version 3.6  Copyright (c) 1992 Borland International
    
    Available memory 30740480 bytes
    
            bcc -mh  -c -Ic:\user\pcx\src\h -w- -DTURBOC ex2.c
    Borland C++  Version 3.1 Copyright (c) 1992 Borland International
    ex2.c:
    
            Available memory 4185484
            bcc -mh  -eex2.exe -Ic:\user\pcx\src\h -w- -DTURBOC -Lc:\user\pcx\lib ex
    2.obj xkernel.lib xio.lib xutil.lib xshell.lib
    Borland C++  Version 3.1 Copyright (c) 1992 Borland International
    Turbo Link  Version 5.1 Copyright (c) 1992 Borland International
    
            Available memory 4229020

    Esempio 3: due processi eseguono lo stesso codice

    #include <conf.h>
    #include <kernel.h>
    
    void prntr(int ch)
    {
       int i;                    // i privata del processo
       for (i = 0; i < 400; i++)
          putc(CONSOLE, ch);
    }
    
    xmain(void)
    {
       resume( create(prntr, INITSTK, INITPRIO, "proc 1", 1, 'A') );  // see system calls manual
       resume( create(prntr, INITSTK, INITPRIO, "proc 2", 1, 'B') );
       xdone();
    }

    Esempio 4: memoria condivisa

    #include <conf.h>
    #include <kernel.h>
    
    int n = 0;
    
    void produce(void) {
       int i;
       for (i = 0; i < 2000; i++)
          n++;
    }
    
    void consume(void) {
       int i;
       for (i = 0; i < 2000; i++)
          printf("%d: n is %d\n", i, n);
    }
    
    xmain(void)
    {
        resume( create(consume, INITSTK, INITPRIO, "cons", 0) );
        resume( create(produce, INITSTK, INITPRIO, "prod", 0) );
    }

    NB: n passa da 0 a 2000! produce è molto più lento (I/O).


    Esempio 5: sincronizzazione

    #include <conf.h>
    #include <kernel.h>
    
    int n = 0;
    
    void produce(int consumed, int produced) {
       int i;
       for (i = 0; i < 2000; i++) {
          wait(consumed);
          n++;
          signal(produced);
       }
    }
    
    void consume(int consumed, int produced) {
       int i;
       for (i = 0; i < 2000; i++) {
          wait(produced);
          printf("%d: n is %d\n", i, n);
          signal(consumed);
       }
    }
    
    xmain(void)
    {
        int produced, consumed;  // semafori
    
        consumed = screate(1);  produced = screate(0);
        resume( create(consume, INITSTK, INITPRIO, "cons", 2, consumed, produced) );
        resume( create(produce, INITSTK, INITPRIO, "prod", 2, consumed, produced) );
    }