๐Ÿ“Œ ์Šค์ผ€์ค„๋Ÿฌ(Scheduler)

2 minute read

์Šค์ผ€์ค„๋Ÿฌ(Scheduler)

  • Long Term Scheduler(์žฅ๊ธฐ ์Šค์ผ€์ค„๋Ÿฌ or job scheduler)
    • ์‹œ์ž‘ ํ”„๋กœ์„ธ์Šค ์ค‘ ์–ด๋–ค ๊ฒƒ๋“ค์„ ready queue์— ๋ณด๋‚ผ์ง€ ๊ฒฐ์ •
    • ํ”„๋กœ์„ธ์Šค์— memory(๋ฐ ๊ฐ์ข… ์ž์›)์„ ์ฃผ๋Š” ๋ฌธ์ œ
    • degree of multipramming์„ ์ œ์–ด (๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ„ ํ”„๋กœ๊ทธ๋žจ์ด ๋ช‡๊ฐœ๋ƒ??!!)
    • time sharing system์—๋Š” ๋ณดํ†ต ์žฅ๊ธฐ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์—†์Œ (๋ฌด์กฐ๊ฑด ready)
  • Short Term Scheduler(๋‹จ๊ธฐ ์Šค์ผ€์ค„๋Ÿฌ or CPU Scheduler)
    • ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค์Œ๋ฒˆ์— running ํ• ๊ฑด์ง€ ๊ฒฐ์ •
    • ํ”„๋กœ์„ธ์Šค์— CPU๋ฅผ ์ฃผ๋Š” ๋ฌธ์ œ
    • ์ถฉ๋ถ„ํžˆ ๋นจ๋ผ์•ผ ํ•จ(millisecond ๋‹จ์œ„)
  • Medium Term Scheduler(์ค‘๊ธฐ ์Šค์ผ€์ค„๋Ÿฌ or Swapper) ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋ถ€์กฑํ•  ๋•Œ ์–˜๊ฐ€ ์ผํ•จ.
    • ์—ฌ์œ  ๊ณต๊ฐ„์„ ๋งˆ๋ จํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ต์งธ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋””์Šคํฌ๋กœ ์ซ“์•„๋ƒ„. (๋ชจ๋“  ํ”„๋กœ๋ ˆ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์˜ค๋ฉด ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋ผ ์ผ๋ถ€๋ฅผ ์ซ“์•„๋‚ด๋Š”๊ฒŒ ํšจ๊ณผ์ ์ž„.)
    • ํ”„๋กœ์„ธ์Šค์—์„œ memory๋ฅผ ๋บ๋Š” ๋ฌธ์ œ
    • degree of multiprogramming์„ ์ œ์–ด

ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ

  • Running
    • CPU๋ฅผ ์žก๊ณ  instruction์„ ์ˆ˜ํ–‰์ค‘์ธ ์ƒํƒœ
  • Ready
    • CPU๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ(๋ฉ”๋ชจ๋ฆฌ ๋“ฑ ๋‹ค๋ฅธ ๋ชจ๋“  ์กฐ๊ฑด์„ ๋งŒ์กฑํ•จ)
  • Blocked (Wait, Sleep)
    • I/O ๋“ฑ์˜ ์ด๋ฒคํŠธ(event)๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ
    • (์˜ˆ) ๋””์Šคํฌ์—์„œ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์™€์•ผํ•˜๋Š” ๊ฒฝ์šฐ
  • Suspended
    • ์™ธ๋ถ€์ ์ธ ์ด์œ ๋กœ ํ”„๋กœ์„ธ์Šค์˜ ์ˆ˜ํ–‰์ด ์ •์ง€๋œ ์ƒํƒœ
    • ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ต์งธ๋กœ ์™ธ๋ถ€๋กœ Swap out ๋œ๋‹ค.
    • (์˜ˆ) ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ์ผ์‹œ ์ •์ง€ ์‹œํ‚จ ๊ฒฝ์šฐ (break key) ์‹œ์Šคํ…œ์ด ์—ฌ๋Ÿฌ ์ด์œ ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž ์‹œ ์ค‘๋‹จ ์‹œํ‚ด(๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ํ”„๋กœ์„ธ์Šค์‚ฌ ์˜ฌ๋ผ์™€ ์žˆ์„ ๋•Œ)

