¸Þ¸ð¸®¸Ê
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Contents

1 ±³Á¤ °úÁ¤
2 mmap¶õ?
2.1 ¸Þ¸ð¸®°ü¸®¿Í mmap
2.2 mmapÀÇ È°¿ë¿ëµµ
2.3 mmap¼³¸í
3 ¿¹Á¦ 1
4 mmapÀ» ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º°£ µ¥ÀÌÅÍ °øÀ¯
4.1 ¿¹Á¦
5 mmap¿Í ÆÄÀÏ I/O¿ÍÀÇ ¼º´É ºñ±³
6 Âü°í¹®Çå


1 ±³Á¤ °úÁ¤

  1. mmap ¿¹Á¦ Ãß°¡ - 2004/4/21

2 mmap¶õ?

mmap(2)´Â ¸Þ¸ð¸®ÀÇ ³»¿ëÀ» ÆÄÀÏÀ̳ª µð¹ÙÀ̽º¿¡ ´ëÀÀ(mapping)Çϱâ À§Çؼ­ »ç¿ëÇÏ´Â ½Ã½ºÅÛ È£ÃâÀÌ´Ù. ¿©±â¿¡¼­´Â mmap½Ã½ºÅÛ È£ÃâÀÇ È°¿ë¹æ¾È¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇÑ´Ù.

2.1 ¸Þ¸ð¸®°ü¸®¿Í mmap

°¢°¢ÀÇ ÇÁ·Î¼¼½º´Â ÇÁ·Î¼¼½º¸¶´Ù ´Ù¸¥ ÇÁ·Î¼¼½º¿Í Áߺ¹µÇÁö ¾Ê´Â ÁÖ¼Ò°ø°£À» °¡Áö°Ô µÈ´Ù. ÁÖ¼Ò °ø°£Àº ÃÖÃÊ ³í¸®ÀûÀÎ 3°³ÀÇ ¼¼±×¸ÕÆ®·Î ºÐÇҵȴÙ.

ÅØ½ºÆ®, µ¥ÀÌÅÍ¿Í ½ºÆÑÀÌ ±×°ÍÀÌ´Ù. ÅØ½ºÆ® ¼¼±×¸ÕÆ®´Â ÀбâÀü¿ëÀ¸·Î ÇÁ·Î±×·¥ÀÇ ¸í·ÉÀ» Æ÷ÇÔÇϰí ÀÖ´Ù. µ¥ÀÌÅÍ¿Í ½ºÅà ¼¼Å©¸ÕÆ®´Â Àбâ,¾²±â°¡ ¸ðµÎ °¡´ÉÇÑ ¿µ¿ªÀÌ´Ù. Â÷ÀÌÁ¡À̶ó¸é µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®¿¡´Â ÃʱâÈ­ µÈ µ¥ÀÌÅÍ¿Í ±×·¸Áö ¾ÊÀº µ¥ÀÌÅͰ¡ ÇÔ²² Àִµ¥ ¹ÝÇØ, ½ºÅà ¼¼±×¸ÕÆ®´Â ½ÇÇà½Ã°£¿¡ ÃʱâÈ­µÈ °ªµéÀ» º¸°üÇÑ´Ù´Â °ÍÀÌ´Ù. ´ëºÎºÐÀÇ ½Ã½ºÅÛ¿¡¼­´Â ÇÁ·Î¼¼½ºÀÇ ½ÇÇà°ú ÇÔ²² Ä¿³Î¿¡ ÀÇÇØ¼­ ½ºÅà ¼¼±×¸ÕÆ®°¡ ÀÚµ¿À¸·Î È®ÀåµÈ´Ù. µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®ÀÇ °æ¿ì´Â malloc()°è¿­ÀÇ ½Ã½ºÅÛÄÝÀ» ÀÌ¿ëÇØ¼­ È®ÀåÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ÅØ½ºÆ® ¼¼±×¸ÕÆ®ÀÇ °æ¿ì µð¹ö±ë°ú °°Àº Á¦ÇÑµÈ È¯°æ¿¡¼­ Å©±âÀÇ º¯°æÀÌ °¡´ÉÇÏ´Ù.

