¾îÇø®ÄÉÀÌ¼Ç ¼­ºêÇÁ·Î¼¼½º¸¦ »ý¼ºÇÒ¶§ ¸Þ¸ð¸® »ç¿ë·® ÃÖ´ë·Î ÁÙÀ̱â
Greg Nakhimovsky, 2006³â 5¿ù  

°³¿ä: ÀÌ ±ÛÀº ´ë¿ë·®ÀÇ ¸Þ¸ð¸®¸¦ ¿ä±¸ÇÏ´Â ¼Ö¶ó¸®½º OS ¾îÇø®ÄÉÀ̼ÇÀÌ ¾î¶»°Ô ¸Þ¸ð¸® ºÎÁ· Çö»ó ȤÀº µ¥µå¶ôÀ» À¯¹ßÇÏ´Â µîÀÇ Çö»ó ¾øÀÌ ¼­ºê ÇÁ·Î¼¼½º¸¦ È¿°úÀûÀ¸·Î »ý¼ºÇÏ´ÂÁö¿¡ ´ëÇØ ¼³¸í ÇÕ´Ï´Ù. ¶ÇÇÑ ¾î¶»°Ô ¾îÇø®ÄÉÀÌ¼Ç ¸Þ¸ð¸®°¡ »ç¿ëµÇ´ÂÁö¿¡ ´ëÇØ ¼Ö¶ó¸®½º¿Í ¸®´ª½º °°Àº ´Ù¸¥ ¿î¿µÃ¼Á¦¿Í ´Ù¸¥ Á¡¿¡ °ü·ÃµÈ À̽´µéÀ» ޱ¸ÇØ º¾´Ï´Ù.

¼ø¼­
 
¿ª»çÀûÀÎ ¹è°æ°ú ¹®Á¦Á¡ ¼³¸í
posix_spawn(3C), popen(3C), ±×¸®°í system(3C) ÀÎÅÍÆäÀ̽º
¼Ö¶ó¸®½ºÀÇ posix_spawn(), system(3C), ±×¸®°í popen(3C) ±¸Çö
¸Þ¸ð¸® overcommit: ¼Ö¶ó¸®½º vs ´Ù¸¥ ¿î¿µÃ¼Á¦µé
°¡´ÉÇÒ¶§¿¡¸¸ posix_spawn() ¸¦ È£Ãâ ÇÏ´Â ¹æ¹ý
Acknowledgments
Âü°íÀÚ·á
ÀúÀÚ¿¡ °üÇÏ¿©

¿ª»çÀûÀÎ ¹è°æ°ú ¹®Á¦Á¡ ¼³¸í

ÀüÅëÀûÀ¸·Î À¯´Ð½º¿¡¼­ »õ·Î¿î ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ´Â ¹æ¹ýÀº ¿ÀÁ÷ Çϳª°¡ Á¸Àç ÇÕ´Ï´Ù: fork() ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÏ°í ¶ÇÇÑ º¸Åë exec() ½Ã½ºÅÛ ÄÝÀ» µÚÀÌ¾î ¹Ù·Î È£ÃâÇÔ. fork()´Â ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò°ø°£ ÀüüÀÇ Ä«ÇǸ¦ ¸¸µé°í exec() °¡ ÀÌ Ä«ÇǸ¦ »õ·Î¿î ÇÁ·Î¼¼½º·Î º¯È¯ ½Ãŵ´Ï´Ù.

(ÁÖÀÇ: ¼Ö¶ó¸®½º¿¡¼­ ½º¿Ò °ø°£ Àº ½Ã½ºÅÛ¿¡ ¼³Á¤µÈ ¹°¸®ÀûÀÎ ¸Þ¸ð¸®¿Í µð½ºÅ© ½º¿Ò °ø°£ÀÇ Á¶ÇÕÀ» ¼³¸íÇϱâ À§ÇØ »ç¿ë µË´Ï´Ù. ´Ù¸¥ À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ ÀÌ ´Ü¾î´Â ¾Æ¸¶ swap space on disk, ÀÇ ¶æ ȤÀº backing store ¶ó´Â Àǹ̷Π»ç¿ë µÉ °ÍÀÔ´Ï´Ù. È¥µ¿À» ÇÇÇϱâ À§ÇØ ÇÊÀÚ´Â Virtual Memory (VM) ¸¦ physical memory plus disk swap space. ¸¦ ³ªÅ¸³»±â À§ÇØ »ç¿ëÇÕ´Ï´Ù)

ÀϹÝÀûÀ¸·Î fork/exec ¹æ¹ýÀº ²Ï Àß ÀÛµ¿ÇÕ´Ï´Ù. ±×·¯³ª ¸î¸î °æ¿ì ±×°ÍÀº ¸íÈ®ÇÑ ÀÌÀ¯ ¾øÀÌ ¸Þ¸ð¸® ºÎÁ· Çö»óÀÌ ³ªÅ¸³­´Ù °Å³ª forkÀÇ ¼º´É»óÀÇ ¹®Á¦Á¡ µî ¸î°¡Áö ºÒÀÌÀÍÀ» °¡Á® ¿Ã ¼ö ÀÖ½À´Ï´Ù.

¸Þ¸ð¸® ºÎÁ· Çö»ó(Out of Memory): ´ë¿ë·® ¸Þ¸ð¸® ÇÁ·Î¼¼½º¿¡¼­ fork() ½Ã½ºÅÛ ÄÝÀº ºÎÀû´çÇÑ VMÀÇ ¿ë·® ¶§¹®¿¡ È£ÃâÀÌ ½ÇÆÐÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿Ö³ÄÇϸé fork() ´Â ºÎ¸ð ¸Þ¸ð¸®ÀÇ 2¹è Á¤µµÀÇ ¿ë·®À» ¿ä±¸Çϱ⠶§¹®ÀÔ´Ï´Ù. À̰ÍÀº fork() ÈÄ¿¡ °ð¹Ù·Î exec() ¸¦ È£ÃâÇÏ¿© ¿©ºÐÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´ç ÇØÁ¦ ÇÏ´õ¶óµµ ¹ß»ýÇÕ´Ï´Ù. ÀÌ·± Çö»óÀÌ ¹ß»ýÇÏ¸é ¾îÇø®ÄÉÀ̼ÇÀº º¸Åë Á¾·áµË´Ï´Ù.

¿¹¸¦µé¾î 64-ºñÆ® ¾îÇø®ÄÉÀ̼ÇÀÌ 6 ±â°¡¹ÙÀÌÆ®ÀÇ VMÀ» »ç¿ëÇϰí ls(1) Ä¿¸Çµå¸¦ ¼öÇàÇϱâ À§ÇØ ¼­ºêÇÁ·Î¼¼½º¸¦ ¸¸µé¾î¾ß ÇÑ´Ù°í ÇØ º¾½Ã´Ù. ºÎ¸ð ÇÁ·Î¼¼½º°¡ fork() ¸¦ È£Ãâ ÇßÀ»¶§ ¿ÀÁ÷ ¶Ç ´Ù¸¥ 6±â°¡ÀÇ VMÀÌ »ç¿ë °¡´ÉÇÒ ¶§¸¸ ¼º°øÀûÀ¸·Î ¼öÇàµÉ °ÍÀÔ´Ï´Ù. ¸¸¾à ½Ã½ºÅÛ¿¡ ±×¸¸ÇÑ Å©±âÀÇ ¸Þ¸ð¸®°¡ »ç¿ë°¡´ÉÇÏÁö ¾Ê´Ù¸é(ÀÚÁÖ ¹ß»ýÇÏ´Â »óȲ), fork() ´Â ENOMEM ¿¡·¯ ÄÚµå¿Í ÇÔ²² ½ÇÆÐ ÇÒ °ÍÀÔ´Ï´Ù. ´ç¿¬È÷ ls(1) Ä¿¸Çµå´Â 6±â°¡ Á¤µµÀÇ ¸Þ¸ð¸®°¡ ÇÊ¿ä·Î ÇÏÁö ¾ÊÁö¸¸ fork() ´Â ¾ËÁö ¸øÇÕ´Ï´Ù.

