5-8.½½¸³ Æ©´×

½º·¹µå´Â ´ë±âÁß¿¡ ÇÒ ÀÏÀÌ ¾øÀ¸¸é SleepÀ¸·Î Àá½Ã ½¬¾î °£´Ù. SleepÀº ½Ã°£À» Áö¿¬½ÃÅ°´Â ¿ªÇÒ»Ó¸¸ ¾Æ´Ï¶ó CPU°¡ Àá½Ã ´Ù¸¥ ÀÏÀ» Çϵµ·Ï ¾çº¸ÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ·¡½ºÅÍ¿¡ ´ÙÀ½ Å×½ºÆ® Äڵ带 ÀÛ¼ºÇÏ¿© SleepÀÌ ¾î¶² ¿ªÇÒÀ» ÇÏ´ÂÁö Å×½ºÆ®ÇØ º¸ÀÚ.

 

       int logcount = 0;

                 ....

                 if (rastpos == -1) {

                            if (status == P_EOF && (eofReady & scalermask) == scalermask) {

                                       eofReady |= (TRASTER << raster);

                                       break;

                            }

                            if (raster == 0) logcount++;

                            //Sleep(20);

                            continue;

                 }

                 if (raster == 0) {

                            lg("%dȸ ´ë±â", logcount);

                            logcount = 0;

                 }

 

ÇÒ ÀÏÀÌ ¾øÀ» ¶§ Sleep(20)¸¸Å­ ½¬µµ·Ï µÇ¾î Àִµ¥ Àá½Ã ÁÖ¼® ó¸®ÇÏ°í ¸î ¹øÀ̳ª ´ë±âÇÏ´ÂÁö ·Î±×¸¦ Âï¾î º¸ÀÚ. 4°³ ´Ù º¼ ÇÊ¿ä ¾øÀ¸´Ï 0¹ø ·¡½ºÅÍ¿¡ ´ëÇؼ­¸¸ ·Î±×¸¦ Âï¾ú´Ù. °á°ú´Â ´ÙÀ½°ú °°´Ù.

 

14823ȸ ´ë±â

26051ȸ ´ë±â

3572ȸ ´ë±â

35291ȸ ´ë±â

 

»óȲ¿¡ µû¶ó ´Ù¸£Áö¸¸ ´ë·« 2¸¸¹ø Á¤µµ ·çÇÁ¸¦ µ¹¸ç ¾ÖŸ°Ô ÀϰŸ®¸¦ ã°í ÀÖ´Ù. ·¡½ºÅ͸¦ ´ã´çÇÑ CPU´Â ½¯Æ´ÀÌ ¾øÀ¸¸ç Àüü Á¡À¯À²Àº 40%±îÁö Ä¡¼Ú´Â´Ù. SleepÀ» ´Ù½Ã ³Ö¾î º¸°í ½½¸³ ½Ã°£¿¡ µû¸¥ º¯È­¸¦ °üÂûÇØ º¸ÀÚ.

 

Sleep ¾øÀ½ : ÃÖ´ë 30000 ȸ ´ë±â. CPU Á¡À¯À² 40%

Sleep(20) : ÃÖ´ë 15 ȸ ´ë±â. CPU Á¡À¯À² 23%

Sleep(10) : ÃÖ´ë 30ȸ ´ë±â. CPU Á¡À¯À² 23%

Sleep(5) : ÃÖ´ë 60ȸ ´ë±â. CPU Á¡À¯À² 24%

Sleep(2) : ÃÖ´ë 180ȸ ´ë±â. CPU Á¡À¯À² 24%

Sleep(1) : ÃÖ´ë 400ȸ ´ë±â. CPU Á¡À¯À² 25%

 

¿ø·ÐÀûÀ¸·Î ½½¸³À» ³Ê¹« ¿À·¡ ÇÏ¸é ¹ÝÀÀ¼ºÀÌ ¶³¾îÁö°í ³Ê¹« ª°Ô Çϸé CPU¸¦ Ȥ»ç½ÃŲ´Ù. ±×·¯³ª ¿¹»ó¿Ü·Î CPU Á¡À¯À²°ú´Â Å« »ó°üÀÌ ¾ø´Âµ¥ Àá½Ã¸¸ÀÌ¶óµµ ½¬¾î °¡¸é ¾È ½¬´Â °Íº¸´Ù´Â ¿ùµîÈ÷ È¿°ú°¡ ÁÁÀº ÆíÀÌ´Ù.

