λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
CS/운영체제

10. μŠ€λ ˆλ“œ (Thread)

by 🐳 Laboon 2024. 4. 21.
μ“°λ ˆλ“œλŠ” μ™œ μ‚¬μš©ν• κΉŒ?

 

μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜κ²Œ 된 배경도 μžˆμ„ 것이닀. μ΄μœ λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ 문제점 λ•Œλ¬Έμ΄λ‹€.

  • ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ΄ λ°œμƒν•  경우, ν”„λ‘œμ„ΈμŠ€ 생성에 λ„ˆλ¬΄ λ§Žμ€ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•œλ‹€
    • ν”„λ‘œμ„ΈμŠ€ μƒμ„±μ‹œ PCB 생성, λ©”λͺ¨λ¦¬ ν• λ‹Ή, λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€ λ‚΄μš© 볡사 λ“± λ§Žμ€ μž‘μ—…μ„ ν•΄μ•Όν•œλ‹€.
    • κ·Έ 외에도 뒀에 λ‚˜μ˜¬ νŽ˜μ΄μ§€ ν…Œμ΄λΈ” μ°Έμ‘°, μΊμ‹œ μ—…λ°μ΄νŠΈ λ“± λ§Žμ€ λΆ€λΆ„μ—μ„œ 문제점이 λ°œμƒ
  • ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ 톡신이 μ–΄λ ΅λ‹€.
    • ν”„λ‘œμ„ΈμŠ€λŠ” 독립적인 곡간을 κ°–κ³  μžˆμœΌλ―€λ‘œ μ„œλ‘œ μΉ¨λ²”ν•  수 μ—†μ–΄μ„œ 톡신이 νž˜λ“€λ‹€λŠ” 점.
    • ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신을 μœ„ν•΄ λ©”λͺ¨λ¦¬ λ§΅, νŒŒμ΄ν”„, μ†ŒμΌ“ λ“± λ‹€μ–‘ν•œ 방식을 μ‚¬μš©ν–ˆλ‹€.

ν”„λ‘œμ„ΈμŠ€λŠ” μž…λ ₯을 λ…μ ν•˜λŠ” ForeGorund Process와 각쒅 처리λ₯Ό ν•˜λŠ” BackGround Processκ°€ μ‘΄μž¬ν•œλ‹€.

κ·Έ 외에도 CPU 처리만 μ§‘μ€‘ν•˜λŠ” CPU 집쀑 ν”„λ‘œμ„ΈμŠ€ Interruptλ₯Ό λ‹€λ£¨λŠ” I/O 집쀑 ν”„λ‘œμ„ΈμŠ€λ„ μ‘΄μž¬ν•œλ‹€.

μœ„μ™€ 같이 역할이 λ‚˜λˆ„μ–΄μ ΈμžˆλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μ‘΄μž¬ν•  λ•Œ, Foreground 에 λŒ€ν•΄ Backgroundκ°€ μ²˜λ¦¬ν•˜κ³  싢어도 Foreground ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬μ— 접근을 ν•  수 μ—†λ‹€. κ·Έλž˜μ„œ λ‹€μ–‘ν•œ ν”„λ‘œμ„ΈμŠ€ 톡신 방식을 μ‚¬μš©ν–ˆλŠ”λ° μ‹œκ°„μ΄ λ„ˆλ¬΄ 였래 κ±Έλ¦°λ‹€λŠ” 단점이 μžˆμ—ˆλ‹€.

 

μœ„μ™€κ°™μ€ 문제둜 μŠ€λ ˆλ“œλΌλŠ” κ°œλ…μ„ μƒκ°ν•˜κ²Œ λ˜μ—ˆλ‹€.

μ–΄μ°¨ν”Ό ν”„λ‘œμ„ΈμŠ€λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ fork() 와 같은 ν”„λ‘œμ„ΈμŠ€ 생성 System Call을 톡해 μž‘μ—…μ„ μ²˜λ¦¬ν–ˆλŠ”λ°, λΉ λ₯Έ 처리λ₯Ό μœ„ν•΄μ„œ Foreground와 Backgroundμ—μ„œ μ ‘κ·Όν•˜λ €κ³  ν•˜λŠ”λ° λ‘˜μ€ λ…λ¦½λœ 곡간에 μžˆλ‹€. λ§Œμ•½ ν”„λ‘œμ„ΈμŠ€λ₯Ό ν•˜λ‚˜μ˜ 곡유 κ³΅κ°„μœΌλ‘œ 두고 μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” λ‹€λ₯Έ κ°œλ…μ΄ 있으면 μ–΄λ–¨κΉŒ? 그게 μŠ€λ ˆλ“œλ‹€.

 

즉, ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œμ˜ 관계λ₯Ό μ•„λž˜μ™€ 같이 μ •μ˜ν•œλ‹€.

1. ν”„λ‘œμ„ΈμŠ€λŠ” μžμ› μ†Œμœ μžμ˜ λ‹¨μœ„κ°€ λœλ‹€ (Container)

