TLS(Thread Local Storage)


1. ¿ä¾à

TLS(Thread Local Storage)´Â ½º·¹µå º°·Î °íÀ¯ÇÑ ÀúÀå°ø°£À» °¡Áú ¼ö ÀÖ´Â ¹æ¹ýÀÔ´Ï´Ù.


2. º»¹®

°¢°¢ÀÇ ½º·¹µå´Â °íÀ¯ÇÑ ½ºÅÃÀ» °®±â ¶§¹®¿¡ ½ºÅà º¯¼ö( Áö¿ª º¯¼ö)´Â ½º·¹µå º°·Î °íÀ¯ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î¼­ °¢°¢ÀÇ ½º·¹µå°¡ °°Àº ÇÔ¼ö¸¦ ½ÇÇàÇÑ´Ù°í ÇØµµ ±× ÇÔ¼ö¿¡¼­ Á¤ÀÇµÈ Áö¿ªº¯¼ö´Â ½ÇÁ¦·Î ¼­·Î ´Ù¸¥ ¸Þ¸ð¸® °ø°£¿¡ À§Ä¡ÇÑ´Ù´Â ÀǹÌÀÔ´Ï´Ù. ±×·¯³ª Á¤Àû º¯¼ö³ª Àü¿ª º¯¼öÀÇ °æ¿ì¿¡´Â ÇÁ·Î¼¼½º ³»ÀÇ ¸ðµç ½º·¹µå¿¡ ÀÇÇØ¼­ °øÀ¯µË´Ï´Ù. ÀÌ ¿ª½Ã ¿¹¸¦ µé°í ½ÍÁö¸¸, ´Ù ÀÌÇØÇϼÌÀ¸¸®¶ó ¹Ï°í »ý·«ÇϰڽÀ´Ï´Ù.

±×·¸½À´Ï´Ù. TLS´Â Á¤Àû, Àü¿ª º¯¼ö¸¦ °¢°¢ÀÇ ½º·¹µå¿¡°Ô µ¶¸³ÀûÀ¸·Î ¸¸µé¾î ÁÖ°í ½ÍÀ» ¶§ »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. ´Ù½Ã ¸»Çؼ­, ºÐ¸íÈ÷ °°Àº ¹®Àå(context)À» ½ÇÇàÇϰí ÀÖÁö¸¸ ½ÇÁ¦·Î´Â ½º·¹µå º°·Î ´Ù¸¥ ÁÖ¼Ò°ø°£À» »ó´ë·Î ÀÛ¾÷ÇÏ´Â °ÍÀÔ´Ï´Ù.

TLS¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀº 2°¡Áö°¡ ÀÖ½À´Ï´Ù. ÇÑ °¡Áö´Â API¿¡¼­ Áö¿øÇØÁÖ´Â ¹æ½ÄÀ» »ç¿ëÇÏ´Â °ÍÀ̰í, ´Ù¸¥ ÇÏ´Â compiler¿¡¼­ Áö¿øÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù.

¿ì¼±Àº °£´ÜÇϸ鼭µµ ½Å±âÇÑ µÎ ¹øÂ° ¹æ¹ýºÎÅÍ »ìÆìº¸°Ú½À´Ï´Ù.

´ÙÀ½°ú °°ÀÌ ¼±¾ðµÈ Àü¿ªº¯¼ö°¡ ÀÖ´Ù°í °¡Á¤ÇØ º¾½Ã´Ù.. ( ±×·´½Ã´Ù..)

int nWindows;
ÀÌ º¯¼ö´Â ¸ðµç ½º·¹µå¿¡ ÀÇÇØ¼­ °øÀ¯µË´Ï´Ù.
±×°Ô ½È´Ù¸é ´ÙÀ½°ú °°ÀÌ °íÃÄÁÖ½Ã¸é µË´Ï´Ù.
_declspec( thread ) int nWindows;
ÀÌÁ¦ ÀÌ º¯¼ö´Â ¸ðµç ½º·¹µå¿¡°Ô °íÀ¯ÇÑ(private) º¯¼ö°¡ µÇ¾ú½À´Ï´Ù( ¦¦¦!!)

´ÙÀ½À¸·Î´Â API¸¦ »ç¿ëÇÑ ¹æ¹ýÀ» ¾Ë¾Æº¾½Ã´Ù.


DWORD dwIamIndex = ::TlsAlloc();  // °ø°£ È®º¸ 

::TlsSetValue( dwIamIndex, pMyData);  // µ¥ÀÌÅÍ ÀúÀå 

