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์ด ์„œ๋กœ ๋Œ€๊ธฐ<->์‹คํ–‰์„ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ํ•˜๋Š” ๊ฒƒ์„ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ์ธํ„ฐ๋ŸฝํŠธ

์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์ผ์–ด๋‚œ๋‹ค.

  1. I/O interrupt
  2. CPU ์‚ฌ์šฉ์‹œ๊ฐ„ ๋งŒ๋ฃŒ
  3. ์ž์‹ ํ”„๋กœ์„ธ์Šค 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 ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.