ÀÏ¹Ý ¾îÇø®ÄÉÀÌ¼Ç »Ó¸¸ ¾Æ´Ï¶ó ½ãÀÇ °íÀ¯ Åøµéµµ ¶È°°Àº ¹®Á¦·Î °í»ýÇϰí ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î dbx¿Í °ü·ÃµÈ ´ÙÀ½ÀÇ ½ã RFE (request for enhancement) ¸¦ Âü°í ¹Ù¶ø´Ï´Ù: "4748951 dbx shell should use posix_spawn() for non-builtin commands rather than fork(2)".

RFE 4748951 Àº °í°´ÀÇ À¯Æ¿¸®Æ¼°¡ dbx ¸¦ »ç¿ëÇÏ¿© ´ë¿ë·®ÀÇ ÄÚ¾î ÆÄÀÏÀ» ÀÐ¾î µéÀ϶§ »ç¿ëµÇ´Â ½ºÅ©¸³Æ®³»¿¡ cut(1) Ä¿¸Çµå¸¦ ¼öÇàÇÏ´Â ºÎºÐ¿¡¼­ ¹ß»ýÇÏ¿´½À´Ï´Ù. " cannot fork - try again " ¿¡·¯ ¸Þ¼¼Áö°¡ ¹ß»ýÇÏ¿© dbx °¡ Á¾·á µÇ¾ú½À´Ï´Ù. Á¶»çÇÑ °á°ú dbx °¡ ¼Ò¿ë·®ÀÇ Ä¿¸ÇµåÀÎ cut(1) À» ½ÇÇàÇϱâ À§ÇØ fork/exec ¸¦ È£Ãâ Çϸ鼭 fork() È£Ãâ½Ã¿¡ VMÀÌ ºÎÁ·Çϸ鼭 ¹ß»ý Çß½À´Ï´Ù.

¼Ö¶ó¸®½º JVMÀº ÇöÀç ¶ÇÇÑ µ¿ÀÏÇÑ ¹®Á¦·Î °í»ýÇϰí ÀÖ½À´Ï´Ù. ½ã RFE: "5049299 Use posix_spawn, not fork, on S10 to avoid swap exhaustion".

ForkÀÇ ÆÛÆ÷¸Õ½º : fork() È£ÃâÀº ÆÛÆ÷¸Õ½º¿¡ ¾Ç¿µÇâÀ» ³¢Ä¥ ¼ö ÀÖ½À´Ï´Ù. fork() °¡ COW (copy-on-write) ±¸¹®À» »ç¿ëÇϸ鼭 ¹ßÀüÇØ ¿Ô´õ¶óµµ ¿©ÀüÈ÷ ¸¶Âù°¡Áö ÀÔ´Ï´Ù. ¿©ÀüÈ÷ ºÎ¸ð¿¡¼­ ÀڽĿ¡°Ô Àü´ÞµÇ´Â ƯÁ¤ ¿ë·®ÀÇ ¸Þ¸ð¸®¸¦ º¹»ç Çϱâ ?¹®ÀÔ´Ï´Ù.ÀÌ·¯ÇÑ Ä«ÇÇ ÀÛ¾÷Àº ÀÚ½Ä ÇÁ·Î¼¼½º°¡ exec() È£Ãâ¿¡ ÀÇÇØ °ð¹Ù·Î ´Ù¸¥ ÇÁ·Î¼¼½º·Î ´ëü µÉ¶§¿¡´Â ºÒÇÊ¿äÇÑ ÀÛ¾÷ÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ÆÛÆ÷¸Õ½º ÀúÇÏ´Â ºÎ¸ð ÇÁ·Î¼¼½º°¡ ¸¹Àº ¾çÀÇ ¸ÅÇÎµÈ ¸Þ¸ð¸® °ø°£À» °¡Áö°í ÀÖÀ»¶§ È®¿¬È÷ ¾Ë¾Æ º¼ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ·¯ÇÑ ºÒÀÌÀÍ (¿¹¸¦ µé¾î ¸Þ¸ð¸® ºÎÁ· Çö»ó, forkÀÇ ÁÁÁö ¾ÊÀº ÆÛÆ÷¸Õ½º)´Â ƯÈ÷ ºÎ¸ð ÇÁ·Î¼¼½º°¡ ´ë¿ë·®ÀÇ ¸Þ¸ð¸®¸¦ ¼ÒºñÇÒ ¶§¿¡(±Ù·¡¿¡´Â ¸Å¿ì ÈçÇÏ°Ô ¹ß»ýÇÔ) ±×¸®°í ¸Þ¸ð¸® ¿äûÀÌ ¼Ö¶ó¸®½º¿¡¼­ ó·³ VMÀÇ ¿¹¾àÀÌ ¿ä±¸ µÉ¶§ Áß¿äÇÑ ¹®Á¦°¡ µË´Ï´Ù,

fork() °¡ exec() ¿¡ µÚµû¶ó ¹Ù·Î »ìÇàµÇ´Â fork/exec ¸ðµ¨ÀÇ ´ÜÁ¡À» ´Ù·ç±â À§ÇØ ¹öŬ¸® ¹öÁ¯ÀÇ À¯´Ð½º(BDS)´Â 1980³â´ë Ãʹݿ¡ vfork() ½Ã½ºÅÛ ÄÝÀ» ³»³õ¾Ò½À´Ï´Ù. vfork(2) ´Â ºÎ¸ð ÇÁ·Î¼¼½º¸¦ ÀÚ½Ä ÇÁ·Î¼¼½º¿¡ Ä«ÇÇÇÏÁö ¾Ê½À´Ï´Ù. µÎ ÇÁ·Î¼¼½º°¡ ¸ðµÎ ºÎ¸ðÀÇ °¡»ó ÁÖ¼Ò °ø°£À» °øÀ¯ ÇÕ´Ï´Ù; ºÎ¸ð ÇÁ·Î¼¼½º´Â ÀÚ½Ä ÇÁ·Î¼¼½º°¡ Á¾·á µÇ°Å³ª exec() ¸¦ È£ÃâÇÒ¶§ ±îÁö Á¤Áö »óÅ·Πµé¾î °©´Ï´Ù.

vfork(2) ½Ã½ºÅÛ ÄÝ ¶ÇÇÑ ¼Ö¶ó¸®½º¿¡ ä¿ëµÇ¾î ÀÖ½À´Ï´Ù. ¿À·£ ½Ã°£ÀÌ Áö³­ÈÄ¿¡ ¸ÖƼ¾²·¹µù(MT)ÀÌ °¡´ÉÇØ Áö°í ¸¹ÀÌ »ç¿ëµÇ¸é¼­ vfork() °¡ ¾îÇø®ÄÉÀ̼ÇÀÌ ¿©·¯°³ÀÇ ¾²·¹µå¸¦ °¡Áö°í ÀÖÀ»¶§ »õ·Î¿î ¹®Á¦¸¦ ÀÏÀ¸Å³ ¼ö ÀÖÀ½ÀÌ ¹àÇô Á³½À´Ï´Ù: µ¥µå¶ô. µ¥µå¶ôÀº µ¿Àû¸µÄ¿ ld.so.1 ÀÌ ÇÊ¿äÇÑ ½Éº¼µéÀ» ÇØ¼®ÇÏ´Â °úÁ¤¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. Ưº°È÷ ¸¸¾à ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¿ÜºÎÀÇ ÇÔ¼ö (exec() °°Àº)¸¦ È£ÃâÇÒ¶§ ÇÁ·Î½ÃÁ® ¸µÅ© Å×À̺í(Procedure Linkage Table(PLT)) Ç׸ñÀ» ÇØ¼®Çϱâ À§ÇØ µ¿Àû ¸µÄ¿°¡ ½ÇÇà µÇ¸é¼­ µ¿Àû ¸µÄ¿°¡ ¹ÂÅØ½º ¶ôÀ» ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¶ôÀº ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ ´Ù¸¥ ¾²·¹µå°¡ ÀÌ¹Ì °¡Áö°í ÀÖ½À´Ï´Ù. ¸¸¾à ÀÌ·¯ÇÑ ÀÏÀÌ ¹ß»ýÇÑ´Ù¸é ºÎ¸ð¿Í ÀÚ½Ä ÇÁ·Î¼¼½º °£¿¡ µ¥µå¶ôÀÌ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿Ö³ÄÇÏ¸é ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ ¾î¶°ÇÑ ¾²·¹µåµµ ÀÚ½Ä ÇÁ·Î¼¼½º°¡ exec() ȤÀº exit() °¡ ¼öÇàµÇ±â Àü±îÁö ¼öÇàµÉ ¼ö ¾ø±â ¶§¹®ÀÔ´Ï´Ù. °á°úÀûÀ¸·Î ºÎ¸ð¿Í ÀÚ½Ä ÇÁ·Î¼¼½º ¸ðµÎ ÇàÀÌ °É¸± °ÍÀÔ´Ï´Ù.

