¸®´ª½º ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö 8Àå IPC
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Contents

1 IPC
1.1 IPC ¼Ò°³
1.2 System V IPC ¿Í POSIX IPC
2 IPC ¼³ºñµé
2.1 PIPE
2.1.1 pipeÀÇ »ç¿ë
2.1.2 pipeÀÇ ÀåÁ¡°ú ´ÜÁ¡
2.2 FIFO
2.2.1 pipe ¿Í named pipe
2.2.2 ½Ã½ºÅÛ ¸í·ÉÀ» ÀÌ¿ëÇÑ named pipeÀÇ »ý¼º
2.2.3 ¸®´ª½º Ç¥ÁضóÀ̺귯¸® ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ named pipeÀÇ »ý¼º
2.2.4 mknod ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÑ ÆÄÀÌÇÁ »ý¼º
2.2.5 named pipe¸¦ ÀÌ¿ëÇÑ µ¥ÀÌÅÍ Åë½Å
2.3 Message Queue
2.3.1 ¸Þ½ÃÁö Å¥ÀÇ »ý¼º
2.3.2 µ¥ÀÌÅÍ ¾²±â¿Í Àбâ
2.4 °øÀ¯¸Þ¸ð¸® - Shared Memory
2.4.1 °øÀ¯¸Þ¸ð¸® ÇÔ¼öµé
2.4.2 °øÀ¯¸Þ¸ð¸® ´Ù·ç±â
2.4.3 ÀåÁ¡°ú ÇѰè
2.5 Memory Map
2.5.1 Memory map »ý¼º°ú »èÁ¦
2.5.2 ¿¹Á¦ : »ý»êÀÚ
2.5.3 ¿¹Á¦ : ¼ÒºñÀÚ
2.5.4 ¸Þ¸ð¸® ¸ÊÀÇ ÀåÁ¡
2.6 ¼¼¸¶Æ÷¾î - Semaphore
2.6.1 ¼¼¸¶Æ÷¾îÀÇ ÀÛµ¿¿ø¸®
2.6.2 ¼¼¸¶Æ÷¾îÀÇ »ç¿ë
2.6.3 ¼¼¸¶Æ÷¾î ¿¹Á¦ ÇÁ·Î±×·¥
2.6.4 ¼¼¸¶Æ÷¾îÀÇ ÀåÁ¡°ú ´ÜÁ¡
2.7 Socket
2.7.1 Unix Domain Socket ÀÇ ÀåÁ¡
2.7.2 Unix Domain Socket ¿¹Á¦

1 IPC

1.1 IPC ¼Ò°³


À§ÀÇ ±×¸²Àº 2Àå¿¡¼­ °£´ÜÈ÷ ¼³¸íÇß´ø ¸®´ª½º Ä¿³Î ±¸Á¶±×¸²ÀÌ´Ù. À̹øÀå¿¡´Â ÀÌÁß IPC ¿¡ ´ëÇØ¼­ ´Ù·ê °ÍÀÌ´Ù.

±×¸²¿¡¼­ ó·³ Process´Â ¿ÏÀüÈ÷ µ¶¸³µÈ ½ÇÇఴüÀÌ´Ù. ¼­·Î µ¶¸³µÇ¾îÀÖ´Ù´Â °ÍÀº ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù´Â ÀåÁ¡ÀÌ ÀÖ´Ù. ±×·¯³ª µ¶¸³µÇ¾î ÀÖÀ¸´Ï ¸¸Å­ º°µµÀÇ ¼³ºñ°¡ ¾øÀÌ´Â ¼­·Î°£¿¡ Åë½ÅÀÌ ¾î·Æ´Ù´Â ¹®Á¦°¡ ÀÖ´Ù. ÀÌ ¹®Á¦´Â ÀÌ ÀüÀåÀÇ ¾²·¹µå¿Í ºñ±³Çغ¸¸é µÎµå·¯Áø´Ù.

À̸¦ À§Çؼ­ Ä¿³Î¿µ¿ª¿¡¼­ IPC¶ó´Â ³»ºÎ ÇÁ·Î ¼¼½º°£ Åë½Å - Inter Process Communication -À» Á¦°øÇÑ´Ù. ÇÁ·Î¼¼½º´Â Ä¿³ÎÀÌ Á¦°øÇÏ´Â IPC¼³ºñ¸¦ ÀÌ¿ëÇØ¼­ ÇÁ·Î¼¼½º°£ Åë½ÅÀ» ÇÒ ¼ö ÀÖ´Ù.

1.2 System V IPC ¿Í POSIX IPC

IPC¿¡´Â µÎ °¡Áö Ç¥ÁØÀÌ ÀÖ´Ù. Çϳª´Â ¿À·¡µÈ ¹öÀüÀÇ System V IPCÀ̰í, ´Ù¸¥ Çϳª´Â ºñ±³Àû ÃÖ±Ù¿¡ °³¹ßµÈ POSIX IPC´Ù. System V IPC´Â ¿À·£ ¿ª»ç¸¦ °¡Áø ¸¸Å­ ÀÌ ±âÁ¾°£ ÄÚµå ȣȯ¼ºÀ» È®½ÇÈ÷ º¸ÀåÇØ ÁÖÁö¸¸, API°¡ Á» ±¸½ÄÀ̸ç ÇÔ¼ö¸íµµ ¸íÈ®ÇÏÁö ¾Ê´Ù. POSIX IPC´Â Á÷°üÀûÀ¸·Î API°¡ ±¸¼ºµÇ¾î À־ Á» ´õ »ç¿ëÇϱ⠽±´Ù.

¿ì¼±Àº System V IPC¸¦ ´Ù·ç°í ³ªÁß¿¡ ½Ã°£ÀÌ µÇ¸é POSIX IPC¸¦ ´Ù·çµµ·Ï ÇϰڴÙ. ¸ÞÄ¿´ÏÁòÀº µ¿ÀÏ ÇϹǷΠ¾î´À °ÍÀ» ¹è¿ìµç Å« ¹®Á¦´Â µÇÁö ¾ÊÀ» °ÍÀÌ´Ù. ÇÊ¿äÇϸé System V IPC¿Í ´ëÀÀÇÏ´Â POSIX IPC ÇÔ¼öµéÀ» ¼³¸íÇϵµ·Ï ÇϰڴÙ.

2 IPC ¼³ºñµé

Çö½Ç¿¡¼­µµ Çʿ信 µû¶ó ´Ù¾çÇÑ Åë½Å ¼³ºñµéÀÌ Á¸ÀçÇÏ´Â °Íó·³ IPC¿¡µµ ´Ù¾çÇÑ ¼³ºñµéÀÌ Á¸ÀçÇÑ´Ù. °¢°¢ÀÇ Çʿ信 µû¶ó Àû´çÇÑ Åë½Å¼³ºñµéÀÌ ÁغñµÇ¾î¾ß ÇÏ´Â °Í°ú ¸¶Âù°¡Áö·Î ³»ºÎ ÇÁ·Î¼¼½º°£ Åë½Å¿¡µµ ±× »óȲ¿¡ ¸Â´Â IPC ¼³ºñ¸¦ ¼±ÅÃÇÒ Çʿ䰡 ÀÖ´Ù.

»óȲ¿¡ ¸Â´Â IPCÀÇ ¼±ÅÃÀº ƯÈ÷ fork¸¦ ÀÌ¿ëÇØ¼­ ¸¸µé¾îÁø ¸ÖƼÇÁ·Î¼¼½ºÀÇ ÇÁ·Î±×·¥¿¡ À־ Áß¿äÇÏ´Ù. À߸øµÈ IPC ¼³ºñÀÇ ¼±ÅÃÀº ÄÚµù°úÁ¤À» ¾î·Æ°Ô ¸¸µé°Å³ª ÇÁ·Î±×·¥ÀÇ ÀÛµ¿À» È¿À²ÀûÀÌÁö ¸øÇÏ°Ô ¸¸µé ¼ö Àֱ⠶§¹®ÀÌ´Ù.

¿©±â¿¡¼­´Â Ä¿³ÎÀÌ Á¦°øÇÏ´Â °¢°¢ÀÇ IPC ¼³ºñµéÀÇ »ç¿ë¹ý°ú ÀåÁ¡¹× ´ÜÁ¡ ¾î¶² °æ¿ì¿¡ ½á¾ßÇÏ´ÂÁö¿¡ ´ëÇØ¼­ ¼³¸íÇÒ °ÍÀÌ´Ù.

2.1 PIPE

pipe´Â ¿ì¸®°¡ »ý°¢ÇÏ´Â ±× ÆÄÀÌÇÁ¿Í ºñ½ÁÇÏ°Ô ÀÛµ¿ÇÑ´Ù°í º¸¸éµÈ´Ù. Áï ¼öµµ ÆÄÀÌÇÁ¿Í °°Àº ÀÛµ¿ ¿ø¸®´Ù.


À§ ±×¸²Àº pipeÀÇ ÀÛµ¿¿ø¸®¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. ÆÄÀÌÇÁ´Â µÎ°³ÀÇ ÇÁ·Î¼¼½º¸¦ ¿¬°áÇÑ´Ù. ÇϳªÀÇ ÇÁ·Î¼¼½º´Â ´ÜÁö µ¥ÀÌÅ͸¦ ¾²±â¸¸ ÇÏ°í ´Ù¸¥ ÇϳªÀÇ ÇÁ·Î¼¼½º´Â ´ÜÁö Àб⸸ ÇÒ ¼ö ÀÖ´Ù. ÇÑÂÊ ¹æÇâÀ¸·Î¸¸ Åë½ÅÀÌ °¡´ÉÇÑ ÀÌ·¯ÇÑ ÆÄÀÌÇÁÀÇ Æ¯Â¡ ¶§¹®¿¡ Half-duplex Åë½Å (¹ÝÀÌÁß Åë½Å) ¶ó°í ºÎ¸£±âµµ ÇÑ´Ù. ÀÌ¿Í ´Þ¸® ÇϳªÀÇ Åë½Å¼±·Î¸¦ ÀÌ¿ëÇØ¼­ ¼Û½Å°ú ¼ö½ÅÀ» ¸ðµÎ ÇÒ ¼ö ÀÖ´Â ¹æ½ÄÀ» Full-duplex Åë½Å (ÀüÀÌÁß Åë½Å)À̶ó°í ºÎ¸¥´Ù.

pipe¿Í °°Àº ¹ÝÀÌÁß Åë½ÅÀÇ °æ¿ì ÇϳªÀÇ Åë½Å¼±·Î´Â Àб⳪ ¾²±â Áß Çϳª¸¸ °¡´ÉÇϱ⠶§¹®¿¡ ¸¸¾à Àбâ¿Í ¾²±â Áï ¼Û¼ö½ÅÀ» ¸ðµÎ ÇÏ±æ ¿øÇÑ´Ù¸é ¾Æ·¡Ã³·³ µÎ°³ÀÇ pipe¸¦ ¸¸µé¾î¾ß¸¸ ÇÑ´Ù.


2.1.1 pipeÀÇ »ç¿ë

pipe´Â pipe(2)¶ó´Â ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¸¸µé ÀÖ´Ù.
#include <unistd.h> 
 
int pipe(int filedes[2]); 
 
ÇÔ¼öÀÇ ÀÎÀÚ·Î intÇü ¹è¿­ÀÌ µé¾î°¡´Â Á¡¿¡ À¯ÀÇÇÏÀÚ. ¹è¿­ÀÌ ³Ñ¾î°¡´Â ÀÌÀ¯´Â ÀÌ ÇÔ¼ö°¡ ÀбâÀü¿ëÀÇ ÆÄÀÌÇÁ¿Í ¾²±âÀü¿ëÀÇ ÆÄÀÌÇÁ 2°³¸¦ ¸®ÅÏÇØ Áֱ⠶§¹®ÀÌ´Ù. ¹è¿­ÀÇ 0¹øÂ°¿¡´Â Àб⸦ À§ÇÑ ÆÄÀÌÇÁ, 1¹øÂ°¿¡´Â ¾²±â¸¦ À§ÇÑ ÆÄÀÌÇÁÀÇ Áö½Ã¹øÈ£°¡ µé¾î°£´Ù.


