DevLog ๐Ÿ“จ

[DevLog][PintOS] PRJ1 Threads/Scheduling Algorithms

cece00 2023. 10. 3. 03:42

Scheduling

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ•˜๋‚˜์˜ (๋˜๋Š” ๋ช‡ ๊ฐœ์˜) CPU๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ์–ด๋–ค ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ• ๊นŒ?

  1. ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ์ฒ˜๋ฆฌ๊ฐ€ ๋นจ๋ฆฌ ๋˜๋Š” ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  3. ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

1. ์Šค์ผ€์ค„๋ง์˜ ํ‰๊ฐ€

  • ๋ฐ˜ํ™˜ ์‹œ๊ฐ„: ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ์‹œ๊ฐ„ - ํ”„๋กœ์„ธ์Šค์˜ ๋„๋‹ฌ ์‹œ๊ฐ„
  • ์‘๋‹ต ์‹œ๊ฐ„: ํ”„๋กœ์„ธ์Šค์˜ ์‹œ์ž‘์‹œ๊ฐ„ - ํ”„๋กœ์„ธ์Šค์˜ ๋„๋‹ฌ ์‹œ๊ฐ„

์ผ๋ จ์˜ ์ž‘์—…๋“ค์ด ์ฒ˜๋ฆฌ๋  ๋•Œ, ํ‰๊ท ์ ์ธ ๋ฐ˜ํ™˜์‹œ๊ฐ„๊ณผ ์‘๋‹ต์‹œ๊ฐ„์ด ์ ์„์ˆ˜๋ก ์ข‹์€ ์Šค์ผ€์ค„๋ง์ด ๋˜๊ฒ ๋‹ค.

  • ์„ฑ๋Šฅ: n๊ฐœ์˜ ์ž‘์—…์„ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ์ฒ˜๋ฆฌํ•˜๋Š๋ƒ
  • ๊ณต์ •์„ฑ: ๊ฐ๊ฐ์˜ ์ž‘์—…์„ ์–ผ๋งˆ๋‚˜ ๊ท ๋“ฑํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š๋ƒ

์˜ˆ๋ฅผ ๋“ค์–ด ๋งŒ์•ฝ ์ž‘์—…์‹œ๊ฐ„์ด ๋น ๋ฅธ ์ˆœ์œผ๋กœ ์Šค์ผ€์ค„๋งํ•œ๋‹ค๋ฉด, ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์˜ ๊ฒฝ์šฐ ๊ทธ์ € ๋Œ€๊ธฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๊ฐ ์ž‘์—…์„ ๊ณต์ •ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. ์„ฑ๋Šฅ๊ณผ ๊ณต์ •์„ฑ์€ ์ผ๋ฐ˜์ ์ธ ์Šค์ผ€์ค„๋ง ์ •์ฑ…์—์„œ ์ถฉ๋Œํ•˜๋Š” ๋‘ ์ง€ํ‘œ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์–‘์ชฝ๊ฐ„์— ์ž˜ ๊ท ํ˜•์„ ์žก๋Š” ๊ฒƒ์ด ๋ฏธ์…˜์ด ๋œ๋‹ค. ์ด๋ฅผํ…Œ๋ฉด, ์ž‘์—…์ด ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ(aging)๋„ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ‘€ ์„ ์ ํ˜•/๋น„์„ ์ ํ˜• ์Šค์ผ€์ค„๋ง?

  • ์„ ์ ํ˜• preemptive: ์ž‘์—…์ด ์•„์ง ์ข…๋ฃŒ๋˜์ง€ ์•Š์•˜์–ด๋„ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ž‘์—…์œผ๋กœ context switch๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ.
    • ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋‚˜๋ฉด switch, ์‹œ๊ฐ„(time-slice, tick)์ด ์ง€๋‚˜๋„ switch
    • ํ˜„๋Œ€์˜ ๋ชจ๋“  ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์„ ์ ํ˜•์ด๋‹ค.
  • ๋น„์„ ์ ํ˜• non-preemtive: ์ž‘์—…์ด ํ•œ ๋ฒˆ ์‹œ์ž‘๋˜๊ณ  ๋‚˜๋ฉด, ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€๋Š” CPU์ ์œ ๋ฅผ ๋ณด์žฅํ•ด ์ฃผ๋Š” ๊ฒƒ.
    • ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋‚˜๊ฑฐ๋‚˜, ์ž‘์—…์ด ์ข…๋ฃŒ๋˜๋ฉด switch
    • ์˜ˆ์ „ ์ผ๊ด„์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์ด ์ด๋Ÿฐ ๊ฑธ ์ผ๋‹ค..