BYTE* pGiveMe = (BYTE*)::TlsGetValue( dwIamIndex);  // µ¥ÀÌÅÍ ¾ò±â 

::TlsFree( dwIamIndex);  // °ø°£ ÇØÁ¦ 

ÀÚ¼¼ÇÑ ºÎºÐÀº ¿ª½Ã MSDNÀ» ÂüÁ¶ÇÏ¼Å¾ß °ÚÁö¿ä..

ÇÑ´«¿¡ ¾Æ½Ç ¼ö ÀÖÁö¸¸ storage-class modifier¸¦ »ç¿ëÇÏ´Â ¹æ½ÄÀÌ ÈξÀ »ç¿ëÇϱ⠽±½À´Ï´Ù.±×·¯³ª storage-class modifier¸¦ »ç¿ëÇÏ´Â ¹æ½Ä¿¡´Â¾à°£ÀÇ Á¦¾àÀÌ ÀÖ½À´Ï´Ù. ¿©±â¼­ Á¦¾àÀ̶õ, µ¿ÀûÀ¸·Î ·ÎµåµÇ´Â DLL¿¡¼­´Â »ç¿ëµÉ ¼ö ¾ø½¿À» ÀǹÌÇÕ´Ï´Ù. ¾ÆÁÖ ±¸Ã¼ÀûÀÎ ¼Ó»çÁ¤À» ¾Ë ¼ö ¾øÁö¸¸, ¾î·µç Àü¿ªº¯¼ö¸¦ À§ÇÑ °ø°£À» ¸¶·ÃÇÏ´Â µ¥ ¸¹Àº °ï¶õÀÌ ÀÖÀ» °Í °°Áö ¾Ê½À´Ï±î? µ¿ÀûÀ¸·Î ·ÎµåµÇ´Â DLL ¿¡¼­´Â API ŸÀÔÀ» »ç¿ëÇϽô ¼ö ¹Û¿¡ ¾ø½À´Ï´Ù.

¸¶Áö¸·À¸·Î, ¾î¶»°Ô ½º·¹µå¸¶´Ù °íÀ¯ÇÑ °ø°£À» À¯ÁöÇÒ ¼ö ÀÖ´Â Áö ½Å±âÇÏÁö ¾Ê½À´Ï±î?? ±âȸ°¡ ´êÀ¸¸é ´ÙÀ½ ½Ã°£¿¡ ¾Ë¾Æº¸µµ·Ï ÇϰڽÀ´Ï´Ù.


3. ¿¹Á¦ ÄÚµå



4. Âü¼Ò

Win32 Network Programming – Addison Wesley

À§ÀÇ ³»¿ëÁß¿¡ Dynamic Loaded DLL ¿¡¼­ Static TLS technic À» »ç¿ëÇÏ¸é ¾ÈµÈ´Ù°í Çߴµ¥ ±×¿¡ ´ëÇÑ ¼³¸íÀÌ ºÎÁ·ÇÑ°Í °°¾Æ¼­ ¸îÀÚ Àû¾îº¾´Ï´Ù.

¿ì¼± API¸¦ »ç¿ëÇÏ´Â ¹æ½ÄÀÌ Dynamic ÇÑ ¹æ¹ýÀ̰í, __declspec(thread)¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ static ÇÑ ¹æ¹ýÀ̶ó°í »ý°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯¸é __declspec(thread)¸¦ »ç¿ëÇÏ¿© ¼±¾ðÇÑ º¯¼ö´Â ¾îµð¿¡¼­ °ü¸® µÇ´Â °É±î¿ä? ¿ì¼± static TLS ¹æ½ÄÀ» »ç¿ëÇϸé ÄÄÆÄÀÏ·¯´Â ÀڽŸ¸ÀÇ '.tls' ¶ó´Â ¸Þ¸ð¸® section ¿¡ ¼±¾ðµÈ º¯¼ö¸¦ µî·Ï½Ãŵ´Ï´Ù. ¹°·Ð ÀÌ·± °¢°¢ÀÇ '.tls' sectionÀ» ´Ù·ç´Â ÃÖ»óÀ§ '.tls' section ÀÌ µû·Î ÀÖ½À´Ï´Ù. ¶ÇÇÑ ÇϳªÀÇ ÇÁ·Î±×·¥ÀÌ ¶Ç ´Ù¸¥ thread¸¦ »ý¼ºÇÒ °æ¿ì, ÀÚ½ÅÀÌ °¡Áö°í ÀÖ´Â '.tls' section À» ÀÚ½Ä thread ¿¡ º¹»çÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇϰí ÀÖ½À´Ï´Ù.¹Ù·Î ÀÌÁ¡ ¶§¹®¿¡ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù°í º¸½Ç ¼ö ÀÖ½À´Ï´Ù. °Ñ¿¡¼­ º¸±â¿¡´Â ¿©·¯°¡Áö thread °¡ '.tls' section À» °øÀ¯ÇÏ´Â°Í Ã³·³ º¸ÀÌÁö¸¸ ½ÇÁ¦·Î´Â ³»ºÎ¿¡¼­ º¹»çÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇϰí Àֱ⠶§¹®ÀÌÁÒ. ÀÚ.. ºÎ°¡ ¼³¸íÀº ¿©±â±îÁö Çϰí Á¦°¡ ´Ù·ç±â·Î Çß´ø ³»¿ëµéÀ» °£´ÜÇÑ ¿¹¸¦ ÅëÇØ¼­ Á»´õ ÀÚ¼¼È÷ ´Ù·ç¾î º¸±â·Î ÇϰڽÀ´Ï´Ù.

