¿ù°£ Àα⠰Խù°

°Ô½Ã¹° 9°Ç
   
¼¼¸¶Æ÷¾îÀÇ »ç¿ë
±Û¾´ÀÌ : ÃÖ°í°ü¸®ÀÚ ³¯Â¥ : 2009-12-01 (È­) 10:41 Á¶È¸ : 240744
±ÛÁÖ¼Ò :
                          

 
 
¼¼¸¶Æ÷¾î´Â System V IPC ÀÇ ¼³ºñÁß Çϳª·Î, ÇϳªÀÇ ÀÚ¿ø¿¡ ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ Á¢±ÙÇÏ·Á°í ÇÒ¶§, ÇØ´çÀÚ¿ø¿¡ ´ëÇÑ Á¢±ÙÁ¦¾î¸¦ Çϱâ À§ÇØ ÇÊ¿äÇÑ ¼³ºñÀÌ´Ù.
À̹ø °­Á¸¦ ÅëÇؼ­ ¼¼¸¶Æ÷¾îÀÇ »ç¿ë¹æ¹ý¿¡ ´ëÇؼ­ ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú´Ù.


¼¼¸¶Æ÷¾î¶õ ¹«¾ùÀΰ¡
¼¼¸¶Æ÷¾î(Semaphores)¸¦ ºñ·Ï IPC¼³ºñÁßÀÇ Çϳª·Î ºÐ·ùÇϱä ÇßÁö¸¸, ´Ù¸¥ ÆÄÀÌÇÁ, ¸Þ½ÃÁöÅ¥, FIFO µî°ú´Â Á»´Ù¸£´Ù. ´Ù¸¥ IPC ¼³ºñµéÀÌ ´ëºÎºÐ ÇÁ·Î¼¼½º°£ ¸Þ½ÃÁö Àü¼ÛÀ» ±× ¸ñÀûÀ¸·Î Çϴµ¥ ¹ÝÇؼ­ ¼¼¸¶Æ÷¾î´Â ÇÁ·Î¼¼½º°£ µ¥ÀÌŸ¸¦ µ¿±âÈ­ ÇÏ°í º¸È£Çϴµ¥ ±×¸ñÀûÀÌ ÀÖ´Ù.

ÇÁ·Î¼¼½º°£ ¸Þ½ÃÁö Àü¼ÛÀ» Çϰųª, ȤÀº °øÀ¯¸Þ¸ð¸®¸¦ ÅëÇؼ­ ƯÁ¤ µ¥ÀÌŸ¸¦ °øÀ¯ÇÏ°Ô µÉ°æ¿ì ¹ß»ýÇÏ´Â ¹®Á¦°¡, °øÀ¯µÈ ÀÚ¿ø¿¡ ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ µ¿½Ã¿¡ Á¢±ÙÀ» Çϸé¾ÈµÇ¸ç, ´ÜÁö Çѹø¿¡ ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸ Á¢±Ù °¡´ÉÇϵµ·Ï ¸¸µé¾îÁà¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ°ÍÀº ¾²·¹µå¿¡¼­ ¸Þ½ÃÁö°£ µ¿±âÈ­¸¦ À§Çؼ­ mutex ¸¦ »ç¿ëÇϴ°Ͱú °°Àº ÀÌÀ¯ÀÌ´Ù.

ÇϳªÀÇ µ¥ÀÌŸ¿¡ ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ °ü¿©ÇÒ¶§ ¾î¶² ¹®Á¦Á¡ÀÌ ¹ß»ýÇÒ¼ö ÀÖ´ÂÁö °£´ÜÇÑ ¿¹¸¦ µé¾îº¸µµ·Ï ÇÏ°Ú´Ù. int count=100;
A ÇÁ·Î¼¼½º°¡ count ¸¦ ÀоîµéÀδÙ.     100
B ÇÁ·Î¼¼½º°¡ count ¸¦ ÀоîµéÀδÙ.     100
B ÇÁ·Î¼¼½º°¡ count ¸¦ 1 Áõ°¡ ½ÃŲ´Ù.  101
A ÇÁ·Î¼¼½º°¡ count ¸¦ 1 Áõ°¡ ½ÃŲ´Ù.  101