2. ์Šค์ผ€์ค„๋ง์˜ ๋ฐฉ๋ฒ•

2.1. General Scheduling Problems

2.1.1. ์„ ๋„์ฐฉ์„ ์ฒ˜๋ฆฌ First In First Served

๋นจ๋ฆฌ ๋“ค์–ด์˜จ ์ž‘์—…๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ์ž‘์—…์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์€ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ž‘์—… ์‹œ๊ฐ„์ด ์งง์€ ์—ฌ๋Ÿฌ ์ž‘์—…๋“ค์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด ๋ฒŒ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. (์ด๊ฒƒ์„ convoy effect๋ผ๊ณ  ํ•œ๋‹ค..๊ณ  ํ•œ๋‹ค.) ์ด ๊ฒฝ์šฐ ์ž‘์—…๋“ค์˜ ํ‰๊ท  ๋ฐ˜ํ™˜ ์‹œ๊ฐ„๊ณผ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚œ๋‹ค.

2.1.2. ์ตœ๋‹จ์ž‘์—…์šฐ์„  Shortest Job First

๊ฐ€์žฅ ์งง์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ชจ๋“  ์ž‘์—…๋“ค์ด ๋™์‹œ์— ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์— ๋“ค์–ด์˜ฌ ์ž‘์—…์ด ์งง๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ? (๋‹น์—ฐํžˆ ๋ชจ๋“  ์ž‘์—…์ด ๋™์‹œ์— ๋„์ฐฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด SJF๊ฐ€ ์ตœ์„ ์˜ ์„ ํƒ์ด ๋˜๊ฒ ๋‹ค.)

2.1.3. ์ตœ์†Œ์ž”์—ฌ์‹œ๊ฐ„์šฐ์„  Shortest Time-to-Completion First

์„ ์ ํ˜• ์•„์ด๋””์–ด๋ฅผ ๊ฒฐํ•ฉ์‹œํ‚จ๋‹ค. ์ฆ‰, ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ ์ž”์—ฌ์‹œ๊ฐ„์ด ์ƒˆ๋กœ ๋“ค์–ด์˜จ ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰์‹œ๊ฐ„๋ณด๋‹ค ๊ธธ๋ฉด ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ‘€ ์‘๋‹ต ์‹œ๊ฐ„์€ ์ƒˆ๋กœ์šด ํ‰๊ฐ€๊ธฐ์ค€์ด๋‹ค. ์™œ?

๋ฐ˜ํ™˜ ์‹œ๊ฐ„์€ ์‹œ์Šคํ…œ์ด ๋‚˜๋ฅผ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ์ฒ˜๋ฆฌํ•˜๋Š๋ƒ? ์‘๋‹ต ์‹œ๊ฐ„์€ ์‹œ์Šคํ…œ์ด ๋‚˜์—๊ฒŒ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ์‘๋‹ตํ•˜๋Š๋ƒ. I/O๊ฐ€ ์ค‘์š”ํ•ด์ง(ํ˜„๋Œ€์˜ ๋งŽ์€ ์‹œ์Šคํ…œ์ด ๋Œ€ํ™”ํ˜•)์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ์ด ์ฆ‰์‹œ ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ์Šค์ผ€์ค„๋ง ํ‰๊ฐ€ ๊ธฐ์ค€์ด ๋œ๋‹ค. ์‹œ๋ถ„ํ•  ์ปดํ“จํ„ฐ์˜ ๋“ฑ์žฅ์ด ๋น ๋ฅธ ์‘๋‹ต์‹œ๊ฐ„์˜ ์ค‘์š”์„ฑ์„ ๋†’์˜€๋Š”๋ฐ, ์ด๋Š” ์‹œ๋ถ„ํ•  ์ปดํ“จํ„ฐ๊ฐ€ ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ๋” ๋งŒ๋“ค์—ˆ๋‹ค๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค. ์‹œ๋ถ„ํ•  ์ด์ „์—๋Š” ์ผ๊ด„ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด์—ˆ๋Š”๋ฐ, ์ด๋Š” ์ž‘์—…์„ ํ์— ๋ชจ์•„๋‘๊ณ  ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋ฏ€๋กœ ์‚ฌ์šฉ์ž์˜ ๊ฐœ๋ณ„ ์ž…๋ ฅ๋งˆ๋‹ค ์ฆ‰์‹œ ์‘๋‹ต์„ ์ฃผ๊ธฐ ์–ด๋ ค์› ๋‹ค. ํ•˜์ง€๋งŒ ์‹œ๋ถ„ํ•  ์ปดํ“จํ„ฐ์˜ ๋“ฑ์žฅ์œผ๋กœ, ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด์„œ ์‚ฌ์šฉ์ž์™€์˜ ์‹ค์‹œ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค. (์‹œ๋ถ„ํ• ์‹œ์Šคํ…œ์˜ ๊ตฌ์กฐ์™€ ์›์น™ ์ž์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์™€์˜ ์‹ค์‹œ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.)

