๐Ÿ‘จโ€๐Ÿ’ป Seungineer's GitHub Contribution

๐Ÿงญ KAIST JUNGLE/Pintos

[PintOS] Thread - Priority Scheduling (Project 1, WIL)

seungineer = seungwoo + engineer 2024. 5. 2. 07:35

๋“ค์–ด๊ฐ€๊ธฐ ์ „์—

์šด์˜์ฒด์ œ์˜ ๋™์ž‘ ๊ณผ์ •(Dual-Mode Execution)

  • User Mode : ์ผ๋ฐ˜์  ์‘์šฉํ”„๋กœ๊ทธ๋žจ ๊ตฌ๋™ ํ™˜๊ฒฝ
  • Kernel Mode : ์ปค๋„ ๊ตฌ๋™ ํ™˜๊ฒฝ(User Mode์™€ ๋‹ฌ๋ฆฌ system call(H/W ๊ด€๋ จ) ํ˜ธ์ถœ ๊ฐ€๋Šฅ) โ—€๏ธ PintOS ํ™˜๊ฒฝ

์ฒซ ์šด์˜์ฒด์ œ ๊ตฌ๋™ ์‹œ ์ดˆ๊ธฐํ™” ์ž‘์—… ๋ฐ ๋ถ€ํŒ… ์ž‘์—…์œผ๋กœ ์ธํ•ด ์ปค๋„ ๋ชจ๋“œ๋กœ ์‹œ์ž‘๋˜๊ณ , ๊ณง๋ฐ”๋กœ ์‚ฌ์šฉ์ž ๋ชจ๋“œ๋กœ ์ „ํ™˜๋œ๋‹ค. ์ด๋Š” Kernel Mode์—์„œ์˜ ์ž‘์—…์ด ์ปดํ“จํ„ฐ ์ „๋ฐ˜์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์ด๊ธฐ์— ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์˜ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

  • User Mode์—์„œ 'system call'์„ ํ˜ธ์ถœ
  • User Mode์—์„œ ์ž‘์—…์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ์šด์˜์ฒด์ œ์— ์œ„์ž„

Interrupt?

Interrupt(์ธํ„ฐ๋ŸฝํŠธ)๋ž€ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” '์ค‘๋‹จ ์‹ ํ˜ธ'๋กœ CPU๊ฐ€ ํŠน์ • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ '์ž ๊น' ์ค‘๋‹จ์‹œํ‚ค๊ณ  ๋‹ค๋ฅธ ์ž‘์—… ์ˆ˜ํ–‰ ํ›„ ๊ธฐ์กด ์ž‘์—…์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ์„ ํ•˜๋‹ค๊ฐ€ ์ „ํ™”๊ฐ€ ์šธ๋ฆฌ๋ฉด(์ธํ„ฐ๋ŸฝํŠธ) ์ „ํ™”๋ฅผ ๋๋‚ธ ํ›„์— ๋‹ค์‹œ ์›๋ž˜ ํ•˜๋˜์ผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๋‹ค.

 

Interrupt ๋™์ž‘ ๊ณผ์ •

  1. ์ธํ„ฐ๋ŸฝํŠธ ์š”์ฒญ ๋ฐœ์ƒ
    • ex. ๋„คํŠธ์›Œํฌ ์นด๋“œ์—์„œ ๋ฐ์ดํ„ฐ ํŒจํ‚ท์ด ๋„์ฐฉํ•œ ์ˆœ๊ฐ„์— ์ธํ„ฐ๋ŸฝํŠธ ์š”์ฒญ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
  2. ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ์ค‘๋‹จ
    • ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด 'ํ˜„ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์–ด๊ฐ€ ์™„๋ฃŒ๋˜๋Š” ์‹œ์ '์— ํ”„๋กœ๊ทธ๋žจ ์ค‘๋‹จ
  3. ์ƒํƒœ์ €์žฅ
    • ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ(PC)์— ์ €์žฅ๋œ ์ฃผ์†Œ์™€ ์ƒํƒœ ๋ ˆ์ง€์Šคํ„ฐ ๋“ฑ์˜ ์ค‘์š” ์ •๋ณด๋ฅผ ์ฃผ๋กœ '์Šคํƒ'์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ
  4. ์ธํ„ฐ๋ŸฝํŠธ ์ „์ฒ˜๋ฆฌ ์‹คํ–‰
    • ์ธํ„ฐ๋ŸฝํŠธ ์›์ธ ํŒŒ์•…
    • CPU๋Š” ์ธํ„ฐ๋ŸฝํŠธ ๋ฒกํ„ฐ๋ฅผ ํ†ตํ•ด ์ธํ„ฐ๋ŸฝํŠธ ์„œ๋น„์Šค ๋ฃจํ‹ด ์œ„์น˜๋ฅผ ์ฐพ์•„์„œ ๋ฃจํ‹ด ์‹คํ–‰
  5. ์ธํ„ฐ๋ŸฝํŠธ ์„œ๋น„์Šค ๋ฃจํ‹ด(ISR) ์‹คํ–‰
    • ์ธํ„ฐ๋ŸฝํŠธ '์›์ธ ์ฒ˜๋ฆฌ'
  6. ๋ณต์› ๋ฐ ์‹คํ–‰ ์žฌ๊ฐœ
    • ์Šคํƒ์— ์ €์žฅ๋˜์–ด ์žˆ๋˜ PC ๊ฐ’๊ณผ ์ƒํƒœ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๋ณต์›๋˜๋ฉฐ ๊ธฐ์กด ์ˆ˜ํ–‰ ์ค‘๋‹จ๋˜์—ˆ๋˜ ์ง€์ ์—์„œ ์‹คํ–‰ ์žฌ๊ฐœ