¸ðµç ½º·¹µåÀÇ SleepÀ» ´Ù ÁÖ¼® ó¸®ÇØ º¸´Â ¿±±âÀûÀÎ ½ÇÇèµµ ÇØ ºÃ´Ù. ÇÁ·Î±×·¥ ½ÇÇàÀº Á¤»óÀûÀ¸·Î Àß µÇ´Â °Å °°Áö¸¸ CPU Á¡À¯À²Àº 120%±îÁö Ä¡¼Ú´Â´Ù. ¿ø·¡ ÀÚ±â Ŭ·°º¸´Ù ´õ ³ôÀº Ŭ·°±îÁö ¿À¹ö ºÎ½ºÆÃÇÏ¸ç ³Ã°¢ÆÒÀÌ ¹ÌÄ£µíÀÌ µ¹¾Æ°¡°í ¹ß¿­, ¹èÅ͸® ¸ðµÎ ¾û¸ÁÀÌ µÈ´Ù.

ÇÁ·Î±×·¥À» ÀÌ·¸°Ô Â¥¸é ¾ÈµÈ´Ù. ¾î¶² »óȲ¿¡¼­ ½½¸³À» ¾ó¸¶³ª ÇÒ °ÍÀΰ¡µµ ±²ÀåÈ÷ Áß¿äÇÏ´Ù. ÇöÀç ´ë±âÇÏ°í ÀÖ´Â ºÎºÐÀÇ ÄÚµå¿Í ¾ÕÀ¸·Î ´õ ÀÛ¼ºÇÒ ÄÚµå±îÁö ¹Ì¸® Á¡°ËÇØ º¸¸é ´ÙÀ½°ú °°ÀÌ ºÐ·ùÇÒ ¼ö ÀÖ´Ù.

 

Ç®ÀÌ °¡µæÂ÷ ºüÁö±â¸¦ ±â´Ù¸®´Â »óȲ : ¿©À¯°¡ ÀÖ¾î Á» ¿À·¡ ½¬¾îµµ µÈ´Ù.

Ç®ÀÌ ºñ¾î¼­ ´ë±âÇÏ´Â »óȲ : µ¥ÀÌÅÍ°¡ µé¾î¿À´Â Áï½Ã µ¿ÀÛÇØ¾ß ÇϹǷΠÁ¶±Ý¸¸ ½®´Ù.

ÀϽà Á¤Áö »óÅ : »ç¿ëÀÚÀÇ ¸í½ÃÀûÀÎ ¸í·ÉÀÌ ÀÖ¾úÀ¸¹Ç·Î ÇÑÂü ½¬¾îµµ µÈ´Ù.

À§Ä¡ À̵¿, Å©±â º¯°æ : °¡±ÞÀû »¡¶ó¾ß ÇϹǷΠ¿À·¡ ½¬¸é ¾ÈµÈ´Ù.

 

ÀÌ ºÐ¼®¿¡ µû¶ó ½½¸³ ½Ã°£À» ´ÙÀ½ ¼¼ °¡Áö·Î ºÐ·ùÇÏ¿© »ó¼ö·Î Á¤ÀÇÇÑ´Ù.

 

const int sleepPause = 20;

const int sleepFull = 10;

const int sleepEmpty = 2;

 

ÄÚµåÀÇ Sleep¹®À» ã¾Æ 20 ´ë½Å Àû´çÇÑ º¯¼ö·Î ¼öÁ¤ÇÏÀÚ. Sleep ÇÔ¼ö¸¦ °Ë»öÇÏ¿© ³ªÅ¸³ª´Â ¼ø¼­´ë·Î ´ÙÀ½°ú °°ÀÌ Àμö¸¦ º¯°æÇÑ´Ù.

 

