°øÀ¯ ¸Þ¸ð¸®ÀÇ »ç¿ë
ÃÑ ÆäÀÌÁö ¼ö : 3027

Àüü ÇÔ¼ö/¿ë¾î»çÀü
ÇöÀçÀ§Ä¡ : ¹Ì´Ï»çÀÌÆ®>½Ã½ºÅÛÇÁ·Î±×·¡¹Ö>IPC>SharedMemory

Contents

1 °øÀ¯¸Þ¸ð¸® (shared memory)
1.1 °³¿ä
1.2 °øÀ¯¸Þ¸ð¸®´Â ¾î¶»°Ô ÇÒ´çµÇ´Â°¡
1.3 shmget
1.4 shmat
1.5 shmdt
1.6 shmctl
2 °øÀ¯¸Þ¸ð¸® Á¦¾îÇϱâ
2.1 °øÀ¯ ¸Þ¸ð¸® Á¤º¸ È®ÀÎ
2.2 /proc ÆÄÀÏ ½Ã½ºÅÛÀ¸·Î Á¦¾îÇϱâ


1 °øÀ¯¸Þ¸ð¸® (shared memory)

º¸Åë ÇÁ·Î¼¼½º¿¡¼­ »ç¿ëµÇ´Â ¸Þ¸ð¸®¿µ¿ªÀº ÇØ´ç ÇÁ·Î¼¼½º¸¸ÀÌ»ç¿ëÇÒ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¶§¶§·Î ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ ƯÁ¤ ¸Þ¸ð¸®¿µ¿ªÀ» »ç¿ëÇßÀ¸¸é Çϴ¶§°¡ ÀÖÀ»°ÍÀÌ´Ù.

System V IPC ¼³ºñÁßÀÇ ÇϳªÀÎ "°øÀ¯¸Þ¸ð¸®"¸¦ ÅëÇØ¼­ ÀÌ·¯ÇÑÀÏÀ» ÇÒ¼öÀÖ´Ù.

1.1 °³¿ä

¸ðµç ÇÁ·Î¼¼½º´Â ÀÚ½ÅÀÇ ¾÷¹«¸¦ ¼öÇàÇϱâ À§Çؼ­ ÇÊ¿äÇÑ ÀڷḦ ÀúÀåÇϱâ À§ÇÑ ¸Þ¸ð¸® °ø°£À» °¡Áö°Ô µÈ´Ù. ÀÌ·¯ÇÑ ¸Þ¸ð¸®°ø°£¿¡´Â CPU¿¡ ÀÇÇØ ¼öÇàµÇ´Â ¸í·É¾îµé, ÇÁ·Î±×·¥ ½ÃÀ۽à Á¤Àǵǰí ÃʱâÈ­µÈ µ¥ÀÌŸ, ÇÁ·Î±×·¥ ½ÃÀ۽à Á¤ÀǵǾúÁö¸¸ ÃʱâÈ­ µÇÁö ¾ÊÀº µ¥ÀÌŸ, ÇÔ¼öÈ£Ãâ¿¡ ÇÊ¿äÇÑ Á¤º¸, µ¿ÀûÇÒ´çÀÌ ÀÌ·ç¾îÁö´Â µ¥ÀÌŸµî ÀÌ µé¾î°¡°Ô µÈ´Ù.

ÇÁ·Î¼¼½º´Â ½ÃÀ۽à ȤÀº ½ÇÇàÁß¿¡ ÀÌ·¯ÇÑ µ¥ÀÌŸ¸¦ ÀúÀåÇÏ°í »ç¿ëÇϱâ À§ÇÑ ¸Þ¸ð¸® °ø°£À» Ä¿³Î¿¡ ¿ä±¸ÇÏ¿©¼­ ÇÒ´ç¹Þ¾Æ »ç¿ëÇÏ°Ô µÇ´Âµ¥, ÀÌ·¯ÇÑ ¸Þ¸ð¸®°ø°£Àº ±âº»ÀûÀ¸·Î ¸Þ¸ð¸®¸¦ ¿äûÇÑ ÇÁ·Î¼¼½º¸¸ÀÌ Á¢±Ù°¡´ÉÇϵµ·Ï µÇ¾îÀÖ´Ù. ÇÏÁö¸¸ °¡²ûÀº ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ ƯÁ¤ ¸Þ¸ð¸® °ø°£À» µ¿½Ã¿¡ Á¢±ÙÇØ¾ßÇÒ Çʿ伺À» °¡Áú¶§°¡ ÀÖÀ»°ÍÀÌ´Ù.