¾î·µç °£¿¡ ÇÁ·Î¼¼½º ¸Þ¸ð¸®´Â ±âº»ÀûÀ¸·Î ´Ù¸¥ ÇÁ·Î¼¼½º ¸Þ¸ð¸®¿Í °øÀ¯µÇÁö ¾Ê´Â´Ù. À̰ÍÀº ÇÁ·Î¼¼½ºÀÇ µ¥ÀÌÅ͸¦ º¸È£Çϱâ À§Çؼ­ ¹Ýµå½Ã ÇÊ¿äÇÑ ±â´ÉÀ̱ä ÇÏÁö¸¸ ´Ù¸¥ ÇÁ·Î¼¼½º¿Í ƯÁ¤ µ¥ÀÌÅ͸¦ °øÀ¯Çϱâ À§Çؼ­´Â ±ÍÂúÀº ±â´ÉÀÌ µÇ±âµµ ÇÑ´Ù. À̶§¹®¿¡ IPC¸¦ »ç¿ëÇÏ°Ô µÈ´Ù. mmapÀº ¸Þ¸ð¸®ÀÇ Æ¯Á¤¿µ¿ªÀ» ÆÄÀÏ·Î ´ëÀÀ½Ãų ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù. ÆÄÀÏÀº ½Ã½ºÅÛ Àü¿ªÀûÀÎ °´Ã¼À̹ǷΠ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼­ Á¢±Ù°¡´ÉÇϵµ·Ï ÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ·¯ÇÑ mmapÀÇ Æ¯Â¡¶§¹®¿¡ IPC¿ëµµ·Î »ç¿ë°¡´ÉÇÏ´Ù. - mmapÀÌ IPC¿ëµµ·Î »ç¿ë°¡´ÉÇÏÁö¸¸ IPC¼³ºñ´Â ¾Æ´Ï´Ù. -

mmap´Â ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò°ø°£À» ÆÄÀÏ¿¡ ´ëÀÀ½ÃŲ´Ù. ÆÄÀÏÀº ¿î¿µÃ¼Á¦ Àü¿ªÀûÀÎ ÀÚ¿øÀ̹ǷΠ´ç¿¬È÷ ¾î·ÆÀÝ°Ô ´Ù¸¥ ÇÁ·Î¼¼½º¿Í °øÀ¯Çؼ­ »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

2.2 mmapÀÇ È°¿ë¿ëµµ

¸Þ¸ð¸®ÀÇ ³»¿ëÀ» ÆÄÀÏ¿¡ ´ëÀÀ½ÃÄѼ­ ¾òÀ» ¼ö ÀÖ´Â ÀÌÀÍÀ» »ý°¢ÇØ º¸ÀÚ. ±×·¯¸é mmapÀÇ È°¿ë ¿ëµµ¸¦ °áÁ¤ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
  1. ¸Þ¸ð¸®ÀÇ ³»¿ëÀ» ÆÄÀÏ¿¡ ´ëÀÀ½Ãų ¼ö ÀÖ´Ù¸é ÇÁ·Î¼¼½º°£ µ¥ÀÌÅÍÀÇ ±³È¯À» À§ÇÑ ¿ëµµ·Î »ç¿ë°¡´É ÇÒ °ÍÀÌ´Ù. ÇÁ·Î¼¼½º°£ °øÀ¯ÇϰíÀÚ ÇÏ´Â µ¥ÀÌÅ͸¦ ÆÄÀÏ¿¡ ´ëÀÀ½Ã۰í À̰ÍÀ» ÀÐ°í ¾²¸é µÈ´Ù. ¹°·Ð Á¢±ÙÁ¦¾î¸¦ ÇØÁà¾ß ÇϰÚÁö¸¸ ¸»ÀÌ´Ù.
  2. ¸Þ¸ð¸®ÀÇ ³»¿ëÀ» ÆÄÀÏ¿¡ Á÷Á¢ ´ëÀÀ½ÃŲ ´Ù¸é ¼º´ÉÇâ»óÀ» »ý°¢ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. °íÀüÀûÀÎ ¹æ¹ýÀº ÆÄÀÏÁöÁ¤ÀÚ¸¦ ¾ò¾î¼­ Á÷Á¢ ÀÔÃâ·ÂÇÏ´Â ¹æ½ÄÀ¸·Î open, read, write, lseek¿Í °°Àº ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù. ÀÌ·¯ÇÑ ÇÔ¼öÀÇ »ç¿ëÀº ´ç¿¬ÇÏÁö¸¸ »ó´çÇÑ ºñ¿ëÀ» ÁöºÒÇØ¾ß Çϴµ¥, mmap¸¦ ÀÌ¿ëÇÏ¸é ºñ¿ëÀ» ÁÙÀÏ ¼ö ÀÖ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº µÚ¿¡ µû·Î ´Ù·çµµ·Ï ÇϰڴÙ.