2.1.4. ๋ผ์šด๋“œ ๋กœ๋นˆ Round-Robin

์‘๋‹ต ์‹œ๊ฐ„์„ ๋†’์ด๋ ค๋ฉด, ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰ ์‹œ๊ฐ„๊ณผ ๊ด€๊ณ„์—†์ด ์ผ๋‹จ ๋“ค์–ด์˜ค๋ฉด ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค. ์ดํ›„ ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ์ค‘๋‹จ๋˜๋”๋ผ๋„. ๊ทธ๋ž˜์„œ ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ๋™์ผํ•œ ์‹œ๊ฐ„ ๋‹จ์œ„ (time-slice)๋กœ ๋‚˜๋ˆ ์„œ, ์ด ์‹œ๊ฐ„๋งŒํผ ์‹คํ–‰ํ•œ ํ›„ ์ค‘๋‹จํ•˜์—ฌ ์‹คํ–‰ ํ์˜ ๋งˆ์ง€๋ง‰์— ๋„ฃ๊ณ , ์‹คํ–‰ ํ์˜ ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋ผ์šด๋“œ ๋กœ๋นˆ (RR)์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋•Œ์˜ ์‹œ๊ฐ„ ๋‹จ์œ„๋ฅผ time-slice๋˜๋Š” ์Šค์ผ€์ค„๋ง ํ€€ํ…€ scheduling quantum์ด๋ผ๊ณ  ํ•œ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋„๋‹ฌํ•œ ๊ฒƒ ๋Œ€๋น„ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ์‹คํ–‰๋˜๋Š๋ƒ๊ฐ€ ์ค‘์š”ํ•˜๋ฏ€๋กœ, time-slice๊ฐ€ ์งง์„์ˆ˜๋ก ์‘๋‹ต์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๋Š”๋ฐ๋Š” ์ข‹๋‹ค. ํ•˜์ง€๋งŒ context switching์— ํ•„์š”ํ•œ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ท ํ˜•์„ ์ž˜ ์žก์•„์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋˜๋‹ค๋ฅธ ํ‰๊ฐ€ ๊ธฐ์ค€์ธ ๋ฐ˜ํ™˜ ์‹œ๊ฐ„์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ๋ผ์šด๋“œ ๋กœ๋นˆ์˜ ๊ฒฝ์šฐ ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰์‹œ๊ฐ„๊ณผ ๊ด€๊ณ„์—†์ด ๋™์ผํ•œ ๊ธธ์ด๋กœ ๋‚˜๋ˆ„๊ธฐ ๋–„๋ฌธ์— ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๊นŒ์ง€ ์‹œ๊ฐ„์ด ์ง€์—ฐ๋œ๋‹ค. (๋™์‹œ์— N๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋‹ค๋‹ค.. ์˜จ ์ตœ์•…์˜ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.) RR์€ ๊ณต์ •ํ•œ ์Šค์ผ€์ค„๋ง์ด๊ธด ํ•˜์ง€๋งŒ, ์ด๋กœ ์ธํ•ด ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ์€ ๋‚ฎ์•„์งˆ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ์“ฐ๊ธด ์“ด๋‹ค. (๋ฆฌ๋ˆ…์Šค์— ๊ด€๋ จ๊ฐ’์ด ์žˆ๋‹ค.)

๐Ÿ‘€ ๋ผ์šด๋“œ ๋กœ๋นˆ ํƒ€์ž„ ์Šฌ๋ผ์ด์Šค์˜ ๊ธธ์ด

