CS

[OS] ν”„λ‘œμ„ΈμŠ€(Process) vs μŠ€λ ˆλ“œ(Thread)

meeeeejin 2021. 10. 12. 13:14

ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œμ˜ 차이

 

πŸ’‘ ν”„λ‘œμ„ΈμŠ€

  • μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨
  • λ””μŠ€ν¬λ‘œλΆ€ν„° λ©”λͺ¨λ¦¬μ— μ μž¬λ˜μ–΄ CPU의 할당을 λ°›λŠ” μž‘μ—…μ˜ λ‹¨μœ„
  • μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° μ‹œμŠ€ν…œ μžμ›μ„ ν• λ‹Ή λ°›μŒ
    - CPU μ‹œκ°„, μ£Όμ†Œ 곡간, λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­

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

  • λ©”λͺ¨λ¦¬ μ˜μ—­(μ£Όμ†Œ 곡간)은 [Code, Data, Stack, Heap]으둜 ꡬ성됨
    - Code: μ½”λ“œ 자체λ₯Ό κ΅¬μ„±ν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­(ν”„λ‘œκ·Έλž¨ λͺ…λ Ή)
    - Data: μ „μ—­ λ³€μˆ˜, 정적 λ³€μˆ˜ λ“±
    - Stack: μ§€μ—­λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, 리턴 κ°’(μž„μ‹œ λ©”λͺ¨λ¦¬ μ˜μ—­)
    - Heap: 동적 ν• λ‹Ή μ˜μ—­(new(), mallloc() λ“±)
  • ν•œ ν”„λ‘œμ„ΈμŠ€λŠ” λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ λ³€μˆ˜λ‚˜ μžλ£Œκ΅¬μ‘°μ— μ ‘κ·Όν•  수 μ—†μŒ
    -> IPC ν†΅μ‹ μœΌλ‘œ μ ‘κ·Όν•΄μ•Ό 함 ex) νŒŒμ΄ν”„, 파일, μ†ŒμΌ“ 등을 이용

 

 

πŸ’‘ ν”„λ‘œμ„ΈμŠ€ μ œμ–΄ 블둝(Process Control Block, PCB)

좜처: https://woovictory.github.io/2018/12/25/OS-Process/

  • νŠΉμ • ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•œ μ€‘μš”ν•œ 정보λ₯Ό μ €μž₯ν•˜λŠ” 컀널 λ‚΄μ˜ 자료ꡬ쑰
  • μš΄μ˜μ²΄μ œλŠ” ν”„λ‘œμ„ΈμŠ€μ˜ 생성과 λ™μ‹œμ— κ³ μœ ν•œ PCBλ₯Ό 생성함
  • ν”„λ‘œμ„ΈμŠ€ μ „ν™˜μ΄ λ°œμƒν•˜λ©΄, μž‘μ—…μ˜ 진행 상황을 λͺ¨λ‘ PCB에 μ €μž₯ν•˜κ³  CPUλ₯Ό λ°˜ν™˜ν•¨
  • λ‹€μ‹œ CPUλ₯Ό ν• λ‹Ήλ°›κ²Œ 되면 PCB에 μ €μž₯λ˜μ–΄μžˆλ˜ λ‚΄μš©μ„ λΆˆλŸ¬μ™€ μž‘μ—…μ„ μˆ˜ν–‰ν•¨

 

 

βœ” PCB에 μ €μž₯λ˜λŠ” 정보

  • ν”„λ‘œμ„ΈμŠ€ μ‹λ³„μž(Process ID, PID): ν”„λ‘œμ„ΈμŠ€ μ‹λ³„λ²ˆν˜Έ
  • ν”„λ‘œμ„ΈμŠ€ μƒνƒœ: new, ready, running, waiting, terminated λ“±μ˜ μƒνƒœ
  • ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°: ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€μŒμ— μ‹€ν–‰ν•  λͺ…λ Ήμ–΄μ˜ μ£Όμ†Œ
  • CPU λ ˆμ§€μŠ€ν„°
  • CPU μŠ€μΌ€μ₯΄λ§ μ •λ³΄: ν”„λ‘œμ„ΈμŠ€μ˜ μš°μ„ μˆœμœ„, μŠ€μΌ€μ₯΄ 큐에 λŒ€ν•œ 포인터 λ“±
  • λ©”λͺ¨λ¦¬ 관리 정보: νŽ˜μ΄μ§€/μ„Έκ·Έλ¨ΌνŠΈ ν…Œμ΄λΈ” λ“±κ³Ό 같은 정보
  • μž…μΆœλ ₯ μƒνƒœ 정보: ν”„λ‘œμ„ΈμŠ€μ— ν• λ‹Ήλœ μž…μΆœλ ₯ μž₯μΉ˜λ“€κ³Ό μ—΄λ¦° 파일 λͺ©λ‘
  • μ–΄μΉ΄μš΄νŒ… 정보: μ‚¬μš©λœ CPU μ‹œκ°„, μ‹œκ°„μ œν•œ, 계정 번호 λ“±

 

 

 