2.3 mmap¼³¸í

mmap´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.
#include <sys/mman.h> 
 
#ifdef _POSIX_MAPPED_FILES 
void * mmap(void *start, size_t length, int prot ,  
          int flags, int fd, off_t offset); 
 
int munmap(void *start, size_t length); 
#endif 
 
mmapÇÔ¼ö´Â startºÎÅÍ length±îÁöÀÇ ¸Þ¸ð¸® ¿µ¿ªÀ» ¿­¸°ÆÄÀÏ fd¿¡ ´ëÀÀÇÑ´Ù. ´ëÀÀ ÇÒ¶§ ÆÄÀÏÀÇ À§Ä¡¸¦ ÁöÁ¤ÇÒ ¼ö Àִµ¥ À̰ÍÀº offsetÀ» ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù.

prot´Â ÆÄÀÏ¿¡ ´ëÀÀµÇ´Â ¸Þ¸ð¸® ¿µ¿ªÀÇ º¸È£Æ¯¼ºÀ» °áÁ¤Çϱâ À§Çؼ­ »ç¿ëµÈ´Ù. ¸Þ¸ð¸®¿µ¿ª°ú ÆÄÀÏÀÌ ¼­·Î ´ëÀÀµÇ±â ¶§¹®¿¡ ÆÄÀÏ¿¡ ´ëÇÑ ¾î¶°ÇÑ ÀÛ¾÷ÀÌ ¸Þ¸ð¸®¿µ¿ª¿¡ Á÷Á¢ÀûÀÎ ¿µÇâÀ» ¹ÌÄ¥ ¼ö Àֱ⠶§¹®ÀÌ´Ù. prot´Â ´ÙÀ½°ú °°Àº Ç÷¹±×(flag)¸¦ Á¦°øÇÑ´Ù.
  1. PROT_EXEC ÆäÀÌÁö(page)´Â ½ÇÇàµÉ ¼ö ÀÖ´Ù.
  2. PROT_READ ÆäÀÌÁö´Â ÀÐÇôÁú ¼ö ÀÖ´Ù.
  3. PROT_WRITE ÆäÀÌÁö´Â ¾µ¼ö ÀÖ´Ù.
  4. PROT_NONE ÆäÀÌÁö¸¦ Á¢±ÙÇÒ ¼ö ¾ø´Ù.

flags´Â ´ëÀÀµÇ´Â °´Ã¼ÀÇ Çü½Ä(type)¸¦ ÁöÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ÀÌ flag¿¡ ¾î¶² °ªÀ» »ç¿ëÇÏ´À³Ä¿¡ µû¶ó¼­ ´ëÀÀµÈ ÆäÀÌÁö¸¦ ´Ù¸¥ ÇÁ·Î¼¼½º¿Í °øÀ¯Çϰųª ´ÜÁö »ý¼ºÇÑ ÇÁ·Î¼¼½º¸¸ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.
  1. MAP_FIXED
  2. MAP_SHARED ´ëÀÀµÇ´Â °´Ã¼¸¦ ´Ù¸¥ ÇÁ·Î¼¼½ºµµ °øÀ¯ÇÒ ¼ö ÀÖ°Ô ¸¸µé¾îÁØ´Ù. ÇÁ·Î¼¼½ºµéÀº °´Ã¼¿¡ ´ëÇØ¼­ µ¿µîÇÑ ±ÇÇÑÀ» °¡Áö°Ô µÈ´Ù. ±×·¸´Ù¸é °´Ã¼ Á¢±Ù¿¡ ´ëÇÑ µ¿±âÈ­¸¦ ½ÃÄÑÁÙ Çʿ䰡 Àִµ¥, À̸¦ À§Çؼ­ msync(2)¿Í munmap(2)°¡ »ç¿ëµÈ´Ù. À̵é ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ µ¿±âÈ­´Â µû·Î ´Ù·ê °ÍÀÌ´Ù.
  3. MAP_PRIVATE