PlayThread : sleepFull

VideoThread : sleepEmpty, sleepFull

ScaleThread, RasterThread, DrawThread : sleepEmpty

AudioThread : sleepEmpty, sleepFull, sleepFull

 

À¯ÀÏÇÏ°Ô SleepÀ» ¾²Áö ¾Ê´Â °÷Àº DrawThreadÀÇ Áö¿¬ ½Ã°£ ó¸®Àε¥ Á¤¹ÐÇÑ ´ë±â°¡ ÇÊ¿äÇØ uSleepÀ» ´ë½Å »ç¿ëÇÑ´Ù. SleepÀ¸·Î ÀÌ ÇÔ¼ö¸¦ ´ëüÇÒ ¼ö ÀÖ´ÂÁö Á¤¹Ðµµ¸¦ ÃøÁ¤ÇØ º¸ÀÚ. ÇÁ·¹ÀÓ·¹ÀÌÆ®¸¦ ¸ÂÃâ ¶§´Â ´Ü¼øÈ÷ ½¬´Â ¿ªÇÒ ¿Ü¿¡ ½Å·Ú¼ºµµ Áß¿äÇÏ´Ù. º°µµÀÇ ÀÛÀº ¿¹Á¦¸¦ ¸¸µç ÈÄ ´ÙÀ½ ÄÚµå·Î Å×½ºÆ®¸¦ ¼öÇàÇß´Ù. ²À ¾ÈÇØ ºÁµµ »ó°ü ¾ø°í ±¸°æ¸¸ ÇØ º¸ÀÚ.

 

void Test() {

       LARGE_INTEGER frequency;

       LARGE_INTEGER start, now;

       QueryPerformanceFrequency(&frequency);

       QueryPerformanceCounter(&start);

 

       for (int i = 0; i < 100; i++) {

                 Sleep(1);

       }

 

       QueryPerformanceCounter(&now);

       double gap = ((double)(now.QuadPart - start.QuadPart)) / ((double)frequency.QuadPart) * 100000;

       lg("%.f", gap);

}

 

´ÜÀÏ ½Ã°£À» Á¤¹ÐÇÏ°Ô ÃøÁ¤Çϱâ´Â ¾î·Á¿ì´Ï ·çÇÁ¸¦ µ¹¸ç ¿©·¯¹ø Áö¿¬½ÃŲ ÈÄ ÃÑ ½Ã°£À» ±¸Çß´Ù. 0.001Ãʾ¿ 100¹ø ½¬¸é 0.1ÃÊ°¡ °É·Á¾ß ÇÑ´Ù. ½ÇÁ¦·Î Á¡°ËÇØ º¸¸é 0.184ÃÊ Á¤µµ ½®´Ù. ·çÇÁ¸¦ µ¹°í ½Ã°£À» ÃøÁ¤ÇÏ°í ÇÔ¼ö È£Ã⠺δã±îÁö ÀÖ¾î ¿ä±¸·®º¸´Ù ¾à°£ ´õ ³ª¿Â´Ù. ´ë±â ½Ã°£À» ´Ã·Á°¡¸ç Å×½ºÆ®ÇØ º¸¾Ò´Ù.

 

0.002 * 100¹ø = 0.284

0.003 * 100¹ø = 0.380

0.004 * 100¹ø = 0.480

0.005 * 100¹ø = 0.570

0.01 * 100¹ø = 1.06

0.02 * 100¹ø = 2.06

0.1 * 100¹ø = 10.05

 

¾à°£ÀÇ ¿ÀÂ÷°¡ ÀÖÁö¸¸ °ÅÀÇ Á¤È®ÇÏ¸ç ´ë±â ½Ã°£ÀÌ ´Ã¾î³¯¼ö·Ï ¿ÀÂ÷´Â ÁÙ¾îµç´Ù. °ú°Å ÄÄÇ»ÅÍ°¡ ´À¸± ¶§´Â 15ms ÀÌÇÏ´Â Á¤È®ÇÏÁö ¾Ê¾Ò¾ú´Âµ¥ Áö±ÝÀº 1ms ´ÜÀ§±îÁö Á¤È®ÇØÁ³´Ù. Çػ󵵰¡ Á» ¾Æ½±Áö¸¸ ´ë±â¿ëÀ¸·Î ÃæºÐÈ÷ ¾µ¸¸ÇÏ´Ù.

