ÀÚ¹Ù ¾²·¹µå ÇÁ·Î±×·¡¹Ö

¾²·¹µå ±âÃÊ

"½ÇÇàÁßÀÎ ÇÁ·Î±×·¥"À» ÇÁ·Î¼¼½º¶ó°íÇÑ´Ù. ±×·¯´Ï±î ¸í·É¾î¸¦ ÀÔ·ÂÇØ¼­ µ¹¾Æ°¡´Â ÇÁ·Î±×·¥Àº ÀüºÎ ÇÁ·Î¼¼½ºÀΰÍÀÌ´Ù. ÇÁ·Î¼¼½º¿¡´Â ¸í·É¾îµéÀÌ ¼øÂ÷ÀûÀ¸·Î ½ÇÇàÀ̵Ǵµ¥ À̰ÍÀ» ½ÇÇà ¾²·¹µåÇϰí ÇÑ´Ù. ¼øÂ÷ÀûÀ¸·Î ½ÇÇàµÇ´Â ¸í·É¾îµéÀ» ÇϳªÀÇ ½Ç·Î ²ê ¼ö Àֱ⠶§¹®ÀÌ´Ù. ÀÌ·¸°Ô ÇϳªÀÇ ½Ç·Î ²ê ¼ö ÀÖ´Â ÇÁ·Î±×·¥Àº ´ÜÀÏ ¾²·¹µå ÇÁ·Î±×·¥À̶ó°í ÇÑ´Ù. ±×·±µ¥ ¾î¶² ÇÁ·Î±×·¥¿¡´Â ¿©·¯ °³ÀÇ ÇÔ¼öµéÀÌ ¼­·Î µ¶¸³ÀûÀ¸·Î ¼öÇàµÇ´Â °æ¿ìµµ ÀÖ´Ù. ÀÌ·± °æ¿ì¿¡´Â ¸í·É¾îµéÀÌ ¼øÂ÷ÀûÀ¸·Î ¼öÇàµÇ´Â °ÍÀÌ ¾Æ´Ï±â ¶§¹®¿¡ ÇϳªÀÇ ½Ç·Î ²ê¼ö ¾øÀ» °ÍÀÌ´Ù. ÀÌ·± ÇÁ·Î±×·¥Àº ´ÙÁß ¾²·¹µå ÇÁ·Î±×·¥À̶ó°í ÇÑ´Ù.

´ÙÀ½ ±×¸²Àº ¼¼Â÷ÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. È«±æµ¿ÀÌ ½ºÄÉÁìÇ¥¿¡ ³ª¿Í Àִ´ë·Î ¼¼Â÷¸¦ Çϰí ÀÖ´Ù. ¿©±â¼­ ½ºÄÉÁìÇ¥´Â ÇÁ·Î±×·¥ ¸í·É¾îµéÀ̰í, ½ºÄÉÁìÇ¥´ë·Î ÀÏÀ» ÇÏ´Â È«±æµ¿Àº ¾²·¹µå°¡ µÈ´Ù. È«±æµ¿ÀÌ ¼¼Â÷Çϱâ À§ÇØ »ç¿ëÇÏ´Â ºñ´©, ¹°, È£¼ö µîÀº ½Ã½ºÅÛ ÀÚ¿øµéÀÌ´Ù.

´ÙÀ½ ±×¸²Àº È«±æµ¿ÀÌ µÎ µ¿»ý(È«±æ¼÷, È«±æÂù)À» µ¥¸®°í ¼¼Â÷¸¦ Çϰí ÀÖ´Ù. ÀÌ ¼¼¸íÀº °¢ÀÚ ½ºÄÉÁì ¿¡ ¸Â°Ô Àڽſ¡°Ô ÇÒ´çµÈ ÀÏÀ» ÇÑ´Ù. ½ºÄÉÁìÇ¥´Â ÇÁ·Î±×·¥ ¸í·É¾îµéÀ̰í, È«±æµ¿, È«±æ¼÷, È«±æÂùÀº ÀÏÀ» ÇÏ´Â ¾²·¹µåÀÌ´Ù. ÀÌ·¸°Ô ÀÏÇÏ´Â ¾²·¹µå°¡ ¸¹Àº ÇÁ·Î±×·¥À» ´ÙÁß ¾²·¹µå ÇÁ·Î±×·¥À̶ó°í ÇÑ´Ù. ¿ì¼± Á÷°üÀûÀ¸·Î ºÁµµ ´ÙÁß ¾²·¹µå ÇÁ·Î±×·¥ÀÌ ´ÜÀÏ ¾²·¹µå ÇÁ·Î±×·¥º¸´Ù È¿À²ÀûÀÏ °ÍÀÌ´Ù. ´ÙÁß ¾²·¹µå¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ÀÌ ´ëºÎºÐ È¿°úÀûÀÌÁö¸¸ Ç×»ó ±×·± °ÍÀº ¾Æ´Ï´Ù. "»ç°øÀÌ ¸¹À¸¸é ¹è°¡ »êÀ¸·Î °£´Ù"¶ó´Â ¼Ó´ãÀÌ ÀÖ´Â °Í ó·³ ¾²·¹µå°¡ ¸¹À¸¸é ¾î¶² °æ¿ì¿¡´Â ºñÈ¿À²ÀûÀÎ °æ¿ìµµ ÀÖ´Ù.