mmap¸¦ »ç¿ëÇÒ ¶§ ¹Ýµå½Ã MAP_PRIVATE¿Í MAP_SHAREDµÑÁß Çϳª¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

À§ÀÇ flag´Â POSIX.1b¿¡ Á¤ÀÇµÈ Ç¥ÁØÀûÀÎ °ÍµéÀε¥, ¸®´ª½º´Â ¸î °¡Áö Ç¥ÁØÀûÀÌÁö ¾ÊÀº flag¸¦ Á¦°øÇÑ´Ù. À̵é Ç÷¹±×´Â manÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.

mmap°¡ ¼º°øÀûÀ¸·Î È£ÃâµÇ¸é ¸Þ¸ð¸® ´ëÀÀµÈ Àå¼Ò¿¡ ´ëÇÑ ÁÖ¼Ò¸¦ ¸®ÅÏ ¹Þ´Â´Ù. ¿ì¸®´Â ÀÌ °ªÀ» ÀÌ¿ëÇØ¼­ ¸Þ¸ð¸®°ü·Ã ÀÛ¾÷À» ÇÏ°Ô µÈ´Ù.

3 ¿¹Á¦ 1


#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/mman.h> 
#include <unistd.h> 
#include <fcntl.h> 
 
int main(int argc, char **argv) 
{ 
    int fd; 
    char *file = NULL; 
    struct stat sb; 
    char buf[80] ={0x00,}; 
    int flag = PROT_WRITE | PROT_READ; 
 
    if (argc < 2) 
    { 
        fprintf(stderr, "Usage: input\n"); 
        exit(1); 
    } 
 
    if ((fd = open(argv[1], O_RDWR|O_CREAT)) < 0) 
    { 
        perror("File Open Error"); 
        exit(1); 
    } 
 
    if (fstat(fd, &sb) < 0) 
    { 
        perror("fstat error"); 
        exit(1); 
    } 
 
    file = (char *)malloc(40); 
 
    // mmap¸¦ ÀÌ¿ëÇØ¼­ ¿­¸° ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃŲ´Ù. 
    // fileÀº ´ëÀÀµÈ ÁÖ¼Ò¸¦ °¡¸®Å°°í, fileÀ» ÀÌ¿ëÇØ¼­ ÇÊ¿äÇÑ ÀÛ¾÷À»  
    // ÇÏ¸é µÈ´Ù.  
    if ((file = 
        (char *) mmap(0, 40, flag, MAP_SHARED, fd, 0)) == -1) 
    { 
        perror("mmap error"); 
        exit(1); 
    } 
    printf("%s\n", file); 
    memset(file, 0x00, 40); 
    close(fd); 
} 
 
ÀÏ´Ü test.nmap À̶õ ÆÄÀÏÀ» ¸¸µé°í ³»¿ëÀº "hello world\n"Á¤µµ·Î ä¿î´Ù. ±× ´ÙÀ½ À§ Äڵ带 ÄÄÆÄÀÏ ÇÑÈÄ Å×½ºÆ®¸¦ ÇØº¸µµ·Ï ÇÏÀÚ. ÆÄÀÏÀÇ ³»¿ëÀÌ ¸Þ¸ð¸®¿¡ ´ëÀÀµÇ´Â °ÍÀ» È®ÀÎ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÄÚµåÀÇ ¸¶Áö¸· ºÎºÐ¿¡¼­ memset()À» È£ÃâÇߴµ¥, ½ÇÁ¦ ÆÄÀÏ¿¡ ´ëÀÀµÇ¾î¼­ ÆÄÀÏ ³»¿ëÀÌ 0x00À¸·Î ä¿öÁ³´ÂÁö È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ.

