Operating System Lab N: Shared Memory

advertisement
Lab 10
Message Queue and Shared Memory
NCHU System & Network Lab
Message Queue
NCHU System & Network Lab
Message Queue
• provide a reasonably easy and efficient way of
passing data between two unrelated processes
Message queue 1
Process 1
message
process2
NCHU System & Network Lab
Create and Access a Message Queue
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
key : names a particular message queue.
msgflg: IPC_PRIVATE only used by process itself
IPC_CREAT
create new message queue, if exist, ignore this flag
permission flags
0
0
0
r
w x
r
w x
r
owner permission
group permission
others permission
Return queue identifier on success, -1 on failure
NCHU System & Network Lab
w x
Send a Message to a message queue
int msgsnd(int msqid, const void *msg_ptr, size_t
msg_sz, int msgflg);
msqid :
message queue identifier
msg_ptr : a pointer to the message to be sent.
msg_sz: size of the message pointed to by msg_ptr.
This size must not include the long int message type
msgflg:
controls what happens if either the current message queue is full or
the systemwide limit on queued messages has been reached
IPC_NOWAIT return -1 without sending message
If no IPC_NOWAIT, it will be suspended and waiting for space to become available
in the queue.
Return 0 on success, -1 on error.
NCHU System & Network Lab
Message
• The structure of the message must follow the
following two rules.
struct my_message {
long int message_type;
/* The data you wish to transfer */
}
1. smaller than the system limit.
2. start with a long int.
NCHU System & Network Lab
retrieves messages from a message
queue
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz,
long int msgtype, int msgflg);
msqid : message queue identifier.
msg_ptr: point to the message to be received.
msg_sz: size of the message pointed to by msg_ptr.
msgtype: a simple form of reception priority.
0
retrieves first available message.
>0
retrieves first with the same type message.
<0
retrieves the same type or less than it message.
msgflg: controls what happens when no message of the appropriate type is waiting
to be received
IPC_NOWAIT
return -1 without sending message
If no IPC_NOWAIT, it will be suspended and waiting for an appropriate type of
message arrived in queue.
return number of bytes placed in the receive buffer, -1 on error.
NCHU System & Network Lab
Control function
int msgctl(int msqid, int command, struct
msqid_ds *buf);
msqid: message queue identifier.
command:
IPC_STAT Sets the data in the msqid_ds structure to reflect the values
associated with the message queue.
IPC_SET If the process has permission to do so, this sets the values
associated with the message queue to those provided in the
msqid_ds data structure.
IPC_RMID Deletes the message queue.
buf: save the information of msqid.
return 0 on success, -1 on error.
NCHU System & Network Lab
msqid_ds
struct msqid_ds {
uid_t msg_perm.uid;
uid_t msg_perm.gid;
mode_t msg_perm.mode;
}
NCHU System & Network Lab
Example: retrieve and show
NCHU System & Network Lab
Example : input and send
NCHU System & Network Lab
Lab I
• Use message queue write a program that
– Show the used message queue information
• creator id and permission mode number
– Two processes can chat with each other
– Just like…
uid:1 Pmode:0666
P1:hello!!
P2:Hi~!
P2:how are you ?
P1:so so.
Input: _
Process 1
uid:1 Pmode:0666
P1:hello!!
P2:Hi~!
P2:how are you ?
P1:so so.
Input: _
Process 2
NCHU System & Network Lab
Shared Memory
NCHU System & Network Lab
Shared Memory
• Two or multiple processes share the same
memory region.
• The fastest form of IPC
Process 1
Shared memory
Process 2
Two processes share the same memory region
NCHU System & Network Lab
Obtain a shared memory id.
#include <sys/shm.h>
int shmget(key_t key, size_t size, int flag);
size : the size of the shared memory segment in bytes.
flag :
IPC_PRIVATE only used by process itself
IPC_CREAT
create new message queue, if exist, ignore this flag
permission flags
0
0
0
r
w x
r
w x
r
owner permission
group permission
others permission
return shared memory on success, -1 on error.
NCHU System & Network Lab
w x
attachment
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/shm.h>
char *shmat ( int shmid, char *shmaddr, int shmflg )
shmid: shared memory identifier
shmaddr: the address at which the shared memory is to be attached to the current
process. This should almost always be a null pointer
shmflg :
SHM_RND
indicates that the address specified for the second parameter
should be rounded down to a multiple of the page size.
SHM_RDONLY indicates that the segment will be only read, not written.
return -1 on error, the address of the attached shared memory segment for success
NCHU System & Network Lab
detachment
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/shm.h>
int shmdt ( char *shmaddr)
return 0 on success, -1 on error.
NCHU System & Network Lab
Controlling and Deallocating Shared
Memory
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shm_id, int command, struct shmid_ds *buf);
shm_id : shared memory identifier
command:
IPC_STAT
IPC_SET
IPC_RMID
copy the information about the shared memory
segment into the buffer buf
apply the changes the user has made to the
uid, gid, or mode members of the
shm_perms field.
mark the segment as destroyed.
buf : save the information of shmid.
Return 0 on success, -1 on error
NCHU System & Network Lab
shmid_ds structure
struct shmid_ds {
struct
ipc_perm shm_perm; /* operation perms */
int shm_segsz;
/* size of segment(bytes) */
time_t
shm_atime;
/* last attach time */
time_t
shm_dtime;
/* last detach time */
time_t
shm_ctime;
/* last change time */
unsigned short shm_cpid; /* pid of creator */
unsigned short shm_lpid; /* pid of last operator */
short
shm_nattch;
/* no. of current attaches */
/* the following are private */
unsigned short
shm_npages; /* size of segment (pages) */
unsigned long
*shm_pages;
struct shm_desc *attaches;
/* descriptors for attaches */
};
NCHU System & Network Lab
ipc_perm structure
struct ipc_perm {
key_t key;
ushort uid;
ushort gid;
ushort cuid;
ushort cgid;
ushort mode;
ushort seq;
};
/* owner euid and egid */
/* creator euid and egid */
/* lower 9-bits of access modes */
/* sequence number */
NCHU System & Network Lab
Example input.c
NCHU System & Network Lab
Example output.c
NCHU System & Network Lab
Lab I
• Use shared memory write a program that
– Show the information of shared memory
• pid of creator and last attach time.
– Two processes can chat with each other
pid:2 last: xxxx
P1:hello!!
P2:Hi~!
P2:how are you ?
P1:so so.
pid:2 last: xxxx
P1:hello!!
P2:Hi~!
P2:how are you ?
P1:so so.
Input: _
Input: _
Process 1
Process 2
NCHU System & Network Lab
Reference
•Advanced Programming in the UNIX Environment 2nd
Author : Richard Stevens, Stephen A.Rago, Publisher : Addison-Wesley
•Beginning Linux Programming
Author : Richard Stones, Neil Matthew
Publisher : Wrox
•Operating System Concepts 6th edition
Author : Abraham Silberschatz, Peter Baer Galvin, Greg Gagne
Publisher : John Wiley & Sons, inc.
•Google
•LINUX MAN PAGES ONLINE
NCHU System & Network Lab
Download