ÇÁ·ÎÆÄÀϸµÀÇ µ¿ÀÛ ¿ø¸®´Â ÇÁ·Î±×·¥³»¿¡ ÀÖ´Â °¢°¢ÀÇ ÇÔ¼öµéÀÌ È£ÃâµÉ ¶§, È£ÃâµÈ ÁöÁ¡¿¡
´ëÇÑ Á¤º¸µéÀ» º¸°üÇصεµ·Ï ¿ø·¡ Äڵ忡 ÇÁ·ÎÆÄÀϸµÀ» À§ÇÑ ³»ºÎ ÇÔ¼ö¸¦ Ãß°¡µÈ
Äڵ带 ¸¸µé°í ÀÌ Äڵ带 ´Ù½Ã ÄÄÆÄÀÏÇÏ¿© ½ÇÇàÇÏ´Â °ÍÀÌ´Ù. ÇÔ¼ö È£Ãâ½Ã¿¡ º¸°üµÇ´Â Á¤º¸¸¦ »ç¿ëÇÏ¿© ÇÁ·ÎÆÄÀÏ·¯´Â ¾î¶² ÇÔ¼ö°¡
È£ÃâµÇ¾ú´ÂÁö, ¸î ¹øÀ̳ª È£ÃâµÇ¾ú´Â Áö¸¦ ¾Ë¾Æ³»°Ô µÈ´Ù. ÄÄÆÄÀÏ·¯ÀÇ `-pg'
¿É¼ÇÀ» »ç¿ëÇϸé ÄÄÆÄÀÏ·¯´Â ÇÁ·Î±×·¥³»ÀÇ ¸ðµç ÇÔ¼ö¿¡ ÇÁ·ÎÆÄÀϸµ¿ë ³»ºÎ ÇÔ¼ö -mcount
: ¿î¿µÃ¼Á¦³ª ÄÄÆÄÀÏ·¯ÀÇ ¹öÀü¿¡ µû¶ó _mcount
, ¶Ç´Â __mcount
·Î
À̸§ÀÌ ¹Ù²ð ¼öµµ ÀÖÀ½ -¿¡ ´ëÇÑ È£ÃâÀ» ÃÖÃÊÀÇ µ¿ÀÛÁß Çϳª·Î »ðÀÔÇÑ´Ù.
ÇÁ·ÎÆÄÀϸµ ¶óÀ̺귯¸®¿¡ Æ÷ÇԵǾî ÀÖ´Â mcount
·çƾÀº ¸Þ¸ð¸®»óÀÇ
call graph table¿¡ ÀÚ½ÅÀÇ parent routine, child routine°ú parent's parent routinÀ»
±â·ÏÇÑ´Ù. ÀÌ·¯ÇÑ °úÁ¤Àº ÀϹÝÀûÀ¸·Î childÀÇ ÁÖ¼Ò¿Í original parent³»¿¡ ÀÖ´Â return
address¸¦ ã±â À§ÇÑ ½ºÅà ÇÁ·¹ÀÓ(stack frame) °Ë»ç¸¦ ÅëÇØ ÀÌ·ç¾îÁø´Ù. ±×·¯³ª
ÀÌ·¯ÇÑ °úÁ¤¿¡¼ »ç¿ëµÇ´Â ¿¬»êµéÀº ¸Ó½®¿¡ µû¶ó ´Ù¸£±â ¶§¹®¿¡, ´ëºÎºÐ mcount
·çƾ ÀÚü´Â ÇÊ¿äÇÑ Á¤º¸¸¦ ÃßÃâÇÑ ÈÄ, frompc,
selfpc
ÀÎÀÚ¸¦ »ç¿ëÇÏ¿© ÀÏ¹Ý CÇÔ¼öÀÎ __mcount_internal
ÇÔ¼ö¸¦ È£ÃâÇϵµ·Ï
ÄÚµùµÈ short assembly-language stub routineÀÌ´Ù. mcount
·çƾ³»ºÎ¿¡¼ È£ÃâµÇ´Â
__mcount_internal
ÇÔ¼ö´Â ¸Þ¸ð¸®»óÀÇ call graph¸¦ °ü¸®ÇÑ´Ù. call
graph´Â
__mcount_internal
ÇÔ¼ö¿¡¼ ÀÎÀÚ·Î ¹ÞÀº i) frompc
, selfpc
¿Í
ii) call arcs °¢°¢¿¡ ´ëÇÑ traversal Ƚ¼ö¸¦ ±â·ÏÇÑ´Ù.
GCC version 2¿¡¼´Â ½ºÅà ÇÁ·¹ÀÓ¿¡¼ ÇÁ·ÎÆÄÀϸµ¿¡ ÇÊ¿äÇÑ Á¤º¸¸¦ ÃßÃâÇÏ´Â ¹ü¿ë mcount
ÇÔ¼ö¸¦
°¡´ÉÄÉÇÏ´Â __builtin_return_address
ÇÔ¼ö°¡ Á¦°øµÈ´Ù. ±×·¯³ª ÀϺÎ
ÄÄÇ»ÅÍ, ƯÈ÷ SPARC ¸Ó½®¿¡¼ __builtin_return_address
ÇÔ¼ö´Â ¸¹Àº
computationÀ» ÇÊ¿ä·Î Çϱ⠶§¹®¿¡ ¼º´É»óÀÇ ÀÌÀ¯·Î ¾î¼Àºí¸® ¹öÀüÀÇ mcount
°¡
»ç¿ëµÈ´Ù.
¶óÀ̺귯¸® ·çƾ¿¡ ´ëÇÑ È£Ãâ Ƚ¼ö Á¤º¸´Â ÇÁ·ÎÆÄÀϸµ¿ë C¶óÀ̺귯¸®(`-lc_p' ¿É¼Ç¿¡ ÀÇÇØ ÁöÁ¤µÇ´Â libc_p.a)-¿¡¼ ¼öÁýµÈ´Ù. ÇÁ·ÎÆÄÀϸµ¿ë C¶óÀ̺귯¸®´Â `-pg' ¿É¼ÇÀ¸·Î ÄÄÆÄÀÏÇÑ´Ù´Â Á¡À» Á¦¿ÜÇÏ°í´Â ÀÏ¹Ý C¶óÀ̺귯¸®¿Í µ¿ÀÏÇÏ´Ù. ÇÁ·Î±×·¥ ¸µÅ©½Ã¿¡ `gcc ... -pg' ¿É¼ÇÀ» »ç¿ëÇϸé ÀÚµ¿À¸·Î ÇÁ·ÎÆÄÀϸµ¿ë C¶óÀ̺귯¸®¿Í ¸µÅ©µÈ´Ù.
ÇÁ·ÎÆÄÀϸµ¿¡´Â ÇÁ·Î±×·¥ ¼öÇàÀ» °¨½ÃÇÏ°í, ÇÁ·Î±×·¥ Ä«¿îÅÍ(PC: program counter)°¡ ¹ß»ýÇÏ´Â ÁöÁ¡ÀÇ È÷½ºÅä±×·¥À» À¯ÁöÇÏ´Â ÀÛ¾÷ÀÌ Æ÷ÇԵȴÙ.. ÇÁ·Î±×·¥ ½ÇÇàÁß¿¡ Åë»ó 1ÃÊ¿¡ 100ȸÁ¤µµ ÇÁ·Î±×·¥ Ä«¿îÅ͸¦ °Ë»çÇÑ´Ù. ±×·¯³ª ÇÁ·Î±×·¥ Ä«¿îÅÍÀÇ Á¤È®ÇÑ °Ë»ç ºóµµ´Â ½Ã½ºÅÛ¸¶´Ù ´Þ¶óÁú ¼ö ÀÖ´Ù.
ÇÁ·Î±×·¥ Ä«¿îÅÍÀÇ °Ë»ç´Â ´ÙÀ½¿¡ ¼³¸íÇÒ µÎ°¡Áö ¹æ½ÄÁß Çϳª¸¦ »ç¿ëÇÑ´Ù. ´ëºÎºÐÀÇ
À¯´Ð½º °è¿ ¿î¿µÃ¼Á¦¿¡¼´Â memory array¸¦ scale factor¿Í ÇÔ²² Ä¿³Î¿¡ µî·ÏÇÏ´Â
profil()
½Ã½ºÅÛ ÄÝÀÌ Á¦°øµÈ´Ù( scale factor¿¡ ÀÇÇØ ÇÁ·Î±×·¥ÀÇ
ÁÖ¼Ò °ø°£ÀÌ ¾î¶»°Ô memory array¿¡ ¸ÅÇεÉÁö °áÁ¤µÈ´Ù). ÀϹÝÀûÀÎ scaling°ªÀº ÁÖ¼Ò°ø°£ÀÇ
2¿¡¼ 8¹ÙÀÌÆ®¸¶´Ù ÇϳªÀÇ memory array slot¿¡ ¸ÊÇÎÇÑ´Ù. ÇÁ·ÎÆÄÀϸµ ±â´ÉÀÌ Ãß°¡µÈ
ÇÁ·Î±×·¥ÀÇ ½ÇÇà½Ã, ½Ã½ºÅÛ Å¬·° ƽ¸¶´Ù, ÇÁ·Î±×·¥ Ä«¿îÅÍÀÇ °ªÀ» °Ë»çÇÏ¿© memory
array³»ÀÇ ´ëÀÀÇÏ´Â slotÀ» Áõ°¡½ÃŲ´Ù. ÀÌ·¯ÇÑ ÀÏ·ÃÀÇ ÀÛ¾÷Àº Ä¿³Î¿¡¼ ¼öÇàµÇ±â ¶§¹®¿¡,
¾à°£ÀÇ ½Ã½ºÅÛ ¿À¹öÇìµå¸¦ °¡Áö°Ô µÈ´Ù( Ä¿³ÎÀº clock interrupt¸¦ ó¸®Çϱâ À§ÇÏ¿©
ÇÁ·Î¼¼½º¸¦ ÀÎÆ®·´Æ®Çϴµ¥ ÀÌ ºÎºÐÀÌ ¿À¹öÇìµå·Î ÀÛ¿ëÇÑ´Ù).
±×·¯³ª ÀϺΠ¿î¿µÃ¼Á¦- ƯÈ÷ Linux 2.0 ¶Ç´Â ±× ÀÌÀü ¹öÀü -¿¡¼´Â profil()
½Ã½ºÅÛ
ÄÝÀÌ Á¦°øµÇÁö ¾Ê´Â´Ù. profil()
½Ã½ºÅÛ ÄÝÀÌ Á¦°øµÇÁö ¾Ê´Â ¿î¿µÃ¼Á¦¿¡¼´Â
Ä¿³ÎÀÌ setitimer()
ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÁÖ±âÀûÀ¸·Î ÇÁ·Î¼¼½º¿¡ ÇÁ·ÎÆÄÀϸµ
½Ã±×³ÎÀ» Àü´ÞÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÑ´Ù. ÇÁ·ÎÆÄÀϸµ ½Ã±×³ÎÀÌ ÇÁ·Î±×·¥ Ä«¿îÅ͸¦ °Ë»çÇÏ°í
memory array³»¿¡ ÀÖ´Â slotÀ» Áõ°¡½ÃŲ´Ù. ÀÌ ¹æ¹ýÀº »ùÇøµÇÒ ¶§¸¶´Ù user space¿¡
½Ã±×³ÎÀ» Àü´ÞÇÏ¿©¾ß Çϱ⠶§¹®¿¡, Ä¿³Î ±â¹ÝÀÇ ÇÁ·ÎÆÄÀϸµº¸´Ù ¿À¹öÇìµå°¡ ¸¹¾ÆÁö°Ô
µÈ´Ù. ¶ÇÇÑ ½Ã±×³Î Àü´Þ¿¡ µû¸¥ ½Ã°£ Áö¿¬À¸·Î ÀÎÇØ, Á¤È®µµ°¡ ´Ù¼Ò ¶³¾îÁö´Â ´ÜÁ¡µµ
ÀÖ´Ù.
startup routine monstartup
Àº ¸ÕÀú È÷½ºÅä±×·¥¿¡ ÇÊ¿äÇÑ ¸Þ¸ð¸®¸¦
ÇÒ´çÇÏ°í, À§¿¡¼ ¼³¸íÇÑ profil()
ÇÔ¼ö¸¦ È£ÃâÇϰųª ¶Ç´Â Ŭ·° ½Ã±×³Î
Çڵ鷯(clock signal handler)¸¦ ¼³Á¤ÇÏ´Â ¹æ½ÄÁß Çϳª¸¦ »ç¿ëÇÏ¿© ÇÁ·ÎÆÄÀϸµÀ»
À§ÇÑ ÀÛ¾÷À» °³½ÃÇÑ´Ù. monstartup
Àº ¿©·¯ °¡Áö ¹æ½ÄÀ¸·Î È£ÃâµÉ ¼ö
ÀÖ´Ù. Linux ½Ã½ºÅÛÀÇ °æ¿ì, ÇÁ·ÎÆÄÀϸµ ±â´ÉÀ» È°¼ºÈÇÏ¿© ÄÄÆÄÀÏÇϸé ÀϹÝÀûÀ¸·Î
»ç¿ëµÇ´Â startup fileÀÎ crt0.o
´ë½Å¿¡ ÇÁ·ÎÆÄÀϸµÀ» À§ÇÑ startup
fileÀÎ gcrt0.o
¸¦ »ç¿ëÇÑ´Ù. gcrt0.o
´Â ¸ÕÀú monstartup
¸¦
È£ÃâÇÏ°í ´ÙÀ½¿¡ main
À» È£ÃâÇÑ´Ù. ÇÁ·ÎÆÄÀϸµÀ» À§ÇÑ startup file
gcrt0.o
°¡ »ç¿ëµÇ°Ô ÇÏ·Á¸é ¸µÅ©½Ã¿¡ `gcc ... -pg' ¸¦
»ç¿ëÇÏ¿©¾ß ÇÑ´Ù. SPARC ½Ã½ºÅÛÀÇ °æ¿ì¿¡´Â Ưº°ÇÑ startup·çƾÀÌ »ç¿ëµÇÁö´Â ¾Ê°í,
´ë½Å¿¡ ´ë°³´Â main
ÀÌ È£ÃâµÇ¾úÀ» ¶§ óÀ½À¸·Î È£ÃâµÇ´Â ·çƾ mcount
ÇÔ¼ö¿¡¼
monstartup
À» È£ÃâÇÑ´Ù.
ÄÄÆÄÀÏ·¯ÀÇ `-a' ¿É¼ÇÀÌ »ç¿ëµÈ °æ¿ì, ±âº» ºí·Ï Ä«¿îÆà ±â´Éµµ È°¼ºÈµÇ°í,
°¢°¢ÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏÀº ÃʱⰪÀ» 0·Î ÇÏ´Â Ä«¿îÆ®µéÀÇ Á¤Àû ¹è¿(static
array of counts)°ú ÇÔ²² ÄÄÆÄÀϵȴÙ. ½ÇÇàÄÚµå ³»ºÎ¿¡´Â »õ·Î¿î ±âº» ºí·ÏÀÌ ½ÃÀÛÇÒ
¶§ ¸¶´Ù (Áï, if
¹®ÀÌ ³ªÅ¸³¯ ¶§¸¶´Ù), ±× À§Ä¡¿¡ ¹è¿³»ÀÇ ÇØ´ç Ä«¿îÆ®¸¦
Áõ°¡½ÃÅ°´Â ÀνºÆ®·°¼ÇµéÀÌ »ðÀԵȴÙ. ÄÄÆÄÀÏ ½Ã¿¡ °¢°¢ÀÇ ±âº» ºí·ÏÀÇ ½ÃÀÛ
ÁÖ¼Ò¸¦ ±â·ÏÇϱâ À§ÇÑ ÁÖ¼ÒÀÇ ½ÖÀ» ¿ø¼Ò·Î ÇÏ´Â ¹è¿(paired array)ÀÌ ¸¸µé¾îÁø´Ù.
À̵é ÀڷᱸÁ¶µé- ¿ÀºêÁ§Æ®ÈÀÏ¿¡ ±âº» ºí·Ï Ä«¿îÆÃÀ» À§ÇØ Ãß°¡µÈ Á¤Àû ¹è¿°ú ÄÄÆÄÀϽÿ¡
±âº» ºí·ÏÀÇ ÁÖ¼Ò¸¦ ±â·ÏÇϱâ À§ÇØ ¸¸µé¾îÁø ÁÖ¼ÒÀÇ ½ÖÀ» ¿ø¼Ò·Î ÇÏ´Â ¹è¿-À» ÅëÇØ
±âº» ºí·ÏÀÌ ½ÇÇàµÈ Ƚ¼ö¿Í ±âº» ºí·ÏÀÇ ÁÖ¼Ò¸¦ ±â·ÏÇÏ°Ô µÈ´Ù.
ÇÁ·ÎÆÄÀϸµ ¶óÀ̺귯¸®¿¡´Â cleanup routine mcleanup
ÀÌ Æ÷ÇԵǾî ÀÖ´Ù.
cleanup routine mcleanup
Àº ´ë°³ ÇÁ·Î±×·¥ Á¾·á½Ã¿¡ ÀÚµ¿À¸·Î È£ÃâµÇµµ·Ï
atexit()
ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© µî·ÏµÈ´Ù. mcleanup
Àº ¸Þ¸ð¸®»ó¿¡
ÀÖ´Â ÇÁ·ÎÆÄÀϸµ °ü·Ã Á¤º¸¸¦ `gmon.out' ÆÄÀÏ¿¡ ±â·ÏÇÏ´Â ÀÏÀ» ¼öÇàÇÑ´Ù.
ÇÁ·ÎÆÄÀϸµÀÌ ´Ù ³¡³ª¸é ¿©·¯ °¡Áö Çì´õµéÀÌ Ãâ·ÂµÇ°í, È÷½ºÅä±×·¥ÀÌ ±â·ÏµÇ¸ç, ¸¶Á÷¸·À¸·Î
call graph arc¿Í ±âº» ºí·Ï Ä«¿îÆÃÀÌ Ãâ·ÂµÇ°Ô µÈ´Ù.
gprof
¿¡¼ ³ª¿Â Ãâ·ÂÀ» ÅëÇؼ ÇÁ·Î±×·¥³»ÀÇ ¾î¶² ºÎºÐÀÌ I/O¶Ç´Â swapping
bandwidth·Î ÀÎÇØ Á¦ÇÑÀ» ¹Þ°í ÀÖ´ÂÁö¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë ¼ö´Â ¾ø´Ù. ÀÌ´Â ÇÁ·Î±×·¥
Ä«¿îÅÍÀÇ »ýÇõéÀÌ ÇÁ·Î±×·¥ ½ÇÇàÁß(In run state)¿¡ °íÁ¤µÈ °£°ÝÀ¸·Î ¼öÁýµÇ¾ú±â
¶§¹®ÀÌ´Ù. µû¶ó¼ gprof
Ãâ·Â³»¿¡ ÀÖ´Â ½Ã°£ ÃøÁ¤°ªµé¿¡´Â ÇÁ·Î±×·¥ÀÌ
swappingÀ̳ª I/O¶Ç´Â ÇÁ·Î¼¼½º ½ºÄÉÁ층¿¡ ÀÇÇØ ½ÇÇà »óÅ¿¡ ÀÖÁö ¾ÊÀ» ¶§( not
in run )ÀÇ ½Ã°£¿¡ ´ëÇÑ Á¤º¸´Â Çϳªµµ Æ÷ÇԵǾî ÀÖÁö ¾Ê´Ù. ¿¹¸¦ µé¾î, ÇÁ·Î±×·¥ÀÇ
ƯÁ¤ ºÎºÐ¿¡¼ ¹°¸®Àû ¸Þ¸ð¸®º¸´Ù Å« ¾çÀÇ µ¥ÀÌÅ͸¦ ¸¸µé¾î ³¾ °æ¿ì¿¡´Â thrashingÀ¸·Î
ÀÎÇØ »ó´çÈ÷ ´À·Á Áú ¼ö °¡ ÀÖ´Ù. ±×·¯³ª gprof
¿¡¼´Â thrashingÀ¸·Î
ÀÎÇØ ´À·ÁÁ³´ø ±â°£À» ¾ÆÁÖ ÂªÀº ½Ã°£À¸·Î º¸°íÇÒ ¼öµµ ÀÖ´Ù. ÇÑÆí, ½ÇÇà ½Ã°£¿¡
µû¸¥ »ùÇøµÀº ½Ã½ºÅÛ³»ÀÇ ´Ù¸¥ »ç¿ëÀڵ鿡 ÀÇÇØ ¹ß»ýÇÑ ·Îµå¿¡ ÀÇÇØ ÇÁ·ÎÆÄÀϸµ
Ãâ·Â °á°ú°¡ Á÷Á¢ÀûÀÎ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù.
ÇÁ·ÎÆÄÀÏ µ¥ÀÌÅÍ¿¡ »ç¿ëµÇ¾ú´ø ÀÌÀü BSD°è¿ÀÇ ÆÄÀÏ Æ÷¸ËÀº data fileÀÌ
gprof
fileÀÎÁö¸¦ °Ë»çÇϴµ¥ »ç¿ëÇÏ´Â magic cookie
°¡
Æ÷ÇԵǾî ÀÖÁö ¾Ê´Ù. ¶ÇÇÑ ÀÌ Æ÷¸Ë¿¡´Â ¹öÀü ¹øÈ£(version number)¸¦ °¡Áö°í ÀÖÁö
¾Ê¾Ò±â ¶§¹®¿¡, ÆÄÀÏ Æ÷¸ËÀ» º¯°æÇϱⰡ ºÒ°¡´ÉÇÏ¿´´Ù. GNU gprof
´Â magic cookie
¿Í ¹öÀü ¹øÈ£(version number)¸¦ ¸ðµÎ Á¦°øÇÏ´Â »õ·Î¿î
ÆÄÀÏ Æ÷¸ËÀ» »ç¿ëÇÑ´Ù. ÀÌÀü ¹öÀü°úÀÇ È£È¯¼ºÀ» À§Çؼ GNU gprof
°¡
°è¼ÓÇؼ ÀÌÀü BSD°è¿ÀÇ Æ÷¸ËÀ» Áö¿øÇϱâ´Â ÇÏÁö¸¸ ¸ðµç ±â´ÉÀÌ Á¦°øµÇ´Â
°ÍÀº ¾Æ´Ï´Ù. ¿¹¸¦ µé¾î, ±âº» ºí·Ï ½ÇÇà Ä«¿îÆ®¿Í °°Àº ±â´ÉÀº ÀÌÀü ÆÄÀÏ Æ÷¸ËÀ¸·Î´Â
Ç¥ÇöÇÒ ¼ö ¾ø´Ù.
GNU gprof
¿¡¼ »ç¿ëÇÏ´Â »õ·Î¿î ÆÄÀÏ Æ÷¸ËÀº `gmon_out.h'¿¡ Á¤ÀǵǾî ÀÖ´Ù. »õ·Î¿î
ÆÄÀÏ Æ÷¸ËÀº ÃßÈÄ È®ÀåÀ» À§ÇÑ ¿¹ºñ ¹ÙÀÌÆ®µé°ú magic cookie¿Í ¹öÀü ¹øÈ£¸¦ Æ÷ÇÔÇÏ°í
ÀÖ´Â Çì´õ·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ÇÁ·ÎÆÄÀÏ µ¥ÀÌÅÍ ÆÄÀϳ»¿¡ ÀÖ´Â ¸ðµç µ¥ÀÌÅÍ´Â ÇÁ·ÎÆÄÀÏ
µ¥ÀÌÅÍ°¡ ¼öÁýµÈ È£½ºÆ®ÀÇ ¾ÆÅ°ÅØÃĸ¦ µû¸£´Â Æ÷¸ËÀ¸·Î µÇ¾îÀÖ´Ù. GNU gprof
˼
ÇØ´ç È£½ºÆ®ÀÇ ¾ÆÅ°ÅØÃÄ¿¡¼ »ç¿ëÁßÀÎ byte-order¿¡ ÀÚµ¿À¸·Î ¸ÂÃá´Ù.
»õ·Î¿î ÆÄÀÏ Æ÷¸Ë¿¡¼´Â Çì´õ, ·¹ÄÚµåÀÇ ¼øÀ¸·Î Ãâ·ÂµÈ´Ù. ÇöÀç´Â ¼¼ °³ÀÇ ¼·Î
´Ù¸¥ ·¹ÄÚµå ŸÀÔ- È÷½ºÅä±×·¥ ·¹ÄÚµå, call-graph arc ·¹ÄÚµå, ±âº» ºí·Ï ½ÇÇà Ä«¿îÆ®
·¹ÄÚµå- ÀÌ ÀÖ´Ù. °¢°¢ÀÇ ÇÁ·ÎÆÄÀϸµ µ¥ÀÌÅÍ ÆÄÀÏÀº ÀÓÀÇ °¹¼ö°³ÀÇ ·¹ÄÚµå ŸÀÏÀ»
Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù. GNU gprof
´Â ÇÁ·ÎÆÄÀϸµ µ¥ÀÌÅÍ ÆÄÀÏÀ» ÀоîµéÀÎÈÄ,µ¿ÀÏÇÑ
ŸÀÔÀÇ ·¹ÄÚµåµé³¢¸® ¼·Î ȣȯ¼ºÀÌ ÀÖ´ÂÁö¸¦ È®ÀÎÇÏ°í ¸ðµç ·¹ÄÚµåµéÀÇ ÇÕÁýÇÕÀ» ±¸ÇÑ´Ù.
¿¹¸¦ µé¾î, ±âº» ºí·Ï Ä«¿îÆ® ·¹ÄÚµå ŸÀÔÀÇ °æ¿ì, ÀÌµé ·¹ÄÚµåÀÇ ÇÕÁýÇÕÀº ¸ðµç
±âº» ºí·ÏÀÇ ½ÇÇà Ä«¿îÆ®ÀÇ ´Ü¼ø ÇÕÀÌ´Ù.
È÷½ºÅä±×·¥ ·¹ÄÚµå´Â Çì´õ¿Í binsÀÇ ¹è¿·Î ±¸¼ºµÈ´Ù. Çì´õ¿¡´Â È÷½ºÅä±×·¥ÀÌ Ã¤¿öÁö´Â text-segment range, ¹ÙÀÌÆ® ´ÜÀ§ÀÇ È÷½ºÅä±×·¥ Å©±â(±¸Çü BSDÆ÷¸Ë°ú ´Þ¸®, ÀÌ Å©±â¿¡´Â Çì´õÀÇ Å©±â´Â Æ÷ÇÔµÇÁö ¾Ê´Â´Ù), ÇÁ·ÎÆÄÀϸµ Ŭ·°ÀÇ ¼Óµµ, ÇÁ·ÎÆÄÀϸµ Ŭ·° ¼Óµµ¿¡ µû¶ó ½ºÄÉÀÏµÈ ÈÄ¿¡ bin Ä«¿îÆ®µéÀÌ ³ªÅ¸³»´Â ¹°¸®Àû ´ÜÀ§(physical dimension)°¡ Æ÷ÇԵǾî ÀÖ´Ù. ¹°¸®Àû ´ÜÀ§´Â ÃÖ´ë 15°³ÀÇ ¹®ÀÚ·Î ±¸¼ºµÈ À̸§°ú 1°³ÀÇ ¹®ÀÚ·ÎµÈ ¾àÀڷΠǥ½ÃµÈ´Ù. ¿¹¸¦ µé¾î, ½Ç½Ã°£(real-time)À» ³ªÅ¸³»´Â È÷½ºÅä±×·¥Àº ½ÇÁ¦ ¼öÄ¡ ´ÜÀ§ À̸§À¸·Î "seconds", ½ÇÁ¦ ¼öÄ¡ ´ÜÀ§ÀÇ ¾àÀÚ·Î "s"·Î Ç¥½ÃÇÑ´Ù. ÀÌ ±â´ÉÀº ¼º´É ¸ð´ÏÅÍ Çϵå¿þ¾î(performance monitor hardware)¸¦ Áö¿øÇÏ´Â ¾ÆÅ°ÅØÃÄ¿¡¼ À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, DEC OSF/1¿¡¼´Â "uprofile" ¸í·É¾î¸¦ »ç¿ëÇÏ¿© ÀνºÆ®·°¼ÇÀÇ Ä³½¬ ¹Ì¾²¿¡ ´ëÇÑ È÷½ºÅä±×·¥À» ¸¸µé ¼ö ÀÖ´Ù. ÀÌ °æ¿ì, È÷½ºÅä±×·¥ Çì´õ¿¡ ÀÖ´Â ½ÇÁ¦ ¼öÄ¡ ´ÜÀ§ÀÇ À̸§Àº "i-cache misses" ·Î, ´ÜÀ§ÀÇ ¾à¾î´Â "1"·Î ¼³Á¤ÇÒ ¼ö ÀÖ´Ù( ij½¬ ¹Ì¾²ÀÇ È½¼ö´Â ´Ü¼ø Ä«¿îÆ®ÀÌÁö ¹°¸®ÀûÀÎ ´ÜÀ§°¡ ¾Æ´Ï±â ¶§¹®ÀÌ´Ù). ¶ÇÇÑ ÀÌ °æ¿ì¿¡ ÇÁ·ÎÆÄÀϸµ ¼Óµµ(profiling rate)´Â 1·Î ¼³Á¤µÇ¾î¾ß ÇÑ´Ù.
È÷½ºÅä±×·¥ binÀº 16ºñÆ® ¼ýÀÚ·Î °¢°¢ÀÇ binÀº µ¿ÀÏÇÑ Å©±âÀÇ text-space¸¦ ³ªÅ¸³½´Ù. ¿¹¸¦ µé¾î, text-segment°¡ 1,000 ¹ÙÀÌÆ®ÀÌ°í È÷½ºÅä±×·¥¿¡ 10°³ÀÇ binÀÌ ÀÖ´Ù¸é, °¢°¢ÀÇ binÀº 100¹ÙÀÌÆ®¸¦ ³ªÅ¸³½´Ù.
Call-graph ·¹ÄÚµå´Â BSD°è¿ÀÇ ÆÄÀÏ Æ÷¸Ë¿¡¼ »ç¿ëÇÑ °Í°ú µ¿ÀÏÇÑ Æ÷¸ËÀ» °¡Áö°í ÀÖ´Ù. Call-graph ·¹ÄÚµå´Â call graphÀÇ ÇϳªÀÇ arc¿Í ÇÁ·Î±×·¥ ½ÇÇàÁß¿¡ arc°¡ traversedµÈ Ƚ¼ö¸¦ ³ªÅ¸³»´Â Ä«¿îÆ®·Î ±¸¼ºµÈ´Ù. Arc´Â ÁÖ¼ÒÀÇ ½ÖÀ¸·Î Ç¥ÇöµÇ¸ç, ù ¹ø° ÁÖ¼Ò´Â caller ÇÔ¼öÀÇ ³»ºÎ¿¡ ÀÖ´Â ÁÖ¼ÒÀÌ°í, µÎ ¹ø° ÁÖ¼Ò´Â calleeÇÔ¼ö³»ºÎ¿¡ ÀÖ´Â ÁÖ¼ÒÀ̾î¾ß ÇÑ´Ù. ÇÔ¼ö ´ÜÀ§·Î ÇÁ·ÎÆÄÀϸµÀ» ¼öÇàÇÒ¶§, À̵é ÁÖ¼Ò´Â °¢°¢ÀÇ ÇÔ¼ö ³»ºÎÀÇ ÀÓÀÇ À§Ä¡¸¦ Æ÷ÀÎÆ®ÇÒ ¼ö ÀÖÁö¸¸, ¶óÀÎ ´ÜÀ§·Î ÇÁ·ÎÆÄÀϸµÇÒ ¶§´Â À̵é ÁÖ¼Ò°¡ È£ÃâÀÌ ¹ß»ýÇÑ ÁöÁ¡(call-site)°ú ÇÔ¼öÀÇ entry-point¿¡ °¡´ÉÇÑ °¡±î¿ï¼ö·Ï ÁÁ´Ù. ¶óÀÎ ´ÜÀ§ ÇÁ·ÎÆÄÀϸµ¿¡¼ È£ÃâÁöÁ¡¶Ç´Â enrty-point¿¡ °¡´ÉÇÑ ±ÙÁ¢ÇÑ ÁÖ¼Ò¸¦ arc¿¡¼ »ç¿ëÇÔÀ¸·Î¼ ¶óÀÎ ´ÜÀ§ÀÇ Call graph°¡ ¼Ò½ºÄÚµåÀÇ ¾î´À ¶óÀο¡¼ ƯÁ¤ ÇÔ¼ö°¡ È£ÃâµÇ¾ú´Â Áö¸¦ Á¤È®ÇÏ°Ô ±¸ºÐÇϵµ·Ï º¸ÀåÇÑ´Ù.
±âº» ºí·Ï ½ÇÇà Ä«¿îÆ® ·¹ÄÚµå´Â Çì´õ¿Í address/count ½ÖµéÀÇ ½ÃÄö½º·Î ±¸¼ºµÇ¾î ÀÖ´Ù. Çì´õ´Â ½ÃÄö½ºÀÇ Å©±â¸¦ ³ªÅ¸³»¸ç, °¢°¢ÀÇ address/count½Ö¿¡¼ address´Â ±âº» ºí·Ï°ú ¿¬°üµÈ ÁÖ¼ÒÀ̸ç, count´Â ±âº» ºí·ÏÀÌ ½ÇÇàµÈ Ƚ¼öÀÌ´Ù. ±âº» ºí·Ï ³»¿¡ ÀÖ´Â ÀÓÀÇ ÁÖ¼Ò°¡ address¿¡ »ç¿ëµÉ ¼ö ÀÖ´Ù.
gprof
ÀÇ ³»ºÎ µ¿ÀÛ
°úÁ¤
´Ù¸¥ ¸ðµç ÇÁ·Î±×·¥°ú ¸¶Âù°¡Áö·Î gprof
´Â ¸ÕÀú ¸í·ÉÇà ¿É¼ÇÀ»
ó¸®ÇÑ´Ù. SymspecsÀ» »ç¿ëÇÏ´Â ¿É¼ÇÀÌ ¸í·ÉÇà¿¡¼ ¼³Á¤µÇ¾î ÀÖÀ¸¸é ¸í·ÉÇà ¿É¼Ç
󸮸¦ ÇÏ´Â Áß¿¡,
gprof
´Â ÀÚ½ÅÀÇ symspec ¸®½ºÆ®
(sym_ids.c:sym_id_add
) ¸¦ ¸¸µç´Ù.
gprof
´Â symspecs¸¦ ´ÜÀÏ ¿¬°á ¸®½ºÆ®(single linked list)·Î À¯ÁöÇÏ°í, ´ÜÀÏ ¿¬°á ¸®½ºÆ®´Â
³ªÁß¿¡ 12°³ÀÇ ½Éº¼ Å×À̺íµé·Î º¯È¯µÈ´Ù. 12°³ÀÇ ½Éº¼ Å×À̺íµéÀº 6°³ÀÇ include/exclude
½ÖÀ¸·Î ±¸¼ºµÈ´Ù. ¿©¼¸ °³ÀÇ include/exclude½ÖÀº ´ÙÀ½°ú °°´Ù.
1) flat profile¿ë (INCL_FLAT/EXCL_FLAT),
2) call graph arcs¿ë (INCL_ARCS/EXCL_ARCS),
3) call graph³»¿¡¼ÀÇ Ãâ·Â±â´É Á¦¾î¿ë (INCL_GRAPH/EXCL_GRAPH),
4) call
graph¿¡¼ÀÇ ½Ã°£ ÀüÆÄ ±â´É Á¦¾î¿ë (INCL_TIME/EXCL_TIME),
5) annotated source
¸®½ºÆà ±â´É Á¦¾î¿ë (INCL_ANNO/EXCL_ANNO),
6) ½ÇÇà Ä«¿îÆ®(execution count)
¸®½ºÆà ±â´É Á¦¾î¿ë(INCL_EXEC/EXCL_EXEC).
¸í·ÉÇà ¿É¼ÇÀ» ó¸®ÇÑ ÈÄ¿¡, gprof
´Â ´ÙÀ½°ú °°Àº ÀÛ¾÷À» ÅëÇØ symspec ¸®½ºÆ®¸¦
ÀÛ¼ºÇÏ´Â ÀÛ¾÷À» ¸¶Ä£´Ù.
1)
default_excluded_list
¿¡ ÀÖ´Â ¸ðµç symspecs¸¦ exclude lists EXCL_TIME,
EXCL_GRAPH¿¡ Ãß°¡,
2) ¶óÀÎ ´ÜÀ§ ÇÁ·ÎÆÄÀϸµÀÌ ÁöÁ¤µÈ °æ¿ì¿¡´Â default_excluded_list
¿¡
ÀÖ´Â symspecs¸¦ EXCL_FLAT ¿¡µµ Ãß°¡
(EXCL_ANNO, EXCL_ARCS ¿Í EXCL_EXEC¿¡´Â default_excluded_list
¿¡
ÀÖ´Â symspecs°¡ Ãß°¡µÇÁö ¾Ê´Â´Ù.)
´ÙÀ½À¸·Î, ÀûÀýÇÑ Å©±âÀÇ ½Éº¼ ¹è¿À» mallocÇÑ ÈÄ¿¡´Â ¿ÀºêÁ§ºê ÆÄÀÏÀ» ¿°í,
¿ÀºêÁ§Æ® ÆÄÀÏÀÎÁö °Ë»çÇÏ°í, bfd_canonicalize_symtab
¸¦ »ç¿ëÇÏ¿©
¿ÀºêÁ§Æ®ÀÇ ½Éº¼ Å×À̺í(core.c:core_init)À» Àбâ À§ÇÏ¿© BFD¶óÀ̺귯¸®°¡ È£ÃâµÈ´Ù.
`--file-ordering' ¿É¼ÇÀÌ ¸í·ÉÇà¿¡¼ ¼³Á¤µÇ¾ú´Ù¸é, ÀÌ ½ÃÁ¡¿¡¼
ÇÔ¼ö ¸ÅÇÎÀÌ ÀÐÇôÁö°í, `-c' ¿É¼ÇÀÌ ÁÖ¾îÁø °æ¿ì core text
space°¡ ¸Þ¸ð¸®·Î ÀÐÇôµé¿©Áø´Ù.
À̶§¼¾ß ºñ·Î¼Ò Sym structure
ÀÇ ¹è¿ÀÎ gprof ÀÇ ÀÚü ½Éº¼ Å×À̺íÀÌ
¸¸µé¾îÁø´Ù. ÀÌ °úÁ¤Àº ¶óÀÎ ´ÜÀ§ ÇÁ·ÎÆÄÀϸµÀ» ÁöÁ¤ÇÏ´Â `-l' ¿É¼Ç ¼³Á¤¿©ºÎ¿¡ µû¶ó,
´ÙÀ½¿¡ ¼³¸íÇÒ µÎ°¡Áö ¹æ½ÄÁß Çϳª¸¦ »ç¿ëÇÏ¿© ¼öÇàµÈ´Ù. ÀϹÝÀûÀÎ ÇÁ·ÎÆÄÀϸµÀÇ
°æ¿ì, BFD canonical symbol tableÀ» °Ë»çÇÑ´Ù. ¶óÀÎ ´ÜÀ§ ÇÁ·ÎÆÄÀϸµÀÏ ¶§¿¡´Â
¸ðµç text space address¸¦ °Ë»çÇÏ¿© ¶óÀÎ ¹øÈ£°¡ ¹Ù²ð ¶§¸¶´Ù, »õ·Î¿î ½Éº¼ Å×À̺í
¿£Æ®¸®°¡ »ý¼ºµÈ´Ù. ¾î´À ¹æ½ÄÀ̵ç, ÇÊ¿äÇÑ ½Éº¼Å×À̺í Å©±â¸¦ °è»êÇÏ´Â °úÁ¤°ú ½ÇÁ¦
½Éº¼À» ÀоîµéÀÌ´Â 2´Ü°è·Î ±¸¼ºµÈ´Ù. ÀÌµé ´Ü°èÀÇ Áß°£¿¡¼, ÀûÀýÇÑ Å©±â Sym
ŸÀÔÀÇ
´ÜÀÏ ¹è¿ÀÌ »ý¼ºµÈ´Ù. ¸¶Áö¸·À¸·Î symtab.c:symtab_finalize
À» È£ÃâÇÏ¿© ½Éº¼ Å×À̺íÀ» ¼ÒÆÃÇÏ°í, Áߺ¹µÈ ½Éº¼ ¿£Æ®¸®(µ¿ÀÏÇÑ ÁÖ¼Ò¸¦ °¡Áø ½Éº¼
¿£Æ®¸®)¸¦ »èÁ¦ÇÑ´Ù.
½Éº¼ Å×À̺íÀº ´ÙÀ½°ú °°Àº µÎ°¡Áö ÀÌÀ¯·Î ¿¬¼ÓÀûÀÎ ¹è¿(contiguous array)À̾î¾ß
ÇÑ´Ù. ù° ½Éº¼ Å×À̺íÀ» ¼ÒÆ®Çϱâ À§ÇØ ¹è¿À» ¼ÒÆ®ÇÏ´Â qsort
¶óÀ̺귯¸®
ÇÔ¼ö¸¦ »ç¿ëÇϱ⠶§¹®ÀÌ´Ù. ¶ÇÇÑ ¸Þ¸ð¸® ÁÖ¼Ò¿¡ ±â¹ÝÇÏ¿© ÀÌÁø Ž»ö ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ´Â
½Éº¼ °Ë»ö ·çƾ(symtab.c:sym_lookup
)¿¡¼ ½Éº¼Å×À̺íÀÌ sorted arrayÀ̵µ·Ï
¿ä±¸Çϱ⠶§¹®ÀÌ´Ù. ÇÔ¼ö ½Éº¼Àº is_func
Ç÷¡±×·Î ±¸ºÐµÇ°í, ¶óÀÎ
¹øÈ£ ½Éº¼Àº Ưº°ÇÑ Ç÷¡±× ¼³Á¤ÀÌ ¾ø´Ù. Ãß°¡ÀûÀ¸·Î ·ÎÄà ½Éº¼ÀÏ °æ¿ì¿¡´Â À̸¦
³ªÅ¸³»±â À§ÇÏ¿© is_static
Ç÷¡±×¸¦ °¡Áø´Ù.
ÀоîµéÀÎ ½Éº¼Å×À̺íÀ» »ç¿ëÇÏ¿©, symspecsÀ» Syms·Î ¹ø¿ªÇÑ´Ù(sym_ids.c:sym_id_parse
).
ÇϳªÀÇ symspecÀÌ º¹¼ö°³ÀÇ ½Éº¼À» ³ªÅ¸³¾ ¼ö ÀÖ´Ù´Â »ç½ÇÀ» ±â¾ïÇÏ¿©¾ß ÇÑ´Ù. ½Éº¼
Å×À̺í(syms
)ÀÇ ¹è¿ÀÌ ÇÑ °³ »ý¼ºµÈ´Ù. ½Éº¼ Å×À̺íÀÇ °¢°¢ÀÇ ¿£Æ®¸®´Â
°¢°¢ÀÇ ¸®½ºÆÿ¡¼ Æ÷ÇÔ ¶Ç´Â ¹èÁ¦µÉ syms
ÀÇ Å×À̺íÀÌ´Ù. ¸¶½ºÅÍ
½Éº¼ Å×À̺í°ú symspecs´Â ÁßøµÈ ·çÇÁ¿¡ ÀÇÇØ °Ë»çµÇ°í, symspecs¿¡ ÀÏÄ¡ÇÏ´Â ¸ðµç
½Éº¼Àº ÀûÀýÇÑ syms Å×ÀÌºí¿¡ »ðÀԵȴÙ. ÀÌ °úÁ¤Àº µÎ ¹ø ¼öÇàµÇ´Âµ¥, ù ¹ø° ¼öÇà¿¡¼´Â
°¢°¢ÀÇ ½Éº¼ Å×ÀÌºí¿¡ ÇÊ¿äÇÑ Å©±â¸¦ °è»êÇÏ°í, µÎ ¹ø° ¼öÇà¿¡¼ ½ÇÁ¦·Î Å×À̺íÀ» ¸¸µç´Ù.
Å×À̺íÀ» À§ÇÑ °ø°£Àº ù ¹ø° ¼öÇà°ú µÎ ¹ø° ¼öÇà»çÀÌ¿¡¼ mallocµÈ´Ù. ±×¸®°í³ª¼
¾î¶² ½Éº¼ÀÌ include symspecs list¶Ç´Â exclude symspec list¿¡ ÀÖ´Â Áö¸¦ °áÁ¤Çϱâ
À§ÇØ, gprof
˼ syms
¹è¿¿¡ ÀÖ´Â Àû´çÇÑ Å×ÀÌºí¿¡ ½Éº¼
Ž»ö ·çƾÀ» »ç¿ëÇÑ´Ù.
´ÙÀ½À¸·Î ÇÁ·ÎÆÄÀÏ µ¥ÀÌÅÍ ÆÄÀÏ ÀÚü¸¦ Àдµ¥
(gmon_io.c:gmon_out_read
), ¸ÕÀú »õ·Î¿î ½ºÅ¸ÀÏÀÇ gmon.out' Çì´õ¸¦
°Ë»çÇÏ°í, magic number¸¦ °Ë»çÇÏ¿© ½ÇÆÐÇϸé, ±¸Çü BSD `gmon.out'
À¸·Î °¡Á¤ÇÑ´Ù.
hist.c:hist_read_rec
ÇÔ¼ö´Â »õ·Î¿î ½ºÅ¸ÀÏÀÇ È÷½ºÅä±×·¥ ·¹ÄÚµåµéÀ»
Àд´Ù. ÃÖÃÊ È÷½ºÅä±×·¥ ·¹Äڵ忡 ´ëÇÏ¿© ¸ðµç binÀ» º¸°üÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í,
¸ðµç binÀ» ÀоîµéÀδÙ. º¹¼ö°³ÀÇ ÇÁ·ÎÆÄÀÏ µ¥ÀÌÅÍ ÆÄÀÏ ¶Ç´Â º¹¼ö°³ÀÇ È÷½ºÅä±×·¥
·¹Äڵ带 °¡Áø ÆÄÀÏÀ» ÀоîµéÀÏ ¶§, ½ÃÀÛ ÁÖ¼Ò, ³¡ÁÖ¼Ò, binÀÇ °¹¼ö, »ùÇøµ ¼Óµµ°¡
¿©·¯ È÷½ºÅä±×·¥µé°£¿¡ ÀÏÄ¡ÇÏ¿©¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀº °æ¿ì fatal errorÀÌ ¹ß»ýÇÑ´Ù.
¸ðµç È÷½ºÅä±×·¥ÀÌ ÀÏÄ¡ÇÏ´Â °æ¿ì, Ãß°¡ÀûÀÎ È÷½ºÅä±×·¥µéÀ» ±âÁ¸ÀÇ in-memory array¿¡
´õÇÑ´Ù.
call graph ·¹Äڵ尡 ÀÐÇôÁö¸é¼(call_graph.c:cg_read_rec
),
parent¿Í child addresses°¡ ½Éº¼ Å×ÀÌºí ¿£Æ®¸®¿¡ ¸ÅÄ¡µÇ¸ç, arc°¡ INCL_ARCS/EXCL_ARCS¸¦
»ç¿ëÇÑ symspec °Ë»ç¿¡¼ ¼º°øÇÏ´Â °æ¿ì, cg_arcs.c:arc_add
¸¦ »ç¿ëÇÏ¿©
call graph arc°¡ »ý¼ºµÈ´Ù. °¢°¢ÀÇ arc°¡ Ãß°¡µÇ¸é¼, ¿¬°á ¸®½ºÆ®(linked list)´Â
parent's child arc, child's parent arc¸¦ Á¤¸®ÇÑ´Ù. childÀÇ call count¿Í arcÀÇ
call count´Â ·¹ÄÚµåÀÇ call count¸¸Å Áõ°¡µÈ´Ù.
¶óÀδÜÀ§ ÇÁ·ÎÆÄÀϸµÀÌ ¼±ÅõÆÀ» °æ¿ì¿¡¸¸ ±âº» ºí·Ï ·¹ÄÚµåµéÀÌ ÀÐÇôÁø´Ù(basic_blocks.c:bb_read_rec
).
°¢°¢ÀÇ ±âº» ºí·Ï address´Â ½Éº¼ Å×À̺íÀÇ »óÀÀÇÏ´Â ¶óÀÎ ½Éº¼°ú ¸ÅÄ¡µÇ°í, ½Éº¼ÀÇ
bb_addr ¿Í bb_calls ¹è¿¿¡ ¿£Æ®¸®°¡ ¸¸µé¾îÁø´Ù. µ¿ÀÏÇÑ ÁÖ¼Ò¸¦ °¡Áö´Â º¹¼ö°³ÀÇ
±âº» ºí·ÏÀÌ ÀÖ´Ù¸é, call count´Â ´©ÀûµÈ´Ù.
gmon.sum ÆÄÀÏ ´ýÇÁ¸¦ À§ÇÑ ¿É¼ÇÀÌ ÁöÁ¤µÈ °æ¿ì¿¡´Â gmon.sum ÆÄÀÏÀ» ´ýÇÁÇÑ´Ù(gmon_io.c:gmon_out_write
).
µ¥ÀÌÅÍ ÆÄÀÏ ³»¿¡ È÷½ºÅä±×·¥ÀÌ ÀÖ´Ù¸é, ¸ðµç »ùÇà binÀ» ¼øȸÇÏ¿© ¹Ýº¹ÇÏ¸é¼ È÷½ºÅä±×·¥À»
½Éº¼¿¡ ÇÒ´çÇÑ´Ù(hist.c:hist_assign_samples
). ½Éº¼ Å×À̺íÀº ¸Þ¸ð¸®
ÁÖ¼ÒÀÇ ¿À¸§Â÷¼øÀ¸·Î ¼ÒÆ®µÇ¾î ÀÖÀ¸¹Ç·Î, »ùÇà bin¿¡ ´ëÇÏ¿© À̵¿ÇÏ´Â °ÍÀº ´Ü¼øÈ÷
½Éº¼Å×À̺íÀ» ¼ø¼´ë·Î À̵¿ÇÏ´Â °Í°ú °°´Ù. ÀÌ °úÁ¤¿¡ INCL_FLAT/EXCL_FLAT¿¡ ´ëÇÑ symspec check°¡ Æ÷ÇԵǾî
ÀÖ´Ù. È÷½ºÅä±×·¥ scale factor¿¡ µû¶ó, »ùÇà binÀº º¹¼ö°³ÀÇ symbolsÀ» Ä¿¹öÇÒ ¼ö
ÀÖÀ¸¸ç, ÀÌ °æ¿ì »ùÇà ī¿îÆ®ÀÇ fraction(¿À¹ö·¦µÇ´Â Á¤µµ¿¡ ºñ·ÊÇÏ´Â)ÀÌ °¢°¢ÀÇ
½Éº¼¿¡ ÇÒ´çµÈ´Ù. ÀÌ·¯ÇÑ È¿°ú´Â ÀϹÝÀûÀÎ ÇÁ·ÎÆÄÀϸµ¿¡¼´Â µå¹® °æ¿ìÁö¸¸, ¶óÀδÜÀ§
ÇÁ·ÎÆÄÀϸµ¿¡¼ ¿À¹ö·¦Àº Á»´õ ÈçÈ÷ º¼ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î µÎ °³ÀÇ ÀÎÁ¢ÇÑ ¶óÀεéÀÌ
1/2 hit¸¦ ¸¸µé¾î ³¾ ¼öµµ ÀÖ´Ù.
µ¥ÀÌÅÍ ÆÄÀÏ ³»¿¡ call graph µ¥ÀÌÅÍ°¡ ÀÖ´Â °æ¿ì, cg_arcs.c:cg_assemble
ÀÌ È£ÃâµÈ´Ù.
¸ÕÀú `-c' ¿É¼ÇÀÌ ÁöÁ¤µÇ¾ú´Ù¸é, ¸Ó½®¿¡ ÀÇÁ¸ÀûÀÎ ·çƾ (find_call
) ÀÌ
°¢°¢ÀÇ ½Éº¼ÀÇ ¸Ó½® Äڵ带 °Ë»çÇÏ¿© subroutine call ÀνºÆ®·°¼ÇÀ» ã¾Æ 0¹øÀÇ
È£Ãâ Ä«¿îÆ®(call count)¸¦ °¡Áø call graph¿¡ Ãß°¡ÇÑ´Ù. ¸ðµç ½Éº¼µéÀ» depth-first
numberingÀ» »ç¿ëÇÏ¿© topological sortÇÏ¿©(cg_dfn.c:cg_dfn
), childrenÀÌ
Ç×»ó ±×µéÀÇ parentº¸´Ù ÀûÀº ¹øÈ£¸¦ °¡Áöµµ·Ï ¸¸µç´Ù. ±× ´ÙÀ½¿¡ ½Éº¼ Å×ÀÌºí¿¡
´ëÇÑ Æ÷ÀÎÅ͵éÀ» ¿ø¼Ò·Î ÇÏ´Â ¹è¿À» ¸¸µé°í, ÀÌ ¹è¿ÀÇ ¸ðµç ¿ø¼Òµé¿¡ µ¿ÀÏÇÑ topological
number¸¦ ºÎ¿©ÇÑ´Ù. ¼ÒÆ®µÈ ½Éº¼ Æ÷ÀÎÅÍÀÇ ¹è¿¿¡ ´ëÇÏ¿© ´ÙÀ½°ú °°Àº 2´Ü°è ÀÛ¾÷À»
¼öÇàÇÑ´Ù.
1) ³¡¿¡¼ ½ÃÀÛÂÊÀ¸·Î (parents¿¡¼ children ¹æÇâÀ¸·Î) child
timeÀÇ fractionÀ» °è»êÇÏ°í °¢°¢ÀÇ parent¿Í print flag¿¡ propagateÇÑ´Ù. parentÀÇ include/exclude (print/no print) Ư¼ºÀÌ
( childrenÀÌ INCL_GRAPH ¶Ç´Â EXCL_GRAPH ¿¡ ¸í½ÃÀûÀ¸·Î ³ªÅ¸³ªÀÖÁö ¾ÊÀº °æ¿ì¿¡¸¸)
children¿¡ pripagateµÇ¸é¼, print flag´Â INCL_GRAPH/EXCL_GRAPH¿¡ ´ëÇÑ symspec
󸮸¦ ¹Ý¿µÇÑ´Ù.
2) ½ÃÀÛ¿¡¼ ³¡ÂÊÀ¸·Î(children¿¡¼ parents¹æÇâÀ¸·Î),
call grapht¸¦ µû¶ó INCL_TIME/EXCL_TIME °Ë»ç¿¡ µû¶ó timingsÀ» ½ÇÁ¦·Î propagateÇÑ´Ù.
the print flag, fractions, ¿Í timingsÀÌ ½Éº¼ ±¸Á¶¿¡ ÀúÀåµÇ¸é¼, topological
sort array´Â ¾ø¾îÁö°í, propagated time¿¡ µû¶ó ¼ÒÆ®µÈ Æ÷ÀÎÆ®ÀÇ ¹è¿ÀÌ »õ·Î ¸¸µé¾î
Áø´Ù.
¸¶Áö¸·À¸·Î, »ç¿ëÀÚ°¡ ¿äûÇÑ ´Ù¾çÇÑ ÇüÅÂÀÇ Ãâ·ÂÀÌ ÇÁ¸°Æ®µÈ´Ù. call graph (cg_print.c:cg_print
)¿Í
flat profile (hist.c:hist_print
)Àº ÀÌ¹Ì °è»êµÈ °ªÀ» ÇÁ¸°Æ®ÇÑ °ÍÀÌ´Ù.
annotated source ¸®½ºÆÃ
(basic_blocks.c:print_annotated_source
)Àº ±âº» ºí·Ï Á¤º¸°¡ ÀÖ´Â
°æ¿ì À̸¦ »ç¿ëÇÏ¿© call count°¡ ÀÖ´Â °¢°¢ÀÇ ÄÚµå ¶óÀÎÀ» ·¹ÀÌºí¸µÇÑ´Ù. ±×·¸Ä¡
¾Ê°í ±âº» ºí·Ï Á¤º¸°¡ ¾ø´Â °æ¿ì¿¡´Â ÇÔ¼ö È£Ãâ Ä«¿îÆ®(function call counts)¸¸
Ãâ·ÂÇÑ´Ù.
function ordering°ú °ü·ÃµÈ ÄÚµå´Â ¼Ò½º ÄÚµå(cg_print.c)¿¡ ÀϺΠÀß ¹®¼ÈµÇ¾î ÀÖ´Ù. function orderingÀº ±âº»ÀûÀ¸·Î, °¡Àå ¸¹ÀÌ »ç¿ëµÈ ÇÔ¼ö¿Í °¡Àå ÃÖ»óÀ§ÀÇ parent°¡ ¸ÕÀú À§Â÷ÇÏ°í, ±× ´ÙÀ½ ¼øÀ§ÀÇ ÇÔ¼ö, Àû°Ô »ç¿ëµÈ ÇÔ¼ö, »ç¿ëµÇÁö ¾ÊÀº ÇÔ¼ö¼øÀ¸·Î ¹èÄ¡ÇÑ´Ù.
gprof
µð¹ö±ëgprof
ÇÁ·Î±×·¥ÀÌ µð¹ö±ë È°¼ºÈ ¼³Á¤À¸·Î ÄÄÆÄÀϵǾú´Ù¸é, `-d' ¿É¼ÇÀº
gprof
ÀÇ ³»ºÎ µ¿ÀÛ¿¡ ´ëÇÑ ÀÌÇظ¦ µµ¿ï ¼ö ÀÖ´Â µð¹ö±ë Á¤º¸¸¦ Ç¥ÁØ
Ãâ·Â¿¡ ÇÁ¸°Æ®ÇÑ´Ù. '-d' ¿É¼ÇÀÇ ¿É¼Ç ÀÎÀÚ·Î ¸í½ÃµÈ µð¹ö±ë ¹øÈ£´Â ´ÙÀ½ÀÇ
¿É¼ÇÀÇ ÇÕÀÌ´Ù.