νλ‘μΈμ€μ μ€λ λ
μ€λ λλ μΌλ ¨μ λͺ λ Ήμ μ§ν©μ μν΄ μ€νλλ νλ‘μΈμ€μμμ μ€ν λ¨μμ΄λ€.
μ¦, λͺ¨λ νλ‘μΈμ€λ μ¬μ€μ μ€λ λ λ΄μμ μ€νμ΄ λλ€κ³ μ΄ν΄ν μ μλ€. λν μ€λ λλ κ²½μ°μ λ°λΌμ μ¬λ¬ κ°κ° λμμ λ§λ€μ΄μ Έ μλ λͺ¨μ΅ λν κ°μ§ μ μλ€. μ΄λ₯Ό λ©ν° μ€λ λλΌκ³ νλ€.
리λ μ€ μ΄μ체μ λ μ΄λ¬ν μ€λ λλ₯Ό μ€λ λλΌκ³ λΆλ₯΄μ§ μκ³ , κ²½λ νλ‘μΈμ€(lightweight process)λΌκ³ λΆλ₯΄κΈ°λ νλ€.
νλ‘μΈμ€μ μ€λ λμ μμ
νλ‘μΈμ€λ _Code_, _Data_, _Stack_, _Register_ κ°λ€λ‘ μ΄λ£¨μ΄μ Έ μμΌλ©°, μ€λ λλ _Stack_κ³Ό PCB λ΄μ _Register_κ°λ€μ κ°μ§κ³ μλ€. μ΄λ₯Ό Thread Conrol Blockμ΄λΌκ³ νλ€. μ¦, κ°κ°μ μ€λ λλ λ³λμ _Stack_κ³Ό Tread Control Blockμ μ§λλ€.
μμ μ΄ν΄λ³Έ κ·Έλ¦Όμμ 보면 fileμ΄λΌλ κ²μ νλ‘μΈμ€κ° 곡ν΅μ μΌλ‘ κ°μ§μ μ μ μλλ°, μ¬κΈ°μ μ λ ₯ κ°μ μ μ₯νλ νμΌμΈ stdin, μΆλ ₯ κ°μ μ μ₯νλ νμΌμΈ stdout, μλ¬ λ¬Έκ΅¬λ₯Ό μ μ₯νλ νμΌμΈ stderrκ° μλ€.
νλμ νλ‘μΈμ€μ μνλ λͺ¨λ μ€λ λλ€μ μ μ λ³μμΈ _data_μμμ μ κ·Όν μ μλ€. νμ§λ§ κ°κ°μ μ€λ λμμ ν¨μλ₯Ό νΈμΆνλ€λ©΄ κ·Έ ν¨μμ λν΄μ μ€νμ κ°μ ΈμΌ νλλ°, λͺ¨λ μ€λ λκ° μ΄λ₯Ό 곡ν΅μΌλ‘ κ°μ§λ κ²μ λ§λ μ λλ€. νλμ ν¨μλ₯Ό νΈμΆν μνμμ λ€λ₯Έ μ€λ λλ‘ λμ΄κ° μ μκΈ° λλ¬Έμ΄λ€. κ·Έλμ κ°κ°μ μ€λ λκ° _stack_ μμμ λ³λλ‘ μ§λλ κ²μ΄λ€.
λν μ€λ λλ€μ μ€ν λμ€μ μ€λ λλ₯Ό λ³κ²½νλ Thread Switchκ° μΌμ΄λλλ°, μ΄ λλ¬Έμ μμ μ νμ¬ λ μ§μ€ν° κ°μ λν΄μ μ μ₯ν νμκ° μκΈ° λλ¬Έμ λ³λμ λ μ§μ€ν°λ₯Ό κ°μ§λ€. μ΄λ κ°μ§κ³ μλ λ μ§μ€ν°λ PCBκ° μλκ³ , ν΄λΉ PCBμ λ μ§μ€ν°μ ν΄λΉλλ λ©λͺ¨λ¦¬ 곡κ°λ§ λ³λλ‘ λ§λ€μ΄ μ μ₯νλ€.
μ€λ λμ μ₯μ
- μλ‘μ΄ νλ‘μΈμ€λ₯Ό λ§λλ κ²λ³΄λ¨, μλ‘μ΄ μ€λ λλ₯Ό λ§λλλ° μκ°μ΄ μ κ² λ λ€.(μμμ λ λ§λ€μ΄λ λκΈ° λλ¬Έμ΄λ€.)
- terminate νλλ° μκ°μ΄ λ λ λ€.
- κ°μ νλ‘μΈμ€ λ΄μμ Thread Switchκ° λΉ λ₯΄κ² μ΄λ£¨μ΄μ§λ€.
- μ€λ λ κ° ν΅μ μ μμ΄μ κ°μ νλ‘μΈμ€ κ° ν΅μ λ³΄λ€ λΉ λ₯΄λ€. κ°μ μμμ λΉ λ₯΄κ² 곡μ ν μ μκΈ° λλ¬Έμ΄λ€.
λ©ν° μ€λ λ(Multithreading)
OSκ° λ¨μΌ νλ‘μΈμ€μμ νλ νΉμ κ·Έ μ΄μμ μ€λ λλ₯Ό μ§μνλ κ²μ λ©ν° μ€λ λλΌκ³ νλ€.
μμ 보μ΄λ κ·Έλ¦Όμ²λΌ, νλμ νλ‘μΈμ€ μμ μ¬λ¬ μ€λ λκ° μ‘΄μ¬νλ κ²μ΄κ³ , κ° νλ‘μΈμ€ μμ μ€λ λλΌλ¦¬λ 곡μ λ°μ΄ν°λ₯Ό κ°μ§ μ μλ€.
λ°λλ‘, νλ‘μΈμ€ κ°μ ν΅μ μ μν΄μλ IPCλ₯Ό μ¬μ©ν΄μΌ νλ€.
UniProssesor, μ¦ CPUκ° νλμΈ μν©μμ Block λλ κ²μ μ΄ν΄λ³΄μ.
μμ κ°μ΄ νλ‘μΈμ€ μμ μ€λ λμμλ Running μνλ κ²ΉμΉμ§ μλλ€. μ΄λ CPUλ κ²°κ΅ νλμ΄κΈ° λλ¬Έμ΄λ©°, νλμ μ€λ λκ° Block λμμ λ λ€λ₯Έ μ€λ λκ° λμνλ λͺ¨μ΅μ λ³Ό μ μλ€.
μ¦, Thread Aμ Thread Bκ° Concurrent νκ² μ€νλλ κ²μ΄λ©° νλμ νλ‘μΈμ€μ μΌμ λ³΄λ€ ν¨μ¨μ μΌλ‘ μ²λ¦¬ν μ μλ€.
μ΄μ μ λ°°μ λ κ²μ λ³΅κΈ°ν΄ λ³΄μ. λ©ν°νλ‘κ·Έλλ°κ³Ό λ©ν° νλ‘μΈμ±μ μ°¨μ΄λ CPU κ°μμ μ°¨μ΄μ΄λ€.
λ©ν°νλ‘κ·Έλλ°μ CPUκ° νλμ΄κ³ , λ©ν° νλ‘μΈμ±μ λ κ° μ΄μμ΄λ€. λ°λΌμ, λ©ν°νλ‘κ·Έλλ°μ νλ‘μΈμ€κ° Concurrent νκ² λμνκ³ , λ©ν° νλ‘μΈμ±μ Parallel νκ² λμνλ€.
Non Concurrent Program
Concurrent νμ§ μμ Programμ μμλ₯Ό ν λ² μ΄ν΄λ³΄μ.
main( ) {
int data, transformed_data;
...
input_handling(data);
transformed_data = transforming(data);
output_handling(transformed_data); ...
}
input_handling(int a) { . . . }
transforming(int a) { . . . }
output_handling(int a) { . . . }
λ§μ½ _input_handling_ν¨μκ° νΈμΆλμ΄ I/O Interruptκ° λ°μνλ€κ³ νμ. κ·Έλ¬λ©΄ I/O μ λ ₯μ μ¬μ©μμκ²λ‘ λ°λ μκ° λμ κ·Έ μλμ μλ λ€λ₯Έ ν¨μλ€μ μ ν μΌμ νμ§ λͺ»νλ€. λ°λΌμ, Concurrent νμ§ λͺ»ν λμμ΄λ©° μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μ λ κ°μ§ λ°©λ²μ μκ°ν΄ λ³Ό μ μλ€.
1. Multiple Processes
첫 λ²μ§Έ λ°©λ²μ μ¬λ¬ κ°μ νλ‘μΈμ€λ₯Ό λλ λ°©λ²μ΄λ€. κ° ν¨μλ₯Ό νλμ νλ‘μΈμ€λ‘ λμ΄ μ²λ¦¬νλ©΄, νλμ νλ‘μΈμ€κ° Block μνκ° λλλΌλ μ€μΌμ₯΄λ§μ μν΄ λ€λ₯Έ νλ‘μΈμ€λ‘ CPUν λΉμ΄ μΌμ΄λ κ²μ΄λ€. μ΄λ¬ν νλ‘μΈμ€ κ°μ ν΅μ μ IPCλ₯Ό ν΅ν΄ μ²λ¦¬νλ€.
νμ§λ§, νλ‘μΈμ€λ₯Ό κ·Έλ§νΌ λ ν λΉν΄μΌ νλ―λ‘ μ»΄ν¨ν μμμ΄ λ λ€μ΄κ°λ€λ λ¨μ μ΄ μλ€.
2. Multiple Threads
λ λ²μ§Έ λ°©λ²μ μ¬λ¬ κ°μ Threadλ₯Ό λ§λλ κ²μ΄λ€. κ³΅μ© λ³μλ₯Ό ν΅ν΄ ν΅μ μ νλ©°, λ©ν° μ€λ λμ΄κΈ° λλ¬Έμ νλμ μ€λ λκ° Blcok λλλΌλ λ€λ₯Έ μ€λ λκ° μΌμ ν μ μλ€.
μ΄λ μ΄μ μ νλ‘μΈμ€λ₯Ό μ¬λ¬ κ° μ°λ λ°©μλ³΄λ€ λμ± λΉ λ₯΄λ€.
Shared Memory vs. Global Variable
λκ°μ΄ λ©λͺ¨λ¦¬λ₯Ό μ°Έμ‘°νλ κ²μ΄κΈ° λλ¬Έμ μ¬μ€ μ ν¬κ² μλ μ°¨μ΄λ μλ€. λ€λ§, Shared Memoryλ μ΄κΈ°μ μμ± μμ 컀λμ κ°μ μ΄ νμνλ―λ‘ κ±°μμ μλ μ°¨μ΄κ° λλ€.
User-Level Threads
User-Level Threadsλ λͺ¨λ μ€λ λ κ΄λ¦¬κ° μ€λ λ λΌμ΄λΈλ¬λ¦¬ λ±μ μ¬μ©νμ¬ μ ν리μΌμ΄μ μ μν΄ κ΄λ¦¬λλ κ²μ΄λ€. 컀λμ μ΄λ¬ν μ€λ λμ μ‘΄μ¬ μ¬λΆμ λν΄μλ μ λ°©λ²μ΄ μλ€. μ΄κ² μ‘°κΈ μ€μνλ°, κ·Έ μ΄μ λ νλμ μ€λ λκ° I/O Interruptκ° κ±Έλ € νλ‘μΈμ€κ° λμνμ§ λͺ»νλ€λ©΄, λ€λ₯Έ μ€λ λλ₯Ό ν΅ν΄μλ ν΄λΉ νλ‘μΈμ€λ λμν μ μκΈ° λλ¬Έμ΄λ€.
Kernel-Level Thread
Kernel-Level Threadλ Linuxμ Windowμμ Kernel Levelμ Threadλ₯Ό μ¬μ©νλ©°, νλ‘μΈμ€μ Threadμ λν Context μ 보λ₯Ό Kernelμμ κ°μ§κ³ μμμ λ§νλ€. λ°λΌμ, μ΄μ μ μ°λ¦¬κ° μ΄ν΄λ³΄μλ Concurrent νκ² λμνλ μ€λ λλ μ΄λ¬ν Kernel Levelμ Threadλ₯Ό μ¬μ©νλ€.
User-Level Thread μ₯/λ¨μ
- μ₯μ
- Kernel Level Threadλ³΄λ€ μ μ μ€λ²ν€λ
- μ€λ λμ μ€μΌμ€λ§ μκ³ λ¦¬μ¦μ΄ OS μ€μΌμ€λ§μ μν₯μ λ°μ§ μκ³ μ€κ³ν μ μλ€.
- μ΄λ OS μ΄λμ§ μκ΄μμ΄ μ¬μ©ν μ μλ€.
- λ¨μ
- νλμ Threadκ° Block λλ©΄ λͺ¨λ Threadκ° Block λλ€.
- λ©ν° μ€λ λ μ ν리μΌμ΄μ μ λ©ν° νλ‘μΈμ±μ μ΄μ μ μ»μ§ λͺ»νλ€.
μ€μ λ‘ User-Level Threadμ Kernel-Level Thread κ°μ μ€νμλλ κ½€ λ§μ΄ λλ€.
μ΄λ κ² μ°¨μ΄κ° λλ μ΄μ λ λκΉ? κ²°κ΅ Mode Change λλ¬Έμ΄λ€. Kernel Level Threadλ₯Ό λ§λ€κΈ° μν΄μ, νΉμ μ ννκΈ° μν΄μ Kernel Modeλ‘ Mode Changeλ₯Ό ν΄μΌ νλ€. κ±°κΈ°μ λ°μνλ μ€λ²ν€λκ° μμΌλ©° Mode Change λΏλ§μ΄ μλλΌ μ»€λμμ λΆκ°μ μΈ μμ λ€λ νκΈ° λλ¬Έμ κ²°κ³Όμ μΌλ‘ μ΄λ° μ°¨μ΄κ° λ°μνλ κ²μ΄λ€.
Linuxμμμ Thread
- _Clone()_ System Call νΈμΆ
- μμ task_struct ν λΉ.
- μμ task_structλ memory info tableμ 곡μ νκΈ° λλ¬Έμ codeμ data 곡μ
μ΄λ κ² λ§λ€μ΄μ§ κ²½λ νλ‘μΈμ€μΈ μ€λ λλ λΆλͺ¨ νλ‘μΈμ€μ²λΌ OSμ μν΄ μ€μΌμ€λ§λλ€.
'π Knowledge > μ΄μ체μ (OS)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μ΄μ체μ ] Testset μΈμ€νΈλμ (0) | 2024.04.06 |
---|---|
[μ΄μ체μ ] νλ‘μΈμ€ λκΈ°ν, Race Condition, Critical Section (0) | 2024.03.31 |
[μ΄μ체μ ] νλ‘μΈμ€μ μ’ λ£ (0) | 2024.03.23 |
[μ΄μ체μ ] 리λ μ€ λͺ λ Ήμ΄ μμ보기 (2) (0) | 2024.03.18 |
[μ΄μ체μ ] νλ‘μΈμ€ μ€μμΉ(Process Swtich) (0) | 2024.03.17 |