11. μ€λ λ μ£Όμ 곡κ°κ³Ό 컨ν μ€νΈ

μ€λ λμ μ£Όμ곡κ°μ μκ°λ³΄λ€ κ°λ¨νλ€.
νλ‘μΈμ€ μ£Όμ곡κ°μ κ·Έλλ‘ λλμ΄κ°μ§κ³ μλ€.
κΈ°μ‘΄ νλ‘μΈμ€μ μ½λ, λ°μ΄ν°, ν, μ€ν μμμ 곡μ μμμ΄λκ³ κ°λ³ μ€λ λλ§λ€ μ½λ μμ, λ°μ΄ν° μμ, μ€ν μμ, 컀λ μμμΌλ‘ λλμ΄ μ¬μ©λκ³ μλ€.
β» νλ‘μΈμ€μ μ€λ λλ μ μ¬νλ€λ κ²μ μ μ μλ€.
μ€λ λ μλͺ μ£ΌκΈ°
νλ‘μΈμ€μμ μ€λ λλ‘ λ°λμμΌλ μ μ¬ν κ²μ λΉμ°νλ€. κ·ΈλΌ νλ‘μΈμ€μμ μλ κ°λ λ€μ μ¬λ§νλ©΄ μ€λ λμλ μ μ©λλ€λ κ²μ μ κ²μ΄λ€. μ€λ λ λν μλͺ μ£ΌκΈ°κ° μλ€.
νλ‘μΈμ€λ NEW, Ready, Running, Blocked, Zombie, Out μνκ° μμλ€.
μ€λ λλ Ready, Running, Blocked, Terminated μνκ° μλ€. κ° μνμ λν κΈ°λ³Έμ μ΄ λ΄μ©μ νλ‘μΈμ€μ λμΌνλ€.
κ° κ° μ€νμ λκΈ°, μμ, μΈν°λ½νΈ λ° μμ€ν νΈμΆ, μ’ λ£ μνλ₯Ό μλ―Ένλ€.