πŸ’‘ μŠ€λ ˆλ“œ(Thread)

  • ν”„λ‘œμ„ΈμŠ€ μ•ˆμ—μ„œ μ‹€ν–‰λ˜λŠ” μ—¬λŸ¬ 흐름 λ‹¨μœ„
  • ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ μ΅œμ†Œ 1개의 μŠ€λ ˆλ“œ μ†Œμœ 

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

  • ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ μ£Όμ†Œ κ³΅κ°„μ΄λ‚˜ μžμ›μ„ κ³΅μœ ν•  수 있음
  • μŠ€λ ˆλ“œ ID, ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°, λ ˆμ§€μŠ€ν„° 집합, μŠ€νƒμœΌλ‘œ ꡬ성
  • 같은 ν”„λ‘œμ„ΈμŠ€μ— μ†ν•œ μŠ€λ ˆλ“œλŠ” Code, Data, Heap μ˜μ—­μ„ κ³΅μœ ν•¨

 

 

βœ” μŠ€νƒμ„ λ…λ¦½μ μœΌλ‘œ ν• λ‹Ήν•˜λŠ” 이유

μŠ€νƒμ€ μ§€μ—­λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, 리턴 κ°’ 등을 μ €μž₯ν•˜λŠ” λ©”λͺ¨λ¦¬ 곡간이닀. λ”°λΌμ„œ 독립적인 ν•¨μˆ˜ ν˜ΈμΆœμ„ μœ„ν•΄μ„œλŠ” 독립적인 μŠ€νƒ λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•˜λ‹€. μŠ€λ ˆλ“œλŠ” 독립적인 μ‹€ν–‰ νλ¦„μ΄λ―€λ‘œ λ…λ¦½λœ μŠ€νƒμ„ ν• λ‹Ήν•΄μ•Ό ν•œλ‹€. 

 

βœ” ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°(PC)λ₯Ό λ…λ¦½μ μœΌλ‘œ ν• λ‹Ήν•˜λŠ” 이유

PC값은 μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. μŠ€λ ˆλ“œλŠ” CPUλ₯Ό ν• λ‹Ήλ°›μ•˜λ‹€κ°€ μŠ€μΌ€μ₯΄λŸ¬μ— μ˜ν•΄ λ‹€μ‹œ λ°˜ν™˜ν•΄μ•Ό ν•  수 μžˆλ‹€. λ”°λΌμ„œ μ²˜μŒλΆ€ν„° λκΉŒμ§€ μ—°μ†μ μœΌλ‘œ μˆ˜ν–‰λ˜μ§€ λͺ»ν•˜λ―€λ‘œ μ–΄λŠ λΆ€λΆ„κΉŒμ§€ μˆ˜ν–‰ν–ˆλŠ”μ§€ κΈ°μ–΅ν•  ν•„μš”κ°€ μžˆλ‹€. 이λ₯Ό μœ„ν•΄ PC λ ˆμ§€μŠ€ν„°λ₯Ό λ…λ¦½μ μœΌλ‘œ ν• λ‹Ήν•΄μ•Ό ν•œλ‹€. 

 

 

 

λ©€ν‹° ν”„λ‘œμ„ΈμŠ€μ™€ λ©€ν‹° μŠ€λ ˆλ“œμ˜ 차이

 

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

  • ν•˜λ‚˜μ˜ μ‘μš©ν”„λ‘œκ·Έλž¨μ„ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ‘œ κ΅¬μ„±ν•˜μ—¬ 각 ν”„λ‘œμ„ΈμŠ€κ°€ ν•˜λ‚˜μ˜ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λ„λ‘ ν•˜λŠ” 것
  • μž₯점: μ—¬λŸ¬ 개의 μžμ‹ ν”„λ‘œμ„ΈμŠ€ 쀑 ν•˜λ‚˜μ— λ¬Έμ œκ°€ λ°œμƒν•΄λ„ κ·Έ ν”„λ‘œμ„ΈμŠ€λ§Œ μ£½κ³  영ν–₯이 ν™•μ‚°λ˜μ§€ μ•ŠμŒ(μ•ˆμ •μ„±)
  • 단점: Context Switching μ˜€λ²„ν—€λ“œ, ν”„λ‘œμ„ΈμŠ€ μ‚¬μ΄μ˜ 톡신이 어렀움(IPC)

 

 

