ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. 1 ±³Á¤ °úÁ¤
2 mmap¶õ?
mmap(2)´Â ¸Þ¸ð¸®ÀÇ ³»¿ëÀ» ÆÄÀÏÀ̳ª µð¹ÙÀ̽º¿¡ ´ëÀÀ(mapping)Çϱâ À§Çؼ »ç¿ëÇÏ´Â ½Ã½ºÅÛ È£ÃâÀÌ´Ù. ¿©±â¿¡¼´Â mmap½Ã½ºÅÛ È£ÃâÀÇ È°¿ë¹æ¾È¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇÑ´Ù. 2.1 ¸Þ¸ð¸®°ü¸®¿Í mmap
°¢°¢ÀÇ ÇÁ·Î¼¼½º´Â ÇÁ·Î¼¼½º¸¶´Ù ´Ù¸¥ ÇÁ·Î¼¼½º¿Í Áߺ¹µÇÁö ¾Ê´Â ÁÖ¼Ò°ø°£À» °¡Áö°Ô µÈ´Ù. ÁÖ¼Ò °ø°£Àº ÃÖÃÊ ³í¸®ÀûÀÎ 3°³ÀÇ ¼¼±×¸ÕÆ®·Î ºÐÇҵȴÙ.
ÅØ½ºÆ®, µ¥ÀÌÅÍ¿Í ½ºÆÑÀÌ ±×°ÍÀÌ´Ù. ÅØ½ºÆ® ¼¼±×¸ÕÆ®´Â ÀбâÀü¿ëÀ¸·Î ÇÁ·Î±×·¥ÀÇ ¸í·ÉÀ» Æ÷ÇÔÇϰí ÀÖ´Ù. µ¥ÀÌÅÍ¿Í ½ºÅà ¼¼Å©¸ÕÆ®´Â Àбâ,¾²±â°¡ ¸ðµÎ °¡´ÉÇÑ ¿µ¿ªÀÌ´Ù. Â÷ÀÌÁ¡À̶ó¸é µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®¿¡´Â ÃʱâÈ µÈ µ¥ÀÌÅÍ¿Í ±×·¸Áö ¾ÊÀº µ¥ÀÌÅͰ¡ ÇÔ²² Àִµ¥ ¹ÝÇØ, ½ºÅà ¼¼±×¸ÕÆ®´Â ½ÇÇà½Ã°£¿¡ ÃʱâÈµÈ °ªµéÀ» º¸°üÇÑ´Ù´Â °ÍÀÌ´Ù. ´ëºÎºÐÀÇ ½Ã½ºÅÛ¿¡¼´Â ÇÁ·Î¼¼½ºÀÇ ½ÇÇà°ú ÇÔ²² Ä¿³Î¿¡ ÀÇÇØ¼ ½ºÅà ¼¼±×¸ÕÆ®°¡ ÀÚµ¿À¸·Î È®ÀåµÈ´Ù. µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®ÀÇ °æ¿ì´Â malloc()°è¿ÀÇ ½Ã½ºÅÛÄÝÀ» ÀÌ¿ëÇØ¼ È®ÀåÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ÅØ½ºÆ® ¼¼±×¸ÕÆ®ÀÇ °æ¿ì µð¹ö±ë°ú °°Àº Á¦ÇÑµÈ È¯°æ¿¡¼ Å©±âÀÇ º¯°æÀÌ °¡´ÉÇÏ´Ù.
¾î·µç °£¿¡ ÇÁ·Î¼¼½º ¸Þ¸ð¸®´Â ±âº»ÀûÀ¸·Î ´Ù¸¥ ÇÁ·Î¼¼½º ¸Þ¸ð¸®¿Í °øÀ¯µÇÁö ¾Ê´Â´Ù. À̰ÍÀº ÇÁ·Î¼¼½ºÀÇ µ¥ÀÌÅ͸¦ º¸È£Çϱâ À§Çؼ ¹Ýµå½Ã ÇÊ¿äÇÑ ±â´ÉÀ̱ä ÇÏÁö¸¸ ´Ù¸¥ ÇÁ·Î¼¼½º¿Í ƯÁ¤ µ¥ÀÌÅ͸¦ °øÀ¯Çϱâ À§Çؼ´Â ±ÍÂúÀº ±â´ÉÀÌ µÇ±âµµ ÇÑ´Ù. À̶§¹®¿¡ IPC¸¦ »ç¿ëÇÏ°Ô µÈ´Ù. mmapÀº ¸Þ¸ð¸®ÀÇ Æ¯Á¤¿µ¿ªÀ» ÆÄÀÏ·Î ´ëÀÀ½Ãų ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù. ÆÄÀÏÀº ½Ã½ºÅÛ Àü¿ªÀûÀÎ °´Ã¼À̹ǷΠ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼ Á¢±Ù°¡´ÉÇϵµ·Ï ÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ·¯ÇÑ mmapÀÇ Æ¯Â¡¶§¹®¿¡ IPC¿ëµµ·Î »ç¿ë°¡´ÉÇÏ´Ù. - mmapÀÌ IPC¿ëµµ·Î »ç¿ë°¡´ÉÇÏÁö¸¸ IPC¼³ºñ´Â ¾Æ´Ï´Ù. -
mmap´Â ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò°ø°£À» ÆÄÀÏ¿¡ ´ëÀÀ½ÃŲ´Ù. ÆÄÀÏÀº ¿î¿µÃ¼Á¦ Àü¿ªÀûÀÎ ÀÚ¿øÀ̹ǷΠ´ç¿¬È÷ ¾î·ÆÀÝ°Ô ´Ù¸¥ ÇÁ·Î¼¼½º¿Í °øÀ¯Çؼ »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. 2.2 mmapÀÇ È°¿ë¿ëµµ
¸Þ¸ð¸®ÀÇ ³»¿ëÀ» ÆÄÀÏ¿¡ ´ëÀÀ½ÃÄѼ ¾òÀ» ¼ö ÀÖ´Â ÀÌÀÍÀ» »ý°¢ÇØ º¸ÀÚ. ±×·¯¸é 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)¸¦ Á¦°øÇÑ´Ù.
À§ÀÇ 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);
}
|
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|