Context Switching - hochan222/Everything-in-JavaScript GitHub Wiki
์ Context Switching์ด ํ์ํ๊ฐ?
Computer๊ฐ ๋งค๋ฒ ํ๋์ Task๋ง ์ฒ๋ฆฌํ ์ ์๋ค๋ฉด?
- ํด๋น Task๊ฐ ๋๋ ๋๊น์ง ๋ค์ Task๋ ๊ธฐ๋ค๋ฆด ์ ๋ฐ์ ์์ต๋๋ค.
- ๋ํ ๋ฐ์์๋๊ฐ ๋งค์ฐ ๋๋ฆฌ๊ณ ์ฌ์ฉํ๊ธฐ ๋ถํธํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ค์ํ ์ฌ๋๋ค์ด ๋์์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ํ๊ธฐ ์ํด์ ?
- Computer multitasking์ ํตํด ๋น ๋ฅธ ๋ฐ์์๋๋ก ์๋ตํ ์ ์์ต๋๋ค.
- ๋น ๋ฅธ ์๋๋ก Task๋ฅผ ๋ฐ๊ฟ ๊ฐ๋ฉฐ ์คํํ๊ธฐ ๋๋ฌธ์ ์ฌ๋์ ๋์ผ๋ก ์ค์๊ฐ์ฒ๋ผ ๋ณด์ด๊ฒ ๋๋ ์ฅ์ ์ด ์์ต๋๋ค.
- CPU๊ฐ Task๋ฅผ ๋ฐ๊ฟ ๊ฐ๋ฉฐ ์คํํ๊ธฐ ์ํด Context Switching์ด ํ์ํ๊ฒ ๋์์ต๋๋ค.
Context Switching์ด๋?
- ํ์ฌ ์งํํ๊ณ ์๋ Task(Process, Thread)์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ค์ ์งํํ Task์ ์ํ ๊ฐ์ ์ฝ์ด ์ ์ฉํ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค.
- ๋ฉํฐํ๋ก์ธ์ค ํ๊ฒฝ์์ CPU๊ฐ ์ด๋ค ํ๋์ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ณ ์๋ ์ํ์์ ์ธํฐ๋ฝํธ ์์ฒญ์ ์ํด ๋ค์ ์ฐ์ ์์์ ํ๋ก์ธ์ค๊ฐ ์คํ๋์ด์ผ ํ ๋ ๊ธฐ์กด์ ํ๋ก์ธ์ค์ ์ํ ๋๋ ๋ ์ง์คํฐ ๊ฐ(Context)์ ์ ์ฅํ๊ณ CPU๊ฐ ๋ค์ ํ๋ก์ธ์ค๋ฅผ ์ํํ๋๋ก ์๋ก์ด ํ๋ก์ธ์ค์ ์ํ ๋๋ ๋ ์ง์คํฐ ๊ฐ(Context)๋ฅผ ๊ต์ฒดํ๋ ์์ ์ Context Switch(Context Switching)๋ผ๊ณ ํฉ๋๋ค.
์ด๋ป๊ฒ Context Switching์ ์งํ๋ ๊น์?
- Task์ ๋๋ถ๋ถ ์ ๋ณด๋ Register์ ์ ์ฅ๋๊ณ PCB(Process Control Block)๋ก ๊ด๋ฆฌ๋๊ณ ์์ต๋๋ค.
- ํ์ฌ ์คํํ๊ณ ์๋ Task์ PCB ์ ๋ณด๋ฅผ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค. (Process Stack, Ready Queue)
- ๋ค์ ์คํํ Task์ PCB ์ ๋ณด๋ฅผ ์ฝ์ด Register์ ์ ์ฌํ๊ณ CPU๊ฐ ์ด์ ์ ์งํํ๋ ๊ณผ์ ์ ์ฐ์์ ์ผ๋ก ์ํ์ ํ ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก Context Switching ๋ ํด๋น CPU๋ ์๋ฌด๋ฐ ์ผ์ ํ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ์ปจํ ์คํธ ์ค์์นญ์ด ์ฆ์์ง๋ฉด ์คํ๋ ค ์ค๋ฒํค๋๊ฐ ๋ฐ์ํด ํจ์จ(์ฑ๋ฅ)์ด ๋จ์ด์ง๋ค.
Process ์ Thread ๋ฅผ ์ฒ๋ฆฌํ๋ ContextSwitching ์ ์กฐ๊ธ ๋ค๋ฅธ๋ฐ, PCB๋ OS์ ์ํด ์ค์ผ์ค๋ง๋๋ Process Control Block์ด๊ณ , Thread ์ ๊ฒฝ์ฐ Process ๋ด์ TCB(Task Control Block) ๋ผ๋ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ํตํด ๊ด๋ฆฌ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ฉํฐ ํ๋ก์ธ์ค๋ฅผ ํตํด PCB๋ฅผ Context Switching ํ๋ ๊ฒ๋ณด๋ค ๋ฉํฐ ์ฐ๋ ๋๋ฅผ ํตํด TCB ๋ฅผ Context Switching ํ๋ ๋น์ฉ์ด ๋ ์ ๋ค๊ณ ์๋ ค์ ธ์๋ค.
PCB(Process Control block) ๊ตฌ์กฐ
- Process State : ํ๋ก์ธ์ค ์ํ(Create, Ready, Running, waiting, terminated)
- Program Counter : ๋ค์ ์คํํ ๋ช ๋ น์ด์ ์ฃผ์๊ฐ
- CPU Registers: accumulator, index register, stack pointers, general purpose registers.
- ํ๋ก์ธ์ค P0์ P1์ด ์กด์ฌํ ๋, P0๊ฐ CPU๋ฅผ ์ ์ ์ค(excuting)์ด์๊ณ P1์ด ๋๊ธฐ์ค(idle)์ด์๋ ์ํ์ด๋ค๊ฐ ์ผ๋งํ์๋ P1์ด ์คํ์ด ๋๊ณ P0๊ฐ ๋๊ธฐ๊ฐ ๋๋ ์ํ๊ฐ ์ฐพ์์จ๋ค.
- P0๊ฐ ์คํ์ค์์ ๋๊ธฐ๋ก ๋ณํ๊ฒ ๋ ๋๋ ์ง๊ธ๊น์ง ์์ ํด์ค๋ ๋ด์ฉ์ ๋ชจ๋ PCB์ ์ ์ฅํ๋ค.
- ์ฆ, P0๋ PCB์ ์ ์ฅํด์ผํ๊ณ P1์ด ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ PCB์์ ๊ฐ์ ธ์์ผํ๋ค.
- P0์ P1์ด ์๋ก ๋๊ธฐ<->์คํ์ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ํ๋ ๊ฒ์ ์ปจํ ์คํธ ์ค์์นญ์ด๋ผ๊ณ ํ๋ค.
์ปจํ ์คํธ ์ค์์นญ ์ธํฐ๋ฝํธ
์ปจํ ์คํธ ์ค์์นญ์ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ์ผ์ด๋๋ค.
- I/O interrupt
- CPU ์ฌ์ฉ์๊ฐ ๋ง๋ฃ
- ์์ ํ๋ก์ธ์ค Fork ๋ฑ๋ฑ์ด ์๋ค.
์ด๋ฌํ ์ปจํ
์คํธ ์ค์์นญ์ด ์ผ์ด๋ ๋ ๋ค์๋ฒ ํ๋ก์ธ์ค๋ ์ค์ผ์ค๋ฌ๊ฐ ๊ฒฐ์ ํ๊ฒ ๋๋ค.
์ฆ, ์ปจํ
์คํธ ์ค์์นญ์ ํ๋ ์ฃผ์ฒด๋ ์ค์ผ์ค๋ฌ์ด๋ค.
์ด์ ๋ธ๋ฆฌ์์
๋ค๋ฅธ ๋ํ๋์ ๋ฌธ์ ์ ์ brk(2) ์์คํ ํธ์ถ์ ์์ฃผํ๋ค๋๋ฐ ์๋ค. ์์คํ ํธ์ถ์ ๋ง์ ์๊ฐ์ด ์๋ชจ๋๋ ์์ ์ด๋ค. ์๋ํ๋ฉด ๋จ์ผํ ํ๋ก์ธ์ค์ mode ๋ณํ์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฑฐ์ ๋ชจ๋ kernel๋ ์ด์์ฒด์ ๋ฅผ ๋ณดํธํ๊ธฐ ์ํด์ user mode์ kernel mode๋ก ๋ชจ๋๋ฅผ ๋ถ๋ฆฌํด์ ํ์ํ ์ผ์ ํ๊ฒ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋งตํ, ํ์ผ์ด๊ธฐ/์ฐ๊ธฐ์ ๊ฐ์ ์ค์ํ ์ผ์, ํ๋ก์ธ์ค์๊ฒ ์ ์ ์ผ๋ก ๋งก๊ธธ๊ฒฝ์ฐ ์ฌ๊ฐํ ๋ณด์ ์ํ์ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ผ๋ก, ์์ ์ผ๋ค์ ํ๋ก์ธ์ค๊ฐ ์ปค๋์๊ฒ ์์ฒญํ๊ณ ์ปค๋์ด ์์ฒญ์ ๋ฐ์์ ์ํํ๋ ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค. ํ๋ก์ธ์ค๋ ํ์์์๋ user mode๋ก ์๋์ ํ๊ณ , ์ปค๋์ ์ด๋ค ์์ฒญ์ ํด์ผ ํ ๊ฒฝ์ฐ kernel mode๋ก ๋ณํ์ ํ๊ฒ ๋๊ณ , ์์ฒญํ ์ผ์ ๋๋์ ๊ฒฝ์ฐ ๋ค์ user mode๋ก ์๋ํ๊ฒ ๋๋ค. ์ด๋ฌํ ๋ชจ๋๋ณํ์ context switch๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค. ์ด๋ฌํ context switch๋ x86 ํ๋ก์ธ์ค์์ ๋งค์ฐ ๋๋ฆฌ๊ฒ ์ผ์ด๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ๋ฅํ๋ฉด context switch๊ฐ ์ผ์ด๋์ง ์๋๋ก ํด์ฃผ์ด์ผ ํ๋ค. brk(2)๋ ๋ฉ๋ชจ๋ฆฌ ๋งตํ ๊ด๋ จ์ผ์ ํ๋ ๊ฒ์ผ๋ก, user ๋ชจ๋์์๋ ํ์ํ ์์ ์ ์ํํ ์ ์์ผ๋ฉฐ, ๋๋ฌธ์ kernelmode๋ก context switch ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.