count ´Â °øÀ¯ÀÚ¿ø(°øÀ¯¸Þ¸ð¸® °°Àº)À̸ç A¿Í B ÇÁ·Î±×·¥ÀÌ ¿©±â¿¡ ´ëÇÑ ÀÛ¾÷À» ÇÑ´Ù. A°¡ 1À» Áõ°¡ ½ÃÅ°°í B°¡ 1À» Áõ°¡½ÃÅ°¹Ç·Î ÃÖÁ¾ count °ªÀº 102 °¡ µÇ¾î¾ß ÇÒ°ÍÀÌ´Ù. ±×·¯³ª A °¡ ÀÛ¾÷À» ¸¶Ä¡±â Àü¿¡ B°¡ ÀÛ¾÷À» ÇÏ°Ô µÊÀ¸·Î ¾û¶×ÇÑ °á°ú¸¦ º¸¿©ÁÖ°Ô µÇ¾ú´Ù. À§ÀÇ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­´Â count ¿¡ A°¡ Á¢±ÙÇÒ¶§ BÇÁ·Î¼¼½º°¡ Á¢±ÙÇÏÁö¸øÇϵµ·Ï block ½ÃÅ°°í, A°¡ ¸ðµç ÀÛ¾÷À» ¸¶ÃÆÀ»¶§ BÇÁ·Î¼¼½º°¡ ÀÛ¾÷À» ÇÒ¼ö ÀÖµµ·Ï block ¸¦ ÇØÁ¦ ½ÃÅ°¸é µÉ°ÍÀÌ´Ù.
¿ì¸®´Â ¼¼¸¶Æ÷¾î¸¦ ÀÌ¿ëÇؼ­ ÀÌ·¯ÇÑ ÀÛ¾÷À» ÇÒ¼ö ÀÖ´Ù. ÇѸ¶µð·Î ÁÙ¿©¼­ ¼¼¸¶Æ÷¾î´Â "¿©·¯°³ÀÇ ÇÁ·Î¼¼½º¿¡ ÀÇÇؼ­ °øÀ¯µÈ´Â ÀÚ¿øÀÇ Á¢±ÙÁ¦¾î¸¦ À§ÇÑ µµ±¸" ÀÌ´Ù.
¼¼¸¶Æ÷¾îÀÇ ÀÛµ¿¿ø¸®
ÀÛµ¿¿ø¸®´Â ¸Å¿ì °£´ÜÇÏ´Ù. Â÷´ÜÀ» ¿øÇÏ´Â ÀÚ¿ø¿¡´ëÇؼ­ ¼¼¸¶Æ÷¾î¸¦ »ý¼ºÇϸé ÇØ´çÀÚ¿øÀ» °¡¸®Å°´Â ¼¼¸¶Æ÷¾î °ªÀÌ ÇÒ´çµÈ´Ù. ÀÌ ¼¼¸¶Æ÷¾î °ª¿¡´Â ÇöÀç ¼¼¸¶Æ÷¾î¸¦ Àû¿ëÇÏ°í ÀÖ´Â ÀÚ¿ø¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ ¼ýÀÚ¸¦ ³ªÅ¸³½´Ù. ÀÌ °ªÀÌ 0À̸é ÀÌ ÀÚ¿ø¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ ¼ýÀÚ°¡ 0À̶ó´Â ¶æÀ̸ç, ÀÚ¿ø), 0º¸´Ù Å« Á¤¼ö¸é ÇØ´ç Á¤¼öÀÇ Å©±â¸¸Å­ÀÇ ÇÁ·Î¼¼½º°¡ ÀÚ¿ø¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Ù¶ó´Â ¶æÀÌ µÈ´Ù. ±×·¯¹Ç·Î ¿ì¸®´Â Á¢±ÙÁ¦¾î¸¦ ÇؾßÇÏ´Â ÀÚ¿ø¿¡ Á¢±ÙÇϱâ Àü¿¡ ¼¼¸¶Æ÷¾î °ªÀ» °Ë»çÇؼ­ °ªÀÌ 0À̸é ÀÚ¿øÀ» »ç¿ëÇÒ¼ö ÀÖÀ»¶§±îÁö ±â´Ù¸®°í, 0º¸´Ù ´õÅ©¸é(1À̶ó°í °¡Á¤ÇÏÀÚ) ÀÚ¿ø¿¡ Á¢±ÙÇؼ­ ¼¼¸¶Æ÷¾î °ªÀ» 1 °¨¼Ò ½ÃÄѼ­, ¼¼¸¶Æ÷¾î °ªÀ» 0À¸·Î ¸¸µé¾î¼­, ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ÀÚ¿ø¿¡ Á¢±ÙÇÒ¼ö ¾øµµ·Ï ÇÏ°í, ÀÚ¿øÀÇ »ç¿ëÀÌ ³¡³ª¸é ¼¼¸¶Æ÷¾î °ªÀ» ´Ù½Ã 1Áõ°¡½ÃÄѼ­ ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ÀÚ¿øÀ» »ç¿ëÇÒ¼ö ÀÖµµ·Ï ¸¸µé¾îÁÖ¸é µÈ´Ù.

¸¸¾à ¼¼¸¶Æ÷¾î °ªÀ» °Ë»çÇߴµ¥ ¼¼¸¶Æ÷¾î °ªÀÌ 0À̶ó¸é »ç¿ëÇÒ¼ö ÀÖ°Ô µÉ¶§±îÁö (1ÀÌ µÉ¶§±îÁö) ±â´Ù¸®¸é (block) µÉ°ÍÀÌ´Ù.
¼¼¸¶Æ÷¾îÀÇ »ç¿ë
¼¼¸¶Æ÷¾îÀÇ »ç¿ëÀº À§ÀÇ ÀÛµ¿¿ø¸®¸¦ ±×´ë·Î Àû¿ëÇÑ´Ù. Áï 1. ¼¼¸¶Æ÷¾î·Î Á¦¾îÇÒ ÀÚ¿øÀ» ¼³Á¤ÇÑ´Ù.
2. ÇØ´ç ÀÚ¿øÀ» »ç¿ëÇϱâÀü¿¡ ¼¼¸¶Æ÷¾î °ªÀ» È®ÀÎÇÑ´Ù.
3. ¼¼¸¶Æ÷¾î °ªÀÌ 0º¸´Ù Å©¸é ÀÚ¿øÀ» »ç¿ëÇÏ°í, ¼¼¸¶Æ÷¾î °ªÀ» 1 °¨¼Ò ½ÃŲ´Ù.
4. ¼¼¸¶Æ÷¾î °ªÀÌ 0ÀÌ¸é °ªÀÌ 0º¸´Ù Ä¿Áú¶§±îÁö block µÇ¸ç, 0º¸´Ù Ä¿Áö°Ô µÇ¸é 2¹ø ºÎÅÍ ½ÃÀÛÇÏ°Ô µÈ´Ù.

À§ÀÇ ÀÛ¾÷À» À§Çؼ­ Unix ´Â ´ÙÀ½°ú °°Àº °ü·ÃÇÔ¼öµéÀ» Á¦°øÇÑ´Ù.
  1. #include <sys/types.h>    
  2. #include <sys/ipc.h>    
  3. #include <sys/sem.h>    
  4.   
  5. int semget(key_t key, int nsems, int semflg);    
  6. int semop (int semid, struct sembuf *sops, unsigned nsops);    
  7. int semctl(int semid, int semnum, int cmd, union semun arg);    



