๐Ÿ“Œ CPU ์Šค์ผ€์ค„๋Ÿฌ(Scheduler)3 & ๋ณ‘ํ–‰์ œ์–ด1

7 minute read

์ถ”๊ฐ€์ ์ธ CPU ์Šค์ผ€์ค„๋ง

  1. Multiple-Processor-scheduling

    CPU๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ ์Šค์ผ€์ค„๋ง์ด ๋”์šฑ ๋ณต์žกํ•ด์ง

    • Homogeneousํ•œ ๊ฒฝ์šฐ
      • Queue์— ํ•œ์ค„๋กœ ์„ธ์›Œ์„œ ๊ฐ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์•Œ์•„์„œ ๊บผ๋‚ด๊ฐ€๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ๋ฐ˜๋“œ์‹œ ํŠน์ • ํ”„๋กœ์„ธ์„œ์—์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋”์šฑ ๋ณต์žกํ•ด์ง
    • Load Sharing
      • ์ผ๋ถ€ ํ”„๋กœ์„ธ์Šค์—์„œ job์ด ๋ชฐ๋ฆฌ์ง€ ์•Š๋„๋ก ๋ถ€ํ•˜๋ฅผ ์ ์ ˆํžˆ ๊ณต์œ ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”
      • ๋ณ„๊ฐœ์˜ ํ๋ฅผ ๋‘๋Š” ๋ฐฉ๋ฒ• vs ๊ณต๋™ ํ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
    • Symmetric Multiprocessing (SMP) ๊ฐ CPU๊ฐ€ ๋Œ€๋“ฑํ•จ
      • ๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ์ž ์•Œ์•„์„œ ๊ฒฐ์ •
    • Asymmetic Multiprocessing ์กฐ์œจํ•˜๋Š” CPU๊ฐ€ ์žˆ์Œ
      • ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์‹œ์Šคํ…œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ์ฑ…์ž„์ง€๊ณ  ๋‚˜๋จธ์ง€ ํ”„๋กœ์„ธ์Šค๋Š” ๊ฑฐ๊ธฐ์— ๋”ฐ๋ฆ„
  2. Real time
    1. Hard real-time system (์ œํ•œ์‹œ๊ฐ„ ์•ˆ์— ์•ˆ ๋๋‚˜๋ฉด ํฐ ์ผ ๋‚˜๋Š” ๊ฒƒ๋“ค)
      • Hard real-time Task๋Š” ๋ฐ˜๋“œ์‹œ ์ •ํ•ด์ง„ ์‹œ๊ฐ„์•ˆ์— ๋๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ์Šค์ผ€์ค„๋ง ๋˜์–ด์•ผ ํ•จ
    2. Soft real-time system (๋™์˜์ƒ์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๊ฒƒ๋“ค)
      • Soft real time Task๋Š” ์ผ๋ฐ˜ ํ”„๋กœ์„ธ์Šค์— ๋น„ํ•ด ๋†’์€ priority๋ฅผ ๊ฐ–๋„๋ก ํ•ด์•ผ ํ•จ
  3. Thread Scheduling

    1. Local Scheduling - ์šด์˜์ฒด์ œ๋Š” ์Šค๋ ˆ๋“œ์˜ ์กด์žฌ๋ฅผ ๋ชจ๋ฆ„, ๊ทธ๋ž˜์„œ ์ง์ ‘ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅ
      • User Level Thread์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ˆ˜์ค€์˜ Thread library์— ์˜ํ•ด ์–ด๋–ค Thread๋ฅผ ์Šค์ผ€์ค„๋ง ํ• ์ง€ ๊ฒฐ์ •
    2. Global Schefduling - ์šด์˜์ฒด์ œ๋Š” ์Šค๋ ˆ๋“œ์˜ ์กด์žฌ๋ฅผ ์•Œ๊ณ  ์žˆ์Œ, ๊ทธ๋ž˜์„œ ์ง์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅ
      • Kernel level Scheduling์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜ ํ”„๋กœ์„ธ์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ปค๋„์˜ ๋‹จ๊ธฐ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์–ด๋–ค thread๋กœ ์Šค์ผ€์ค„๋งํ• ์ง€ ๊ฒฐ์ •