Sleep(0)´Â ¹®¼­»ó ½º·¹µåÀÇ ³²Àº ½Ã°£À» ¾çº¸ÇÑ´Ù°í µÇ¾î Àִµ¥ ±×·¸°Ô µÇ¸é ´ÙÀ½ ½ºÄÉÁÙÀ» ¹ÞÀ» ¶§±îÁö ½Ã°£ÀÌ °É·Á Áö¿¬ È¿°ú°¡ ÀÖ¾î¾ß ÇÑ´Ù. ±×·¯³ª ½ÇÁ¦ Å×½ºÆ®ÇØ º¸¸é °ÅÀÇ ¾Æ¹«·± Áö¿¬ È¿°ú°¡ ¾ø´Ù. Sleep(0)¸¦ 100¹ø Çصµ °æ°ú ½Ã°£Àº 0.00005 ÃÊ·Î ·çÇÁ¸¦ µµ´Â ½Ã°£ Á¤µµ¹Û¿¡ ¾²Áö ¾Ê´Â´Ù. CPU °³¼ö°¡ ÃæºÐÇÏ¸é ¾çº¸ÇÒ ´ë»ó ½º·¹µå°¡ µý CPU¸¦ ¾²±â ¶§¹®ÀÌ´Ù. ±×·¯´Ï Sleep(0)¸¦ ³Ö¾îµµ ±×³É Á×Ä¡°í ¾É¾Æ ·çÇÁ¸¦ µ·´Ù.

´ë±â ½Ã°£ Á¤¹Ðµµ´Â ±â´ë ÀÌ»óÀ¸·Î ±¦ÂúÁö¸¸ ÃæºÐÇÏÁö´Â ¾Ê´Ù. ÀÌ ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇÏ´Â uSleepÀº ¾î¶²Áö Á¤¹Ðµµ¸¦ ÃøÁ¤ÇØ º¸ÀÚ. ·çÇÁ¿¡ uSleep(10)À» ³ÖÀ¸¸é 0.01ms ´ÜÀ§, ±×·¯´Ï±î 0.00001Ãʸ¸Å­ 100¹øÀ» ½¬´Âµ¥ °á°ú´Â 0.00101ÃÊ·Î ³ª¿Â´Ù. ¿ÀÂ÷°¡ °ÅÀÇ ¾øÀ» Á¤µµ·Î Á¤È®ÇÏ´Ù.

 

100 * 100¹ø = 0.01

1000 * 100¹ø = 0.1

6290 * 100¹ø = 0.62901

10000 * 100¹ø = 1.00002

30000 * 100¹ø = 3.00004

 

30ÇÁ·¹ÀÓÂ¥¸® µ¿¿µ»ó µ¹¸®´Âµ¥ ÀÌ Á¤µµ Á¤È®µµ¸é ÃæºÐÇÏ´Ù. ±×·¯³ª ÀÌ ÇÔ¼ö´Â Á¤È®ÇÑ ÃøÁ¤À» À§ÇØ ·çÇÁ¸¦ ³Ê¹« ¸Í·ÄÈ÷ µ¹±â ¶§¹®¿¡ CPU ½Ã°£À» °ú´ÙÇÏ°Ô ¼Ò¸ðÇÏ´Â Ä¡¸íÀûÀÎ ´ÜÁ¡ÀÌ ÀÖ´Ù. 0.03ÃÊ ½¬´Âµ¥ ·çÇÁ¸¦ ¹«·Á 93¸¸¹ø µ·´Ù. ½ÃÀÛ ½Ã°£ ±¸ÇØ ³õ°í ·çÇÁ¸¦ µ¹¸ç °æ°úÇÑ ½Ã°£À» Àç¸ç "0.03ÃÊ Áö³µ´Ï?" ÀÌ Áú¹®À» ¹«·Á 93¸¸¹ø ÇØ ´ë¸ç CPU¸¦ ±«·ÓÈ÷°í ÀÖ´Ù.