4 mmapÀ» ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º°£ µ¥ÀÌÅÍ °øÀ¯

mmap()Àº ÆÄÀÏ I/O¿¡¼­ÀÇ ¿ì¿ùÇÑ ¼º´É°ú ¸Þ¸ð¸®ÀÇ °øÀ¯ °¡´ÉÇÏ´Ù´Â ÀåÁ¡À» °¡Áö¹Ç·Î 'ÆÄÀÏ I/O ´ëü ¿Í IPC ¿ëÀ¸·ÎÀÇ »ç¿ëÀÌ °¡´ÉÇÒ °ÍÀÌ´Ù. ÀÌÁß IPC¿ëÀ¸·ÎÀÇ »ç¿ë¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

¿©±â¿¡¼­´Â ¹è¿­·Î ¸¸µé¾îÁø ȯÇüÅ¥¸¦ ±¸ÇöÇØ º¸µµ·Ï ÇϰڴÙ. ȯÇüÅ¥¿¡ ´ëÇÑ ³»¿ëÀº Å¥ ÀÚ·áÃß»ó¸¦ Âü°íÇϱ⠹ٶõ´Ù. Å¥¿¡´Â intÇüÀÇ µ¥ÀÌÅͰ¡ µé¾î°¡¸ç Å¥ÀÇ Å©±â´Â 10À¸·Î ÇÒ °ÍÀÌ´Ù.

¿©±â¿¡´Â 2°³ÀÇ ÇÁ·Î±×·¥ÀÌ ¸¸µé¾îÁø´Ù. ù¹øÂ° ÇÁ·Î±×·¥Àº Å¥¿¡ µ¥ÀÌÅ͸¦ ¾²°í µÎ¹øÂ° ÇÁ·Î±×·¥Àº Å¥¿¡ ¾²¿©Áø µ¥ÀÌÅ͸¦ Àо Á¦°öÀ» ÇÑ´Ù. ȯÇüÅ¥ÀÇ Æ¯¼º»ó ÇöÀç Å¥¿¡ ÀÐÀ» µ¥ÀÌÅͰ¡ ÀÖ´ÂÁö¸¦ ¾Ë ¼ö ÀÖ¾î¾ß ÇϹǷΠ¸Ç ¾Õ 2byte´Â ÇöÀç Å¥¿¡ ÀúÀåµÈ ¿ø¼ÒÀÇ °¹¼ö¸¦ ÀúÀåÇϱâ À§ÇÑ ¿ëµµ·Î »ç¿ëµÈ´Ù. ´ë·« ´ÙÀ½°ú °°Àº ¸Þ¸ð¸® ±¸Á¶¸¦ À¯ÁöÇÏ°Ô µÉ °ÍÀÌ´Ù. ù¹øÂ° ÇÁ·Î±×·¥ÀÇ À̸§Àº a1, µÎ¹øÂ° ÇÁ·Î±×·¥ÀÇ À̸§Àº b2·Î ÇϰڴÙ.
+---+---+---+---+---+    +---+ 
|num|°ª0|°ª1|°ª2|°ª3|    |°ª9| 
+---+---+---+---+---+....+---+ 
 