System Call

์‹œ์Šคํ…œ ์ฝœ(System Call)์ด๋ž€?

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์Šคํ…œ์˜ ์ž์›์ด๋‚˜, ์„œ๋น„์Šค(H/W)๋ฅผ ํ•„์š”๋กœ ํ•  ๊ฒฝ์šฐ ์šด์˜์ฒด์ œ์— ์š”์ฒญํ•˜๋Š” ๊ฒƒ์„ ์‹œ์Šคํ…œ ์ฝœ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์œ ์ €๋ชจ๋“œ์—์„œ๋Š” ์ˆ˜ํ–‰๋  ์ˆ˜ ์—†๊ณ , ๋ฐ˜๋“œ์‹œ Kernel Mode๋กœ ํ˜ธ์ถœ(call)ํ•˜์—ฌ์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค. 

์‹œ์Šคํ…œ ์ฝœ์˜ ๋™์ž‘ ๊ณผ์ •

User application(process)์—์„œ ์‹œ์Šคํ…œ ์ฝœ ํ˜ธ์ถœ ์‹œ

  1. Process๋Š” 'Kernel mode'๋กœ ์ง„์ž…
  2. OS๋Š” ๊ฐ ์‹œ์Šคํ…œ ์ฝœ์— ๊ณ ์œ ๋ฒˆํ˜ธ ํ• ๋‹น ํ›„ ๊ฐ ๋ฒˆํ˜ธ์— ๋งž๋Š” ์ œ์–ด ๋ฃจํ‹ด ์ •์˜
  3. ์ปค๋„์€ ์„œ๋น„์Šค ๋ฃจํ‹ด ์ฒ˜๋ฆฌ ํ›„ ๋‹ค์‹œ ์‚ฌ์šฉ์ž ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•˜์—ฌ ๊ธฐ์กด์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ„์† ์‹คํ–‰๋˜๋„๋ก ํ•จ

์‹œ์Šคํ…œ ์ฝœ ๋ฐœ์ƒ ์‹œ ๊ธฐ๋Šฅ์ด๋‚˜ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋” ๋งŽ์€ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด '๋งค๊ฐœ๋ณ€์ˆ˜'๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ CPU ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•จ
    • ์†๋„๊ฐ€ ๋น ๋ฅด๋ฉฐ, CPU ๋ ˆ์ง€์Šคํ„ฐ์— ์ง์ ‘ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•จ
    • CPU ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ํ•œ์ •๋˜์–ด ์žˆ๊ธฐ์— ๋‹ค๋Ÿ‰ ์ „๋‹ฌ์—๋Š” ๋ถ€์ ํ•ฉ
  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•จ
    • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ๊ฑฐ๋‚˜ ํฌ๊ธฐ๊ฐ€ ํด ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ €์žฅ ํ›„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋ ˆ์ง€์Šคํ„ฐ์— ์ „๋‹ฌ
    • ๋ฐ์ดํ„ฐ ์–‘์— ์ œํ•œ์ด ์—†์–ด ํšจ์œจ์ 
  • ์Šคํƒ์„ ํ†ตํ•œ ์ „๋‹ฌ
    • ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์Šคํƒ์— push(์ „๋‹ฌ) ํ›„ ์ปค๋„์€ ์ด ์Šคํƒ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ popํ•˜์—ฌ ์‚ฌ์šฉ
    • ์Šคํƒ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์šฉ์ด

Priority Scheduling("์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ž‘์—…์ด ๋จผ์ € ์‹คํ–‰๋ผ์•ผ์ง€!")