°øÀ¯¸Þ¸ð¸®´Â ÀÌ·¯ÇÑ ÀÛ¾÷À» À§ÇÑ È¿À²ÀûÀÎ ¹æ¹ýÀ» Á¦°øÇÑ´Ù.

°øÀ¯¸Þ¸ð¸®´Â ¿©·¯ IPC Áß¿¡¼­ °¡Àå ºü¸¥ ¼öÇà¼Óµµ¸¦ º¸¿©ÁØ´Ù.

±×ÀÌÀ¯´Â ÇϳªÀÇ ¸Þ¸ð¸®¸¦ °øÀ¯Çؼ­ Á¢±ÙÇÏ°Ô µÇ¹Ç·Î, µ¥ÀÌŸ º¹»ç¿Í °°Àº ºÒÇÊ¿äÇÑ ¿À¹öÇìµå°¡ ¹ß»ýÇÏÁö ¾Ê±â ¶§¹®À¸·Î, ºü¸¥ µ¥ÀÌŸÀÇ ÀÌ¿ëÀÌ °¡´ÉÇÏ´Ù. ±×·¯³ª ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ¸Þ¸ð¸®¿¡ Á¢±ÙÁß¿¡ ÀÖÀ»¶§, ¶Ç´Ù¸¥ ÇÁ·Î¼¼½º°¡ ¸Þ¸ð¸®¿¡ Á¢±ÙÇÏ´Â ÀÏÀÌ ¹ß»ýÇϸé ÀÚÄ© µ¥ÀÌŸ°¡ ȳ¼ÕµÉ¼ö ÀÖÀ»°ÍÀ̹ǷÎ, Çѹø¿¡ ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ¸Þ¸ð¸®¿¡ Á¢±ÙÇϰí ÀÖ´Ù´Â°É º¸ÁõÇØÁÙ¼ö ÀÖ¾î¾ß ÇÒ°ÍÀÌ´Ù.

ÀÌ·¯ÇÑ ÀÛ¾÷À» À§Çؼ­ Unix ¿¡¼­´Â Semaphore ¶ó´Â ¶Ç´Ù¸¥ °øÀ¯ÀÚ¿øÀ» Á¦¾îÇÒ¼ö ÀÖµµ·Ï ÇØÁÖ´Â µµ±¸¸¦ Á¦°øÇØÁØ´Ù. À̹ø ¹®¼­¿¡¼­´Â Semaphore ¸¦ ´Ù·çÁö´Â ¾ÊÀ»°ÍÀÌ´Ù. À̰ÍÀº ´Ù¸¥ ¹®¼­¿¡¼­ ´Ù·çµµ·Ï ÇÏ°í ¿©±â¿¡¼­´Â ´ÜÁö °øÀ¯¸Þ¸ð¸®¿¡ ´ëÇØ¼­¸¸ ´Ù·çµµ·Ï ÇÒ°ÍÀÌ´Ù.

´ÙÀ½Àº °øÀ¯¸Þ¸ð¸®¿¡ °ü·ÃµÈ ÇÔ¼öµéÀÇ ¸ðÀ½ÀÌ´Ù.
#include <sys/types.h>
#include <sys/shm.h>

int shmget(key_t key, int size, int shmflg)
void *shmat( int shmid, const void *shmaddr, int shmflg )
int shmdt( const void *shmaddr)
int shmctl(int shmid, int cmd, struct shmid_ds *buf)

1.2 °øÀ¯¸Þ¸ð¸®´Â ¾î¶»°Ô ÇÒ´çµÇ´Â°¡

À§ÀÇ ÇÔ¼öµéÀ» ¼³¸íÇϱâ Àü¿¡ ¿ì¼± °øÀ¯¸Þ¸ð¸®°¡ ¾î¶»°Ô ÇÒ´çµÇ°í, ¾î¶² °úÁ¤À» ÅëÇØ¼­ Á¢±Ù°¡´ÉÇÑÁö¿¡ ´ëÇØ¼­ ¿ì¼± ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

°øÀ¯¸Þ¸ð¸®ÀÇ »ý¼º¿äûÀº ÃÖÃÊ °øÀ¯¸Þ¸ð¸® ¿µ¿ªÀ» ¸¸µå´Â ÇÁ·Î¼¼½º°¡ Ä¿³Î¿¡ °øÀ¯¸Þ¸ð¸® °ø°£ÀÇ ÇÒ´çÀ» ¿äûÇÔÀ¸·Î½á ÀÌ·ç¾îÁö¸ç, ¸¸µé¾îÁø °øÀ¯¸Þ¸ð¸®´Â Ä¿³Î¿¡ ÀÇÇØ¼­ °ü¸® µÇ°Ô µÈ´Ù.

