λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Programming/C# & .NET

[ν”„λ‘œκ·Έλž˜λ°] ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ

ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ

ν”„λ‘œμ„ΈμŠ€(process)λž€ κ°„λ‹¨νžˆ λ§ν•΄μ„œ 'μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨'이닀. ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄ OSλ‘œλΆ€ν„° 싀행에 ν•„μš”ν•œ μžμ›(λ©”λͺ¨λ¦¬)λ₯Ό ν• λ‹Ήλ°›μ•„ ν”„λ‘œμ„ΈμŠ€κ°€ λœλ‹€.

 

ν”„λ‘œκ·Έλž¨

 

ν”„λ‘œμ„ΈμŠ€

 

ν”„λ‘œμ„ΈμŠ€λŠ” ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ 데이터와 λ©”λͺ¨λ¦¬ λ“±μ˜ μžμ› 그리고 μŠ€λ ˆλ“œλ‘œ κ΅¬μ„±λ˜μ–΄ 있으며, ν”„λ‘œμ„ΈμŠ€μ˜ μžμ›μ„ μ΄μš©ν•΄μ„œ μ‹€μ œλ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것이 λ°”λ‘œ μŠ€λ ˆλ“œμ΄λ‹€.

κ·Έλž˜μ„œ λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€μ—λŠ” μ΅œμ†Œν•œ ν•˜λ‚˜ μ΄μƒμ˜ μŠ€λ ˆλ“œκ°€ μ‘΄μž¬ν•˜λ©°, λ‘˜ μ΄μƒμ˜ μŠ€λ ˆλ“œλ₯Ό κ°€μ§„ ν”„λ‘œμ„ΈμŠ€λ₯Ό 'λ©€ν‹°μŠ€λ ˆλ“œ ν”„λ‘œμ„ΈμŠ€(multi-threaded process)'라고 ν•œλ‹€.

 

ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ κ°€μ§ˆ 수 μžˆλŠ” μŠ€λ ˆλ“œμ˜ κ°œμˆ˜λŠ” μ œν•œλ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ‚˜ μŠ€λ ˆλ“œκ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ”λ° κ°œλ³„μ μΈ λ©”λͺ¨λ¦¬ 곡간(ν˜ΈμΆœμŠ€νƒ)을 ν•„μš”λ‘œ ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬ ν•œκ³„μ— 따라 생성할 수 μžˆλŠ” μŠ€λ ˆλ“œμ˜ μˆ˜κ°€ κ²°μ •λœλ‹€. 

 

λ©€ν‹°νƒœμŠ€ν‚Ήκ³Ό λ©€ν‹°μŠ€λ ˆλ”©, 그리고 λ©€ν‹°ν”„λ‘œμ„Έμ‹±

λ©€ν‹°νƒœμŠ€ν‚Ή : μ—¬λŸ¬ 개의 ν”„λ‘œμ„ΈμŠ€κ°€λ₯Ό λ™μ‹œμ— μ‹€ν–‰μ‹œν‚¬ 수 μžˆλŠ” μ‹œμŠ€ν…œ

  • ν˜„μž¬ μš°λ¦¬κ°€ μ‚¬μš©ν•˜κ³  μžˆλŠ” μœˆλ„μš°λ‚˜ μœ λ‹‰μŠ€λ₯Ό ν¬ν•¨ν•œ λŒ€λΆ€λΆ„μ˜ OSλŠ” λ©€ν‹°νƒœμŠ€ν‚Ή(multi-tasking, λ‹€μ€‘μž‘μ—…)을 μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— μ—¬λŸ¬ 개의 ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— 싀행될 수 μžˆλ‹€.