๋‹ค์–‘ํ•œ ์ •์ฑ…์— ๋”ฐ๋ผ ๊ฒฐ์ •๋œ๋‹ค. ์ผ๋ จ์˜ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ ๋‹จ์œ„๋งˆ๋‹ค ๋‹ฌ๋ผ์งˆ ์ˆ˜๋„ ์žˆ๋‹ค. ์•„๋ž˜๋Š” ๋ฆฌ๋ˆ…์Šค์—์„œ ๊ธฐ๋ณธ ์„ค์ •๋œ ํƒ€์ž„ ์Šฌ๋ผ์ด์Šค ๊ฐ’์„ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด 2๊ฐœ. ํ•˜์ง€๋งŒ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ 100ms๋‹จ์œ„๋กœ ์Šฌ๋ผ์ด์‹ฑ์ด ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ํƒ€์ž„ ์Šฌ๋ผ์ด์Šค๋Š” ์‹คํ–‰์˜ ์ตœ๋Œ€์‹œ๊ฐ„์ž„์„ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค.)

cat /proc/sys/kernel/sched_rr_timeslice_ms
sysctl kernel.sched_rr_timeslice_ms

// 100

๐Ÿ‘€ I/O interrupt์˜ ์ฒ˜๋ฆฌ

ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ 10ms ์‹คํ–‰ ํ›„ I/O ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, ๊ทธ ์‹œ๊ฐ„์— CPU๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ์œ ํ•˜๋„๋ก ํ•˜์—ฌ ์—ฐ์‚ฐ์„ ์ค‘์ฒฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. CPU๊ฐ€ ๊ฒฐ์ฝ” ์‰ฌ์ง€ ์•Š๊ฒŒ ๋Œ์•„๊ฐ€๋„๋ก ํ•˜์—ฌ ์ด์šฉ๋ฅ ์„ ๋†’์ž„์œผ๋กœ์„œ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๐Ÿ‘€ ์š”์•ฝํ•˜์ž๋ฉด..

General Problems์—์„œ ์•Œ์•„๋ณธ ๋ฐฉ๋ฒ•๋“ค ์ค‘ SJF, STCF๋Š” ๋ฐ˜ํ™˜์‹œ๊ฐ„์„ ์šฐ์„ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์—ˆ๋‹ค. (FIFS๋Š” ์ œ์™ธํ•˜๊ณ ..) ํ•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค์˜ ์‘๋‹ต์‹œ๊ฐ„์ด ๋Šฆ์–ด์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋ฐ˜๋ฉด, RR์€ time-slicing์œผ๋กœ ์ธํ•ด ์ตœ์ดˆ๋กœ CPU๋ฅผ ์ ์œ ํ•˜๋Š” ์‹œ๊ฐ„์€ ์งง์•„์ง€์ง€๋งŒ, ๊ฒฐ๊ตญ ์ฒ˜๋ฆฌ๊นŒ์ง€ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์ด ์‚ฌ์ด๋ฅผ.. ์ž˜ ๊ท ํ˜•์„ ์žก์„ ์ˆ˜๋Š” ์—†์„๊นŒ? Time slicing์˜ ์žฅ์ ์„ ์‚ด๋ฆฌ๋ฉด์„œ๋„ ์Šค์ผ€์ค„๋ง์˜ ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜๋Š” ์—†์„๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๋ฌด์—‡๋ณด๋‹ค๋„, ๊ฐ ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์•Œ ์ˆ˜ ์—†๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์Šค์ผ€์ค„๋ง์„ ์ˆ˜ํ–‰ํ• ๊นŒ? ์˜ ๋ฌธ์ œ๊ฐ€ ๋‚จ์•„ ์žˆ๋‹ค. ์ด๋ฅผ Multi Level Feedback Queue๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

2.2. Multilevel Feedback Queue

์—ฌ๊ธฐ์—์„œ ์„ค๋ช…ํ•˜๋Š” mlfq๋Š” PintOS์˜ Advanced Scheduler๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฏ€๋กœ 4.4BSD Scheduler์™€ ์œ ์‚ฌ์ ์„ ๊ณต์œ ํ•œ๋‹ค.

2.2.1 What is mlfq?

mlfqs๋Š” CPU๋ฅผ ์ตœ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ผ์ข…์œผ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ง„๋‹ค.

  1. ํ”„๋กœ์„ธ์„œ์— ๋Œ€ํ•œ ์š”๊ตฌ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ (์šฐ์„ ์ˆœ์œ„์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ) ๊ฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ค€๋น„ ํ๋กœ ๋‚˜๋ˆˆ๋‹ค.
  2. ์งง์€ CPU burst๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์šฐ์„ ํ•œ๋‹ค.
  3. ๋†’์€ I/O burst๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์šฐ์„ ํ•œ๋‹ค.