Algorithm Evaluation

  1. Queuing models (์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ƒํ™ฉ์— ์ „๋ถ€ ์ ‘๋ชฉํ•  ์ˆ˜ ์žˆ์Œ)
    • ํ™•๋ฅ ๋ถ„ํฌ๋กœ ์ฃผ์–ด์ง€๋Š” Arrival rate์™€ Service rate ๋“ฑ์„ ํ†ตํ•ด ๊ฐ์ข… Performance Index ๊ฐ’์„ ๊ณ„์‚ฐ
  2. implementation(๊ตฌํ˜„) & measurement(์„ฑ๋Šฅ ์ธก์ •)
    • ์‹ค์ œ ์‹œ์Šคํ…œ์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜์—ฌ ์‹ค์ œ ์ž‘์—…(workload)์— ๋Œ€ํ•ด์„œ ์„ฑ๋Šฅ์„ ์ธก์ • ๋น„๊ต
  3. Simulation(๋ชจ์˜ ์‹คํ—˜)
    • ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ชจ์˜ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ž‘์„ฑํ•œ ํ›„ trace๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๊ฒฐ๊ณผ ๋น„๊ต

๋ณ‘ํ–‰ ์ œ์–ด1 (Process Synchronization)

์ปดํ“จํ„ฐ ์•ˆ์—์„œ ์—ฐ์‚ฐ์„ ํ•  ๋•Œ๋Š” ํ•ญ์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๊ณ  ์—ฐ์‚ฐํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ €์žฅํ•˜๊ฒŒ ๋˜์–ด ์žˆ์Œ.

๋‹จ์ˆœํžˆ ํ•˜๋‚˜ํ•˜๋‚˜์— ๋Œ€ํ•ด ์—ฐ์‚ฐ์„ ํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ด ์—†๊ฒ ์ง€๋งŒ, ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.

์ฆ‰ S-box(Memory Address Space, Storage-box)๋ฅผ ๊ณต์œ ํ•˜๋Š” E-box(CPU Process, Evaluation-box)๊ฐ€ ์—ฌ๋Ÿฟ ์žˆ๋Š” ๊ฒฝ์šฐ Race Condition์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ, ( ํ”„๋กœ์„ธ์Šค๋Š” ์ž๊ธฐ ์ฃผ์†Œ๊ณต๊ฐ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ, ๊ทธ๋ž˜์„œ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋‚˜, ์—ฌ๊ธฐ์„œ CPU๊ฐ€ ๋ผ์–ด๋“ ๋‹ค๋ฉด( System Call์ด ์ผ์–ด๋‚œ๋‹ค๋ฉด ), ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ. ํŠนํžˆ CPU๊ฐ€ ํ•˜๋‚˜ ์ผ ๋•Œ, ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑด๋“œ๋ฆฌ๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณตํ•ด์„œ ์—ฐ์‚ฐํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ. )