λ©€ν‹°μŠ€λ ˆλ”© : ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ—¬λŸ¬ μ“°λ ˆλ“œκ°€ λ™μ‹œμ— μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것

  • CPU의 μ½”μ–΄κ°€ ν•œ λ²ˆμ— 단 ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ μˆ˜ν–‰ν•  수 μžˆμœΌλ―€λ‘œ, μ‹€μ œλ‘œ λ™μ‹œμ— μ²˜λ¦¬λ˜λŠ” μž‘μ—…μ˜ κ°œμˆ˜λŠ” μ½”μ–΄μ˜ κ°œμˆ˜μ™€ μΌμΉ˜ν•œλ‹€. κ·Έλ ‡μ§€λ§Œ μ²˜λ¦¬ν•΄μ•Όν•˜λŠ” μ“°λ ˆλ“œμ˜ μˆ˜λŠ” μ–Έμ œλŠ” μ½”μ–΄μ˜ κ°œμˆ˜λ³΄λ‹€ 훨씬 많기 λ•Œλ¬Έμ— 각 μ½”μ–΄κ°€ μ•„μ£Ό 짧은 μ‹œκ°„ λ™μ•ˆ μ—¬λŸ¬ μž‘μ—…μ„ λ²ˆκ°ˆμ•„ κ°€λ©΄ μˆ˜ν–‰ν•¨μœΌλ‘œμ¨ μ—¬λŸ¬ μž‘μ—…λ“€μ΄ λͺ¨λ‘ λ™μ‹œμ— μˆ˜ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ 보이게 ν•œλ‹€.

λ©€ν‹°ν”„λ‘œμ„Έμ‹± : ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨μ„ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— μž‘μ—…ν•˜λ„λ‘ κ΅¬μ„±ν•˜λŠ” 것

λ©€ν‹°ν”„λ‘œμ„Έμ‹±μ˜ νŠΉμ§•

λ©€ν‹°ν”„λ‘œμ„Έμ‹±μ€ ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ 죽더라도 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ— 영ν–₯을 μ£Όμ§€ μ•Šμ•„ μ•ˆμ •μ„±μ΄ λ†’λ‹€λŠ” μž₯점이 μžˆμ§€λ§Œ, λ§Žμ€ λ©”λͺ¨λ¦¬κ³΅κ°„κ³Ό CPUλ₯Ό μ°¨μ§€ν•œλ‹€λŠ” 단점이 μžˆλ‹€.

 

λ©€ν‹°ν”„λ‘œμ„Έμ‹±μ˜ 단점

  • λ‹€μˆ˜μ˜ ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것에 λŒ€ν•œ κ΅¬ν˜„μ΄ μƒλ‹Ήνžˆ μ–΄λ ΅λ‹€.
  • Context switching의 μ˜€λ²„ν—€λ“œκ°€ λ†’λ‹€

βž” λ©€ν‹°μŠ€λ ˆλ”©μ΄ λ‚˜μ˜¨ 이유

λ©€ν‹°ν”„λ‘œμ„Έμ‹± λŒ€μ‹  λ©€ν‹°μŠ€λ ˆλ”©μ„ μ‚¬μš©ν•˜λŠ” 이유

1. μžμ›μ˜ νš¨μœ¨μ„± μ¦λŒ€

  • λ©€ν‹°ν”„λ‘œμ„ΈμŠ€λ‘œ μ‹€ν–‰λ˜λŠ” μž‘μ—…μ„ λ©€ν‹°μŠ€λ ˆλ“œλ‘œ μ‹€ν–‰ν•  경우, ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜μ—¬ μžμ›μ„ ν• λ‹Ήν•˜λŠ” μ‹œμŠ€ν…œ 콜이 쀄어듀어 μžμ›μ„ 효율적으둜 관리할 수 μžˆλ‹€.
    • ν”„λ‘œμ„ΈμŠ€ κ°„ context switching μ‹œ λ‹¨μˆœνžˆ CPU λ ˆμ§€μŠ€ν„° ꡐ체 뿐만 μ•„λ‹ˆλΌ RAMκ³Ό CPU μ‚¬μ΄μ˜ 캐쉬 λ©”λͺ¨λ¦¬μ— λŒ›γ„΄ λ°μ΄ν„°κΉŒμ§€ μ΄ˆκΈ°ν™”λ˜λ―€λ‘œ μ˜€λ²„ν—€λ“œκ°€ 크닀.
  • μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ λ©”λͺ¨λ¦¬λ₯΄ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— 독립적인 ν”„λ‘œμ„ΈμŠ€μ™€ 달리 μŠ€λ ˆλ“œ κ°„ 데이터λ₯Ό μ£Όκ³  λ°›λŠ” 것이 간단해지고 μ‹œμŠ€ν…œ μžμ› μ†Œλͺ¨κ°€ μ€„μ–΄λ“€κ²Œ λœλ‹€.

