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

βœ”οΈ Etc.

[N/W] ν”„λ‘œμ„ΈμŠ€(Process) VS μŠ€λ ˆλ“œ(Thread)

728x90
ν”„λ‘œμ„ΈμŠ€(Process), μŠ€λ ˆλ“œ(Thread) λž€?

 

 

λ¨Όμ € 간단 μ„€λͺ…!

 

ν”„λ‘œκ·Έλž¨μ΄λž€, νŒŒμΌμ΄ μ €μž₯ μž₯μΉ˜μ— μ €μž₯λ˜μ–΄ μžˆμ§€λ§Œ λ©”λͺ¨λ¦¬μ—λŠ” μ˜¬λΌκ°€ μžˆμ§€ μ•Šμ€ μ •μ μΈ μƒνƒœ 즉 μ½”λ“œ 덩어리 νŒŒμΌμ„ λ§ν•œλ‹€.

이 ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ 컴퓨터 λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€λ©΄μ„œ λ™μ μΈ μƒνƒœ 즉, μ‹€ν–‰λ˜κ³  μžˆλŠ” ν”„λ‘œκ·Έλž¨μ„ ν”„λ‘œμ„ΈμŠ€λΌκ³  ν•œλ‹€.

이 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ‹€μ œλ‘œ μž‘업을 μˆ˜ν–‰ν•˜λŠ” 주체λ₯Ό μŠ€λ ˆλ“œλΌκ³  ν•œλ‹€.

 

사전적 μ •μ˜λ‘œλŠ”,

  • ν”„λ‘œκ·Έλž¨(Program) : 컴퓨터 ν”„λ‘œκ·Έλž¨(computer program)은 μ»΄ν“¨ν„°μ—μ„œ 싀행될 λ•Œ νŠΉμ • μž‘μ—…(specific task)을 μˆ˜ν–‰ν•˜λŠ” 일련의 λͺ…λ Ήμ–΄λ“€μ˜ λͺ¨μŒ(집합)
  • ν”„λ‘œμ„ΈμŠ€(Process) : μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° μžμ›μ„ 할당받은 μž‘μ—…μ˜ λ‹¨μœ„.
  • μŠ€λ ˆλ“œ(Thread) : ν”„λ‘œμ„ΈμŠ€κ°€ 할당받은 μžμ›μ„ μ΄μš©ν•˜λŠ” μ‹€ν–‰ νλ¦„μ˜ λ‹¨μœ„.

 

ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œμ— λŒ€ν•΄ μžμ„Ένžˆ λ“€μ—¬λ‹€λ³΄μž~


πŸ”₯ ν”„λ‘œμ„ΈμŠ€(Process) 

  • μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° μ‹œμŠ€ν…œ μžμ›μ„ ν• λ‹Ήλ°›λŠ” μž‘μ—…μ˜ λ‹¨μœ„
  • μ΄λ•Œ, μš΄μ˜μ²΄μ œλŠ” ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ 각각 Code, Data, Stack, Heap의 ꡬ쑰둜 λ˜μ–΄ μžˆλŠ” λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ ν• λ‹Ήν•΄ μ€€λ‹€.
  • 즉, 각 ν”„λ‘œμ„ΈμŠ€λŠ” λ³„λ„μ˜ μ£Όμ†Œ κ³΅κ°„μ—μ„œ μ‹€ν–‰λœλ‹€. λ”°λΌμ„œ ν•œ ν”„λ‘œμ„ΈμŠ€λŠ” λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ λ³€μˆ˜λ‚˜ μžλ£Œμ— μ ‘κ·Όν•  수 μ—†λ‹€.

*ν•œ ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ μžμ›μ— μ ‘κ·Όν•˜λ €λ©΄ ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ 톡신(IPC, inter-process communication)을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

ex) νŒŒμ΄ν”„, 파일, μ†ŒμΌ“ 등을 μ΄μš©ν•œ 톡신 방법

ν”„λ‘œμ„ΈμŠ€λ“€μ΄ μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° λ³„λ„μ˜ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ 할당받은 λͺ¨μŠ΅


πŸ”₯ μŠ€λ ˆλ“œ(Thread)

  • ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” μ—¬λŸ¬ νλ¦„μ˜ λ‹¨μœ„μ΄λ‹€.
  • 즉, ν”„λ‘œμ„ΈμŠ€κ°€ 할당받은 μžμ›μ„ μ΄μš©ν•˜λŠ” μ‹€ν–‰μ˜ λ‹¨μœ„
  • μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€μ™€ 달리 Stack μ™Έ λ‚˜λ¨Έμ§€ Code, Data, Heap ν˜•μ‹μ˜ λ©”λͺ¨λ¦¬ μ˜μ—­μ€ κ³΅μœ ν•œλ‹€.