ÀÌ·± ÀÌÀ¯·Î Çѹø¸¸µé¾îÁø °øÀ¯¸Þ¸ð¸®´Â ¿î¿µÃ¼Á¦¸¦ ¸®ºÎÆÃÇϰųª, Á÷Á¢ °øÀ¯¸Þ¸ð¸® °ø°£À» »èÁ¦½ÃÄÑÁÖÁö ¾ÊÀºÇÑ, °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â ¸ðµç ÇÁ·Î¼¼½º°¡ ¾ø¾îÁ³´Ù°í ÇÏ´õ¶óµµ, °è¼ÓÀûÀ¸·Î À¯ÁöµÇ°Ô µÈ´Ù.

ÇÁ·Î¼¼½º°¡ Ä¿³Î¿¡°Ô °øÀ¯¸Þ¸ð¸® °ø°£À» ¿äûÇÏ°Ô µÇ¸é, Ä¿³ÎÀº °øÀ¯¸Þ¸ð¸® °ø°£À» ÇÒ´ç½ÃÄÑÁÖ°í ÀÌµé °øÀ¯¸Þ¸ð¸®°ø°£À» °ü¸®Çϱâ À§ÇÑ ³»ºÎÀڷᱸÁ¶¸¦ ÅëÇÏ¿©, ÀÌµé °øÀ¯¸Þ¸ð¸®¸¦ °ü¸®ÇÏ°Ô µÈ´Ù. ÀÌ ÀÚ·á´Â shmid_ds ¶ó´Â ±¸Á¶Ã¼¿¡ ÀÇÇØ¼­ °ü¸®µÇ¸ç shm.h ¿¡ Á¤ÀǵǾî ÀÖ´Ù.
struct shmid_ds
{
    struct         ipc_perm shm_perm;    // ÆÛ¹Ì¼Ç
    int            shm_segsz;            // ¸Þ¸ð¸® °ø°£ÀÇ Å©±â
    time_t         shm_dtime;            // ¸¶Áö¸· attach ½Ã°£ 
    time_t         shm_dtime;            // ¸¶Áö¸· detach ½Ã°£ 
    time_t         shm_ctime;            // ¸¶Áö¸· º¯°æ ½Ã°£
    unsigned short shm_cpid;             // »ý¼ºÇÁ·Î¼¼½ºÀÇ pid
    unsigned short shm_lpid;             // ¸¶Áö¸·À¸·Î ÀÛµ¿ÇÑ ÇÁ·Î¼¼½ºÀÇ pid
    short          shm_nattch;           // ÇöÀç Á¢±ÙÇÑ ÇÁ·Î¼¼½ºÀÇ ¼ö
};
Unix ¹öÁ¯¿¡ µû¶ó¼­ ¸â¹öº¯¼öµéÀÌ ¾à°£¾¿ Â÷À̸¦ º¸Àϼö ÀÖ´Ù.
  • shm_perm
    °øÀ¯¸Þ¸ð¸®´Â ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ µ¿½Ã¿¡ Á¢±Ù °¡´ÉÇϹǷÎ, ÆÄÀϰú °°ÀÌ ±× Á¢±Ù±ÇÇÑÀ» ºÐ¸íÈ÷ ¸í½ÃÇØÁà¾ß ÇÑ´Ù.
  • shm_segsz
    ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ byte Å©±âÀÌ´Ù
  • shm_atime
    °¡ÀåÃÖ±ÙÀÇ ÇÁ·Î¼¼½º°¡ ¼¼±×¸ÕÆ®¸¦ attachÇÑ ½Ã°£
  • shm_dtime
    °¡ÀåÃÖ±ÙÀÇ ÇÁ·Î¼¼½º°¡ ¼¼±×¸ÕÆ®¸¦ detachÇÑ ½Ã°£
  • shm_ctime
    ¸¶Áö¸·À¸·Î ÀÌ ±¸Á¶Ã¼°¡ º¯°æµÈ ½Ã°£
  • shm_cpid
    ÀÌ ±¸Á¶Ã¼¸¦ »ý¼ºÇÑ ÇÁ·Î¼¼½ºÀÇ pid
  • shm_lpid
    ¸¶Áö¸·À¸·Î ÀÛµ¿À» ¼öÇàÇÑ ÇÁ·Î¼¼½ºÀÇ pid
  • shm_nattch
    ÇöÀç Á¢±ÙÁßÀÎ ÇÁ·Î¼¼½ºÀÇ ¼ö