multilevel queue ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ดˆ๊ธฐ ์šฐ์„ ์ˆœ์œ„๋Œ€๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐ˜๋ฉด, multilevel feedback queue ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ•˜๋‚˜์˜ ํ์—์„œ ๋‹ค๋ฅธ ํ๋กœ ์˜ฎ๊ธด๋‹ค. ์ฆ‰, ์Šค์ผ€์ค„๋ง ์ค‘์— ์šฐ์„ ์ˆœ์œ„์˜ ๋ณ€๋™์ด ์ผ์–ด๋‚œ๋‹ค.

  1. ํ”„๋กœ์„ธ์Šค๊ฐ€ CPU๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์“ฐ๋ฉด, ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„์˜ ํ๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค.
  2. ํ”„๋กœ์„ธ์Šค๊ฐ€ I/O-bound์ด๊ฑฐ๋‚˜, interactiveํ•˜๋ฉด ๋†’์€ ์šฐ์„ ์ˆœ์œ„์˜ ํ๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค.
  3. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„์˜ ํ์—์„œ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ธฐ์•„(starvation)๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ๋†’์€ ์šฐ์„ ์ˆœ์œ„์˜ ํ๋กœ aging๋œ๋‹ค.

๐Ÿ‘€ I/O bound? ํ•˜๋‚˜์˜ ๊ณ„์‚ฐ์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด input๊ณผ output์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋Š” ์กฐ๊ฑด. ๋ฐ์ดํ„ฐ๊ฐ€ ์š”์ฒญ๋˜๋Š” ์†๋„๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์†Œ๋น„๋˜๋Š” ์†๋„๋ณด๋‹ค ๋Š๋ฆด ๋•Œ ์ด๋Ÿฌํ•œ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค. (opps. CPU bound)

mlfq๋Š” ์œ„์—์„œ ์ œ๊ธฐํ•œ ์ž‘์—…์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์•Œ ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์—์„œ, ์‘๋‹ต ์‹œ๊ฐ„๊ณผ ๋ฐ˜ํ™˜ ์‹œ๊ฐ„์„ ์–ด๋–ป๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ? ๋ผ๋Š” ๋ฌธ์ œ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ต์„ ์ œ์‹œํ•œ๋‹ค.

  1. ๋ชจ๋“  ์ž‘์—…์ด ์ตœ์ดˆ๋กœ ์‹คํ–‰๋  ๋•Œ๋Š” ์ผ๋‹จ ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋กœ ์„ธํŒ…๋˜๊ณ , ํƒ€์ž„ ์Šฌ๋ผ์ด์Šค ๋‚ด์—์„œ CPU๋ฅผ ์ ์œ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์•„์ง„๋‹ค. ๋”ฐ๋ผ์„œ, ์‹คํ–‰ ์‹œ๊ฐ„์ด ์งง์€ ์ž‘์—…์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์–ป๊ณ  ์ฒ˜๋ฆฌ๋œ๋‹ค. ์ฆ‰, SJF์™€ ์œ ์‚ฌํ•œ ํšจ๊ณผ๋ฅผ ๋ณด์ด๊ฒŒ ๋œ๋‹ค.
  2. I/O๋‚˜ ์งง์€ ์ž‘์—…, ์ฆ‰ ํƒ€์ž„ ์Šฌ๋ผ์ด์Šค๋ณด๋‹ค ์งง๊ฒŒ ์‹คํ–‰๋˜๊ณ  (์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜) CPU๋ฅผ ์–‘๋„ํ•˜๋Š” ์ž‘์—…์˜ ๊ฒฝ์šฐ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์œ ์ง€ํ•˜๊ณ , ์ด๋กœ ์ธํ•ด ๋ฐ˜๋ณต์ ์œผ๋กœ I/O๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ๊ฒฝ์šฐ์—๋Š” ๋น ๋ฅธ ์‘๋‹ต ์‹œ๊ฐ„์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค.
    => ๋”ฐ๋ผ์„œ mlfq๋Š” ์งง์€ ์ž‘์—…๊ณผ I/O bound๋ฅผ ์šฐ์„ ํ•œ๋‹ค๋Š” ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•œ๋‹ค.
  3. ๋”ํ•˜์—ฌ, ๋Œ€๊ธฐ ํ์—์„œ ์˜ค๋ž˜ ๋Œ€๊ธฐํ•˜๋Š” ์ž‘์—…, ์ฆ‰ ์ตœ๊ทผ์— cpu๋ฅผ ํ• ๋‹น๋ฐ›์ง€ ๋ชปํ•œ ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋™์ ์œผ๋กœ ๋†’์—ฌ์คŒ์œผ๋กœ์„œ ๊ธฐ์•„ starvation์„ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ž‘์—…๋“ค์ด ์ตœ๋Œ€ํ•œ ๊ณต์ •ํ•˜๊ฒŒ CPU๋ฅผ ์ ์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. (๊ณต์ •์„ฑ๊ณผ ์†๋„ ์‚ฌ์ด์˜ ๊ท ํ˜•)