βœ” Context Switching μ˜€λ²„ν—€λ“œ

  • CPUμ—μ„œ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό λŒμ•„κ°€λ©΄μ„œ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” κ³Όμ •μ—μ„œ 일어남
  • ν”„λ‘œμ„ΈμŠ€ μ „ν™˜μ΄ 일어날 λ•Œ, ν˜„μž¬ 진행 쀑인 μž‘μ—…μ˜ μƒνƒœ(Context)λ₯Ό PCB에 μ €μž₯ν•˜κ³  λŒ€κΈ°ν•˜κ³  있던 λ‹€μŒ μˆœμ„œμ˜ μž‘μ—… μˆ˜ν–‰μ„ μœ„ν•΄ ν•΄λ‹Ή μž‘μ—…μ˜ 이전 μƒνƒœ 값을 λ³΅κ΅¬ν•˜λŠ” μž‘μ—…
  • Context Switching κ³Όμ •μ—μ„œ μΊμ‹œ λ©”λͺ¨λ¦¬ μ΄ˆκΈ°ν™” λ“± μ˜€λ²„ν—€λ“œ λ°œμƒ
  • ν”„λ‘œμ„ΈμŠ€λŠ” λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ ν• λ‹Ήλ°›μœΌλ―€λ‘œ ν”„λ‘œμ„ΈμŠ€ μ‚¬μ΄μ—λŠ” κ³΅μœ ν•˜λŠ” λ©”λͺ¨λ¦¬κ°€ μ—†μŒ
    -> Context Switching이 λ°œμƒν•˜λ©΄ μΊμ‹œμ— μžˆλŠ” λͺ¨λ“  데이터λ₯Ό λ¦¬μ…‹μ‹œν‚€κ³  λ‹€μ‹œ μΊμ‹œ 정보λ₯Ό λΆˆλŸ¬μ™€μ•Ό 함

 

 

 

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

  • ν•˜λ‚˜μ˜ μ‘μš©ν”„λ‘œκ·Έλž¨μ„ μ—¬λŸ¬ μŠ€λ ˆλ“œλ‘œ κ΅¬μ„±ν•˜μ—¬ 각 μŠ€λ ˆλ“œκ°€ ν•˜λ‚˜μ˜ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λ„λ‘ ν•˜λŠ” 것
  • μœˆλ„μš°, λ¦¬λˆ…μŠ€ λ“± λ§Žμ€ μš΄μ˜μ²΄μ œλ“€μ΄ λ©€ν‹° ν”„λ‘œμ„Έμ‹±μ„ μ§€μ›ν•˜μ§€λ§Œ, λ©€ν‹° μŠ€λ ˆλ”©μ„ 기본으둜 ν•˜κ³  있음
  • μ›Ή μ„œλ²„λŠ” λŒ€ν‘œμ μΈ λ©€ν‹° μŠ€λ ˆλ“œ μ‘μš© ν”„λ‘œκ·Έλž¨μž„
  • μž₯점
    - μ‹œμŠ€ν…œ μžμ› μ†Œλͺ¨ κ°μ†Œ
      : ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜μ—¬ μžμ›μ„ ν• λ‹Ήν•˜λŠ” System Call이 쀄어듀어 μžμ›μ„ 효율적으둜 관리할 수 있음
    - μ‹œμŠ€ν…œ μ²˜λ¦¬λŸ‰ 증가
      : μŠ€λ ˆλ“œ κ°„ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” 것이 κ°„λ‹¨ν•΄μ Έμ„œ 처리 λΉ„μš©μ΄ κ°μ†Œν•¨
        μŠ€λ ˆλ“œ μ‚¬μ΄μ˜ μž‘μ—…λŸ‰μ΄ μž‘μ•„ Context Switching이 빠름
    - κ°„λ‹¨ν•œ 톡신 λ°©λ²•μœΌλ‘œ μΈν•œ ν”„λ‘œκ·Έλž¨ 응닡 μ‹œκ°„ 단좕
      : μŠ€λ ˆλ“œλŠ” μŠ€νƒμ„ μ œμ™Έν•œ λͺ¨λ“  λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— 톡신 뢀담이 적음
  • 단점
    - μ„œλ‘œ λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μžμ›μ„ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ μŠ€λ ˆλ“œμ—μ„œ μ‚¬μš© 쀑인 λ³€μˆ˜λ‚˜ μžλ£Œκ΅¬μ‘°μ— μ ‘κ·Όν•˜μ—¬ μ—‰λš±ν•œ 값을 μ½μ–΄μ˜€κ±°λ‚˜ μˆ˜μ •ν•  수 있음 (동기화 문제)
    - ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œμ— λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ 전체 ν”„λ‘œμ„ΈμŠ€κ°€ 영ν–₯을 λ°›μŒ
    - λ”°λΌμ„œ 주의 κΉŠμ€ 섀계가 ν•„μš”ν•˜λ©°, 디버깅이 κΉŒλ‹€λ‘œμ›€

 

 

 

 

Reference

 

 

 

728x90