³ë´Â ÁÖÁ¦¿¡ ³î ½Ã°£ ³¡³µ´ÂÁö Á¡°ËÀ» ³Ê¹« ¿­½ÉÈ÷ ÇØ ´ë°í ÀÖ´Â °ÍÀÌ´Ù. ±×·¯´Ï CPU Á¡À¯À²Àº ´õ º¼ °Íµµ ¾øÀÌ 100%·Î Ä¡¼Ú°í ´Ù¸¥ ½º·¹µå°¡ ¾µ ½Ã°£ÀÌ ¾ø´Ù. Sleep¿¡ ºñÇØ ½Ã°£¸¸ Áö¿¬½Ãų »Ó CPU¸¦ ¾çº¸ÇÏ´Â ±â´ÉÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. ±×·¸´Ù¸é ÀÌ µÑÀ» Àû´çÈ÷ ¼¯¾î¼­ ¾²¸é ¾î¶³±î?

 

       do {

                 QueryPerformanceCounter(&now);

                 elapse = DWORD((now.QuadPart - start.QuadPart) * 1000000 / frequency.QuadPart);

                 if (usec - elapse > 10000) Sleep(9);

       } while (elapse < usec);

 

¾ÕÀ¸·Î ´ë±âÇÒ ½Ã°£ÀÌ 10ms ÀÌ»ó ³²¾ÒÀ¸¸é Sleep ÇÔ¼ö·Î 9ms¸¸Å­ ½Ã°£À» ¾çº¸ÇÑ´Ù. 10ms ³²¾Ò´Âµ¥ ±×º¸´Ù ÀûÀº 9ms¸¸Å­¸¸ ½¬´Â ÀÌÀ¯´Â SleepÀÇ Á¤¹Ðµµ°¡ ¶³¾îÁ® Â÷Ä©ÇÏ¸é ¿ä±¸ ½Ã°£À» ³Ñ°Ü ¹ö¸± ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¾ÆÁ÷ ÇÑÂü ³²¾ÒÀ¸¸é Áú¹® ±×¸¸ÇÏ°í Á» ½¬¾ú´Ù °¡ÀÚ´Â ÀÛÀüÀÌ´Ù. ÀÌ·¯¸é ·çÇÁ¸¦ µµ´Â ½Ã°£Àº 4¸¸¹øÀ¸·Î ´ëÆø ÁÙ¾îµé¾î CPU Á¡À¯À²µµ ¶³¾îÁø´Ù. ±×·¯³ª ½Ã°£ Á¤¹Ðµµ´Â ¾à°£ °¨¼ÒÇÏ¿© 3.020ms¸¸Å­À» ½®´Ù. Á» ´õ Àß°Ô ½¬´Â Äڵ带 ´õ Ãß°¡ÇØ º¸ÀÚ.

 

if (usec - elapse > 10000) Sleep(9);

else if (usec - elapse > 2000) Sleep(1);

 

10ms ³²¾ÒÀ¸¸é 9ms¸¸Å­ Åë Å©°Ô ½¬¾î °¡°í 2ms¸¸Å­ ³²¾ÒÀ¸¸é 1ms¸¸Å­ Àß°Ô ½¬¾î°£´Ù. 30ms¸¦ ½¬¸é 9¸¸Å­ 3¹ø ½¬°Å³ª ¾Æ´Ï¸é 9¸¸Å­ µÎ ¹ø, 1¸¸Å­ ¿©´ü¹ø ½¬°í ³ª¸ÓÁö´Â ·çÇÁ¸¦ µµ´Â ½ÄÀÌ´Ù. ·çÇÁ ¹Ýº¹ Ƚ¼ö´Â 2000ȸ ~ 20000ȸ Á¤µµ·Î ´ëÆø ÁÙ¾îµé°í CPU´Â °ÅÀÇ ¸ÔÁö ¾Ê´Â´Ù. °ú¿¬ È¿°ú°¡ ÀÖ´ÂÁö ´ÙÀ½ ÄÚµå·Î Å×½ºÆ®ÇØ º¸¾Ò´Ù.

 