´ÙÀ½Àº pipe¸¦ ÅëÇØ¼­ Åë½ÅÀ» ÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù.
001  #include <unistd.h>
002  #include <stdlib.h>
003  #include <stdio.h>
004  
005  int main()
006  {
007      int n, fd[2];
008      char buf[255];
009       int pid;
010  
011       if (pipe(fd) < 0)
012      {
013          perror("pipe error : ");
014          exit(0);
015      }
016  
017      // ÆÄÀÌÇÁ¸¦ »ý¼ºÇÑ´Ù. 
018      if ((pid = fork()) < 0)
019      {
020          perror("fork error : ");
021          exit(0);
022      }
023  
024      // ¸¸¾à ÀÚ½ÄÇÁ·Î¼¼½º¶ó¸é ÆÄÀÌÇÁ¿¡ ÀÚ½ÅÀÇ PID Á¤º¸¸¦ ¾´´Ù.
025      else if (pid == 0)
026      {
027          close(fd[0]);
028          while(1)
029          {
030              memset(buf, 0x00, 255);
031              sprintf(buf, "Hello Mother Process. My name is %d\n", getpid());
032              write(fd[1], buf, strlen(buf));
033              sleep(1);
034              }
035          }
036  
037          // ¸¸¾à ºÎ¸ðÇÁ·Î¼¼½º¶ó¸é ÆÄÀÌÇÁ¿¡¼­ µ¥ÀÌŸ¸¦ ÀоîµéÀδÙ. 
038          else
039          {
040              close(fd[1]);
041              while(1)
042              {
043                  memset(buf, 0x00, 255);
044                  n = read(fd[0], buf, 255);
045                  fprintf(stderr, "%s", buf);
046              }
047          }
048  }
049  
  1. pipe(2)ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÆÄÀÌÇÁ¸¦ »ý¼ºÇß´Ù.
  2. fork(2)ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ »ý¼ºÇÑ´Ù.
    25~35. pid == 0 Áï ÀÚ½Ä ÇÁ·Î¼¼½ºÀÎ °æ¿ì ½ÇÇàµÉ ÄÚµå´Ù. ÀÚ½ÄÇÁ·Î¼¼½º´Â ºÎ¸ð·ÎºÎÅÍ ÆÄÀÏÀ» ¹°·Á¹Þ´Â´Ù - ÆÄÀÌÇÁµµ ÆÄÀÏÀÌ´Ù -. ¿©±â¿¡¼­ ¸¸µé ÀÚ½ÄÇÁ·Î¼¼½º´Â ´ÜÁö ¾²±â¸¸ ÇÒ °ÍÀÌ´Ù. ±×·¯¹Ç·Î Àб⸦ À§ÇÑ ÆÄÀÌÇÁ´Â close(2)¸¦ ÀÌ¿ëÇØ¼­ ´Ý¾Æ¹ö·È´Ù. ÀÌÁ¦ 1ÃÊ °£°ÝÀ¸·Î write(2)ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¾²±âÆÄÀÌÇÁ¿¡ ¹®ÀÚ¿­À» ¾´´Ù.
    38~47 ºÎ¸ðÇÁ·Î¼¼½º´Â ´ÜÁö Àб⸸ ÇÒ °ÍÀÌ´Ù. ±×·¡¼­ ¾²±âÆÄÀÌÇÁ´Â ´Ý¾Æ¹ö·È´Ù. ±×¸®°í read(2)ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÀÐ±â ÆÄÀÌÇÁ¿¡ ÀÐÀ» µ¥ÀÌÅͰ¡ ÀÖ´ÂÁö¸¦ ±â´Ù¸°´Ù.

2.1.2 pipeÀÇ ÀåÁ¡°ú ´ÜÁ¡

pipe´Â ¸Å¿ì °£´ÜÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖ´Ù. ¸¸¾à ÇÑÂÊ ÇÁ·Î¼¼½º°¡ ´ÜÁö Àб⸸ ÇÏ°í ´Ù¸¥ ÂÊ ÇÁ·Î¼¼½º´Â ´ÜÁö ¾²±â¸¸ ÇÏ´Â ´Ü¼øÇÑ µ¥ÀÌÅÍ È帧À» °¡Áø´Ù¸é °í¹Î ¾øÀÌ pipe¸¦ »ç¿ëÇÏ¸é µÈ´Ù.

´ÜÁ¡Àº ¹ÝÀÌÁß Åë½ÅÀ̶ó´Â Á¡ÀÌ´Ù. ¸¸¾à ÇÁ·Î¼¼½º°¡ Àбâ¿Í ¾²±â Åë½Å ¸ðµÎ¸¦ ÇØ¾ß ÇÑ´Ù¸é pipe¸¦ µÎ°³ ¸¸µé¾î¾ß Çϴµ¥, ±¸ÇöÀÌ ²Ï³ª º¹ÀâÇØ Áú ¼ö ÀÖ´Ù. read¿Í write°¡ ±âº»ÀûÀ¸·Î block(ºÀ¼â)·Î ÀÛµ¿Çϱ⠶§¹®À¸·Î ÇÁ·Î¼¼½º°¡ read´ë±âÁßÀ̶ó¸é read°¡ ³¡³ª±â Àü¿¡´Â write¸¦ ÇÒ¼ö°¡ ¾ø°Ô µÈ´Ù. ¸¸¾à µÎ°³ÀÇ ÇÁ·Î¼¼½º°¡ ¸ðµÎ read ÁßÀ̶ó¸é ¿µ¿øÈ÷ blockµÇ°Ô µÉ °ÍÀÌ´Ù.

ÀÌ·¯ÇÑ ¹®Á¦´Â fork¸¦ ÀÌ¿ëÇØ¼­ Àбâ Àü¿ë ÇÁ·Î¼¼½º¿Í ¾²±â Àü¿ë ÇÁ·Î¼¼½º 2°³¸¦ ¸¸µé°Å³ª ȤÀº (³ªÁß¿¡ ´Ù·ç°Ô µÉ)ÀÔÃâ·Â ´ÙÁßÈ­¸¦ ÀÌ¿ëÇØ¼­ ÇØ°áÇØ¾ß ÇÑ´Ù. ¾î¶² ¹æ¹ýÀ» ¾²´õ¶óµµ ±¸ÇöÀÌ º¹ÀâÇØÁö´Â °É ÇÇÇÒ ¼ö ¾ø´Ù.

¸¸¾à ÀüÀÌÁß Åë½ÅÀ» °í·ÁÇØ¾ßµÉ »óȲÀ̶ó¸é pipe ´Â ÁÁÀº ¼±ÅÃÀÌ ¾Æ´Ï´Ù.

2.2 FIFO

FIFO´Â First In First Out ÀÇ ÁÙÀÓ¸»ÀÌ´Ù. ¸ÕÀú ÀÔ·ÂµÈ°Ô ¸ÕÀú Ãâ·ÂµÇ´Â ¼±ÀÔ¼±ÃâÀÇ µ¥ÀÌÅÍ ±¸Á¶¸¦ ÀǹÌÇÑ´Ù. IPC ¼³ºñ·Î½áÀÇ FIFO ¶ó¸é ¸ÕÀú ÀÔ·ÂµÈ µ¥ÀÌÅͰ¡ ¸ÕÀú Àü´ÞµÇ´Â ³»ºÎÅë½Å ¼³ºñ·Î ÇØ¼®ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª ÀÌ·¯ÇÑ ÇØ¼®Àº »ç¿ëÀÚ¸¦ È¥¶õ½ÃŰ´Â Ãø¸éÀÌ ÀÖ´Ù. ¾Õ¼­ÀÇ pipe ¿ª½Ã ¼±ÀÔ¼±ÃâÀÇ µ¥ÀÌÅÍ Àü´Þ ¸ÞÄ¿´ÏÁòÀ» µû¸£±â ¶§¹®ÀÌ´Ù.

±×·¯´Ï FIFO´Â ¼±ÀÔ¼±ÃâÀ̶ó´Â µ¥ÀÌÅͱ¸Á¶·Î½áÀÇ ¹üÁÖ°¡ ¾Æ´Ñ named pipe¶ó´Â ±¸Á¶Àû Ãø¸éÀ¸·Î½á ¹Ù¶óº¸µµ·Ï ÇÑ´Ù. ÀÌÇÏ FIFO´Â named pipe¶ó°í ºÎ¸£±â·Î ÇϰڴÙ.

2.2.1 pipe ¿Í named pipe

¾Õ¼­ ÀÌ¹Ì ¹è¿î pipe¿Í named pipeÀÇ Â÷ÀÌÁ¡¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. ¸ÕÀú ÀÔ·ÂµÈ µ¥ÀÌÅͰ¡ ¸ÕÀú Àü´ÞµÇ´Â È帧À» °¡Áø´Ù´Â Ãø¸é¿¡¼­ µ¿ÀÏÇÑ µ¥ÀÌÅÍ È帧 ¸ÞÄ¿´ÏÁòÀ» °¡Áø´Ù.

Â÷ÀÌÁ¡À̶ó¸é named pipe ´Â »ç¿ëÇÒ pipe¸¦ ¸í¸íÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÌ µÉ °ÍÀÌ´Ù. pipe´Â »ç¿ëÇÒ ÆÄÀÌÇÁ¸¦ ¸í¸íÇÒ ¼ö°¡ ¾ø´Ù. ÀÌ·± Àǹ̿¡¼­ pipe´Â ¶§¶§·Î À͸í pipe¶ó°í ºÎ¸£±âµµ ÇÑ´Ù.

±×·³ ÆÄÀÌÇÁ¸¦ À͸íÀ¸·Î ¸¸µå´Â °Í°ú ¸í¸í - named - ÇØ¼­ »ç¿ëÇÏ´Â °ÍÀÇ Â÷ÀÌÁ¡¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.

ÀÍ¸í ÆÄÀÌÇÁ´Â µ¥ÀÌÅÍ Åë½ÅÀ» ÇÒ ÇÁ·Î¼¼½º°¡ ¸íÈ®ÇÏ°Ô ¾Ë ¼ö ÀÖÀ» ¶§ »ç¿ëÇÑ´Ù. ¼Û½ÅÇÒ ÇÁ·Î¼¼½º´Â ¼ö½ÅÇÒ ÇÁ·Î¼¼½º¸¦ ¾Ë°í, ¼ö½ÅÇÒ ÇÁ·Î¼¼½º´Â ¼Û½ÅÇÒ ÇÁ·Î¼¼½º¸¦ ¾Æ´Â °æ¿ì´Ù. °¡Àå ´ëÇ¥ÀûÀÎ ¿¹´Â ºÎ¸ðÇÁ·Î¼¼½º¿Í ÀÚ½ÄÇÁ·Î¼¼½º°£¿¡ µ¥ÀÌÅÍ Åë½ÅÀ» ÇϰíÀÚ ÇÏ´Â °æ¿ì´Ù. ÀÚ½Ä ÇÁ·Î¼¼½º¿Í ºÎ¸ð ÇÁ·Î¼¼½º´Â ¼­·Î¸¦ ¸íÈ®È÷ ¾Ë°í ÀÖÀ¸¹Ç·Î ±»ÀÌ ÆÄÀÌÇÁ¿¡ À̸§À» ÁÙÇʿ䰡 ¾øÀ» °ÍÀÌ´Ù. ºÎ¸ð¿Í Àڽİ£ÀÌ´Ï ±»ÀÌ À̸§ÀÌ ¾ø¾îµµ ´ëÈ­°¡ ÅëÇÏÁö ¾Ê°Ú´Â°¡ ?

¹Ý¸é, Àڽİú ºÎ¸ðÇÁ·Î¼¼½º°¡ ¾Æ´Ñ Áï ÀüÇô ¸ð¸£´Â ÇÁ·Î¼¼½ºµé »çÀÌ¿¡¼­ pipe¸¦ ÀÌ¿ëÇØ¼­ Åë½ÅÀ» ÇØ¾ßÇÏ´Â °æ¿ì¸¦ »ý°¢Çغ¸ÀÚ. »ýÆÇ ¸ð¸£´Â »ç¶÷°ú ´ëÈ­¸¦ ÇÏ·Á¸é À̸§À» ¾Ë°í ÀÖ¾î¾ß ÇϵíÀÌ, ÀüÇô °ü·Ã¾ø´Â ÇÁ·Î¼¼½ºµé »çÀÌ¿¡¼­ pipe¸¦ ÀÌ¿ëÇØ¼­ Åë½ÅÀ» ÇÏ·Á¸é pipe¿¡ À̸§ÀÌ ÁÖ¾îÁ®¾ß ÇÑ´Ù. named pipe ¸¦ ¸¸µç ÀÌÀ¯´Ù.

ÀÌÁ¦ named pipe °¡ Á¸ÀçÇÏ´Â ¹æ½ÄÀ» ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. º¹ÀâÇÏ°Ô »ý°¢ÇÒ °Í ¾ø´Ù. ¸®´ª½º¿¡¼­ ¸ðµç °ÍÀº ÆÄÀÏ·Î ÅëÇÑ´Ù°í ÇÑ °ÍÀ» ±â¾ïÇϰí ÀÖÀ» °ÍÀÌ´Ù. named pipeµµ ÆÄÀÏ·Î Á¸ÀçÇÑ´Ù. pipe ÆÄÀÏÀÌ Á¸ÀçÇϰí, ÀÌ ÆÄÀÏÀÇ À̸§ÀÌ ¹Ù·Î pipeÀÇ nameÀÌ µÈ´Ù. ÆÄÀÏÀº ½Ã½ºÅÛ Àü¿ªÀûÀ¸·Î °ü¸®ÇÏ´Â °´Ã¼ÀÌ´Ï, À̸§¸¸ ¾È´Ù¸é ¾î¶² ÇÁ·Î¼¼½º¶óµµ Á¢±ÙÀÌ °¡´ÉÇÏ´Ù. ÀÌÁ¦ ¼­·Î °ü·Ã¾ø´Â ÇÁ·Î¼¼½ºµéµµ named pipe¸¦ ÀÌ¿ëÇØ¼­ Åë½ÅÀ» ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù.

2.2.2 ½Ã½ºÅÛ ¸í·ÉÀ» ÀÌ¿ëÇÑ named pipeÀÇ »ý¼º