2. 처리 λΉ„μš© κ°μ†Œ 및 응닡 μ‹œκ°„ 단좕

  • ν”„λ‘œμ„ΈμŠ€ κ°„ ν†΅μ‹œ(IPC)보닀 μŠ€λ ˆλ“œ κ°„ ν†΅μ‹ μ˜ λΉ„μš©μ΄ μ μœΌλ―€λ‘œ μž‘μ—…λ“€ κ°„μ˜ 톡신 뢀담이 쀄어든닀.
  • μŠ€λ ˆλ“œλŠ” Stack μ˜μ—­μ„ μ œμ™Έν•œ λͺ¨λ“  λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•œλ‹€.
  • ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ μ „ν™˜ 속도보닀 μŠ€λ ˆλ“œ κ°„μ˜ μ „ν™˜ 속도가 λΉ λ₯΄λ‹€.
  • context switching μ‹œ μŠ€λ ˆλ“œλŠ” stack μ˜μ—­λ§Œ μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

λ©€ν‹°μŠ€λ ˆλ”©μ˜ μž₯단점

λ©€ν‹°μŠ€λ ˆλ“œμ˜ μž₯점 

  • CPU의 μ‚¬μš©λ₯ μ„ ν–₯μƒμ‹œν‚¨λ‹€.
  • μžμ›μ„ 보닀 효율적으둜 μ‚¬μš©ν•  수 μžˆλ‹€.
  • μ‚¬μš©μžμ— λŒ€ν•œ 응닡성이 ν–₯μƒλœλ‹€.
  • μž‘μ—…μ΄ λΆ„λ¦¬λ˜μ–΄ μ½”λ“œκ°€ κ°„κ²°ν•΄μ§„λ‹€.

λ©€ν‹°μŠ€λ ˆλ“œμ˜ 단점

  • μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ 같은 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μžμ›μ„ κ³΅μœ ν•˜λ©΄μ„œ μž‘μ—…μ„ ν•˜κΈ° λ•Œλ¬Έμ— λ°œμƒν•  수 μžˆλŠ” 동기화, κ΅μ°©μƒνƒœ(deadlock)와 같은 λ¬Έμ œλ“€μ„ κ³ λ €ν•΄μ„œ μ‹ μ€‘νžˆ ν”„λ‘œκ·Έλž˜λ°ν•΄μ•Ό ν•œλ‹€.

μ‹±κΈ€μŠ€λ ˆλ“œμ™€ λ©€ν‹°μŠ€λ ˆλ“œμ˜ 비ꡐ

두 개의 μž‘μ—…μ„ ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œ(th1)둜 μ²˜λ¦¬ν•˜λŠ” κ²½μš°μ™€ 두 개의 μŠ€λ ˆλ“œ(th1, th2)둜 μ²˜λ¦¬ν•˜λŠ” 경우λ₯Ό κ°€μ •ν•΄λ³΄μž.

 

ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œ μ²˜λ¦¬ν•˜λŠ” 경우

  • ν•œ μž‘μ—…μ„ 마친 후에 λ‹€λ₯Έ μž‘μ—…μ„ μ‹œμž‘

두 개의 μŠ€λ ˆλ“œλ‘œ μ²˜λ¦¬ν•˜λŠ” 경우

  • 짧은 μ‹œκ°„λ™μ•ˆ 두 개의 μŠ€λ ˆλ“œκ°€ λ²ˆκ°ˆμ•„κ°€λ©΄μ„œ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ„œ λ™μ‹œμ— 두 μž‘μ—…μ΄ μ²˜λ¦¬λ˜λŠ” 것과 같이 느끼게 ν•œλ‹€.

 

ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ‘œ 두 개의 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 경우

 

두 개의 μŠ€λ ˆλ“œλ‘œ 두 개의 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 경우

 

