Shared Memory Semaphores. Goals of this Lecture

Similar documents
struct ipc_perm sem_perm; ushort sem_nsems; /* count of sems in set */ time_t sem_otime; /* last operation time */

COP 4604 UNIX System Programming IPC. Dr. Sam Hsu Computer Science & Engineering Florida Atlantic University

UNIX IPC. Unix Semaphore Unix Message queue

CSPP System V IPC 1. System V IPC. Unix Systems Programming CSPP 51081

CSE 380: Homework 2: Synchronization

Shared Memory (8A) Shared Memory

2 UNIX interprocess communications

Using IPC: semaphores Interprocess communication using semaphores. Lecturer: Erick Fredj

INTER-PROCESS COMMUNICATION. UNIX Programming 2015 Fall by Euiseong Seo

UNIT III- INTERPROCESS COMMUNICATION

Computer Science & Engineering Department I. I. T. Kharagpur. Operating System: CS rd Year CSE: 5th Semester (Autumn ) Lecture XI

Interprocess Communication. Bosky Agarwal CS 518

alarm(2) - Linux man page

컴퓨터특강 (UNIX System Programming) APUE(Interprocess Communication) [Ch. 14]

Interprocess Communication. Originally multiple approaches Today more standard some differences between distributions still exist

경희대학교컴퓨터공학과 조진성. UNIX System Programming

UNIT 7 INTERPROCESS COMMUNICATION