named pipe´Â ÆÄÀÏÀÇ ÇüÅ·ΠÁ¸ÀçÇϸç ÇÁ·Î¼¼½º¿Í ÀüÇô °ü·ÃÀÌ ¾ø±â ¶§¹®¿¡, ÇÁ·Î¼¼½º¿Í °ü·Ã¾øÀÌ µ¶ÀÚÀûÀÎ ÆÄÀÏÀÇ ÇüÅ·ΠÁ¸ÀçÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù. ÇØ¼­ ¹Ýµå½Ã ÇÁ·Î¼¼½º »ý¼ºÈÄ¿¡ Åë½Å¼±·Î°¡ °³¼³µÇ´Â pipe¿Í ´Þ¸® named pipe´Â ¹Ì¸® ÆÄÀÏ·Î ¸¸µé¾î µÑ ¼ö ÀÖ´Ù. ÀÏ´Ü ÆÄÀÏ·Î ¸¸µé¾î µÐ ´ÙÀ½¿¡, ¾²°í ½ÍÀº ÇÁ·Î¼¼½º°¡ ÆÄÀÌÇÁ¸¦ ¿­¾î¼­ Åë½ÅÀ» ÇÏ´Â ¹æ½ÄÀÌ´Ù. °øÁßÀüÈ­¿Í ºñ½ÁÇÏ´Ù°í³ª ÇÒ ¼ö ÀÖÀ» °Í °°´Ù.

¸®´ª½º´Â mkfifo ¶ó´Â ½Ã½ºÅÛ ¸í·É¾î¸¦ ÀÌ¿ëÇØ¼­ named pipe¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù.
# mkfifo mypipe 
 
ls ¸¦ ÀÌ¿ëÇØ¼­ ÆÄÀÏÀÇ Æ¯¼ºÀ» ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
# ls -al mypipe 
prw-r--r-- 1 yundream yundream 0 2009-04-16 19:23 mypipe 
 
°¡Àå ¾ÕÀÇ p´Â ÀÌ ÆÄÀÏÀÌ pipe ÀÓÀ» ÀǹÌÇÑ´Ù. ¼º°øÀûÀ¸·Î mypipe¶ó´Â À̸§À» °¡Áö´Â pipe°¡ »ý¼ºµÇ¾úÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

2.2.3 ¸®´ª½º Ç¥ÁضóÀ̺귯¸® ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ named pipeÀÇ »ý¼º

½Ã½ºÅÛ ¸í·ÉÀ» ÀÌ¿ëÇØ¼­ named pipe (ÀÌÇÏ ÆÄÀÌÇÁ)¸¦ »ý¼ºÇÒ ¼ö ÀÖÁö¸¸ À̰ɷδ Á» ºÎÁ·ÇÏ´Ù. ¿ì¸®´Â ½Ã½ºÅÛ ÇÁ·Î±×·¡¸Ó ÀÌ´Ï, ÇÁ·Î±×·¥³»¿¡¼­ ÆÄÀÌÇÁ¸¦ »ý¼ºÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¸®´ª½º´Â Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼­ mkfifo(3)À̶ó´Â ÆÄÀÌÇÁ »ý¼º ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
#include <sys/types.h> 
#include <sys/stat.h> 
 
int mkfifo ( const char *pathname, mode_t mode ); 
 

´ÙÀ½Àº ÀÎÀÚ·Î ÁÖ¾îÁø ¹®ÀÚ¿­À» À̸§À¸·Î °¡Áö´Â ÆÄÀÌÇÁ¸¦ »ý¼ºÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù.
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
 
int main(int argc, char **argv) 
{ 
    int state; 
    if (argc !=2 ) 
    { 
        fprintf(stderr,"Usage : %s [filename]\n", argv[0]); 
        return 1; 
    } 
    state = mkfifo("/tmp/myfifo", S_IRUSR|S_IWUSR); 
    if (state < 0) 
    { 
        perror("mkfifo error \n"); 
        return 1; 
    } 
    return 0; 
} 
 

2.2.4 mknod ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÑ ÆÄÀÌÇÁ »ý¼º

¾Õ¼­ mkfifo(3)À» ÀÌ¿ëÇØ¼­ °£´ÜÇÏ°Ô ÆÄÀÌÇÁ¸¦ »ý¼ºÇØ º¸¾Ò´Ù. ±×·¯³ª ¿ØÁö ±âºÐÀÌ ¼®¿¬Ä¡ ¾Ê´Ù. Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼­ Á¦°øÇÏ´Â ÇÔ¼ö¸¦ ÀÌ¿ëÇ߱⠶§¹®ÀÌ´Ù. ±×·¡µµ ½Ã½ºÅÛ ÇÁ·Î±×·¡¹ÖÀÌ´Ï ÀÌ¿ÕÀ̸é, ½Ã½ºÅÛÄÝÀ» ÀÌ¿ëÇØ¼­ Àú¼öÁØ¿¡¼­ Á¢±ÙÀ» ÇØº¸¾Æ¾ß¸¸ ÇÒ °Í °°Àº ±âºÐÀÌ µç´Ù.

¸®´ª½º´Â mknod(2)¶ó´Â ½Ã½ºÅÛÄÝÀ» Á¦°øÇÑ´Ù. mknod´Â Ư¼öÆÄÀÏÀÇ »ý¼ºÀ» À§Çؼ­ Ä¿³Î¿¡¼­ Á¦°øÇÏ´Â ÇÔ¼ö·Î »ç¿ë¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.
include <sys/stat.h> 
 
int mknod(const char *path, mode_t mode, dev_t dev); 
 

¾Æ·¡´Â mknod¸¦ ÀÌ¿ëÇØ¼­ named pipe¸¦ »ý¼ºÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù.
#include <sys/stat.h> 
 
int main(int argc, char **argv) 
{ 
  mknod(argv[1], S_IFIFO, 0); 
  return 0; 
} 
 

mknod´Â named pipe ¿Ü¿¡µµ ¹®ÀÚÀåÄ¡ÆÄÀÏ, ºí·°ÀåÄ¡ÆÄÀÏ, Unix Domain SocketµîÀÇ ÆÄÀϵ鵵 »ý¼ºÇÒ ¼ö ÀÖ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº mknod(2) ¸Þ´º¾ó ¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù.

2.2.5 named pipe¸¦ ÀÌ¿ëÇÑ µ¥ÀÌÅÍ Åë½Å

named pipe¸¦ ÀÌ¿ëÇϸé ÀüÇüÀûÀÎ ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨À» µû¸£´Â ÇÁ·Î±×·¥ÀÇ ÀÛ¼ºÀÌ °¡´ÉÇÏ´Ù. Ŭ¶óÀÌ¾ðÆ®´Â ¿äûÀ» ÇÏ´Â ÇÁ·Î±×·¥ÀÌ°í ¼­¹ö´Â ¿äûÀ» ¹Þ¾Æ¼­ ó¸®ÇÏ°í ±× °á°ú¸¦ µÇµ¹·ÁÁÖ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨Àº ÀϹÝÀûÀ¸·Î ÀÎÅÍ³Ý ¼­ºñ½º¿¡ ¸Å¿ì Àͼ÷ÇÑ ¹æ½ÄÀÌ´Ù. apache¿Í °°Àº À¥¼­¹ö¿Í firefox, ie ¿Í °°Àº Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÌ ´ëÇ¥ÀûÀÎ ¿¹ÀÌ´Ù.


½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö¿¡¼­µµ ÀÌ·¯ÇÑ ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨Àº ¸Å¿ìÀÚÁÖ »ç¿ëµÈ´Ù. ÀÎÅͳݿ¡¼­ÀÇ ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® º¸´Ù ±× ¿ª»çµµ ¿À·¡µÇ¾ú´Ù°í º¼ ¼ö ÀÖ´Ù.

¿©±â¿¡¼­´Â °£´ÜÇÑ °è»ê ÇÁ·Î±×·¥À» named pipe¸¦ ÀÌ¿ëÇØ¼­ ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. À̵é ÇÁ·Î±×·¥Àº ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨À» µû¸£µµ·Ï ÇÒ °ÍÀÌ´Ù. ¼­¹öÇÁ·Î±×·¥ÀÇ À̸§Àº calc_server.c À̰í Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÇ À̸§Àº calc.c ÀÌ´Ù. calc.c °¡ µÎ°³ÀÇ ¼ýÀÚ¸¦ named pipe¸¦ ÀÌ¿ëÇØ¼­ calc_server¿¡ ³Ñ±â¸é, calc_server ´Â °è»êÀ» ÇØ¼­ calc·Î ³Ñ°ÜÁÖµµ·Ï ÇÒ °ÍÀÌ´Ù.

2.3 Message Queue

Queue(Å¥)´Â ¼±ÀÔ¼±ÃâÀÇ ÀڷᱸÁ¶¸¦ °¡Áö´Â Åë½Å¼³ºñ·Î Ä¿³Î¿¡¼­ °ü¸®ÇÑ´Ù. ÀÔÃâ·Â ¹æ½ÄÀ¸·Î º¸ÀÚ¸é named pipe¿Í µ¿ÀÏÇÏ´Ù°í º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. named pipe¿Í ´Ù¸¥ Á¡À̶ó¸é name pipe°¡ µ¥ÀÌÅÍÀÇ È帧À̶ó¸é ¸Þ½ÃÁöÅ¥´Â ¸Þ¸ð¸®°ø°£À̶ó´Â Á¡ÀÌ´Ù. ÆÄÀÌÇÁ°¡ ¾Æ´Ñ, ¾îµð¿¡¼­³ª ¹°°ÇÀ» ²¨³¾¼ö ÀÖ´Â ÄÁÅ×ÀÌ³Ê º§Æ®¶ó°í º¸¸é µÉ °ÍÀÌ´Ù.

¸Þ½ÃÁöÅ¥ÀÇ ÀåÁ¡Àº ÄÁÅ×ÀÌ³Ê º§Æ®°¡ °¡Áö´Â ÀåÁ¡À» ±×´ë·Î °¡Áø´Ù. ÄÁÅ×ÀÌ³Ê º§Æ®¿¡ ¿Ã¶ó¿Ã ¹°°Ç¿¡ ¶óº§À» ºÙÀÌ¸é µ¿½Ã¿¡ ´Ù¾çÇÑ ¹°°ÇÀ» ´Ù·ê ¼ö ÀÖ´Â °Í°ú °°ÀÌ, ¸Þ½ÃÁöÅ¥¿¡ ¾µ µ¥ÀÌÅÍ¿¡ ¹øÈ£¸¦ ºÙÀÓÀ¸·Î½á, ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ µ¿½Ã¿¡ µ¥ÀÌÅ͸¦ ½±°Ô ´Ù·ê ¼ö ÀÖ´Ù.

2.3.1 ¸Þ½ÃÁö Å¥ÀÇ »ý¼º

¸Þ½ÃÅ¥ÀÇ »ý¼º°ú Á¢±ÙÀº msgget(2) ÇÔ¼ö¸¦ ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù.
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
 
int msgget(key_t key, int msgflg); 
 
  • key
    ¸Þ½ÃÁöÅ¥´Â Ä¿³Î¿¡¼­ °ü¸®ÇÏ´Â ÀÚ¿øÀ¸·Î ¿©·¯°³ÀÇ ¸Þ½ÃÁöÅ¥¸¦ °¡Áú ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î ¸Þ½ÃÁöÅ¥¸¦ ½Çº®ÇÒ ¼ö ÀÖ´Â key°¡ ÇÊ¿äÇÏ´Ù. ¸Þ½ÃÁöÅ¥´Â ÀÌ key¸¦ À¯ÀÏÇÑ ¹øÈ£·Î °¡Áö°í »ý¼ºµÈ´Ù.
  • msgflg
    IPC_CREAT, IPC_EXEL¿Í ±ÇÇÑÀ» ¼³Á¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. IPC_CREAT´Â ¸Þ½ÃÁöÅ¥¸¦ »ý¼ºÇÒ ¶§ »ç¿ëÇÑ´Ù. IPC_CREAT¿Í IPC_EXELÀ» ÇÔ²² »ç¿ëÇϸé, key¸¦ °¡Áø ¸Þ½ÃÁöÅ¥°¡ Á¸Àç ÇÒ¶§ ¿¡·¯¸¦ ¸®ÅÏÇÑ´Ù.

2.3.2 µ¥ÀÌÅÍ ¾²±â¿Í Àбâ

¸®´ª½º Ä¿³ÎÀº ¾²±â¿Í Àб⸦ À§Çؼ­ °¢°¢ msgsnd(2) ¿Í msgrcv(2) ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
#include <sys/types.h>  
#include <sys/ipc.h>  
#include <sys/msg.h>  
  
int msgsnd (int msqid, (void *)msgp, size_t msgsz, int msgflg)  
ssize_t msgrcv (int msqid, struct  msgbuf  *msgp,  size_t msgsz,   
                long msgtyp, int msgflg)   
 
  • msqid : msgget¸¦ ÀÌ¿ëÇØ¼­ »ý¼ºµÈ ¸Þ½ÃÁöÅ¥ Áö½Ã¹øÈ£.
  • msgp : º¸³»°íÀÚ Çϴµ¥ÀÌÅÍ.
  • msgsz : º¸³»°íÀÚ Çϴµ¥ÀÌÅÍÀÇ Å©±â
  • msgtyp : ÀаíÀÚÇÏ´Â ¸Þ½ÃÁöÀÇ Å¸ÀÔ.
    • msgtypÀÌ 0À̶ó¸é Å¥ÀÇ Ã¹¹øÂ° µ¥ÀÌÅ͸¦ ÀоîµéÀδÙ.
    • msgtyp°¡ 0º¸´Ù Å©¸é, Ä¿³ÎÀº Å¥¿¡¼­ msgtyp ¹øÈ£¸¦ °¡Áö´Â °¡Àå ¿À·¡µÈ ¸Þ½ÃÁö¸¦ ã¾Æ³»¼­ µÇµ¹·ÁÁø´Ù.
  • msgflg : IPC_NOWAIT°¡ ÁöÁ¤µÇ¸é ºñºÀ¼â¸ðµå·Î ÀÛµ¿ÇÑ´Ù. Áï À̿밡´ÉÇÑ ¸Þ½ÃÁö°¡ ¾øÀ¸¸é ±â´Ù¸®Áö ¾Ê°í ¹Ù·Î ENOMSG ¸¦ ¹ÝȯÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é Å¥¿¡ ÀÐÀ» µ¥ÀÌÅͰ¡ ½×À϶§±îÁö ±â´Ù¸°´Ù.