posix_spawn(3C)ÀÇ ¼Ò°³(Âü°íÀÚ·á [1]) ·Î ÀÎÇØ ¼Ö¶ó¸®½º10¿¡¼­ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°á ÇÒ ¼ö ÀÖ°Ô µÇ¾ú½À´Ï´Ù. ÀÌÀü ¹öÁ¯ÀÇ ¼Ö¶ó¸®½º(¼Ö¶ó¸®½º9°ú ¼Ö¶ó¸®½º8 2/02)¿¡¼­ system(3C) °ú popen(3C) È£ÃâÀº VMÀÇ ¿ë·®À» µÎ¹è·Î ¿ä±¸ÇÏÁö ¾Ê°íµµ µ¥µå¶ô¿¡¼­ ¾ÈÀüÇϵµ·Ï ¸¸µé¾î Á³½À´Ï´Ù.

¸î¸î ¿î¿µÃ¼Á¦, ƯÈ÷ ¸®´ª½º´Â memory overcommit À̶õ ±â´ÉÀ» °¡Áö°í ÀÖ½À´Ï´Ù. À̰ÍÀº ¾îÇø®ÄÉÀ̼ÇÀÌ malloc() ȤÀº ´Ù¸¥ ¸Þ¸ð¸® ¿ä±¸ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÒ ¶§, ¿î¿µÃ¼Á¦°¡ Ç×»ó ¿ä±¸µÈ ¸Þ¸ð¸®ÀÇ ½º¿Ò ½ºÆäÀ̽º¸¦ ¿¹¾àÇÏÁö ¾Ê°í NULL Æ÷ÀÎÅͰ¡ ¾Æ´Ñ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇØ ÁÝ´Ï´Ù.

¸®´ª½º´Â fork() ¿Í exec() ·Î ±¸ÇöµÈ posix_spawn() À» °¡Áö°í ÀÖ½À´Ï´Ù. ¸Þ¸ð¸® overcommit Á¤Ã¥¶§¹®¿¡ (¾Æ·¡¿¡ ¼³¸íµÊ), ¸®´ª½º´Â À§¿¡¼­ ¾ð±ÞµÈ ù¹øÂ° ¹®Á¦·Î ÀÎÇØ °í»ýÇÒ ¿°·Á´Â ¾øÀ» °ÍÀÔ´Ï´Ù: ´ë¿ë·® ÇÁ·Î¼¼½º°¡ fork()¸¦ È£ÃâÇÒ¶§ ¹ß»ýÇÏ´Â ¸Þ¸ð¸® ºÎÁ· Çö»ó. ±×·¯³ª memory overcommit ±â´ÉÀº ±× °íÀ¯ÀÇ ½É°¢ÇÑ ¹®Á¦Á¡À» ¹ß»ý ½ÃÄ×½À´Ï´Ù. ¾Æ·¡ÀÇ "Memory Overcommit" Åä·Ð¿¡¼­ Âü°í ¹Ù¶ø´Ï´Ù.

ÀÌÂë¿¡¼­ ¼Ö¶ó¸®½º ȤÀº ´Ù¸¥ À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ ¼­ºêÇÁ·Î¼¼½º¸¦ ¾ÈÀüÇϰí È¿°úÀûÀ¸·Î »ý¼º ÇÒ ¼ö ÀÖ´Â ´ë¾ÈÀûÀÎ ¹æ¹ý¿¡ ´ëÇØ ¼³¸íÇÏ·Á°í ÇÕ´Ï´Ù. ¸ÞÀÎ ÇÁ·Î¼¼½º¸¦ ÃʱâÈ­ ÇÏ´Â µ¿¾È (¾²·¹µå¸¦ »ý¼ºÇϰųª ´ë¿ë·®ÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇϱâ Àü¿¡) °³¹ßÀÚ´Â Å« ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ ¼­ºêÇÁ·Î¼¼½º »ý¼ºÀ» ´ã´çÇϴ Ư¼öÇÑ µµ¿ì¹Ì ÇÁ·Î¼¼½º¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù. ºÎ¸ð ÇÁ·Î¼¼½º´Â ÆÄÀÌÇÁ³ª ´Ù¸¥ ³»ºÎ ÇÁ·Î¼¼½º Åë½Å ¸ÞÄ«´ÏÁòÀ» ÅëÇØ ¼­ºêÇÁ·Î¼¼½º¸¦ ¸¸µéµµ·Ï ¿äûÀ» º¸³¾ ¼ö ÀÖ°í, ½ÇÇàÇϵµ·Ï ¸í·ÉÇÒ ¼ö ÀÖ½À´Ï´Ù. µµ¿ì¹Ì ÇÁ·Î¼¼½º´Â fork() ¸¦ È£ÃâÇÒ¶§ ¸Þ¸ð¸®°¡ ºÎÁ·ÀÌ µÉ ÀÏÀÌ ¾ø°í ¸Å¿ì ºü¸¨´Ï´Ù. ¿Ö³ÄÇÏ¸é ¿ä±¸µÇ´Â ¸Þ¸ð¸®°¡ ¸Å¿ì À۾Ƽ­ ¾ÈÀüÇÏ°Ô fork/exec ¸¦ ÀÌ¿ëÇØ ¼­ºêÇÁ·Î¼¼½º¸¦ ¸¸µé ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù.

À§¿¡¼­ ¼Ò°³ÇÑ ´ë¾ÈÀÇ ´ÜÁ¡Àº Ãß°¡ÀûÀÎ º¹À⼺ÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀ» »ç¿ëÇÏ´Â ¾îÇø®ÄÉÀ̼ÇÀº ¹Ýµå½Ã ¸ÞÀÎ ÇÁ·Î¼¼½º°¡ Á¾·á µÆÀ»¶§ µµ¿ì¹Ì ÇÁ·Î¼¼½º°¡ Á¾·á µÆ´ÂÁö ¹Ýµå½Ã È®ÀÎÇØ¾ß ÇÏ°í µµ¿ì¹Ì ÇÁ·Î¼¼½º¿ÍÀÇ Åë½ÅÀ» À§ÇØ MT-safeÇÑ ¹æ¹ýÀ» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. ¶ÇÇÑ µµ¿ì¹Ì ÇÁ·Î¼¼½º¸¦ »ç¿ëÇϸé ÀÚ½Ä ÇÁ·Î¼¼½º¿ÍÀÇ ÆÄÀÏ µð½ºÅ©¸³ÅÍ °øÀ¯°¡ Èûµì´Ï´Ù. Â÷¶ó¸® ´ë¿ë·®ÀÇ ºÎ¸ð ÇÁ·Î¼¼½º¿¡¼­ posix_spawn(), popen(), ȤÀº system() À» °ð¹Ù·Î »ç¿ëÇÏ´Â °ÍÀÌ ÈξÀ ½¬¿î ¹æ¹ýÀÔ´Ï´Ù.

posix_spawn(3C), popen(3C), ±×¸®°í system(3C) ÀÎÅÍÆäÀ̽º