(*Stack은 LIFO ꡬ쑰이기 λ•Œλ¬Έ)

  • 즉, 같은 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ μ£Όμ†Œ κ³΅κ°„μ΄λ‚˜ μžμ›λ“€μ„ κ³΅μœ ν•˜λ©΄μ„œ μ‹€ν–‰.
  • ν•œ μŠ€λ ˆλ“œκ°€ ν”„λ‘œμ„ΈμŠ€ μžμ›μ„ λ³€κ²½ν•˜λ©΄ λ‹€λ₯Έ 이웃 μŠ€λ ˆλ“œ(Sibling thread)도 λ³€κ²½λœ 사항을 확인할 수 μžˆλ‹€.

μ“°λ ˆλ“œμ˜ λ©”λͺ¨λ¦¬ μ˜μ—­


λ”°λΌμ„œ ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œμ˜ λ©”λͺ¨λ¦¬ μ˜μ—­ 차이점을 톡해,

  • ν”„λ‘œμ„ΈμŠ€λŠ” μ‹€ν–‰ 쀑 였λ₯˜ λ°œμƒμœΌλ‘œ κ°•μ œ μ’…λ£Œκ°€ λœλ‹€λ©΄ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ— 영ν–₯을 주지 μ•Šμ§€λ§Œ,
  • μŠ€λ ˆλ“œλŠ” κ³΅μœ λ˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­(Code, Data, Heap)으둜 인해 μŠ€λ ˆλ“œ ν•˜λ‚˜μ— 였λ₯˜ λ°œμƒ μ‹œ 같은 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ 영ν–₯을 μ€€λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

μœ„μ—μ„œ 배운 ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œλ‘œ ν”„λ‘œκ·Έλž¨μ˜ μ„±λŠ₯을 λ†’μ΄λŠ” 처리 λ°©λ²•μ—λŠ” λ©€ν‹° ν”„λ‘œμ„ΈμŠ€μ™€ λ©€ν‹° μŠ€λ ˆλ“œκ°€ μžˆλ‹€.

 

πŸ”₯ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€(Multi Process)

ν•˜λ‚˜μ˜ μ‘μš©ν”„λ‘œκ·Έλž¨μ„ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ‘œ κ΅¬μ„±ν•˜μ—¬ 각 ν”„λ‘œμ„ΈμŠ€κ°€ ν•˜λ‚˜μ˜ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λ„λ‘ μ‹€ν–‰

 

  • ν”„λ‘œμ„ΈμŠ€λŠ” 각각의 λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ ν• λ‹Ήλ°›μ•˜κΈ° λ•Œλ¬Έμ— ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨μ— μ†ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ“€ μ‚¬μ΄μ˜ λ³€μˆ˜λ₯Ό κ³΅μœ ν•  수 μ—†λ‹€.
  • Context Switching μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•  수 μžˆλŠ”λ°, κ·Έ κ³Όμ •μ—μ„œ μΊμ‹œ λ©”λͺ¨λ¦¬ λ“± 무거운 μž‘μ—…μ΄ 진행과 Taskμˆ˜ν–‰μ— μžˆμ–΄μ„œ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•˜κ²Œ λœλ‹€.

βœ”οΈ Context Switching

: CPUμ—μ„œ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό λŒμ•„κ°€λ©΄μ„œ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” 것

즉, λ™μž‘ 쀑인 ν”„λ‘œμ„ΈμŠ€κ°€ λŒ€κΈ°λ₯Ό ν•˜λ©΄μ„œ ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœ(Context)λ₯Ό λ³΄κ΄€ν•˜κ³ , λŒ€κΈ°ν•˜κ³  있던 λ‹€μŒ μˆœμ„œμ˜ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μž‘ν•˜λ©΄μ„œ 이전에 λ³΄κ΄€ν–ˆλ“  ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœλ₯Ό λ³΅κ΅¬ν•˜λŠ” μž‘μ—…

 

βœ”οΈ Context Switchingμ—μ„œμ˜ μ˜€λ²„ν—€λ“œ(Overhead)

Context Switching κ³Όμ •μ—μ„œ μΊμ‹œ λ©”λͺ¨λ¦¬ μ΄ˆκΈ°ν™” λ“± 무거운 μž‘μ—…μ΄ μ§„ν–‰λ˜κ³  λ§Žμ€ μ‹œκ°„μ΄ μ†Œλͺ¨λ˜λŠ” λ“±μ˜ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•˜κ²Œ λœλ‹€.
ν”„λ‘œμ„ΈμŠ€λŠ” κ°κ°μ˜ λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ ν• λ‹Ήλ°›μ•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œμ„ΈμŠ€ μ‚¬μ΄μ—μ„œ κ³΅μœ ν•˜λŠ” λ©”λͺ¨λ¦¬κ°€ μ—†μ–΄, 