¿ì¼± A¶ó´Â ÇÁ·Î±×·¥ÀÌ ÀÖ½À´Ï´Ù. A ¶ÇÇÑ ÀڽŸ¸ÀÇ '.tls' section À» °¡Áö°í ÀÖ½À´Ï´Ù. ±×¸®°í A´Â 5°³ÀÇ thread¸¦ »ý¼ºÇÏ¿´½À´Ï´Ù. ±×·³ A¿¡¼­ »ç¿ëÇÏ´ø '.tls' section ÀÌ ¸ðµÎ 6°³°¡ µÇ¾ú½À´Ï´Ù. ( A + 5 thread ) ÀÌ·¯ÇÑ »óȲ¿¡¼­ A°¡ static TLS ¸¦ °¡Áö°í ÀÖ´Â DLL À» LoadLibrary()¸¦ »ç¿ëÇÏ¿© Load ÇÏ¿´½À´Ï´Ù. ±×·¯¸é A´Â ÀÚ½ÅÀÇ '.tls' section À» ´Ã·Á¼­ »õ·Î¿î DLL ÀÌ °¡Áö°í ÀÖ´Â static TLS ¸¦ Ãß°¡ÇØÁÖ¾î¾ß ÇÕ´Ï´Ù. ¹°·Ð A´Â ÀÚ½ÅÀÇ '.tls' section »Ó¸¸ ¾Æ´Ï¶ó 5°³ÀÇ ÀÚ½Ä thread ÀÇ '.tls' section ±îÁö ´Ã·ÁÁÖ¾î¾ß ÇÕ´Ï´Ù. ±×¸®°í ³ª¼­, ´Ù½Ã A°¡ µ¿ÀûÀ¸·Î load Çß´ø DLLÀ» FreeLibrary()¸¦ ÅëÇØ¼­ ¸Þ¸ð¸®·ÎºÎÅÍ Á¦°ÅÇÏ¿´½À´Ï´Ù. ±×·³ A´Â ÀÚ½ÅÀÇ '.tls' section ¿¡¼­ ÇÊ¿ä¾ø´Â DLLÀÇ '.tls' section À» Á¦°Å ÇØ¾ß°ÚÁÒ? section ¿µ¿ªµµ ÁÙ¿©¾ß °ÚÁÒ. ¹°·Ð ÀÌ¿Í °°Àº ÀÛ¾÷À» 5°³ÀÇ ÀÚ½Ä threadÀÇ '.tls' section ¿¡µµ ÇØÁÖ¾î¾ß ÇÕ´Ï´Ù. ÀÌ¿Í °°Àº ÀÛ¾÷À» system ÀÌ ÇÏ°Ô µÇ¸é, ¿©·¯°¡Áö ¹®Á¦°¡ ¹ß»ýÇÏ°Ô µË´Ï´Ù.(ÃʱâÈ­°¡ Á¦´ë·Î ÀÌ·ç¾î ÁöÁö ¾Ê´Â ¹®Á¦ ȤÀº access violation µî)

°á±¹ ÀÌ·± ÀÌÀ¯·Î µ¿ÀûÀ¸·Î DLL À» Load Çϱâ À§Çؼ­ ¸¸µé¾îÁø DLLÀº static TLS ¸¦ »ç¿ëÇÏ´Â ´ë½Å DLL ½º½º·Î°¡ ÀÚ½ÅÀÇ TLS section À» °ü¸®ÇÒ ¼ö ÀÖ´Â Dynamic TLS ¹æ½ÄÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù.



- 2001.08.19 Smile Seo -