2.2.2. How to implement mlfq

์•„๋ž˜์™€ ๊ฐ™์€ ์š”์†Œ์— ์˜ํ•ด mlfqs์˜ ๊ตฌํ˜„์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

  • ํ์˜ ๊ฐœ์ˆ˜๋Š” ๋ช‡ ๊ฐœ๋กœ ํ•ด์•ผ ํ• ๊นŒ?
  • ํ•˜๋‚˜์˜ ํ์—์„œ์˜ ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜ (FIFO๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ์Œ)์€ ์–ด๋•Œ์•ผ ํ• ๊นŒ?
  • ํ ๋‹น ํƒ€์ž„ ์Šฌ๋ผ์ด์Šค์˜ ํฌ๊ธฐ๋Š” ์–ด๋•Œ์•ผ ํ• ๊นŒ?
  • ํ”„๋กœ์„ธ์Šค์˜ ์šฐ์„ ์ˆœ์œ„ (ํ)๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ฃผ๊ธฐ๋Š” ์–ธ์ œ์—ฌ์•ผ ํ• ๊นŒ?
    ...

์—ฌ๋Ÿฌ ์Ÿ์ ๋“ค์ด ๋‚จ์•„ ์žˆ๋‹ค. ๊ทธ ์ค‘, pintos์—์„œ ์ œ์•ˆํ•˜๋Š” 4.4BSD ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” cpu ์‹œ๊ฐ„์˜ ์ง€์ˆ˜ ๊ฐ€์ค‘ ์ด๋™ ํ‰๊ท ๊ณผ ๊ฐ™์€ ๊ฐ’์„ ์‚ฌ์šฉํ•ด ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์žฌ๊ณ„์‚ฐํ•œ๋‹ค.

nice

nice๋Š” ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์ œ์–ดํ•˜๋Š” ๊ฐ’์œผ๋กœ, -20๋ถ€ํ„ฐ 20๊นŒ์ง€์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ–๋Š”๋‹ค. ๊ฐ’์ด ๋‚ฎ์„์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋†’๊ฒŒ ์กฐ์œจํ•œ๋‹ค. (๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—๊ฒŒ CPU๋ฅผ ์–‘๋ณดํ• ์ˆ˜๋ก niceํ•ด์„œ ๋ถ™์€ ์ด๋ฆ„์ธ ๊ฒƒ ๊ฐ™๋‹ค.) OSTEP์—์„œ๋Š” ์šด์˜์ฒด์ œ์—๊ฒŒ ์–ด๋–ค ์ž‘์—…์„ ์šฐ์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋กœ์„œ nice๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

priority

์šฐ์„ ์ˆœ์œ„๋Š” nice, recent_cpu์— ์ง์ ‘์ ์œผ๋กœ ์˜์กดํ•˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ํฌ์ธํŠธ๋Š” (์‚ฌ์šฉ์ž์— ์˜ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ œ์–ด๋˜๋Š” nice๋ฅผ ์ œ์™ธํ•œ๋‹ค๋ฉด) recent_cpu๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์•„์ง„๋‹ค๋Š” ์ ์ด๋‹ค. ์ฆ‰, ์ตœ๊ทผ๊นŒ์ง€ CPU๋ฅผ ํ• ๋‹น๋ฐ›์ง€ ์•Š์•˜๋˜ ์Šค๋ ˆ๋“œ์ผ์ˆ˜๋ก ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

