Three forms of System V IPC
-
Semaphores
-
Message Queues
-
Shared Memory
System V IPC is different from POSIX API, but both are available in the linux kernel.
GNU C library in kernel version 2.2 includes the interfaces for shared memory and the semaphore according to POSIX.
Access Rights and Numbers
struct kern_ipc_perm
{
key_t key; //key
uid_t uid; //Owner
gid_t gid; //Owner
uid_t cuid; //Creator
gid_t cgid; //Creator
mode_t mode; //Access Mode
unsigned long seq; //counter used to calculate the identifier
};
the user and group id needs 32bit for the Intel 32 bit architecture, so the kernel supported both the IPC_OLD and IPC_64.
Semaphores (System V)
- Array of semaphores can be setup using the system calls
- It is always possible to modify a number of semaphores.
- They can be incremented or decremented in steps greater than 1.
Semaphores are created using the following structure
struct sem_array
{
struct kern_ipc_perm sem_perm; //access permission
time_t sem_otime; //time of the last semaphore operation
time_t sem_ctime; //time of the last change
struct sem *sem_base; //pointer to the first semaphore
struct sem_queue *sem_pending; //operation to be reversed
struct sem_queue **sem_pending_last; //last operation to be carried out
struct sem_undo *undo; //undo operation to be carried out
unsigned long sem_nsems:// Number of semaphores in this array
};
struct sem
{
int semval; //current value of the semaphore
int sempid; //Process ID of the last operation
};
Message Queues
- Message consists of sequence of bytes and a code.
- Processes send messages to the queue and can receive message
- Messages are read in the same order in which they are entered in the message queue.
struct msg_queue
{
struct kern_ipc_perm q_perm; //Access rights
time_t q_stime; //time of last send
time_t q_rtime; //time of last receive
time_t q_ctime; //time of last change
unsigned long q_cbytes; //number of bytes in the queue
unsigned long q_qnum; //number of message in the queue
unsigned long q_qbytes; //capacity of wait queue in bytes
pid_t lspid; //pid of the last sender
pid_t q_lrpid; //pid of the last receiver
};
To send message, the processes use these functions
int sys_msgsnd(int msgid, struct msgbuf *magp, size_t msgsz, int msgflg);
int sys_msgrcv(int msgid, struct msgbuf *magp, size_t msgsz, long msgtyp, int msgflg)
Shared Memory
- shared memory is the fastest form of Inter process communication
- exchange data between processes using the machine code commands for reading and writing
- the main drawback is that the processes need to use additional synchronization mechanism to avoid the race condition
- Shared segment of memory is identified by a number.
- The structure shmid_kernel is for the kernel segment and mapped to the user segment in the virtual address space by the processes with the help of attach function, the reverse action will be through the help of detach.
struct shmid_kernel
{
struct kern_ipc_perm shm_perm; //access rights
struct file *shm_file; //file in the shared memory
int id;
unsigned long shm_nattach; //number of attachments
unsigned long shm_segsz; //size of segment
time_t shm_atim; //time of last attach
time_t shm_dtim; //time of last detach
time_t shm_ctim; //time of creation
pid_t shm_cprid; //creator process id
pid_t shm_lprid; //process id of the last operation
};
Information for Semaphore, message queue and shared memory
seminfo | Value |
semmni (maximum number of semaphore arrays) | 128 |
semmns (maximum number of semaphores in the system | 32000 |
semmsl (number of semaphores per array) | 250 |
semvmx (maximum value of semaphores | 32767 |
msginfo | Value |
msgmni (maximum number of message queue) | 16 |
msgmax (maximum size of a message in bytes) | 8192 |
msgmnb (standarad value for the maximum size of a message queue in bytes) | 16384 |
shminfo | Value |
shmmni (maximum no of shared memory segment) | 4096 |
shmmax (maximum size of SHM segment in bytes) | 33,554,432 |
shmmin (mi | 1 |
shmseg (permitted no of segments/processes) | 4096 |
Comments
Post a Comment