C/C++ ¾îÇ÷¹ÄÉÀ̼ǿ¡¼­ »õ·Î¿î ÇÁ·Î¼¼½º¸¦ ½ÃÀÛ½Ã۴µ¥ °¡Àå °£´ÜÇÑ ¹æ¹ýÀº system(3C) À» »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. system() È£ÃâÀº ½©¿¡ ÁÖ¾îÁø Ä¿¸Çµå¸¦ ½ÇÇà Çϵµ·Ï ÇÕ´Ï´Ù. system(3C) ¸àÆäÀÌÁö¿¡¼­ ÀÚ¼¼ÇÑ »çÇ×À» È®ÀÎ ¹Ù¶ø´Ï´Ù. ÀÌ·¯ÇÑ ÀÎÅÍÆäÀ̽º´Â ¸¸¾à ½© Ä¿¸Çµå¸¦ ¼öÇàÇÏ°í ±×°ÍÀÌ ³¡³¯¶§±îÁö ±â´Ù¸®´Â ÀÛ¾÷À» ¼öÇà ÇÒ? ÀûÇÕÇÕ´Ï´Ù.

»õ·Î¿î ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ´Â Á» ´õ °­·ÂÇÑ ÀÎÅÍÆäÀ̽º´Â popen(3C) ÀÔ´Ï´Ù. »õ·Î¿î ÇÁ·Î¼¼½º¸¦ ½ÃÀÛÇϴ°Ϳ¡ Ãß°¡ÇÏ¿© popen() Àº °³¹ßÀÚ°¡ ÁÖ¾îÁø ½© Ä¿¸ÇµåÀÇ °á°ú¸¦ ĸÃç ÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁÖ°í À̰ÍÀ» ¿©·¯°¡Áö ¹æ¹ýÀ¸·Î ´Ù·ê ¼ö ÀÖµµ·Ï(¿¹¸¦ µé¾î ÆÄ½Ì °°Àº) ÇØ ÁÝ´Ï´Ù. ÀÚ¼¼ÇÑ ¼³¸íÀº popen(3C) ¸à ÆäÀÌÁö¸¦ Âü°í ¹Ù¶ø´Ï´Ù.

ÀÌ·¯ÇÑ À¯¿¬¼º°ú ´õºÒ¾î popen() È£ÃâÀº ¸ÖƼ¾²·¹µå ÇÁ·Î±×·¥¿¡¼­ system() º¸´Ù ¾ÈÀüÇÕ´Ï´Ù. system() È£ÃâÀº ´Ù¸¥ ¾²·¹µå¿¡ ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Â ¸î¸î ½Ã±×³ÎµéÀ» º¯Çü ½ÃŰÁö¸¸ popen() Àº ±×·¸Áö ¾Ê½À´Ï´Ù. À̰ÍÀÌ popen(3C) ¸àÆäÀÌÁö¿¡ MT-Safe ¸¦ Ç¥±âÇÑ ÀÌÀ¯ ÀÔ´Ï´Ù. system(3C) ¿¡´Â MT-unsafe°¡ Ç¥±âµÇ¾î ÀÖ½À´Ï´Ù. system(3C) ¸à ÆäÀÌÁö¸¦ Âü°í ¹Ù¶ø´Ï´Ù.

ÀÌ·¯ÇÑ ±â´ÉÀ» ÇÏ´Â ÀÎÅÍÆäÀ̽º Áß¿¡ °¡Àå °­·ÂÇÑ °ÍÀº ¼Ö¶ó¸®½º10¿¡¼­ ¼Ò°³µÈ posix_spawn(3C) (±×¸®°í ºñ½ÁÇÑ posix_spawnp(3C)) ÀÔ´Ï´Ù. À̰ÍÀºfork() ¿Í exec() ¿¡¼­ ÇÒ ¼ö ÀÖ´Â Ãß°¡ÀûÀÎ ¼öÁ¤ ÀÛ¾÷À» ÇÒ ¼ö ÀÖµµ·Ï ÇØ ÁÝ´Ï´Ù.

posix_spawn() ÀÎÅÍÆäÀ̽º´Â °³¹ßÀÚ¿¡°Ô ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ½ÇÇà½Ãų ½ÇÇà ÆÄÀÏÀÇ Àüü °æ·Î¸¦ ¸í½ÃÇϵµ·Ï ¿ä±¸ ÇÕ´Ï´Ù. posix_spawnp() µµ µ¿ÀÏÇÑ ÀÏÀ» ÇÏÁö¸¸ Á¶±Ý ´Ù¸£°Ô °æ·Î°¡ ÁÖ¾îÁöÁö ¾ÊÀºÃ¼ ÆÄÀÏ¸í¸¸ Á¦°ø µÆÀ»¶§ $PATH µð·ºÅ丮µé¿¡¼­ ½ÇÇà ÆÄÀÏÀ» Á÷Á¢ °Ë»öÇÕ´Ï´Ù.

¾Æ·¡¿¡ posix_spawn() ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÑ µÎ°¡ÁöÀÇ ¿¹Á¦ ÇÁ·Î±×·¥À» Á¦°ø ÇÕ´Ï´Ù. posix_spawn(3C) ¸à ÆäÀÌÁö¿¡ ¾î¶°ÇÑ ¿¹Á¦µµ Á¦°øÇϰí ÀÖÁö ¾Ê°í posix_spawn() ÀÇ »ç¿ë¹ý ¶ÇÇÑ ²Ï º¹ÀâÇϱ⠶§¹®¿¡ ¾Æ·¡ÀÇ ¿¹Á¦µéÀº ¸Å¿ì À¯¿ëÇÒ °ÍÀÔ´Ï´Ù.

À̰ÍÀÌ Ã¹¹øÂ° ¿¹Á¦ ÆÄÀÏÀÔ´Ï´Ù:

posix_spawn_example1.c
(ÁÖÀÇ: ÆÄÀÏÀ» ÀúÀåÇÒ¶§ .txt È®ÀåÀÚ¸¦ »©°í ÀúÀåÇϽñ⠹ٶø´Ï´Ù.)

ÀÌ ¿¹Á¦´Â °£´ÜÇÑ ½© Ä¿¸Çµå¸¦ ¼öÇàÇÏ·Á´Â °£´ÜÇÑ ¸ñÀûÀ¸·Î posix_spawn() À» È£Ãâ ÇÏ´Â ¹æ¹ýÀ» º¸¿© ÁÝ´Ï´Ù(¿©±â¿¡¼­´Â /bin/ls -l /etc/passwd) ±×¸®°í Ä¿¸Çµå°¡ Á¾·á µÉ¶§ ±îÁö ±â´Ù¸³´Ï´Ù. posix_spawn() ¿¡¼­ ¹ß»ýÇÏ´Â ¿¡·¯¸¦ ¾î¶»°Ô üũÇÏ´ÂÁö ÁÖÀÇ ±í°Ô º¸½Ã±â ¹Ù¶ø´Ï´Ù.

µÎ¹øÂ° ¿¹Á¦ ÆÄÀÏÀº Á» ´õ º¹ÀâÇÕ´Ï´Ù:

posix_spawn_example2.c
(ÁÖÀÇ: ÆÄÀÏÀ» ÀúÀåÇÒ¶§ .txt È®ÀåÀÚ¸¦ »©°í ÀúÀåÇϽñ⠹ٶø´Ï´Ù.)