ν”„λ‘œμ„ΈμŠ€λŠ” PCB 정보와, λ©”λͺ¨λ¦¬ μ˜μ—­, I/O λ“± μž₯μΉ˜μ— λŒ€ν•œ μ œμ–΄κΆŒμ΄ ν•„μš”ν•˜λ‹€.

2. μŠ€λ ˆλ“œλŠ” μ‹€ν–‰ λ‹¨μœ„κ°€ λœλ‹€.

μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€λ³΄λ‹€ 더 μž‘μ€ μ‹€ν–‰ λ‹¨μœ„κ°€ λ˜μ–΄ μ˜€λ²„ν—€λ“œλ₯Ό κ°μ†Œ μ‹œμΌœ λΉ λ₯Έ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ„ ν•œλ‹€.

이 방법은 ν”„λ‘œμ„ΈμŠ€μ˜ λ³΅μž‘ν•œ 톡신, μ‹€ν–‰ 속도λ₯Ό κ°œμ„ ν•œλ‹€.

 

닀쀑 μŠ€λ ˆλ“œ (Multi Threading)

 

μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ²Œ 되면 foreground thread둜 μ‚¬μš©μž μž…λ ₯에 λŒ€ν•œ 처리λ₯Ό ν•˜κ³  ν”„λ‘œμ„ΈμŠ€ λ‚΄ 곡유 곡간을 톡해 backgroundμ—μ„œ 정보λ₯Ό μ—…λ°μ΄νŠΈ ν•˜λ„λ‘ ν•œλ‹€. 즉, Asynchronous둜 μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆλŠ” 것이닀. 이 λ–„, λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성할 ν•„μš”κ°€ μ—†μœΌλ‹ˆ μˆ˜ν–‰μ‹œκ°„μ΄λ‚˜ λ³΅μž‘λ„κ°€ 많이 λ‹¨μΆ•λœλ‹€. κ·Έ 외에도 싀행속도 μΈ‘λ©΄μ΄λ‚˜ λͺ¨λ“ˆ ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ„±ν•˜λŠ” κ²½μš°μ—μ„œ 많이 μ‚¬μš©λ˜λŠ”λ° μ΄λ ‡κ²Œ ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€μ— μ—¬λŸ¬κ°œμ˜ ν”„λ‘œμ„ΈμŠ€κ°€ μžˆλŠ” 것을 닀쀑 μŠ€λ ˆλ“œλΌκ³  ν•œλ‹€.

 

λ©€ν‹° μŠ€λ ˆλ“œμ—μ„œλŠ” Concurrency와 parallelism이 λ°œμƒν•œλ‹€.

이 것은 이점일 μˆ˜λ„ 있고 단점일 μˆ˜λ„ μžˆλ‹€.

 

Concurrency(λ™μ‹œμ„±)은 1개의 CPUμ—μ„œ 2개의 μ΄μƒμ˜ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— 싀행쀑인 μƒνƒœμ΄λ‹€.

Time Slice에 따라 μ—¬λŸ¬ μŠ€λ ˆλ“œλ₯Ό μ²˜λ¦¬ν•  수 μžˆμ–΄μ„œ μž‘μ—… μ²˜λ¦¬μ†λ„κ°€ λ§€μš°λΉ¨λΌμ§€λŠ” μž₯점이 있고 Idle νƒ€μž„μ΄ 거의 μ€„μ–΄λ“œλŠ” μž₯점이 μžˆλ‹€. λ°˜λ©΄μ— μŠ€λ ˆλ“œ1μ—μ„œ μ²˜λ¦¬κ°€ λ‹€ λλ‚˜μ§€ μ•Šκ³  interrupt λ˜λŠ” time slice 초과둜 μŠ€λ ˆλ“œ2λ₯Ό μ²˜λ¦¬ν•˜κ²Œ λ˜λŠ” 상황이 λ°œμƒν•œλ‹€κ³  μƒκ°ν•΄λ³΄μž. μŠ€λ ˆλ“œ1κ³Ό μŠ€λ ˆλ“œ2κ°€ λ‘˜ λ‹€ AλΌλŠ” μžμ›μ„ μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆμ„ λ•Œ, λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

 

μ˜ˆμ‹œλ‘œ A에 1000λ§Œμ›μ΄ 있고 μŠ€λ ˆλ“œ 1μ—μ„œ 700λ§Œμ›, μŠ€λ ˆλ“œ 2μ—μ„œ 500λ§Œμ›μ„ κ°€μ Έκ°„λ‹€κ³  ν•΄λ³΄μž. AλŠ” ν•œ λ²ˆμ— 100λ§Œμ›μ”©λ§Œ μΆœκΈˆν•  수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆλ‹€.

정상적인 상황이라면 μŠ€λ ˆλ“œ1μ—μ„œ 700λ§Œμ›, μŠ€λ ˆλ“œ2μ—μ„œ 300λ§Œμ›λ§Œ κ°€μ Έκ°€κ±°λ‚˜ μž”μ•‘μ΄ λΆ€μ‘±ν•˜λ‹€λŠ” μ•ˆλ‚΄λ₯Ό λ°›μ•„μ•Ό ν•œλ‹€.