๊ฒฝ์Ÿ ์ƒํƒœ:(race condition)๋ž€ ๋‘˜ ์ด์ƒ์˜ ์ž…๋ ฅ ๋˜๋Š” ์กฐ์ž‘์˜ ํƒ€์ด๋ฐ์ด๋‚˜ ์ˆœ์„œ ๋“ฑ์ด ๊ฒฐ๊ณผ๊ฐ’์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

  • Multiprocessor System, ๊ณต์œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋“ค ์ปค๋„ ๋‚ด๋ถ€์— ์ ‘๊ทผํ•˜๋Š” ๋ฃจํ‹ด๋“ค ๊ฐ„(์˜ˆ: ์ปค๋„๋ชจ๋“œ ์ˆ˜ํ–‰ ์ธํ„ฐ๋ŸฝํŠธ๋กœ ์ปค๋„๋ชจ๋“œ ๋‹ค๋ฅธ ๋ฃจํ‹ด ์ˆ˜ํ–‰ ์‹œ)
  1. OS์—์„œ Race Condition์€ ์–ธ์ œ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?

    • Kernel ์ˆ˜ํ–‰ ์ค‘ ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ ์‹œ

      • ๊ณ ์œ  ๋ณ€์ˆ˜๋กœ ์—ฐ์‚ฐํ•˜๊ธฐ ์ „์— interrupt๋ฅผ disable ์‹œํ‚ค๊ณ  ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋‹ค ์‚ฌ์šฉํ–ˆ์œผ๋ฉด ๋‹ค์‹œ interrupt๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Process๊ฐ€ system call์„ ํ•˜์—ฌ kernel mode๋กœ ์ˆ˜ํ–‰ ์ค‘์ธ๋ฐ, context switch๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ

      • ๋‘ ํ”„๋กœ์„ธ์Šค์˜ Address Space๊ฐ„์—๋Š” data sharing์ด ์—†์Œ

      • ๊ทธ๋Ÿฌ๋‚˜ system call์„ ํ•˜๋Š” ๋™์•ˆ์—๋Š” kernel address space์˜ data๋ฅผ ์ ‘๊ทผํ•˜๊ฒŒ ๋จ.

      • ์ด ์ž‘์—… ์ค‘๊ฐ„์— CPU๋ฅผ preemp ํ•ด๊ฐ€๋ฉด race condition ๋ฐœ์ƒ

      • ํ•ด๊ฒฐ์ฑ…: ์ปค๋„ ๋ชจ๋“œ์—์„œ ์ˆ˜ํ–‰ ์ค‘์ผ ๋•Œ๋Š” CPU๋ฅผ preemptiveํ•˜์ง€ ์•Š์Œ ์ปค๋„ ๋ชจ๋“œ์—์„œ ์‚ฌ์šฉ์ž ๋ชจ๋“œ๋กœ ๋Œ์•„๊ฐˆ ๋•Œ preemp

        โ€‹ ์ฆ‰ kernel ๋ชจ๋“œ์—์„œ ์ˆ˜ํ–‰ ์ค‘์ผ ๋•Œ๋Š” CPU๋ฅผ ๋นผ์•—์ง€ ์•Š๋Š” ๊ฒƒ์ด ํ•ด๊ฒฐ์ฑ…์ž„

    • Multiprocess์—์„œ shared memory ๋‚ด์˜ kernel data

      • ์–ด๋–ค CPU๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ kernel ๋ณ€์ˆ˜๋ฅผ storeํ–ˆ๋Š”๊ฐ€? โ†’ race condition / multiprocessor์˜ ๊ฒฝ์šฐ, interrupt enable/disable๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Œ
        • Method1: ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ CPU๋งŒ์ด ์ปค๋„์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•
          • ์ด ๋ฐฉ๋ฒ•์€ ์šด์˜์ฒด์ œ ์ „์ฒด์— lock/unlock์„ ๊ฑธ์–ด์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž„
        • Method2: ์ปค๋„ ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฐ ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ ๋งˆ๋‹ค ๊ทธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ lock/unlock์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•
          • ์ฆ‰, ๋‹ค๋ฅธ CPU๊ฐ€ ํ•ด๋‹น global ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์žˆ๋Š” ๊ฒƒ์— ์ฐฉ์•ˆํ•˜์—ฌ ๋‹ค๋ฅธ CPU๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ lockํ•˜๊ฑฐ๋‚˜ unlockํ•จ
    • ๊ฒฐ๊ตญ์€ CPU๋ฅผ ๊ฑด๋“œ๋Š” ๊ณผ์ •์—์„œ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, ๋งŒ์•ฝ์— shared memory๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด ๋˜ํ•œ race condition์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Œ

  2. process synchronization์˜ ๋ฌธ์ œ

    • ๊ณต์œ  ๋ฐ์ดํ„ฐ(shared data)์˜ ๋™์‹œ ์ ‘๊ทผ(concorrent access)์€ ๋ฐ์ดํ„ฐ์˜ ๋ถˆ์ผ์น˜(inconsistency) ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
    • ์ผ๊ด€์„ฑ(consistency)์„ ์œ„ํ•ด์„œ๋Š” ํ˜‘๋ ฅ ํ”„๋กœ์„ธ์Šค(cooperating process)๊ฐ„์˜ ์‹คํ–‰์ˆœ์„œ(orderly execution)๋ฅผ ์ •ํ•ด์ฃผ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”
    • Race-condition
      • ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋™์‹œ์— ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ์ƒํ™ฉ
      • ๋ฐ์ดํ„ฐ์˜ ์ตœ์ข… ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋Š” ๋งˆ์ง€๋ง‰์— ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฌ ํ”„๋กœ์„ธ์Šค์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง
    • Race-condition์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋Š” concurrent-process๋Š” ๋™๊ธฐํ™”(synchronization) ๋˜์–ด์•ผ ํ•œ๋‹ค.
  3. The critical-section problem

    • n๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ
    • ๊ฐ ํ”„๋กœ์„ธ์Šค์˜ code segment์—๋Š” ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ์ฝ”๋“œ์ธ critical-section์ด ์กด์žฌ
    • problem
      • ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ critical-section์— ์žˆ์„ ๋•Œ ๋‹ค๋ฅธ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” critical section์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค.
    • Initial Attempts to Solve problem

      • ๋‘ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. (P0, P1)

      • ํ”„๋กœ์„ธ์Šค๋“ค์˜ ์ผ๋ฐ˜์ ์ธ ๊ตฌ์กฐ

        do {
          entry section; // lock์„ ๊ฑธ๊ณ 
          critical section; // ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ ์—ฌ๊ธฐ์— ๋™์‹œ ์ ‘๊ทผ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ
          exit section; // lock์„ ํ’€๊ณ 
          remainder section; // ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์ง€ ์•Š๋˜์ง€
        } while (1)
        
      • ํ”„๋กœ์„ธ์Šค๋“ค์€ ์ˆ˜ํ–‰์˜ ๋™๊ธฐํ™”(syschonize)๋ฅผ ์œ„ํ•ด ๋ช‡๋ช‡ ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. โ†’ syschronization variable