blocked: ์ž์‹ ์ด ์š”์ฒญํ•œ event๊ฐ€ ๋งŒ์กฑ๋˜๋ฉด ready

Suspened: ์™ธ๋ถ€์—์„œ resumeํ•ด ์ฃผ์–ด์•ผ Active๋จ.

  • suspended๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ blocked์™€ ready ์ƒํƒœ์—์„œ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์— ๋”ฐ๋ผ 2๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„ํ•จ.
  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ suspended ready์˜ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ต์งธ๋กœ ๋นผ์•—๊ฒผ๊ธฐ ๋•Œ๋ฌธ์— CPU ์ž‘์—…์€ ์ผ์ ˆํ•  ์ˆ˜ ์—†์Œ.
  • ๊ทธ์น˜๋งŒ suspended blocked์˜ ๊ฒฝ์šฐ I/O ์ž‘์—…์„ ํ•˜๋‹ค๊ฐ€ suspended๊ฐ€ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ž‘์—…์€ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Œ.
  • Swap out์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ชจ๋‘ ์ซ“๊ฒจ๋‚˜๋Š” ๊ฒƒ, Swap in์€ ๋‹ค์‹œ ๋“ค์–ด์˜ค๋Š” ๊ฒƒ
  • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž๊ธฐ ํ”„๋กœ์„ธ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰์ค‘์ด๋ฉด user mode running์ด๋ผ๊ณ  ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด kernel, monitor(์šด์˜์ฒด์ œ์— ๋Œ€์‹  ์š”์ฒญํ•ด์„œ ํ•˜๋Š” ๊ฒฝ์šฐ) mode runnig

Thread

๋™์ผํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋œ๋‹ค๊ณ  ํ•˜๋ฉด, ๊ฐ๊ฐ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฐœ๋…์ž„. ๊ทผ๋ฐ ๋น„ํšจ์œจ์ ์ด์ง€ ์•Š์Œ ์™œ๋ƒํ•˜๋ฉด, ์ฝ”๋“œ์˜ ์–ด๋””๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ด๋ฅผ ๊ธฐ๋กํ•จ. ์ฆ‰ CPU ์ˆ˜ํ–‰๋‹จ์œ„๋ฅผ ๋”ฐ๋กœ ๊ธฐ์–ตํ•˜๋Š” ํ˜•ํƒœ. ๊ทธ๋ž˜์„œ ์ด ๋ถ€๋ถ„์„ ์ œ์™ธํ•œ ๊ฒƒ์€ ๋‹จ์ผ ํ”„๋กœ๋ ˆ์Šค๋กœ shareํ•˜๊ณ  ์žˆ์Œ. ์ด๋ž˜์„œ ํšจ์œจ์ ์ธ ๊ฒƒ์ž„.