a1Àº °ªÀ» ÀÔ·ÂÇÏ°í °ªÀ» ÀÔ·ÂÇÑ ÈÄ¿¡´Â num++¸¦ ÇÏ°Ô µÈ´Ù. a2´Â numÀ» Àо 0º¸´Ù Å©´Ù¸é °ªÀ» Àоî¿À°í num--¸¦ ÇÏ°Ô µÈ´Ù. num¿¡ ´ëÇØ¼­´Â µ¿±âÈ­°¡ ÇÊ¿äÇÏ´Ù. a1ÀÌ queue¿¡ »õ·Î¿î °ªÀ» Áý¾î ³Ö°í numÀ» Áõ°¡½ÃŰ´Â µ¿¾È¿¡´Â a2°¡ Á¢±ÙÇÏÁö ¸øÇÏ°Ô Çϰí, ¸¶Âù°¡Áö·Î a2°¡ queue¿¡¼­ °ªÀ» °¡Á®¿À°í numÀ» °¨¼Ò½ÃŰ´Â µ¿¾È¿¡´Â a1ÀÌ Á¢±ÙÇÏÁö ¸øÇϵµ·Ï ÇØ¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ µ¿±âÈ­´Â fcntl()À» ÀÀ¿ëÇÑ ·¹ÄÚµåÀá±ÝÀ» ÀÌ¿ëÇÒ °ÍÀÌ´Ù. ·¹ÄÚµå Àá±Ý¿¡ ´ëÇÑ ³»¿ëÀº fcntlÀ» ÀÌ¿ëÇÑ ÆÄÀÏÀá±ÝÀ» Âü°íÇϱ⠹ٶõ´Ù.

4.1 ¿¹Á¦

¾ÆÁ÷ ¿Ï¼ºµÇÁö ¾Ê¾ÒÀ½
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/mman.h> 
#include <unistd.h> 
#include <fcntl.h> 
 
#include <sys/sem.h> 
#include <sys/ipc.h> 
 
#define VSIZE        5 
#define MODE        S_IRUSR|S_IWUSR 
#define FLAG        O_RDWR|O_CREAT|O_EXCL 
 
typedef struct __M_que  
{ 
    int number; 
    int idx; 
    int value[VSIZE]; 
} M_que; 
 
static int semid; 
static struct sembuf mysem_open = {0, -1, SEM_UNDO}; 
static struct sembuf mysem_close = {0, 1, SEM_UNDO}; 
 
int main(int argc, char **argv) 
{ 
    int fd, i = 0; 
    char *file = NULL; 
    struct stat sb; 
    char buf[80] ={0x00,}; 
    int flag = PROT_WRITE | PROT_READ; 
    M_que *lque; 
    int sem_num = 1; 
 
 
    if (argc < 2) 
    { 
        fprintf(stderr, "Usage: input\n"); 
        exit(1); 
    } 
 
    if ((fd = open(argv[1], FLAG, MODE)) < 0) 
    { 
        perror("File Open Error"); 
        exit(1); 
    } 
 
    semid = semget((key_t)234, sem_num, 0660|IPC_CREAT); 
    if (semid == -1) 
    { 
        perror("semget error"); 
        exit(0); 
    } 
 
    lque = (void *)malloc(sizeof(M_que)); 
    memset((void *)lque, 0x00, sizeof(M_que)); 
    write(fd, (void *)lque, sizeof(M_que)); 
 
    // mmap¸¦ ÀÌ¿ëÇØ¼­ ¿­¸° ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃŲ´Ù. 
    // fileÀº ´ëÀÀµÈ ÁÖ¼Ò¸¦ °¡¸®Å°°í, fileÀ» ÀÌ¿ëÇØ¼­ ÇÊ¿äÇÑ ÀÛ¾÷À» 
    // ÇÏ¸é µÈ´Ù. 
    if (((void *)lque =  
        mmap(0, sizeof(&lque), flag, MAP_SHARED, fd, 0)) == MAP_FAILED) 
    { 
        perror("mmap error"); 
        exit(1); 
    } 
 
    while(1) 
    { 
        record_lock(fd); 
        input_value(lque, i, fd); 
        record_unlock(fd); 
        sleep(1); 
        i++; 
    } 
    munmap((void *)lque, sizeof(lque)); 
    close(fd); 
} 
 