Algorithm 1

  • syschronization variable
  int turn;
  initially turn = 0; // P1 can enter its critical section if(turn == i)
  • Process P0

  • do {
      while (turn != 0); // My turn
      critical section;
      turn = 1; // Now it's your turn
      remainder section;
    } while (1)
    
    • Satisfies mutual exclution, but not progress

      ์ฆ‰, ๊ณผ์ž‰์–‘๋ณด: ๋ฐ˜๋“œ์‹œ ํ•œ ๋ฒˆ์”ฉ ๊ต๋Œ€๋กœ ๋“ค์–ด๊ฐ€์•ผ๋งŒ ํ•จ (swap-turn)

      โ€‹ ๊ทธ๊ฐ€ turn์„ ๋‚ด๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ๋งŒ ๋‚ด๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ

      โ€‹ ํŠน์ • ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋” ๋นˆ๋ฒˆํžˆ critical section์„ ๋“ค์–ด๊ฐ€์•ผ๋งŒ ํ•œ๋‹ค๋ฉด?

ํ”„๋กœ๊ทธ๋žจ์  ํ•ด๊ฒฐ๋ฒ•์˜ ์ถฉ์กฑ ์กฐ๊ฑด

  • Mutual Exclusion(์ƒํ˜ธ๋ฐฐํƒ€)

    • ํ”„๋กœ์„ธ์Šค pi๊ฐ€ critical section์—์„œ ์ˆ˜ํ–‰ ์ค‘์ด๋ฉด, ๋‹ค๋ฅธ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋“ค์€ critical section์— ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ ๋œ๋‹ค.
  • Progress(์ง„ํ–‰)

    • ๊ทธ ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋„ critical section์— ๋“ค์–ด๊ฐ€์žˆ์ง€ ์•Š์€ ์ƒํƒœ์—์„œ critical section์— ๋“ค์–ด๊ฐ€๊ณ ์ž ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ์œผ๋ฉด, critical section์— ๋“ค์–ด๊ฐ€๊ฒŒ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • Bounded Waiting (๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์œ ํšจํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰ starvation์„ ๋ง‰์•„์•ผํ•œ๋‹ค.)

    • ํ”„๋กœ์„ธ์Šค๊ฐ€ critical section์— ๋“ค์–ด๊ฐ€๋ ค๊ณ  ์š”์ฒญํ•œ ํ›„๋ถ€ํ„ฐ ๊ทธ ์š”์ฒญ์ด ํ—ˆ์šฉ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์ด critical section์— ๋“ค์–ด๊ฐ€๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

    โญ๏ธ ๊ฐ€์ •

    • ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์˜ ์ˆ˜ํ–‰์†๋„๋Š” 0๋ณด๋‹ค ํฌ๋‹ค.
    • ํ”„๋กœ์„ธ์Šค๋“ค ๊ฐ„์˜ ์ƒ๋Œ€์ ์ธ ์ˆ˜ํ–‰์†๋„๋Š” ๊ฐ€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.