ÀÌ·¯ÇÑ °øÀ¯¸Þ¸ð¸®¿¡ Á¢±ÙÀ» Çϱâ À§Çؼ­´Â °íÀ¯ÀÇ °øÀ¯¸Þ¸ð¸® key ¸¦ ÅëÇØ¼­ Á¢±Ù°¡´ÉÇØÁö¸ç, ÀÌ key°ªÀ» ÅëÇØ¼­ ´Ù¸¥ ¿©·¯°³ÀÇ °øÀ¯¸Þ¸ð¸®µé°ú ±¸ºÐµÇ¾î Áú¼ö ÀÖ´Ù.


1.3 shmget

shmget Àº Ä¿³Î¿¡ °øÀ¯¸Þ¸ð¸® °ø°£À» ¿äûÇϱâ À§ÇØ È£ÃâÇÏ´Â ½Ã½ºÅÛ È£Ãâ ÇÔ¼öÀÌ´Ù. key ´Â ¹Ù·Î À§¿¡¼­ ¼³¸íÇßµíÀÌ °íÀ¯ÀÇ °øÀ¯¸Þ¸ð¸®ÀÓÀ» ¾Ë·ÁÁÖ±â À§Çؼ­ »ç¿ëµÈ´Ù. shmget À» ÀÌ¿ëÇØ¼­ »õ·Î¿î °øÀ¯¸Þ¸ð¸® ¿µ¿ªÀ» »ý¼ºÇϰųª ±âÁ¸¿¡ ¸¸µé¾îÁ®ÀÖ´ø °øÀ¯¸Þ¸ð¸® ¿µ¿ªÀ» ÂüÁ¶ÇÒ¼ö ÀÖ´Ù.