ÀÌ ¿¹Á¦´Â fork()¿Í exec() ¿¡¼­ ÀÚÁÖ ÀÌ·ç¾î Áö´Â ¼öÁ¤ÀÛ¾÷À» ¾î¶»°Ô posix_spawn() À» ÅëÇØ ¼öÇàÇÏ´ÂÁö º¸¿© ÁÝ´Ï´Ù. ¶ÇÇÑ ÆÄÀÏ ¸®´ÙÀÌ·º¼ÇÀ» À§ÇØ ½©ÀÌ ÇÏ´Â ÀÛ¾÷À» À¯»çÇÏ°Ô µû¶óÇÕ´Ï´Ù. ÇÁ·Î±×·¥Àº ƯÁ¤ÇÑ ÆÄÀϰú ¿¬°áµÈ Ç¥ÁØ Ãâ·ÂÀ» °¡Áö°í ÀÖ´Â ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ºÎ¸ðÀÇ ¿­¸° ÆÄÀÏ µð½ºÅ©¸³ÅÍ¿¡ ¹æÇظ¦ ÁÖÁö ¾Ê°í »ý¼º ÇÕ´Ï´Ù. °£´ÜÇÑ ¿¹¸¦ À§ÇØ /bin/cat À» ÀÚ½Ä ÇÁ·Î¼¼½º·Î »ç¿ë ÇÕ´Ï´Ù.

posix_spawn_example2.c ¿¹Á¦ ÇÁ·Î±×·¥Àº posix_spawn() ¿Í fork()/exec() ¸ðµÎÀÇ »ç¿ë ¿¹¸¦ º¸¿©ÁÖ°í ÀÎÅÍÆäÀ̽º¸¦ ºñ±³ÇÒ ¼ö ÀÖµµ·Ï ÇØ ÁÝ´Ï´Ù.

¸¸¾à -spawn ¸Å°³ º¯¼ö·Î ½ÇÇà ½Ã۸é posix_spawn_example2.c ´Â posix_spawn() ¸¦ »ç¿ëÇϰí ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ Ãâ·ÂÀ» /etc/hosts ·Î ¹ÙÀεù ½Ãŵ´Ï´Ù.

¸¸¾à ¸Å°³ º¯¼ö ¾øÀÌ ½ÇÇà ½Ã۸é posix_spawn_example2.c ´Â fork()/exec() ¸¦ »ç¿ëÇϰí ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ Ãâ·ÂÀ» /etc/passwd ·Î ¹ÙÀεù ½Ãŵ´Ï´Ù .

µð¹ö°Å°¡ ¾ø¾îµµ truss(1) ¸¦ ÀÌ¿ëÇØ¼­ °æ·Î¸¦ °Ë»çÇÒ ¼ö ÀÖ½À´Ï´Ù. ½ÇÁ¦·Î ¼Ö¶ó¸®½º10¿¡¼­ fork() ¿É¼ÇÀº fork1() À» È£ÃâÇϰí posix_spawn() ½ÇÇà °æ·Î´Â vfork() ¸¦ È£ÃâÇÕ´Ï´Ù (±×°ÍÀÇ libc-internal ¹öÁ¯).

¾Ë¾ÆµÎ¾î¾ß ÇÒÁ¡Àº posix_spawn_example2.c °¡ ¾î¶»°Ô ¿¡·¯ °ËÃâÀ» ¼öÇàÇÏ´ÂÁö ÀÔ´Ï´Ù. ÀÌ °ÍÀº posix_spawn() ¿Í °ü·ÃµÈ °¢ ÇÔ¼öµé¿¡¼­ ¸®ÅϵǴ ¿¡·¯ Äڵ带 °Ë»ç ÇÕ´Ï´Ù. ¶ÇÇÑ ÀÚ½Ä ÇÁ·Î¼¼½º¿¡ ¹®Á¦°¡ »ý°åÀ»¶§ ¸®ÅϵǴ ¿¡·¯ ÄÚµå 127À» üũ ÇÕ´Ï´Ù. posix_spawn(3C) ¸à ÆäÀÌÁöÀÇ ERRORS ¼½¼ÇÀ» È®ÀÎ ¹Ù¶ø´Ï´Ù. (ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¿¡·¯ÄÚµå 127À» ¸®ÅÏÇϰí Á¾·á µÆÀ»¶§¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â Âü°íÀÚ·á [1]) À» Âü°í ¹Ù¶ø´Ï´Ù)

ÀÌ·¯ÇÑ ¿¹Á¦µéÀº ´ëºÎºÐÀÇ °æ¿ì¿¡¼­ »ç¿ëÇϱ⿡ ÃæºÐÇÑ posix_spawn()ÀÇ °£´ÜÇÑ ±â´ÉµéÀ» ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö¿¡ ´ëÇØ Àß º¸¿© ÁÝ´Ï´Ù. ÀÌ°Í ¿Ü¿¡µµ posix_spawn() Àº À¯Àú¿Í ±×·ì ID º¯°æ, ½Ã±×³Î ¸¶½ºÅ© º¯°æ, ½ºÄÉÁ٠Ŭ·¡½º º¯°æ °°Àº ¾à°£ º¹ÀâÇÑ ¼öÁ¤À» °¡ÇÒ¼öµµ ÀÖµµ·Ï µÇ¾î ÀÖ½À´Ï´Ù. posix_spawn() ¸à ÆäÀÌÁö¿¡¼­ ÀÚ¼¼ÇÑ »çÇ×À» È®ÀÎÇϽñ⠹ٶø´Ï´Ù.

¼Ö¶ó¸®½ºÀÇ posix_spawn(), system(3C), ±×¸®°í popen(3C) ±¸Çö

ÀÌ·¯ÇÑ ÀÎÅÍÆäÀ̽ºµéÀº ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î ±¸ÇöµÉ ¼ö ÀÖ½À´Ï´Ù. °¡Àå È®½ÇÇÑ ¹æ¹ýÀº fork() ÈÄ¿¡ ¹Ù·Î exec() ¸¦ ¼öÇà ÇÏ´Â °ÍÀÔ´Ï´Ù. ¸î¸î ¿î¿µÃ¼Á¦´Â ÀÌ·±½ÄÀ¸·Î µ¿ÀÛÇÕ´Ï´Ù. ±×·¯³ª Âü°íÀÚ·á [2] ¿¡¼­´Â fork() ´ë½Å¿¡ vfork() ¸¦ È£Ãâ ÇÏ¿© ¸®´ª½ºÀÇ posix_spawn()ÀÇ ±¸ÇöÀ» Çâ»ó½ÃŰ´Â ¿ä±¸¿¡ ´ëÇØ ¼³¸íÇÑ ±ÛÀÔ´Ï´Ù.

¼Ö¶ó¸®½º10ÀÇ posix_spawn() ºÎÅÍ ½ÃÀÛÇØ¼­ (±×¸®°í Solaris 8 2/02 ¿¡ Æ÷ÇÔµÈ system() °ú popen()), ¼Ö¶ó¸®½ºÀÇ ÀÌ 3°¡Áö ÀÎÅÍÆäÀ̽ºµéÀº Àý´ë·Î µ¥µå¶ôÀ» »ý¼ºÇÏÁö ¾Ê½À´Ï´Ù. ±×¸®°í ´ë¿ë·® ¾îÇø®ÄÉÀ̼ÇÀÇ ½º¿Ò ºÎÁ·Çö»óÀ» À¯¹ßÇÏÁöµµ ¾ÊÀ» °ÍÀÔ´Ï´Ù.

¼Ö¶ó¸®½º10¿¡¼­ posix_spawn() Àº ÇöÀç private-to-libc vfork(), execve(), ±×¸®°í exit() ÇÔ¼öµéÀ» ÀÌ¿ëÇØ¼­ ±¸ÇöµÇ¾î ÀÖ½À´Ï´Ù. À̰͵éÀº ±â´ÉÀûÀÎ ¸é¿¡¼­ ÀÏ¹Ý vfork(), execve(), ±×¸®°í exit() ÇÔ¼ö µé°ú µ¿ÀÏÇÕ´Ï´Ù. ±×·¯³ª À̰͵éÀº libc¿¡¼­ ÃßÃâµÇÁö ¾Ê¾Ò±â ¶§¹®¿¡ vfork() °¡ libc ¿ÜºÎÀÇ ¸ÖƼ¾²·¹µå Äڵ忡¼­ È£ÃâµÊÀ¸·Î½á ¹ß»ýÇÏ´Â µ¿Àû¸µÄ¿ÇÁ·Î±×·¥¿¡¼­ÀÇ µ¥µå¶ôÀ» ¹ß»ý½ÃŰÁö ¾Ê½À´Ï´Ù.

