´ÙÀ½ À§·Î ÀÌÀü ¸ñÂ÷ ¸®´ª½º ÇÁ·Î±×·¡¸Ó¸¦ À§ÇÑ °¡À̵å

³»ºÎ¿Í »ç¿ëÀÚ ÀÚ·á ±¸Á¶ (Internal and User Data Structures)

½Ã½ºÅÛ V IPC¿Í °°ÀÌ º¹ÀâÇÑ ÁÖÁ¦¸¦ ÃæºÐÈ÷ ÀÌÇØÇϱâ À§ÇÑ ¿­¼è´Â ÇÑÁ¤µÈ Ä¿³Î ¾È¿¡ Á¸ÀçÇÏ´Â ´Ù¾çÇÑ ³»ºÎ ÀÚ·á ±¸Á¶¿Í Á÷Á¢ÀûÀ¸·Î Ä£ÇØÁö´Â °ÍÀÌ´Ù. ³ª¸ÓÁöµéÀÌ ´õ ³·Àº ´Ü°èÀÌ Á¸ÀçÇÏ°í ÀÖ´Â ÇÑ, ÀÌ·¯ÇÑ ±¸Á¶¿¡ ´ëÇÑ Á÷Á¢ÀûÀÎ Á¢±ÙÀº °¡Àå ±âº»ÀûÀÎ µ¿ÀÛ¿¡¼­ ÇÊ¿äÇÏ´Ù.



¸Þ¼¼Áö ¹öÆÛ (Message buffer)

°¡Àå óÀ½À¸·Î ¸¸³¯ ±¸Á¶´Â msgbuf ±¸Á¶ÀÌ´Ù. ÀÌ Æ¯º°ÇÑ ÀÚ·á ±¸Á¶´Â ¸Þ¼¼Áö ÀڷḦ À§ÇÑ ÅÛÇø´(template)¶ó »ý°¢ÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¡¸Ó°¡ ÀÌ·¯ÇÑ Å¸ÀÔÀÇ ±¸Á¶¸¦ Á¤ÀÇÇÏ¿© »ç¿ëÇÏÁö ¾Ê´Â ÇÑ, msgbuf ŸÀÔÀÇ ±¸Á¶¸¦ ½ÇÁ¦ÀûÀ¸·Î ÀÌÇØÇÏ´Â °ÍÀº ÇʼöÀûÀÌ´Ù. linux/msg.h¿¡ ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.:


/* message buffer for msgsnd and msgrcv calls */
/* msgsnd¿Í msgrcv È£ÃâÀ» À§ÇÑ ¸Þ¼¼Áö ¹öÆÛ */
struct msgbuf {
	long mtype;	/* type of message ¸Þ¼¼Áö ŸÀÔ */
	char mtext[1];	/* message text ¸Þ¼¼Áö ³»¿ë */
};

msgbuf ±¸Á¶¿¡´Â µÎ°³ÀÇ ¸â¹ö°¡ ÀÖ´Ù.:

mtype

¾ç¼ö·Î Ç¥ÇöµÇ´Â ¸Þ¼¼Áö ŸÀÔ. ¹Ýµå½Ã ¾ç¼ö¿©¾ß ÇÑ´Ù.

mtext

¸Þ¼¼Áö ÀÚ·á ÀÚü.

