Presentation is loading. Please wait.

Presentation is loading. Please wait.

Inter-Process Communication: Message Passing

Similar presentations


Presentation on theme: "Inter-Process Communication: Message Passing"— Presentation transcript:

1 Inter-Process Communication: Message Passing
Thomas Plagemann With slides from Pål Halvorsen, Kai Li, and Andrew S. Tanenbaum

2 Big Picture message passing communication? shared memory
race conditions critical regions mutal exclusion monitors shared memory mutexes sleep and wakeup semaphores message passing communication?

3 Message Passing API Generic API What should the “dest” and “src” be?
send( dest, &msg ) recv( src, &msg ) What should the “dest” and “src” be? pid file: e.g. a (named) pipe port: network address, pid, etc no src: receive any message src combines both specific and any What should “msg” be? Need both buffer and size for a variable sized message

4 Issues Asynchronous vs. synchronous Direct vs. indirect
How are links established? Can a link be associated with more than two processes? How many links can there be between any pair? What is the capacity of a link? What is the size of a message? Is a link unidirectional or bidirectional?

5 Asynchronous vs. Synchronous
Synchronous (blocking): thread is blocked until message primitive has been performed may be blocked for a very long time msg operation, unblock thread msg operation block thread, execute msg operation in another thread/kernel time

6 Asynchronous vs. Synchronous
Asynchronous (non-blocking): thread gets control back immediately thread can run in parallel other activities thread cannot reuse buffer for message before message is received how to know when to start if blocked on full/empty buffer? poll interrupts/signals msg operation, resume immediately execute msg operation in another thread/kernel time

7 Asynchronous vs. Synchronous
Send semantic: Synchronous Will not return until data is out of its source memory Block on full buffer Asynchronous Return as soon as initiating its hardware Completion Require application to check status Notify or signal the application Receive semantic: Synchronous Return data if there is a message Block on empty buffer Asynchronous Return null if there is no message

8 Buffering No buffering Buffering synchronous
Sender must wait until the receiver receives the message Rendezvous on each message Buffering asynchronous or synchronous Bounded buffer Finite size Sender blocks when the buffer is full Use mesa-monitor to solve the problem? Unbounded buffer “Infinite” size Sender never blocks

9 Direct Communication Must explicitly name the sender/receiver (“dest” and “src”) processes A buffer at the receiver More than one process may send messages to the receiver To receive from a specific sender, it requires searching through the whole buffer A buffer at each sender A sender may send messages to multiple receivers