¾²·¹µå´Â Thread Ŭ·¡½º·Î ºÎÅÍ »ó¼ÓÀ» ¹Þ¾Æ¼­ ¸¸µé¼öµµ ÀÖ°í, Runnable ÀÎÅÍÆäÀ̽º¸¦ ÀÎÇø®¸àÃ÷ÇØ¼­ »ç¿ëÇÒ ¼ö µµ ÀÖ´Ù. µÎ°¡Áö ¹æ¹ýÁß¿¡¼­ ÇÁ·Î±×·¡¸Ó´Â ±×¶§ ±×¶§ »óȲ¿¡ ¸Â°Ô »ç¿ëÇÏ¸é µÈ´Ù. µÎ ¹æ¹ý ¸ðµÎ ¾²·¹µå¸¦ »ç¿ëÇÏ·Á¸é run() ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ÀÌ run()ÇÔ¼ö¿¡ ¾²·¹µå°¡ ÀÏÇÒ ÀÛ¾÷ÀÇ ³»¿ëÀ» ±â¼úÇØ ³õ´Â °ÍÀÌ´Ù.

¾²·¹µå¸¦ ¸¸µç ´ÙÀ½¿¡ ¾²·¹µå¸¦ ½ÇÇà ½ÃŰ·Á¸é start()ÇÔ¼ö¸¦ È£ÃâÇØÁÖ¾î¾ß ÇÑ´Ù. start() ÇÔ¼ö¸¦ È£ÃâÇϸé ÀÚµ¿ÀûÀ¸·Î run()ÇÔ¼ö°¡ ¼öÇàµÈ´Ù. ¾²·¹µå´Â run()ÇÔ¼ö¸¦ ¸¶Ä¡°Å³ª stop()ÇÔ¼ö°¡ È£ÃâµÇ¸é ½ÇÇàÀ» Á¾·áÇÑ´Ù. Á¾·áµÈ ¾²·¹µå´Â start()ÇÔ¼ö·Î ´Ù½Ã ½ÇÇà½Ãų ¼ö´Â ¾ø´Ù.

¾²·¹µåÀÇ ½ºÄÉÁ층Àº ÀÚ¹Ù °¡»ó ¸Ó½Å¿¡¼­ ÀÌ·ç¾îÁø´Ù. ÀÚ¹Ù °¡»ó ¸Ó½ÅÀº ¿ì¼± ¼øÀ§¿¡ µû¶ó ¼±Á¡ ¹æ½Ä(preemtive) ¹æ½ÄÀ¸·Î ½ºÄÉÁ층µÈ´Ù. ¼±Á¡¹æ½ÄÀ̶õ ¿ì¼± ¼þÀ§°¡ ³ôÀº ¾²·¹µå°¡ µîÀåÇϸé ÇöÀç ½ÇÇàÁßÀÎ ¾²·¹µå´Â Âϰܳª°í ¿ì¼±¼øÀ§°¡ ³ôÀº ¾²·¹µå°¡ ½ÇÇàµÇ´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¿ì¼± ¼øÀ§°¡ ³·Àº ¾²·¹µå´Â ¿ì¼± ¼øÀ§°¡ ³ôÀº ¾²·¹µå°¡ Á¾·áÇϰųª sleep, blocked µÉ¶§ ±îÁö ±â´Ù·Á¾ß ÇÑ´Ù.