pthread_create : μ€λ λμ μμ±λ fork()μ λ§μ°¬κ°μ§λ‘ λΆλͺ¨ μ€λ λκ° μμ μ€λ λλ₯Ό μμ±ν μ μλ€.
pthread_exit() - μ€λ λλ₯Ό μ’ λ£νλ€. mainμμ μ€νν κ²½μ° main μ€λ λλ§ μ’ λ£λλ€. νλ‘μΈμ€ μ’ λ£μ λ€λ₯΄λ€.
pthread_join() - λ€λ₯Έ μ€λ λκ° μ’ λ£ν λκΉμ§ λκΈ°νλ€. (λΆλͺ¨ μ€λ λ)
yield() - μ€λ λκ° μλ°μ μΌλ‘ λ€λ₯Έ μ€λ λλ₯Ό μ€ννλλ‘ μ보νλ€.
νλ‘μΈμ€λ TCBμ 컨ν μ€νΈ μ 보μ μ€λ λ μ 보, μ€μΌμ€λ§ μ 보 λ±μ΄ μ μ₯λλλ° μ»€λμ μν΄ κ΄λ¦¬λλ€.
νλ‘μΈμ€μ PCBμμ TCBκ° Linked Listλ‘ μ°κ²°λλ€ PCB -> TCB1 -> TCB2
μ€λ λλ μΈμ 컨ν μ€νΈ μ€μμΉμ΄ λ°μν κΉ?
Processμμλ Interruptλ SystemCallμ μν΄ νλ‘μΈμ€ μ€μΌμ€λ§μ λ³κ²½μ΄ μκΈΈ λ 컨ν μ€νΈ μ€μμΉμ΄ λ°μνλ€.
Threadλ λ§μ°¬κ°μ§λ€. μμ€ν νΈμΆμ΄λ Interrupt λλ TimeSliceκ° μμ§λ κ²½μ°μ 컨ν μ€νΈ μ€μμΉμ΄ λ°μνλ€.
λ€λ§ μ€λ λμμλ μΆκ°μ μΌλ‘ yield()μ κ°μ΄ μλ°μ μΌλ‘ λ€λ₯Έ μ€λ λμκ² μ보νλ μμ€ν νΈμΆμμλ 컨ν μ€νΈ μ€μμΉμ΄ λ°μν μ μλ€. ν¬κ² 보면 System νΈμΆ, Interrupt, TimeSlice μμ§μΈ κ²μ λμΌνλ€.
μ΄ λ, PCBμ 컨ν μ€νΈ μ€μμΉκ³Ό λμΌνκ² CPUμ μ€λ λ 컨ν μ€νΈλ₯Ό TCBμ μ μ₯νκ³ λ€μ λ§ν¬μ μλ TCBλ₯Ό CPUμ μ μ¬νλ€. TCBλ₯Ό μ μ¬νλ©΄μ SP λ μ§μ€ν°λ₯Ό ν΅ν΄ μ΄μ μ μ€λ¨λ μμΉμμ μ€νμ μ΄μ΄λκ° μ μλ€.
μ€λ λλ 컨ν μ€νΈ μ€μμΉμ μ€λ²ν€λκ° μμκΉ?
μ€λ λλ λ§μ°¬κ°μ§λ‘ 컨ν μ€νΈ μ€μμΉμ μ€λ²ν€λκ° λ°μνλ€.
컨ν μ€νΈ μ€μμΉμ CPU μμ μΌλ‘ λ§μ°¬κ°μ§λ‘ CPU μκ°μ΄ μλͺ¨λμ§λ§, νλμ νλ‘μΈμ€ λ©μ΄λ¦¬λ₯Ό 컨ν μ€νΈ μ€μμΉ ν νμκ° μμ΄μ‘μΌλ―λ‘ νλ‘μΈμ€μ λΉν΄ λ§μ΄ κ°λ²Όμμ‘λ€λ μ₯μ μ΄μλ€.
μ€λ²ν€λ λ°μμ λ κ°μ§ κ²½μ°
1. λμΌν νλ‘μΈμ€μμ λ€λ₯Έ μ€λ λλ‘ μ€μμΉ
μ΄ κ²½μ°, CPU 컨ν μ€νΈ μ 보λ₯Ό TCBμ μ μ₯νκ³ λ€μ μ€λ λμ TCB μ 보λ₯Ό CPUμ μ μ¬νλ μκ°μ΄ μλͺ¨λλ€.
λ, TCB 리μ€νΈμμ readyμΈμ§ blockμΈμ§ μνλ₯Ό μ²λ¦¬νκ³ Cacheκ° κ°λμ°Όμ κ²½μ°, 컨ν μ€νΈ μ€μμΉνλ Threadμ Cache Memoryλ₯Ό Flushνλλ° μΆκ°μ μΈ μκ°μ΄ μλͺ¨κ° λλ€.
2. λ€λ₯Έ νλ‘μΈμ€μ μ€λ λλ‘ μ€μμΉ
μ΄ κ²½μ°, νλ‘μΈμ€ 컨ν μ€νΈ μ€μμΉκ³Ό κ±°μ λμΌν μκ°μ΄ μλͺ¨λ κ²μ΄λ€.
λ€λ₯Έ νλ‘μΈμ€μ μ€λ λμ μ κ·Όνλ€λ κ²μ μ€λ λ 컨ν μ€νΈ μ΄μ μ νλ‘μΈμ€ 컨ν μ€νΈκ° λ°μνκΈ° λλ¬Έμ΄λ€. νμ§λ§ λ©ν° μ€λ λ OSμμλ μ€λ λλ₯Ό μ€μΌμ€ λ¨μλ‘ μ²λ¦¬νλ μ μ λͺ μνκ³ μμ΄μΌ νλ€.
νλ‘μΈμ€μ μ€λ λμ λν μ 리
- νλ‘μΈμ€λ μ€λ λλ€μ λν΄ μ μ₯ 곡κ°μ 곡μ νκ³ μλ€.
- νλ‘μΈμ€λ μ΄μ체μ κ° μμ©νλ‘κ·Έλ¨μ μ μ¬νλ λ¨μμ΄λ€.
- μ€λ λλ μ€ν λ¨μμ΄λ€.
- PCBλ νκ²½ 컨ν μ€νΈ(environment context)λΌ νκ³ TCBλ μ€ν 컨ν μ€νΈ(execution context)λΌκ³ νλ€.
- νλ‘μΈμ€μ μν λͺ¨λ μ€λ λκ° μ’ λ£λ λ νλ‘μΈμ€λ μ’ λ£λλ€.