¼Ö¶ó¸®½º10 ¹öÁ¯ÀÇ system(3C) ¿Í popen(3C) Àº posix_spawn() ¸¦ ÀÌ¿ëÇØ¼­ ±¸ÇöµÇ¾ú½À´Ï´Ù. ¼Ö¶ó¸®½º9°ú ¼Ö¶ó¸®½º8 2/02 ¹öÁ¯ÀÇ ÀÎÅÍÆäÀ̽ºµéÀº private-to-libc vfork() ¿Í execve() ¸¦ ÀÌ¿ëÇÏ¿© ±¸ÇöµÇ¾ú½À´Ï´Ù.

ÀÌÁ¦ ¼Ö¶ó¸®½º´Â ¿ÀǼҽºÈ­ µÇ¾ú½À´Ï´Ù. ±×·¯¹Ç·Î ±¸Çö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â ´ÙÀ½ÀÇ ¿¹Á¦¿¡¼­ È®ÀÎ °¡´ÉÇÕ´Ï´Ù:

http://cvs.opensolaris.org/source/xref/usr/src/lib/libc/port/threads/spawn.c

¹°·Ð ¼Ö¶ó¸®½ºÀÇ posix_spawn() ±¸ÇöÀº ±×°ÍÀ» Á» ´õ È¿À²ÀûÀ¸·Î ¸¸µé±â À§ÇØ ¹Ì·¡¿¡ º¯°æµÉ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª »õ·Î¿î ±¸ÇöÀÌ ³ª¿À´õ¶óµµ Ç×»ó Ç¥ÁØ API¸¦ Á¦°øÇÒ °ÍÀÔ´Ï´Ù.

¾Ë¾ÆµÎ¾î¾ß ÇÒ Á¡Àº posix_spawn() ´Â À¯´Ð½º Ç¥ÁØÀÇ ÇÑ ¿ä±¸»çÇ× ÀÔ´Ï´Ù. ¹öÁ¯ 3 (SUSv3), Âü°íÀÚ·á [3] ÂüÁ¶.

vfork(2) ½Ã½ºÅÛ ÄÝ ÀÚü´Â MT-safe ÇÏ°Ô ¸¸µé¾î Áú ¼ö ¾ø½À´Ï´Ù. ±×¸®°í ´õÀÌ»ó ÇÊ¿ä·Î ÇÏÁöµµ ¾Ê½À´Ï´Ù. ¼Ö¶ó¸®½º¿¡¼­ vfork(2) ´Â Àß ¾²ÀÌÁö ¾Ê½À´Ï´Ù. ¸à ÆäÀÌÁö¿¡ µû¸£¸é "exec °è¿­ÀÌ ¼öÇà µÇ±â Àü¿¡ vfork°¡ µ¶¸³ÀûÀ¸·Î ¼öÇàÇÏ´Â ¸ðµç ÀÛ¾÷Àº ¾ÈÀüÇÏ°Ô posix_spawn(3C) ȤÀº posix_spawnp(3C) ¿¡ ÀÇÇØ ¼öÇàµÉ ¼ö ÀÖ½À´Ï´Ù. "

¸Þ¸ð¸® overcommit: ¼Ö¶ó¸®½º vs ´Ù¸¥ ¿î¿µÃ¼Á¦µé

¸î¸î ¿î¿µÃ¼Á¦ (¸®´ª½º, IBM AIX, HP-UX °°Àº) µéÀº memory overcommit À̶ó´Â ±â´ÉÀ» °¡Áö°í ÀÖ½À´Ï´Ù.( lazy swap allocation À̶ó°íµµ ºÒ¸²) memory overcommit ¸ðµå¿¡¼­ malloc() Àº ½º¿Ò½ºÆäÀ̽º¸¦ ¿¹¾àÇÏÁö ¾Ê°í ½Ã½ºÅÛ¿¡ ÃæºÐÇÑ VMÀÌ ÀÖµç ¾øµç Ç×»ó NULL ÀÌ ¾Æ´Ñ Æ÷ÀÎÅ͸¦ ¸®ÅÏ ÇÕ´Ï´Ù.

memory overcommit ±â´ÉÀº ´ÙÀ½°ú °°Àº ÀåÁ¡°ú ´ÜÁ¡À» °¡Áö°í ÀÖ½À´Ï´Ù.

ÀåÁ¡

  • fork() È£ÃâÀÌ VMÀÇ ºÎÁ·À¸·Î ÀÎÇØ ½ÇÆÐ ÇÏÁö ¾Ê½À´Ï´Ù.
  • ½Ã½ºÅÛ ¸Þ¸ð¸®°¡ Á»´õ À¯µ¿ÀûÀ̰í È¿À²ÀûÀ¸·Î »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ¾îÇø®ÄÉÀ̼ÇÀÌ µ¿ÀûÀ¸·Î ´ë¿ë·®ÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í °Å±â¿¡ µ¥ÀÌŸ¸¦ ¸¹ÀÌ Ã¤¿ö ³ÖÁö ¾ÊÀ»¶§ È¿°ú ÀûÀÔ´Ï´Ù.
  • memory overcommit Àº È®ÀåÀÌ °¡´ÉÇÑ (¹«ÇÑÀûÀ¸·Î Å«) ¹è¿­°ú ¸Þ¸ð¸® ¹öÆÛ¿¡¼­ »ç¿ë µÉ ¼ö ÀÖ½À´Ï´Ù; Âü°íÀÚ·á [4] ÀÇ "Virtual Memory Arrays for Application Software"¿Í ºñ±³ ¹Ù¶÷.
  • À§¿¡¼­ ¼³¸íÇÑ È®Àå °¡´ÉÇÑ ¹è¿­¿¡ µû¶ó ¸¹Àº Æ÷Æ®¶õ ÇÁ·Î±×·¥µé (Ưº°È÷ Fotran-90 ÀÌÀü¿¡ Á¦ÀÛµÈ °Íµé) Àº µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇÏÁö ¾Ê½À´Ï´Ù. ¿Ö³ÄÇϸé Ãʱâ Fortran ¹öÁ¯¿¡¼­´Â ¾î¶°ÇÑ Ç¥ÁØ ¼³ºñµµ Á¦°øÇÏÁö ¾Ê¾Ò±â ¶§¹® ÀÔ´Ï´Ù. ´ë½Å ¸Å¿ì Å« ¹è¿­ ¼±¾ðÀÚ¸¦ °¡Áö°í ÀÖ¾ú½À´Ï´Ù. ±×·¯³ª ÀÌ·¯ÇÑ ¹è¿­ÀÇ ºÎºÐ¸¸À» »ç¿ëÇÒ ¼ö ÀÖ¾ú½À´Ï´Ù. non-overcommit ½Ã½ºÅÛ¿¡¼­ ÀÌ·¯ÇÑ Fortran ÇÁ·Î±×·¥µéÀº ÀüÇô ·ÎµåÇÏÁö ¾Ê°Å³ª ȤÀº ¿ÀÁ÷ °³¹ßÀÚ°¡ ÀüÇô »ç¿ëµÇÁö ¾ÊÀº ½º¿Ò½ºÆäÀ̽º¸¦ À§ÇÑ µð½ºÅ© ½ºÆäÀ̽º¿¡ ¸¹Àº ºÎºÐÀ» ¼Òºñ ÇÒ ¶§¸¸ ·ÎµåÇÕ´Ï´Ù.