ν•˜μ§€λ§Œ λ©€ν‹°μŠ€λ ˆλ”© ν™˜κ²½μ—μ„œλŠ” μŠ€λ ˆλ“œ1μ—μ„œ 100λ§Œμ›, μŠ€λ ˆλ“œ2μ—μ„œ 100λ§Œμ›μ”© κ°€μ Έκ°€λ©΄μ„œ 각 각 500λ§Œμ›μ”© κ°€μ Έκ°€κ²Œ λœλ‹€. 이러면 μŠ€λ ˆλ“œ1은 λ¨Όμ € μ‹€ν–‰λ˜μ—ˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  500λ§Œμ›λ°–μ— μ±™κΈ°μ§€ λͺ»ν•œλ‹€.

 

Parallelism(병렬성)은 2개 μ΄μƒμ˜ μŠ€λ ˆλ“œκ°€ λ‹€λ₯Έ CPUμ—μ„œ 같은 μ‹œκ°„μ— λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” 것이닀.

이것 λ˜ν•œ, λ™μ‹œμ„±κ³Ό λ§ˆμ°¬κ°€μ§€μ˜ μž₯점과 단점이 λ°œμƒν•œλ‹€.

이런 λ¬Έμ œμ μ„ 동기화 문제라고 ν•˜λŠ”λ° 이후에 λ‹€λ£° λ‚΄μš©μ΄λ‹€.

 

정리

 

  • μŠ€λ ˆλ“œλŠ” μ‹€ν–‰ 및 μŠ€μΌ€μ€„λ§ λ‹¨μœ„μ΄λ‹€.
    • κ°œλ°œμžμ—κ²ŒλŠ” μž‘μ—… λ‹¨μœ„κ°€ λœλ‹€.
    • OSμ—μ„œλŠ” μ‹€ν–‰λ‹¨μœ„, CPUμ—μ„œλŠ” μŠ€μΌ€μ€„λ§ λ‹¨μœ„κ°€ λœλ‹€.
    • Process의 μ½”λ“œ, 데이터, νž™, μŠ€νƒ μ˜μ—­μ„ 곡유 λ°›μ•„ 직접 μ €μž₯ν•˜κ³  μžˆλŠ” 싀체이닀.
    • Thread λ§ˆλ‹€ TCB(Thread Control Block)이 μƒμ„±λœλ‹€.
  • ν”„λ‘œμ„ΈμŠ€λŠ” μ»¨ν…Œμ΄λ„ˆ λ‹¨μœ„κ°€ λ˜μ—ˆλ‹€.
    • 싀행이 되렀면 λ°˜λ“œμ‹œ 1개 μ΄μƒμ˜ μŠ€λ ˆλ“œκ°€ μ‘΄μž¬ν•΄μ•Όν•œλ‹€.
    • ν”„λ‘œμ„ΈμŠ€κ°€ 생성될 λ•Œ, μžλ™μœΌλ‘œ 1개의 main μŠ€λ ˆλ“œλŠ” μƒμ„±λœλ‹€.
    • λͺ¨λ“  μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€μ˜ 곡간을 λ‚˜λˆ„μ–΄μ„œ μ‚¬μš©ν•œλ‹€.
    • μŠ€λ ˆλ“œ κ°„ ν”„λ‘œμ„ΈμŠ€μ˜ 곡유 κ³΅κ°„μœΌλ‘œ ν†΅μ‹ ν•œλ‹€.
  • μŠ€λ ˆλ“œλŠ” ν•¨μˆ˜λ‘œ μž‘μ„±ν•œλ‹€.
    • ProcessλŠ” λͺ©μ  ν”„λ‘œκ·Έλž¨μ΄μ—ˆμ§€λ§Œ μŠ€λ ˆλ“œλŠ” μ½”λ“œμ΄λ‹€.
    • μš΄μ˜μ²΄μ œμ— μŠ€λ ˆλ“œ 생성이 μš”μ²­λ˜λ©΄ ν•¨μˆ˜ μ£Όμ†Œλ₯Ό μŠ€λ ˆλ“œ μ‹œμž‘μ£Όμ†Œλ‘œ TCB에 λ“±λ‘ν•œλ‹€.
    • TCB Listκ°€ μƒμ„±λ˜μ–΄ μŠ€λ ˆλ“œ λ‹¨μœ„λ‘œ μŠ€μΌ€μ€„ν•˜λ©° μŠ€λ ˆλ“œλ₯Ό κ΄€λ¦¬ν•œλ‹€.
  • μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€μ˜ 생λͺ…을 κ³΅μœ ν•œλ‹€.
    • ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ˜λ©΄ μŠ€λ ˆλ“œκ°€ μ’…λ£Œλœλ‹€.
    • μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ˜λ©΄ TCB λ“± κ΄€λ ¨ 정보가 λͺ¨λ‘ 제거 λœλ‹€.
    • μŠ€λ ˆλ“œ ν•¨μˆ˜κ°€ μ’…λ£Œλ˜μ–΄λ„ μŠ€λ ˆλ“œλŠ” μ’…λ£Œλœλ‹€.