º¸³»°íÀÚ ÇÏ´Â µ¥ÀÌÅÍ´Â msgp¸¦ ÀÌ¿ëÇØ¼­ º¸³»´Âµ¥, µ¥ÀÌÅÍ ±¸Á¶´Â ´ÙÀ½°ú °°´Ù.

struct msgbuf  
{  
    long mtype;             // ¸Þ½ÃÁö ŸÀÔ  
    char mtext[BUFF_SIZE];  // º¸³»°íÀÚ ÇÏ´Â µ¥ÀÌÅÍ  
}  
 
º¸³»°íÀÚ ÇÏ´Â µ¥ÀÌÅÍ´Â ¾î´ÀÁ¤µµ Á¤ÇüÈ­ µÇ¾î ÀÖ´Â Ãø¸éÀÌ ÀÖ´Ù. Áï mtypeÀ» °¡Á®¾ß Çϴµ¥, À̰ÍÀ» ÀÌ¿ëÇØ¼­ ÀڱⰡ ÀÐ°í ½ÍÀº ¸Þ½ÃÁö ¸¸À» Àоî¿Ã ¼ö ÀÖ´Ù. mtypeÀ» ÀÌ¿ëÇϸé, ¿©·¯°³ÀÇ µ¥ÀÌÅÍ Å¥°¡ ÀÖ´Â °Íó·³ »ç¿ëÇÒ ¼ö ÀÖ´Ù.


2.4 °øÀ¯¸Þ¸ð¸® - Shared Memory

µ¥ÀÌÅ͸¦ °øÀ¯ÇÏ´Â ¹æ¹ý¿¡´Â Å©°Ô µÎ°¡Áö°¡ ÀÖ´Ù. Çϳª´Â Åë½ÅÀ» ÀÌ¿ëÇØ¼­ µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ´Â °ÍÀ̰í, ´Ù¸¥ Çϳª´Â µ¥ÀÌÅ͸¦ ¾Æ¿¹ °øÀ¯ wÁï ÇÔ²² »ç¿ëÇÏ´Â °ÍÀÌ´Ù. pipe, named pipe, message queue°¡ Åë½ÅÀ» ÀÌ¿ëÇÑ ¼³ºñ¶ó¸é °øÀ¯¸Þ¸ð¸®°¡ µ¥ÀÌÅÍ ÀÚü¸¦ °øÀ¯Çϵµ·Ï Áö¿øÇÏ´Â ¼³ºñ´Ù.

ÇÁ·Î¼¼½º´Â ÀڽŸ¸ÀÇ ¸Þ¸ð¸®¿µ¿ªÀ» °¡Áö°í ÀÖ´Ù. ÀÌ ¸Þ¸ð¸® ¿µ¿ªÀº ´Ù¸¥ ÇÁ·Î¼¼½º°¡ Á¢±ÙÇØ¼­ ÇԺηΠµ¥ÀÌÅ͸¦ Àаųª ¾²Áö ¸øÇϵµ·Ï Ä¿³Î¿¡ ÀÇÇØ¼­ º¸È£°¡ µÈ´Ù. ¸¸¾à ´Ù¸¥ ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸® ¿µ¿ªÀ» ħ¹üÇÏ·Á°í Çϸé Ä¿³ÎÀº ħ¹ü ÇÁ·Î¼¼½º¿¡ SIGSEGV °æ°í ½Ã±×³ÎÀ» º¸³»°Ô µÈ´Ù.

´Ù¼öÀÇ ÇÁ·Î¼¼½º°¡ µ¿½Ã¿¡ ÀÛµ¿ÇÏ´Â linux ¿î¿µÃ¼Á¦ÀÇ Æ¯¼º»ó ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸®¿µ¿ªÀº ¹Ýµå½Ã º¸È£µÇ¾î¾ß ÇÒ°ÍÀÌ´Ù. ±×·¸Áö¸¸ ¸Þ¸ð¸®¿µ¿ª¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ ´Ù¸¥ ÇÁ·Î¼¼½ºµµ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØ¾ßÇÒ °æ¿ìµµ ÀÖÀ» °ÍÀÌ´Ù. ¹°·Ð pipeµîÀ» ÀÌ¿ëÇØ¼­ µ¥ÀÌÅÍ Åë½ÅÀ» ÀÌ¿ëÇØ¼­ µ¥ÀÌÅ͸¦ Àü´ÞÇÏ´Â ¹æ¹ýµµ ÀÖ°ÚÁö¸¸ thread¿¡¼­ ó·³ ¸Þ¸ð¸®¿µ¿ªÀ» °øÀ¯ÇÑ´Ù¸é ´õ ÆíÇÏ°Ô µ¥ÀÌÅ͸¦ ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

°øÀ¯¸Þ¸ð¸®´Â ÇÁ·Î¼¼½º°£ ¸Þ¸ð¸® ¿µ¿ªÀ» °øÀ¯Çؼ­ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Çã¿ëÇÑ´Ù. ÇÁ·Î¼¼½º°¡ °øÀ¯¸Þ¸ð¸® ÇÒ´çÀ» Ä¿³Î¿¡ ¿äûÇϸé Ä¿³ÎÀº ÇØ´ç ÇÁ·Î¼¼½º¿¡ ¸Þ¸ð¸® °ø°£À» ÇÒ´çÇÑ´Ù. ÀÌÈÄ ¾î¶² ÇÁ·Î¼¼½ºµçÁö ÇØ´ç ¸Þ¸ð¸®¿µ¿ª¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù.

°øÀ¯¸Þ¸ð¸®´Â Áß°³ÀÚ°¡ ¾øÀÌ °ð¹Ù·Î ¸Þ¸ð¸®¿¡ Á¢±ÙÇÒ ¼ö Àֱ⠶§¹®¿¡ ´Ù¸¥ ¸ðµç IPCµé Áß¿¡¼­ °¡Àå ºü¸£°Ô ÀÛµ¿ÇÑ´Ù.


2.4.1 °øÀ¯¸Þ¸ð¸® ÇÔ¼öµé

°øÀ¯¸Þ¸ð¸®´Â °ø°£Àº Ä¿³ÎÀÌ °ü¸®ÇÑ´Ù. ±×·¯¹Ç·Î ÇÁ·Î¼¼½º°¡ Á¾·áµÇ¸é ¹ÝȯµÇ´Â ¸Þ¸ð¸®¿µ¿ª°ú´Â ´Þ¸® »ý¼±ÇÑ ÇÁ·Î¼¼½º°¡ Á¾·áÇÏ´õ¶óµµ °øÀ¯¸Þ¸ð¸®´Â ±×´ë·Î ³²¾ÆÀÖ°Ô µÈ´Ù.

°øÀ¯¸Þ¸ð¸®´Â ´ÙÀ½°ú °°Àº °úÁ¤À» °ÅÃļ­ »ç¿ëÇÑ´Ù.
  1. °øÀ¯¸Þ¸ð¸® ¿µ¿ªÀ» »ý¼ºÀ» ¿äûÇÑ´Ù.
  2. °øÀ¯¸Þ¸ð¸®¸¦ ÀÚ½ÅÀÇ ÇÁ·Î¼¼½º¿¡¼­ ¸ÊÇÎÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¿äûÇÑ´Ù.
  3. °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÑ´Ù.
À̸¦ À§Çؼ­ linux´Â ´ÙÀ½°ú °°Àº ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
#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) 
 
shmget : ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ °øÀ¯¸Þ¸ð¸®°øÀÇ »ý¼ºÀ» ¿äûÇÒ ¼ö ÀÖ´Ù.
  • key : °øÀ¯¸Þ¸ð¸®´Â Ä¿³Î¿¡ ÀÇÇØ¼­ °ü¸®µÇ¸ç, °¢°¢ °íÀ¯ÇÑ ½Äº°¹øÈ£ÀÎ key¸¦ °¡Áö°í ÀÖ´Ù. ÀÌ key ¹øÈ£¸¦ ÀÌ¿ëÇØ¼­ »ç¿ëÇÒ °øÀ¯¸Þ¸ð¸®¸¦ ¸í½ÃÇÒ ¼ö ÀÖ´Ù.
  • size : °øÀ¯¸Þ¸ð¸®ÀÇ ÃÖ¼Ò Å©±â´Ù. ¸¸¾à ÀÌ¹Ì »ý¼ºµÈ °øÀ¯¸Þ¸ð¸®¸¦ Àç»ç¿ëÇϰíÀÚ ÇÑ´Ù¸é Å©±â¸¦ 0À¸·Î ÇÑ´Ù.
  • shmflg : °øÀ¯¸Þ¸ð¸®´Â ´Ù¸¥ ÇÁ·Î¼¼½ºµµ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î Á¢±ÙÀ» Á¦¾îÇÒ Çʿ䰡 Àִµ¥, shmflag¸¦ ÀÌ¿ëÇØ¼­ Á¢±Ù±ÇÇÑÀ» ¸í½ÃÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ IPC_CREAT ¿Í IPC_EXCLÀ» ÀÌ¿ëÇØ¼­, »ý¼º¹æ½ÄÀ» ¸í½ÃÇÒ ¼ö ÀÖ´Ù.
    1. IPC_CREAT : key¸¦ ½Äº°¹øÈ£·Î °¡Áö´Â °øÀ¯¸Þ¸ð¸® °ø°£À» »ý¼ºÇÑ´Ù.
    2. IPC_EXCL : IPC_CREAT¿Í °°ÀÌ »ç¿ëµÇ¸ç, ¸¸¾à °øÀ¯¸Þ¸ð¸® °ø°£ÀÌ ÀÌ¹Ì Á¸ÀçÇÒ °æ¿ì error¸¦ ¸®ÅÏÇÑ´Ù.

shmat : ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÇÁ·Î¼¼½º°¡ »ý¼ºÇÑ ¸Þ¸ð¸®¸¦ »ý¼ºµÈ °øÀ¯¸Þ¸ð¸® ¿µ¿ªÀ¸·Î ¸ÊÇνÃų ¼ö ÀÖ´Ù.
  • shmid : shmgetÀ» ÀÌ¿ëÇØ¼­ »ý¼ºµÈ °øÀ¯¸Þ¸ð¸®ÀÇ ½Äº°¹øÈ£.
  • shmaddr : ¸ÊÇνÃų °øÀ¯¸Þ¸ð¸®¿µ¿ªÀÇ ÁÖ¼Ò
  • shmflg : ÀбâÀü¿ë, ÀÐ°í¾²±âÀü¿ë, ¾²±âÀü¿ëµîÀÇ Á¢±Ù¹æ½ÄÀ» Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.

shmdt : ÇÁ·Î¼¼½º°¡ ´õÀÌ»ó °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÒ ÇÊ¿ä ¾ø´Ù¸é ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¸ÊÇÎÁ¤º¸¸¦ ¾ø¾Ø´Ù. À̰ÍÀº ¾îµð±îÁö³ª ¸ÊÇÎÁ¤º¸¸¦ ¾ø¾Ö´Â °ÍÀÏ »Ó, °øÀ¯¸Þ¸ð¸®¸¦ ¾ø¾Ö´Â °ÍÀº ¾Æ´Ï´Ù.

shmctl : °øÀ¯¸Þ¸ð¸® ¿µ¿ªÀ» Á¦¾îÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. °øÀ¯¸Þ¸ð¸®¸¦ »èÁ¦Çϰųª Àá±ÝÀÇ ¼³Á¤ ÇØÁ¦ ȤÀº ±ÇÇÑÀ» º¯°æÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. µÎ¹øÂ° ÀÎÀÚÀÎ cmd¸¦ ÀÌ¿ëÇØ¼­ ¿øÇÏ´Â ÀÛ¾÷À» ³»¸± ¼ö ÀÖ´Ù.
  • IPC_STAT : °øÀ¯¸Þ¸ð¸® °ø°£ÀÇ Á¤º¸¸¦ °¡Á®¿À±â À§Çؼ­ »ç¿ëÇÑ´Ù. ³»¿ëÀº buf¿¡ ÀúÀåµÈ´Ù. ´ÙÀ½Àº struct shmid_ds ÀÇ ¼³¸íÀÌ´Ù.

    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;           // ÇöÀç Á¢±ÙÇÑ ÇÁ·Î¼¼½ºÀÇ ¼ö 
    }; 
     
  • IPC_SET : °øÀ¯¸Þ¸ð¸®ÀÇ ±ÇÇѺ¯°æÀ» À§Çؼ­ »ç¿ëµÈ´Ù. ½´ÆÛÀ¯ÀúȤÀº °øÀ¯¸Þ¸ð¸®ÀÇ »ç¿ë±ÇÇÑÀ» °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù.
  • IPC_RMID : °øÀ¯¸Þ¸ð¸®¸¦ »èÁ¦ÇÑ´Ù. ÀÌ ¸í·ÉÀ» »ç¿ëÇÑ´Ù°í ÇØ¼­ Áï½Ã °øÀ¯¸Þ¸ð¸®°¡ »èÁ¦µÇÁö´Â ¾Ê´Â´Ù. ´Ù¸¥ ÇÁ·Î¼¼½º°¡ °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇϰí ÀÖÀ» ¼öµµ Àձ⠶§¹®ÀÌ´Ù. ±×·¡¼­ °øÀ¯¸Þ¸ð¸®¸¦ ¸ÊÇÎÇØ¼­ »ç¿ëÇÏ´Â ÇÁ·Î¼¼½ºÀÇ °¹¼ö°¡ 0, Áï shm_nattch °¡ 0À϶§±îÁö ±â´Ù·È´Ù°¡ »èÁ¦µÈ´Ù. ÇØ´ç °øÀ¯¸Þ¸ð¸®¿µ¿ª¿¡ »èÁ¦Ç¥½Ã¸¦ ÇÏ´Â °ÍÀ̶ó°í º¸¸é µÉ°Í °°´Ù.