¼¼¸¶Æ÷¾îÀÇ °ü¸®
¼¼¸¶Æ÷¾î´Â ±× Ư¼º»ó ¿øÀÚÈ­µÈ ¿¬»êÀ» ÇÊ¿ä·Î ÇÑ´Ù. ÀÌ·¯ÇÑ ¿øÀÚÈ­µÈ ¿¬»êÀº À¯Àú·¹º§ÀÇ ÇÔ¼ö¿¡¼­´Â Á¦°øÇϱⰡ Èûµé¹Ç·Î, ¼¼¸¶Æ÷¾î Á¤º¸´Â Ä¿³Î¿¡¼­ Àü¿ë ±¸Á¶Ã¼¸¦ ÀÌ¿ëÇؼ­ °ü¸®ÇÏ°Ô µÈ´Ù. ´ÙÀ½Àº Ä¿³Î¿¡¼­ ¼¼¸ðÆ÷¾î Á¤º¸¸¦ À¯ÁöÇϱâ À§Çؼ­ °ü¸®ÇÏ´Â ±¸Á¶Ã¼ÀÎ semid_ds ±¸Á¶Ã¼ÀÇ ¸ð½ÀÀÌ´Ù. semid_ds ´Â /usr/include/bits/sem.h ¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù. (ÀÌ°ÍÀº ¸®´ª½º¿¡¼­ÀÇ °æ¿ì·Î Unix ¹öÁ¯¿¡ µû¶ó¼­ À§Ä¡¿Í ¸â¹öº¯¼ö¿¡ ¾à°£¾¿ Â÷ÀÌ°¡ ÀÖÀ»¼ö ÀÖ´Ù)
  1. struct semid_ds    
  2. {    
  3.     struct ipc_perm sem_perm;        
  4.     __time_t sem_otime;              
  5.     unsigned long int __unused1;    
  6.     __time_t sem_ctime;              
  7.     unsigned long int __unused2;    
  8.     unsigned long int sem_nsems;      
  9.     unsigned long int __unused3;    
  10.     unsigned long int __unused4;    
  11. };   



sem_perm Àº ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ Æ۹̼ÇÀ¸·Î ÀÏ¹Ý ÆÄÀÏÆ۹̼ǰú ¸¶Âù°¡ÁöÀÇ ±â´ÉÀ» Á¦°øÇÑ´Ù. Áï ÇöÀç ¼¼¸¶Æ÷¾î ±¸Á¶Ã¼¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â »ç¿ëÀÚ±ÇÇÑÀ» ¼³Á¤ÇÑ´Ù. sem_nsems ´Â »ý¼ºÇÒ¼ö ÀÖ´Â ¼¼¸¶Æ÷¾îÀÇ Å©±âÀÌ´Ù. sem_otime Àº ¸¶Áö¸·À¸·Î ¼¼¸¶Æ÷¾î°ü·Ã ÀÛ¾÷À» ÇÑ ½Ã°£(semop ÇÔ¼ö¸¦ ÀÌ¿ë)À̸ç, sem_ctim Àº ¸¶Áö¸·À¸·Î ±¸Á¶Ã¼ Á¤º¸°¡ ¹Ù²ï ½Ã°£ÀÌ´Ù.
semget À» ÀÌ¿ëÇؼ­ ¼¼¸¶Æ÷¾î¸¦ ¸¸µéÀÚ.
¼¼¸¶Æ÷¾îÀÇ »ý¼ºÈ¤Àº ±âÁ¸¿¡ ¸¸µé¾îÁ® ÀÖ´Â ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇϱâ À§Çؼ­ À¯´Ð½º¿¡¼­ ´Â semget(2)¸¦ Á¦°øÇÑ´Ù. ù¹ø° ¾Æ±Ô¸ÕÆ®´Â ¼¼¸¶Æ÷¾îÀÇ À¯ÀÏÇÑ Å°°ªÀ» À§Çؼ­ »ç¿ëÇÏ´Â int ÇüÀÇ Å°°ªÀÌ´Ù. ¿ì¸®´Â ÀÌ key °ªÀ» ÀÌ¿ëÇؼ­ À¯ÀÏÇÑ ¼¼¸¶Æ÷¾î¸¦ »ý¼ºÇϰųª Á¢±ÙÇÒ¼ö ÀÖ°Ô µÈ´Ù. »õ·Î »ý¼ºµÇ°Å³ª ±âÁ¸ÀÇ ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇϰųª Çϴ°ÍÀº semflg ¸¦ ÅëÇؼ­ Á¦¾îÇÒ¼ö ÀÖ´Ù. ´ÙÀ½Àº semflg ÀÇ ¾Æ±Ô¸ÕÆ®ÀÌ´Ù.


IPC_CREAT
¸¸¾à Ä¿³Î¿¡ ÇØ´ç key °ªÀ¸·Î Á¸ÀçÇÏ´Â ¼¼¸¶Æ÷¾î°¡ ¾ø´Ù¸é, »õ·Î »ý¼º ÇÑ´Ù.
IPC_EXCL
IPC_CREAT¿Í ÇÔ²² »ç¿ëÇϸç, ÇØ´ç key °ªÀ¸·Î ¼¼¸¶Æ÷¾î°¡ ÀÌ¹Ì Á¸ÀçÇÑ´Ù¸é ½ÇÆаªÀ» ¸®ÅÏÇÑ´Ù.
semflg ¸¦ ÅëÇؼ­ ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ Æ۹̼ÇÀ» ÁöÁ¤ÇÒ¼öµµ ÀÖ´Ù. ÆÛ¹Ì¼Ç ÁöÁ¤Àº º¸ÅëÀÇ ÆÄÀÏ¿¡ ´ëÇؼ­ À¯Àú/±×·ì/other ¿¡ ´ëÇؼ­ ÁöÁ¤Çϴ°Ͱú °°´Ù.