Context Switchingκ°€ λ°œμƒν•˜λ©΄ μΊμ‹œμ— μžˆλŠ” λͺ¨λ“  데이터λ₯Ό λͺ¨λ‘ λ¦¬μ…‹ν•˜κ³  λ‹€μ‹œ 캐쉬 정보λ₯Ό λΆˆλŸ¬μ˜€λŠ” κ³Όμ •μ—μ„œ μ˜€λ²„ν—€λ“œ λ°œμƒ

*μ˜€λ²„ν—€λ“œ(Overhead) : μΆ”κ°€μ μœΌλ‘œ μ‹œκ°„, λ©”λͺ¨λ¦¬, μžμ›μ΄ μ‚¬μš©λ˜λŠ” ν˜„μƒ


πŸ”₯ λ©€ν‹° μŠ€λ ˆλ“œ(Multi Thread)

ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€μ— μ—¬λŸ¬κ°œμ˜ μŠ€λ ˆλ“œλ‘œ μžμ›μ„ κ³΅μœ ν•˜λ©° μž‘μ—…μ„ λ‚˜λˆ„μ–΄ μˆ˜ν–‰ν•˜λŠ” 것
WIndow, Linux λ“± λ§Žμ€ μš΄μ˜μ²΄μ œλ“€μ΄ λ©€ν‹° ν”„λ‘œμ„Έμ‹±μ„ μ§€μ›ν•˜κ³  μžˆμ§€λ§Œ λ©€ν‹°μŠ€λ ˆλ”©μ„ 기본으둜 ν•˜κ³ μžˆμŠ΅λ‹ˆλ‹€.
λŒ€ν‘œμ μΈ λ©€ν‹°μŠ€λ ˆλ”©μ˜ μ˜ˆλŠ” μ›Ήμ„œλ²„λ₯Ό λ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ©€ν‹° μŠ€λ ˆλ“œ(Multi Thread)


βœ”οΈ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€(Multi Process)와 λ©€ν‹° μŠ€λ ˆλ“œ(Multi Thread) 비ꡐ

μ’…λ₯˜ μž₯점 단점
λ©€ν‹° ν”„λ‘œμ„ΈμŠ€
  1. ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ 죽어도 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ—κ²Œ 영ν–₯을 λΌμΉ˜μ§€ μ•ŠλŠ”λ‹€.
  1. 각각 λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ κ°€μ§€λ―€λ‘œ μž‘μ—…λŸ‰μ΄ λ§Žμ„μˆ˜λ‘ μ˜€λ²„ν—€λ“œ λ°œμƒ
  2. Context Switching으둜 μΈν•œ μ„±λŠ₯ μ €ν•˜ 유발
λ©€ν‹° μŠ€λ ˆλ“œ
  1. ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜λŠ” μžμ›μ„ ν• λ‹Ήν•˜λŠ” μ‹œμŠ€ν…œ 콜이 쀄어듀어 효율적으둜 μžμ›μ„ 관리할 수 μžˆλ‹€.
  2. Context-Switchingν•  λ•Œ κ³΅μœ ν•˜κ³  μžˆλŠ” λ©”λͺ¨λ¦¬λ§ŒνΌμ˜ λ©”λͺ¨λ¦¬ μžμ›μ„ 아끼고 톡신 뢀담이 μ μ–΄μ‘λ‹΅μ‹œκ°„ 단좕
  3. μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ Stack μ˜μ—­μ„ μ œμ™Έν•œ λͺ¨λ“  λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— ν†΅μ‹ μ˜ 뢀담이 μ μ–΄μ„œ 응닡 μ‹œκ°„μ΄ λΉ λ₯΄λ‹€.
  1. ν”„λ‘œκ·Έλž¨ 디버깅이 μ–΄λ ΅λ‹€.
  2. μŠ€λ ˆλ“œ ν•˜λ‚˜μ— λ¬Έμ œκ°€ 생기면 전체적인 ν”„λ‘œμ„ΈμŠ€μ— 영ν–₯을 λΌμΉœλ‹€.
  3. 주의 κΉŠμ€ 섀계 ν•„μš”
  4. μžμ›μ„ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— ν•„μ—°μ μœΌλ‘œ λ™κΈ°ν™” λ¬Έμ œκ°€ λ°œμƒν•  μˆ˜λ°–μ— μ—†λ‹€.

 

λ°˜μ‘ν˜•