두 개의 μŠ€λ ˆλ“œλ‘œ μž‘μ—…ν•œ μ‹œκ°„μ΄ μ‹±κΈ€μŠ€λ ˆλ“œλ‘œ μž‘μ—…ν•œ μ‹œκ°„λ³΄λ‹€ 쑰금 더 걸리게 λ˜λŠ”λ° κ·Έ μ΄μœ λŠ” μŠ€λ ˆλ“œ κ°„ μž‘μ—… μ „ν™˜(context switching)에 μ‹œκ°„μ΄ 걸리기 λ•Œλ¬Έμ΄λ‹€. 

μž‘μ—… μ „ν™˜ (context switching)

μ»΄ν“¨ν„°μ—μ„œ λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλŠ” μ΅œλŒ€ μž‘μ—… μˆ˜λŠ” CPU의 μ½”μ–΄ μˆ˜μ™€ κ°™λ‹€. λ§Œμ•½ CPU의 μ½”μ–΄ μˆ˜λ³΄λ‹€ 더 λ§Žμ€ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰λ˜λ©΄, 각 μ½”μ–΄κ°€ μ •ν•΄μ§„ μ‹œκ°„ λ™μ•ˆ μ—¬λŸ¬ μž‘μ—…μ„ λ²ˆκ°ˆμ•„κ°€λ©° μˆ˜ν–‰ν•˜κ²Œ λœλ‹€.

이 λ•Œ, 각 μŠ€λ ˆλ“œκ°€ μ„œλ‘œ ꡐ체될 λ•Œ μŠ€λ ˆλ“œ κ°„μ˜ μž‘μ—… μ „ν™˜(λ˜λŠ” λ¬Έλ§₯ κ΅ν™˜)μ΄λΌλŠ” 것이 λ°œμƒν•œλ‹€. ν˜„μž¬κΉŒμ§€μ˜ μž‘μ—… μƒνƒœ(ex. λ‹€μŒμ— μ‹€ν–‰ν•΄μ•Όν•  μœ„μΉ˜)λ‚˜ λ‹€μŒ μž‘μ—…μ— ν•„μš”ν•œ 각쒅 데이터λ₯Ό μ €μž₯ν•˜κ³  μ½μ–΄μ˜€λŠ” μž‘μ—…μ„ λ§ν•œλ‹€.

μ΄λŸ¬ν•œ μž‘μ—… μ „ν™˜μ— κ±Έλ¦¬λŠ” μ‹œκ°„μ΄ 컀지면 컀질수둝 λ©€ν‹°μŠ€λ ˆλ”©μ˜ νš¨μœ¨μ€ μ €ν•˜λœλ‹€. κ·Έλž˜μ„œ μ‹±κΈ€ μ½”μ–΄μ—μ„œ λ‹¨μˆœνžˆ CPUλ§Œμ„ μ‚¬μš©ν•˜λŠ” κ³„μ‚°μž‘μ—…μ΄λΌλ©΄ 였히렀 λ©€ν‹°μŠ€λ ˆλ“œλ³΄λ‹€ μ‹±κΈ€μŠ€λ ˆλ“œλ‘œ ν”„λ‘œκ·Έλž˜λ°ν•˜λŠ” 것이 더 νš¨μœ¨μ μ΄λ‹€.

μŠ€λ ˆλ“œ κ·Έλ£Ή

μŠ€λ ˆλ“œ 그룹은 μ„œλ‘œ κ΄€λ ¨λœ μŠ€λ ˆλ“œλ₯Ό 그룹으둜 닀루기 μœ„ν•œ κ²ƒμœΌλ‘œ, 폴더λ₯Ό μƒμ„±ν•΄μ„œ κ΄€λ ¨λœ νŒŒμΌλ“€μ„ ν•¨κ»˜ λ„£μ–΄μ„œ κ΄€λ¦¬ν•˜λŠ” κ²ƒμ²˜λŸΌ μŠ€λ ˆλ“œ 그룹을 μƒμ„±ν•΄μ„œ μŠ€λ ˆλ“œλ₯Ό 그룹으둜 λ¬Άμ–΄μ„œ 관리할 수 μžˆλ‹€.