Algorithm 2

  • syschronization variable

    bool frag[2];
    initially flag[all] = false; // no one is in cs
    // "Pi is ready to enter its critical section" if (flag[i] == true)
    
  • Process Pi

    do {
      flag[i] = true; // pretend I am in
      while (flag[i]); // Is he also in? then wait
      critical section;
      flag[i] = false; // I am out now
      remainder section;
    } while (1);
    
  • Satisfies mutual exclusion, but not progress requirement

  • ๋‘˜ ๋‹ค 2ํ–‰๊นŒ์ง€ ์ˆ˜ํ–‰ ํ›„ ๋Š์ž„์—†์ด ์–‘๋ณดํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

Algorithm 3 (Petersonโ€™s Algorithm)

  • combined syschronization variables of Algorithms 1 and 2

  • Process P1

    do {
      flag[i] = true; // My intention is to enter...
      turn = j; // Set to his turn
      while (flag[i] && turn == j); // Wait only if
      critical section;
      flag[i] = false; // I am out now
      remainder section;
    } while(1);
    
  • Meets all three requirements; solves the critical section problem for two processe
  • Busy Waiting = Spin lock! (๊ณ„์† CPU์™€ memory๋ฅผ ์“ฐ๋ฉด์„œ wait)

Synchronization Hardware

  • ํ•˜๋“œ์›จ์–ด์ ์œผ๋กœ Test & Modify๋ฅผ atomicํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•  ๊ฒฝ์šฐ Busy Waiting = Spin lock! ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Mutual Exclusion with Test & Set

    syschronization variables:
    		boolean lock = false;
    Process Pi
      			do {
              while (Test_and_Set(lock));
              critical section;
              lock = true;
              remainder section;
            }
    