ÁÖ¾îÁø ¸Þ¼¼Áö¿¡ ŸÀÔÀ» ºÎ¿©ÇÏ´Â ´É·ÂÀº º»ÁúÀûÀ¸·Î ´ÜÀÏ Å¥¿¡¼­ÀÇ ´ÙÁß(multiplex) ¸Þ¼¼ÁöµéÀ» ¼ö¿ëÇÒ ´É·ÂÀ» ºÎ¿©ÇÑ´Ù. ¿¹¸¦ µé¸é, Ŭ¶óÀ̾ðÆ® ÇÁ·Î¼¼½ºµéÀº ¸ÅÁ÷¹øÈ£ (magic number)¸¦ ÇÒ´ç¹ÞÀ» ¼ö ÀÖ°í ÀÌ°ÍÀº ¼­¹ö ÇÁ·Î¼¼½º·Î ºÎÅÍ º¸³»Áø ¸Þ¼¼Áöµé¿¡ ´ëÇØ ¸Þ¼¼Áö ŸÀÔó·³ »ç¿ëµÉ ¼ö ÀÖ´Ù. ¼­¹ö´Â ÀÚüÀûÀ¸·Î ¸î¸îÀÇ ´Ù¸¥ ¹øÈ£¸¦ »ç¿ëÇÒ ¼ö ÀÖ°í, Ŭ¶óÀ̾ðÆ®´Â ±×¹øÈ£·Î ¸Þ¼¼Áö¸¦ º¸³»±â À§ÇØ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¶Ç ´Ù¸¥ ½Ã³ª¸®¿À¿¡¼­´Â ÀÀ¿ëÇÁ·Î±×·¥Àº ¿¡·¯ ¸Þ¼¼Áö¿¡ ´ëÇØ ¸Þ¼¼Áö ŸÀÔ '1'¸¦ ¿äû ¸Þ¼¼Áö(request message)¿¡ ´ëÇØ ¸Þ¼¼Áö ŸÀÔ '2'¸¦ Ç¥½ÃÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °¡´É¼ºÀº ³¡ÀÌ ¾ø´Ù.

¶Ç ´Ù¸¥ ¹æ¹ýÀº ´ë°³ ¸Þ¼¼Áö ÀÚ·á ¿ä¼Ò (mtext)¿¡ ¸Å¿ì ¼­¼úÀûÀÎ À̸§À» ºÎ¿©ÇÏ¿© ÇöȤµÇÁö ¾Êµµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ÀÌ Çʵå´Â ²À ¹®ÀÚµéÀÇ ¹è¿­ÀÌ¿©¾ß ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¾î¶² ÇüÅÂÀÇ ¾î¶² ÀÚ·áÀÌµç »ó°ü¾ø´Ù. ÀÌ ±¸Á¶´Â ÀÀ¿ëÇÁ·Î±×·¥ ÇÁ·Î±×·¡¸Ó¿¡ ÀÇÇØ ÀçÁ¤ÀÇµÉ ¼ö ÀÖÀ¸¹Ç·Î, ÇÊµå ±× ÀÚü¸¸À¸·Îµµ ½ÇÁ¦·Î ¿ÏÀüÈ÷ ¸¶À½´ë·ÎÀÌ´Ù.


struct my_msgbuf {
	long	mtype;		/* Message type  ¸Þ¼¼Áö ŸÀÔ */
	long	request_id;	/* Request identifier ¿äû È®ÀÎÀÚ */
	struct	client info;	/* Client information structure Ŭ¶óÀ̾ðÆ® Á¤º¸ ±¸Á¶ */
};

Àü°ú °°Àº ¸Þ¼¼Áö ŸÀÔÀ» º¼ ¼ö ÀÖÁö¸¸, ±¸Á¶ÀÇ ³ª¸ÓÁö´Â µÎ°³ÀÇ ´Ù¸¥ ¿ä¼Ò·Î ¹Ù²î¾ú´Ù. ±× Áß Çϳª´Â ¶Ç ´Ù¸¥ ±¸Á¶Ã¼(structure)ÀÌ´Ù! ÀÌ°ÍÀÌ ¸Þ¼¼Áö Å¥ÀÇ ÀåÁ¡ÀÌ´Ù. Ä¿³ÎÀº ÀÚ·á°¡ ¹«¾ùÀ̵ç ÀÚ·áÀÇ º¯È¯À» ÀÏÀ¸Å°Áö ¾Ê´Â´Ù. ¾î¶² Á¤º¸µçÁö º¸³»Áú ¼ö ÀÖ´Ù.

ÁÖ¾îÁø ¸Þ¼¼ÁöÀÇ ÃÖ´ë Å©±â¿¡ ´ëÇÑ ³»ºÎÀûÀÎ Á¦ÇÑÀº ¾ø´Ù. ¸®´ª½º¿¡¼­´Â linux/msg.h¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.:

#define	MSGMAX	4056	/* <= 4056 */	/* max size if message (bytes) ¸Þ¼¼ÁöÀÇ ÃÖ´ë Å©±â */

¸Þ¼¼Áö´Â ±æÀÌ°¡ 4¹ÙÀÌÆ®(long)ÀÎ mtype ¸â¹ö¸¦ Æ÷ÇÔÇÏ¿© ÃÑ Å©±â 4,056¹ÙÀÌÆ®º¸´Ù Ŭ ¼ö ¾ø´Ù.


Ä¿³Î msg ±¸Á¶ (Kernel msg structure)

Ä¿³ÎÀº °¢°¢ÀÇ ¸Þ¼¼Áö¸¦ msg ±¸Á¶Ã¼ÀÇ ¸ð¾ÓÀ¸·Î Å¥¾È¿¡ ÀúÀåÇÑ´Ù. ÀÌ°ÍÀº linux/msg.h¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.


/* °¢ ¸Þ¼¼Áö¿¡ ´ëÇÑ ÇÑ°³ÀÇ ¸Þ¼¼Áö ±¸Á¶Ã¼ */
struct msg {
	struct	msg *msg_next;	/* Å¥¿¡¼­ÀÇ ´ÙÀ½ ¸Þ¼¼Áö */
	long	msg_type;
	char	*msg_spot;	/* ¸Þ¼¼Áö ³»¿ë ÁÖ¼Ò */
	short	msg_ts;		/* ¸Þ¼¼Áö ³»¿ë Å©±â */
};

msg_next

ÀÌ°ÍÀº Å¥¾È¿¡¼­ÀÇ ´ÙÀ½ ¸Þ¼¼Áö¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ´Ù. ÀÌ°ÍÀº Ä¿³ÎÀÇ ÁּҸŰÜÁø °ø°£ (kernel addressing space)¾È¿¡ ÇÑÁÙ·Î ¿¬°áµÈ ¸ñ·Ï(singly linked list)ó·³ ÀúÀåµÇ¾î ÀÖ´Ù.

msg_type

ÀÌ°ÍÀº »ç¿ëÀÚ ±¸Á¶Ã¼ÀÎ msgbuf¿¡ ÇÒ´çµÈ ¸Þ¼¼Áö ŸÀÔÀÌ´Ù.

msg_spot

¸Þ¼¼Áö º»Ã¼ÀÇ ½ÃÀÛÁ¡À» °¡¸®Å°´Â Æ÷ÀÎÅÍ

msg_ts

¸Þ¼¼Áö ³»¿ë ¶Ç´Â º»Ã¼ÀÇ ±æÀÌ

Ä¿³Î msqid ds ±¸Á¶ (Kernel msqid ds structure)

IPC °´Ã¼ÀÇ ¼¼°¡Áö ŸÀÔÀÇ °¢°¢Àº Ä¿³Î¿¡ ÀÇÇØ À¯ÁöµÇ´Â ³»ºÎ ÀÚ·á ±¸Á¶¸¦ °¡Áø´Ù. ¸Þ¼¼Áö Å¥¿¡¼­´Â msq_id ±¸Á¶ÀÌ´Ù. Ä¿³ÎÀº ½Ã½ºÅÛ »ó¿¡¼­ »ý¼ºµÇ´Â ¸ðµç ¸Þ¼¼Áö Å¥¿¡ ´ëÇØ ÀÌ·¯ÇÑ ±¸Á¶¸¦ Çϳª¾¿ ¸¸µé¾î ÀúÀåÇÏ°í °ü¸®ÇÑ´Ù. linux/msg.h¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.:


/* ½Ã½ºÅÛ»ó¿¡¼­ °¢ Å¥¿¡ ´ëÇÑ msqid ±¸Á¶ */
struct msqid_ds {
    struct ipc_perm msg_perm;
    struct msg *msg_first;  /* first message on queue Å¥ÀÇ Ã³À½ ¸Þ¼¼Áö*/
    struct msg *msg_last;   /* last message in queue Å¥ÀÇ ¸¶Áö¸· ¸Þ¼¼Áö*/
    time_t msg_stime;       /* last msgsnd time ¸¶Áö¸·À¸·Î msgsnd°¡ ¼öÇàµÈ ½Ã°£*/
    time_t msg_rtime;       /* last msgrcv time ¸¶Áö¸·À¸·Î msgrcv°¡ ¼öÇàµÈ ½Ã°£*/
    time_t msg_ctime;       /* last change time ¸¶Áö¸·À¸·Î change°¡ ¼öÇàµÈ ½Ã°£*/
    struct wait_queue *wwait;
    struct wait_queue *rwait;
    ushort msg_cbytes;    
    ushort msg_qnum;     
    ushort msg_qbytes;      /* max number of bytes on queue Å¥ÀÇ ÃÖ´ë ¹ÙÀÌÆ® ¼ö*/
    ushort msg_lspid;       /* pid of last msgsnd ¸¶Áö¸·À¸·Î msgsnd¸¦ ¼öÇàÇÑ pid*/
    ushort msg_lrpid;       /* last receive pid ¸¶Áö¸·À¸·Î ¹ÞÀº pid*/
};

ÀÌ ±¸Á¶Ã¼ÀÇ ´ëºÎºÐÀÇ ¸â¹öµé¿¡ ´ëÇØ °ü½ÉÀ» °®´Â ÀÏÀº °ÅÀÇ ¾øÁö¸¸, ¿ì¸®µéÀÇ ¿©ÇàÀ» ¿Ï¼º½ÃÅ°±â À§ÇØ °¢°¢¿¡ ´ëÇØ °£´ÜÈ÷ ¼³¸íÇÏ°Ú´Ù.

msg_perm

ipc_perm ±¸Á¶Ã¼ÀÇ Çϳª·Î linux/ipc.h¿¡ Á¤ÀǵǾî ÀÖ´Ù. ÀÌ°ÍÀº Á¢±Ù Çã°¡»çÇ×(access permissions)°ú Å¥ÀÇ »ý¼ºÀÚ(creator)¿¡ ´ëÇÑ Á¤º¸(uid, etc)¸¦ Æ÷ÇÔÇÏ´Â ¸Þ¼¼Áö Å¥ÀÇ Çã°¡»çÇ× Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù.

msg_first

Å¥ÀÇ Ã¹¹ø° ¸Þ¼¼Áö¿Í ¿¬°áµÇ¾î ÀÖ´Ù.(the head of the list)

msg_last

Å¥ÀÇ ¸¶Áö¸· ¸Þ¼¼Áö¿Í ¿¬°áµÇ¾î ÀÖ´Ù.(the tail of the list)

msg_stime

Å¥¿¡ º¸³»Áø ¸¶Áö¸· ¸Þ¼¼ÁöÀÇ ½Ã°£ ±â·Ï(Timestamp)

msg_rtime

Å¥·Î ºÎÅÍ Á¶È¸µÈ ¸¶Áö¸· ¸Þ¼¼ÁöÀÇ ½Ã°£ ±â·Ï(Timestamp)

msg_ctime

Å¥¿¡¼­ ÀϾ ¸¶Áö¸· º¯È­(change)ÀÇ ½Ã°£ ±â·Ï(Timestamp) (more on this later)

wwait

and

rwait

Ä¿³ÎÀÇ ´ë±â Å¥(wait queue)¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ. ¸Þ¼¼Áö Å¥¿¡ ÀÖ´Â µ¿ÀÛÀÌ ÇÁ·Î¼¼½º°¡ sleep »óÅ·Πµé¾î°¡´Â °ÍÀ¸·Î °£ÁÖÇÒ ¶§ »ç¿ëµÈ´Ù. (i.e. Å¥°¡ °¡µæÂ÷¼­ ÇÁ·Î¼¼½º°¡ ¿­¸®±â(opening)¸¦ ±â´Ù¸®°í ÀÖ´Â °æ¿ì)

msg_qnum

ÇöÀç Å¥¿¡ µé¾î ÀÖ´Â ¸Þ¼¼ÁöÀÇ °¹¼ö