λ˜ν•œ, 폴더 μ•ˆμ— 폴더λ₯Ό 생성할 수 μžˆλ“―μ΄ μŠ€λ ˆλ“œ 그룹에 λ‹€λ₯Έ μŠ€λ ˆλ“œ 그룹을 ν¬ν•¨μ‹œν‚¬ 수 μžˆλ‹€. 사싀 μŠ€λ ˆλ“œ 그룹은 λ³΄μ•ˆμƒμ˜ 이유둜 λ„μž…λœ κ°œλ…μœΌλ‘œ, μžμ‹ μ΄ μ†ν•œ μŠ€λ ˆλ“œ κ·Έλ£Ήμ΄λ‚˜ ν•˜μœ„ μŠ€λ ˆλ“œ 그룹은 λ³€κ²½ν•  수 μžˆμ§€λ§Œ λ‹€λ₯Έ μŠ€λ ˆλ“œ 그룹의 μŠ€λ ˆλ“œλ₯Ό λ³€κ²½ν•  μˆ˜λŠ” μ—†λ‹€.   

데λͺ¬ μŠ€λ ˆλ“œ (Daemon thread)

데λͺ¬ μŠ€λ ˆλ“œλŠ” λ‹€λ₯Έ 일반 μŠ€λ ˆλ“œ(데λͺ¬ μŠ€λ ˆλ“œκ°€ μ•„λ‹Œ μŠ€λ ˆλ“œ)의 μž‘μ—…μ„ λ•λŠ” 보쑰적인 역할을 μˆ˜ν–‰ν•˜λŠ” μŠ€λ ˆλ“œμ΄λ‹€. 일반 μŠ€λ ˆλ“œκ°€ λͺ¨λ‘ μ’…λ£Œλ˜λ©΄ 데λͺ¬ μŠ€λ ˆλ“œλŠ” κ°•μ œμ μœΌλ‘œ μžλ™ μ’…λ£Œλ˜λŠ”λ°, κ·Έ μ΄μœ λŠ” 데λͺ¬ μŠ€λ ˆλ“œλŠ” 일반 μŠ€λ ˆλ“œμ˜ 보쑰역할을 μˆ˜ν–‰ν•˜λ―€λ‘œ 일반 μŠ€λ ˆλ“œκ°€ λͺ¨λ‘ μ’…λ£Œλ˜κ³  λ‚˜λ©΄ 데λͺ¬ μŠ€λ ˆλ“œμ˜ 쑴재의 μ˜λ―Έκ°€ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

이 점을 μ œμ™Έν•˜κ³ λŠ” 데λͺ¬ μŠ€λ ˆλ“œμ™€ 일반 μŠ€λ ˆλ“œλŠ” λ‹€λ₯΄μ§€ μ•Šλ‹€. 데λͺ¬ μŠ€λ ˆλ“œμ˜ μ˜ˆλ‘œλŠ” κ°€λΉ„μ§€ 컬렉터, μ›Œλ“œν”„λ‘œμ„Έμ„œμ˜ μžλ™μ €μž₯, ν™”λ©΄μžλ™κ°±μ‹  등이 μžˆλ‹€. 

데λͺ¬ μŠ€λ ˆλ“œλŠ” λ¬΄ν•œλ£¨ν”„μ™€ 쑰건문을 μ΄μš©ν•΄μ„œ μ‹€ν–‰ ν›„ λŒ€κΈ°ν•˜κ³  μžˆλ‹€κ°€ νŠΉμ • 쑰건이 만쑱되면 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  λ‹€μ‹œ λŒ€κΈ°ν•˜λ„λ‘ μž‘μ„±ν•œλ‹€. 

 

참고자료

- γ€ŽJava의 정석 2』, 남ꢁ성, λ„μš°μΆœνŒ 

- https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

- https://brunch.co.kr/@kd4/3

- https://tcpschool.com/java/java_thread_multi

- https://velog.io/@chy0428/OS-%EB%A9%80%ED%8B%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EB%A9%80%ED%8B%B0%ED%94%84%EB%A1%9C%EC%84%B8%EC%8B%B1

- https://blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=rja1104&logNo=220551216367 

- https://wooody92.github.io/os/%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C/