int input_value(M_que *lque, int value, int fd) 
{ 
    if (lque->number == VSIZE) 
    { 
        printf("buffer overflower\n"); 
        record_unlock(fd);     
        if (semop(semid, &mysem_open, 1) == -1) 
        { 
            perror("semop error"); 
            return -1; 
        } 
        printf("close wait\n"); 
        semop(semid, &mysem_close, 1); 
        record_lock(fd); 
    } 
 
 
    printf("%d : %d\n", lque->idx, value); 
    lque->value[lque->idx] = value; 
    lque->number ++; 
    lque->idx = (lque->idx ++) % VSIZE; 
    record_unlock(fd); 
    return 1; 
} 
 
int record_lock(int fd) 
{ 
    struct flock lock;  
    lock.l_type = F_WRLCK; 
    lock.l_start = 0; 
    lock.l_whence = SEEK_SET; 
    lock.l_len = 1; 
    return fcntl(fd, F_SETLKW, &lock); 
} 
 
int record_unlock(int fd) 
{ 
    struct flock lock;  
    lock.l_type = F_UNLCK; 
    lock.l_start = 0; 
    lock.l_whence = SEEK_SET; 
    lock.l_len = 1; 
    return fcntl(fd, F_SETLK, &lock); 
} 
 

#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/mman.h> 
#include <unistd.h> 
#include <fcntl.h> 
 
#include <sys/sem.h> 
#include <sys/ipc.h> 
 
#define VSIZE    10 
#define MODE    S_IRUSR 
#define FLAG    O_RDONLY 
 
typedef struct __M_que 
{ 
    int number; 
    int idx; 
    int value[VSIZE]; 
} M_que;  
 
static int semid; 
static struct sembuf mysem_open = {0, -1, SEM_UNDO}; 
static struct sembuf mysem_close = {0, 1, SEM_UNDO}; 
 
int main(int argc, char ** argv) 
{ 
    int fd; 
    char *file = NULL; 
    int flag = PROT_READ; 
    int sem_num = 0; 
 
    M_que *lque; 
    int value; 
 
 
    if (argc < 2) 
    { 
        fprintf(stderr, "Usage: ./a2 [mmap_file]\n"); 
        exit(1); 
    } 
 
    if ((fd = open(argv[1], FLAG, MODE)) < 0) 
    { 
        perror("FILE Open Error"); 
        exit(0); 
    } 
 
    semid = semget((key_t)234, sem_num, 0660); 
    if (semid == -1) 
    { 
        perror("semget error"); 
        exit(0); 
    } 
 
    lque = (void *)malloc(sizeof(M_que)); 
    if (((void *)lque =  
        mmap(0, sizeof(&lque), flag, MAP_SHARED, fd, 0)) == MAP_FAILED) 
    { 
        perror("mmap error"); 
        exit(1); 
    } 
    else 
    { 
        printf("Success\n"); 
    } 
    while(1) 
    { 
        record_lock(fd); 
        printf("%d : %d\n", lque->number, lque->idx); 
        if (lque->number == 5) 
        { 
            printf("Wait\n"); 
            if(semop(semid, &mysem_open, 1) == -1) 
            { 
                perror("semop error "); 
                exit(0); 
            } 
            printf("OK\n"); 
            semop(semid, &mysem_close, 1); 
        } 
        record_unlock(fd); 
        getchar(); 
    } 
} 
 
 
int record_lock(int fd) 
{ 
    struct flock lock;  
    lock.l_type = F_WRLCK; 
    lock.l_start = 0; 
    lock.l_whence = SEEK_SET; 
    lock.l_len = 1; 
    return fcntl(fd, F_SETLKW, &lock); 
} 
 
int record_unlock(int fd) 
{ 
    struct flock lock;  
    lock.l_type = F_UNLCK; 
    lock.l_start = 0; 
    lock.l_whence = SEEK_SET; 
    lock.l_len = 1; 
    return fcntl(fd, F_SETLK, &lock); 
} 
 
 

5 mmap¿Í ÆÄÀÏ I/O¿ÍÀÇ ¼º´É ºñ±³


6 Âü°í¹®Çå

  1. [http]A Performance Comparison of "read" and "mmap"
  2. ¸®´ª½º ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö 8Àå IPC
  3. mmap(2) man page
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.