πŸ¦• κ³΅λ£‘μ±…μœΌλ‘œ μ •λ¦¬ν•˜λŠ” 운영체제 Ch.4

Multithreaded Programming

μ“°λ ˆλ“œμ— λŒ€ν•΄ λ‹€λ£¨λŠ” μ±•ν„°λ‘œ, ꡬ체적인 λ©€ν‹°μ“°λ ˆλ“œ κ΅¬ν˜„ λ°©λ²•μ΄λ‚˜ μ½”λ“œκ°€ 많이 λ‚˜μ˜¨λ‹€.

Threads

μ“°λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μž‘μ—… 흐름을 λ§ν•œλ‹€. ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ μˆ˜ν–‰ν•˜λŠ” 것은 μ‹±κΈ€μ“°λ ˆλ“œ(Single thread)이며, ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— μ—¬λŸ¬ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것은 λ©€ν‹°μ“°λ ˆλ“œ(Multi thread)라고 ν•œλ‹€. ν”„λ‘œμ„Έμ„œμ™€ λ©”λͺ¨λ¦¬κ°€ λ°œμ „ν•˜λ©° κ°€λŠ₯해진 κΈ°μˆ μ΄λ‹€. λ©€ν‹°ν”„λ‘œκ·Έλž˜λ° μ‹œμŠ€ν…œμ΄λ‹ˆκΉŒ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ—¬λŸ¬κ°œ λŒλ €λ„ λ˜λŠ”λ° ꡳ이 μ“°λ ˆλ“œλ₯Ό λ‚˜λˆ„λŠ” λ°λŠ” μ΄μœ κ°€ μžˆλ‹€.

  1. 두 ν”„λ‘œμ„ΈμŠ€κ°€ ν•˜λ‚˜μ˜ 데이터λ₯Ό κ³΅μœ ν•˜λ €λ©΄ λ©”μ‹œμ§€ νŒ¨μ‹±μ΄λ‚˜ 곡유 λ©”λͺ¨λ¦¬ λ˜λŠ” νŒŒμ΄ν”„λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”λ°, νš¨μœ¨λ„ 떨어지고 κ°œλ°œμžκ°€ κ΅¬ν˜„, κ΄€λ¦¬ν•˜κΈ°λ„ λ²ˆκ±°λ‘­λ‹€.
  2. ν”„λ‘œμ„ΈμŠ€ 사이 μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ˜κ°€ 계속 μΌμ–΄λ‚˜λ©΄ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•œλ‹€. μ“°λ ˆλ“œ μ „ν™˜μ—λ„ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ˜κ°€ μΌμ–΄λ‚˜μ§€λ§Œ 속도가 더 λΉ λ₯΄λ‹€.

Multithreaded Server Architecture

μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ 사이에도 λ©€ν‹°μ“°λ ˆλ“œλ₯Ό κ΅¬ν˜„ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ—κ²Œ μš”μ²­μ„ 보내면 μ„œλ²„λŠ” μƒˆλ‘œμš΄ μ“°λ ˆλ“œλ₯Ό ν•˜λ‚˜ 생성해 μš”μ²­μ„ μˆ˜ν–‰ν•œλ‹€. ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것보닀 μ“°λ ˆλ“œλ₯Ό μƒμ„±ν•˜λŠ” 것이 더 λΉ λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€.

Multicore Programming

μ΄λ ‡κ²Œ λ©€ν‹°μ½”μ–΄ λ˜λŠ” λ©€ν‹°ν”„λ‘œμ„Έμ„œ μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•  λ•ŒλŠ” λ™μ‹œμ„±(Concurrency)와 병렬성(Parallelism)을 μ•Œμ•„μ•Ό ν•œλ‹€. λ™μ‹œμ„±μ€ μ‹±κΈ€ ν”„λ‘œμ„Έμ„œ μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©λ˜λŠ” λ°©μ‹μœΌλ‘œ, ν”„λ‘œμ„Έμ„œκ°€ μ—¬λŸ¬ 개의 μ“°λ ˆλ“œλ₯Ό λ²ˆκ°ˆμ•„κ°€λ©° μˆ˜ν–‰ν•¨μœΌλ‘œμ¨ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ 보이게 ν•˜λŠ” 방식이닀. 병렬성은 λ©€ν‹°μ½”μ–΄ μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©λ˜λŠ” λ°©μ‹μœΌλ‘œ, μ—¬λŸ¬ 개의 μ½”μ–΄κ°€ 각 μ“°λ ˆλ“œλ₯Ό λ™μ‹œμ— μˆ˜ν–‰ν•˜λŠ” 방식이닀.

User Threads and Kernel Threads

μœ μ € μ“°λ ˆλ“œλŠ” μ‚¬μš©μž μˆ˜μ€€μ˜ μ“°λ ˆλ“œ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ κ΄€λ¦¬ν•˜λŠ” μ“°λ ˆλ“œλ‹€. μ“°λ ˆλ“œ λΌμ΄λΈŒλŸ¬λ¦¬μ—λŠ” λŒ€ν‘œμ μœΌλ‘œ POSIX Pthreads, Win32 threads, Java threadsκ°€ μžˆλ‹€. 컀널 μ“°λ ˆλ“œλŠ” 컀널이 μ§€μ›ν•˜λŠ” μ“°λ ˆλ“œλ‹€. 컀널 μ“°λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆμ •μ μ΄μ§€λ§Œ μœ μ € λͺ¨λ“œμ—μ„œ 컀널 λͺ¨λ“œλ‘œ 계속 λ°”κΏ”μ€˜μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μ„±λŠ₯이 μ €ν•˜λœλ‹€. λ°˜λŒ€λ‘œ μœ μ € μ“°λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆμ •μ„±μ€ λ–¨μ–΄μ§€μ§€λ§Œ μ„±λŠ₯이 μ €ν•˜λ˜μ§€λŠ” μ•ŠλŠ”λ‹€.