¸¸¾à IPC_CREAT ¸¸ »ç¿ëÇÒ°æ¿ì ÇØ´ç key °ªÀ¸·Î Á¸ÀçÇÏ´Â ¼¼¸¶Æ÷¾î°¡ ¾ø´Ù¸é, »õ·Î »ý¼ºÇÏ°í, ÀÌ¹Ì Á¸ÀçÇÑ´Ù¸é Á¸ÀçÇÏ´Â ¼¼¸¶Æ÷¾îÀÇ id ¸¦ ³Ñ°ÜÁØ´Ù. IPC_EXCLÀ» »ç¿ëÇϸé key °ªÀ¸·Î Á¸ÀçÇÏ´Â ¼¼¸¶Æ÷¾î°¡ ¾øÀ»°æ¿ì »õ·Î »ý¼ºµÇ°í, ÀÌ¹Ì Á¸ÀçÇÑ´Ù¸é Á¸ÀçÇÏ´Â id °ªÀ» µ¹·ÁÁÖÁö ¾Ê°í ½ÇÆаª(-1)À» µÇµ¹·ÁÁÖ°í, errno ¸¦ ¼³Á¤ÇÑ´Ù.

nsems Àº ¼¼¸¶Æ÷¾î°¡ ¸¸µé¾îÁú¼ö ÀÖ´Â Å©±âÀÌ´Ù. ÀÌ°ªÀº ÃÖÃÊ ¼¼¸¶Æ÷¾î¸¦ »ý¼ºÇÏ´Â »ý¼ºÀÚÀÇ °æ¿ì¿¡ Å©±â°¡ ÇÊ¿äÇÏ´Ù(º¸Åë 1). ±×¿Ü¿¡ ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇؼ­ »ç¿ëÇÏ´Â ¼ÒºñÀÚÀÇ °æ¿ì¿¡´Â ¼¼¸¶Æ÷¾î¸¦ ¸¸µéÁö ¾Ê°í ´ÜÁö Á¢±Ù¸¸ ÇÒ»ÓÀÓÀ¸·Î Å©±â´Â 0ÀÌ µÈ´Ù.

ÀÌ»óÀÇ ³»¿ëÀ» Á¤¸®Çϸé semget Àº ¾Æ·¡¿Í °°ÀÌ »ç¿ëÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù. ¸¸¾à ÃÖÃÊ »ý¼ºÀ̶ó¸é
   sem_num = 1;
±×·¸Áö ¾Ê°í ¸¸µé¾îÁø ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇÏ´Â °ÍÀ̶ó¸é
   sem_num = 0;
sem_id = semget(12345, sem_num, IPC_CREAT|0660)) == -1)
{
   perror("semget error : ");
   return -1;
}


semget Àº ¼º°øÇÒ°æ¿ì int ÇüÀÇ ¼¼¸¶Æ÷¾î Áö»çÀÚ¸¦ µÇµ¹·ÁÁÖ¸ç, ¸ðµç ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ Á¢±ÙÀº ÀÌ ¼¼¸¶Æ÷¾î Áö½ÃÀÚ¸¦ »ç¿ëÇÏ°Ô µÈ´Ù.

À§ÀÇ ÄÚµå´Â key 12345 ¸¦ ÀÌ¿ëÇؼ­ ¼¼¸¶Æ÷¾î¸¦ »ý¼ºÇϸç Æ۹̼ÇÀº 0660À¸·Î ¼³Á¤µÈ´Ù. ¼¼¸¶Æ÷¾îÀÇ Å©±â´Â 1·Î ÀâÇô ÀÖ´Ù(´ëºÎºÐÀÇ °æ¿ì 1). ¸¸¾à ±âÁ¸¿¡ key 12345 ·Î ÀÌ¹Ì ¸¸µé¾îÁø ¼¼¸¶Æ÷¾î°¡ ÀÖ´Ù¸é »õ·Î »ý¼ºÇÏÁö ¾Ê°í ±âÁ¸ÀÇ ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â ¼¼¸¶Æ÷¾î Áö½ÃÀÚ¸¦ µÇµ¹·ÁÁÖ°Ô µÇ°í, Ä¿³ÎÀº semget ¸¦ ÅëÇØ ³Ñ¾î¿Â Á¤º¸¸¦ ÀÌ¿ëÇؼ­ semid_ds ±¸Á¶Ã¼¸¦ ¼¼ÆÃÇÑ´Ù.


¿¹Á¦: semget.c
  1. #include <sys/types.h>    
  2. #include <sys/ipc.h>    
  3. #include <sys/sem.h>    
  4.   
  5. int main()    
  6. {    
  7.     int semid;    
  8.     semid = semget((key_t)12345, 1, 0666 | IPC_CREAT);    
  9. }   



ÀÌÁ¦ À§ÀÇ Äڵ带 ÄÄÆÄÀÏÇؼ­ ½ÇÇà½ÃÅ°°í ³ª¼­ ½ÇÁ¦·Î ¼¼¸¶Æ÷¾î Á¤º¸°¡ ¾î¶»°Ô ¹Ù²î¿´´ÂÁö È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ.

Ä¿³Î¿¡¼­ °ü¸®µÇ´Â ipc Á¤º¸¸¦ ¾Ë¾Æº¸±â À§Çؼ­´Â ipcs(8)¶ó´Â µµ±¸¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù.
[root@localhost test]# ipcs -s    
------ Semaphore Arrays --------
key        semid      owner      perms      nsems      status      
0x00003039 0          root      666        1        


