- °³¿ä
- »ç¿ë¹ý
- °£´ÜÇÑ »ùÇÃ
- ÁÖÀÇÇÒ Á¡
- MMFÀÇ ÀåÁ¡
- MMFÀÇ ´ÜÁ¡
- ¸µÅ©
1 °³¿ä
Memory Mapped FileÀº ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ´Ù ·ÎµåÇØ³õÀº °Íó·³ »ç¿ëÇÏ°Ô ÇØÁØ´Ù. ½ÇÁ¦·Î´Â ¸Þ¸ð¸®¿¡ ´Ù ¿Ã¶ó¿ÍÀÖÁö ¾ÊÁö¸¸, °ü·Ã IO¸¦ ½Ã½ºÅÛ ³»ºÎ¿¡¼ ó¸®ÇØÁֱ⠶§¹®¿¡, »ç¿ëÇÏ´Â Ãø¿¡¼´Â ¸¶Ä¡ ¸Þ¸ð¸®¿¡ ÆÄÀÏÀÌ ´Ù ¿Ã¶ó¿ÍÀÖ´Â °Íó·³ º¸Àδٴ ¸»ÀÌ´Ù.
Memory Mapped FileÀº ´ÙÀ½°ú °°Àº ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù.
- ½Ã½ºÅÛ¿¡¼ exe ÆÄÀϰú dll ÆÄÀÏÀ» ·ÎµåÇÏ°í ½ÇÇàÇϱâ À§Çؼ »ç¿ëÇÑ´Ù. ÀÌ´Â ÆäÀÌ¡ ÆÄÀÏÀÇ Å©±â¸¦ ÁÙÀ̰í, ¾ÖÇø®ÄÉÀ̼ÇÀÌ ½ÇÇàÀ» ½ÃÀÛÇÏ´Â µ¥±îÁö °É¸®´Â ½Ã°£À» ÁÙ¿©ÁØ´Ù.
- µð½ºÅ©¿¡ ÀÖ´Â µ¥ÀÌÅÍ ÆÄÀÏÀ» ¾×¼¼½ºÇÏ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Ù. »ç¿ëÀÚ°¡ IO ÀÛ¾÷°ú ¹öÆÛ¸µ ÀÛ¾÷¿¡ ´ëÇØ ½Å°æ ¾µ Çʿ䰡 ¾ø¾îÁø´Ù.
- ÇÑ ¸Ó½Å ³»ÀÇ ¿©·¯ ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ µ¥ÀÌÅ͸¦ °øÀ¯Çϴµ¥ »ç¿ëÇÒ ¼ö ÀÖ´Ù. À©µµ¿ìÁî´Â ´Ù¸¥ IPCµéµµ Á¦°øÇÏÁö¸¸, À̵鵵 »ç½ÇÀº Memory Mapped FileÀ» ÀÌ¿ëÇØ¼ ±¸ÇöµÈ °ÍÀÌ´Ù. ±×·¯¹Ç·Î ÇÑ ¸Ó½Å ³»¿¡¼ Åë½ÅÇÏ´Â °æ¿ì¶ó¸é Memory Mapped FileÀÌ Á¦ÀÏ ºü¸£°í È¿À²ÀûÀÎ ¹æ½ÄÀÌ´Ù.
-- from Programming Applications for Microsoft Windows, Jeffrey Richter
º¸Åë ¸Þ¸ð¸®¿¡ Åë°·Î ·ÎµåÇϱ⿡´Â ³Ê¹« Å« µ¥ÀÌÅÍ ÆÄÀÏÀ̳ª ½ºÆ®¸²À» ´Ù·ê ¶§ »ç¿ëÇÑ´Ù.
2 »ç¿ë¹ý
Å©°Ô ³ª´²º¸ÀÚ¸é 7 ´Ü°è·Î ³ª´¶´Ù.
- ÆÄÀÏ Ä¿³Î °´Ã¼¸¦ »ý¼º ¶Ç´Â ¿¬´Ù.
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
- ÆÄÀÏ ¸ÅÇÎ Ä¿³Î °´Ã¼¸¦ »ý¼ºÇÑ´Ù
HANDLE CreateFileMapping(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName
);
- ÆÄÀÏ µ¥ÀÌÅ͸¦ ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£¿¡´Ù ¸ÅÇνÃŲ´Ù.
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap
);
- Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇØ ÆÄÀÏ IO¸¦ ½ÇÇàÇÑ´Ù.
- ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£¿¡¼ ÆÄÀÏ µ¥ÀÌÅ͸¦ ¾ð¸ÅÇνÃŲ´Ù.
BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);
- ÆÄÀÏ ¸ÅÇÎ Ä¿³Î °´Ã¼¸¦ »èÁ¦ÇÑ´Ù.
BOOL CloseHandle(HANDLE hObject);
- ÆÄÀÏ Ä¿³Î °´Ã¼¸¦ »èÁ¦ÇÑ´Ù.
BOOL CloseHandle(HANDLE hObject);
3 °£´ÜÇÑ »ùÇÃ
DWORD dwFileSize = 0;
HANDLE hFile = NULL;
HANDLE hFileMap = NULL;
LPVOID lpvFile = NULL;
HANDLE hFile = ::CreateFile(
MyPathName,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTTE_NORMAL,
NULL);
assert(hFile != INVALID_HANDLE_VALUE);
DWORD dwFileSize = ::GetFileSize(hFile, NULL);
HANDLE hFileMap = ::CreateFileMapping(
hFile,
NULL,
PAGE_WRITECOPY,
0,
dwFileSize,
NULL);
assert(hFileMap != NULL);
LPVOID lpFile = ::MapViewOfFile(
hFileMap,
FILE_MAP_COPY,
0,
0,
0);
if (lpFile == NULL)
{
::CloseHandle(hFile);
::CloseHandle(hFileMap);
}
4 ÁÖÀÇÇÒ Á¡
from
The Hidden Costs of Memory Mapped Files
IO¸¦ À§Çؼ ¸Þ¸ð¸® Æ÷ÀÎÅ͸¸ ÀÖÀ¸¸é µÇ±â ¶§¹®¿¡, MMFÀÇ À¯È¤¿¡ ºüÁö´Â À̵éÀÌ ¸¹´Ù. Æ÷ÀÎÅÍ °ªÀ» Áõ°¡½Ã۱⸸ ÇÏ¸é ¸¶Ä¡ ¸¶¹ýó·³ ±× ÁÖ¼Ò¿¡ µ¥ÀÌÅͰ¡ ³ªÅ¸³´Ù. ½Ã½ºÅÛÀÌ x386 °¡»ó ¸Þ¸ð¸® ÄÁÆ®·Ñ·¯(virtual memory controller)¸¦ ÀÌ¿ëÇØ ½ÇÁ¦ÀûÀÎ ÀÔÃâ·ÂÀ» ó¸®ÇØÁֱ⠶§¹®ÀÌ´Ù. Æ÷ÀÎÅÍ·Î ¾ÆÁ÷ RAM¿¡ ¿Ã¶ó¿Í ÀÖÁö ¾ÊÀº ºÎºÐÀ» ÁöÁ¤Çϸé, »ç¿ëÀÚ´Â ¾Ë ¼ö ¾øÁö¸¸, ÆäÀÌÁö ÆúÆ®°¡ ÀϾ°í, ½Ã½ºÅÛÀÌ ÇÊ¿äÇÑ ºÎºÐÀ» ·ÎµåÇÏ°Ô µÈ´Ù. ÆäÀÌÁö ÆúÆ®¸¦ ó¸®ÇÏ´Â µ¿¾È ÇØ´ç ½º·¹µå°¡ ÁßÁö(suspend)µÇ±â ¶§¹®¿¡, ÇÁ·Î±×·¥¿¡¼´Â À̸¦ ¾Ë ¼ö ¾ø´Ù.
MMF¸¦ ÀÌ¿ëÇÏ¸é °£´ÜÇÏ°Ô µð½ºÅ©¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ°í, ÀϹÝÀûÀÎ ÆÄÀÏ IO¿¡ »ç¿ëµÇ´Â ÄÚµåµé°ú ¹öÆÛ¸µÀÌ ÇÊ¿ä¾ø´Ù. °£´ÜÇÏ°í ºü¸£´Ù. ±×·¸´Ù¸é ¿¹Àü¿¡ »ç¿ëÇÏ´ø ÆÄÀÏ IO¸¦ ´õ ÀÌ»ó °íÁýÇÒ Çʿ䰡 ¾ø´Â°¡? ±×·¸Áö ¾Ê´Ù.
MMF°¡ ÀÏ¹Ý ÆÄÀÏ IOº¸´Ù Ç×»ó ºü¸¥ °ÍÀº ¾Æ´Ï´Ù. MMF´Â Ä¿³ÎÀÌ °ü¸®Çϱ⠶§¹®¿¡ ¾ó¸¶³ª ¸¹Àº ¾çÀÇ ¸Þ¸ð¸®°¡ ¾ó¸¶³ª ¿À·§µ¿¾È ³²¾ÆÀÖ´ÂÁö¸¦ »ç¿ëÀÚ°¡ ÄÁÆ®·ÑÇÒ ¼ö°¡ ¾ø´Ù. ÀÌ´Â MMF¸¦ À§Çؼ "°ð ÇÊ¿äÇÏ°Ô µÉ" Äڵ峪 µ¥ÀÌÅ͵éÀÌ µð½ºÅ©·Î ¹Ð·Á³¯ ¼öµµ ÀÖ´Ù´Â ¸»ÀÌ´Ù.
¶ÇÇÑ ÆäÀÌÁö ÆúÆ® ¶ÇÇÑ °øÂ¥°¡ ¾Æ´Ï´Ù. ÆäÀÌÁö ÆúÆ® 󸮴 °£´ÜÇÑ ÆÄÀÏ IOº¸´Ù ÈξÀ ¸¹Àº ½Ã°£À» ÇÊ¿ä·Î ÇÑ´Ù. ÆäÀÌÁö ÆúÆ® 󸮸¦ À§ÇØ µé¾î°¡´Â ½Ã°£Àº ½Ã½ºÅÛ¿¡ ÀÇÇØ¼, °Ô´Ù°¡ ´Ù¸¥ ½º·¹µå¿¡¼ ÀϾ±â ¶§¹®¿¡ ¾Ë ¼ö°¡ ¾øÁö¸¸, À̰ÍÀÌ ¼º´É¿¡ ¿µÇâÀ» ¹ÌÄ£´Ù´Â °ÍÀº ºÐ¸íÈ÷ ¾Ë ¼ö ÀÖ´Ù.
Á÷Á¢ ¸¸µç µ¥ÀÌÅÍ °ü¸® ÄÚµå´Â µ¥ÀÌÅÍ ¾×¼¼½º ÆÐÅÏÀ» ¾Ë°í Àֱ⠶§¹®¿¡ ÃÖÀûȰ¡ °¡´ÉÇÏ´Ù. ÂüÁ¶ÀÇ Áö¿ª¼º(locality of reference)¶óµçÁö, ij½¬ÀÇ ¼ö¸í µîÀÌ ±× ¿¹ÀÌ´Ù. Àß ¸¸µé¾îÁø µ¥ÀÌÅÍ °ü¸® ÄÚµå´Â MMF¿¡ ºñ±³ÇÒ ¸¸ÇÑ ¼º´ÉÀ» ³»´Â µ¥´Ù°¡, ÈξÀ ÀûÀº ¸Þ¸ð¸®¸¦ ¿ä±¸ÇÑ´Ù. ÀÌ´Â ÆäÀÌÁö ÆúÆ®¸¦ ÁÙÀ̰í, °á°úÀûÀ¸·Î Àüü ½Ã½ºÅÛÀÇ ¼º´ÉÀ» ³ôÀδÙ.
MMF°¡ ÆäÀÌÁö ÆúÆ®ÀÇ ¿øÀÎÀÌ µÉ ¼ö ÀÖ´Ù´Â Á¡À» °¨¾ÈÇϸé, ¾î¶² µ¥ÀÌÅ͸¦ MMF·Î »ç¿ëÇØ¾ßÇÏ´ÂÁö¸¦ ¾Ë ¼ö ÀÖ´Ù. Áï ¾ÖÇø®ÄÉÀ̼ǿ¡¼ °¡Àå Áß¿äÇϰí, ÀÚÁÖ »ç¿ëÇÏ´Â µ¥ÀÌÅÍ¿¡´Ù MMF¸¦ ÀÌ¿ëÇØ¾ß ÇÑ´Ù. Á¤ÀÛ ÀÚÁÖ »ç¿ëÇÏ´Â µ¥ÀÌÅͰ¡ MMF ¶§¹®¿¡ ÆäÀÌÁö ¾Æ¿ô µÇ¹ö¸®¸é °ï¶õÇÏÁö ¾Ê°Ú´Â°¡.
4.1 MMFÀÇ ÀåÁ¡
- µ¥ÀÌÅͰ¡ ¸Þ¸ð¸®¿¡ ÀÌ¹Ì ¿Ã¶ó¿ÍÀÖ´Â °Íó·³ °£´ÜÇÏ°Ô Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
- ´ëºÎºÐÀÇ °æ¿ì, ÀϹÝÀûÀÎ ÆÄÀÏ IO¿¡ ºñÇØ¼ ³ªÀº ¼º´ÉÀ» º¸¿©ÁØ´Ù.
- ºñµ¿±â IO¸¦ »ç¿ëÇÏÁö¸¸, ½Ã½ºÅÛ¿¡¼ ó¸®ÇØÁֱ⠶§¹®¿¡ ½º·¹µå ¹®Á¦¸¦ °ÆÁ¤ÇÒ Çʿ䰡 ¾ø´Ù.
4.2 MMFÀÇ ´ÜÁ¡
- ÀÏ¹Ý ÆÄÀÏ IO¿¡ ºñÇØ¼ »ó´çÈ÷ ¸¹Àº ¸Þ¸ð¸®¸¦ ¿ä±¸ÇÑ´Ù.
- ¾ó¸¶³ª ¸¹Àº µ¥ÀÌÅ͸¦ ¾ó¸¶³ª ¿À·§µ¿¾È ¸Þ¸ð¸®¿¡ µÑ °ÍÀÎÁö¸¦ ÄÁÆ®·ÑÇÒ ¼ö ¾ø´Ù.
- MMF ÆÄÀÏÀº ÀÏÁ¤ÇÑ Å©±â¿©¾ß ÇÑ´Ù. MMF ÆÄÀÏÀÇ Å©±â¸¦ Áõ°¡½ÃŰ´Â °ÍÀº »ó´çÈ÷ °íÅ뽺·± ÀÛ¾÷ÀÌ´Ù.
- µð½ºÅ©¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ ±×´ë·Î ¸Þ¸ð¸®¿¡´Ù 1:1 ¸ÅνÃŰ´Â ¹æ½ÄÀ̱⠶§¹®¿¡, ¾ÐÃàµÈ ÆÄÀÏ Ã³¸®³ª ÆÄÀÏ ¹öÀü ºñ±³°¡ Èûµé´Ù.
- ÆÄÀÏ °øÀ¯¸¦ Áö¿øÇÏÁö ¾Ê´Â´Ù.
- ÇϳªÀÇ ¿¬¼ÓµÈ ÁÖ¼Ò¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÇϳªÀÇ ¿¬¼ÓµÈ ÁÖ¼Ò¿¡ ¿Ã¸®±â¿¡´Â ³Ê¹« Å« 500 ¸Þ°¡Â¥¸® ÆÄÀÏ °°Àº °æ¿ì, ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò °ø°£À» ´ÜÆíȽÃų ¼ö ÀÖ´Ù.
5 ¸µÅ©
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)