priority = PRI_MAX - (recent_cpu / 4) - (nice*2)

recent_cpu

recent_cpu๋Š” ์ž‘์—…์ด ์ตœ๊ทผ ์ ์œ ํ–ˆ๋˜ CPU์˜ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋งค tick๋งˆ๋‹ค ํ˜„์žฌ ์ž‘์—…์˜ recent_cpu๊ฐ€ 1์”ฉ ์ฆ๊ฐ€ํ•˜๊ณ , ๋งค ์ดˆ๋งˆ๋‹ค ๋‹ค์Œ ๊ณต์‹์„ ์ด์šฉํ•ด ์ดˆ๊ธฐํ™”๋œ๋‹ค.

recent_cpu = (load_avg * 2) / (load_avg * 2 + 1) * recent_cpu + nice

์œ„ ๊ณต์‹์€ ์ตœ๊ทผ์— ์„ธํŒ…๋œ recent_cpu ๊ฐ’์— ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•˜๋ฉด์„œ, ์ตœ๊ทผ์— ์ ์œ ํ•œ cpu ์‚ฌ์šฉ๋ฅ ์„ ๊ณ„์‚ฐํ•œ๋‹ค. (์—ญ์‹œ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ œ์–ด๋  ์ˆ˜ ์žˆ๋Š” nice๊ฐ’์„ ์ œ์™ธํ•˜๊ณ ) ๋‹จ์ผ ์ž‘์—…์˜ recent_cpu๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž. (๋‹จ์ผ์ด๋ฏ€๋กœ load_avg = 1.0)

ํ•˜๋‚˜์˜ ์ž‘์—…์ด ๋งค $i$ ์ดˆ๋งˆ๋‹ค ๋ˆ„์ ํ•œ tick์„ $T_i$๋ผ๊ณ  ํ•˜์ž.

$rc_1 = 0.66 \times T_0$

$rc_2 = 0.66 \times (T_1 + rc_1) = 0.66 \times T_1 + 0.44 *\times T_0$

$rc_3 = 0.66 \times (T_1 + rc_2) = 0.66 \times T_2 + 0.44 *\times T_1 + 0.30 \times T_0$

$rc_4 = 0.66 \times T_3 + \cdots + 0.19 \times T_0$

์ด๋Ÿฐ ์‹์œผ๋กœ ์ด์ „ ์‹œ๊ฐ„์— ๋ˆ„์ ๋œ tick์„ ๊ฐ์‡ ์‹œํ‚จ๋‹ค. ์ฆ‰, ์ตœ๊ทผ์— ๋ˆ„์ ๋œ tick (CPU ์ ์œ  ์‹œ๊ฐ„)์— ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•ด CPU ์‚ฌ์šฉ๋ฅ ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ, ์ตœ๊ทผ์— CPU ํ• ๋‹น์„ ๋ชป ๋ฐ›์€ ์ž‘์—…์ผ์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋†’์—ฌ์ฃผ๋Š” aging์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์•„๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค.

load_avg

1๋ถ„ ๋™์•ˆ ready ๋˜๋Š” running์ธ ์ž‘์—…์˜ ์ถ”์ •์น˜์ด๋‹ค.

load_avg = (59/60) * load_avg + (1/60) * ready_threads,

priority๋Š” nice์™€ recent_cpu์— ์˜์กดํ•˜๊ณ , recent_cpu๋Š” nice์™€ load_avg๊ฐ’์— ์˜์กดํ•œ๋‹ค. load_avg๋Š” ํ˜„์žฌ ์‹คํ–‰ ๋˜๋Š” ๋Œ€๊ธฐ์ค‘์ธ ์ž‘์—…์˜ ์ˆ˜์— ์˜์กดํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๊ธฐ์—ด์— ์žˆ๋Š” ์ž‘์—…์ด ๋งŽ์„์ˆ˜๋ก, ์ฆ‰ CPU๋ฅผ ์ ์œ ํ•˜๋ ค๋Š” ๊ฒฝ์Ÿ์ด ๋†’์„์ˆ˜๋ก recent_cpu์˜ ๊ณ„์ˆ˜๊ฐ€ ์ปค์ ธ์„œ ๋” ๋น ๋ฅด๊ฒŒ ๊ฐ์‡ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋” ํฐ ํญ์œผ๋กœ ๋ณ€๋™์‹œ์ผœ ๋” ๋งŽ์€ ์ž‘์—…์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.