´ÜÁ¡

  • memory overcommit ±â´ÉÀº malloc() ½ÇÆÐ ±¸¹®À» º¯°æ½Ãŵ´Ï´Ù. Ãæ½ÇÇÏ°Ô malloc() ÀÌ NULLÀ» ¸®ÅÏÇÏ´ÂÁö üũ Çϰųª ÀǹÌÀÖ´Â ¿¡·¯ ¸Þ¼¼Áö¸¦ ¹ß»ý½ÃŰ°Å³ª ÀÌ·¯ÇÑ °ÍÀ» ȸÇÇÇÏ´Â ¹æ¹ýµéÀ» »ç¿ëÇÏ´Â °ÍÀº memory overcommit ÀÌ »ç¿ëµÉ¶§¿¡´Â ÀüÇô ¼Ò¿ëÀÌ ¾ø½À´Ï´Ù.
  • memory overcommit ÀÇ »ç¿ëÀº malloc() ÀÇ ¸®ÅϰªÀÌ NULL Æ÷ÀÎÅͰ¡ µÉ ¼ö ¾ø°í ÇÒ´çµÈ ¸Þ¸ð¸®°¡ ¹Ýµå½Ã ÇÊ¿ä½Ã¿¡ »ç¿ë°¡´ÉÇØ¾ß Çϱ⠶§¹®¿¡ Ç¥ÁØ C/C++ ±Ô¾àÀ» ¾î±â°í ÀÖ´Ù´Â ³íÀïÀÌ Á¸ÀçÇÕ´Ï´Ù.
  • °¡Àå Áß¿äÇÑ Á¡Àº memory overcommit ½Ã½ºÅÛ¿¡ VMÀÌ ºÎÁ·ÇÏ´Ù¸é Çϳª ȤÀº ±× ÀÌ»óÀÇ ÇÁ·Î¼¼½º°¡ ¾Ç¸í ³ôÀº OOM(out-of-memory) ÇÁ·Î·¹½º ų·¯¿¡ ÀÇÇØ Á¾·á µË´Ï´Ù. À̰ÍÀº ƯÈ÷ ¿£ÅÍÇÁ¶óÀÌÁî Ŭ·¡½º ȯ°æ¿¡¼­ ¿ë³³µÇÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ´Ù¸¥ »ç¿ëÀÚÀÇ ¾îÇø®ÄÉÀ̼ÇÀÌ ³Ê¹« ¸¹Àº VMÀ» »ç¿ëÇÑ´Ù°í ÇØ¼­ ´Ù¸¥ »ç¿ëÀÚµéÀÇ ¾îÇ÷¹ÄÉÀ̼ÇÀ» Á¾·á ÇÏ´Â °ÍÀº ¿Ã¹Ù¸¥ ¹æ¹ýÀÌ ¾Æ´Õ´Ï´Ù.

ÀÌ·¯ÇÑ À̽´¿¡ ´ëÇÑ Àç¹ÌÀÖ´Â ºñÀ¯°¡ "Respite from the OOM killer," ¿¡ ¹¦»çµÇ¾î ÀÖ½À´Ï´Ù. Âü°íÀÚ·á [5] ¸¦ Âü°í ¹Ù¶ø´Ï´Ù(°ü·ÃµÈ À̽´µé¿¡ ´ëÇÑ ÀÚ·áµµ ÀÖÀ½). "An aircraft company discovered ..." À¸·Î ½ÃÀ۵Ǵ ¹®ÀåÀ» ã¾Æº¸½Ã±â ¹Ù¶ø´Ï´Ù.

¸®´ª½º ¹®¼­´Â ÀÌ·¯ÇÑ À̽´¸¦ ¹Ý´ë·Î »ý°¢ ÇÕ´Ï´Ù. ·¹µåÇÞÀº ±×°ÍÀ» ´ÙÀ½ÀÇ ±Û¿¡¼­¼³¸íÇϰí ÀÖ½À´Ï´Ù: "Understanding Virtual Memory" (Âü°íÀÚ·á [6]), overcommit_memory ÆÄ¶ó¹ÌÅÍ¿¡ ´ëÇÑ ¼³¸íÀ» Æ÷ÇÔÇÔ. "overcommit_memory is a value ..."·Î ½ÃÀÛÇÏ´Â ¹®´ÜÀ» Âü°í ¹Ù¶ø´Ï´Ù.

À§ÀÇ ·¹µåÇÞ ¹®¼­¿¡ overcommit_memory ¿¡ ´ëÇÑ ¼³¸í°ú ¸®´ª½º ¹®¼­¿¡ ÀÖ´Â ¼³¸íÀ» ºñ±³ÇϽñ⠹ٶø´Ï´Ù. Âü°íÀÚ·á [7] ÂüÁ¶. "The Linux kernel supports the following overcommit handling modes."À¸·Î ½ÃÀÛÇÏ´Â ¹®´ÜÀ» ÂüÁ¶ ¹Ù¶ø´Ï´Ù.

¸®´ª½º Ä¿³Î ¹öÁ¯ 2.6°ú ±×ÈÄ¿¡ ¹öÁ¯¿¡¼­´Â ÀÌ·ÐÀûÀ¸·Î Ä¿³ÎÀÇ µ¿ÀÛÀ» ¼öÁ¤ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ Á¸Àç ÇÕ´Ï´Ù. ±×·¯¹Ç·Î overcommit memory °¡ ¹ß»ýÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. À̰ÍÀº strict overcommit mode À» sysctlÀ» ÅëÇØ Á¶Á¤ÇÔÀ¸·Î½á °¡´ÉÇÕ´Ï´Ù:

sysctl -w vm.overcommit_memory=2

ȤÀº µ¿ÀÏÇÑ Àǹ̸¦ °¡Áö°í ÀÖ´Â vm.overcommit_memory=2 À» /etc/sysctl.conf ¿¡ »ðÀÔÇÕ´Ï´Ù.

¸ðµå 2 (2.6ÀÇ »õ·Î¿î ±â´É) Àº ÇöÀç ¿¹ÀüÀÇ ¸®´ª½º Ä¿³Î¿¡¼­ »ç¿ë °¡´ÉÇÑ ¸ðµå 0, 1ÀÇ Çâ»óµÈ ¹öÁ¯ÀÔ´Ï´Ù. ±×·¯³ª ¸ðµå 2°¡ memory overcommit ÀÌ ¹ß»ýÇÏÁö ¾ÊÀ½À» ÀǹÌÇÏ´Â °ÍÀº ¾Æ´Õ´Ï´Ù. ´ÜÁö ¾ó¸¶³ª ¸¹Àº ¾çÀÇ ¸Þ¸ð¸®°¡ ÇÒ´çµÇµµ ¾ÈÀüÇÑÁö °ß°íÇÑ ¿¹Ãø ¹æ¹ý¸¸À» »ç¿ëÇÒ »ÓÀÔ´Ï´Ù.

ÇѰ¡Áö ´õ ÁÖÀÇÇÒ Á¡Àº vm.overcommit_memory=2 Àº ±âº» ¼³Á¤ °ªÀÌ ¾Æ´Õ´Ï´Ù. ±âº» ¼³Á¤°ªÀº vm.overcommit_memory=0 ÀÔ´Ï´Ù.

´ëÁ¶ÀûÀ¸·Î ¼Ö¶ó¸®½º¿¡¼­ ¾îÇø®ÄÉÀ̼ÇÀÌ malloc() À» È£ÃâÇÒ¶§(³»ºÎÀûÀ¸·Î´Â sbrk(2) ¸¦ È£Ãâ ÇÏ¿© ¸Þ¸ð¸®¸¦ ¾ò¾î¿È), Ä¿³ÎÀº »ç¿ë °¡´ÉÇÑ ¸Þ¸ð¸® ¸®½ºÆ®¸¦ °Ë»öÇÏ¿© ¿ä±¸µÈ ¾çÀÇ VMÀÌ »ç¿ë °¡´ÉÇÑÁö ¾Ë¾Æ º¾´Ï´Ù. ¸¸¾à ¹ß°ß µÇ¾ú´Ù¸é Ä¿³ÎÀº ¸Þ¸ð¸®ÀÇ Æ÷ÀÎÅ͸¦ È£Ãâ ÇÏ°í ½º¿Ò °ø°£À» ¿¹¾àÇÏ¿© ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ±× °ø°£À» »ç¿ëÇÏÁö ¸øÇϵµ·Ï ÇÕ´Ï´Ù. »ç¿ë °¡´ÉÇÑ ¸Þ¸ð¸®¸¦ ¹ß°ßÇÏÁö ¸øÇϸé malloc() Àº NULLÀ» ¸®ÅÏÇÕ´Ï´Ù.