2.4.2 °øÀ¯¸Þ¸ð¸® ´Ù·ç±â

ÀÌÁ¦ °øÀ¯¸Þ¸ð¸®¸¦ ÀÌ¿ëÇØ¼­ µ¥ÀÌÅ͸¦ °øÀ¯ÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾îº¸µµ·Ï ÇϰڴÙ. ¿ì¼± check_process.c¶ó´Â ÇÁ·Î±×·¥À» Çϳª ¸¸µé °ÍÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ÇöÀç ½Ã½ºÅÛ¿¡¼­ ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½ºÀÇ °¹¼ö¸¦ 1ÃÊ´ÜÀ§·Î °è»êÇØ¼­ °øÀ¯¸Þ¸ð¸® ¿µ¿ª¿¡ ¾²´Â ÀÏÀ» ÇÑ´Ù. ´ÙÀ½À¸·Î get_process_num.cÀ̶ó´Â ÇÁ·Î±×·¥À» ¸¸µé °Çµ¥, ÀÌ ÇÁ·Î±×·¥Àº °øÀ¯¸Þ¸ð¸® ¿µ¿ª¿¡ Á¢±ÙÇØ¼­ ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½ºÀÇ °¹¼ö¸¦ ¾ò¾î¿Í¼­ È­¸é¿¡ Ãâ·ÂÇÏ´Â ÀÏÀ» ÇÑ´Ù.

ÇÁ·Î¼¼½ºÀÇ °¹¼ö´Â popen(3)ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­, ps(1)¸¦ ½ÇÇà½ÃŲ ´ÙÀ½ ¶óÀμö¸¦ °è»êÇØ¼­ ¾ò¾î¿Àµµ·Ï ÇϰڴÙ. ÇÁ·Î¼¼½º °¹¼ö´Â procÆÄÀϽýºÅÛÀ» ÀÌ¿ëÇØ¼­ ¾ò¾î¿Ã ¼öµµ ÀÖ°ÚÁö¸¸ ¾ÆÁ÷ proc¸¦ ´Ù·çÁö ¾ÊÀº°ü°è·Î °£´ÜÇÑ popenÀ» ÀÌ¿ëÇϱâ·Î Çß´Ù.

001  #include <sys/ipc.h>
002  #include <sys/shm.h>
003  #include <string.h>
004  #include <unistd.h>
005  #include <stdlib.h>
006  #include <stdio.h>
007  
008  int main(int argc, char **argv)
009  {
010      int shmid;
011      void *shared_memory = (void *)0;
012      FILE *fp;
013      char buff[1024];
014      int skey = 5678;
015  
016      int *process_num;
017      int local_num;
018  
019      // °øÀ¯¸Þ¸ð¸® °ø°£À» ¸¸µç´Ù.
020      shmid = shmget((key_t)skey, sizeof(int), 0666|IPC_CREAT);
021      if(shmid == -1)
022      {
023          perror("shmget failed : ");
024          exit(0);
025      }
026  
027      // ipcs(s)¸¦ ÀÌ¿ëÇØ¼­ È®ÀÎÇϱâ À§ÇÔ.
028      printf("Key %x\n", skey);
029  
030      // °øÀ¯¸Þ¸ð¸®¸¦ ¸ÊÇÎÇÑ´Ù.
031      shared_memory = shmat(shmid, (void *)0, 0);
032      if(!shared_memory)
033      {
034          perror("shmat failed : ");
035          exit(0);
036      }
037  
038      process_num = (int *)shared_memory;
039  
040      for (;;)
041      {
042          local_num = 0;
043          fp = popen("ps axh", "r");
044          if(fp != NULL)
045          {
046              while(fgets(buff,1024, fp))
047              {
048                  local_num++;
049              }
050          }
051          *process_num = local_num;
052          printf("process_num is %d\n", (int)*process_num);
053          sleep(5);
054          pclose(fp);
055      }
056  }
057  
20 shmget À» ÀÌ¿ëÇØ¼­ °øÀ¯¸Þ¸ð¸® °ø°£À» »ý¼ºÇß´Ù. key ¹øÈ£´Â 5678·Î Çß´Ù.
28 skey¸¦ 16Áø¼ö·Î Ç¥½ÃÇß´Ù. ¸®´ª½º´Â ipcs(1)¶ó´Â ipc °ü¸® ÇÁ·Î±×·¥À» Á¦°øÇϴµ¥, ¿©±â¿¡¼­´Â key ¹øÈ£°¡ 16Áø¼ö·Î Ç¥½ÃµÇ±â ¶§¹®¿¡ È®ÀÎÀ» ½±µµ·Ï Çϱâ À§ÇÔÀÌ´Ù.
31 shmat¸¦ ÀÌ¿ëÇØ¼­ °øÀ¯¸Þ¸ð¸®¸¦ ¸ÊÇÎÇÑ´Ù.
40 ~ 50 popen(3)À» ÀÌ¿ëÇØ¼­ ps(1)¸¦ ½ÇÇà½Ã۰í, ¶óÀμö¸¦ °è»êÇß´Ù. ¶óÀμö°¡ ÇÁ·Î¼¼½ºÀÇ °¹¼öÀÌ´Ù. ÇÁ·Î¼¼½ºÀÇ °¹¼ö´Â °øÀ¯¸Þ¸ð¸® °ø°£¿¡ ÀúÀåÇÑ´Ù. ÀÌÁ¦ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼­ °øÀ¯¸Þ¸ð¸® °ø°£¿¡ Á¢±ÙÇØ¼­ ÇÁ·Î¼¼½ºÀÇ °¹¼ö¸¦ ¾ò¾î¿Ã ¼ö ÀÖ°Ô µÇ¾ú´Ù.

ÀÌÁ¦ °øÀ¯¸Þ¸ð¸® °ø°£¿¡ Á¢±ÙÇØ¼­ ÇÁ·Î¼¼½ºÀÇ °¹¼ö¸¦ Àоî¿À´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. ÀÌ ÇÁ·Î±×·¥ÀÇ À̸§Àº read_process_num.c ·Î ÇϰڴÙ.

001  #include <sys/ipc.h>
002  #include <sys/shm.h>
003  #include <string.h>
004  #include <unistd.h>
005  #include <stdlib.h>
006  #include <stdio.h>
007  
008  int main(int argc, char **argv)
009  {   
010      int shmid;
011      int skey = 5678;
012      
013      int *shared_memory;
014      
015      shmid = shmget((key_t)skey, sizeof(int), 0666);
016      if(shmid == -1)
017      {
018          perror("shmget failed\n");
019          exit(0);
020      }
021      
022      shared_memory = shmat(shmid, (void *)0, 0);
023      if(!shared_memory)
024      {
025          perror("shmat failed : ");
026          exit(0);
027      }
028      printf("shm id : %d\n", shmid);
029      while(1)
030      {   
031          int num = *shared_memory;
032          printf("Process Num : %d\n", num);
033          sleep(1);
034      }
035  }
036  
  • 11 : »ç¿ëÇÒ °øÀ¯¸Þ¸ð¸®ÀÇ Å°¹øÈ£´Â 5678 ÀÌ´Ù.
  • 15~19 : shmget ¸¦ ÀÌ¿ëÇØ¼­, °øÀ¯¸Þ¸ð¸® ½Äº°ÀÚ¸¦ ¾ò¾î¿Â´Ù.
  • 22~27 : shmat ¸¦ ÀÌ¿ëÇØ¼­ °øÀ¯¸Þ¸ð¸®¸¦ ¸ÅÇÎÇÑ´Ù.
  • 29~34 : 1ÃÊ °£°ÝÀ¸·Î µ¹¸é¼­ °øÀ¯¸Þ¸ð¸®ÀÇ ³»¿ëÀ» Àоî¿Â´Ù.

check_process ¸¦ ¸ÕÀú ½ÇÇà½Ã۰í, ±×ÈÄ get_process_numÀ» ½ÇÇà½Ã۸é, °øÀ¯¸Þ¸ð¸®¿¡ ÀÖ´Â ÇÁ·Î¼¼½º°¹¼ö¸¦ Àоî¿À´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

2.4.3 ÀåÁ¡°ú ÇѰè

°øÀ¯¸Þ¸ð¸®´Â ºñ±³Àû °£´ÜÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ Ä¿³Î¸Þ¸ð¸®¿µ¿ª¿¡¼­ °ü¸®Çϱ⠶§¹®¿¡ ¸Å¿ì ºü¸£°Ô Á¢±Ù°¡´ÉÇÏ´Ù´Â ÀåÁ¡µµ °¡Áø´Ù. ±×·¯³ª Ä¿³Î¼³Á¤¿¡ Á¾¼ÓÀûÀ̱⠶§¹®¿¡, »ç¿ëÇϱâÀü¿¡ Ä¿³Î¿¡¼­ Çã¿ëÇϰí ÀÖ´Â °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®ÀÇ Å©±â¸¦ È®ÀÎÇØ¾ß ÇÑ´Ù.

ÀϹÝÀûÀ¸·Î ¸®´ª½ºÄ¿³ÎÀÇ ÃʱⰪÀº 32MB·Î ÀâÇôÀÖ´Ù. »ó´çÈ÷ ÀÛÀº Å©±âÀε¥, ´ÙÇàÀÌ 2.6 ÀÌ»óÀÇ Ä¿³Î¿¡¼­´Â ´ÜÀÏ °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®ÀÇ Å©±â¸¦ 1GB±îÁö »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Áö¿øµÇ°í ÀÖ´Ù. 1GB¸é ¿Ø¸¸ÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ» ´Ù·ç´Âµ¥¿¡´Â Å« ¹®Á¦ ¾øÀ» °ÍÀ¸·Î »ý°¢µÈ´Ù.

°øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®ÀÇ Å©±â´Â /proc/sys/kernel/shmmax ¿¡¼­ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
# cat shmmax  
33554432 
 
´ÙÀ½°ú °°ÀÌ ¼¼±×¸ÕÆ®ÀÇ Å©±â¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù. 512MB·Î È®ÀåÇÏ°í ½Í´Ù¸é, ¾Æ·¡¿Í °°ÀÌ ÆÄÀÏ¿¡ ½áÁֱ⸸ ÇÏ¸é µÈ´Ù.
# echo "536870912" > /proc/sys/kernel/shmmax 
ȤÀº 
# echo "512*1024*1024" | bc(3) > /proc/sys/kernel/shmmax 
 

°øÀ¯¸Þ¸ð¸®´Â ¸Þ½ÃÁö Àü´Þ ¹æ½ÄÀÌ ¾Æ´Ï±â ¶§¹®¿¡ µ¥ÀÌÅ͸¦ Àоî¾ßµÇ´Â ½ÃÁ¡À» ¾Ë ¼ö ¾ø´Ù´Â ´ÜÁ¡À» °¡Áø´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ´Ù¸¥ IPC ¼³ºñµéÀ» ÀÀ¿ëÇØ¾ß ÇÑ´Ù.

2.5 Memory Map

¸Þ¸ð¸®¸Êµµ °øÀ¯¸Þ¸ð¸® °ø°£°ú ¸¶Âù°¡Áö·Î ¸Þ¸ð¸®¸¦ °øÀ¯ÇÑ´Ù´Â Ãø¸é¿¡ À־´Â ¼­·Î ºñ½ÁÇÑ Ãø¸éÀÌ ÀÖ´Ù. ´Ù¸¥Á¡Àº ¸Þ¸ð¸®¸ÊÀÇ °æ¿ì ¿­¸°ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ¸ÊÇνÃÄѼ­, °øÀ¯ÇÑ´Ù´Â Á¡ÀÏ °ÍÀÌ´Ù. ÆÄÀÏÀº ½Ã½ºÅÛÀü¿ªÀûÀÎ ÀÚ¿øÀÌ´Ï ¼­·Î ´Ù¸¥ ÇÁ·Î¼¼½ºµé³¢¸® µ¥ÀÌÅ͸¦ °øÀ¯Çϴµ¥ ¹®Á¦°¡ ¾øÀ» °ÍÀÓÀ» ¿¹»óÇÒ ¼ö ÀÖ´Ù.

¸Þ¸ð¸®¸ÊÀ¸·Î ÇÒ ¼ö ÀÖ´Â ÀϵéÀº ´ÙÀ½°ú °°´Ù.