semaphores (์„ธ๋งˆํ‘ธ์–ด, ์ถ”์ƒ์ž๋ฃŒํ˜•, object์™€ operation์œผ๋กœ ์ •์˜๋จ)

  • ์•ž์˜ ๋ฐฉ์‹๋“ค์„ ์ถ”์ƒํ™”์‹œํ‚ด

  • Semaphore S ์—ฌ๊ธฐ S์— 1์ด ๋ช‡๊ฐœ ์žˆ๋Š”๊ฐ€? ์ด๊ฑฐ์— ๋”ฐ๋ผ์„œ ์ž์›์„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋ˆ„๊ฐ€ S์— ์žˆ๋Š” 1์„ ํ•˜๋‚˜ ๊ฐ€์ ธ๊ฐ€๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ํ•  ๋•Œ 1์ด ์—†์œผ๋‹ˆ๊นŒ. ์ž์›์„ ํ• ๋‹น ๋ฐ›์„ ์ˆ˜ ์—†์Œ.
    • integer variable

    • ์•„๋ž˜์˜ ๋‘ ์ž๊ธฐ atomic ์—ฐ์‚ฐ์— ์˜ํ•ด์„œ๋งŒ ๊ฐ€๋Šฅ

      P(S): while(S <= 0) do no-op; // โ†’ i.e.wait ์ž์›์„ ํš๋“ํ•˜๋Š” ๊ณผ์ •, lock์„ ๊ฑฐ๋Š” ๊ณผ์ •
      			S--;
      

      If positive, decrement-&-enter. Otherwise, wait until positive (busy-wait)

      ```c++ V(S): // ์ž์›์„ ๋ฐ˜๋‚ฉํ•˜๋Š” ๊ณผ์ •, lock์„ ํ‘ธ๋Š” ๊ณผ์ • S++;

  • Critical Section of n process

    • syschronization variables

      semaphore mutax; // initially 1: 1๊ฐœ๊ฐ€ CS์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค?
          
      Process P1
      do {
      	P(mutax); // if positive, dec-&-enter, Otherwise, wait
        critical section;
        V(mutax); // Increment semaphore
        remainder section;
      } while(1);
      

      busy-wait๋Š” ํšจ์œจ์ ์ด์ง€ ๋ชปํ•จ / ex) ์ด๋ฏธ ๋ˆ„๊ตฐ๊ฐ€ S๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๋Š” while์„ ๋„๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ž„

      ์œ„์˜ ๋ฌธ์ œ๋ฅผ Block / Wakeup์„ ๊ตฌํ˜„ํ•˜์—ฌ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

      ๊ทธ๋ ‡๋‹ค๋ฉด P()์™€ S()๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋ƒ? ์ด๋Š” Synchronization Hardware ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ.

  • Block / Wakeup Implementation

    • semaphore๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜

      typedef struct
      { int value ; // semaphore
       	struct process *L;  // process wait queue
      } semaphore;
      
    • block๊ณผ wakeup์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜

      • Block: ์ปค๋„์€ block์„ ํ˜ธ์ถœํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ suspend ์‹œํ‚ด, ์ด ํ”„๋กœ์„ธ์Šค์˜ PCB๋ฅผ semaphore์— ๋Œ€ํ•œ wait queue์— ๋„ฃ์Œ
      • wakeup: block๋œ process P๋ฅผ wakeup ์‹œํ‚ด, ์ด ํ”„๋กœ์„ธ์Šค์˜ PCB๋ฅผ ready queue์— ์˜ฎ๊น€

    ์œ„์™€ ๊ฐ™์€ ์ •์˜๋กœ ์ธํ•ด semaphore์—ฐ์‚ฐ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ์ •์˜๋จ.

    Implementation block/wakeup version of P( ) & V( )

    P(S): S.value--; // Prepare to Enter
    			if (S.value < 0) { // Oops, negative, I cannot enter
            add this process to S.L;
            block();
          }
    
    V(S): S.value++;
    			if (S.value <= 0) {
            remove process from S.L;
            wakeup(P);
          }
    
  • which is better?

    • Busy-wait v.s. Block-Wakeup

    • Block/Wakeup overhead v.s. Critical section์˜ ๊ธธ์ด

      • Critical section์˜ ๊ธธ์ด๊ฐ€ ๊ธด ๊ฒฝ์šฐ Block/Wakeup์ด ์ ๋‹น
      • Critical section์˜ ๊ธธ์ด๊ฐ€ ๋งค์šฐ ์งง์€ ๊ฒฝ์šฐ Block/wakeup overhead๊ฐ€ busy-wait ์˜ค๋ฒ„ํ—ค๋“œ๋ณด๋‹ค ๋”์šฑ ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค.
      • ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” Block/Wakeup ๋ฐฉ์‹์ด ๋” ์ข‹์Œ

      ์ฆ‰, critical section์— ๋Œ€ํ•œ ๊ฒฝ์Ÿ์ด ๋งค์šฐ ์น˜์—ดํ•œ ์ƒํƒœ๋ผ๋ฉด Block/Wakeup์ด ๋” ์ข‹๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด, busy-wait๊ฐ€ ๋” ์ข‹์Œ

  • Two Types of semaphores
    • counting semaphore
      • ๋„๋ฉ”์ธ์ด 0 ์ด์ƒ์ธ ์ž„์˜์˜ ์ •์ˆ˜๊ฐ’
      • ์ฃผ๋กœ resource counting์— ์‚ฌ์šฉ
    • Binery semaphore
      • 0 ๋˜๋Š” 1 ๊ฐ’๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” semaphore
      • ์ฃผ๋กœ mutual exclusion (lock/unlock)์— ์‚ฌ์šฉ