Multithreading Models

μœ μ € μ“°λ ˆλ“œμ™€ 컀널 μ“°λ ˆλ“œμ˜ 관계λ₯Ό μ„€κ³„ν•˜λŠ” μ—¬λŸ¬κ°€μ§€ 망법이 μžˆλ‹€.

Many-to-One Model

ν•˜λ‚˜μ˜ 컀널 μ“°λ ˆλ“œμ— μ—¬λŸ¬ 개의 μœ μ € μ“°λ ˆλ“œλ₯Ό μ—°κ²°ν•˜λŠ” λͺ¨λΈμ΄λ‹€. ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μœ μ € μ“°λ ˆλ“œλ§Œ 컀널에 μ ‘κ·Όν•  수 있기 λ•Œλ¬Έμ— λ©€ν‹°μ½”μ–΄ μ‹œμŠ€ν…œμ—μ„œ 병렬적인 μˆ˜ν–‰μ„ ν•  μˆ˜κ°€ μ—†λ‹€. μš”μ¦˜μ—λŠ” 잘 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 방식이닀.

One-to-One Model

ν•˜λ‚˜μ˜ μœ μ € μ“°λ ˆλ“œμ— ν•˜λ‚˜μ˜ 컀널 μ“°λ ˆλ“œκ°€ λŒ€μ‘ν•˜λŠ” λͺ¨λΈμ΄λ‹€. λ™μ‹œμ„±μ„ λ†’μ—¬μ£Όκ³ , λ©€ν‹°ν”„λ‘œμ„Έμ„œ μ‹œμŠ€ν…œμ—μ„œλŠ” λ™μ‹œμ— μ—¬λŸ¬ μ“°λ ˆλ“œλ₯Ό μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€. μœ μ € μ“°λ ˆλ“œλ₯Ό 늘리면 컀널 μ“°λ ˆλ“œλ„ λ˜‘κ°™μ΄ λŠ˜μ–΄λ‚˜λŠ”λ°, 컀널 μ“°λ ˆλ“œλ₯Ό μƒμ„±ν•˜λŠ” 것은 μ˜€λ²„ν—€λ“œκ°€ 큰 μž‘μ—…μ΄κΈ° λ•Œλ¬Έμ— μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆλ‹€.

Many-to-Many Model

μ—¬λŸ¬ μœ μ € μ“°λ ˆλ“œμ— 더 μ κ±°λ‚˜ 같은 수의 컀널 μ“°λ ˆλ“œκ°€ λŒ€μ‘ν•˜λŠ” λͺ¨λΈμ΄λ‹€. μš΄μ˜μ²΄μ œλŠ” μΆ©λΆ„ν•œ 수의 컀널 μ“°λ ˆλ“œλ₯Ό λ§Œλ“€ 수 있으며, 컀널 μ“°λ ˆλ“œμ˜ ꡬ체적인 κ°œμˆ˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λ‚˜ μž‘λ™ 기기에 따라 λ‹€λ₯΄λ‹€. λ©€ν‹°ν”„λ‘œμ„Έμ„œ μ‹œμŠ€ν…œμ—μ„œλŠ” μ‹±κΈ€ν”„λ‘œμ„Έμ„œ μ‹œμŠ€ν…œλ³΄λ‹€ 더 λ§Žμ€ 컀널 μ“°λ ˆλ“œκ°€ λ§Œλ“€μ–΄μ§„λ‹€.

Two-level Model

Many-to-Many λͺ¨λΈκ³Ό λΉ„μŠ·ν•œλ°, νŠΉμ • μœ μ € μ“°λ ˆλ“œλ₯Ό μœ„ν•œ 컀널 μ“°λ ˆλ“œλ₯Ό λ”°λ‘œ μ œκ³΅ν•˜λŠ” λͺ¨λΈμ„ λ§ν•œλ‹€. 점유율이 λ†’μ•„μ•Ό ν•˜λŠ” μœ μ € μ“°λ ˆλ“œλ₯Ό 더 λΉ λ₯΄κ²Œ μ²˜λ¦¬ν•΄μ€„ 수 μžˆλ‹€.

Thread Pools

μ“°λ ˆλ“œλ₯Ό μš”μ²­ν•  λ•Œλ§ˆλ‹€ 맀번 μƒˆλ‘œμš΄ μ“°λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ³ , μˆ˜ν–‰ν•˜κ³ , μ§€μš°κ³ λ₯Ό λ°˜λ³΅ν•˜λ©΄ μ„±λŠ₯이 μ €ν•˜λœλ‹€. κ·Έλž˜μ„œ 미리 μ“°λ ˆλ“œ 풀에 μ—¬λŸ¬ 개의 μ“°λ ˆλ“œλ₯Ό λ§Œλ“€μ–΄λ‘κ³  μš”μ²­μ΄ 였면 μ“°λ ˆλ“œ ν’€μ—μ„œ μ“°λ ˆλ“œλ₯Ό ν• λ‹Ήν•΄μ£ΌλŠ” 방법을 μ‚¬μš©ν•œλ‹€.