Pipes. FIFOs. System V IPC. Message Queues. Shared Memory. Semaphores. APUE (Interprocess Communication. Page 2

COSC Operating Systems Design, Fall Lecture Note: Unnamed Pipe and Shared Memory. Unnamed Pipes

Lecture 18. Log into Linux. Copy two subdirectories in /home/hwang/cs375/lecture18/ $ cp r /home/hwang/cs375/lecture18/*.

OS Lab Tutorial 1. Spawning processes Shared memory

Shared Memory. By Oren Kalinsky

CS 385 Operating Systems Fall 2013 Homework Assignment 2 Inter-Process Communications and Synchronization

CS 385 Operating Systems Spring 2013 Homework Assignment 2 Third Draft Inter-Process Communications and Synchronization

Lecture 8: Inter-process Communication. Lecturer: Prof. Zichen Xu

Concurrent Servers. Overview. In our current assignment we have the following changes:

Message Queues, Semaphores, Shared Memory

UNIT III- INTER PROCESS COMMUNICATIONS Part A

Shared Memory Memory mapped files

PRACTICAL NO : 1. AIM: To study various file management system calls in UNIX.

Part II Processes and Threads Process Basics

A Lightweight Semaphore for Linux

Systems Programming/ C and UNIX

CSci 4061 Introduction to Operating Systems. IPC: Message Passing, Shared Memory

Operating Systems. VI. Threads. Eurecom. Processes and Threads Multithreading Models

Inter-process communication (IPC)

#include <sys/types.h> #include <sys/wait.h> pid_t wait(int *stat_loc); pid_t waitpid(pid_t pid, int *stat_loc, int options);

PROCESS STATES AND TRANSITIONS:

OPERATING SYSTEMS 3rd Homework

CS 385 Operating Systems Fall 2011 Homework Assignment 5 Process Synchronization and Communications

Programmation Système Cours 10 System V IPC

CS 550 Operating Systems Spring Inter Process Communication

Module 7: Inter-Process Communication

INTER-PROCESS COMMUNICATION Tanzir Ahmed CSCE 313 Fall 2018

COMP 3100 Operating Systems

Gabrielle Evaristo CSE 460. Lab Shared Memory

Processes. OS Structure. OS Structure. Modes of Execution. Typical Functions of an OS Kernel. Non-Kernel OS. COMP755 Advanced Operating Systems

Inter Process Communication (IPC) Giorgio Richelli

Unix Inter-process Communication

Inter-Process Communication: Message Passing. Thomas Plagemann. Big Picture. message passing communication?

Reminder. COP4600 Discussion 8 Segmentation, File System, Fork() Implementation. Question-1. Discussion 7 Recap. Question-1(cont) Question-1

Operating Systems. No. 5 ศร ณย อ นทโกส ม Sarun Intakosum

CS631 - Advanced Programming in the UNIX Environment Interprocess Communication I

AC72/AT72/AC117/AT117 LINUX INTERNALS DEC 2015

Babu Madhav Institute of Information Technology, UTU

Tyler Gaynair Lab 6 Score is out of 20

Machine Problem 3: UNIX System Programming. 100 points + 10 bonus points Due date: To Be Announced

1 Requesting for Memory

COMP 2355 Introduction to Systems Programming

Synchronization and Semaphores. Copyright : University of Illinois CS 241 Staff 1

Lab 5: Inter-Process Communication

Department of Computer Science and Technology, UTU 2014

ADVANCED OPERATING SYSTEMS

Operating Systems 2010/2011

10th Slide Set Operating Systems

전공핵심실습 1: 운영체제론 Chapter 6. Inter-process Communication (IPC)

Process Creation and Control

Interprocess Communication

CSCI 4061: Inter-Process Communication

PROCESS CONTROL BLOCK TWO-STATE MODEL (CONT D)

Programming with Shared Memory PART I. HPC Fall 2010 Prof. Robert van Engelen

CL020 - Advanced Linux and UNIX Programming

Introduction. This project will focus primarily on processes.

CS 345 Operating Systems. Tutorial 2: Treasure Room Simulation Threads, Shared Memory, Synchronization

Processes & Threads. Today. Next Time. ! Process concept! Process model! Implementing processes! Multiprocessing once again. ! More of the same J

518 Lecture Notes Week 3

Process Synchronization(2)

CS 3013 Operating Systems WPI, A Term Assigned: Friday, August 31, 2007 Due: Monday, September 17, 2007

Fall 2015 COMP Operating Systems. Lab #3

Operating Systems. Lecture 06. System Calls (Exec, Open, Read, Write) Inter-process Communication in Unix/Linux (PIPE), Use of PIPE on command line

POSIX Shared Memory. Linux/UNIX IPC Programming. Outline. Michael Kerrisk, man7.org c 2017 November 2017

Linux Operating System

Unix-Linux 2. Unix is supposed to leave room in the process table for a superuser process that could be used to kill errant processes.

POSIX Semaphores. Operations on semaphores (taken from the Linux man page)

Signal Example 1. Signal Example 2

Synchronization and Semaphores. Copyright : University of Illinois CS 241 Staff 1

Prepared by Prof. Hui Jiang (COSC3221) 2/9/2007

CSI Module 2: Processes

PROCESSES. Jo, Heeseung

Processes. Jo, Heeseung

GDC MEMORIAL COLLEGE BAHAL (BHIWANI)

CS345 Opera,ng Systems. Φροντιστήριο Άσκησης 2

CS 5523 Operating Systems: Midterm II - reivew Instructor: Dr. Tongping Liu Department Computer Science The University of Texas at San Antonio

Maria Hybinette, UGA. ! One easy way to communicate is to use files. ! File descriptors. 3 Maria Hybinette, UGA. ! Simple example: who sort

Interprocess Communication and Synchronization

Processes. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

CSC 1600 Unix Processes. Goals of This Lecture

Process Synchronization

CSE 153 Design of Operating Systems Fall 2018

CSE 410: Computer Systems Spring Processes. John Zahorjan Allen Center 534

Transcription:

Shared Memory Semaphores 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 1 Goals of this Lecture Understand the design and programming of the System V Unix shared memory interprocess communication mechanism and its relation with the Unix memory management functions. Understand the general concepts of semaphores. Understand the design and programming of the System V Unix semaphore interprocess communication mechanism. 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 2 1

System V IPC Shared Memory Shared memory allows sharing the same physical memory content between different processes Uses a dedicated segment type, but is based on the regular Unix memory management Allows communication between non-related processes But limited to local Unix system 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 3 Creating a Shared Memory Segment #include <sys/types.h> /* supplies key_t */ #include <sys/ipc.h> /* supplies ipc_perm */ #include <sys/shm.h> /* supplies structures and macros for * shared mem. data structures etc. */ int size, permflags, shm_id; key_t key;... shm_id = shmget (key, size, permflags); Haviland/Salama, UNIX System Programming, page 199 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 4 2

The allocreg() Pseudocode algorithm allocreg /* M. J. Bach, The Design of the */ input (1) inode pointer /* UNIX Operating System, Figure 6.18 */ (2) region type output locked region { remove region from linked list of free regions; assign region type; assign region inode pointer; if (inode pointer not null) increment inode reference count; place region on linked list of active regions; return (locked region); 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 5 Including a Shared Memory Segment into a Process #include <sys/types.h> /* supplies key_t */ #include <sys/ipc.h> /* supplies ipc_perm */ #include <sys/shm.h> /* supplies structures and macros for * shared mem. data structures etc. */ int shm_id, shmflags; char *memptr, *daddr, *shmat();... memptr = shmat (shm_id, daddr, shmflags); Haviland/Salama, UNIX System Programming, page 200 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 6 3

The shmat() Pseudocode algorithm shmat /* M. J. Bach, The Design of the */ /* UNIX Operating System, Figure 11.10 */ input (1) shared memory descriptor (2) virtual address to attach memeory (3) flags output virtual address where memory was attached { check validity of descriptor, permissions if (user specified virtual address) { round off virtual address, as specified by flags; check legality of virtual address, size of region; else /* user wants kernel to find good address */ kernel picks virtual address error if none available; attach region to process address space (algorithm attachreg); if (region being attached for the first time) allocate page tables, memory for region (algorithm growreg); return (virtual address where attached); 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 7 Example Process Address Layout User Context Stack Heap Automatic Allocation of Shared Memory Segments Kernel Context Kernel Data Uninitialised Data Initialised Data Read from executable file Text 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 8 4

The attachreg() Pseudocode algorithm attachreg /* M. J. Bach, The Design of the */ /* UNIX Operating System, Figure 6.19 */ input (1) pointer to (locked) region being attached (2) process to which region is being attached (3) virtual address in process where region will be attached (4) region type output per process region table entry { allocate per process region table entry for process; initialize per process region table entry; set pointer to region being attached; set type field; set virtual address field; check legality of virtual address, region size; increment region reference count; increment process size according to attached region; initialize new hardware register triple for process; return (per process region table entry); 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 9 Shared Memory Table Data Structures After shmat() Region Table Process Table - Per Process Region Table M.J. Bach, The Design of the UNIX Operating System, Figure 11.9 (after shmat) 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 10 5

Removing a Shared Memory Segment from a Process int char retval; *memptr; retval = shmdt (memptr); Why Why does does shmdt() not notuse an an IPC IPC Object Identifier as as its its argument? Haviland/Salama, UNIX System Programming, page 200 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 11 The detachreg() Pseudocode algorithm detachreg /* M. J. Bach, The Design of the */ /* UNIX Operating System, Figure 6.26 */ input pointer to per process region table entry output none { get auxiliary memory management tables for process, release as appropriate; decrement process size; decrement region reference count; if (region count is 0 and region not sticky bit) free region (algorithm freereg); else { /* either reference count non-0 or * region sticky bit on */ free inode lock, if applicable (inode associated with region); free region lock; 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 12 6

Controlling a Shared Memory Segment #include <sys/types.h> /* supplies key_t */ #include <sys/ipc.h> /* supplies ipc_perm */ #include <sys/shm.h> /* supplies structures and macros for * shared mem. data structures etc. */ int shm_id, command, retval; struct shmid_ds shm_stat; /* shm id data structure */... retval = shmctl (shm_id, command, &shm_stat); Haviland/Salama, UNIX System Programming, page 201 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 13 Shared Memory Control Structure struct shmid_ds { struct ipc_perm shm_perm; /* operation permission struct */ int shm_segsz; /* size of segment in bytes */ /* struct region *shm_reg; */ /* ptr to region structure */ /* char pad[4]; */ /* for swap compatibility */ ushort shm_lpid; /* pid of last shmop */ ushort shm_cpid; /* pid of creator */ ushort shm_nattch;/* region attach counter */ /* ushort shm_cnattch; */ /* used only for shminfo */ time_t shm_atime; /* last shmat time */ time_t shm_dtime; /* last shmdt time */ time_t shm_ctime; /* last change time */ ; /* PRE-VM-REWRITE */ /* NOTE shm_kaddr added / shm_reg removed */ uint shm_kaddr; /* region address in * kernel v-space */ 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 14 7

System Parameters for Shared Memory /* * Configuration Parameters * These parameters are tuned by editing the system config. file. * The following lines establish the default values. */ #ifndef SHMPOOL #define SHMPOOL 512 /* max total shared mem system wide (in Kb) */ #endif #ifndef SHMSEG #define SHMSEG 6 /* max attached shared mem segments per proc. */ #endif #ifndef SHMMNI #define SHMMNI 100 /* # of shared mem identifiers */ #endif /* The following parameters are assumed not to require tuning */ #define SHMMIN 1 /* min shared mem segment size... */ 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 15 Shared Memory Program Example I /* M. J. Bach, The Design of the * UNIX Operating System, Figure 11.11 */ #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #define SHMKEY 75 #define K 1024 #define MAXCNT 10 int shmid; main () { int i, *pint; int pid; char *addr1, *addr2; struct shmid_ds shm_status; extern char *shmat(); extern cleanup(); extern void shmstat_print(); for (i=0; i<32; i++) signal (i, cleanup); 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 16 8

Shared Memory Program Example II shmid = shmget (SHMKEY, 128 * K, 0777 IPC_CREAT); shmctl (shmid, IPC_STAT, &shm_status); shmstat_print(shmkey, shmid, &shm_status); addr1 = shmat (shmid, 0, 0); addr2 = shmat (shmid, 0, 0); printf ("\n addr1 0x%x addr2 0x%x\n", addr1, addr2); shmctl (shmid, IPC_STAT, &shm_status); shmstat_print(shmkey, shmid, &shm_status); pint = (int *) addr1; for (i=0; i<maxcnt; i++) *pint++ = i; pint = (int *) addr1; *pint = MAXCNT; pint = (int *) addr2; printf ("\n"); for (i=0; i<maxcnt; i++) printf (" index %d\tvalue %d\n", i, *pint++); 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 17 Shared Memory Program Example III shmctl (shmid, IPC_STAT, &shm_status); shmstat_print(shmkey, shmid, &shm_status); shmdt(addr1); shmdt(addr2); shmctl (shmid, IPC_STAT, &shm_status); shmstat_print(shmkey, shmid, &shm_status); cleanup (); cleanup () { shmctl (shmid, IPC_RMID, 0); exit (); 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 18 9

Shared Memory Program Example IV void shmstat_print (mkey, shmid, sstat) key_t mkey; int shmid; struct shmid_ds *sstat; { char *ctime(); char *atime; printf ("\nkey %d, shmid %d, ", mkey, shmid); printf ("Last change %s", ctime (&(sstat->shm_ctime))); printf ("Access rights %o\n", sstat->shm_perm.mode); printf ("uid of creator %d, gid of creator %d, ", sstat->shm_perm.cuid, sstat->shm_perm.cgid); printf ("uid of owner %d, gid of owner %d\n", sstat->shm_perm.uid, sstat->shm_perm.cgid); printf ("size of segment %d, pid of last semop %d\n", sstat->shm_segsz, sstat->shm_lpid); printf ("pid of creator %d, ", sstat->shm_cpid); printf ("region attach counter %d\n", sstat->shm_nattch); atime= ctime (&(sstat->shm_atime)); atime[strlen(atime)-1] = '\0'; printf ("Last shmat %s, ", atime); printf ("Last shmdt %s", ctime (&(sstat->shm_dtime))); 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 19 Program Execution Result I Key 75, shmid 2100, Last change Fri Dec 12 074737 2003 Access rights 101777 uid of creator 276, gid of creator 100, uid of owner 276, gid of owner 100 size of segment 131072, pid of last shmop 0 pid of creator 18951, region attach counter 0 Last shmat Thu Jan 1 000000 1970, Last shmdt Thu Jan 1 000000 1970 addr1 0x26000 addr2 0x48000 Key 75, shmid 2100, Last change Fri Dec 12 074737 2003 Access rights 100777 uid of creator 276, gid of creator 100, uid of owner 276, gid of owner 100 size of segment 131072, pid of last shmop 18951 pid of creator 18951, region attach counter 2 Last shmat Fri Dec 12 074737 2003, Last shmdt Thu Jan 1 000000 1970 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 20 10

Program Execution Result II index 0value 10 index 1value 1 index 2value 2 index 8value 8 index 9value 9 Key 75, shmid 2100, Last change Fri Dec 12 074737 2003 Access rights 100777 uid of creator 276, gid of creator 100, uid of owner 276, gid of owner 100 size of segment 131072, pid of last shmop 18951 pid of creator 18951, region attach counter 2 Last shmat Fri Dec 12 074737 2003, Last shmdt Thu Jan 1 000000 1970 Key 75, shmid 2100, Last change Fri Dec 12 074737 2003 Access rights 100777 uid of creator 276, gid of creator 100, uid of owner 276, gid of owner 100 size of segment 131072, pid of last shmop 18951 pid of creator 18951, region attach counter 0 Last shmat Fri Dec 12 074737 2003, Last shmdt Fri Dec 12 074737 2003 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 21 Shared Memory Size Indicators AT&T DEC Vax AT&T Xenix Linux SunOS-4 Sys V R2 Ultrix UNIX-PC 386 2.4 Solaris 131072 131072 65536 4194304 33554432 1048576 max. # bytes per segment 1 1 1 1 1 1 min. # bytes per segment 100 100 100 25 4096 100 max. # segments/system 6 6 6 6 4096 6 max. # segments/process 8192 21768 8192 0 xxxxxxxx? shmbrk size 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 22 11

System V IPC Semaphores Semaphores allow the synchronisation of independent processes, as well as the protection of critical sections though mutual exclusion. Semaphores in Unix are support sets, and are additive. But limited to local Unix system 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 23 Use of Semaphores for Mutual Exclusion s semaphore (1); P1 process P2 process...... P(s); P(s);... -- critical section... critical section V(s); V(s);...... end process end process Herrtwich/Hommel, Kooperation und Konkurrenz, 1989 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 24 12

Use of Semaphores for Process Synchronisation s semaphore (0); P1 process P2 process...... V(s); -- signal event...... end process end process P(s); -- wait for event Herrtwich/Hommel, Kooperation und Konkurrenz, 1989 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 25 Additive Semaphores exclusion add_semaphore (N); type reader = process... P (exclusion, 1);... read within critical section V (exclusion, 1); end process; type writer = process... P (exclusion, N);... -- write within critical section V (exclusion, N); end process; Herrtwich/Hommel, Kooperation und Konkurrenz, 1989 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 26 13

Semaphores in System V Unix P(sem) if (sem!= 0) decrement sem value by one else wait until sem becomes non-zero V (sem) if (queue of waiting processes not empty) restart first process in wait queue else increment sem value by one Haviland/Salama, UNIX System Programming, Seite 191 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 27 Allocating A Semaphore Set #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> key_t key; int sem_id, nsems, permflags, command; int retval, sem_num; union semun { int val; struct semid_ds *stat; ushort *array; ctl_arg;... sem_id = semget (key, nsems, permflags);... retval = semctl (sem_id, sem_num, command, ctl_arg); Haviland/Salama, UNIX System Programming, page 192 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 28 14

The Semaphore System Data Structures Semaphore Table Semaphore Arrays 0 1 2 3 4 5 6 0 1 2 0 0 1 2 M.J. Bach, The Design of the UNIX Operating System, Figure 11.13 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 29 Operations on Semaphores Standard Operations IPC_STAT IPC_SET IPC_RMID Copy status information of object into structure ctl_arg.stat Set ownership / permission for object from ctl_arg.stat Remove semaphore set from the system Operations on Individual Semaphores GETVAL Returns the semaphore value (semval) SETVAL Sets the semaphore value (semval) to the value in ctl_arg.val GETPID Returns the value of sempid GETNCNT Returns the value of semncnt GETZCNT Returns the value of semzcnt Operations on all Semaphores of Set GETALL The semval values of all semaphores in set are stored in ctl_arg.array SETALL The semval values of all semaphores in set are set according to values in ctl_arg.array Haviland/Salama, UNIX System Programming, page 193 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 30 15

C Data Structures for Semaphores I /* Semctl Command Definitions. */ #define GETNCNT 3 /* get semncnt */ #define GETPID 4 /* get sempid */ #define GETVAL 5 /* get semval */ #define GETALL 6 /* get all semval's */ #define GETZCNT 7 /* get semzcnt */ #define SETVAL 8 /* set semval */ #define SETALL 9 /* set all semval's */ /* Structure Definitions. */ /* There is one semaphore id data structure for each set of semaphores * in the system. */ struct semid_ds { struct ipc_perm sem_perm; /* operation permission struct */ struct sem *sem_base; /* ptr to first semaphore in set */ ushort sem_nsems; /* # of semaphores in set */ time_t sem_otime; /* last semop time */ time_t sem_ctime; /* last change time */ ; 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 31 C Data Structures for Semaphores II /* There is one semaphore structure for each semaphore in the system. */ struct sem { ushort semval; /* semaphore text map address */ short sempid; /* pid of last operation */ ushort semncnt; /* # awaiting semval > cval */ ushort semzcnt; /* # awaiting semval = 0 */ ; /* 'arg' argument template for semctl system calls. */ union semun { int val; /* value for SETVAL */ struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ ushort *array; /* array for GETALL & SETALL */ ; 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 32 16

Programming Example Initialising a Semaphore Set #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <errno.h> extern int errno; #define SEMPERM 0600 int initsem (semkey) key_t semkey; { int status = 0, semid; if ((semid = semget (semkey, 1, SEMPERM IPC_CREAT IPC_EXCL)) == -1) { if (errno == EEXIST) semid = semget (semkey, 1, 0); else /* if semaphore successfully created */ status = semctl (semid, 0, SETVAL, 1); if (semid == -1 status == -1) { perror ( initsem failed ); return (-1); else return semid; /* everything is ok */ Haviland/Salama, UNIX System Programming, page 194 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 33 The Semaphore Operation and the semop() Data Structure #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int retval, sem_id; struct sembuf op_array[somevalue];... retval = semop (sem_id, op_array, SOMEVALUE); /* User semaphore template for semop system calls. */ struct sembuf { short sem_num; /* semaphore # */ short sem_op; /* semaphore operation */ short sem_flg; /* operation flags */ ; Haviland/Salama, UNIX System Programming, page 195 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 34 17

The Semaphore Undo Operation /* * There is one undo structure per process in the system. */ struct sem_undo { struct sem_undo *un_np; /* ptr to next active undo structure */ short un_cnt; /* # of active entries */ struct undo { short un_aoe; /* adjust on exit -values */ short un_num; /* semaphore # */ int un_id; /* semid */ un_ent[1]; /* (semume) undo entries (one min.) */ ; 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 35 Allocating Undo Structures for Semaphores Per Process Undo Headers Desc Num Value Undo Structures Desc Num Value Desc Num Value Desc Num Value M.J. Bach, The Design of the UNIX Operating System, Figure 11.16 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 36 18

System Parameters for Shared Memory I /* semaphore information structure */ struct seminfo { int semmap, /* # of entries in semaphore map */ semmni, /* # of semaphore identifiers */ semmns, /* # of semaphores in system */ semmnu, /* # of undo structures in system */ semmsl, /* max # of semaphores per id */ semopm, /* max # of operations per semop call */ semume, /* max # of undo entries per process */ semusz, /* size in bytes of undo structure */ semvmx, /* semaphore maximum value */ semaem; /* adjust on exit max value */ ; struct seminfo seminfo; /* configuration parameters */ 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 37 System Parameters for Shared Memory II /* Implementation Constants. */ #define PSEMN (PZERO + 3) /* sleep priority waiting for * greater value */ #define PSEMZ (PZERO + 2) /* sleep priority waiting for zero */ #define SEMVMX 32767 /* semaphore maximum value */ #define SEMAEM 16384 /* adjust on exit max value */ /* Permission Definitions. */ #define SEM_A 0200 /* alter permission */ #define SEM_R 0400 /* read permission */ /* Configuration Parameters * These parameters are tuned by editing the system configuration * file. The following lines establish the default values. */ #ifndef SEMMNI #define SEMMNI 10 /* # of semaphore identifiers */ #endif 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 38 19

System Parameters for Shared Memory III #ifndef SEMMNS #define SEMMNS 60 /* # of semaphores in system */ #endif #ifndef SEMUME #define SEMUME 10 /* max # of undo entries per process */ #endif #ifndef SEMMNU #define SEMMNU 30 /* # of undo structures in system */ #endif /* The following parameters are assumed not to require tuning */ #ifndef SEMMAP #define SEMMAP 30 /* # of entries in semaphore map */ #endif #ifndef SEMMSL #define SEMMSL SEMMNS /* max # of semaphores per id */ #endif #ifndef SEMOPM #define SEMOPM 100 /* max # of operations per semop call */ #endif /* size in bytes of undo structure */ #define SEMUSZ (sizeof(struct sem_undo)+sizeof(struct undo)*semume) 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 39 Programming Example Implementing P and V P (semid) int semid; { struct sembuf p_buf; p_buf.sem_num = 0; p_buf.sem_op = -1; /* negativer Wert, also Fall 1 = P() */ p_buf.sem_flg = SEM_UNDO; if (semop (semid, &p_buf, 1) == -1) { perror ( p(semid) failed ); exit (1); else return (0); V (semid) int semid; { struct sembuf v_buf; v_buf.sem_num = 0; v_buf.sem_op = 1; /* positiver Wert, also Fall 2 = V() */ v_buf.sem_flg = SEM_UNDO; if (semop (semid, &v_buf, 1) == -1) { perror ( v(semid) failed ); exit (1); else return (0); Haviland/Salama, UNIX System Programming, page 197 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 40 20

Programming Example Using P and V main () { key_t semkey = 0x200; if (fork () == 0) handlesem (semkey); if (fork () == 0) handlesem (semkey); if (fork () == 0) handlesem (semkey); handlesem (skey) key_t skey; { int semid, pid = getpid(); if ((semid = initsem (skey)) > 0) exit (1); printf ( \nprocess %d before critical section\n, pid); P (semid); printf ( process %d in critical section\n, pid); /* in real life do something interesting */ sleep (10); printf ( process %d leaving critical section\n, pid); V (semid); printf ( process %d exiting\n, pid); exit (0); Haviland/Salama, UNIX System Programming, page 198 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 41 Program Execution Result process 799 before critical section process 800 before critical section process 801 before critical section process 799 in critical section process 799 leaving critical section process 799 exiting process 801 in critical section process 801 leaving critical section process 801 exiting process 800 in critical section process 800 leaving critical section process 800 exiting Haviland/Salama, UNIX System Programming, page 198/199 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 42 21

Semaphores Size Indicators AT&T DEC Vax AT&T Xenix Linux SunOS-4 Sys V R2 Ultrix UNIX-PC 286/386 2.4 Solaris 10 10 10 10 128 10 max. # unique semaphore sets 60 60 60 40 32000 60 max. # semaphores 25 25 25 10 250 60 max. # sema- 25 phores/set 10 10 10 5 32 100 max. # opera- 10 tions/semop() 30 30 30 20 32000 30 max. # undostructures 10 10 10 5 20 10 max. # undoentries/struc. 32767 32767 32767 32766 32767 32767 max. value of any semaphore 16384 16384 16383 16384 16383 16384 max. value for any aoe 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 43 Summary Shared Mem./Semaphores Shared memory segments allow the native sharing of data between independent processes, based on the operating system s memory management functions There is no built-in process synchronisation for shared memory. Semaphores allow mutual exclusion as well as process synchronisation of independent processes. Unix semaphores can bet sets and are additive, to provide support for multiple reader/writer scenarios. Unix semaphores can use an UNDO structure per operation to deal with processes exiting within a critical section. Most Unix variants (including Linux) use semaphores internally to protect critical sections of the operating system. POSIX defines another, incompatible shared memory concept, as well as semaphores concept (named / unnamed via files). 12 Shared Memory / Semaphores Hannes Lubich, 2003 2005 Page 44 22