- °³¿ä
- 񃧯
- Critical Section
- Critical Section Spin Count
- Semaphore Throttles
- Conditional Variable Model
- Spin Lock
- ¸µÅ©
1 °³¿ä
½º·¹µå µ¿±âÈ °ü·Ã ³»¿ëµéÀ» ±â·ÏÇØ µÎ±â À§ÇÑ ÆäÀÌÁö. ÁÖ·Î À©µµ¿ìÁî.
2 񃧯
- µ¿±âÈ °ü·Ã ½Ã½ºÅÛ ÄݵéÀº CPU¸¦ ²Ï³ª Àâ¾î¸Ô±â ¶§¹®¿¡ ÃÖ´ëÇÑ ÇÇÇÏ´Â °ÍÀÌ ÁÁ´Ù.
- µ¿±âÈ °ü·Ã °´Ã¼ LOCK/UNLOCK »çÀÌÀÇ ÄÚµå´Â ÃÖ´ëÇÑ Âª°Ô Â¥¾ßÇÑ´Ù.
3 Critical Section
Å©¸®Æ¼Äà ¼½¼ÇÀÌ À¯Àú ¸ðµå¿¡¼ µ¿ÀÛÇϱ⠶§¹®¿¡ ÀϹÝÀûÀ¸·Î ¹ÂÅØ½ºº¸´Ù ºü¸£´Ù(2 ~ 10¹è)´Â °ÍÀº ³Î¸® ¾Ë·ÁÁ® ÀÖ´Ù. ¿Ö ºü¸¥Áö¿¡ ´ëÇØ ¾à°£ Á¤¸®Çغ¸ÀÚ¸é...
- ½º·¹µå°¡ EnterCriticalSection ÇÔ¼ö¸¦ È£ÃâÇÑ °æ¿ì, Á¦ÀÏ ¸ÕÀú CRITICAL_SECTION ±¸Á¶Ã¼ ³»ºÎÀÇ º¯¼ö¸¦ °Ë»çÇÏ°Ô µÈ´Ù. ÀÌ °ªÀÌ offÀÎ °æ¿ì, ¹Ù·Î atomic ¿¬»êÀ» ÅëÇØ ÀÌ °ªÀ» onÀ¸·Î ¹Ù²Ù°í ´ÙÀ½ ÀÛ¾÷À» ÁøÇàÇÏ°Ô µÈ´Ù.
- Å©¸®Æ¼Äà ¼½¼ÇÀÌ ´Ù¸¥ ½º·¹µå¿¡ Á¡À¯µÇ¾î ÀÖ´Â °æ¿ì, ½Ì±Û CPU »ó¿¡¼´Â ¹Ù·Î Ä¿³Î ¸ðµå·Î ³Ñ¾î°¡°Ô µÇ°í, ´ÙÁß CPU »ó¿¡¼´Â Spin Count¸¸Å ´ë±â(busy-waiting)Çϸé¼, ¶ôÀÌ Ç®¸®±â¸¦ ±â´Ù¸®°Ô µÈ´Ù.
- Ä¿³Î ¸ðµå·Î ³Ñ¾î°¡°Ô µÇ¸é, ÇØ´ç ½º·¹µå´Â ¼¼¸¶Æ÷¾î¸¦ ÀÌ¿ëÇÑ WAIT »óŰ¡ µÈ´Ù.
- LeaveCriticalSection ÇÔ¼ö¸¦ È£ÃâÇÏ°Ô µÇ¸é, CRITICAL_SECTION ±¸Á¶Ã¼ ³»ºÎÀÇ º¯¼ö¸¦ off·Î ¹Ù²Ù°í, ¼¼¸¶Æ÷¾î¸¦ ÀÌ¿ëÇÑ °æ¿ì¿¡´Â ±â´Ù¸®°í ÀÖ´Â ½º·¹µå¿¡°Ô ÅëÁö¸¦ ÇØÁÖ°Ô µÈ´Ù.
Á¤¸®Çغ¸ÀÚ¸é Å©¸®Æ¼Äà ¼½¼ÇÀÌ ¹ÂÅØ½ºº¸´Ù ºü¸¥ °ÍÀº 2°¡Áö °æ¿ì´Ù.
- °°Àº Å©¸®Æ¼Äà ¼½¼Ç °´Ã¼¿¡ Á¢±ÙÇÏ´Â ½º·¹µåÀÇ ¼ýÀÚ°¡ Àû¾î¼, CRITICAL_SECTION ³»ºÎ ¶ô º¯¼ö¸¸À¸·Î µ¿±âȰ¡ ÀÌ·ç¾îÁú ¶§.
- Àû´çÇÑ ½ºÇÉ Ä«¿îÆ®¸¦ ÅëÇØ WAIT »óÅ·Π°¡±â Àü¿¡ ¶ôÀ» ȹµæÇÒ ¼ö ÀÖÀ» ¶§. (SMP ¸Ó½ÅÀÇ °æ¿ì)
Áï Å©¸®Æ¼Äà ¼½¼Ç °ü·Ã ½º·¹µå°¡ ÃÖ´ëÇÑ Ä¿³Î ¸ðµå·Î µé¾î°¡Áö ¾Êµµ·Ï ÇØÁà¾ßÇÑ´Ù´Â ¸»ÀÌ´Ù.
4 Critical Section Spin Count
À§¿¡¼µµ ¼³¸íÇßµíÀÌ, SMP ½Ã½ºÅÛ¿¡¼ Å©¸®Æ¼Äà ¼½¼Ç°ú °ü·ÃµÈ º´¸ñÀ» ÁÙÀ̱â À§Çؼ´Â Àû´çÇÑ ½ºÇÉ Ä«¿îÆ®¸¦ ¼³Á¤ÇØÁà¾ßÇÑ´Ù. Ä¿³Î ¸ðµå·Î µé¾î°¡±â º¸´Ù´Â À¯Àú ¸ðµå¿¡¼ busy-waitingÀ» ÇÏ´Â °Ô ³ªÀ» ¼ö Àֱ⠶§¹®ÀÌ´Ù. À̸¦ À§ÇÑ ÇÔ¼ö°¡ SetCriticalSectionSpinCount, InitializeCriticalSectionAndSpinCount ÇÔ¼ö´Ù. Spin Count °ªÀ¸·Î¼ ¾î´À Á¤µµÀÇ °ªÀ» ÁÖ´ÂÁö´Â ´ç¿¬È÷ ½Ã½ºÅÛ/¾ÖÇø®ÄÉÀ̼Ǹ¶´Ù Ʋ¸®´Ù.
5 Semaphore Throttles
ÇϳªÀÇ µ¿±âÈ °´Ã¼(Å©¸®Æ¼Äà ¼½¼Ç ¶Ç´Â ¹ÂÅØ½º)¸¦ ±â´Ù¸®´Â ½º·¹µå°¡ ³Ê¹« ¸¹Àº °æ¿ì, ¼¼¸¶Æ÷¾î¸¦ Çϳª ´õ µÖ¼, ÇØ´ç µ¿±âÈ °´Ã¼¸¦ ±â´Ù¸®´Â ½º·¹µåÀÇ ¼ýÀÚ¸¦ ÁÙ¿©ÁÖ´Â °ÍÀÌ ¼º´É Çâ»ó¿¡ µµ¿òÀÌ µÉ ¼ö ÀÖ´Ù.
while (TRUE) { // Worker loop
WaitForSingleObject (hThrottleSem, INFINITE);
WaitForSingleObject (hMutex, INFINITE);
... Critical code section ...
ReleaseMutex (hMutex);
ReleaseSemaphore (hThrottleSem, 1, NULL);
} // End of worker loop
6 Conditional Variable Model
7 Spin Lock
Ãʰ£´Ü ½ºÇɶô. ÀϹÝÀû(?)ÀÎ ¶ô¿¡ ºñÇØ Å©±â°¡ ÀÛ°í(4¹ÙÀÌÆ®!), Àü¿ª º¯¼ö·Î »ç¿ëÇϱⰡ ½±´Ù. ´ë½Å CPU¸¦ Ȥ»ç½ÃŲ´Ù´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. -_-;
// ¶ôÀÇ »óÅÂ
enum
{
LOCKED = 0, ///< Àá°åÀ½
UNLOCKED = 1, ///< Ç®·ÈÀ½
};
/// \brief ½ºÇɶôÀ» ÃʱâÈÇÑ´Ù.
long InitSpinLock()
{
return UNLOCKED;
}
/// \brief ½ºÇɶôÀ» °Ç´Ù.
void EnterSpinLock(volatile long* target)
{
for (;;)
{
if (InterlockedExchange(target, LOCKED) == UNLOCKED)
break;
}
}
/// \brief ½ºÇɶôÀ» Ǭ´Ù.
void LeaveSpinLock(volatile long* target)
{
InterlockedExchange(target, UNLOCKED);
}
8 ¸µÅ©
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)