2.5.1 Memory map »ý¼º°ú »èÁ¦

¸®´ª½º´Â mmap(2)¶ó´Â ½Ã½ºÅÛ ÇÔ¼ö¸¦ Á¦°ø ÇÑ´Ù. ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­, ¿­·ÁÁø ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ¸ÊÇνÃų ¼ö ÀÖ´Ù.
#include <sys/mman.h> 
 
void *mmap(void *addr, size_t length, int prot, int flags, 
       int fd, off_t offset); 
 
  • addr : NULLÀϰæ¿ì ¸ÅÇνÃų ¸Þ¸ð¸® ¿µ¿ªÀ» Ä¿³ÎÀÌ ¼±ÅÃÇÑ´Ù. À̹ÝÀûÀ¸·Î NULLÀ» »ç¿ëÇÏ¸é µÈ´Ù. mmapÀº ¸ÅÇÎµÈ ¸Þ¸ð¸®¸¦ °¡¸®Å°´Â ÁÖ¼Ò¸¦ ¹ÝȯÇÑ´Ù.
  • length : offset¿¡¼­ ½ÃÀÛÇÏ¿© length ¸¸Å­À» ÁÖ¼Ò·Î ´ëÀÀÇϵµ·Ï ÇÑ´Ù. º¸ÅëÀº 0À¸·Î ÁöÁ¤ÇÑ´Ù.
  • prot : ¸Þ¸ð¸® º¸È£¸ðµå¸¦ ¼³Á¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.
    PROT_EXEC ÆäÀÌÁö´Â ½ÇÇàµÉ ¼ö ÀÖ´Ù.
    PROT_READ ÆäÀÌÁö´Â ÀÐÀ» ¼ö ÀÖ´Ù.
    PROT_WRITE ÆäÀÌÁö´Â ¾²¿©Áú ¼ö ÀÖ´Ù.
    PROT_NONE ÆäÀÌÁö´Â Á¢±ÙµÉ ¼ö ¾ø´Ù.
  • fd : ´ëÀÀ½Ãų ÆÄÀÏÀÇ ÆÄÀÏÁöÁ¤¹øÈ£
  • flag : ´ëÀÀµÇ´Â °´Ã¼ÀÇ Å¸ÀÔ, ÆäÀÌÁö º¹»çº»¿¡ ´ëÇÑ ¼öÁ¤ÀÌ ´Ù¸¥ ÇÁ·Î¼¼½ºµµ °¡´ÉÇÏ°Ô ÇÒ°ÍÀÎÁö, ȤÀº º¹»çÇÒ °ÍÀÎÁö, µ¶¸³µÈ ¸Þ¸ð¸® ¿µ¿ªÀ¸·Î º¹»ç½Ãų °ÇÁöµîÀ» °áÁ¤ ÇÑ´Ù.
    MAP_FIXED ÁöÁ¤µÈ ÁÖ¼Ò ÀÌ¿ÜÀÇ ´Ù¸¥ ÁÖ¼Ò¸¦ ¼±ÅÃÇÏÁö ¾Ê´Â´Ù. »ç¿ëÇÏÁö ¾Ê´Â°Ô ÁÁ´Ù.
    MAP_SHARED ´Ù¸¥ ÇÁ·Î¼¼½ºµé°ú ´ëÀÀ¿µ¿ªÀ» °øÀ¯ÇÑ´Ù.
    MAP_PRIVATE copy-on-write ÇÑ´Ù. Áï µ¶¸³ÀûÀ¸·Î ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ º¹»çµÈ´Ù. ´ëÀÀ¿µ¿ªÀÌ °øÀ¯µÇÁö ¾Ê´Â´Ù.

2.5.2 ¿¹Á¦ : »ý»êÀÚ

°£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸±â·Î Çß´Ù. ÀÌ ÇÁ·Î±×·¥Àº mymmap.mmÀ̶ó´Â ÆÄÀÏÀ» ¸¸µé°í ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃŲ´Ù. ´ëÀÀ½ÃŲ ¸Þ¸ð¸®¿¡´Â intÇü µ¥ÀÌÅ͸¦ ¾´´Ù.
001  #include <stdio.h>
002  #include <stdlib.h>
003  #include <string.h>
004  #include <unistd.h>
005  #include <fcntl.h>
006  #include <sys/mman.h>
007  
008  int main()
009  {
010      int fd;
011      int *pmmap;
012      int i;
013      fd = open("mymmap.mm", O_RDWR|O_CREAT, 0666);
014      if(fd < 0)
015      {
016          perror("open");
017          exit(1);
018      }
019      ftruncate(fd, 4096);
020  
021      pmmap = (int *)mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
022      if((unsigned)pmmap == (unsigned)-1)
023      {
024          perror("mmap");
025          exit(1);
026      }
027  
028      for(i = 0; i < 100; i++)
029      {
030          pmmap[i] = i*i; 
031      }
032      pmmap[i+1] = -1; 
033      getchar();
034      munmap(pmmap, 4096);
035      close(fd);
036      return 0;
037  }
038  
  1. 13 : open(2) ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ mymap.mm ÆÄÀÏÀ» ¿ÀÇÂÇÑ´Ù.
  2. 19 : ÆÄÀÏÀÌ ¸Þ¸ð¸®¿¡ ´ëÀÀµÇ°í µ¥ÀÌÅͰ¡ ÀúÀåµÇ±â ¶§¹®¿¡, µ¥ÀÌÅÍÀÇ »çÀÌÁ ¿¹»óÇØ¼­ Àû´çÇÑ ÆÄÀÏÅ©±â¸¦ ¸¸µé¾îÁà¾ß ÇÑ´Ù. malloc(2)´ë½Å »ç¿ëÇÏ´Â °Å¶ó°í º¼ ¼ö ÀÖ´Ù. ÆÄÀÏÀÇ Å©±â´Â 4096À¸·Î Àâ¾Ò°í, ftruncate(2)¶ó´Â ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÆÄÀÏÀ» »ý¼ºÇß´Ù.
  3. 21 : mmap(2)¸¦ ÀÌ¿ëÇØ¼­ mymap.mm ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃŲ´Ù.
  4. 28-31 : ¸¸µé¾îÁø ¸Þ¸ð¸®¸Ê¿¡ intÇü µ¥ÀÌÅ͸¦ ¾´´Ù. 100°³ÀÇ °ªÀ» ÀúÀåÇϱâ·Î ÇßÀ¸´Ï, 100 * sizeof(int) ¸¸Å­ÀÇ °ø°£ÀÌ »ç¿ëµÉ °ÍÀÌ´Ù.
  5. 32 : ¸¶Áö¸·¿¡ -1À» ÀÔ·ÂÇÑ´Ù. ¹è¿­ÀÇ ³¡ÀÓÀ» ¾Ë·ÁÁÖ±â À§Çؼ­ »ç¿ëÇß´Ù.
  6. 33 : getchar(3)ÇÔ¼ö·Î Űº¸µå ÀÔ·ÂÀ» ±â´Ù¸°´Ù.

2.5.3 ¿¹Á¦ : ¼ÒºñÀÚ

ÀÌ ÇÁ·Î±×·¥Àº À§¿¡¼­ ¸¸µé¾îÁø ¸Þ¸ð¸®¸Ê ÆÄÀÏÀÇ µ¥ÀÌÅ͸¦ Àоî¿À´Â ÀÏÀ» ÇÑ´Ù.
001  #include <sys/stat.h>
002  #include <sys/mman.h>
003  #include <unistd.h>
004  #include <stdlib.h>
005  #include <fcntl.h>
006  
007  int main(int argc, char **argv)
008  {
009      int fd;
010      int i=0;
011      char *file = NULL;
012      char *linebuf;
013      int *maped;
014      int flag = PROT_WRITE | PROT_READ;
015  
016      if ((fd = open("mymmap.mm", O_RDWR, 0666)) < 0)
017      {
018          perror("File Open Error");
019          exit(1);
020      }
021  
022      // mmap¸¦ ÀÌ¿ëÇØ¼­ ¿­¸° ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃŲ´Ù. 
023      // fileÀº ´ëÀÀµÈ ÁÖ¼Ò¸¦ °¡¸®Å°°í, fileÀ» ÀÌ¿ëÇØ¼­ ÇÊ¿äÇÑ ÀÛ¾÷À»  
024      // ÇÏ¸é µÈ´Ù.  
025      if ((maped =
026          (int *) mmap(0, 4096, flag, MAP_SHARED, fd, 0)) == -1)
027      {
028          perror("mmap error");
029          exit(1);
030      }
031  
032      while(1)
033      {
034          if (maped[i] == -1) break;
035          printf("> %d\n",maped[i]);
036          i++;
037      }
038      close(fd);
039  }
040  
  1. 32-37 : ¹è¿­ÀÇ ³¡. Áï ¹è¿­ÀÇ °ªÀÌ -1ÀÎ°Ô È®À뵃 ¶§±îÁö ·çÇÁ¸¦ µ¹¸é¼­ ¸Þ¸ð¸®¸Ê¿¡ ÀúÀåµÈ µ¥ÀÌÅ͸¦ ÀÐ¾î ¿Â´Ù.

2.5.4 ¸Þ¸ð¸® ¸ÊÀÇ ÀåÁ¡

¸Þ¸ð¸®¸ÊÀº ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃÅ´À¸·Î½á, ÇÁ·Î¼¼½º°£ ¸Þ¸ð¸®¸¦ ¼­·Î °øÀ¯ÇÒ ¼ö ÀÖ´Ù´Â IPC·Î¼­ÀÇ ÀåÁ¡À» °¡Áø´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. À̿ܿ¡ ¶Ç´Ù¸¥ ÀåÁ¡ÀÌ Àִµ¥, ÆÄÀÏ ÀÔÃâ·Â¿¡¼­ÀÇ ºñ¿ëÀ» ÁÙÀÏ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. ÆÄÀÏ¿¡¼­ÀÇ ÀÛ¾÷Àº open(2), read(2), write(2), lseek(2)¿Í °°Àº »ó´çÇÑ ºñ¿ëÀ» ÁöºÒÇÏ´Â ÇÔ¼ö¸¦ ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù. ¸Å¸ð¸® ¸ÊÀ» ÀÌ¿ëÇϸé ÀÌ·¯ÇÑ ºñ¿ëÀ» ÁÙÀÏ ¼ö ÀÖ´Ù.

¶ÇÇϳªÀÇ ÀåÁ¡Àº ¸Þ¸ð¸®ÀÇ ³»¿ëÀ» ÆÄÀÏ·Î ³²±æ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. ¸Þ¸ð¸®ÀÇ ³»¿ëÀº Èֹ߼ºÀ¸·Î ÇÁ·Î¼¼½º°¡ Á¾·áµÇ¸é Áõ¹ßÇÏ°Ô µÈ´Ù. º¸Åë ¸Þ¸ð¸®ÀÇ Á¤º¸¸¦ ³²°Ü¾ßÇÒ Çʿ䰡 »ý±â¸é ÇÁ·Î¼¼½ºÀÇ Á¾·áÀü¿¡ ÆÄÀÏ·Î ³²±â´Âµ¥, ¸Þ¸ð¸®¸ÊÀÇ °æ¿ì ÆÄÀÏ·Î ´ëÀÀµÇ±â ¶§¹®¿¡, ºñ±³Àû ¾ÈÀüÇÏ°Ô Á¤º¸¸¦ ³²±æ ¼ö ÀÖ´Ù´Â ÀåÁ¡µµ °¡Áø´Ù.

2.6 ¼¼¸¶Æ÷¾î - Semaphore

¼¼¸¶Æ÷¾î´Â ÀüÅëÀûÀÎ IPC ¼³ºñÀÇ Çϳª·Î Á¦°øµÇ±â´Â ÇÏÁö¸¸ ´Ù¸¥ IPC ¼³ºñ¿Í´Â ¾à°£ ´Ù¸¥ Ư¡À» °¡Áø´Ù. ´Ù¸¥ IPC ¼³ºñµéÀº ¸ðµÎ°¡ µ¥ÀÌÅ͸¦ °øÀ¯Çϱâ À§ÇÑ Æ¯Â¡À» °¡Áö´Âµ¥ ¹ÝÇØ¼­ ¼¼¸¶Æ÷¾î´Â ÀÚ¿ø¿¡ ´ëÇÑ Á¢±ÙÀ» Á¦¾îÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù. ¼¼¸¶Æ÷¾î ±× ÀÚü°¡ µ¥ÀÌÅ͸¦ °øÀ¯Çϱâ À§ÇÑ ¾î¶² °ø°£À» Á¦°øÇÏÁö´Â ¾Ê´Â´Ù´Â ¾ê±â´Ù. ´ë°ÔÀÇ °æ¿ì¿¡´Â ´Ù¸¥ IPC¼³ºñ¸¦ Áö¿øÇϱâ À§ÇÑ ÀÌÀ¯·Î »ç¿ëµÈ´Ù.

¸Å¸ð¸®¸ÊÀ» ¿¹·Î µé¾îº¸ÀÚ. ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ ¸Þ¸ð¸®¸Ê¿¡ ¿¢¼¼½º¸¦ ÇÑ´Ù¸é, ¸Þ¸ð¸®¸Ê¿¡ Çѹø¿¡ Çϳª¾¿ÀÇ ÇÁ·Î¼¼½º¸¸ Á¢±ÙÀÌ °¡´ÉÇϵµ·Ï Á¦¾îÇÒ Çʿ䰡 ÀÖÀ» °ÍÀÌ´Ù. ±×·¸Áö ¾Ê´Ù¸é ´ÙÀ½°ú °°Àº ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.