¿¹Á¦: CountThread
CountThread.java ÆÄÀÏ
     1  class CountThread extends Thread {
     2      int maxcount;
     3
     4      CountThread(int maxcount) {
     5          this.maxcount = maxcount;
     6      }
     7
     8      public void run() {
     9
    10          for(int count = 1;count 
¾²·¹µå°¡ Á¾·áµÇ¸é ThreadDeath ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù. ¾î¶² °æ¿ì¿¡´Â ¾²·¹µå°¡ Á¾·áÇϱâ Àü¿¡ ²À ÇØÁÖ¾î¾ß ÇÒ
ÀϵéÀÌ ÀÖÀ» ¼öµµ ÀÖ´Ù. ÀÌ·± °æ¿ì¿¡ ¾²·¹µå°¡ Á¾·áÇÒ ¶§ ¹ß»ýµÇ´Â ThreadDeath ¿¹¿Ü¸¦ Àâ¾Æ¼­ ¾²·¹µå Á¾·á
Á÷Àü¿¡ ÇÊ¿äÇÑ ÀÛ¾÷µéÀ» ó¸®ÇÒ ¼ö ÀÖ´Ù. ¸ðµç ÀÛ¾÷ÀÌ Ã³¸®µÈ ´ÙÀ½¿¡´Â ThreadDeath ¿¹¿Ü¸¦ ´Ù½Ã throw
ÇØÁÖ¾î¾ß ÇÑ´Ù.

CatchDeath.java ÆÄÀÏ 1 class MyThread extends Thread { 2 MyThread(String name) { 3 super(name); 4 } 5 6 public void run() { 7 try { 8 while (true) { 9 sleep(500); 10 System.out.println(getName() + ": is running"); 11 } 12 } catch (ThreadDeath ouch) { 13 System.out.println("I ("+getName() + ") is being killed."); 14 throw(ouch); 15 } catch (InterruptedException e) {} 16 } 17 } 18 19 public class CatchDeath { 20 static public void main(String args[]) { 21 MyThread thr_a = new MyThread("A"); 22 23 System.out.println("Starting the thread..."); 24 thr_a.start(); 25 26 try { 27 Thread.sleep(2000); 28 } catch (InterruptedException e) {} 29 30 System.out.println("Stopping the thread..."); 31 thr_a.stop(); 32 } 33 } °á°ú % java CatchDeath Starting the thread... A: is running A: is running A: is running Stopping the thread... I (A) is being killed. ¼³¸í 3 super(name); ¾²·¹µå¿¡ À̸§À» ºÙÀ̱â À§Çؼ­ Thread(String name) »ý¼ºÀÚ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. super(name)Àº »óÀ§ Ŭ·¡½ºÀÇ »ý¼ºÀÚ, Áï Thread(String name)¸¦ ÀǹÌÇÑ´Ù. 12 } catch (ThreadDeath ouch) { 13 System.out.println("I ("+getName() + ") is being killed."); 14 throw(ouch); ¾²·¹µå°¡ Á¾·áµÇ¸é ThreadDeath ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù. 13¹øÂ° ÁÙ¿¡¼­ ¾²·¹µå°¡ Á¾·áÇϱâ Àü¿¡ ó¸®ÇÒ ÀÛ¾÷µéÀ» ó¸®ÇÒ ¼ö ÀÖ´Ù. ÀÛ¾÷ÀÌ ³¡³ª¸é ThreadDeath ¿¹¿Ü¸¦ ´Ù½Ã throw ÇØ¼­ ¾²·¹µå°¡ Á¾·áµÇµµ·ÏÇÑ´Ù.

8.2 ÀÚ¹Ù ¾²·¹µå

´ÙÀ½Àº ¾²·¹µåÀÇ »óŵµÀÌ´Ù. ¾²·¹µå´Â »ý¼ºÀÚ¸¦ ÅëÇØ »ý¼ºµÇ¸é Newborn »óÅ¿¡ ÀְԵȴÙ. Newborn »óÅ¿¡¼­ start() ¸Þ¼Òµå°¡ È£ÃâµÇ¸é Runnable »óÅ·ΠÀüÀ̵ȴÙ. Runnable »óÅ´ ¾²·¹µå°¡ CPUÀÇ µð½ºÆÐÄ¡(dispatch) Å¥ (queue)¿¡ µî·ÏµÈ »óÅÂÀÌ´Ù. Runnable »óÅ¿¡¼­ Running »óÅ·ÎÀÇ ÀüÀÌ´Â ¿î¿µÃ¼Á¦¿¡ ÀÇÇØ ÀÚµ¿ÀûÀ¸·Î ÀÌ·ç¾îÁø´Ù. Runnable »óÅ¿¡ ¿ì¼± ¼øÀ§¿¡ µû¶ó °¡Àå ³ôÀº ¿ì¼± ¼øÀ§ÀÇ ¾²·¹µå°¡ Running »óÅ·ΠÀüÀ̵ȴÙ. Running »óÅ´ ¾²·¹µå°¡ CPU¸¦ Â÷ÁöÇÏ°í ½ÇÇàÁßÀÎ »óÅÂÀÌ´Ù. ¾²·¹µå°¡ Â÷ÁöÇϰí ÀÖ´Â CPU¸¦ ´Ù¸¥ ¾²·¹µå¿¡ ³Ñ°ÜÁÖ±â À§Çؼ­´Â suspend()/sleep()/wait() ¸Þ¼Òµåµé°ú yield() ¸Þ¼Òµå°¡ ÀÖ´Ù. suspend()/sleep()/wait() ¸Þ¼ÒµåµéÀº ¾²·¹µå¸¦ ºí¶ô»óÅ·ΠÀüÀÌÇØ¼­ ´Ù¸¥ ¾²·¹µå¿¡°Ô CPU¸¦ ³Ñ°ÜÁÖ´Â ÇüÅÂÀ̰í, yield() ¸Þ¼Òµå´Â ¾²·¹µå°¡ Runnable »óÅ·ΠÀüÀÌÇØ¼­ ´Ù¸¥ ¾²·¹µå¿¡ CPU¸¦ ³Ñ°ÜÁÙ ¼ö ÀÖ´Ù. ±×·±µ¥ µÎ Á¾·ùÀÇ ¸Þ¼Òµå¿¡´Â ½ºÄÉÁ층¿¡ ¾à°£ÀÇ Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù. suspend()/sleep()/wait() ¸Þ¼ÒµåµéÀº ¾²·¹µå°¡ ºí¶ôµÇ±â ¶§¹®¿¡ CPU¸¦ ´Ù¸¥ ¾²·¹µå¿¡°Ô ³Ñ°ÜÁÖÁö¸¸, yield() ¸Þ¼Òµå´Â Runnable »óÅ·Π°¡±â ¶§¹®¿¡ ÇöÀç ¾²·¹µå°¡ ¿ì¼± ¼øÀ§°¡ °¡Àå ³ô´Ù¸é ´Ù½Ã CPU¸¦ ÀâÀ» ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ÀÌ·¸°ÔµÇ¸é ¿ì¼± ¼øÀ§°¡ ³·Àº ¾²·¹µåµéÀº CPU¸¦ Â÷ÁöÇØ¼­ ½ÇÇàÇÒ ±âȸ¸¦ ¾òÀ» ¼ö ¾øÀ» ¼öµµ ÀÖ´Ù. suspend()¸Þ¼Òµå¿¡ ÀÇÇØ ºí¶ôµÈ ¾²·¹µå´Â resume() ¸Þ¼Òµå¸¦ ÅëÇØ ºí¶ô »óÅ¿¡¼­ Runnable »óÅ·ΠÀüÀÌ ÇÒ ¼ö ÀÖ´Ù. ¹Ý¸é¿¡ wait() ¸Þ¼Òµå¿¡ ÀÇÇØ ºí¶ôµÈ ¾²·¹µå´Â notify() ¸Þ¼Òµå¸¦ ÅëÇØ¼­ ºí¶ô »óÅ¿¡¼­ Runnalbe »óÅ·ΠÀüÀÌ µÉ ¼ö ÀÖ´Ù. sleep() ¸Þ¼Òµå¿¡ ÀÇÇØ ºí¶ôµÈ ¾²·¹µå´Â ÀÏÁ¤ ½Ã°£ÀÌ µÇ¸é ÀÚµ¿ÀûÀ¸·Î Runnable »óÅ·ΠÀüÀ̵ȴÙ.

ÀÚ¹Ù¿¡¼­ ¾²·¹µå´Â ½ÇÁ¦ ¿î¿µÃ¼Á¦ÀÇ ¾²·¹µå·Î ¸ÅÇÎÀÌ ÀÌ·ç¾îÁ®¾ß ½ÇÁ¦·Î ¾²·¹µå·Î¼­ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Ù. UNIX³ª NT, Win95, OS/2 µîÀÌ ¾²·¹µå¸¦ Áö¿øÇÏ´Â ¹æ½ÄÀÌ ´Ù¸£±â ¶§¹®¿¡ ÀÚ¹Ù ¾²·¹µå¿Í ½ÇÁ¦ ¿î¿µÃ¼Á¦ÀÇ ¾²·¹µå¿Í ¸ÅÇÎÀÌ ´Þ¶óÁú ¼ö ÀÖ´Ù. ½ÇÁ¦ ¿î¿µÃ¼Á¦¿¡¼­ ¾²·¹µå´Â »ç¿ëÀÚ ¾²·¹µå¿Í Ä¿³Î ¾²·¹µå·Î ±¸ºÐµÈ´Ù. »ç¿ëÀÚ ¾²·¹µå´Â »ç¿ëÀÚ°¡ ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇØ¼­ ¸¸µç ¾²·¹µåÀ̰í, Ä¿³Î ¾²·¹µå´Â ½ÇÁ¦ ½ºÄÉÁ층ÀÌ ÀϾ´Â ½ºÄÉÁ층 ´ÜÀ§°¡ µÈ´Ù. »ç¿ëÀÚ ¾²·¹µå¿Í Ä¿³Î ¾²·¹µå´Â M-1 °ü°è, 1-1 °ü°è, M-N °ü°è¸¦ °®À» ¼ö ÀÖ´Ù. NT ¿Í Win95´Â 1-1 °ü°èÀÇ ´ëÇ¥ÀûÀÎ ¿¹À̰í, M-NÀº Solaris ¾²·¹µåÀÇ ´ëÇ¥ÀûÀÎ ¿¹ÀÌ´Ù. ÀÚ¹Ù ¾²·¹µå´Â ÀÏÁ¾ÀÇ »ç¿ëÀÚ ¾²·¹µåÀÌ´Ù.

M-1 ¸ÅÇÎ

ÀÚ¹Ù ¾²·¹µå´Â »ç¿ëÀÚ ¾²·¹µå¿Í 1:1 °ü°è¸¦ °®°í, »ç¿ëÀÚ ¾²·¹µå´Â Ä¿³Î ¾²·¹µå¿Í M:1 °ü°è¸¦ °®´Â´Ù. µû¶ó¼­, Ä¿³Î ¾²·¹µå´Â Çϳª¸¸ Àֱ⠶§¹®¿¡ ´ÙÁß ¾²·¹µåÀÇ ÀåÁ¡À» »ì¸®Áö ¸øÇϰí ÀÖ´Ù. M-1 ¸ÅÇÎÀÇ ´ëÇ¥ÀûÀÎ ¿¹´Â green_threads ÀÌ´Ù. ¼Ö¶ó¸®½º 2.4, 2.5 ¿î¿µÃ¼Á¦¿¡ Á¦°øµÇ´Â JDK´Â ¸ðµÎ green_threads¸¦ »ç¿ëÇϰí ÀÖ´Ù.

One-One ¸ÅÇÎ

1:1 ¸ÅÇÎ °ü°è´Â NT, Win95¿¡¼­ »ç¿ëµÇ´Â ¾²·¹µåÀÌ´Ù. ÀÚ¹Ù ¾²·¹µå 1°³¿¡ Ä¿³Î ¾²·¹µå°¡ 1°³ ¸ÅÇεDZ⠶§¹®¿¡ ´ÙÁß ¾²·¹µåÀÇ ÀåÁ¡À» Àß »ì¸± ¼ö ÀÖ´Ù.

M-N ¸ÅÇÎ

¼Ö¶ó¸®½º 2.6¿¡¼­ Áö¿øµÇ´Â ÀÚ¹Ù native ¾²·¹µå¸¦ »ç¿ëÇÏ´Â °æ¿ì¿¡, C ¾ð¾î¿¡¼­ ¾²·¹µå¸¦ »ç¿ëÇÏ´Â °Íó·³ ¾²·¹µå¸¦ ÀÚÀ¯·Ó°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¡¸Ó´Â ¿øÇÏ´Â °æ¿ì »ç¿ëÀÚ ¾²·¹µå°¡ ¿øÇÏ´Â ¸¸Å­ÀÇ Ä¿³Î ¾²·¹µå¿Í ¸ÅÇÎÀ̵ǵµ·Ï ÇÁ·Î±×·¥ ÇÒ ¼ö ÀÖ´Ù. NTÀÇ 1:1 ¸ÅÇκ¸´Ù ÇÁ·Î±×·¡¸Ó °¡ ÇÁ·Î±×·¥Çϴµ¥ Æí¸®Çϸ鼭, ´ÙÁß ¾²·¹µåÀÇ ÀåÁ¡À» ÃÖ´ëÇÑ È°¿ëÇÒ ¼ö ÀÖ´Ù.