ù¹øÂ° ¾Æ±Ô¸ÕÆ®´Â ¿©·¯°³ÀÇ °øÀ¯¸Þ¸ð¸®Áß ¿øÇÏ´Â °øÀ¯¸Þ¸ð¸®¿¡ Á¢±ÙÇϱâ À§ÇÑ Key °ªÀÌ´Ù. ÀÌ Key °ªÀº Ä¿³Î¿¡ ÀÇÇØ¼­ °ü¸®µÇ¸ç, Key °ªÀ» ÅëÇØ¼­ ¼±ÅÃÀûÀÎ °øÀ¯¸Þ¸ð¸®¿¡ÀÇ Á¢±ÙÀÌ °¡´ÉÇÏ´Ù.
µÎ¹øÂ° ¾Æ±Ô¸ÕÆ®´Â °øÀ¯¸Þ¸ð¸® ÀÇ ÃÖ¼ÒÅ©±â ÀÌ´Ù. »õ·Î¿î °øÀ¯¸Þ¸ð¸®¸¦ »ý¼ºÇϰíÀÚ ÇÑ´Ù¸é Å©±â¸¦ ¸í½ÃÇØÁÖ¾î¾ß ÇÑ´Ù. Á¸ÀçÇÏ´Â ¸Þ¸ð¸®¸¦ ÂüÁ¶ÇÑ´Ù¸é Å©±â´Â 0À¸·Î ¸í½ÃÇÑ´Ù.
3¹øÂ° ¾Æ±Ô¸ÕÆ®´Â °øÀ¯¸Þ¸ð¸®ÀÇ Á¢±Ù±ÇÇѰú, »ý¼º¹æ½ÄÀ» ¸í½ÃÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ¾Æ±Ô¸ÕÆ®ÀÇ »ý¼º¹æ½ÄÀ» ÁöÁ¤Çϱâ À§Çؼ­ IPC_CREAT ¿Í IPC_EXCL À» »ç¿ëÇÒ¼ö ÀÖ´Ù. ¾Æ·¡ À̵鿡 ´ëÇØ¼­ ¼³¸íÀ» ÇØµÎ¾ú´Ù.

  • IPC_CREAT
    key ¸¦ ÀÌ¿ë »õ·Î¿î °øÀ¯¸Þ¸ð¸® °ø°£À» ¸¸µç´Ù.
  • IPC_EXCL
    IPC_CREAT¿Í °°ÀÌ »ç¿ëµÇ¸ç, °øÀ¯¸Þ¸ð¸® °ø°£ÀÌ ÀÌ¹Ì Á¸ÀçÇÒ°æ¿ì error ¸¦ µÇµ¹·ÁÁØ´Ù.

  • ¸¸¾à IPC_CREAT ¸¸ »ç¿ëµÈ´Ù¸é shmget()Àº »õ·Î »ý¼ºµÇ´Â °øÀ¯¸Þ¸ð¸®°ø°£À» Áö½ÃÇÏ´Â °øÀ¯¸Þ¸ð¸®°ø°£ "½Äº°ÀÚ" µÇµ¹·ÁÁØ´Ù. ¸¸¾à ÀÔ·ÂµÈ key °ªÀÌ Áö½ÃÇÏ´Â °øÀ¯¸Þ¸ð¸® °ø°£ÀÌ ÀÌ¹Ì Á¸ÀçÇϰí ÀÖ´Ù¸é Á¸ÀçÇÏ´Â °øÀ¯¸Þ¸ð¸® °ø°£ÀÇ "½Äº°ÀÚ"¸¦ µÇµ¹·ÁÁØ´Ù. IPC_EXCL °ú IPC_CREAT ¸¦ °°ÀÌ »ç¿ëÇÒ°æ¿ì, °øÀ¯¸Þ¸ð¸® °ø°£ÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é »õ·Î »ý¼º½ÃÄÑÁÖ¸ç, Á¸ÀçÇÒ°æ¿ì¿¡ error ¸¦ µÇµ¹·ÁÁØ´Ù.

    3¹øÂ° ¾Æ±Ô¸ÕÆ®´Â À̿ܿ¡µµ ±ÇÇÑÀ» ÁöÁ¤ÇØÁÙ¼öµµ ÀÖ´Ù. ±ÇÇÑÀº ÆÄÀϱÇÇѰú µ¿ÀÏÇϰÔ, À¯Àú, ±×·ì, Other ¿¡ ´ëÇÑ Àбâ/¾²±â ±ÇÇÑÀ» ÁöÁ¤ÇÒ¼ö ÀÖ´Ù. ´Ü ½ÇÇà±ÇÇÑÀº ÁÙ¼ö ¾øµµ·Ï µÇ¾î ÀÖ´Ù. ¾Æ·¡¿Í °°ÀÌ »ç¿ë°¡´ÉÇÏ´Ù.
    int shmid; 
    key_t keyval; 
     
    keyval = 1234; 
    shmid = shmget(keyval, 1024, IPC_CREAT | 0666));  
    if (shmid == -1) 
    { 
        return -1; 
    } 
     

    1.4 shmat

    ÀÏ´Ü °øÀ¯¸Þ¸ð¸® °ø°£À» »ý¼ºÇßÀ¸¸é, ¿ì¸®´Â °øÀ¯¸Þ¸ð¸®¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â int ÇüÀÇ "½Äº°ÀÚ" ¸¦ ¾ò°Ô µÈ´Ù. ¿ì¸®´Â ÀÌ ½Äº°ÀÚ¸¦ shmat ¸¦ ÀÌ¿ëÇØ¼­ Áö±ÝÀÇ ÇÁ·Î¼¼½º°¡ °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ë°¡´ÉÇϵµ·Ï "µ¡ºÙÀÓ" ÀÛ¾÷À» ÇØÁÖ¾î¾ß ÇÑ´Ù.

    ù¹øÂ° ¾Æ±Ô¸ÕÆ®´Â shmgetÀ» ÀÌ¿ëÇØ¼­ ¾ò¾î³½ ½Äº°ÀÚ ¹øÈ£À̸ç,
    µÎ¹øÂ° ¾Æ±Ô¸ÕÆ®´Â ¸Þ¸ð¸®°¡ ºÙÀ» ÁÖ¼Ò¸¦ ¸í½ÃÇϱâ À§ÇØ »ç¿ëÇϴµ¥, 0À» »ç¿ëÇÒ°æ¿ì Ä¿³ÎÀÌ ¸Þ¸ð¸®°¡ ºÙÀ» ÁÖ¼Ò¸¦ ¸í½ÃÇÏ°Ô µÈ´Ù. Ưº°ÇÑ »çÇ×ÀÌ ¾ø´Ù¸é 0À» »ç¿ëÇϵµ·Ï ÇÑ´Ù.
    ¼¼¹øÂ° ¾Æ±Ô¸ÕÆ®¸¦ ÀÌ¿ëÇØ¼­, ¿ì¸®´Â ÇØ´ç °øÀ¯¸Þ¸ð¸®¿¡ ´ëÇÑ "ÀбâÀü¿ë", "Àбâ/¾²±â°¡´É" ¸ðµå·Î ¿­¼ö Àִµ¥, SHM_RDONLY¸¦ ÁöÁ¤ÇÒ°æ¿ì Àбâ Àü¿ëÀ¸·Î, ¾Æ¹«°ªµµ ÁöÁ¤ÇÏÁö ¾ÊÀ»°æ¿ì "Àбâ/¾²±â °¡´É" ¸ðµå·Î ¿­¸®°Ô µÈ´Ù.

    1.5 shmdt

    ÇÁ·Î¼¼½º°¡ ´õÀÌ»ó °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÒÇʿ䰡 ¾øÀ»°æ¿ì ÇÁ·Î¼¼½º¿Í °øÀ¯¸Þ¸ð¸®¸¦ ºÐ¸® Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ °æ¿ì ´ÜÁö ÇöÀç ÇÁ·Î¼¼½º¿Í °øÀ¯¸Þ¸ð¸®¸¦ ºÐ¸®½Ãų»ÓÀÌÁö, °øÀ¯¸Þ¸ð¸® ³»¿ëÀ» »èÁ¦ÇÏÁö´Â ¾Ê´Â´Ù´Â Á¡À» ±â¾ïÇØ¾ß ÇÑ´Ù. °øÀ¯¸Þ¸ð¸®¸¦ Ä¿³Î»ó¿¡¼­ »èÁ¦ ½ÃŰ±æ ¿øÇÑ´Ù¸é shmctl °°Àº ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¾ß ÇÑ´Ù.

    shmdt °¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é Ä¿³ÎÀº shmid_ds ÀÇ ³»¿ëÀ» °»½ÅÇÑ´Ù. Áï shm_dtime, shm_lpid, shm_nattch µîÀÇ ³»¿ëÀ» °»½ÅÇϴµ¥, shm_dtime ´Â °¡Àå ÃÖ±Ù¿¡ dettach (Áï shmdt ¸¦ »ç¿ëÇÑ)µÈ ½Ã°£, shm_lpid ´Â È£ÃâÇÑ ÇÁ·Î¼¼¼¼ÀÇ PID, shm_nattch ´Â ÇöÀç °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â (shmat ¸¦ ÀÌ¿ëÇØ¼­ °øÀ¯¸Þ¸ð¸®¿¡ ºÙ¾îÀÖ´Â) ÇÁ·Î¼¼½ºÀÇ ¼ö¸¦ µ¹·ÁÁØ´Ù. shmdt ¸¦ »ç¿ëÇÏ°Ô µÇ¸é shm_nattch ´Â 1 °¨¼ÒÇÏ°Ô µÉ°ÍÀ̸ç, shm_nattch °¡ 0 Áï ´õÀÌ»ó ºÙ¾îÀÖ´Â ÇÁ·Î¼¼½º°¡ ¾ø´Ù¶ó´Â ¶æÀÌ µÉ°ÍÀÌ´Ù. shm_nattch °¡ 0ÀÌ µÇ¾îÀÖÀ»¶§ ¸¸¾à ÀÌ °øÀ¯¸Þ¸ð¸®°¡ shm_ctl µî¿¡ ÀÇÇØ »èÁ¦Ç¥½Ã °¡ µÇ¾î ÀÖ´Ù¸é, ÀÌ °øÀ¯¸Þ¸ð¸®´Â »èÁ¦µÇ°Ô µÈ´Ù.

    1.6 shmctl

    À̰ÍÀº °øÀ¯¸Þ¸ð¸®¸¦ Á¦¾îÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. Áï shmid_ds ¸¦ Á÷Á¢ Á¦¾îÇÔÀ¸·Î½á, ÇØ´ç °øÀ¯¸Þ¸ð¸®¿¡ ´ëÇÑ ¼ÒÀ¯ÀÚ, ±×·ì µîÀÇ Çã°¡±ÇÀ» º¯°æÇϰųª, °øÀ¯¸Þ¸ð¸®¸¦ »èÁ¦È¤Àº, °øÀ¯¸Þ¸ð¸®ÀÇ Àá±ÝÀ» ¼³Á¤Çϰųª ÇØÁ¦ÇÏ´Â µîÀÇ ÀÛ¾÷À» ÇÑ´Ù.

    2¹øÂ° ¾Æ±Ô¸ÕÆ®¸¦ ÀÌ¿ëÇØ¼­ shmid °¡ °¡¸£Å°´Â °øÀ¯¸Þ¸ð¸®¸¦ Á¦¾îÇϸç, cmd ¸¦ ÀÌ¿ëÇØ¼­ ¿øÇÏ´Â Á¦¾î¸¦ ÇÒ¼ö ÀÖ´Ù. cmd ¸¦ ÀÌ¿ëÇØ ³»¸±¼ö ÀÖ´Â ¸í·É¿¡´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖ´Ù.
    • IPC_STAT
      °øÀ¯¸Þ¸ð¸® °ø°£¿¡ °üÇÑ Á¤º¸¸¦ °¡Á®¿À±â À§Çؼ­ »ç¿ëµÈ´Ù. Á¤º¸´Â buf ¿¡ ÀúÀåµÈ´Ù.
    • IPC_SET
      °øÀ¯¸Þ¸ð¸® °ø°£¿¡ ´ëÇÑ »ç¿ëÀÚ±ÇÇÑ º¯°æÀ» À§Çؼ­ »ç¿ëµÈ´Ù. »ç¿ëÀÚ ±ÇÇÑ º¯°æÀ» À§Çؼ­´Â ½´ÆÛÀ¯Àú ȤÀº »ç¿ëÀÚ±ÇÇÑÀ» °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù.
    • IPC_RMID
      °øÀ¯¸Þ¸ð¸® °ø°£À» »èÁ¦Çϱâ À§Çؼ­ »ç¿ëµÈ´Ù. ÀÌ ¸í·ÉÀ» »ç¿ëÇÑ´Ù°í ÇØ¼­ °ð¹Ù·Î »ç¿ëµÇ´Â°Ç ¾Æ´Ï¸ç, ´õÀÌ»ó °øÀ¯¸Þ¸ð¸® °ø°£À» »ç¿ëÇÏ´Â ÇÁ·Î¼¼½º°¡ ¾øÀ»¶§, Áï shm_nattch °¡ 0À϶§ ±îÁö ±â´Ù·È´Ù°¡ »èÁ¦µÈ´Ù. Áï ÇØ´ç °øÀ¯¸Þ¸ð¸® °ø°£¿¡ ´ëÇØ¼­ »èÁ¦Ç¥½Ã¸¦ Çϴ°Ŷó°í »ý°¢ÇÏ¸é µÈ´Ù.

    ´ÙÀ½Àº ½ÇÁ¦·Î °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ °¡Àå°£´ÜÇÑ ¿¹Á¦ÀÌ´Ù. Àڽİú ºÎ¸ðÇÁ·Î¼¼½º°£¿¡ ¾î¶»°Ô ¸Þ¸ð¸®°¡ °øÀ¯µÇ´ÂÁö º¸¿©ÁØ´Ù.

    ¿¹Á¦ : shm.c
    #include <sys/ipc.h>  
    #include <sys/shm.h>  
    #include <string.h>  
    #include <unistd.h>  
     
     
    int main() 
    { 
        int shmid; 
        int pid; 
     
        int *cal_num; 
        void *shared_memory = (void *)0; 
     
     
        // °øÀ¯¸Þ¸ð¸® °ø°£À» ¸¸µç´Ù. 
        shmid = shmget((key_t)1234, sizeof(int), 0666|IPC_CREAT); 
     
        if (shmid == -1) 
        { 
            perror("shmget failed : "); 
            exit(0); 
        } 
     
        // °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇϱâ À§ÇØ ÇÁ·Î¼¼½º¸Þ¸ð¸®¿¡ ºÙÀδÙ.  
        shared_memory = shmat(shmid, (void *)0, 0); 
        if (shared_memory == (void *)-1) 
        { 
            perror("shmat failed : "); 
            exit(0); 
        } 
     
        cal_num = (int *)shared_memory; 
        pid = fork(); 
        if (pid == 0) 
        { 
            shmid = shmget((key_t)1234, sizeof(int), 0); 
            if (shmid == -1) 
            { 
                perror("shmget failed : "); 
                exit(0); 
            } 
            shared_memory = shmat(shmid, (void *)0, 0666|IPC_CREAT); 
            if (shared_memory == (void *)-1) 
            { 
                perror("shmat failed : "); 
                exit(0); 
            } 
            cal_num = (int *)shared_memory; 
            *cal_num = 1; 
     
            while(1) 
            { 
                *cal_num = *cal_num + 1; 
                printf("child %d\n", *cal_num);  
                sleep(1); 
            } 
        } 
     
        // ºÎ¸ð ÇÁ·Î¼¼½º·Î °øÀ¯¸Þ¸ð¸®ÀÇ ³»¿ëÀ» º¸¿©ÁØ´Ù.  
        else if(pid > 0) 
        { 
            while(1) 
            { 
                sleep(1); 
                printf("%d\n", *cal_num); 
            } 
        } 
    } 
     
    ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ ÇÏ´Â ÀÏÀº °£´ÜÇÏ´Ù. int ÇüÀÇ °øÀ¯¸Þ¸ð¸® °ø°£À» ÇÒ´çÇÑ´ÙÀ½. ÀÚ½ÄÇÁ·Î¼¼½º¿¡¼­ ¿©±â¿¡ 1¾¿À» ´õÇÏ°í ºÎ¸ðÇÁ·Î¼¼½º¿¡¼­´Â °øÀ¯¸Þ¸ð¸® ³»¿ëÀ» Ãâ·ÂÇÏ´Â ÀÏÀ»ÇÑ´Ù.

    2 °øÀ¯¸Þ¸ð¸® Á¦¾îÇϱâ

    ½©¿¡¼­ °øÀ¯¸Þ¸ð¸®ÀÇ »óȲÀ» º¸¿©ÁÖ±â À§Çؼ­ ipcs(1)¶õ µµ±¸¸¦ Á¦°øÇÑ´Ù. ipcs ¸¦ »ç¿ëÇÏ¸é °øÀ¯¸Þ¸ð¸® »Ó¸¸ ¾Æ´Ñ, Semaphore, Message Queue µî ¼ÒÀ§ sytem V IPC ¼³ºñ¿¡ ´ëÇÑ ³»¿ëÀ» º¸¿©ÁØ´Ù. ±×¸®°í ipcrm µµ±¸¸¦ ÀÌ¿ëÇØ¼­ ÇÊ¿ä¾ø´Â °øÀ¯¸Þ¸ð¸®, Message Queue, Semaphore µîÀ» Áö¿öÁÙ¼ö ÀÖ´Ù.

    À§ÀÇ ¿¹Á¦Äڵ带 ÄÄÆÄÀÏ ½ÃÄѼ­ ½ÇÇà½ÃŲ´ÙÀ½ ipcs ¸¦ ÀÌ¿ëÇØ¼­ È®ÀÎÀ» ÇØº¸¸é °øÀ¯¸Þ¸ð¸® ÀÚ¿øÀÌ ¾î¶²½ÄÀ¸·Î °ü¸®µÇ´ÂÁö Á»´õ ÀÌÇØ¸¦ ½±°Ô ÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.

    2.1 °øÀ¯ ¸Þ¸ð¸® Á¤º¸ È®ÀÎ

    -l ¿É¼Ç°ú ÇÔ²² ipcs¸¦ ½ÇÇàÇϸé ipcÀÚ¿ø Á¦ÇÑ Á¤º¸¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
    $ ipcs -l 
    ------ Shared Memory Limits -------- 
    max number of segments = 4096 
    max seg size (kbytes) = 32768 
    max total shared memory (kbytes) = 8388608 
    min seg size (bytes) = 1 
     
    ------ Semaphore Limits -------- 
    max number of arrays = 128 
    max semaphores per array = 250 
    max semaphores system wide = 32000 
    max ops per semop call = 32 
    semaphore max value = 32767 
     
    ------ Messages: Limits -------- 
    max queues system wide = 1706 
    max size of message (bytes) = 8192 
    default max size of queue (bytes) = 16384 
     
    -m ¿É¼ÇÀ¸·Î ½ÇÇàÇϸé ÇöÀç »ç¿ëÁßÀÎ ipc ÀÚ¿ø Á¤º¸¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
    $ ipcs -m 
     
    ------ Shared Memory Segments -------- 
    key        shmid      owner      perms      bytes      nattch     status       
    0x00000000 0          root       777        135168     2                        
    0x00000000 819201     yundream   600        393216     2          dest          
    0x00000000 950274     yundream   600        393216     2          dest          
    0x00000000 983043     yundream   600        393216     2          dest          
    0x00000000 917508     yundream   600        393216     2          dest          
    0x00000000 1015813    yundream   600        393216     2          dest          
    0x00000000 1048582    yundream   600        393216     2          dest          
    0x00000000 27590663   yundream   600        393216     2          dest          
    0x00000000 35684360   yundream   666        4343780    2          dest          
    0x00000000 35717129   yundream   666        282808     2          dest   
     

    2.2 /proc ÆÄÀÏ ½Ã½ºÅÛÀ¸·Î Á¦¾îÇϱâ

    ¸®´ª½º ¿î¿µÃ¼Á¦´Â /proc ÆÄÀÏ ½Ã½ºÅÛÀ¸·Î °øÀ¯ ¸Þ¸ð¸® ÀÚ¿ø °ªÀ» º¯°æÇÒ ¼ö ÀÖ´Ù.
    • /proc/sys/kernel/shmmax : ÇÁ·Î¼¼½º°¡ »ý¼ºÇÒ ¼ö ÀÖ´Â °øÀ¯ ¸Þ¸ð¸®ÀÇ ÃÖ´ë Å©±â
    • /proc/sys/kernel/shmall : ÇöÀç »ç¿ëÁßÀÎ °øÀ¯ ¸Þ¸ð¸® Å©±â
    ÇÁ·Î¼¼½º°¡ »ý¼ºÇÒ ¼ö ÀÖ´Â °øÀ¯ ¸Þ¸ð¸® Å©±â´Â ´ÙÀ½°ú °°ÀÌ º¯°æÇÏ¸é µÈ´Ù.
    // 500M·Î 
    # echo 536870912 > /proc/sys/kernel/shmmax