count ++ ÇÏ´Â ÇÁ·Î±×·¥
  1. ¸Þ¸ð¸®¸Ê¿¡ 0ÀÌ ÀúÀåµÇ¾î ÀÖ´Ù. count = 0;
  2. A ÇÁ·Î±×·¥ÀÌ ¸Þ¸ð¸®¸ÊÀÇ °ªÀ» ÀоîµéÀδÙ. count = 0;
  3. B ÇÁ·Î±×·¥ÀÌ ¸Þ¸ð¸®¸ÊÀÇ °ªÀ» ÀоîµéÀδÙ. count = 0;
  4. A ÇÁ·Î±×·¥ÀÌ ¸Å¸ð¸®¸ÊÀÇ °ª + 1 ÇÑ´Ù. count = 1;
  5. B ÇÁ·Î±×·¥ÀÌ ¸Å¸ð¸®¸ÊÀÇ °ª + 1 ÇÑ´Ù. count = 1;

¹º°¡ À߸øµÇ¾ú´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. A¿Í B ÇÁ·Î¼¼½º°¡ count++ À» ÇßÀ¸´Ï, count ¿¡´Â 2°¡ µé¾îÀÖ¾î¾ß °ÚÁö¸¸ Á¢±ÙÁ¦¾î°¡ µÇÁö ¾ÊÀº °ü°è·Î count¿¡ 1ÀÌ µé¾î ÀÖ´Ù.

ÀÌ ¹®Á¦´Â ƯÁ¤ ¿µ¿ª¿¡ ´ÜÁö ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸ ÁøÀÔ°¡´ÉÇϵµ·Ï ÇÏ´Â °ÍÀ¸·Î ÇØ°áÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

count ++ ÇÏ´Â ÇÁ·Î±×·¥ : Á¢±ÙÁ¦¾î¸¦ ÇÑ ¹öÀü
  1. ¸Þ¸ð¸®¸Ê¿¡ 0ÀÌ ÀúÀåµÇ¾î ÀÖ´Ù. count = 0;
  2. A ÇÁ·Î±×·¥ÀÌ ¸Þ¸ð¸®¸ÊÀÇ °ªÀ» ÀоîµéÀδÙ. count = 0;
  3. ´Ù¸¥ ÇÁ·Î¼¼½º°¡ Á¢±ÙÇÏÁö ¸øÇϵµ·Ï ÇÑ´Ù.
    1. B µµ ¸Þ¸ð¸®¸ÊÀÇ °ªÀ» ÀÐÀ»·Á°í ÇÏÁö¸¸ Á¢±ÙÀ» ÇÏÁö ¸øÇϱ⠶§¹®¿¡ ´ë±âÇÑ´Ù.
  4. A ÇÁ·Î±×·¥ÀÌ ¸Å¸ð¸®¸ÊÀÇ °ª + 1 ÇÑ´Ù. count = 1;
  5. ´Ù¸¥ ÇÁ·Î¼¼½º°¡ Á¢±ÙÇϵµ·Ï Çã¿ëÇÑ´Ù.
  6. ±â´Ù¸®´ø B ÇÁ·Î¼¼½º°¡ ¸Þ¸ð¸®¸ÊÀÇ °ªÀ» ÀоîµéÀδÙ. count = 1;
  7. B ÇÁ·Î¼¼½º°¡ +1 ¿¬»êÀ» ÇÑ´Ù. count = 2;
¹Ù·Î ¼¼¸¶Æ÷¾î¸¦ ÀÌ¿ëÇØ¼­ ÇÒ ¼ö ÀÖ´Â ÀÏÀÌ´Ù.

2.6.1 ¼¼¸¶Æ÷¾îÀÇ ÀÛµ¿¿ø¸®

¼¼¸¶Æ÷¾î S´Â Á¤¼ö°ªÀ» °¡Áö´Â º¯¼ö¸ç, P¿Í V µÎ°³ÀÇ ¸í·É¿¡ ÀÇÇØ¼­ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. P´Â Å×½ºÆ®¸¦ À§ÇÑ ¸í·ÉÀ̸ç V´Â Áõ°¡¸¦ À§ÇÑ ¸í·ÉÀÌ´Ù.

ÁøÀÔÀ» Á¦ÇÑÇØ¾ß ÇÏ´Â ¿µ¿ªÀ» ÀӰ迵¿ªÀ̶ó°í Çϸé, P´Â ÀӰ豸¿ª¿¡ ÁøÀÔÇϱâ À§Çؼ­ ¼öÇàÀ̵ǰí, V´Â (ÀÛ¾÷À» ¸¶Ä¡°í)ÀӰ迵¿ª¿¡¼­ ³ª¿Ã¶§ ¼öÇàµÈ´Ù. ´ç¿¬È÷ P¿Í V ¸í·ÉÀÇ ¼öÇàÀº ¿øÀÚ¼ºÀ» º¸ÀåÇØ¾ß ÇÑ´Ù. ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ P¿Í V¸¦ ÀÌ¿ëÇØ¼­ ¼¼¸¶Æ÷¾î °ªÀ» º¯°æÇÒ¶§, ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ÀÌ °ªÀ» º¯°æÇÒ ¼ö ÀÖÀ¸¸é ¾ÈµÈ´Ù.

  1. P(S) ¸¦ ÀÌ¿ëÇØ¼­, ¼¼¸¶Æ÷¾îÀÇ °ªÀ» Å×½ºÆ®ÇÑ´Ù.
    • ¼¼¸¶Æ÷¾îÀÇ °ªÀÌ 1À̶ó¸é, ÀӰ迵¿ª¿¡ µé¾î°¡°Ô µÈ´Ù.
    • ¼¼¸¶Æ÷¾îÀÇ °ªÀº 1¸¸Å­ °¨¼ÒÇÑ´Ù.
    • ÀÌÁ¦ ¼¼¸¶Æ÷¾îÀÇ °ªÀº 0À̱⠶§¹®¿¡ ´Ù¸¥ ÇÁ·Î¼¼½º´Â ÀӰ迵¿ª¿¡¼­ ÀÔ±¸¿¡¼­ ´ë±âÇØ¾ß ÇÑ´Ù.
  2. V(S) ¸¦ ÀÌ¿ëÇØ¼­, ¼¼¸¶Æ÷¾îÀÇ °ªÀ» Áõ°¡ÇÑ´Ù.
    • ÀÛ¾÷À» ¸¶Ä¡°í ÀӰ迵¿ªÀ» ºüÁ®³ª°¥¶§, ¼¼¸¶Æ÷¾îÀÇ °ªÀ» 1Áõ°¡ÇÑ´Ù.
    • ¼¼¸¶Æ÷¾îÀÇ °ªÀÌ 1ÀÌ µÇ¾ú±â ¶§¹®¿¡, ´ë±âÇÏ´ø ÇÁ·Î¼¼½º°¡ ÀӰ迵¿ª¿¡ ÁøÀÔÇÒ ¼ö ÀÖ°Ô µÈ´Ù.

2.6.2 ¼¼¸¶Æ÷¾îÀÇ »ç¿ë

¼¼¸¶Æ÷¾î´Â 3°³ÀÇ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. Áï
  1. ¼¼¸¶Æ÷¾îÀÇ »ý¼º : ÀÚ¿øÀ» »ç¿ëÇϱâ À§Çؼ­ ¾Ë¸²ÆÇÀ» ¸¸µå´Â °Å¶ó°í º¸¸é µÈ´Ù.
  2. ¼¼¸¶Æ÷¾îÀÇ È¹µæ ¹× µÇµ¹·ÁÁÖ±â : ¾Ë¸²ÆÇÀ» »ç¿ë°¡´É/ºÒ°¡´ÉÀ¸·Î ¸¸µå´Â ÀÛ¾÷
  3. ¼¼¸¶Æ÷¾îÀÇ ¼¼ºÎ°ª Á¦¾î

#include <sys/types.h>  
#include <sys/ipc.h>  
#include <sys/sem.h>  
  
int semget(key_t key, int nsems, int semflg);  
int semop (int semid, struct sembuf *sops, unsigned nsops);  
int semctl(int semid, int semnum, int cmd, union semun arg);  
 

¼¼¸¶Æ÷¾î´Â Ä¿³ÎÀÌ °ü¸®ÇÑ´Ù. semgetÀ» ÀÌ¿ëÇØ¼­ Ä¿³Î¿¡ ¼¼¸¶Æ÷¾îÀÇ »ý¼º ȤÀº ±âÁ¸¿¡ ¸¸µé¾îÁø ¼¼¸¶Æ÷¾îÀÇ Á¢±ÙÀ» ¿äûÇÒ ¼ö ÀÖ´Ù. semgetÀÇ ÀÎÀÚ´Â ´ÙÀ½°ú °°´Ù.
  • key : ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇϱâ À§ÇÑ key °ª
  • nsems : ¼¼¸¶Æ÷¾î °è¼ö·Î Á¢±ÙÁ¦ÇÏÇÏ·Á´Â ÀÚ¿øÀÇ ¼ö
  • semflg : ¼¼¸¶Æ÷¾î µ¿ÀÛÁ¦¾î¸¦ À§ÇÑ ¿É¼Ç
    IPC_CREATE key¿¡ ÇØ´çÇÏ´Â ¼¼¸¶Æ÷¾î°¡ ¾ø´Ù¸é »õ·Î »ý¼ºÇÑ´Ù.
    IPC_EXCL ¼¼¸¶Æ÷¾î°¡ ÀÌ¹Ì ÀÖ´Ù¸é, ¿¡·¯¸¦ ¸®ÅÏÇØ¼­ ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇÏÁö ¸øÇÑ´Ù. ÀÌ¹Ì ¿­·ÁÁø ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇÏ·Á¸é ÀÌ ¿É¼ÇÀÌ ¾ø¾î¾ß ÇÑ´Ù.

2.6.3 ¼¼¸¶Æ÷¾î ¿¹Á¦ ÇÁ·Î±×·¥

#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 
#include <pthread.h> 
 
#include <sys/types.h> 
#include <sys/sem.h> 
#include <sys/ipc.h> 
#include <stdio.h> 
 
#define MAX_THREAD  2 
 
int count = 0; 
 
void *myThreadFunc(void *data); 
 
struct sembuf mysem_open = {0, -1, SEM_UNDO}; 
struct sembuf mysem_close = {0, 1, SEM_UNDO}; 
 
union snum 
{ 
    int val; 
}; 
 
static int semid; 
 
int main(int argc, char **argv) 
{ 
    int thr_id; 
    int status; 
    int i; 
    union snum s_union; 
    pthread_t pt[MAX_THREAD]; 
 
    semid = semget(2345, 1, 0600|IPC_CREAT); 
 
    if(semid == -1) 
    { 
        perror("semget error"); 
        return 1; 
    } 
 
    s_union.val = 1; 
    if(semctl(semid, 0, SETVAL, s_union) == -1) 
    { 
        return 1; 
    } 
 
    for(i = 0; i < MAX_THREAD; i++) 
    { 
        thr_id = pthread_create(&pt[i], NULL, myThreadFunc, (void *)&i); 
        if(thr_id < 0) 
        { 
            perror("Thread Create Error"); 
            return 1; 
        } 
        sleep(1); 
    }     
    for(i = 0; i < MAX_THREAD; i++) 
    { 
        pthread_join(pt[i], NULL); 
    }     
} 
 
void *myThreadFunc(void *data) 
{ 
    int thread_num = *(int *)data; 
    int lnum; 
    printf("Thread Create %d\n", thread_num); 
    while(1) 
    { 
        semop(semid, &mysem_open, 1); 
        lnum = count; 
        sleep(1); 
        lnum = lnum+1;  
        count = lnum; 
        printf("[%d] count : %d\n", thread_num, count); 
        semop(semid, &mysem_close, 1); 
    } 
} 
 
 
ÀÌ ÇÁ·Î±×·¥Àº Ä«¿îÆÃ ÇÁ·Î±×·¥ÀÌ´Ù. µÎ °³ÀÇ ½º·¹µå°¡ ÇϳªÀÇ count º¯¼ö¿¡ Á¢±ÙÇϴµ¥, ¼¼¸¶Æ÷¾î¸¦ ÀÌ¿ëÇØ¼­ Á¢±ÙÀ» Á¦¾îÇϰí ÀÖ´Ù. ½º·¹µå ÇÔ¼öÀÎ myThreadFunc¿¡¼­ semop ºÎºÐÀ» ÁÖ¼® ó¸®ÇÑ ÈÄ ¾î¶² °á°ú°¡ ³ª¿À´ÂÁö È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ.

2.6.4 ¼¼¸¶Æ÷¾îÀÇ ÀåÁ¡°ú ´ÜÁ¡

¼¼¸¶Æ÷¾î´Â º¯¼öÀÇ °ªÀ» È®ÀÎÇØ¼­ ÀӰ迵¿ªÀ¸·ÎÀÇ ÁøÀÔÀ» Á¦¾îÇÑ´Ù. ±×·¸´Ù¸é ÇÁ·Î±×·¥º¯¼ö·Îµµ ÀӰ迵¿ªÀÇ ÁøÀÔÀ» Á¦¾îÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ´ë·« ´ÙÀ½°ú °°´Ù.