์šฉ๊ด‘๋กœ๊ฐ€ 600๋„ ์”จ๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด, ์˜จ๋„๋ฅผ ๋‚ด๋ ค์•ผ ํ•˜๋Š” ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. ์ด ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋Š” ๋งค์šฐ ๋†’๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๋‹ค๋ฅธ ํ•˜์ฐฎ์€ ์ž‘์—…์„ ํ•˜๋Š๋ผ ์ด ์ž‘์—…์ด ํ›„ ์ˆœ์œ„๋กœ ๋ฐ€๋ฆฌ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ์˜จ๋„๋ฅผ ๋‚ด๋ฆฌ์ง€ ๋ชป ํ•ด ๋Œ€ํ˜•์‚ฌ๊ณ ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ์œ ์‚ฌํ•œ ์ผ์ด NASA์—์„œ ์‹ค์ œ๋กœ ์žˆ์—ˆ๋‹ค(!).

์ด๋ ‡๊ฒŒ ์ค‘์š”ํ•œ '์šฐ์„  ์ˆœ์œ„ ์Šค์ผ€์ฅด๋ง'์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

Priority Inversion Problem

ํ•œ์–‘๋Œ€ํ•™๊ต PintOS ๊ฐ•์˜์ž๋ฃŒ

์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์šฐ์„ ์ˆœ์œ„ ๋‚ฎ์€ ์“ฐ๋ ˆ๋“ค๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ˜„์ƒ์„ Priority Inversion์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ Inversion ๋ฐœ์ƒ ์‹œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์ ์ ˆํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์ˆ˜๋‹ค. ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ• ์ค‘ Priority๊ฐ€ ๋†’์€ Thread์˜ Priority๋ฅผ ๋‚ฎ์€ Thread๊ฐ€ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ์ด๋ฅผ 'donation'์ด๋ผ๊ณ ํ•œ๋‹ค.

Multiple Donation

ํ•œ์–‘๋Œ€ํ•™๊ต PintOS ๊ฐ•์˜์ž๋ฃŒ

์œ„ ์ด๋ฏธ์ง€์˜ Thread M, Thread H์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ Thread์—์„œ ํ•œ Thread์— ์—ฌ๋Ÿฌ๋ฒˆ donationํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค.(Thread L, M, H๋Š” ๊ฐ๊ฐ Priority Low, Medium, High)

  • Thread M, H์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ Thread์—์„œ ํ•œ Thread L์— ์—ฌ๋Ÿฌ๋ฒˆ donation ํ•˜๋Š” ์ƒํ™ฉ
  • Thread L์€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ Thread H๋ถ€ํ„ฐ ์‹คํ–‰ ํ›„ ๋‹ค์Œ ์šฐ์„ ์ˆœ์œ„(M)๋กœ ๋„˜์–ด๊ฐ

Nested Donation

ํ•œ์–‘๋Œ€ํ•™๊ต PintOS ๊ฐ•์˜์ž๋ฃŒ

  • Thread H๋Š” lock B๋ฅผ ์š”์ฒญํ•˜๊ณ  โžก๏ธ lock B๋ฅผ ์–ป์„ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๊ณ , lock B์˜ Holder์ธ Thread M์€ Lock A๋ฅผ ์š”์ฒญํ•˜๊ณ  โžก๏ธ ์–ป์„ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
  • Thread H โžก๏ธ M โžก๏ธ L ์ˆœ์œผ๋กœ H์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ Thread L, M์—๊ฒŒ ๋ชจ๋‘ donation ๋˜์–ด์•ผ ํ•จ 

 

๐Ÿ› ๊ตฌํ˜„ ์ค‘ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ๋ฒ„๊ทธ(์‚ฌ์ง„ ์ฒจ๋ถ€ ์˜ˆ์ •)

  • Thread๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ (ํ˜น์€ ์ƒˆ๋กœ์šด Thread๊ฐ€ ์‹œ์ž‘ ์•Š๊ณ ) ๋ฌดํ•œ loop์— ๋น ์ง€๋Š” ๋ฒ„๊ทธ
    • ์ข…๋ฃŒ Thread ๋‹ค์Œ์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ํฌ์ธํ„ฐ๋ฅผ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ(ํฌ์ธํ„ฐ ์—†์„ ๊ฒฝ์šฐ ๋ฌดํ•œ loop)
    • Thread๊ฐ€ ์ข…๋ฃŒ ์ž์ฒด๋ฅผ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ชป ๋ณธ ๊ฑฐ ๊ฐ™์Œ
  • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ Output์ด ๋ฐฐ์—ด์ผ ๊ฒฝ์šฐ ํ–‰์—์„œ ์šฐ์„ ์ˆœ์œ„ ๋ณ€๋™์ด ์—†๋Š” ๊ฒฝ์šฐ
    • init_priority์— Thread์˜ ์ดˆ๊ธฐ priority๊ฐ€ ํ• ๋‹น๋˜์–ด ์ž˜ ํ™œ์šฉ๋˜๋Š”์ง€ ํ™•์ธ ํ•„์š”