C&UNIX Critical section problem (repetition) 1 Critical section problem (repetition) repeat entry section critical section exit section remainder section until false; Två processer: P 0, P 1 ej samtidigt i kritiska sektionen
C&UNIX Critical section problem (repetition) 2 Lösning var flag: array[0..1] of boolean turn : 0..1 repeat flag[i] := true; turn := j while(flag[j] and turn = j) do no-op ; critical section flag[i] := false; remainder section until f alse; P i egen flagga ej krav atomärt uppfyller Ömsesidigt exklusift Progressivt Begränsad generaliseras till n processer
C&UNIX Semaforer (repetition) 3 Semaforer (repetition) olika processer har tillgång till samma semafor S S : heltal # 0: upptaget # 1: ledig uteslutande genom: P: wait(s) V: signal(s) atomära operationer
C&UNIX Semaforer (repetition) 4 Klassiska definitioner wait(s) : while S 0 do no-op; S := S 1; signal(s) : S := S + 1 initiellt S = 1 exekveras atomärt löser många synchroniserings problem
C&UNIX System V interprocess kommmunikationsmekanismer 5 System V interprocess kommmunikationsmekanismer message queues semaphores shared memory Olika processer gemensam nyckel heltal key_t ftok ( char *pathname, char proj ); /usr/include/sys/types.h /usr/include/bits/types.h man 5 ipc
C&UNIX Sys V IPC semaforer 6 Skapa, få tillgång till, semafor: Sys V IPC semaforer #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget ( key t key, int nsems, int semflg ); key: nsems: semflg: returvärde: nyckel för tillgång till semafor storlek på semaforarray skapa eller ej, läs-skriv rättigheter semafor ID semid, -1 vid mislyckande
C&UNIX Sys V IPC semaforer 7 argument semget(..) key: nsems: semflg: gemensam i olika processer > 0 vid skapande, tillgång == 0 tillgång existerande semafor sätts bit för bit m.h.a. operatorn, se /usr/include/linux/ipc.h #define IPC CREAT 00001000 rättigheter som vid filaccess
C&UNIX Sys V IPC semaforer 8 kontroll av semaforer int semctl (int semid, int semnum, int cmd, union semun arg); Ändrar rättigheter, värde, e.d. semid: semnum: cmd: arg: returneras av semget(..) index i semaforarray kontroll flagga optional
C&UNIX Sys V IPC semaforer 9 union semun argumentet till semctl(.. ) ej obligatoriskt ska deklareras av användaren union semun { int val; / value for SETVAL / struct semid ds buf; / buffer for IPC STAT, IPC SET / unsigned short int array;/ array for GETALL, SETALL / struct seminfo buf; / buffer for IPC INFO / };
C&UNIX Sys V IPC semaforer 10 cmd argument till semctl(.. ) SETVAL sätter semaforens värde GETVAL returnerar semaforens värde GETPID returnerar pid senaste process SETALL använder arg.array för sätta värden GETALL använder arg.array för returnera värden IPC RMID ta bort semafor
C&UNIX Sys V IPC semaforer 11 operationer på semaforer int semop ( int semid, struct sembuf sops, unsigned nsops); semid: sembuf: nsops returneras av semget(..) array med operationer antal operationer struct sembuf /* definierad i sys/sem.h */ { unsigned short int sem_num; /* semaphore number */ short int sem_op; /* semaphore operation */ short int sem_flg; /* operation flag */ };
C&UNIX Sys V IPC semaforer 12 operationer på semaforer forts. S[nsops] array med semaforer sem op > 0 inkrementerar S[sem num] sem op == 0 vänta till S[sem num == 0 sem op < 0 dekrementerar S[sem num] blockerar om resultatet < 0 misslyckas om IPC NOWAIT satt sem flg = IPC NOWAIT väntar ej sem flg = SEM UNDO undo på exit
C&UNIX Sys V IPC semaforer 13 mer info: man 2 ipc man 5 ipc /* om Sys V IPC */ man semget /* individuella funktioner */ man ipcs /* vilka allockerade resurser har jag */ man ipcrm /* tar bort resurser */ ipcrm [ shm msg sem ] id
C&UNIX Sys V Message queues 14 skapa message queue Sys V Message queues int msgget ( key t key, int msgflg ) ; int msgctl ( int msqid, int cmd, struct msqid ds buf ); #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> key = ftok( /home/jag, 1); msqid = msgget(key, IPC CREAT 0666) ;
C&UNIX Sys V Message queues 15 #define MSGLENGTH 128 skicka meddelande struct msgbuf{ / exempel def. i <sys/msg.h> / }; long mtype; / message type, must be > 0 / char mtext[msglength]; / message contents / int msgsnd(int msqid, struct msgbuf msgp, size t msgsz, int msgflg); returvärden: 0, 1
C&UNIX Sys V Message queues 16 läsa meddelande ssize t msgrcv ( int msqid, struct msgbuf msgp, size t msgsz, long msgtyp, int msgflg ); ssize t: returvärde: msqid: msgp: msgsz: msgtyp: msgflg: int, byte count, error, bits/types.h 1, antal bytes kopierat från msgget pekare till struct msgbuf maximala storlek mtext (bytes) typ flaggor