¼Ö¶ó¸®½º´Â ¾î¶°ÇÑ Á¾·ùÀÇ °ß°íÇÑ ¿¹Ãø ±â´Éµµ »ç¿ëÇÏÁö ¾Ê½À´Ï´Ù. ±×·¯¹Ç·Î ¸Þ¸ð¸®°¡ ºÎÁ·ÇÒ¶§ Àý´ë ÀÓÀÇÀûÀ¸·Î ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ Á¾·á ½ÃŰÁö ¾Ê½À´Ï´Ù.

¼Ö¶ó¸®½º°¡ malloc() ȤÀº sbrk() ¸¦ ÀÌ¿ëÇÒ¶§ memory overcommit À» ÀÌ¿ëÇÏÁö´Â ¾ÊÁö¸¸ mmap(MAP_NORESERVE) À» ÅëÇØ Á»´õ Á¦¾î¼ºÀ» °¡Áö°í Á¤¹Ð¼ºÀ» ³ôÀÎ ºñ½ÁÇÑ ±â´ÉÀ» »ç¿ë ÇÕ´Ï´Ù. mmap(MAP_NORESERVE) À» ÀÌ¿ëÇÏ¿© °³¹ßÀÚ´Â ÀÌ ¼³ºñ¸¦ ¿ÀÁ÷ ƯÁ¤ÇÏ°Ô ¼±ÅÃµÈ ¸Þ¸ð¸® ¹öÆÛ ȤÀº ¾îÇø®ÄÉÀ̼ǿ¡¸¸ »ç¿ëÀÌ °¡´ÉÇÕ´Ï´Ù. Á» ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº Âü°íÀÚ·á [4]ÀÇ "Virtual Memory Arrays for Application "À» Âü°í ¹Ù¶ø´Ï´Ù.

°¡´ÉÇÒ¶§¿¡¸¸ posix_spawn() ¸¦ È£Ãâ ÇÏ´Â ¹æ¹ý

posix_spawn(3C) ÀÎÅÍÆäÀ̽º´Â ¼Ö¶ó¸®½º10¿¡¼­ ¼Ò°³µÇ¾ú½À´Ï´Ù. ¸¸¾à ¾îÇø®ÄÉÀ̼ÇÀÌ ºôµå µÇ°í posix_spawn(3C) °¡ »ç¿ë°¡´ÉÇÏÁö ¾ÊÀº ¼Ö¶ó¸®½ºÀÇ ÀÌÀü ¹öÁ¯¿¡¼­ ¼öÇàµÇµµ·Ï ÇÏ±æ ¿øÇÑ´Ù¸é ´ÙÀ½°ú °°Àº ¹æ¹ýÀ» »ç¿ë ÇÕ´Ï´Ù.

¾îÇø®ÄÉÀ̼ÇÀº dlsym(RTLD_NEXT,"posix_spawn"))À» ÀÌ¿ëÇÏ¿© µ¿ÀûÀ¸·Î posix_spawn()ÀÌ »ç¿ë °¡´ÉÇÑÁö ¾Ë ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î:

#include <dlfcn.h>
int (*posix_spawn_ptr)();
...
posix_spawn_ptr = (int(*)())dlsym(RTLD_NEXT, "posix_spawn");
if(posix_spawn_ptr != NULL)
{
  /* Call posix_spawn_ptr() the same way as posix_spawn() */
}
else
{
  /* posix_spawn() is not available; use older methods */
}

 

±×·¯³ª ÀÌ·¯ÇÑ ¹ü¿ëÀûÀÎ ¹æ¹ýÀ» ¾²´Âµ¥¿¡´Â ¹®Á¦°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. posix_spawn(3C) Àº ´ÙÀ½°ú °°ÀÌ spawn.h À» ÀÎŬ·çµå ½ÃÄÑ¾ß Çϱâ ?¹®ÀÔ´Ï´Ù:

#include <spawn.h>

¸¸¾à ¼Ö¶ó¸®½º9 ȤÀº ±× ÀÌÀü ¹öÁ¯¿¡¼­ spawn.h °¡ »ç¿ë °¡´ÉÇÏÁö ¾ÊÁö ¾Ê½À´Ï´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ ȸÇÇÇϱâ À§Çؼ­ À§ÀÇ #include <spawn.h> ±¸¹®À» ´ÙÀ½°ú °°ÀÌ º¯°æÇÕ´Ï´Ù:

/*
 * To allow compiling such a program under Solaris 9 or earlier,
 * copy /usr/include/spawn.h from Solaris 10
 * locally and explicitly add definition of _RESTRICT_KYWD.
 * Note that "spawn.h" is included, rather than <spawn.h>.
 */
#if (defined(__STDC__) && defined(_STDC_C99))
#define _RESTRICT_KYWD  restrict
#else
#define _RESTRICT_KYWD
#endif
#include "spawn.h"
 

°á°ú ÇÁ·Î±×·¥Àº ¼Ö¶ó¸®½º10 ȤÀº ±× ÀÌÀü ¹öÁ¯¿¡¼­µµ ¼º°øÀûÀ¸·Î ÄÄÆÄÀÏ µÉ °ÍÀÔ´Ï´Ù.

ÁÖÀÇÇÒ Á¡À¸·Î ¼Ö¶ó¸®½º10ÀÇ Çì´õ ÆÄÀÏÀÇ Ä«ÇǸ¦ °¡Áö°í ÀÖ´Â °ÍÀº spawn.h °¡ º¯°æ µÉ ¼öµµ Àֱ⠶§¹®¿¡ Ãß°¡ÀûÀÎ °ü¸® ³ë·ÂÀÌ ÇÊ¿ä ÇÕ´Ï´Ù. ¼Ö¶ó¸®½º10 ȤÀº ±× ÈÄ ¹öÁ¯¿¡¼­ ¾îÇø®ÄÉÀ̼ÇÀ» ºôµùÇÒ¶§¿¡´Â spawn.h ÀÇ Ä«ÇǺ»À» Á¦°Å Çϰí À§ÀÇ Æ¯º°ÇÑ Æ®¸¯À» ÀÌ¿ëÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. ±×¸®°í ½Ã½ºÅÛ ¹öÁ¯ÀÇ spawn.h À» ´ë½Å Á÷Á¢ÀûÀ¸·Î ÀÌ¿ëÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. °³¹ßÀÚ´Â ÀÌ·¯ÇÑ Æ¯¼öÇÑ Äڵ忡 Ä¿¸àÆ®¸¦ ´Þ¾Æ¼­ ÈÄ¿¡ ´Ù¸¥ °³¹ßÀÚµéÀÌ ¿Ö spawn.h ÀÇ º¹»çº»À» ¾îÇø®ÄÉÀ̼ǿ¡¼­ »ç¿ëÇß´ÂÁö ¾Ë°Ô ÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù.

°¨»çÀÇ ¸»

ÇÊÀÚ´Â ÀÌ ±Û°ú °ü·ÃµÈ À̽´µé¿¡ ´ëÇÑ Á¤º¸¸¦ Á¦°øÇØ ÁØ ½ã µ¿·áµé Morgan Herrington (posix_spawn_example2.cÀ» ÀÛ¼ºÇÔ), Chris Quenelle, ±×¸®°í Eric Sosman ¿¡°Ô °¨»çÀÇ Àλ縦 ÀüÇÕ´Ï´Ù.

Âü°í ÀÚ·á
ÀúÀÚ¿¡ °üÇÏ¿©

Greg Nakhimovsky ´Â ISVÀÇ Á¦Ç°µéÀÌ ½ãÀÇ ½Ã½ºÅÛ¿¡¼­ Àß µ¿ÀÛÇϵµ·Ï ¼ÒÇÁÆ®¿þ¾î º¥´õµé°ú Çù·ÂÇÏ´Â ½ãÀÇ ¿£Áö´Ï¾î ÀÔ´Ï´Ù.