์ •์˜: โ€œA thread or (lightweight process) is a basic unit of CPU utilizationโ€

  • thread์˜ ๊ตฌ์„ฑ
    • program couter
    • register set
    • stack space
  • Thread๊ฐ€ ๋™๋ฃŒ Thread์™€ ๊ณต์œ ํ•˜๋Š” ๋ถ€๋ถ„(=Task)
    • code section
    • Data section
    • OS rssource
  • ์ „ํ†ต์ ์ธ ๊ฐœ๋…์˜ heavyweight process๋Š” ํ•˜๋‚˜์˜ thread๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Task๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์žฅ์ 

  • ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ํƒœ์Šคํฌ ๊ตฌ์กฐ์—์„œ๋Š” ํ•˜๋‚˜์˜ ์„œ๋ฒ„ ์Šค๋ ˆ๋“œ๊ฐ€ blocked ์ƒํƒœ์ธ ๋™์•ˆ์—๋„ ํƒœ์Šคํฌ ๋‚ด์˜ ๋‹ค๋ฅธ ์Šค๋ž˜๋“œ๊ฐ€ ์‹คํ–‰(running)๋˜์–ด ๋น ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋™์ผํ•œ ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๊ฐ€ ํ˜‘๋ ฅํ•˜์—ฌ ๋†’์€ ์ฒ˜๋ฆฌ์œจ(throughtput)๊ณผ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ‘๋ ฌ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ

  • ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ
  • ํ”„๋กœ์„ธ์Šค์˜ ํŠธ๋ฆฌํ˜•์„ฑ
  • ํ”„๋กœ์„ธ์Šค๋Š” ์ž์›์„ ํ•„์š”๋กœ ํ•จ
    • ์šด์˜์ฒด์ œ๋กœ ๋ฐ›๋Š”๋‹ค
    • ๋ถ€๋ชจ์™€ ๊ณต์œ ํ•œ๋‹ค.
  • ์ž์›์˜ ๊ณต์œ 
    • ๋ถ€๋ชจ์™€ ์ž์‹์ด ๋ชจ๋“  ์ž์›์„ ๊ณต์œ ํ•˜๋Š” ๋ชจ๋ธ
    • ์ผ๋ถ€๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ชจ๋ธ
    • ์ „ํ˜€ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋ธ
  • ์ˆ˜ํ–‰
    • ๋ถ€๋ชจ์™€ ์ž์‹์ด ๊ณต์กดํ•˜๋ฉฐ ์ˆ˜ํ–‰๋˜๋Š” ๋ชจ๋ธ
    • ์ž์‹์ด ์ข…๋ฃŒ(terminate)๋  ๋•Œ๊ฐ€์ง€ ๋ถ€๋ชจ๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๋Š”(wait, blocked) ๋ชจ๋ธ
  • ์ฃผ์†Œ ๊ณต๊ฐ„
    • ์ž์‹์€ ๋ถ€๋ชจ์˜ ๊ณต๊ฐ„์„ ๋ณต์‚ฌํ•จ
    • ์ž์‹์€ ๊ทธ ๊ณต๊ฐ„์— ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์˜ฌ๋ฆผ
  • ์œ ๋‹‰์Šค์˜ ์˜ˆ
    • Fork() ์‹œ์Šคํ…œ ์ฝœ์ด ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑ
      • ๋ถ€๋ชจ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ (OS data except PID + binery)
      • ์ฃผ์†Œ ํ• ๋‹น
    • Fork() ๋‹ค์Œ์— ์ด๋Ÿฌ์ง€๋Š” exec() ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆผ

ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ

  • ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋งˆ์ง€๋ง‰ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ ์ด๋ฅผ ์šด์˜์ฒด์ œ์—๊ฒŒ ์•Œ๋ ค์คŒ
    • ์ž์‹์ด ๋ถ€๋ชจ์—๊ฒŒ outputData๋ฅผ ๋ณด๋ƒ„ (via wait)
    • ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ์ข… ์ž์›๋“ค์ด ์šด์˜์ฒด์ œ๊ฒŒ๊ฒŒ ๋ฐ˜๋‚ฉ๋จ
  • ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹์˜ ์ˆ˜ํ–‰์„ ์ข…๋ฃŒ์‹œํ‚ด (abort)
    • ์ž์‹์ด ํ• ๋‹น ์ž์›์˜ ํ•œ๊ณ„์น˜๋ฅผ ๋„˜๋Š” ๊ฒฝ์šฐ
    • ์ž์‹์—๊ฒŒ ํ• ๋‹น๋œ ํƒœ์Šคํฌ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
    • ๋ถ€๋ชจ๊ฐ€ ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ
      • ์šด์˜์ฒด์ œ๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ˆ˜ํ–‰๋˜๋„๋ก ๋‘์ง€ ์•Š๋Š”๋‹ค.
      • ๋‹จ๊ณ„์ ์ธ ์ข…๋ฃŒ(๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ๊ผญ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค ์ฃฝ์ด๊ณ  ์ฃฝ๋Š”๋‹ค.)