0x00003039 Àº key 12345 ÀÇ 16Áø¼ö Ç¥ÇöÀÌ´Ù. Æ۹̼ÇÀº 666À¸·Î µÇ¾î ÀÖ°í semget ¸¦ ÅëÇؼ­ Á¦´ë·Î ¼³Á¤µÇ¾î ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.
¼¼¸¶Æ÷¾î¸¦ ÀÌ¿ëÇؼ­ Á¢±ÙÁ¦¾î Çϱâ
ÀÌÁ¦ semget À» ÅëÇؼ­ ¼¼¸¶Æ÷¾î¸¦ ¸¸µé°Å³ª Á¢±ÙÇßÀ¸´Ï, ÀÌÁ¦ ½ÇÁ¦·Î ¼¼¸¶Æ÷¾î»óŸ¦ °Ë»çÇؼ­ Á¢±ÙÁ¦¾î¸¦ Çغ¸µµ·ÏÇÏÀÚ.

ÀÌ°ÍÀº semop¸¦ ÅëÇؼ­ ÀÌ·ç¾îÁø´Ù.

semop ÀÇ Ã¹¹ø° semid ´Â semget À» ÅëÇؼ­ ¾òÀº ¼¼¸¶Æ÷¾î Áö½ÃÀÚÀÌ´Ù. 2¹ø° ¾Æ±Ô¸ÕÆ®´Â struct sembuf ·Î½á, ¾î¶² ¿¬»êÀ» ÀÌ·ç¾îÁö°Ô ÇÒ·±Áö °áÁ¤Çϱâ À§Çؼ­ »ç¿ëµÈ´Ù. ±¸Á¶Ã¼ÀÇ ³»Àº ´ÙÀ½°ú °°À¸¸ç, sys/sem.h ¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
  1. struct sembuf    
  2. {    
  3.     short sem_num;    // ¼¼¸¶Æ÷¾îÀǼö    
  4.     short sem_op;     // ¼¼¸¶Æ÷¾î ¿¬»êÁöÁ¤    
  5.     short sem_flg;    // ¿¬»ê¿É¼Ç(flag)    
  6. }   



sem_num ¸â¹ö´Â ¼¼¸¶Æ÷¾îÀÇ ¼ö·Î ¿©·¯°³ÀÇ ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é(Áï ¹è¿­ÀÌ ¾Æ´Ò°æ¿ì) 0À» »ç¿ëÇÑ´Ù. ¹è¿­ÀÇ À妽º »çÀÌÁî¶ó°í »ý°¢ÇÏ¸é µÉ°ÍÀÌ´Ù. º¸ÅëÀÇ °æ¿ì ÇϳªÀÇ ¼¼¸¶Æ÷¾î¸¦ ÁöÁ¤Çؼ­ »ç¿ëÇϹǷΠ0 ÀÌ µÉ°ÍÀÌ´Ù.
sem_op ¸¦ ÀÌ¿ëÇؼ­ ½ÇÁúÀûÀ¸·Î ¼¼¸¶Æ÷¾î ¿¬»êÀ» ÇÏ°Ô µÇ¸ç, ÀÌ°ÍÀ» ÀÌ¿ëÇؼ­ ¼¼¸¶Æ÷¾î °ªÀ» Áõ°¡½ÃÅ°°Å³ª °¨¼Ò ½Ãų¼ö ÀÕ´Ù. sem_op °ªÀÌ ¾ç¼öÀÏ °æ¿ì´Â ÀÚ¿øÀ» ´Ù ½èÀ¸´Ï, ¼¼¸¶Æ÷¾î °ªÀ» Áõ°¡½ÃÅ°°Ú´Ù´Â ¶æÀ̸ç, À½¼öÀÏ °æ¿ì¿¡´Â ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÒ°ÍÀ» ¿äûÇÑ´Ù¶ó´Â ¶æÀÌ´Ù. À½¼öÀÏ °æ¿ì ¼¼¸¶Æ÷¾î°ªÀÌ ÃæºÐÇÏ´Ù¸é ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÒ¼ö ÀÖÀ¸¸ç, Ä¿³ÎÀº ¼¼¸¶Æ÷¾îÀÇ °ªÀ» À½¼öÀÇ Å©±âÀÇ Àý´ë°ª¸¸Å­À» ¼¼¸¶Æ÷¾î¿¡¼­ »©ÁØ´Ù. ¸¸¾à ¼¼¸¶Æ÷¾îÀÇ °ªÀÌ ÃæºÐÇÏÁö ¾Ê´Ù¸é ¼¼¹ø° ¾Æ±Ô¸ÕÆ®ÀÎ sem_flg ¿¡ µû¶ó¼­ ÇൿÀÌ °áÁ¤µÇ´Âµ¥,
sem_flg °¡ IPC_NOWAIT·Î ¸í½ÃµÇ¾î ÀÖ´Ù¸é, Çش翵¿ª¿¡¼­ ±â´Ù¸®Áö ¾Ê°í(none block) ¹Ù·Î ¿¡·¯Äڵ带 ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾Ê´Ù¸é ¼¼¸¶Æ÷¾î¸¦ ȹµæÇÒ¼ö ÀÖÀ»¶§±îÁö block µÇ°Ô µÈ´Ù. sem_flg ´Â IPC_NOWAIT ¿Í SEM_UNDO 2°³ÀÇ ¼³Á¤ÇÒ¼ö ÀÖ´Â °ªÀ»°¡Áö°í ÀÖ´Ù. IPC_NOWAIT ´Â none block ¸ðµå ÁöÁ¤À» À§Çؼ­ »ç¿ëµÇ¸ç, SEM_UNDO ´Â ÇÁ·Î¼¼½º°¡ ¼¼¸¶Æ÷¾î¸¦ µ¹·ÁÁÖÁö ¾Ê°í Á¾·áÇعö¸±°æ¿ì Ä¿³Î¿¡¼­ ¾Ë¾Æ¼­ ¼¼¸¶Æ÷¾î °ªÀ» Á¶Á¤(Áõ°¡) ÇÒ¼ö ÀÖµµ·Ï ¸¸µé¾î ÁØ´Ù.