P(S)  
{ 
    while (S <= 0) 
        continue; 
    S--; 
} 
/* ÀӰ迵¿ª */ 
 
V(S) 
{ 
    S++; 
} 
 
¸Å¿ì °£´ÜÇÑ ±¸ÇöÀ¸·Î º¸ÀÌÁö¸¸, À̹æ¹ýÀ» ÀÌ¿ëÇÏ°Ô µÉ °æ¿ì ÇÁ·Î¼¼½º°¡ busy wait »óÅ¿¡ ³õÀ̱⠵ȴÙ. ¶ÇÇÑ ´Ù¸¥ ÇÁ·Î¼¼½ºµé°£¿¡´Â »ç¿ëÇϱâ Èûµé´Ù´Â ¹®Á¦Á¡µµ °¡Áø´Ù. ¹Ý¸é ¼¼¸¶Æ÷¾î´Â
  1. busy wait »óÅ¿¡ ³õÀÌÁö ¾Ê´Â´Ù.
  2. Ä¿³Î¿¡¼­ °ü¸®µÇ±â ¶§¹®¿¡ ´Ù¸¥ ÇÁ·Î¼¼½ºµé°£¿¡µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
´Â ÀåÁ¡À» °¡Áø´Ù.

¼¼¸¶Æ÷¾î¸¦ Á¦¾îÇϱâ À§Çؼ­´Â PÇÔ¼ö¿Í VÇÔ¼ö¸¦ »ç¿ëÇØ¾ß Çϴµ¥, ÀÌ µÎ°³ÀÇ ÇÔ¼ö´Â µ¶¸³ÀûÀÌ´Ù. ¶§¹®¿¡ À߸ø»ç¿ëÇÏ°Ô µÉ°æ¿ì deadlock¿¡ ºüÁú ¼ö ÀÖ´Ù.

2.7 Socket

Socket´Â ¹°¸®ÀûÀ¸·Î ¸Ö¸® ¶³¾îÁ® ÀÖ´Â ÄÄÇ»Åͳ¢¸®ÀÇ Åë½ÅÀ» µµ¿ÍÁÖ±â À§ÇÑ Åë½Å°èÃþÀÌ´Ù. SocketÀº ¿ø°ÝÅë½ÅÀ» À§ÇÑ ¿©·¯°¡Áö ÇÔ¼öµéÀ» Á¦°øÇϴµ¥, À̵éÀ» ÀÌ¿ëÇØ¼­ ¹°¸®ÀûÀ¸·Î ¶³¾îÁø ÄÄÇ»ÅÍ °£ÀÇ Åë½ÅÀÌ °¡´ÉÇÏ°Ô µÈ´Ù. ÀÎÅͳÝÀ» ÀÌ¿ëÇÑ Åë½Å ÇÁ·Î±×·¥ÀÇ ´ëºÎºÐÀÌ socket ±â¹ÝÀ¸·Î ÀÛ¼ºµÈ´Ù°í º¸¸é Ʋ¸²¾øÀ» °ÍÀÌ´Ù.

ÄÄÇ»ÅÍ¿Í ÄÄÇ»ÅͰ£ÀÇ Åë½ÅÀ̶ó°í´Â ÇÏÁö¸¸ ½ÇÁúÀûÀ¸·Î´Â ÀÌÂÊ ÄÄÇ»ÅÍÀÇ ÇÁ·Î¼¼½º¿Í ÀúÂÊ ÄÄÇ»ÅÍÀÇ ÇÁ·Î¼¼½º°¡ Åë½ÅÀ» ÇÏ´Â °Í´Ù. ÀÌ·¸°Ô ÇÁ·Î¼¼½º°£ Åë½ÅÀ» ÇÑ´Ù´Â Á¡¿¡¼­ ºÃÀ» ¶§ IPC¼³ºñ¿Í ±Ùº»ÀûÀ¸·Î ´Ù¸¥Á¡Àº ¾ø´Ù°í º¼ ¼ö ÀÖ´Ù. Â÷ÀÌÁ¡À̶ó¸é Åë½ÅÀÌ ÀÌ·ç¾îÁö´Â ¿µ¿ªÀÌ ÄÄÇ»ÅÍ ³»ºÎÀÎÁö ¾Æ´Ï¸é ¿Â¶óÀÎÀÎÁö ÇÏ´Â °ÍÀÌµÉ °ÍÀÌ´Ù.


ºñ·Ï socketÀÌ ¿ø°ÝÀÇ ÄÄÇ»ÅÍ ÇÁ·Î¼¼½ºµé°£ÀÇ Åë½ÅÀ» À§ÇÑ µµ±¸ÀÌÁö¸¸ ÀÌ·¯ÇÑ ÇÁ·Î¼¼½º°£ Åë½ÅÀ̶ó´Â ºñ½ÁÇÑ Æ¯¼ºÀ¸·Î ³»ºÎ ÇÁ·Î¼¼½º°£ Åë½ÅÀ» À§ÇÑ ¹æ¹ýÀ» Á¦°øÇÑ´Ù. Áï ¿ÜºÎ ÇÁ·Î¼¼½º°£ Åë½ÅÀ¸·Î »ç¿ëÇÒ°ÇÁö ³»ºÎ ÇÁ·Î¼¼½º°£ Åë½ÅÀ¸·Î »ç¿ëÇÒ °ÇÁö¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ°Ô²û Çϰí ÀÖ´Ù. socket´Â ´ÜÀÏ ÁÖÁ¦¸¸À¸·Îµµ Ã¥ÇѵαÇÀº ¸¸µé¾î³¾ ¼ö ÀÖ´Â ¹æ´ëÇÑ ¾çÀÌ´Ù. ¿©±â¿¡¼­´Â socketÀÇ ±â´ÉÁß ³»ºÎ ÇÁ·Î¼¼½º°£ Åë½ÅÁö¿ø ±â´É¿¡ ´ëÇØ¼­¸¸ ¾Ë¾Æº¸µµ·Ï ÇÒ °ÍÀÌ´Ù.

2.7.1 Unix Domain Socket ÀÇ ÀåÁ¡

Unix Domain Socket(ÀÌÇÏ ¼ÒÄÏ)ÀÇ °¡Àå Å« ÀåÁ¡Àº ³×Æ®¿öÅ© Åë½Å¿¡ »ç¿ëÇÏ´ø ±â¼úÀ» ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÏ °ÍÀÌ´Ù. ÄÚµùÀÇ Àϰü¼ºÀ» À¯ÁöÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù. ¾òÀ» ¼ö ÀÖ´Â ÀåÁ¡Àº ´ÜÁö ÇÔ¼ö¸¦ ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â Á¡ ÀÌ»óÀÌ´Ù. ´Ù¼öÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ µ¿½Ã¿¡ ó¸®Çϱâ À§ÇÑ ¹æ¹ý, ¸Þ½ÃÁö °ü¸®¸¦ À§ÇÑ ¹æ¹ýµî ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö¿¡¼­ »ç¿ëÇÏ´ø ÀÀ¿ë±â¼úµé ¿ª½Ã ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡À» °¡Áø´Ù.

¶ÇÇÑ ¼ÒÄÏÀº ´Ù¸¥ IPC ¼³ºñ¿Í´Â ´Þ¸® ²Ï³ª ³ôÀº ¼öÁØ¿¡¼­ Ãß»óÈ­°¡ µÇ¾î À־, Á»´õ Á÷°üÀûÀ¸·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.

´Ù¸¥ IPC ¼³ºñ µéÀº ƯÁ¤¿ëµµ¿¡ ¸Âµµ·Ï Á¦ÀÛµÈ Ãø¸éÀÌ À־, ¾î¶² °÷¿¡¼­´Â È¿À²ÀûÀÌÁö¸¸ ¶Ç´Ù¸¥ °÷¿¡¼­´Â ºñÈ¿À²ÀûÀ̰ųª ÄÄÇ»ÅÍÀÚ¿øÀÇ Á¦ÇÑÀ» ¸¹ÀÌ ¹Þ´Â´Ù°Å³ª ÇÏ´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. ÀÌ¿¡ ºñÇØ¼­ ¼ÒÄÏÀº ¸Å¿ì ¹ü¿ëÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ¹ü¿ëÀûÀ¸·Î »ç¿ëÇÒ·Á¸é ±×¸¸Å­ »ý°¢ÇØ¾ß ÇÒ °ÍµéÀÌ Á»´õ ÀÖÀ» ¼ö ÀÖ±äÇÏ´Ù.

ÆÄÀÌÇÁ·Îµµ ÃæºÐÇÑ °£´ÜÇÑ ÇÁ·Î±×·¥¿¡ ¼ÒÄÏÀ» »ç¿ëÇÏ´Â °Ç ºñÈ¿À²ÀûÀ̱ä ÇÏÁö¸¸ ¾î´ÀÁ¤µµ ÀÌ»óÀÇ ±Ô¸ð°¡ µÈ´Ù¸é ¼ÒÄÏÀ» ÀÌ¿ëÇÏ´Â °É ÃßõÇÑ´Ù.

2.7.2 Unix Domain Socket ¿¹Á¦

ÀÌ ÇÁ·Î±×·¥Àº ¿¡ÄÚ¼­¹ö/Ŭ¶óÀ̾ðÆ®ÀÇ IPC ¹öÀüÀÌ´Ù.

¸ÕÀú ¼­¹ö ÇÁ·Î±×·¥ÀÌ´Ù.
#include <sys/types.h>  
#include <sys/stat.h>  
#include <sys/socket.h>  
#include <sys/un.h>  
#include <unistd.h>  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
 
#define MAXLINE 1024 
int main(int argc, char **argv) 
{ 
    int server_sockfd, client_sockfd; 
    int state, client_len; 
    pid_t pid; 
 
    FILE *fp; 
    struct sockaddr_un clientaddr, serveraddr; 
 
    char buf[MAXLINE]; 
 
    if (argc != 2) 
    { 
        printf("Usage : %s [socket file name]\n", argv[0]); 
        printf("¿¹    : %s /tmp/mysocket\n", argv[0]);  
        exit(0); 
    } 
 
    if (access(argv[1], F_OK) == 0) 
    { 
        unlink(argv[1]); 
    } 
 
    // internet ±â¹ÝÀÇ ½ºÆ®¸² ¼ÒÄÏÀ» ¸¸µéµµ·Ï ÇÑ´Ù.  
    client_len = sizeof(clientaddr); 
    if ((server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) 
    { 
        perror("socket error : "); 
        exit(0); 
    } 
    bzero(&serveraddr, sizeof(serveraddr)); 
    serveraddr.sun_family = AF_UNIX; 
    strcpy(serveraddr.sun_path, argv[1]); 
 
    state = bind(server_sockfd , (struct sockaddr *)&serveraddr,  
            sizeof(serveraddr)); 
    if (state == -1) 
    { 
        perror("bind error : "); 
        exit(0); 
    } 
 
    state = listen(server_sockfd, 5); 
    if (state == -1) 
    { 
        perror("listen error : "); 
        exit(0); 
    } 
 
    while(1) 
    { 
        client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr,  
                               &client_len); 
        pid = fork(); 
        if (pid == 0) 
        { 
            if (client_sockfd == -1) 
            { 
                perror("Accept error : "); 
                exit(0); 
            } 
            while(1) 
            { 
                memset(buf, 0x00, MAXLINE); 
                if (read(client_sockfd, buf, MAXLINE) <= 0) 
                { 
                    close(client_sockfd); 
                    exit(0); 
                } 
                write(client_sockfd, buf, strlen(buf)); 
            } 
        } 
    } 
    close(client_sockfd); 
} 
 

´ÙÀ½Àº Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÌ´Ù.
#include <sys/types.h>  
#include <sys/stat.h>  
#include <sys/socket.h>  
#include <unistd.h>  
#include <sys/un.h>  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
 
#define MAXLINE 1024 
 
int main(int argc, char **argv) 
{ 
 
    int client_len; 
    int client_sockfd; 
 
    FILE *fp_in; 
    char buf_in[MAXLINE]; 
    char buf_get[MAXLINE]; 
 
    struct sockaddr_un clientaddr; 
 
    if (argc != 2) 
    {        
        printf("Usage : %s [file_name]\n", argv[0]); 
        printf("¿¹    : %s /tmp/mysocket\n", argv[0]); 
        exit(0); 
    }        
 
    client_sockfd = socket(AF_UNIX, SOCK_STREAM, 0); 
    if (client_sockfd == -1) 
    { 
        perror("error : "); 
        exit(0); 
    } 
    bzero(&clientaddr, sizeof(clientaddr)); 
    clientaddr.sun_family = AF_UNIX; 
    strcpy(clientaddr.sun_path, argv[1]); 
    client_len = sizeof(clientaddr); 
 
    if (connect(client_sockfd, (struct sockaddr *)&clientaddr, client_len) < 0) 
    { 
        perror("Connect error: "); 
        exit(0); 
    } 
    while(1) 
    { 
    memset(buf_in, 0x00, MAXLINE); 
    memset(buf_get, 0x00, MAXLINE); 
    printf("> "); 
        fgets(buf_in, MAXLINE, stdin); 
        write(client_sockfd, buf_in, strlen(buf_in)); 
        read(client_sockfd, buf_get, MAXLINE);  
        printf("-> %s", buf_get); 
    } 
 
    close(client_sockfd); 
    exit(0); 
} 
 
category_system
programing
category__4
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.