msg_qbytes

Å¥ »óÀÇ ÃÖ´ë ¹ÙÀÌÆ® ¼ö

msg_lspid

¸¶Áö¸· ¸Þ¼¼Áö¸¦ º¸³½ ÇÁ·Î¼¼½ºÀÇ PID

msg_lrpid

¸¶Áö¸· ¸Þ¼¼Áö¸¦ Á¶È¸ÇÑ ÇÁ·Î¼¼½ºÀÇ PID


Ä¿³Î ipc perm ±¸Á¶ (Kernel ipc perm structure)

Ä¿³ÎÀº ipc_perm ŸÀÔÀÇ ±¸Á¶Ã¼ ¾È¿¡ IPC °´Ã¼ÀÇ Çã°¡»çÇ×(permission) Á¤º¸¸¦ ÀúÀåÇÑ´Ù. ¿¹¸¦ µé¸é, ¾Õ¿¡¼­ ¼³¸íÇÑ ¸Þ¼¼Áö Å¥ÀÇ ³»ºÎ ±¸Á¶¿¡¼­´Â msg_perm ¸â¹ö°¡ ÀÌ·± ŸÀÔÀÌ´Ù. linux/ipc.h ¾È¿¡ ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.:


struct ipc_perm
{
  key_t  key;
  ushort uid;   /* owner euid and egid */
  ushort gid;
  ushort cuid;  /* creator euid and egid */
  ushort cgid;
  ushort mode;  /* access modes see mode flags below */
  ushort seq;   /* slot usage sequence number */
};

À§ÀÇ ³»¿ëµîÀº ¸ðµÎ ¸í¹éÈ÷ ÀÚ±â Çؼ®ÀûÀÌ´Ù. °´Ã¼ÀÇ IPC Å°¸¦ °¡Áö°í ÀúÀåµÇ¾î ÀÖ´Â °ÍÀº ±× °´Ã¼ÀÇ »ý¼ºÀÚ(creator)¿Í ÁÖÀÎ(owner)¿¡ ´ëÇÑ Á¤º¸ÀÌ´Ù. (creator¿Í owner´Â ¼­·Î ´Ù¸¦ ¼ö ÀÖÀ½) 8Áø Á¢±Ù ¸ðµå(the octal access mode) ¶ÇÇÑ usigned shortÇüÅ·Π¿©±â¿¡ ÀúÀåµÇ¾î ÀÖ´Ù. ¸¶Áö¸·À¸·Î slot usage sequence ¹øÈ£°¡ ³¡¿¡ ÀúÀåµÇ¾î ÀÖ´Ù. ¸Å¹ø IPC °´Ã¼´Â ½Ã½ºÅÛ È£Ãâ (destroyed)À» °æÀ¯ÇÏ¿© ´ÝÈù´Ù. ÀÌ °ªÀº ½Ã½ºÅÛ ¾È¿¡ Á¸ÀçÇÒ ¼ö ÀÖ´Â IPC °´Ã¼ÀÇ ÃÖ´ë¼ö¿¡ ÀÇÇØ Áõ°¡µÈ´Ù. ÀÌ °ª¿¡ ´ëÇØ ¿ì¸®°¡ °ü½ÉÀ» °¡Á®¾ß Çϴ°¡? ¾Æ´Ï´Ù.

NOTE:Richard StevensÀÇ UNIX Network Programming 125ÂÊ¿¡ ÀÌ ÁÖÁ¦¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ë°ú ÀÌ°ÍÀÇ Á¸Àç¿Í µ¿ÀÛÀÇ º¸¾È ÀÌÀ¯µîÀÌ Àß ¼³¸íµÇ¾î ÀÖ´Ù.


ÀÌÀü:±âº» °³³ä (Basic Concepts) ´ÙÀ½:½Ã½ºÅÛ È£Ãâ:msgget() (SYSTEM CALL:msgget())

Copyright (c) 1996,1997 by Euibeom.Hwang & SangEun.Oh All Rights Reserved

Email To:Webmaster , Another address
LAST UPDATE Nov 18,1997
Created Nov 17,1997