[OS] ì€ë ëì ëìì±(Thread & Concurrency)
ì€ë ëì ë³íì±(Threads & Concurrency)
ì°ëЬë ìŽì ì ì 늬íë€ìíŒ íë¡ìžì€ 몚ëžì í íë¡ìžì€ê° íëì ì ìŽ ì€ë ëë¡ íë¡ê·žëšì ì€ííë€ê³ ê°ì íììµëë€. ê·žë¬ë ê±°ì 몚ë íë ìŽì첎ì ë í íë¡ìžì€ê° ë€ì€ ì€ë ë륌 í¬íšíë í¹ì±ì ì ê³µí©ëë€. ë€ì€ CPU륌 ì ê³µíë ìµì ë€ì€ ìœìŽ ìì€í ìì ì€ë ë ì¬ì©ì íµí ë³ë ¬ ì²ëЬì êž°í륌 ìë³íë ê²ìŽ ì ì°š ì€ìíŽì§ëë€.
ìŽë² ì¥ììë Pthreads, Windows ë° Java ì€ë ë ëŒìŽëžë¬ëŠ¬ì© APIì ëí ë Œì륌 ë¹ë¡¯íì¬ ë€ì€ ì€ë ë 컎íší° ìì€í 곌 êŽë šë ë§ì ê°ë ì ìê°íŽ ë³Žê² ìµëë€. ëí ì€ë ë ìì± ê°ë ì ì¶ìííë ëª ê°ì§ ìë¡ìŽ êž°ë¥ì ìŽíŽë³Œ ê±Žë° ìŽ êž°ë¥ì ê°ë°ìê° ë³ë ¬ ì²ëЬ êž°í륌 ìë³íê³ ìžìŽ ì ê³µ êž°ë¥ ë° API íë ììí¬ê° ì€ë ë ìì± ë° êŽëЬ ìžë¶ ì 볎륌 êŽëЬí ì ìëë¡ íë ë° ìŽì ì ë§ì¶ ì ìê² í©ëë€. ë€ì€ ì€ë ë íë¡ê·žëë°ê³Œ êŽë šë ì¬ë¬ ê°ì§ 묞ì ì ìŽì첎ì ì€ê³ì 믞ì¹ë ìí¥ì ìŽíŽëŽ ëë€. ë§ì§ë§ìŒë¡, Windows ë° Linux ìŽì첎ì ê° ì»€ë ìì€ìì ì€ë ë륌 ì§ìíë ë°©ë²ì ìŽíŽë³Žê² ìµëë€.
ê°ì(_Overview)
ì€ë ëë CPU ìŽì©ì Ʞ볞 ëšìì ëë€. ì€ë ëë ì€ë ë ID, íë¡ê·žëš 칎ìŽí°(PC), ë ì§ì€í° ì§í©, ê·žëŠ¬ê³ ì€íìŒë¡ 구ì±ë©ëë€. ì€ë ëë ê°ì íë¡ìžì€ì ìí ë€ë¥ž ì€ë ëì ìœë, ë°ìŽí° ì¹ì , ê·žëŠ¬ê³ ìŽëа íìŒìŽë ì ížì ê°ì ìŽì첎ì ììë€ì ê³µì í©ëë€. ì íµì ìž íë¡ìžì€ë íëì ì ìŽ ì€ë ë륌 ê°ì§ê³ ììµëë€. ë§ìŒ íë¡ìžì€ê° ë€ìì ì ìŽ ì€ë ë륌 ê°ì§ë€ë©Ž íë¡ìžì€ë ëìì íë ìŽìì ìì ì ìíí ì ììµëë€. ìë 귞늌ì ì íµì ìž ëšìŒ ì€ë ë íë¡ìžì€ì ë€ì€ ì€ë ë íë¡ìžì€ì ì°šìŽì ì 볎ì¬ì£Œê³ ììµëë€.
ëêž°(_Motication)
íëì 컎íší°ì 몚ë°ìŒ êž°êž°ìì ìëíë ê±°ì 몚ë ìíížìšìŽ ìì©ë€ì ë€ì€ ì€ë ë륌 ìŽì©í©ëë€. íëì ìì©ì ëª ê°ì ì€í íëŠì ê°ì§ ë 늜ì ìž íë¡ìžì€ë¡ 구íë©ëë€. ìëììë ë€ì€ ì€ë ë ìì© íë¡ê·žëšì ëª ê°ì§ ì륌 볎ì¬ì€ëë€.
- ìŽë¯žì§ 몚ììì ì¬ì§ ì¶ìíì ë§ëë ìì© íë¡ê·žëšì ë³ëì ì€ë ë륌 ì¬ì©íì¬ ê°ë³ ìŽë¯žì§ìì ì¶ìíì ìì±í ì ìë€.
- ì¹ ëžëŒì°ì ë íëì ì€ë ëê° ìŽë¯žì§ ëë í ì€ížë¥Œ íìíê³ ë€ë¥ž ì€ë ëë ë€ížìí¬ìì ë°ìŽí°ë¥Œ ê²ìíëë¡ í ì ìë€.
- ìë íë¡ìžììì ê·žëíœì íìíë ì€ë ë, ì¬ì©ìì í€ ì ë ¥ì ìëµíë ë ë€ë¥ž ì€ë ë ë° ë°±ê·žëŒìŽëìì ë§ì¶€ë² ë° ë¬žë² ê²ì¬ë¥Œ ìííë ìž ë²ì§ž ì€ë ëê° ìì ì ìë€.
ìì©ì ë€ì€ ìœìŽ ìì€í ìì ì²ëЬ ë¥ë ¥ì í¥ìíëë¡ ì€ê³ë ì ììµëë€. ìŽë¬í ìì©ì ë€ì€ ê³ì° ìœìŽë¥Œ ì¬ì©íì¬ ë€ìì CPU-ì§ì€ ìì ì ë³ë ¬(parallel)ë¡ ì²ëЬí ì ììµëë€.
íëì ìì© íë¡ê·žëšìŽ ì¬ë¬ ê°ì ë¹ì·í ìì ì ìíí íìê° ìë ìí©ë€ìŽ ëí ììµëë€. ì륌 ë€ìŽ, ì¹ ìë²ë íŽëŒìŽìžížë¡ë¶í° ì¹íìŽì§ë ìŽë¯žì§, ì늬 ë±ì ëí ìì²ì ë°ìµëë€. íëì ë¶ì£Œí ì¹ ìë²ë ì¬ë¬ ê°(ìë§ë ìì² ê°)ì íŽëŒìŽìžížë€ìŽ ë³ííê² ì ê·Œí ì ììµëë€. ë§ìœ ì¹ ìë²ê° ì íµì ìž ëšìŒ ì€ë ë íë¡ìžì€ë¡ ìëíë€ë©Ž, ìì ì ëšìŒ íë¡ìžì€ë¡ í ë²ì íëì íŽëŒìŽìžížë§ ìë¹ì€í ì ìê² ëìŽ íŽëŒìŽìžížë ìì ì ìêµ¬ê° ìë¹ì€ëêž°ê¹ì§ ë§€ì° êžŽ ìê°ì êž°ë€ë €ìŒ í©ëë€.
íëì íŽê²°ì± ì ìë²ê° ìì²ì ë°ìë€ìŽë íëì íë¡ìžì€ë¡ ëìíê² íë ê²ì ëë€. ìŠ, ìë²ìê² ìë¹ì€ ìì²ìŽ ë€ìŽì€ë©Ž, íë¡ìžì€ë ê·ž ìì²ì ìíí ë³ëì íë¡ìžì€ë¥Œ ìì±íë ê²ì ëë€. ì¬ì€ ìŽì ê°ì ë°©ììŒë¡ íë¡ìžì€ë¥Œ ìì±íë ê²ì ì€ë ëê° ëì€íëêž° ì ìë ë§€ì° ë³Žížì ìŽììµëë€. íì§ë§ íë¡ìžì€ ìì± ìì ì ë§€ì° ë§ì ìê°ì ìë¹íê³ ë§ì ììì íìë¡ íë ìŒì ëë€. ê·žëì íë¡ìžì€ ìì ì¬ë¬ ì€ë ë륌 ë§ë€ìŽ ëê°ë ê²ìŽ ë íšìšì ì ëë€. ì¹ ìë²ê° ë€ì€ ì€ë ëí ë멎, ìë²ë íŽëŒìŽìžížì ìì²ì listen íë ë³ëì ì€ë ë륌 ìì±í©ëë€. ìì²ìŽ ë€ìŽì€ë©Ž ë€ë¥ž íë¡ìžì€ë¥Œ ìì±íë ê²ìŽ ìëëŒ, ìì²ì ìë¹ì€í ìë¡ìŽ ì€ë ë륌 ìì±íê³ ì¶ê°ì ìž ìì²ì listen íêž° ìí ìì ì ì¬ê°í©ëë€. ìŽ ìí©ìŽ ìë ìŽë¯žì§ì ì€ëª ëìŽ ììµëë€.
ëë¶ë¶ì ìŽì첎ì 컀ëë ìŒë°ì ìŒë¡ ë€ì€ ì€ë ëì ëë€. ì륌 ë€ìŽ Linux ìì€í ìì ìì€í ì ë¶íž íë ëì ì¬ë¬ 컀ë ì€ë ëê° ìì±ë©ëë€. ê° ì€ë ëë ì¥ì¹ êŽëЬ, ë©ëªšëЬ êŽëЬ ëë ìží°ëœíž ì²ëЬì ê°ì í¹ì ìì ì ìíí©ëë€. ps -ef ëª ë ¹ì ì¬ì©íì¬ ì€í ì€ìž Linux ìì€í ìì 컀ë ì€ë ë륌 íìí ì ììµëë€. ìŽ ëª ë ¹ì ì¶ë ¥ì ê²ì¬í멎 컀ë ì€ë ë kthreadd(pid=2)ê° íìëë©° ë€ë¥ž 몚ë 컀ë ì€ë ëì ë¶ëªš ìí ì í©ëë€.
ë§ì ìì© íë¡ê·žëšë Ʞ볞 ì ë ¬, ížëЬ ë° ê·žëí ìê³ ëŠ¬ìŠì í¬íšíì¬ ë€ì€ ì€ë ë륌 íì©í ì ììµëë€. ëí, ë°ìŽí° ë§ìŽë, ê·žëíœ ë° ìžê³µì§ë¥ìì CPU ì€ì¬ì ìµì 묞ì 륌 íŽê²°íŽìŒ íë íë¡ê·žëëšžë ë³ë ¬ë¡ ì€íëë ì룚ì ì ì€ê³íì¬ ìµì ë€ì€ ìœìŽ ìì€í ì ì±ë¥ì íì©í ì ììµëë€.
ì¥ì (Benefits)
ë€ì€ ì€ë ë íë¡ê·žëë°ì ìŽì ì ë€ìì 4ê°ì§ í° ë¶ë¥ë¡ ëë ì ììµëë€.
- ìëµì±(responsiveness)
- ìì ê³µì (resource sharing)
- 겜ì ì±(economy)
- ê·ëªš ì ìì±(scalability)
ìëµì±(responsivieness) | ì¬ì©ìê° ìê°ìŽ ë§ìŽ ê±žëŠ¬ë ì°ì°ì ììíë ëšì¶ë¥Œ íŽëŠíì ë ìŽë»ê² ëëì§ ìê°íŽë³Žì. ëšìŒ ì€ë ë ìì©ì ê·ž ì°ì°ìŽ ìë£ë ëê¹ì§ ì¬ì©ììê² ìëµíì§ ìì ê²ìŽë€. ëì¡°ì ìŒë¡ ìê°ìŽ ì€ë 걞늬ë ì°ì°ìŽ ë³ëì ë¹ëêž°ì ì€ë ëìì ì€íëë€ë©Ž ìì©ì ì¬ì í ì¬ì©ììê² ìëµí ì ìë€. | |||
ìì ê³µì (resource sharing) | íë¡ìžì€ë ê³µì ë©ëªšëЬì ë©ìì§ ì ë¬ êž°ë²ì íµíì¬ìŒë§ ììì ê³µì í ì ìì§ë§ ì€ë ëë ìëìŒë¡ ê·žë€ìŽ ìí íë¡ìžì€ì ììë€ê³Œ ë©ëªšëŠ¬ë¥Œ ê³µì íë€. | |||
겜ì ì±(economy) | íë¡ìžì€ ìì±ì ìíŽ ë©ëªšëЬì ììì í ë¹íë ê²ì ë¹ì©ìŽ ë§ìŽë ë€. ì€ë ëë ìì ìŽ ìí íë¡ìžì€ì ììë€ì ê³µì íêž° ë묞ì, ì€ë ë륌 ìì±íê³ ë¬žë§¥ êµííë ê²ìŽ ëì± ê²œì ì ìŽë€. | |||
ê·ëªš ì ìì±(scalability) | ë€ì€ ì²ëŠ¬êž° 구조ììë ê°ê°ì ì€ë ëê° ë€ë¥ž ì²ëŠ¬êž°ìì ë³ë ¬(parallel)ë¡ ìíë ì ìë€. |
ë€ì€ ìœìŽ íë¡ê·žëë°(_Multicore Programming)
ëšìŒ CPU ìì€í ì ë€ì€ CPU ìì€í ìŒë¡ ë°ì íììµëë€. ììŠ ìì€í ì€ê³ ì¶ìžë ëšìŒ 컎íší° 칩ì ì¬ë¬ 컎íší ìœìŽë¥Œ ë°°ì¹íë ê²ì ëë€. ê° ìœìŽë ìŽì첎ì ì ë³ëì CPUë¡ ë³Žì ëë€. ìŽë¬í ìì€í ì ë€ì€ ìœìŽëŒê³ íë©° ë€ì€ ì€ë ë íë¡ê·žëë°ì ìŽë¬í ì¬ë¬ 컎íší ìœìŽë¥Œ ë³Žë€ íšìšì ìŒë¡ ì¬ì©íê³ ë³íì±ì í¥ìíë êž°ë²ì ì ê³µí©ëë€. ì€ë ëê° 4ê°ìž ìì© íë¡ê·žëšì ê³ ë €íŽëŽ ìë€. ëšìŒ 컎íší ìœìŽê° ìë ìì€í ììë ëšì§ ì²ëЬ ìœìŽê° í ë²ì íëì ì€ë ëë§ ì€íí ì ìêž° ë묞ì ë³íì±(Concurrent)ì ìê°ìŽ ì§ëšì ë°ëŒ ì€ë ë ì€íìŽ ìží°ëŠ¬ëž ëšì ì믞í©ëë€.(ìë ìŽë¯žì§)
ê·žë¬ë ì¬ë¬ ìœìŽê° ìë ìì€í ìì ë³íì±ì ìì€í ìŽ ê° ìœìŽì ë³ëì ì€ë ë륌 í ë¹í ì ìêž° ë묞ì ìŒë¶ ì€ë ëê° ë³ë ¬(Parallel) ë¡ ì€íë ì ììì ì믞í©ëë€.(ìë ìŽë¯žì§)
íì¬ ë Œììì ë³íì±(concurrency)곌 ë³ë ¬ì±(parallelism)ì ì°šìŽì ì 죌목íŽìŒ í©ëë€. ë³í ìì€í ì 몚ë ìì ìŽ ì§íëê² íì¬ ë ìŽìì ìì ì ì§ìí©ëë€. ìŽì ë°íŽ ë³ë ¬ ìì€í ì ë ìŽìì ìì ì ëìì ìíí ì ììµëë€. ë°ëŒì, ë³ë ¬ì± ììŽ ë³íì±ì ê°ì§ ì ììµëë€. ë€ì€ ì²ëŠ¬êž° ë° ë€ì€ ìœìŽ ìí€í ì²ê° ì¶ííêž° ì ì ëë¶ë¶ì 컎íší° ìì€í ìë ëšìŒ íë¡ìžìë§ ìììŒë©° CPU ì€ìŒì€ë¬ë íë¡ìžì€ ê°ì ë¹ ë¥Žê² ì ííŽ ê° íë¡ìžì€ê° ì§íëëë¡ íì¬ ë³ë ¬ì±ì íìì ì ê³µíìµëë€. ìŽë¬í íë¡ìžì€ë ë³ííê² ì€íëìì§ë§ ë³ë ¬ë¡ ì€íëì§ë ìììµëë€.
ë€ì€ ì€ë ë 몚ëž(_Multithreading Models)
ì§êžê¹ì§ ìŒë°ì ì믞ììì ì€ë ë륌 ë€ë£šìŽ ììµëë€. ê·žë¬ë ì€ë ë륌 ìí ì§ìì ì¬ì©ì ì€ë ë(user threads)륌 ìíŽìë ì¬ì©ì ìì€ìì,ëë 컀ë ì€ë ë(kernel threads)륌 ìíŽìë 컀ë ìì€ìì ì ê³µë©ëë€. ì¬ì©ì ì€ë ëë 컀ë ììì ì§ìëë©° 컀ëì ì§ì ììŽ êŽëЬë©ëë€. ë°ë©Žì 컀ë ì€ë ëë ìŽì첎ì ì ìíŽ ì§ì ì§ìëê³ êŽëЬë©ëë€. Windows, Linux, macOS륌 í¬íší ê±°ì 몚ë íë ìŽì첎ì ë€ì í°ë ì€ë ë륌 ì§ìí©ëë€.
ìë ìŽë¯žì§ì ë¬ì¬ë ê²ì²ëŒ ê¶ê·¹ì ìŒë¡ ì¬ì©ì ì€ë ëì 컀ë ì€ë ëë ìŽë€ ì°êŽêŽê³ê° 졎ì¬íŽìŒ í©ëë€.
ìŽ ì ììë ìŽ ì°êŽ êŽê³ë¥Œ í늜íë ìž ê°ì§ ìŒë°ì ìž ë°©ë²ìž ë€ëìŒ, ìŒëìŒ, ë€ëë€ ëªšëžì ìŽíŽë³Žê² ìµëë€.
1. ë€ëìŒ ëªšëž(_Many_to-One Model)
ë€ëìŒ(many-to-one) 몚ëžì ë§ì ì¬ì©ì ìì€ ì€ë ë륌 íëì 컀ë ì€ë ëë¡ ì¬ìí©ëë€. ì€ë ë êŽëЬë ì¬ì©ì ê³µê°ì ì€ë ë ëŒìŽëžë¬ëЬì ìíŽ ííŽì§ëë€. ë°ëŒì íšìšì ìŽëŒ í ì ììµëë€. íì§ë§, í ì€ë ëê° ëŽìí ìì€í ìœì í 겜ì°, ì 첎 íë¡ìžì€ê° ëŽìë©ëë€. ëí, í ë²ì íëì ì€ë ëë§ìŽ ì»€ëì ì ê·Œí ì ìêž° ë묞ì, ë€ì€ ì€ë ëê° ë€ì€ ìœìŽ ìì€í ìì ë³ë ¬ë¡ ì€íë ì ììµëë€. 귞늰 ì€ë ë(green thread)ê° ë€ëìŒ ëªšëžì ì¬ì©íìëë°, 귞늰 ì€ë ëë Solaris ìì€í ì ìí ì€ë ë ëŒìŽëžë¬ëŠ¬ë¥Œ ë§íë©° Javaì ìŽêž° ë²ì ììë ì±íëììµëë€. ê·žë¬ë ë€ì€ ì²ëЬ ìœìŽê° ëë¶ë¶ì 컎íší° ìì€í ìì íì€ìŽ ëìê³ ë€ì€ ì²ëЬ ìœìŽì ìŽì ì ìŽëŠŽ ì ìêž° ë묞ì ìŽ ëªšëžì ì¬ì© ì€ìž ìì€í ì ê±°ì 졎ì¬íì§ ììµëë€.
2. ìŒëìŒ ëªšëž(_One-to-One Model)
ìŒëìŒ(one-to-one) 몚ëžì ê° ì¬ì©ì ì€ë ë륌 ê°ê° íëì 컀ë ì€ë ëë¡ ì¬ìí©ëë€. ìŽ ëªšëžì íëì ì€ë ëê° ëŽìì ìì€í ìœì ížì¶íëëŒë ë€ë¥ž ì€ë ëê° ì€íë ì ìêž° ë묞ì ë€ëìŒ ëªšëžë³Žë€ ë ë§ì ë³ë ¬ì±ì ì ê³µí©ëë€. ëí ìŽ ëªšëžì ë€ì€ ì²ëŠ¬êž°ìì ë€ì€ ì€ë ëê° ë³ë ¬ë¡ ìíëë ê²ì íì©í©ëë€. ìŽ ëªšëžì ì ìŒí ëšì ì ì¬ì©ì ì€ë ë륌 ë§ë€ë €ë©Ž íŽë¹ 컀ë ì€ë ë륌 ë§ë€ìŽìŒ íë©° ë§ì ìì 컀ë ì€ë ëê° ìì€í ì±ë¥ì ë¶ëŽì ì€ ì ìë€ë ê²ì ëë€. Linuxë Windows ìŽì첎ì ì í군곌 íšê» ìŒëìŒ ëªšëžì 구íí©ëë€.
3. ë€ëë€ ëªšëž(_Many_to_Many_Model)
ë€ëë€(many-to-many) 몚ëžì ì¬ë¬ ê°ì ì¬ì©ì ìì€ ì€ë ë륌 ê·žë³Žë€ ìì ì, í¹ì ê°ì ìì 컀ë ì€ë ëë¡ ë©í°íë ì€ í©ëë€. 컀ë ì€ë ëì ìë ìì©íë¡ê·žëšìŽë í¹ì êž°ê³ì ë°ëŒ ê²°ì ë©ëë€(ìì© íë¡ê·žëšì 4ê°ì ìœìŽ ìì€í ë³Žë€ 8ê°ì ìœìŽ ìì€í ìì ë ë§ì 컀ë ì€ë ë륌 í ë¹ë°ì ì ìë€).
ìŽë¬í ì€ê³ê° ë³í ì€íì 믞ì¹ë ìí¥ì ìê°íŽ ëŽ ìë€. ë€ëìŒ ëªšëžì ê°ë°ìê° ìíë ë§íŒì ì¬ì©ì ìì€ ì€ë ë륌 ìì±íëë¡ íì©íì§ë§, 컀ëì í ë²ì íëì 컀ë ì€ë ëë§ ì€ìŒì€ í ì ìêž° ë묞ì ì§ì í ë³ë ¬ ì€íì íëí ì ììµëë€. ìŒëìŒ ëªšëžì ë ë§ì ë³í ì€íì ì ê³µíì§ë§, ê°ë°ìê° í ìì© ëŽì ë묎 ë§ì ì€ë ë륌 ìì±íì§ ìëë¡ ì£ŒìíŽìŒ í©ëë€(ì¬ì€ ìŒë¶ ìì€í ììë ìì±í ì ìë ì€ë ëì ìê° ì íë ì ììµëë€). ë€ëë€ ëªšëžì ìŽë¬í ë ê°ì§ì ëšì ë€ì ìŽë ì ë íŽê²°íìµëë€. ê°ë°ìë íìí ë§íŒ ë§ì ì¬ì©ì ìì€ ì€ë ë륌 ìì±í ì ììµëë€. ê·žëŠ¬ê³ ììíë 컀ë ì€ë ëê° ë€ì€ ì²ëŠ¬êž°ìì ë³ë ¬ë¡ ìíë ì ììµëë€. ëí, ì€ë ëê° ëŽìí ìì€í ìœì ë°ìì쌰ì ë, 컀ëìŽ ë€ë¥ž ì€ë ëì ìíì ì€ìŒì€ í ì ììµëë€.
ë€ëë€ ëªšëžì ë³íì ì¬ì í ë§ì ì¬ì©ì ì€ë ë륌 ì ê±°ë ê°ì ìì 컀ë ì€ë ëë¡ ë©í°íë ì€ ìí€ì§ë§ ëí í ì¬ì©ì ì€ë ëê° íëì 컀ë ì€ë ëìë§ ì°êŽëë ê²ì íì©í©ëë€. ìŽ ë³íì ëë¡ ë ìì€ ëªšëž(two-level-model)ìŽëŒê³ ë¶ëŠœëë€.
ë€ëë€ ëªšëžìŽ ë Œìë ëªšëž ì€ ê°ì¥ ìµíµì± ìë ê²ìŒë¡ 볎ìŽì§ë§ ì€ì ë¡ë 구ííêž°ê° ìŽë µìµëë€. ëí ëë¶ë¶ì ìì€í ìì ì²ëЬ ìœìŽ ìê° ìŠê°íšì ë°ëŒ 컀ë ì€ë ë ì륌 ì ííë ê²ì ì€ìì±ìŽ ì€ìŽë€ììµëë€. 결곌ì ìŒë¡ ëë¶ë¶ì ìŽì첎ì ë ìŽì ìŒëìŒ ëªšëžì ì¬ì©í©ëë€.
ì€ë ëì êŽë šë 묞ì ë€(_Threading Issues)
ìŽë²ìë ë€ì€ ì€ë ë íë¡ê·žëšì ì€ê³í ë ê³ ë €íŽìŒ í ëª ê°ì§ 묞ì ë€ì ë ŒìíŽ ë³Žê² ìµëë€.
1. Fork() ë° Exec() ìì€í ìœ(_The fork() and exec() Systems Calls)
fork()ì exec()ì ì°šìŽ
fork()ì exec()ë 몚ë í íë¡ìžì€ê° ë€ë¥ž íë¡ìžì€ë¥Œ ì€íìí€êž° ìíŽ ì¬ì©íê² ë©ëë€. execìë execl, execvë± ì¬ë¬ê°ì§ íšìêµ°ì ê°ì§ê³ ììµëë€. execì íšìêµ°ì ëíŽìë ìë쪜ìì ì°šìŽë¥Œ
jwprogramming.tistory.com
ê·žì ì fork()ì exec()ì ì°šìŽë¥Œ ìììŒ í©ëë€. ì ëžë¡ê·žì ì ì 늬ëìŽ ìë€ê³ ìê°íë 뚌ì ìœê³ ì€ìë ê²ì ì¶ì²ë늜ëë€.
ë€ì€ ì€ë ë íë¡ê·žëšììë fork()ì exec()ì ìë¯žê° ë¬ëŒì§ ì ììµëë€.
ë§ìŒ í íë¡ê·žëšì ì€ë ëê° fork()륌 ížì¶í멎 ìë¡ìŽ íë¡ìžì€ë 몚ë ì€ë ë륌 ë³µì íŽìŒ í ì§ ìë멎 í ê°ì ì€ë ëë§ ê°ì§ë íë¡ìžì€ì¬ìŒ íëì§ì ëí ì묞ì ê°ì§ ì ììµëë€. ëªëª UNIX êž°ì¢ ì ìŽ ë ê°ì§ ë²ì fork()륌 ë€ ì ê³µí©ëë€. íëë 몚ë ì€ë ë륌 ë³µì¬íë ê²ê³Œ ë€ë¥ž íëë fork()륌 ížì¶í ì€ë ëë§ ë³µì íë ê²ì ëë€.
exec() ìì€í ìœì ìŽë€ ì€ë ëê° exec() ìì€í ìœì ë¶ë¥Žë©Ž exec()ì ë§€ê°ë³ìë¡ ì§ì ë íë¡ê·žëšìŽ ëªšë ì€ë ë륌 í¬íší ì 첎 íë¡ìžì€ë¥Œ ë첎ìíµëë€.
ë ë²ì ì fork()ì€ ìŽë 쪜ì íí ê²ìžì§ë ìì© íë¡ê·žëšì ë¬ë €ììµëë€. fork()륌 ë¶ë¥Žìë§ì ë€ì execì ë¶ë¥žë€ë©Ž 몚ë ì€ë ë륌 ë€ ë³µì íŽì ë§ë€ìŽì£Œë ê²ì ë¶íìí©ëë€. ìëí멎 execìì ì§ì í íë¡ê·žëšìŽ ê³§ 몚ë ê²ì ë€ì ë첎í ê²ìŽêž° ë묞ì ëë€. ìŽ ê²œì°ìë fork() ìì€í ìœì ížì¶í ì€ë ëë§ ë³µì¬íŽì£Œë ê²ìŽ ì ì í©ëë€. ê·žë¬ë ì íë¡ìžì€ê° fork() í exec()륌 íì§ ìëë€ë©Ž ì íë¡ìžì€ë 몚ë ì€ë ëë€ì ë³µì íŽìŒ í©ëë€.
2. ì íž ì²ëЬ(_Signal Handling)
ì ížë UNIXìì íë¡ìžì€ì ìŽë€ ìŽë²€ížê° ìŒìŽë¬ìì ìë €ì£Œêž° ìíŽ ì¬ì©ë©ëë€. ì ížë ìë €ì€ ìŽë²€ížì ê·Œìì§ë ìŽì ì ë°ëŒ ëêž°ì ëë ë¹ëêž°ììŒë¡ ì ë¬ë ì ììµëë€. ëêž°ììŽê±Ž ë¹ëêž°ììŽê±Ž 몚ë ì ížë ë€ì곌 ê°ì ííë¡ ì ë¬ë©ëë€.
- ì ížë í¹ì ìŽë²€ížê° ìŒìŽëìŒ ìì±ëë€.
- ìì±ë ì ížê° íë¡ìžì€ì ì ë¬ëë€.
- ì ížê° ì ë¬ë멎 ë°ëì ì²ëЬëìŽìŒ íë€.
ëêž°ì ì ížì ìë¡ë ë¶ë²ì ìž ë©ëªšëЬ ì ê·Œ, 0ìŒë¡ ëëêž° ë±ìŽ ììµëë€. ì€í ì€ìž íë¡ê·žëšìŽ ìŽë¬í íëì í멎 ì ížê° ë°ìí©ëë€. ëêž°ì ì ížë ì ížë¥Œ ë°ììíš ì°ì°ì ìíí ëìŒí íë¡ìžì€ì ì ë¬ë©ëë€.(ëêž°ììŽëŒê³ ê°ì£Œíë ìŽì )
ì ížê° ì€í ì€ìž íë¡ìžì€ ìžë¶ë¡ë¶í° ë°ìí멎 ê·ž íë¡ìžì€ë ì ížë¥Œ ë¹ëêž°ììŒë¡ ì ë¬ë°ìµëë€. ìŽë¬í ì ížì ììë <control><C> ê°ì í¹ìí í€ë¥Œ ëë¬ì íë¡ìžì€ë¥Œ ê°ì ì¢ ë£ìí€ê±°ë íìŽëšžê° ë§ë£ëë 겜ì°ê° í¬íšë©ëë€. ë¹ëêž°ì ì ížë íµì ë€ë¥ž íë¡ìžì€ì ì ë¬ë©ëë€.
몚ë ì ížë ë ì€ íëì ì²ëŠ¬êž°ì ìíŽ ì²ëЬë©ëë€.
- ëíŽíž ì íž ì²ëŠ¬êž°
- ì¬ì©ì ì ì ì íž ì²ëŠ¬êž°
몚ë ì ížë§ë€ 컀ëìŽ ì€íìí€ë ëíŽíž ì íž ì²ëŠ¬êž°ê° ììµëë€. ìŽ ëíŽíž ì²ëŠ¬êž°ë ì ížë¥Œ ì²ëЬíêž° ìíì¬ ížì¶ëë ì¬ì©ì ì ì ì²ëŠ¬êž°ì ìíŽ ë첎ë ì ììµëë€. ì ížë ë€ë¥ž ë°©ììŒë¡ ì²ëЬë ì ììµëë€. ìŒë¶ ì ížë 묎ìë ì ìì§ë§ ë€ë¥ž ì íž(ì: ë¶ë² ë©ëªšëЬ ì¡ìžì€)ë íë¡ê·žëšì ì¢ ë£íì¬ ì²ëЬë©ëë€.
ëšìŒ ì€ë ë íë¡ê·žëšììì ì íž ì²ëЬë ê°ëší©ëë€. ì ížë íì íë¡ìžì€ì ì ë¬ë©ëë€. ê·žë¬ë íë¡ìžì€ê° ì¬ë¬ ì€ë ë륌 ê°ì§ê³ ìë ë€ì€ ì€ë ë íë¡ê·žëšììì ì íž ì²ëЬë ëì± ë³µì¡í©ëë€. ìŽë ì€ë ëì ì ížë¥Œ ì ë¬íŽìŒ í ê¹ì?
ìŒë°ì ìŒë¡ ë€ì곌 ê°ì ì íìŽ ì¡Žì¬í©ëë€.
- ì ížê° ì ì©ë ì€ë ëìê² ì ë¬íë€.
- 몚ë ì€ë ëì ì ë¬íë€.
- ëªëª ì€ë ëìë§ ì íì ìŒë¡ ì ë¬íë€.
- í¹ì ì€ë ëê° ëªšë ì ížë¥Œ ì ë¬ë°ëë¡ ì§ì íë€.
ì ížë¥Œ ì ë¬íë ë°©ë²ì ì ížì ì íì ë°ëŒ ë€ëŠ ëë€. ì륌 ë€ìŽ ëêž°ì ì ížë ê·ž ì ížë¥Œ ìŒêž°í ì€ë ëì ì ë¬ëìŽìŒ íê³ ë€ë¥ž ì€ë ëì ì ë¬ë멎 ì ë©ëë€. ê·žë¬ë ë¹ëêž°ì ì ížì 겜ì°ë ëª ííì§ ììµëë€. <Control><C> ê°ì í€ë¥Œ ì³ì ê·ž íë¡ìžì€ë¥Œ ê°ì ì¢ ë£íë ì ížì ê°ì ìŽë€ ë¹ëêž°ì ì ížë ê·ž íë¡ìžì€ ëŽ ëªšë ì€ë ëì ì ë¬ëìŽìŒ í©ëë€. ì ížë¥Œ ì ë¬íë ë° ì¬ì©ëë íì€ UNIX íšìë
kill(pid_t, int signal)
ìì ê°ìµëë€. ìŽ íšìë í¹ì ì ížê° ì ë¬ë íë¡ìžì€(pid)륌 ì§ì í©ëë€. ëë¶ë¶ì ë€ì€ ì€ë ë UNIXë ì€ë ëì ë°ìë€ìŒ ì ížì ëŽìí ì ížë¥Œ ì§ì í ì ìë ì íê¶ì ì€ëë€. ë°ëŒì ìŽë€ 겜ì°ìë ë¹ëêž°ì ì ížë¥Œ ëŽìíì§ ìê³ ìë ì€ë ëë€ìê²ë§ ì ížë¥Œ ì ë¬íŽìŒ í ì ììµëë€. íì§ë§ ì ížë ì€ì§ í ë²ë§ ì²ëЬëìŽìŒ íêž° ë묞ì ê·ž ì ížë¥Œ ëŽìíì§ ìê³ ìë 첫 ë²ì§ž ì€ë ëìë§ ì ížê° ì ë¬ë©ëë€. POSIX Pthreadsë tidë¡ ì§ì ë ì€ë ëìë§ ì ë¬ìŽ ëëë¡ íì©íë ë€ì곌 ê°ì íšì륌 ì ê³µí©ëë€.
pthread_kill(pthread_t tid, int signal)
Windosë ì ížë¥Œ ëª ìì ìŒë¡ ì§ìíì§ë ìì§ë§ ë¹ëêž°ì íë¡ìì ížì¶(asynchronous procedure calls, APC)ìŽëŒë ê²ì ì¬ì©íŽì ìŽë¥Œ ë늬 ì€í(emulate)í ì ììµëë€. APCë ì¬ì©ì ì€ë ëë€ìŽ í¹ì ìŽë²€ížì ë°ìì ì ë¬ë°ìì ë ížì¶ë íšì륌 ì§ì í ì ìê² í©ëë€. ìŽëŠìŽ ì믞íë ë°ì ê°ìŽ APCë UNIXì ë¹ëêž°ì ì ížì ì ì¬í©ëë€. ê·žë¬ë UNIXììë ë€ì€ ì€ë ë í겜ìì ì ížë¥Œ ìŽë»ê² ì²ëЬíŽìŒ í ì§ë¥Œ ê³ ë¯ŒíŽìŒ íì§ë§ APCë íë¡ìžì€ì ì ë¬ëë ê²ìŽ ìëëŒ í¹ì ì€ë ëìê² ì ë¬ëêž° ë묞ì ì¢ ë ê°ëší©ëë€.
3. ì€ë ë ì·šì(_Thread Cancellation)
ì€ë ë ì·šì(thread cancellation)ë ì€ë ëê° ëëêž° ì ì ê·žê²ì ê°ì ì¢ ë£ìí€ë ìì ì ìŒì»«ìµëë€. ì륌 ë€ìŽ ì¬ë¬ ì€ë ëê° ë°ìŽí°ë² ìŽì€ë¥Œ ë³ë ¬ë¡ ê²ìíê³ ìë€ê° ê·žì€ í ì€ë ëê° ê²°ê³Œë¥Œ ì°Ÿìë€ë©Ž ëëšžì§ ì€ë ëë ì·šìëìŽë ë©ëë€. ë ë€ë¥ž 겜ì°ë ì¹ ëžëŒì°ì ìì ì¬ì©ìê° ì¹ íìŽì§ë¥Œ ëë ì ì¬íì§ ìêž° ìíŽ ì€í±(stop) ë²íŒì íŽëŠí ìë ììµëë€. ì¢ ì¢ ì¹ íìŽì§ë ì¬ë¬ ì€ë ëë€ì ì¬ì©íì¬ ì ì¬ë©ëë€(ê° ìŽë¯žì§ë ë³ëì ì€ë ëì ìíŽ ì ì¬ëë€). ì¬ì©ìê° stop ëšì¶ë¥Œ ë륎멎, ì¹ íìŽì§ë¥Œ ê°ì žì€ë 몚ë ì€ë ëê° ì·šìë©ëë€.
ìŽì²ëŒ ì·šìëìŽìŒ í ì€ë ë륌 목ì ì€ë ë(target thread)ëŒê³ ë¶ëŠ ëë€. 목ì ì€ë ëì ì·šìë ë€ì곌 ê°ì ë ê°ì§ ë°©ììŒë¡ ë°ìí ì ììµëë€.
- ë¹ëêž°ì ì·šì(asynchronous cancellation): í ì€ë ëê° ìŠì 목ì ì€ë ë륌 ê°ì ì¢ ë£ìíšë€.
- ì§ì° ì·šì(deferred cancellation): 목ì ì€ë ëê° ì£Œêž°ì ìŒë¡ ìì ìŽ ê°ì ì¢ ë£ëìŽìŒ í ì§ë¥Œ ì ê²íë€. ìŽ ê²œì° ëª©ì ì€ë ëê° ì§ì ì ì°íê² ê°ì ì¢ ë£ë ì ìë êž°íê° ë§ë€ìŽì§ë€.
ì€ë ë ì·šì륌 ìŽë µê² ë§ëë ê²ì ì·šì ì€ë ëë€ì í ë¹ë ìì 묞ì ì ëë€. ëí ì€ë ëê° ë€ë¥ž ì€ë ëì ê³µì íë ìë£êµ¬ì¡°ë¥Œ ê°±ì íë ëì€ì ì·šì ìì²ìŽ ìë 묞ì ê° ë©ëë€. íìì 묞ì ë ë¹ëêž°ì ì·šìì ê²œì° ë ì¬ê°í©ëë€. ì¢ ì¢ ìŽì첎ì ë ì·šìë ì€ë ëë¡ë¶í° ìì€í ììì íìí ìë ìì§ë§, 몚ë ìì€í ììì íìíì§ ëª»íë 겜ì°ë ììµëë€. ë°ëŒì ë¹ëêž°ììŒë¡ ì€ë ë륌 ì·šìí멎 íìí ììì ë€ ì¬ì© ê°ë¥í ìíë¡ ë§ë€ì§ 못í ìë ììµëë€.
ìŽì ë°ëë¡ ì§ì° ì·šìì 겜ì°ìë í ì€ë ëê° ëª©ì ì€ë ë륌 ì·šìíŽìŒ íë€ê³ íìíì§ë§ ì€ì ì·šìë 목ì ì€ë ëê° ì·šì ì¬ë¶ë¥Œ ê²°ì íêž° ìí íë귞륌 ê²ì¬í ìŽíììŒ ìŒìŽë©ëë€. ì€ë ëë ìì ìŽ ì·šìëìŽë ìì íë€ê³ íëšëë ìì ìì ì·šì ì¬ë¶ë¥Œ ê²ì¬í ì ììµëë€.
Pthreadsììë pthread_cancel() íšì륌 ì¬ì©íì¬ ì€ë ë륌 ì·šìí ì ììµëë€. 목ì ì€ë ëì ìë³ìê° ìŽ íšìì ë§€ê°ë³ìë¡ ì ë¬ë©ëë€. ë€ì ìœëë ì€ë ë륌 ìì±íê³ ìŽìŽì ì·šìíë ì륌 볎ì ëë€.
pthread t tid;
/* create the thread */
pthread create(&tid, 0, worker, NULL);
...
/* cancel the thread */
pthread cancel(tid);
/* wait for the thread to terminate */
pthread join(tid,NULL);
pthread_cancel()ì ížì¶í멎 ëì ì€ë ë륌 ì·šìíëŒë ìì²ë§ íìë©ëë€. ê·žë¬ë ì€ì ì·šìë ìì²ì ì²ëЬíêž° ìíŽ ëì ì€ë ëê° ì€ì ëë ë°©ìì ë¬ë € ììµëë€. ëì ì€ë ëê° ìµì¢ ì ìŒë¡ ì·šìë멎 ì·šì ì€ë ëì pthread_join() ížì¶ìŽ ë°íë©ëë€. Pthreadsë 3ê°ì§ ì·šì 몚ë륌 ì§ìí©ëë€. ê° ëªšëë ìë íì ê°ìŽ ìí ë° ì íìŒë¡ ì ìë©ëë€. ì€ë ëë API륌 ì¬ì©íì¬ ì·šì ìí ë° ì íì ì€ì í ì ììµëë€.
몚ë | ìí | ì í |
Off | ì¬ì© ë¶ê°ë¥ | - |
ì§ì°(deferred) | ì¬ì© ê°ë¥ | ì§ì°(deferred) |
ë¹ëêž°ì(asynchronous) | ì¬ì© ê°ë¥ | ë¹ëêž°ì(asynchronous) |
íìì ì ì ìë¯ìŽ Pthreadsë ì€ë ëê° ì·šì륌 íì± ëë ë¹íì± íë ê²ì íì©í©ëë€. ì·šìê° ë¹íì±íëìŽ ììŒë©Ž ì€ë ë륌 ì·šìí ì ììµëë€. ê·žë¬ë ì·šì ìì²ì ê³ì ë³Žë¥ ìíë¡ ì ì§ëë¯ë¡ ì€ë ëë ëì€ì ì·šì륌 íì±ííê³ ìì²ì ìëµí ì ììµëë€.
Ʞ볞 ì·šì ì íì ì§ì° ì·šìì ëë€. ê·žë¬ë ì€ë ëê° ì·šì ì ì ëë¬í 겜ì°ìë§ ì·šìê° ë°ìí©ëë€. POSIX ë° íì€ C ëŒìŽëžë¬ëЬìì ëë¶ë¶ì ëžë¡í¹ ìì€í ìœì ì·šì ì ìŒë¡ ì ìëë©°, Linux ìì€í ìì man pthreads ëª ë ¹ì ížì¶í ë ëìŽë©ëë€. ì륌 ë€ìŽ, read() ìì€í ìœì read()ìì ì ë ¥ì êž°ë€ëЬë ëì ëŽìë ì€ë ëì ì·šì륌 íì©íë ì·šì ì ì ëë€.
ì·šì ì ì ì€ì íë í ê°ì§ êž°ë²ì pthread_testcancel() íšì륌 ížì¶íë ê²ì ëë€. ì·šì ìì²ìŽ ë³Žë¥ ì€ìž ê²ìŒë¡ íìžë멎 pthread_testcancel() ížì¶ìŽ ë³µê·íì§ ìê³ ì€ë ëê° ì¢ ë£ë©ëë€. ê·žë ì§ ììŒë©Ž íšì ížì¶ìŽ ë³µê·ëê³ ì€ë ëê° ê³ì ì€íë©ëë€. ëí Pthreadsë ì€ë ëê° ì·šìë ë ì 늬 ížë€ë¬(cleanup handler)ëŒê³ íë íšìê° ížì¶ëê² í ì ììµëë€. ìŽ êž°ë¥ì ì¬ì©í멎 ì€ë ëê° ì¢ ë£ëêž° ì ì ì€ë ëê° íëí 몚ë ììì íŽì í ì ììµëë€.
ë€ì ìœëë ì€ë ëê° ì·šì ìì²ì ëíŽ ì§ì° ì·šì륌 ì¬ì©íì¬ ìëµíë ë°©ë²ì 볎ì¬ì€ëë€.
while (1) {
/* do some work for awhile */
...
/* check if there is a cancellation request */
pthread testcancel();
}
Javaì ì€ë ë ì·šìë Pthreadì ì§ì° ì·šìì ì ì¬í ì ì± ì ì¬ì©í©ëë€. Java ì€ë ë륌 ì·šìíë €ë©Ž interrupt() ë©ìë륌 ížì¶íì¬ ëì ì€ë ëì ìží°ëœíž ìí륌 trueë¡ ì€ì í©ëë€.
Thread worker;
...
/* set the interruption status of the thread */
worker.interrupt()
ì€ë ëë ìì ì ìží°ëœíž ìí륌 isInterrupted() ë©ìë륌 ížì¶íì¬ íìží ì ììŒë©°, ìŽ ë©ìëë ì€ë ëì ìží°ëœíž ìí륌 ëíëŽë boolean ê°ì ë°íí©ëë€.
while (!Thread.currentThread().isInterrupted()) {
...
}
4. ì€ë ë-ë¡ì»¬ ì ì¥ì¥ì¹(_Thread-Local Stroage)
í íë¡ìžì€ì ìí ì€ë ëë€ì ê·ž íë¡ìžì€ì ë°ìŽí°ë¥Œ 몚ë ê³µì í©ëë€. ìŽì ê°ì ë°ìŽí° ê³µì ë ë€ì€ ì€ë ë íë¡ê·žëë°ì í° ì¥ì ì€ íëì ëë€. ê·žë¬ë ìí©ì ë°ëŒìë ê° ì€ë ëê° ìêž°ë§ ì¡ìžì€ í ì ìë ë°ìŽí°ë¥Œ ê°ì žìŒ í íìë ììµëë€. ê·žë¬í ë°ìŽí°ë¥Œ ì€ë ë-ë¡ì»¬ ì ì¥ì¥ì¹)(thread-local storage, TLS)ëŒê³ ë¶ëŠ ëë€. ì륌 ë€ìŽ ížëìì ì²ëЬ ìì€í ìì ê° ížëìì ì ë 늜ë ì€ë ëê° ì²ëŠ¬íŽ ì€ë€ê³ ê°ì íŽ ëŽ ìë€. ëì±ìŽ ê° ížëìì ì ê³ ì í ížëìì ìë³ìê° ì£ŒìŽì§ë€ê³ ê°ì íŽëŽ ìë€. ìŽë ì€ë ëë§ë€ ê³ ì í ìë³ì륌 ì°êŽìí€êž° ìíŽìë ì€ë ë êµì§ ì ì¥ìê° ììŽìŒë§ í©ëë€.
TLS륌 ì§ì ë³ìì íŒëíêž° ìœìµëë€. ê·žë¬ë ì§ì ë³ìê° íëì íšìê° ížì¶ëë ëììë§ ë³ŽìŽì§ë§ TLSë ì 첎 íšì ížì¶ì ê±žì³ ë³Žì ëë€. ëí ê°ë°ìê° ì€ë ë ìì± ê³Œì ì ëíŽ ì ìŽí ì ìë 겜ì°(ì, ì€ë ë í곌 ê°ì ì묵ì êž°ë²ì ì¬ì©íë 겜ì°) ë€ë¥ž ë°©ë²ìŽ íìí©ëë€.
ìŽë€ 멎ìì TLSë ì ì ë°ìŽí°ì ì ì¬í©ëë€. ì°šìŽì ì TLS ë°ìŽí°ë ì€ë ëë§ë€ ê³ ì íë€ë ê²ì ëë€. (ì¬ì€ TLSë ë³Žíµ staticìŒë¡ ì ìžë©ëë€.) ëë¶ë¶ì ì€ë ë ëŒìŽëžë¬ëЬ ë° ì»ŽíìŒë¬ë TLS륌 ì§ìí©ëë€. ì륌 ë€ìŽ, Javasms ThreadLocal<T> ê°ì²Žì ëí set() ë° get() ë©ìëì íšê» ThreadLocal<T> íŽëì€ë¥Œ ì ê³µí©ëë€. Pthreadìë pthread_key_t ì íìŽ í¬íšëìŽ ììŒë©° ê° ì€ë ëì ê³ ì í í€ë¥Œ ì ê³µí©ëë€. ê·žë° ë€ìì í€ë¥Œ ì¬ì©íì¬ TLS ë°ìŽí°ì ì ê·Œí ì ììµëë€.
5. ì€ìŒì€ë¬ ì¡í°ë² ìŽì (_Scheduler Activations)
ë€ì€ ì€ë ë íë¡ê·žëšê³Œ êŽë šíì¬ ë§ì§ë§ìŒë¡ ê³ ë €í 묞ì ë ì€ë ë ëŒìŽëžë¬ëЬì 컀ëì íµì 묞ì ì ëë€. ìŽ íµì ì ììì ë Œìí ë€ëë€ ë° ë ìì€ ëªšëžìì ë°ëì íŽê²°íŽìŒ í 묞ì ì ëë€. ìŽë¬í íµì ì ì¡°ì ì ìì© íë¡ê·žëšìŽ ìµê³ ì ì±ë¥ì 볎ìŽëë¡ ë³Žì¥íêž° ìíì¬ ì»€ë ì€ë ëì ì륌 ëì ìŒë¡ ì¡°ì íë ê²ì ê°ë¥íê² í©ëë€.
ë€ëë€ ëë ë ìì€ ëªšëžì 구ííë ë§ì ìì€í ì ì¬ì©ìì 컀ë ì€ë ë ì¬ìŽì ì€ê° ìë£êµ¬ì¡°ë¥Œ ë¡ëë€. ìŽ ìë£êµ¬ì¡°ë íµì° 겜ë íë¡ìžì€ ëë LWPëŒê³ ë¶ëŠ¬ë©° ìë 귞늌곌 ê°ìµëë€.
ì¬ì©ì ì€ë ë ëŒìŽëžë¬ëЬì LWP ë°©ìì ìì©ìŽ ì¬ì©ì ì€ë ë륌 ìííêž° ìíì¬ ì€ìŒì€ í ê°ì ì²ëŠ¬êž°(virtual processor)ì²ëŒ 볎ì ëë€. ê° LWPë íëì 컀ë ì€ë ëì ë¶ìëìŽ ììŒë©° 묌늬 ì²ëŠ¬êž°ìì ì€ìŒì€ íë ëìì ë°ë¡ ìŽ ì»€ë ì€ë ëì ëë€. ì ì¶ë ¥ìŽ ìë£ëꞰ륌 êž°ë€ëЬë ëì ê°ìŽ ì»€ë ì€ë ëê° ëŽìë멎 LWPë ê°ìŽ ëŽìë©ëë€. ìŽ ì°êŽì ë°ëŒ LWPì ë¶ìë ì¬ì©ì ìì€ ì€ë ëë ìì ëŽìë©ëë€.
ìì©ì íšìšì ìŒë¡ ì€íëêž° ìíì¬ ììì ê°ìì LWP륌 íìë¡ í ìë ììµëë€. íëì ì²ëŠ¬êž°ììì ì€íëë CPU ì€ì¬ ìì©ì ê³ ë €íŽ ëŽ ìë€. ìŽ ìë늬ì€ìì íìê°ì ì€ì§ íëì ì€ë ëë§ìŽ ì€íë ì ììµëë€. ë°ëŒì íëì LWPìŽë©Ž ì¶©ë¶í©ëë€. ê·žë¬ë ì ì¶ë ¥ ì€ì¬ ìì©ì ì¬ë¬ ê°ì LWP륌 íìë¡ í ìë ììµëë€. íµì ëìì ë°ìíë ëŽìí ìì€í ìœë§ë€ íëì LWPê° íìí©ëë€. ì륌 ë€ìŽ ìë¡ ë€ë¥ž 5ê°ì íìŒ ìœêž° ìì²ìŽ ë°ìíë€ê³ ê°ì íŽëŽ ìë€. 몚ë LWPê° ì ì¶ë ¥ ìë£ë¥Œ êž°ë€ëŠ¬ë©Žì 컀ë ììì ëêž°í ì ìêž° ë묞ì 5ê°ì LWPê° íìí©ëë€. ë§ìŒ íë¡ìžì€ê° 4ê°ì LWPë§ì ê°ì§ê³ ìë€ë©Ž ë€ì¯ ë²ì§ž ìì²ì íëì LWPëŒë 컀ëìì ë³µê·í ëê¹ì§ êž°ë€ë €ìŒ í©ëë€.
ì¬ì©ì ì€ë ë ëŒìŽëžë¬ëЬì 컀ë ì€ë ë ê°ì íµì ë°©ë²ì íëë ì€ìŒì€ë¬ ì¡í°ë² ìŽì ìŽëŒê³ ìë €ì§ ë°©ë²ì ëë€. ìŽê²ì ë€ì곌 ê°ìŽ ëìí©ëë€. 컀ëì ìì©ì ê°ì ì²ëŠ¬êž°(LWP)ì ì§í©ì ì ê³µíê³ ìì©ì ì¬ì©ì ì€ë ë륌 ê°ì©í ê°ì ì²ëŠ¬êž°ë¡ ì€ìŒì€ í©ëë€. ê²ë€ê° 컀ëì ìì©ìê² í¹ì ìŽë²€ížì ëíŽ ìë €ì€ìŒ í©ëë€. ìŽ íë¡ìì 륌 upcallìŽëŒê³ ë¶ëŠ ëë€. Upcallì ì€ë ë ëŒìŽëžë¬ëЬì upcall ì²ëŠ¬êž°ì ìíŽ ì²ëЬëê³ , upcall ì²ëŠ¬êž°ë ê°ì ì²ëŠ¬êž°ììì ì€íëìŽìŒ í©ëë€.
Upcallì ìŒìŒí€ë í ìŽë²€ížë ìì© ì€ë ëê° ëŽìíë €ê³ í ë ë°ìí©ëë€. ìŽ ìë늬ì€ìì 컀ëì ì€ë ëê° ëŽìíë €ê³ íë€ë ì¬ì€ê³Œ ê·ž ì€ë ëì ìë³ì륌 ìë € 죌ë upcallì í©ëë€. ê·žë° íì 컀ëì ìë¡ìŽ ê°ì ì²ëŠ¬êž°ë¥Œ ìì©ì í ë¹í©ëë€. ìì©ì ìŽ ìë¡ìŽ ê°ì ì²ëŠ¬êž°ììì upcall ì²ëŠ¬êž°ë¥Œ ìííê³ ìŽ upcallì²ëŠ¬êž°ë ëŽì ì€ë ëì ìí륌 ì ì¥íê³ ìŽ ì€ë ëê° ì€í ì€ìŽë ê°ì ì²ëŠ¬êž°ë¥Œ ë°íí©ëë€. ê·žëŠ¬ê³ upcall ì²ëŠ¬êž°ë ìë¡ìŽ ê°ì ì²ëŠ¬êž°ìì ì€í ê°ë¥í ë€ë¥ž ì€ë ë륌 ì€ìŒì€ í©ëë€. ëŽì ì€ë ëê° êž°ë€ëЬë ìŽë²€ížê° ë°ìí멎 컀ëì ìŽì ì ëŽìëìë ì€ë ëê° ìŽì ì€íí ì ìë€ë ì¬ì€ì ìë €ì£Œë ë ë€ë¥ž upcallì ì€ë ë ëŒìŽëžë¬ëЬì ìíí©ëë€. ìŽ ìŽë²€ížë¥Œ ì²ëЬíë Upcall ì²ëŠ¬êž°ë ê°ì ì²ëŠ¬êž°ê° íìíê³ ì»€ëì ìë¡ìŽ ê°ì ì²ëŠ¬êž°ë¥Œ í ë¹íê±°ë ì¬ì©ì ì€ë ë íë륌 ì ì íì¬ ê·ž ì²ëŠ¬êž°ìì ìŽ upcall ì²ëŠ¬êž°ë¥Œ ì€íí©ëë€. ëŽìê° í늰 ì€ë ë륌 ì€í ê°ë¥ ìíë¡ íìí íì ìì©ì ê°ìí ê°ì ì²ëŠ¬êž°ììì ë€ë¥ž ì€í ê°ë¥í ì€ë ë륌 ì€íí©ëë€.
ììœ
- ì€ë ëë CPU ì¬ì©ì Ʞ볞 ëšì륌 ëíëŽë©° ëìŒí íë¡ìžì€ì ìíë ì€ë ëë ìœë ë° ë°ìŽí°ë¥Œ í¬íšíì¬ ë§ì íë¡ìžì€ ììì ê³µì íë€.
- ë€ì€ ì€ë ë ìì© íë¡ê·žëšìë (1) ìëµì±, (2) ìì ê³µì , (3) 겜ì ì±, (4) íì¥ì±ìŽëŒë 4ê°ì§ 죌ì ìŽì ìŽ ìë€.
- ì¬ë¬ ì€ë ëê° ì§í ì€ìž ê²œì° ë³íì±(Concurrency)ìŽ ì¡Žì¬íë ë°ë©Žì ì¬ë¬ ì€ë ëê° ëìì ì§í ì€ìž ê²œì° ë³ë ¬ì±(Parallelism)ìŽ ì¡Žì¬íë€. ëšìŒ CPUê° ìë ìì€í ììë ì€ë¡ì§ ë³íì±(Concurrency)ë§ ê°ë¥íê³ , ë³ë ¬ì±(Parallelism)ì ì¬ë¬ CPU륌 ì ê³µíë ë€ì€ ìœìŽ ìì€í ìŽ íìíë€.
- ë€ì€ ì€ë ë ìì© íë¡ê·žëšì ì€ê³íë ë° ëª ê°ì§ ëì 곌ì ê° ìë€. ìì ë¶í ë° ê· í ì¡°ì , ìë¡ ë€ë¥ž ì€ë ë ê°ì ë°ìŽí° ë¶í ë° ë°ìŽí° ì¢ ìì± ìë³ìŽ í¬íšëë€. ë§ì§ë§ìŒë¡, ë€ì€ ì€ë ë íë¡ê·žëšì í ì€íž ë° ëë²ê¹ ì í¹í ìŽë €ììŽ ìë€.
- ì¬ì©ì ìì© íë¡ê·žëšì ì¬ì©ì ìì€ ì€ë ë륌 ìì±íë©°, ìŽ ì€ë ëë ê¶ê·¹ì ìŒë¡ CPUìì ì€íëëë¡ ì»€ë ì€ë ëì ë§€íëìŽìŒ íë€. ë€ëìŒ ëªšëžì ë§ì ì¬ì©ì ìì€ ì€ë ë륌 íëì 컀ë ì€ë ëì ë§€ííë€. ë€ë¥ž ì ê·Œë²ìŒë¡ë ìŒëìŒ ë° ë€ëë€ ëªšëžìŽ ìë€.
- ì€ë ëë ë¹ëêž° ëë ì§ì° ì·šì륌 ì¬ì©íì¬ ì¢ ë£ë ì ìë€. ë¹ëêž° ì·šìë ì€ë ëê° ì ë°ìŽížë¥Œ ìííë ì€ìŽëŒë ì€ë ë륌 ìŠì ì€ì§íë€. ì§ì° ì·šìë ì€ë ëì ì¢ ë£íŽìŒ íë€ê³ íµì§íì§ë§ ì€ë ëë ì§ì ì ì°íê² ì¢ ë£ëë€. ëë¶ë¶ì ê²œì° ë¹ëêž° ì¢ ë£ë³Žë€ ì§ì° ì·šìê° ì ížëë€.