¼³¸íÀÌ ¾Æ¸¶ ¾Ö¸Å¸ðÈ£ÇѸéÀÌ ÀÖÀ»°ÍÀÌ´Ù. °£´ÜÇÑ »óȲÀ» ¿¹·Î µé¾î¼­ ¼³¸íÇØ º¸°Ú´Ù. ÇöÀç ¼¼¸¶Æ÷¾î °ªÀÌ 1 À̶ó°í °¡Á¤ÇÏÀÚ.
À̶§ A ÇÁ·Î¼¼½º°¡ semop ¸¦ ÅëÇؼ­ ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÀ» ½ÃµµÇÑ´Ù.
A´Â Á¢±ÙÀ» À§Çؼ­ sem_op ¿¡ -1 À» ¼¼ÆÃÇÑ´Ù. Áï ¼¼¸¶Æ÷¾î ÀÚ¿øÀ» 1 ¸¸Å­ »ç¿ëÇÏ°Ú´Ù¶ó´Â
¶æÀÌ´Ù.  
ÇöÀç ÁغñµÈ ¼¼¸¶Æ÷¾î °ªÀº 1·Î Áï½Ã »ç¿ëÇÒ¼ö ÀÖÀ¸¹Ç·Î,
A´Â ÀÚ¿øÀ» »ç¿ëÇÏ°Ô µÇ¸ç, Ä¿³ÎÀº ¼¼¸¶Æ÷¾î °ªÀ» 1 ¸¸Å­ °¨¼Ò½ÃŲ´Ù.

À̶§ B ¶ó´Â ÇÁ·Î¼¼½º°¡ ¼¼¸¶Æ÷¾î ÀÚ¿øÀ» 1 ¸¸Å­ »ç¿ëÇÏ°Ú´Ù¶ó°í ¿äûÀ» ÇÑ´Ù.
±×·¯³ª Áö±Ý ¼¼¸¶Æ÷¾î °ªÀº 0 À̹ǷΠB´Â Áö±Ý´çÀå ¼¼¸¶Æ÷¾î ¸¦ »ç¿ëÇÒ¼ö ¾øÀ¸¸ç,
±â´Ù¸®°Å³ª, ¿¡·¯°ªÀ» ¸®ÅÏ ¹Þ¾Æ¾ß ÇÑ´Ù(IPC_NOWAIT).  
B´Â ÀÚ¿ø »ç¿ë°¡´ÉÇÒ¶§±îÁö ±â´Ù¸®±â·Î °áÁ¤À» Çß´Ù.  

Àá¼öÈÄ A´Â ¸ðµç ÀÛ¾÷À» ´Ù¸¶ÃÆ´Ù.
ÀÌÁ¦ ¼¼¸¶Æ÷¾î¸¦ µÇµ¹·ÁÁà¾ß ÇÑ´Ù. sem_op ¿¡ 1 À» ¼¼ÆÃÇϸé,
Ä¿³ÎÀº ¼¼¸¶Æ÷¾î °ªÀ» 1Áõ°¡½ÃÅ°°Ô µÈ´Ù.

µåµð¾î ±â´Ù¸®´ø B°¡ ¼¼¸¶Æ÷¾î ÀÚ¿øÀ» »ç¿ëÇÒ¼ö ÀÖ´Â ¶§°¡ µµ·¡Çß´Ù.
ÀÌÁ¦ ¼¼¸¶Æ÷¾î °ªÀº 1ÀÌ ¹Ç·Î B´Â ¼¼¸¶Æ÷¾î¸¦ ȹµæÇÏ°Ô µÈ´Ù.  
Ä¿³ÎÀº ¼¼¸¶Æ÷¾î °ªÀ» 1 °¨¼Ò ½ÃŲ´Ù.
B´Â ¿øÇÏ´Â ÀÛ¾÷À» ÇÑ´Ù.
...
...



¼¼¸¶Æ÷¾î Á¶ÀÛ
semctl À̶õ ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ ¿ì¸®´Â ¼¼¸¶Æ÷¾î¸¦ Á¶Á¤ÇÒ¼ö ÀÖ´Ù. semctl Àº semid_ds ±¸Á¶Ã¼¸¦ º¯°æÇÔÀ¸·Î½á ¼¼¸¶Æ÷¾îÀÇ Æ¯¼ºÀ» Á¶Á¤ÇÑ´Ù.

ù¹ø° ¾Æ±Ô¸ÕÆ®ÀÎ semid ´Â ¼¼¸¶Æ÷¾î Áö½ÃÀÚÀÌ´Ù. semnum Àº ¼¼¸¶Æ÷¾î ¹è¿­À» ´Ù·ê °æ¿ì »ç¿ëµÇ¸ç, º¸ÅëÀº 0ÀÌ´Ù. cmd ´Â ¼¼¸¶Æ÷¾î Á¶ÀÛ¸í·É¾î ¼ÂÀ¸·Î ´ÙÀ½°ú °°Àº Á¶ÀÛ¸í·É¾îµéÀ» °¡Áö°í ÀÖ´Ù. ¾Æ·¡´Â ±×Áß Áß¿äÇÏ´Ù°í »ý°¢µÇ´Â °Íµé¸¸À» ¼³¸íÇÏ¿´´Ù. ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº semctl ¿¡ ´ëÇÑ man ÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.
IPC_STAT
¼¼¸¶Æ÷¾î »óÅ°ªÀ» ¾ò¾î¿À±â À§ÇØ »ç¿ëµÇ¸ç, »óÅ°ªÀº arg ¿¡ ÀúÀåµÈ´Ù.
IPC_RMID
¼¼¸¶Æ÷¾î ¸¦ »èÁ¦Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.
IPC_SET
semid_ds ÀÇ ipc_perm Á¤º¸¸¦ º¯°æÇÔÀ¸·Î½á ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ ±ÇÇÑÀ» º¯°æÇÑ´Ù.
¿¹Á¦¸¦ ÅëÇÑ ÀÌÇØ
Áö±Ý±îÁö ÀÍÇû´ø ³»¿ëÀ» Åä´ë·Î °£´ÜÇÑ ¿¹Á¦ÇÁ·Î±×·¥À» ¸¸µé¾îº¸°Ú´Ù. ¿¹Á¦ÀÇ »óȲÀº ÇϳªÀÇ ÆÄÀÏ¿¡ 2°³ÀÇ ÇÁ·Î¼¼½º°¡ µ¿½Ã¿¡ Á¢±ÙÇÏ°íÀÚ Çϴµ¥¿¡¼­ ¹ß»ýÇÑ´Ù. ÆÄÀÏ¿¡´Â count ¼ýÀÚ°¡ µé¾î ÀÖÀ¸¸ç, ÇÁ·Î¼¼½º´Â ÆÄÀÏÀ» ¿­¾î¼­ count ¼ýÀÚ¸¦ ÀоîµéÀÌ°í, ¿©±â¿¡ 1À» ´õÇؼ­ ´Ù½Ã ÀúÀåÇÏ´Â ÀÛ¾÷À»ÇÑ´Ù. ÀÌ°ÍÀ» ¼¼¸¶Æ÷¾î¸¦ ÅëÇؼ­ Á¦¾îÇÏÁö ¾ÊÀ¸¸é À§¿¡¼­ ¼³¸íÇѹ®Á¦°¡ ¹ß»ýÇÒ°ÍÀÌ´Ù.

