ð©ð» ë©í° íë¡ìžì€ vs ë©í° ì€ë ë ë¹êµ ð¯ ìì ìŽì 늬
ë©í° íë¡ìžì€ì ë©í° ì€ë ëë í ìŽí늬ìŒìŽì ì ëí ì²ëŠ¬ë°©ì ìŽëŒê³ 볎멎 ëë€. ëšìí íë¡ê·žëšì ì¬ë¬ê° ëìëë ê²ìŽ ë©í° íë¡ìžì€ê° ìëëŒ ìŽ ëì ìžì ìŽëëì ìŽë€ ë°©ììŒë¡ ì²ëŠ¬íëëì ë°ëŒ ë€ë¥ž ê²ìŒë¡ ìŽíŽíŽìŒ íë€.
ìŽëŠìŒë¡ ì ì¶í ì ìë¯ìŽ ë©í° íë¡ìžì€ì ë©í° ì€ë ëë ì¬ë¬ê°ì íë¡ìžì€, ì€ë ëê° ëìíë ê²ì ìŒ ì»«ëë€. ëšìŒìŽ ìë ë€ì€ìŒë¡ ëìê°ìŒë¡ìš ì±ë¥ í¥ì ë± ì¬ë¬ê°ì§ íšê³Œë¥Œ ì»ì ì ìë€. íì§ë§ ëí ìŽë¡ ìžíŽ ë°ìëë ë¶ê°ì ìž ë¬žì ì ë ë°ìíê² ëë€. ì§êž ë¶í° ìŽì ëíŽ ììží ìì볎ì
Multi Process
ë©í° íë¡ìžì€ë ìŽì첎ì ìì íëì ìì© íë¡ê·žëšì ëíŽ ëìì ì¬ë¬ ê°ì íë¡ìžì€ë¥Œ ì€íí ì ìê² íë êž°ì ì ë§íë€. ë³Žíµ íëì íë¡ê·žëš ì€íì ëíŽ íëì íë¡ìžì€ê° ë©ëªšëŠ¬ì ìì±ëì§ë§, ë¶ê°ì ìž êž°ë¥ì ìíŽ ì¬ë¬ê°ì íë¡ìžì€ë¥Œ ìì±íë ê²ìŽë€.
ë©í° íë¡ìžì€ vs ë©í° íë¡ìžì
íë¡ìžì€(process)ë íë¡ê·žëšì ì€í ìí륌 ë§íê³ , íë¡ìžì(processer)ë CPU ìœìŽë¥Œ ìŒì»«ëë€. ëìŽ ëšìŽê° ì ì¬íŽì êµì¥í íŒëí ì ììí ë°, ìŽìšë ëìŽ ì믞íëë°ë ìì í ë€ë¥Žë€ê³ 볎멎 ëë€.
ë°ëŒì ë©í° íë¡ìžì€ë íëì íë¡ê·žëšìì ì¬ë¬ ê°ì íë¡ìžì€ë¥Œ ì€ííë ê²ì ì믞íê³ , ë©í° íë¡ìžìë ì¬ë¬ ê°ì CPU ìœìŽê° íëì ìì€í ìì ëìì ì€íëë ê²ì ì믞íë€.
ë©í° íë¡ìžì€ ëŽë¶ë¥Œ 볎멎, íëì ë¶ëªš íë¡ìžì€ê° ì¬ë¬ ê°ì ìì íë¡ìžì€ë¥Œ ìì±íšìŒë¡ì ë€ì€ íë¡ìžì€ë¥Œ 구ì±íë 구조ìŽë€. í íë¡ìžì€ë ì€íëë ëì€ íë¡ìžì€ ìì± ìì€í ìœì íµíŽ ìë¡ìŽ íë¡ìžì€ë€ì ìì±í ì ìëë°, ë€ë¥ž íë¡ìžì€ë¥Œ ìì±íë íë¡ìžì€ë¥Œ ë¶ëªš íë¡ìžì€(Parent Process)ëŒ íê³ , ë€ë¥ž íë¡ìžì€ì ìíŽ ìì±ë íë¡ìžì€ë¥Œ ìì íë¡ìžì€(Child Process)ëŒ íë€.
ë¶ëªš íë¡ìžì€ì ìì íë¡ìžì€ë ê°ê° ê³ ì í PID(Process ID)륌 ê°ì§ê³ ìë€. ë¶ëªš íë¡ìžì€ë ìì íë¡ìžì€ì PID륌 ìê³ ììŒë©°, ìŽë¥Œ íµíŽ ìì íë¡ìžì€ë¥Œ ì ìŽí ì ìë€. ëí, ìì íë¡ìžì€ë ë¶ëªš íë¡ìžì€ì PIDì PPID(Parent Process ID)륌 ìê³ ììŽ, ìŽë¥Œ íµíŽ ë¶ëªš íë¡ìžì€ìì íµì ìŽ ê°ë¥íë€.
ë€ë§, íµì ìŽ ê°ë¥í ë¿ìŽì§, ë¶ëªš íë¡ìžì€ì ìì íë¡ìžì€ë ìì°í ìë¡ ë€ë¥ž íë¡ìžì€ë¡ ë 늜ì ìŒë¡ ì€íëë©°, ë 늜ì ìž ë©ëªšëŠ¬ ê³µê°ì ê°ì§ê³ ììŽ ìë¡ ë€ë¥ž ìì ì ìííë€. ëíì ìž ìë¡ ì¹ ëžëŒì°ì ì ìëš í(Tab) ìŽë ì ì°œì ë€ ì ìë€. ê° ëžëŒì°ì íì ê°ì ëžëŒì°ì íë¡ê·žëš ì€íìŽì§ë§, ê°êž° ë€ë¥ž ì¬ìŽíž ì€íì ííêž° ë묞ìŽë€.
ìŽë¬í ëžëŒì°ì ë©í° íë¡ìžì€ ì늬륌 íìžíêž° ìí ê°ëší ì€íë ê°ë¥íë€. ì¬ë¬ê°ì íì ëìŽë€, íëì íìì F12ë¡ ê°ë°ì ë구륌 ìŽê³ ìœì íì while(1) {} 묎í 룚í ìœë륌 ì€í ììŒë³Žì. ê·žë¬ë©Ž íŽë¹ íììë íŽëŠë ìëê³ ëš¹íµìŽ ëë íìì 겜íí ì ìë€.
íì§ë§ ë€ë¥ž íìë ì ìì ìŒë¡ ëžëŒì°ì§ìŽ ê°ë¥íë€. ìŽë í ë§ë€ ë€ë¥ž íë¡ìžì€ë¡ ëìíêž° ë묞ìŽë€.
ë©í° íë¡ìžì€ì ì¥ì
1. íë¡ê·žëš ìì ì±
ë©í° íë¡ìžì€ë ê° íë¡ìžì€ê° ë 늜ì ìž ë©ëªšëŠ¬ ê³µê°ì ê°ì§ë¯ë¡, í íë¡ìžì€ê° ë¹ì ìì ìŒë¡ ì¢ ë£ëìŽë ë€ë¥ž íë¡ìžì€ì ìí¥ì ì£Œì§ ìëë€. ê·žëì íë¡ê·žëš ì 첎ì ìì ì±ì í볎í ì ìë€ë ì¥ì ìŽ ìë€.
ì륌 ë€ìë©Ž í¬ë¡¬ ëžëŒì°ì ìì ì¬ë¬ê°ì íì ëì°ê³ ì¬ë¬ê³³ì ì¹ì¬ìŽížë¥Œ ë°©ë¬žíŽ ìë¹ì€ë¥Œ ìŽì©íë€ê³ íì. ìŽë ìŽë í íì ì¹ì¬ìŽížìì 묎ìžê° ì못ëìŽ ëš¹íµìŽ ëìë€.
ì죌 ì¬ê°í ì€ë¥ê° ìë ìŽì, ë¹ì¥ ê·ž ëžëŒì°ì íì ì¹ì¬ìŽížë ìŽì©ì 못íê² ì§ë§, ë€ë¥ž íì ë³ ë¬žì ììŽ ìŽì©ìŽ ê°ë¥í ê²ìŽë€. ìŽë¬í ìŽì ë ìì íë¡ìžì€ê° ì¬ë¬ê° ìì±ëìŽ ë©ëªšëŠ¬ì ë³ëë¡ êŽëŠ¬ëêž° ë묞ìŽë€.
2. íë¡ê·žëš ë³ë ¬ì±
ë©í° íë¡ìžì€ì ì¬ë¬ê°ì CPU ìœìŽë¥Œ íì©íì¬ ëì ìëì§ë¥Œ í©ì³, ë€ì€ CPU ìì€í ìì ê° íë¡ìžì€ë¥Œ ë³ë ¬ì ìŒë¡ ì€ííì¬ ì±ë¥ì í¥ì ìí¬ ì ìë€. ì륌 ë€ìŽ ìŽë¯žì§ ì²ëŠ¬ë ë¹ëì€ ìžìœë©ê³Œ ê°ì ìì ì ì¬ë¬ ê°ì ìœìŽë CPUì ë¶ì°ììŒ ë¹ ë¥Žê² ì²ëŠ¬í ì ìë€.
ë€ë§, ìŽ ë¶ë¶ì ë©í° íë¡ìžì€ ë§ì ì¥ì ìŽëŒêž° 볎ëš, ë©í° íë¡ìžì€ì ë©í° ì€ë ë ëì ì¥ì ìŽ ì³ë€. ê·žëŠ¬ê³ ë©í° ì€ë ëë¡ êµ¬ì±íë ê²ìŽ ë©í° íë¡ìžì€ë¡ 구ì±íë ê²ë³Žë€ íšì¬ íšìšì ìŽê³ ë¹ ë¥Žêž° ë묞ì, ë©í° íë¡ìžì€ë¡ ì±ë¥ì ì¬ëŠ¬ë íìë ê±°ì ìë€ê³ 볎멎 ëë€. ìŽì ëíŽì ë€ì ë©í° ì€ë ë íížìì ë€ì ë€ë£¬ë€.
3. ìì€í íì¥ì±
ë©í° íë¡ìžì€ë ê° íë¡ìžì€ê° ë 늜ì ìŽë¯ë¡, ìë¡ìŽ êž°ë¥ìŽë 몚ëì ì¶ê°íê±°ë ìì í ë ë€ë¥ž íë¡ìžì€ì ìí¥ì ì£Œì§ ìëë€. ê·žëì ìì€í ì ê·ëªšë¥Œ ìœê² íì¥í ì ìë€.
ìŽ ë¶ë¶ì ëíŽìë 컎íší°ì ìíížìšìŽë¡ ìì륌 ëë ê²ë³Žë€ ë€ížìí¬ì ìë²(server)ë¡ ëë ê²ìŽ ì ì íêž° ë묞ì ì ì ë¶ì° ìë²ì ëíŽì ë§íŽë³Žê² ë€. ëê·ëªš ì¹ ìë¹ì€ììë ìë§ì ìì²ì ëìì ì²ëŠ¬íêž° ìíŽ ì¬ë¬ëì ìë²ë¥Œ ëê³ ë¡ë ë°žë°ì(Load Balancer)ì ê°ì ì¥ë¹ë¥Œ ì¬ì©íì¬ íŽëŒìŽìžíž ìì² ížëíœì ë¶ì° ìíšë€. ìŽë ì¬ë¬ëì ìë²ë 컎íší°ë¥Œ ì¬ë¬ê°ë¥Œ ë§íë ê²ìŒ ìë ìê³ , íëì ì±ë¥ ì¢ì 컎íší°ì ì¬ë¬ê°ì ìë² íë¡ìžì€ë¥Œ ëë ê²ì ë§íêž°ë íë€. ë©í° íë¡ìžì€ì ìí©ì íììŽë€.
ìë² íë¡ê·žëë°ì íŽë³ž ë°±ìë ê°ë°ìë¶ë€ì ìë² íŽë¬ì€í°(cluster)륌 구ì±íŽë³ž ì ìŽ ìì ê²ìŽë€. íëì 컎íší°ì ì¬ë¬ê°ì ìë² íë¡ìžì€ë¥Œ ëììŒë¡ìš ìì²ì ë¶ì°ìí€ë ê²ìŽë€. Node.js ì§ììì ëíì ìŒë¡ PM2 ê° ìë€.
ìŽë ê² ë©í° íë¡ìžì€ë¥Œ ì¬ì©íì¬ ì¬ë¬ ëì ìë²ì ìì²ì ë¶ì°ììŒ ì²ëŠ¬íšìŒë¡ìš, ìì€í ì ê·ëªšë¥Œ ìœê² íì¥í ì ììŒë©°, ë¶ê°ë¡ ìë²ì ì¥ì ë ë€ìŽíìì ìµìíí ì ìê² ëë ê²ìŽë€.
ë©í° íë¡ìžì€ì ëšì
1. Context Switching Overhead
ë©í° íì€í¹(multi tasking)ì 구ì±íëë° íµì¬ êž°ì ìž ì»ší ì€íž ì€ìì¹(context switching) 곌ì ìì ì±ë¥ ì íê° ì¬ ì ìë€. í¹íë íë¡ìžì€ë¥Œ 컚í ì€íž ì€ìì¹ íë©Ž, CPUë ë€ì íë¡ìžì€ì ì 볎륌 ë¶ë¬ì€êž° ìíŽ ë©ëªšëŠ¬ë¥Œ ê²ìíê³ , CPU ìºì ë©ëªšëŠ¬ë¥Œ ìŽêž°ííë©°, íë¡ìžì€ ìí륌 ì ì¥íê³ , ë¶ë¬ì¬ ë°ìŽí°ë¥Œ ì€ë¹íŽìŒ íêž° ë묞ì, ìŽë¡ ìží ë¹ë²í Context Switching ìì ìŒë¡ ìžíŽ ë¹ì© ì€ë²í€ëê° ë°ìí ì ìê² ëë€. ë°ë©Ž ì€ë ë륌 컚í ì€íž ì€ìì¹íë©Ž íë¡ìžì€ ì€ìì¹ ë³Žë€ ê°ë²Œì íšì¬ ë¹ ë¥Žê³ ì¢ë€.
ë°ëŒì, ë©í° íë¡ìžì€ í겜ììë Context Switching Overhead륌 ìµìííë ë°©ë²ìŽ ì€ìíë€. ìŽë¥Œ ìíŽì íë¡ìžì€ ì륌 ì ì íê² ì ì§íê±°ë, I/O ë°ìŽë ìì ìŽ ë§ì íë¡ìžì€ì CPU ë°ìŽë ìì ìŽ ë§ì íë¡ìžì€ë¥Œ ë¶ëŠ¬íì¬ êŽëŠ¬íê³ , CPU ìºì륌 íšìšì ìŒë¡ íì©íë ë±ì ë°©ë²ì ê³ ë €íŽ ëŽìŒ íë€.
2. ìì ê³µì ë¹íšìšì±
ë©í° íë¡ìžì€ë ê° íë¡ìžì€ê° ë 늜ì ìž ë©ëªšëŠ¬ ê³µê°ì ê°ì§ë¯ë¡, 결곌ì ìŒë¡ ë©ëªšëŠ¬ ì¬ì©ëìŽ ìŠê°íê² ëë€.
ë§ìŒ ê° íë¡ìžì€ê°ì ìì ê³µì ê° íìí ê²œì° íë¡ìžì€ ì¬ìŽì ìŽë µê³ ë³µì¡í íµì êž°ë²ìž IPC(Inter-Process Commnuication)ì ì¬ì©íì¬ìŒ íë€.
IPCë ìŽì첎ì ììì ì€í ì€ìž íë¡ìžì€ ê°ì ì 볎륌 ì£Œê³ ë°ë ë©ì»€ëìŠì ë§íë€. ìŽë¥Œ ìíŽ íìŽí, ììŒ, ë©ìžì§ í ë± ë€ìí ë°©ë²ìŽ ì¬ì©ëë€. ê·žë°ë° IPC ìì²Žë¡ ì€ë²í€ëê° ë°ìíë€. ì륌 ë€ìŽ, íìŽíë ììŒê³Œ ê°ì IPC êž°ë²ì ë°ìŽí°ë¥Œ ë³µì¬íê±°ë ë²íŒë§íë 곌ì ìì ì±ë¥ ì íê° ë°ìí ì ìêž° ë묞ìŽë€. ëí ìœëì ë³µì¡ë륌 ìŠê°ìíšë€.
Multi Thread
ì€ë ëë íëì íë¡ìžì€ ëŽì ìë ì€í íëŠìŽë€. ê·žëŠ¬ê³ ë©í° ì€ë ëë íëì íë¡ìžì€ ìì ì¬ë¬ê°ì ì€ë ëê° ìë ê²ì ë§íë€. ë°ëŒì íëì íë¡ê·žëšìì ëê°ì§ ìŽìì ëìì ëìì ì²ëŠ¬íëë¡ íë íìê° ê°ë¥íŽì§ë€.
ì¹ ìë²ë ëíì ìž ë©í° ì€ë ë ìì© íë¡ê·žëšìŽë€. ì¬ì©ìê° ìë² ë°ìŽí°ë² ìŽì€ì ìë£ë¥Œ ìì²íë ëì ëžëŒì°ì ì ë€ë¥ž êž°ë¥ì ìŽì©í ì ìë ìŽì ë ë°ë¡ ë©í° ì€ë ë êž°ë¥ ëë¶ìž ê²ìŽë€. ìŠ, íëì ì€ë ëê° ì§ì°ëëëŒë, ë€ë¥ž ì€ë ëë ìì ì ì§ìí ì ìê² ëë€.
ë³Žë€ ë©í° íë¡ìžì€ìì ì°šìŽì ì ë¶ê°ìí€êž° ìíŽ, ë©í° íë¡ìžì€ë¥Œ ì€ëª í ë ìì륌 ë€ìë ì¹ ëžëŒì°ì 륌 ë€ì ë€ìŽë³Žê² ë€. ë©í° íë¡ìžì€ë ì¹ ëžëŒì°ì ììì ì¬ë¬ íìŽë ì¬ë¬ ì°œìŽëŒê³ ë§íìë€. ëì ë©í° ì€ë ëë ì¹ ëžëŒì°ì ì ëšìŒ í ëë ì°œ ëŽìì ëžëŒì°ì ìŽë²€íž 룚í, ë€ížìí¬ ì²ëŠ¬, I/O ë° êž°í ìì ì êŽëŠ¬íê³ ì²ëŠ¬íëë° ì¬ì©ëë€ê³ 볎멎ëë€.
ë©í° ì€ë ëì ì¥ì
ìëì°, 늬ë ì€ ë± ë§ì ìŽì첎ì ë€ìŽ ë©í° íë¡ìžì±ì ì§ìíê³ ìì§ë§ ë©í° ì€ë ë©ì Ʞ볞ìŒë¡ íê³ ìë€. ì ë©í° íë¡ìžì€ ë³Žë€ ë©í° ì€ë ëë¡ íë¡ê·žëšì ë늬ë ê²ìŽ ì 늬íì§ ê·ž ìŽì ì ëíŽ ìì볎ì. (ìŽë ì€ë ë ì첎ì ì¥ì ìŽêž°ë íë€)
1. ì€ë ëë íë¡ìžì€ë³Žë€ ê°ë²Œì
ìŒëš ì€ë ëë íë¡ìžì€ ë³Žë€ ì©ëìŽ ê°ë³ë€. ê·žë ê·žëŽê² ì€ë ëë íë¡ìžì€ ëŽìì ìì±ëêž° ë묞ì ì€ë ëì ì€í í겜ì ì€ì íë ìì ìŽ ë§€ì° ê°ëšíì¬ ìì± ë° ì¢ ë£ê° ë¹ ë¥Žë€. ëí ì€ë ëë íë¡ìžì€ì ë¬ëŠ¬, ìœë, ë°ìŽí°, ì€í ììì ì ìží ëëšžì§ ììì ìë¡ ê³µì íêž° ë묞ì Ʞ볞ì ìŒë¡ ëŽì¥ëìŽ ìë ë°ìŽí° ì©ëìŽ íë¡ìžì€ë³Žë€ ë¹ì°í ìë€. ê·žëì ì€ë ë륌 ìì±íê³ ì ê±°í ë, íë¡ìžì€ ëŽë¶ì ììë§ì êŽëŠ¬íë©Ž ëêž° ë묞ì íë¡ìžì€ ìì±, ì ê±° ë³Žë€ íšì¬ ë¹ ë¥ž ê²ìŽë€.
2. ììì íšìšì±
ë©í° ì€ë ëë íëì íë¡ìžì€ ëŽìì ì¬ë¬ ê°ì ì€ë ë륌 ìì±ëêž° ë묞ì, heap ìì곌 ê°ì ê³µì ë©ëªšëŠ¬ì ëíŽ ì€ë ë ê°ì ììì ê³µì ê° ê°ë¥íë€. ìŽë¥Œ íµíŽ, íë¡ìžì€ ê° íµì (IPC)ì ì¬ì©íì§ ìê³ ë ë°ìŽí°ë¥Œ ê³µì í ì ìêž° ë묞ì, ììì íšìšì ìž íì©ìŽ ê°ë¥íŽ ìì€í ìì ìëªšê° ì€ìŽë ë€.
3. Context Switching ë¹ì© ê°ì
ì€ë ëìë 컚í ì€íž ì€ìì¹ ì€ë²í€ëê° ì¡Žì¬íë€. íì§ë§ ìëì ìŒë¡ íë¡ìžì€ 컚í ì€íž ì€ìì¹ ì€ë²í€ëë³Žë€ íšì¬ ë®ì ë¹ì©ìŽ ë®ë€ë ì¥ì ìŽ ìë€.
íë¡ìžì€ 컚í ì€íž ì€ìì¹ ë¹ì©ì ì€ìì¹í ëë§ë€ CPU ìºìì ìë ëŽì©ì 몚ë ìŽêž°ííê³ , ìë¡ìŽ íë¡ìžì€ ì 볎륌 CPU ìºìì ì ì¬íŽìŒ íë¯ë¡ ëì ë¹ì©ìŽ ë ë€. ë°ë©Ž, ì€ë ë 컚í ì€íž ì€ìì¹ ë¹ì©ì ì€ìì¹í ë ì€ë ë ê°ì ê³µì íë ììì ì ìží ì€ë ë ì 볎(stack, register)ë§ì êµì²Žíë©Ž ëë¯ë¡ íë¡ìžì€ 컚í ì€íž ì€ìì¹ ë¹ì©ë³Žë€ ìëì ìŒë¡ ë®ì ê²ìŽë€.
4. ìëµ ìê° ëšì¶
ìì ë©í° ì€ë ëì ì¥ì ì ì¢ í©íŽë³Žìë©Ž, ë©í° ì€ë ëë ì€ë ë ê°ì íµì ìŽë ìì ê³µì ê° ëì± ì©ìŽíë©°, íë¡ìžì€ ë³Žë€ ê°ë²Œì 컚í ì€íž ì€ìì¹ ì€ë²í€ëë ìë€. ë°ëŒì ë©í° íë¡ìžì€ ë³Žë€ ìëµ ìê°ìŽ ë¹ ë¥Žë€.
ì륌 ë€ìŽ, ì¹ ìë²ìì íŽëŒìŽìžíž ìì²ì ì²ëŠ¬íë 겜ì°, ë©í° íë¡ìžì€ ë°©ìììë ê° ìì²ë§ë€ íë¡ìžì€ë¥Œ ìì±íì¬ ì²ëŠ¬íŽìŒ íë¯ë¡, ì€ë²í€ëê° í¬ì§ë§, ë©í° ì€ë ë ë°©ìììë ì¬ë¬ ê°ì ì€ë ëê° íëì íë¡ìžì€ ëŽìì ìì²ì ì²ëŠ¬í ì ììŒë¯ë¡, ì€ë²í€ëê° ê°ìíŽ ëì± ë¹ ë¥ž ìëµ ìê°ì 볎ì¥í ì ìë ê²ìŽë€.
ìŽë¬í ìŽì ë¡, ë©í° íë¡ìžì í겜ìì ë©í° ì€ë ë륌 ì¬ì©íì¬ ìì ì ì²ëŠ¬íë ê²ìŽ ë©í° íë¡ìžì€ë¥Œ ì¬ì©íë ê²ë³Žë€ ë íšìšì ìŽë€ëŒê³ ë§í ì ìë€.
ë©í° ì€ë ëì ëšì
1. ìì ì± ë¬žì
ë©í° íë¡ìžì€ 몚ëžììë ê° íë¡ìžì€ê° ë 늜ì ìŒë¡ ëìíë¯ë¡ íëì íë¡ìžì€ìì 묞ì ê° ë°ìíŽë ë€ë¥ž íë¡ìžì€ë€ì ìí¥ì ë°ì§ ìêž° ë묞ì íë¡ê·žëšìŽ ì£œì§ ìê³ ê³ì ëìí ì ìë€. ê·žë¬ë ë©í° ì€ë ë 몚ëžììë Ʞ볞ì ìŒë¡ íëì ì€ë ëìì 묞ì ê° ë°ìíë©Ž ë€ë¥ž ì€ë ëë€ë ìí¥ì ë°ì ì 첎 íë¡ê·žëšìŽ ì¢ ë£ë ì ìë€.
ë¬Œë¡ ìŽë íë¡ê·žëëšžì ìëì ë°ëŒ 극복í ì ê° ìë€. ì륌ë€ìŽ ì€ë ëì ìë¬ê° ë°ìí ê²œì° ìŽì ëí ì ì í ììž ì²ëŠ¬ë¥Œ ì íŽëëë€ëì§, ìë¬ ë°ì ì ìë¡ìŽ ì€ë ë륌 ìì±íê±°ë ì€ë ë í(Thread Pool)ìì ìì¬ ì€ë ë륌 ê°ì žì€ëì§ íì¬ íë¡ê·žëš ì¢ ë£ë¥Œ ë°©ì§í ì ìë€. ë€ë§, ìŽë ìë¡ìŽ ì€ë ë ìì±ìŽë ëê³ ìë ì€ë ë ì²ëŠ¬ì ì¶ê° ë¹ì©ìŽ ë°ìíê² ëë€.
2. ëêž°íë¡ ìží ì±ë¥ ì í
ë©í° ì€ë ë 몚ëžì ì¬ë¬ ê°ì ì€ë ëê° ê³µì ììì ëìì ì ê·Œí ì ìêž° ë묞ì, ëêž°í 묞ì ê° ë°ìí ì ìë€. ì륌ë€ìŽ ì¬ë¬ ì€ë ëê° ëìì í ììì ë³ê²œíŽ ë²ëŠ°ë€ë©Ž ìëëì§ ìì ìë±í ê°ì ìœìŽ ìë¹ì€ì ì¹ëª ì ìž ë²ê·žê° ìêžžìë ìë€. ë°ëŒì ì€ë ë ê° ëêž°í(syncronized)ë ë°ìŽí° ì ê·Œì ì ìŽíêž° ìí íìì ìž êž°ì ìŽë€.
ëêž°í ìì ì ì¬ë¬ ì€ë ëë€ìŽ ììì ëí ì ê·Œì ìì°šì ìŒë¡ íµì íë ê²ìŽë€. ê·žë¬ë©Ž ëì ì ê·ŒìŒë¡ ìží ëì ìì 곌 ê°ì íìì ìŒìŽëì§ ìê² ëë€. ê·žë¬ë ëêž°í ìì ì ì¬ë¬ ì€ë ë ì ê·Œì ì ííë ê²ìŽêž° ë묞ì ë³ëª© íììŽ ìŒìŽë ì±ë¥ìŽ ì íë ê°ë¥ì±ìŽ ëë€ë ëšì ìŽ ìë€.
ìŽë¥Œ íŽê²°íêž° ìíŽ ìê³ ìì(Critical Section)ì ëíì¬ ë®€í ì€(mutex), ëë ìžë§í¬ìŽ(Semaphore) ë°©ìì íì©íë€.
ìê³ ìì(Critical Section)
- ë©í° ì€ë ë íë¡ê·žëë°ìì ìê³ ììì ê³µì ììì ì ê·Œíë ìœë ììì ë§íë€. ëíì ìŒë¡ ì ì ë³ìë heap ë©ëªšëŠ¬ ììì ë€ ì ìê² ë€.
뮀í ì€(Mutex)
- ê³µì ììì ëí ì ê·Œì ì ìŽíêž° ìí ìíž ë°°ì êž°ë² ì€ íëë¡, ìê³ ììì ì§ì íêž° ì ì ëœ(lock)ì íëíê³ , ìê³ ììì ë¹ ì žëì¬ ë ëœì íŽì íì¬ ë€ë¥ž ì€ë ëë€ìŽ ì ê·Œí ì ìëë¡ íë€. íë§ëë¡ ì€ì§ 1ê°ì ì€ë ëë§ìŽ ê³µì ììì ì ê·Œí ì ìëë¡ ì ìŽíë êž°ë²ìŽë€.
ìžë§í¬ìŽ(Semaphore)
- ìžë§í¬ìŽë ëìì ì ê·Œ ê°ë¥í ì€ë ëì ê°ì륌 ì§ì í ì ìë€. ìžë§í¬ìŽ ê°ìŽ 1ìŽë©Ž 뮀í ì€ì ëìŒí ìí ì íë©°, ê°ìŽ 2 ìŽììŽë©Ž ëìì ì ê·Œ ê°ë¥í ì€ë ëì ì륌 ì ìŽí ì ìë€. ì€ë ëê° ìê³ ììì ì§ì íêž° ì ì ìžë§í¬ìŽ ê°ì íìžíê³ , ê°ìŽ íì©ë ë²ì ëŽì ìì ëë§ ëœì íëí ì ìë íììŽë€. íë§ëë¡ ë®€í ì€ ìì íží ìŽëŒê³ 볎멎 ëë€.
3. ë°ëëœ (êµì°© ìí)
Deadlock ìŽë, ë€ìì íë¡ìžì€ë ì€ë ëê° ìë¡ ììì ì ì íê³ , ë€ë¥ž íë¡ìžì€ë ì€ë ëê° ì ì í ììì êž°ë€ëŠ¬ë ìí©ìì ë°ìíë êµì°© ìí륌 ë§íë€. ì¬ë¬ ê°ì ì€ë ëê° ìë¡ ëêž°íë©Žì 묎íì êž°ë€ëŠ¬ê²ëë 묎í 룚íì ê°ì ìŠììŽëŒê³ 볎멎ëë€.
ì륌ë€ìŽ, ì€ë ë 1 ì ìì Aì ì ì íê³ ìë ìíìì ìì Bê° íìí ìí©ìŽë€. ê·žëŠ¬ê³ ì€ë ë 2 ë ìì B륌 ì ì íê³ ìë ìíìì ìì AìŽ íìí ìí©ìŽë€. íì§ë§ ì€ë ë 1ì ìì Bê° íìí ìí©ìì ìì Aì ë¹ë €ì€ ì ìë ìí©ìŽ ìëê³ , ì€ë ë 2ëí ìì AìŽ íìí ìíìì ìì B륌 ë¹ë €ì€ ì ìë ìí©ìž ê²ìŽë€.
ìŽì²ëŒ ë€ìì ì°ë ëê° ê°ì lockì ëìì, ë€ë¥ž ëª ë ¹ì ìíŽ íëíë € í ë ìë¡ ì ë ë¶ê°ë¥í ìŒì ê³ìì ìŒë¡ êž°ë€ëŠ¬ë ìí©ì ìŽìŒêž° íë€.
ìŽë¬í íìì ì€ë ëì í¹ì§ìž ê³µì ììì ëí ëì ììžì€ë¡ ìží 묞ì ë¡, ìŽë¥Œ ë°©ì§íêž° ìí ìížë°°ì (Mutual Exclusion), ì ì ì ëêž°(Hold and Wait), ë¹ì ì (No Preemption), ìí ëêž°(Circular Wait) ë±ì ìê³ ëŠ¬ìŠì íµíŽ 극복íŽìŒ íë€.
ë€ë§, ë°ëëœì ë©í° ì€ë ëë§ì ëšì ìŽëŒêž° 볎ë€ë ë©í° íë¡ìžì€ì ì€ë ë 몚ëžì ê³µíµë 묞ì ì ìŽëŒê³ ë§íë ê²ìŽ ì³ë€. ìëíë©Ž íë¡ìžì€ ëŒëŠ¬ë Ʞ볞ì ìŒë¡ ë 늜ì ìž ë©ëªšëŠ¬ ê³µê°ìŽì§ë§ IPC륌 íµíŽ ê³µì ììì ì¬ì©í ì ìêž° ë묞ì ë©í° ì€ë ëì ëê°ìŽ êµì°© ìíì ë¹ ì§ ì ìêž° ë묞ìŽë€.
4. ê·žëë Context Switching Overhead
ìì ë©í° íë¡ìžì€ë³Žë€ ë©í° ì€ë ëì 컚í ì€íž ì€ìì¹ ì€ë²í€ëê° ìì ì±ë¥ì ì 늬íë€ëŒê³ ì€ëª íìì§ë§, ê·žëë 컚í ì€íž ì€ìì¹ ì€ë²í€ë ë¹ì© ì첎륌 묎ìí ìë ìë€. í¹íë ì€ë ë ìê° ë§ìŒë©Ž ë§ì ìë¡ ê·žë§íŒ 컚í ì€íž ì€ìì¹ìŽ ë§ìŽ ë°ìëê² ëê³ ë¹ì°í ìŽë ì±ë¥ ì íë¡ ìŽìŽì§ë€.
ìŽ ë¶ë¶ì 'ì€ë ë륌 ë§ìŽ ìžìë¡ íì ì±ë¥ìŽ ì¢ìì§ê¹?' ëŒë 묌ììŒë¡ ëì§ ì ìë€. ë³Žíµ ì¬ëë€ìŽ ìê°íêž°ìë ì€ë ëê° ë§ìŒë©Ž ë§ì ìë¡ ê·žë§íŒ ëì ì²ëŠ¬ìê° ëìŽë ë¹ì°í ì€ë ëê° ë§ìŒë©Ž 묎조걎 ì¢ë€ê³ ìŽìŒêž°í ê²ìŽë€. íì§ë§ '컚í ì€íž ì€ìì¹ ì€ë² íë'ëŒë ê°ë ì ìê³ ìë ê°ë°ììž ì°ëŠ¬ë€ì 'ê³Œì° êŒ ê·žëŽê¹?' ëŒë ì묞ì ëì žìŒ íë€.
ìŽ ë¶ë¶ì ì€ë ë륌 ê²íêž°ë¡ë§ ë°°ìŽ ì§ìì륌 걞ë¬ëŽêž° ìíŽ êž°ì ë©Žì ìì ê°ë ë±ì¥íë ê³ ìì€ì ì§ë¬žìŽêž°ë íë€. ìŽì ëí ììží ëŽì©ì ìë í¬ì€í ì ì°žê³ íêžž ë°ëë€.
-------------------------------------- ë§í¬ ëì€ì ì¶ê° --------------------------
5. ëë²ê¹ ìŽ ìŽë €ì
ë©í° ì€ë ë륌 ì¬ì©íë©Ž, ì¬ë¬ ê°ì ì€ë ëê° ëìì ì€íëêž° ë묞ì, ê° ì€ë ëì ëìì ì¶ì íêž° ìŽë €ìž ì ìë€. ì륌ë€ìŽ ìœë륌 ëë²ê¹ íë ëì€ì ë€ë¥ž ì€ë ëê° ì€íëìŽ ìêž°ì¹ ìì ê²°ê³Œê° ë°ìí ì ìë€. ëí ìŽë€ ì€ë ëê° ìžì ìŽë€ ììì ì ê·Œíê³ , ìŽë€ ììë¡ ì€íëëì§ ë±ì íì íêž° ìŽë €ìž ì ìë€.
ë°ëŒì ì€ë ë ê°ì ìížìì©ê³Œ ëêž°í êž°ë²ì ì ìŽíŽíê³ , ëë²ê¹ ë구륌 ì ê·¹ì ìŒë¡ íì©íŽìŒ íë€.
6. ìŽì첎ì ì ì§ììŽ íì
ì€ëë ì ìëì°, 늬ë ì€, 맥 OSìì 몚ë Ʞ볞ì ìŒë¡ ë©í° ì€ë ë©ì Ʞ볞ì ìŒë¡ ì§ìíëë¡ ì€ê³ ëììŒë 묞ì ì ìŽëŒêž°ìë ìœê° ìŽíê° ìꞎ íë€. íì§ë§, 1980ë ëì SunOS3ì ê°ì ì€ëë ì ëì€ ìì€í ìë ì€ë ëê° ììê³ íë¡ìžì€ë§ ìë, ë©í° ì€ë ë©ì ì§ìíì§ ìë ìŽì 첎ì ê° ììêž° ë묞ì ë©í° ì€ë ëì ëšì ìŒë¡ ë£ìŽ 볎ìë€. (ê·žë§ ììŽë ëë€ ð )
# ì°žê³ ìë£
https://brunch.co.kr/@huewu/4
https://charlezz.medium.com/process%EC%99%80-thread-%EC%9D%B4%EC%95%BC%EA%B8%B0-5b96d0d43e37
https://eunjinii.tistory.com/41
https://jojozhuang.github.io/programming/java-concurrency-dead-lock/