void uSleep(DWORD usec) {

       LARGE_INTEGER start, now;

       DWORD elapse;

 

       QueryPerformanceCounter(&start);

       do {

                 QueryPerformanceCounter(&now);

                 elapse = DWORD((now.QuadPart - start.QuadPart) * 1000000 / frequency.QuadPart);

                 if ((GetAsyncKeyState(VK_CONTROL) & 0x8000) == 0) {

                            if (usec - elapse > 10000) Sleep(9);

                            else if (usec - elapse > 2000) Sleep(1);

                 }

       } while (elapse < usec);

}

 

SleepÀ» ¼¯¾î¼­ ´ë±âÇ쵂 CtrlÅ°¸¦ ´©¸£°í ÀÖÀ¸¸é ÀÌÀü ¹æ½Ä´ë·Î ±×³É ·çÇÁ¸¦ µ·´Ù. µÎ Äڵ带 ½ÇÇàÁß¿¡ ¹ø°¥¾Æ °¡¸ç Å×½ºÆ®ÇÒ ¼ö ÀÖ´Ù. Á¤¹Ðµµ¿¡ ¾à°£ÀÇ Â÷ÀÌ°¡ ¹ß»ýÇÒ ¼ö ÀÖÁö¸¸ CPU Á¡À¯À²Àº °ÅÀÇ Àý¹Ý ¼öÁØÀ¸·Î ¶³¾îÁø´Ù. µ¿¿µ»ó¿¡ µû¶ó ´Ù¸£Áö¸¸ 25% Á¡À¯À²ÀÌ 12%°¡ µÇ°í 17% Á¡À¯À²Àº 6%°¡ µÈ´Ù.

¾ÖÃÊ¿¡ ÀÌ ¹æ¹ýÀ» »ý°¢Çß´Ù°¡ 20ms ÀÌ»ó¿¡ ´ëÇؼ­¸¸ 20¾¿ ½¬¾ú´õ´Ï º° È¿°ú°¡ ¾ø¾ú´Ù. ÀÛÀº ´ÜÀ§´Â ´õ ÀÛ°Ô ½¬¾ú´õ´Ï È¿À²°ú Á¤È®µµ¸¦ ´Ù ´Þ¼ºÇÒ ¼ö ÀÖ¾ú´Ù. Sleep(1) ÀÌÇϱîÁö Á¤¹ÐÇÑ ´ë±â ¹æ¹ýÀº ¾ø¾î ÀÌ Á¤µµ¸¸ ÃÖÀûÈ­Çߴµ¥ ´õ È¿À²ÀûÀÎ ¹æ¹ýÀÌ ¾ø´ÂÁö ¿¬±¸ÇØ º¼ ÇÊ¿ä°¡ ÀÖ´Ù. ¿À·¡µÈ ¿î¿µÃ¼Á¦³ª Àú»ç¾ç CPU¿¡¼­´Â SleepÀÇ ÇØ»ó·ÂÀÌ ¶³¾îÁ® ¾à°£ ¹®Á¦°¡ µÉ ¼öµµ ÀÖ´Ù.

¿©±â±îÁö ½º·¹µå¸¦ ³ª´©°í ¾à°£ÀÇ Æ©´×À» ÇØ º¸¾Ò´Ù. ºÒÇÊ¿äÇÑ ·Î±× Ãâ·Â¹®Àº Á¦°ÅÇÏ°í CPU¸¦ ±«·ÓÈ÷±â À§ÇØ ³Ö¾ú´ø zoom º¯¼öµµ Á¦°ÅÇÏÀÚ. * zoomÀ» ã¾Æ ÀÏ°ý »èÁ¦ÇÏ¸é µÈ´Ù. Àá½Ã ÈÄ Å©±â º¯°æ ±â´ÉÀ» ÀÛ¼ºÇØ ³ÖÀ» °ÍÀ̹ǷΠÀÌÁ¦ ÇÊ¿ä ¾ø´Ù.