À§ÀÇ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­´Â ÆÄÀÏÀ» ¿­±âÀü¿¡ ¼¼¸¶Æ÷¾î¸¦ ¼³Á¤Çؼ­ Çѹø¿¡ ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸ Á¢±Ù°¡´ÉÇϵµ·Ï ÇÏ¸é µÉ°ÍÀÌ´Ù. ¸ðµç ÆÄÀÏÀÛ¾÷À» ¸¶Ä¡°Ô µÇ¸é, ¼¼¸¶Æ÷¾î ÀÚ¿øÀ» µ¹·ÁÁÜÀ¸·Î½á, ºñ·Î¼­ ´Ù¸¥ ÇÁ·Î¼¼½º°¡ Á¢±Ù°¡´ÉÇÏ°Ô ¸¸µé¾î¾ß ÇÑ´Ù.
¿¹Á¦: sem_test
  1. #include <sys/types.h>    
  2. #include <sys/sem.h>    
  3. #include <sys/ipc.h>    
  4. #include <stdio.h>    
  5. #include <unistd.h>    
  6.   
  7. #define SEMKEY 2345    
  8.   
  9. union semun    
  10. {    
  11.     int val;    
  12.     struct semid_ds *buf;    
  13.     unsigned short int *array;    
  14. };    
  15.   
  16. static int  semid;    
  17. int main(int argc, char **argv)    
  18. {    
  19.     FILE* fp;    
  20.     char buf[11];    
  21.     char count[11];    
  22.   
  23.     union semun sem_union;    
  24.   
  25.     // open °ú close ¸¦ À§ÇÑ sembuf ±¸Á¶Ã¼¸¦ Á¤ÀÇÇÑ´Ù.    
  26.     struct sembuf mysem_open  = {0, -1, SEM_UNDO}; // ¼¼¸¶Æ÷¾î ¾ò±â    
  27.     struct sembuf mysem_close = {0, 1, SEM_UNDO};  // ¼¼¸¶Æ÷¾î µ¹·ÁÁÖ±â    
  28.     int sem_num;    
  29.   
  30.     memset(buf, 0x00, 11);    
  31.     memset(count, 0x00, 11);    
  32.   
  33.     // ¾Æ±Ô¸ÕÆ®°¡ ÀÖÀ¸¸é »ý¼ºÀÚ    
  34.     // ±×·¸Áö ¾ÊÀ¸¸é ¼ÒºñÀÚÀÌ´Ù.    
  35.     if (argc > 1)    
  36.         sem_num = 1;    
  37.     else    
  38.         sem_num = 0;                
  39.   
  40.     // ¼¼¸¶Æ÷¼³Á¤À» ÇÑ´Ù.    
  41.     semid = semget((key_t)234, sem_num, 0660|IPC_CREAT);    
  42.     if (semid == -1)    
  43.     {    
  44.         perror("semget error ");    
  45.         exit(0);    
  46.     }        
  47.   
  48.     // counter.txt ÆÄÀÏÀ» ¿­±â À§Çؼ­ ¼¼¸¶Æ÷¾î°Ë»ç¸¦ÇÑ´Ù.    
  49.     if(semop(semid, &mysem_open, 1) == -1)    
  50.     {    
  51.         perror("semop error ");    
  52.         exit(0);    
  53.     }    
  54.   
  55.     if ((fp = fopen("counter.txt""r+")) == NULL)    
  56.     {    
  57.         perror("fopen error ");    
  58.         exit(0);    
  59.     }    
  60.     // ÆÄÀÏÀÇ ³»¿ëÀ» ÀÐÀºÈÄ ÆÄÀÏÀ» Ã³À½À¸·Î µÇµ¹¸°´Ù.      
  61.     fgets(buf, 11, fp);    
  62.     rewind(fp);    
  63.   
  64.     // °³Ç๮ÀÚ¸¦ Á¦°ÅÇÑ´Ù.    
  65.     buf[strlen(buf) - 1] = 0x00;    
  66.   
  67.     sprintf(count, "%d\n", atoi(buf) + 1);    
  68.     printf("%s", count);    
  69.     // 10Ãʸ¦ Àáµé°í ³­ÈÄ count ¸¦ ÆÄÀÏ¿¡ ¾´´Ù.    
  70.     sleep(10);    
  71.     fputs(count,fp);    
  72.   
  73.     fclose(fp);    
  74.     // ¸ðµç ÀÛ¾÷À» ¸¶Ãƴٸ頼¼¸¶Æ÷¾î ÀÚ¿øÀ» µÇµÉ·ÁÁش٠   
  75.     semop(semid, &mysem_close, 1);    
  76.     return 1;    
  77. }    