10 Message Passing: Producer-Consumers Problem
void producer(void) { while (TRUE) { produce item; send( consumer, item ); } void consumer(void) { while (TRUE) { recv( producer, item ); consume item; }

11 Message Passing: Producer-Consumers Problem with N messages

12 Indirect Communication
“dest” and “src” are a shared (unique) mailbox Use a mailbox to allow many-to-many communication Requires open/close a mailbox before using it Where should the buffer be? A buffer and its mutex and conditions should be at the mailbox

13 Using Message-Passing
What is message-passing for? Communication across address spaces Communication across protection domains Synchronization Use a mailbox to communicate between a process/thread and an interrupt handler: fake a sender Receive Keyboard mbox

14 Process Termination P waits for a message from Q, but Q has terminated
Problem: P may be blocked forever Solution: P checks once a while Catch the exception and informs P Send ack message P sends a message to Q, but Q has terminated Problem: P has no buffer and will be blocked forever Check Q’s state and cleanup

15 Message Loss & Corruption
Unreliable service best effort, up to the user to Detection Acknowledge each message sent Timeout on the sender side Retransmission Sequence number for each message Retransmit a message on timeout Retransmit a message on out-of-sequence acknowledgement Remove duplication messages on the receiver side

16 System V and Linux Mailboxes
Messages are stored as a sequence of bytes System V IPC messages also have a type Mailboxes are implemented as message queues sorting messages according to FIFO Can be both blocking and non-blocking (IPC_NOWAIT) The Linux related slides have some simplified (pseudo) code Linux several parts missing the shown code may block holding the queue lock waiting queues are more complex ...

17 Mailboxes Example: OS-kernel A B C D ... msgsnd(A, , ...)
msgrcv(B, , ...)

18 Messages in System V Four system call msgqid = msgget(key, flag)
msgget( ) returns a message descriptor that designate a message queue msgctl( ) control a message descriptor msgsnd( ) send a message msgrcv( ) receive a message msgqid = msgget(key, flag) Create a new message queue (entry) or to retrieve an existing message queue key: a name chosen by user, represent a message queue. flag: such as create flag bit with different permission Return a kernel –chosen descriptor which points to the message queue

19 msgget User calls msgget to creat a new descriptor
Kernel searches array of message queues to see if one with the key exists If no entry with the given key: Allocate a new queue structure Initialize Return identifier Else: Check permissions and return

20 Message Queues in System V
Kernel stores messages on a linked list (queue) per descriptor msgqid is index into array of message queue headers Each message queue (or IPC entry) has a permissions structure Pointers to the first and last messages on a linked list The number of messages and the total number of data bytes on the linked list The maximum number of bytes of data that can be on the linked list The process IDs of the last processes to send and receive messages Time stamps of the last msgsnd, msgrc, and msgctl operation

21 Data Structures for Messages in System V
Source: M. Bach: The Design of the Unix Operating System

22 msgsnd (msgqid, msg, count, flag)
msgqid descriptor of message queue returned by msgget msg pointer to integer and character array count size of the data array flag what should be done if not enough internal bufferspace Source: M. Bach: The Design of the Unix Operating System

23 count = msgrcv(id, msg, maxcount, type, flag)
id: message descriptor msg: the address of a user structure (message) maxcount: the size of the msg type: the message type that user wants to read flag: specifies what the kernel should do if no message are on the queue count: the number of bytes returned to the user

24 Source: M. Bach: The Design of the Unix Operating System

25 Msgctl(id, cmd, mstatbuf)
Query the status of a message descriptor, set its status, and remove a message queue id identifies the message descriptor cmd specifies the type of command mstatbuf contains control parameters or returns result of a query

26 Linux Mailboxes One msq_queue structure for each present queue:
Messages are stored in the kernel using the msg_msg structure: struct msg_queue { struct kern_ipc_perm q_perm; /* access permissions */ time_t q_stime; /* last msgsnd time */ time_t q_rtime; /* last msgrcv time */ time_t q_ctime; /* last change time */ unsigned long q_cbytes; /* current number of bytes on queue */ unsigned long q_qnum; /* number of messages in queue */ unsigned long q_qbytes; /* max number of bytes on queue */ pid_t q_lspid; /* pid of last msgsnd */ pid_t q_lrpid; /* last receive pid */ struct list_head q_messages; struct list_head q_receivers; struct list_head q_senders; }; struct msg_msg { struct list_head m_list; long m_type; /* message type */ int m_ts; /* message text size */ struct msg_msgseg* next; /* next pointer */ }; NOTE: the message is stored immediately after this structure - no pointer is necessary

27 Linux Mailboxes Create a message queue using the sys_msgget system call: To manipulate a queue, one uses the sys_msgctl system call: long sys_msgget (key_t key, int msgflg) { ... create new message queue and set access permissions } long sys_msgctl (int msqid, int cmd, struct msqid_ds *buf) { ... switch (cmd) { case IPC_INFO: return info about the queue, e.g., length, etc. case IPC_SET: modify info about the queue, e.g., length, etc. case IPC_RMID: remove the queue }

28 Linux Mailboxes Send a message to the queue using the sys_msgsnd system call: long sys_msgsnd (int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg) { msq = msg_lock(msqid); ... if ((msgsz + msq->q_cbytes) > msq->q_qbytes) insert message the tail of msq->q_messages *msgp, update msq else put sender in waiting senders queue (msq->q_senders) msg_unlock(msqid); }

29 Linux Mailboxes Receive a message from the queue using the sys_msgrcv system call: the msgtyp parameter and msgflg flag determine which messages to retrieve: = 0: return first message > 0: first message in queue with msg_msg.m_type = msgtyp > 0 & MSG_EXCEPT: first message in queue with msg_msg.m_type != msgtyp long sys_msgrcv (int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg) { msq = msg_lock(msqid); ... search msq->q_messages for first message matching msgtype if (msg) store message in msgbuf *msgp, remove message from msgbuf *msgp, update msq else put receiver in waiting receivers queue (msq->q_receivers) msg_unlock(msqid); }

30 Our Mailbox We make it simpler than Linux Mailbox  buffer space
Deliver messages in FIFO order Mailbox  buffer space Finite space Main purpose: Send Receive Maintenance: Init Open Close Statistics

31 Linux Pipes ls more Classic IPC method under UNIX: > ls -l | more
shell runs two processes ls and more which are linked via a pipe the first process (ls) writes data (e.g., using write) to the pipe and the second (more) reads data (e.g., using read) from the pipe the system call pipe( fd[2] ) creates one file descriptor for reading (fd[0]) and one for writing (fd[1]) - allocates a temporary inode and a memory page to hold data struct pipe_inode_info { wait_queue_head_t wait; char *base; unsigned int len; unsigned int start; unsigned int readers, writers; unsigned int waiting_readers, waiting_writers; unsigned int r_counter, w_counter; } ls more

32 Linux: Mailboxes vs. Pipes
Are there any differences between a mailbox and a pipe? Message types mailboxes may have messages of different types pipes do not have different types Buffer pipes – one or more pages storing messages contiguously mailboxes – linked list of messages of different types Termination pipes exists only as long as some have open the file descriptors mailboxes must often be closed More than two processes a pipe often (not in Linux) implies one sender and one receiver many can use a mailbox

33 Performance Performance is an important issue (at least when sender and receiver is on one machine), e.g.: shared memory and using semaphores mailboxes copying data from source to mailbox and from mailbox to receiver Can one somehow optimize the message passing?

34 Shared Memory in System V
Processes can communicate directly by sharing parts of their virtual address space System calls for manipulating shared memory are similar to calls for messages Read and write with standard calls

35 Shared Memory in System V (cont.)
shmget create a new region of shared memory or returns an existing one shmid = shmget (key, size, flag) shmat logically attacheds a shared memory to the virtual address space of a process virtaddr = shmat (id, addr, flags) shmdt detaches a shared memory from the virtual address shmdt(addr) shmctl manipulate various parameters associated with the shared memory shmctl(id, cmd, shmstatbuf)

36

37 Attaching Shared Memory

38 Remote Procedure Call Message passing uses I/O
Idea of RPC is to make function calls Small libraries (stubs) and OS take care of communication

39 Remote Procedure Call Implementation Issues:
Cannot pass pointers - call by reference becomes copy-restore Marshaling - packing parameters Weakly typed languages - client stub cannot determine size Not always possible to determine parameter types Cannot use global variables - may get moved to remote machine/protection domain

40 Summary Many ways to perform IPC on a machine Direct message passing
Message passing using mailboxes Pipes Shared memory RPC To learn more about IPC in the Internet: INF 3190 Data communication INF 5040 Open Distributed Processing INF 5050 Protocols and Routing in the Internet INF 5090 Advanced Topics in Distributed Systems


Download ppt "Inter-Process Communication: Message Passing"

Similar presentations


Ads by Google