ÄÚµå´Â ¸Å¿ì °£´ÜÇÏÁö¸¸, ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇظ¦ ÃæºÐÈ÷ ÇÒ¼ö ÀÖÀ»¸¸ÇÑ ÄÚµåÀÌ´Ù. »ý¼ºÀÚ¿Í ¼ÒºñÀÚÀÇ ºÐ¸®´Â ÇÁ·Î±×·¥¿¡ ³Ñ°ÜÁö´Â ¾Æ±Ô¸ÕÆ®¸¦ ÀÌ¿ëÇß´Ù. ¸ðµç ÀÛ¾÷À» ¸¶Ä¡¸é Å×½ºÆ®¸¦ À§Çؼ­ 10Ãʸ¦ ±â´Ù¸°ÈÄ¿¡ ¼¼¸¶Æ÷¾î¸¦ µ¹·ÁÁÖµµ·Ï ÄÚµùµÇ¾î ÀÖ´Ù.

¿ì¼± count ¸¦ ÀúÀåÇÒ ÆÄÀÏ counter.txt ¸¦ ¸¸µé°í ¿©±â¿¡´Â 1À» ÀúÀåÇØ ³õ´Â´Ù. ±×´ÙÀ½ ./sem_test ¸¦ ½ÇÇà½ÃÅ°´Âµ¥, ÃÖÃÊ¿¡´Â »ý¼ºÀÚ¸¦ ¸¸µé¾î¾ß ÇϹǷΠ¾Æ±Ô¸ÕÆ®¸¦ Á־ ½ÇÇà½ÃÅ°°í, ±×´ÙÀ½¿¡ ½ÇÇà½Ãų¶§´Â ¼ÒºñÀÚ°¡ µÇ¹Ç·Î ¾Æ±Ô¸ÕÆ® ¾øÀÌ ½ÇÇàÇϵµ·Ï ÇÏÀÚ. ´ÙÀ½Àº Å×½ºÆ® ¹æ¹ýÀÌ´Ù.
[root@coco test]# ./sem_test 1&
[1] 3473
36
[root@coco test]# ./sem_test


À§ Äڵ带 ½ÇÇàÇغ¸¸é ./sem_test 1 ÀÌ ¼¼¸¶Æ÷¾îÀÚ¿øÀ» µ¹·ÁÁÖ±â Àü±îÁö ./sem_test °¡ Çش翵¿ª¿¡¼­(¼¼¸¶Æ÷¾î ¿äûÇÏ´Â ºÎºÐ) ºí·°µÇ¾î ÀÖÀ½À» ¾Ë¼ö ÀÖ°í, Ãæµ¹¾øÀÌ count°¡ ÀߵǴ°ÍÀ» º¼¼ö ÀÖÀ»°ÍÀÌ´Ù.

¼¼¸¶Æ÷¾î´Â Ä¿³Î¿¡¼­ °ü¸®Çϴµ¥ ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏ´Â ÇÁ·Î¼¼½º°¡ ¾ø´Ù°í ÇÏ´õ¶óµµ semctl À» ÀÌ¿ëÇؼ­ Á¦°ÅÇÏÁö ¾Ê´ÂÇÑÀº Ä¿³Î¿¡ ³²¾ÆÀÖ°Ô µÈ´Ù. ¼¼¸¶Æ÷¾î Á¤º¸¸¦ Á¦°ÅÇϱâ À§Çؼ­´Â semctl ¿¬»êÀ» ÇϵçÁö, ÄÄÇ»Å͸¦ ¸®º× ½ÃÄ¿°Å³ª, ipcrm(8)À̶õ µµ±¸¸¦ »ç¿ëÇؼ­ Á¦°Å½ÃÄÑ Áà¾ß ÇÑ´Ù.
°á·Ð
¼¼¸¶Æ÷¾î´Â fcntl °ú ¸Å¿ì ºñ½ÁÇÑ ÀÏÀ» ¼öÇàÇϴµ¥, Á»´õ ¼¼¹ÐÇÑ Á¶Á¤ÀÌ °¡´ÉÇÏ´Ù¶ó´Â ÀåÁ¡À» °¡Áö°í ÀÖÁö¸¸ °£´ÜÇÑ ÀÏÀ» Çϱ⿣ Áö³ªÄ¡°Ô º¹ÀâÇÑ ¸éÀÌ ¾øÀÝ¾Æ ÀÖ´Ù. ÀÌ·²°æ¿ì¿¡´Â ¼¼¸¶Æ÷¾î ´ë½Å fcntl À» »ç¿ëÇÏÀÚ.
fcntl Àº ±âȸ°¡ µÇ´Âµ¥·Î ´Ù·çµµ·Ï ÇÏ°Ú´Ù. 

À̸§ Æнº¿öµå
ºñ¹Ð±Û (üũÇÏ¸é ±Û¾´À̸¸ ³»¿ëÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.)
¿ÞÂÊÀÇ ±ÛÀÚ¸¦ ÀÔ·ÂÇϼ¼¿ä.
   

 



 
»çÀÌÆ®¸í : ¸ðÁö¸®³× | ´ëÇ¥ : ÀÌ°æÇö | °³ÀÎÄ¿¹Â´ÏƼ : ·©Å°´åÄÄ ¿î¿µÃ¼Á¦(OS) | °æ±âµµ ¼º³²½Ã ºÐ´ç±¸ | ÀüÀÚ¿ìÆí : mojily°ñ¹ðÀÌchonnom.com Copyright ¨Ï www.chonnom.com www.kyunghyun.net www.mojily.net. All rights reserved.