Skip to content

bestowing/MFQ-Scheduling-Simulator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

35 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

OS-project-1

MFQ ์Šค์ผ€์ค„๋ง ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ

Multi-level Feedback Queue Scheduling Simulator

๋ณธ ๋ฌธ์„œ๋Š” '์šด์˜์ฒด์ œ' ๊ณผ๋ชฉ ์ˆ˜๊ฐ•์ค‘ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ, MFQ ์Šค์ผ€์ค„๋ง ๊ธฐ๋ฒ•์„ ๊ตฌํ˜„ํ•œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๊ตฌํ˜„ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰

git clone https://github.com/bestowing/MFQ-Scheduling-Simulator.git
cd MFQ-Scheduling-Simulator
make
./mfq-simulator

๊ฐœ์š”

๋ณธ ํ”„๋กœ๊ทธ๋žจ์€ ํ…์ŠคํŠธ ํŒŒ์ผ input.txt์—์„œ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›์•„, ์ •ํ•ด์ง„ ์Šค์ผ€์ค„๋ง ๊ธฐ๋ฒ•์œผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฒฐ๊ณผ๋ฅผ ์ฝ˜์†”์ฐฝ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  • Gantt Chart
  • ํ”„๋กœ์„ธ์Šค๋ณ„ Turnaround Time, Wating Time
  • (์ „์ฒด ํ”„๋กœ์„ธ์Šค์˜) ํ‰๊ท  Turnaround Time, ํ‰๊ท  Wating Time

์ž…์ถœ๋ ฅ ๊ทœ์น™

์ž…๋ ฅ ๊ทœ์น™

๋ณธ ํ”„๋กœ๊ทธ๋žจ์€ ์ •ํ•ด์ง„ format์— ๋งž์ถ˜ ํ…์ŠคํŠธ ํŒŒ์ผ input.txt์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ format์˜ ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

4
1 0 0 1 8
2 0 1 4 3 5 9 11 3 12 10
3 2 3 3 9 4 15 12 10
4 3 6 2 5 10 6
  • ์ฒซ์งธ ํ–‰์€ ํ”„๋กœ์„ธ์Šค์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ๋‘˜์งธ ํ–‰๋ถ€ํ„ฐ, ๊ฐ ํ”„๋กœ์„ธ์Šค ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
    • ์ฒซ๋ฒˆ์งธ ์—ด์€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ ID๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ๋‘๋ฒˆ์งธ ์—ด์€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ ์ตœ์ดˆ ์ง„์ž… ready queue๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ์„ธ๋ฒˆ์งธ ์—ด์€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ arrival time์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ๋„ค๋ฒˆ์งธ ์—ด์€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ Cycle ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
      • ๋‹ค์„ฏ๋ฒˆ์งธ ์—ด๋ถ€ํ„ฐ, Cycle ์ˆ˜์— ๋งž์ถฐ CPU burst time, I/O burst time์ด ๋ฒˆ๊ฐˆ์•„ ์ œ์‹œ๋ฉ๋‹ˆ๋‹ค.
      • ํ•ญ์ƒ CPU burst๋กœ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ ๊ทœ์น™

๋ณธ ํ”„๋กœ๊ทธ๋žจ์˜ ์ถœ๋ ฅ ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ถœ๋ ฅ ์˜ˆ์‹œ

  • [Gantt chart] ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ๋ฆ„์„ ํ•œ ๋ˆˆ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • [Process table] ํ”„๋กœ์„ธ์Šค๋ณ„ TT์™€ WT๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ”„๋กœ์„ธ์Šค ์ „์ฒด ํ‰๊ท  TT์™€ WT์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ธ๋ถ€์‚ฌํ•ญ

  • ์ด MFQ๋Š” 4๊ฐœ์˜ ready queue๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค: {Q0, Q1, Q2, Q3}
  • ๊ฐ ready queue์˜ ์Šค์ผ€์ค„๋ง ๊ธฐ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค:
ready queue scheduling method
Q0 RR(Round-Robin), time quatum = 2
Q1 RR(Round-Robin), time quatum = 6
Q2 SRTN(Shortest-Remaining-Time-Next)
Q3 FCFS(First-Come-First-Serve)
  • ์šฐ์„ ์ˆœ์œ„๋Š” Q0 > Q1 > Q2 > Q3 ์ˆœ์„œ์ž…๋‹ˆ๋‹ค.
  • Qi์—์„œ ์Šค์ผ€์ค„ ๋ฐ›์•„ ์‹คํ–‰๋œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃผ์–ด์ง„ time quantum์„ ๋ชจ๋‘ ์†Œ๋ชจํ•œ ๊ฒฝ์šฐ, Qi+1๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • Qi์—์„œ ์Šค์ผ€์ค„ ๋ฐ›์•„ ์‹คํ–‰๋œ ํ”„๋กœ์„ธ์Šค๊ฐ€ I/O burst์— ์ง„์ž…ํ•œ ๊ฒฝ์šฐ, Wake up ํ• ๋•Œ Qi-1๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • Q2์˜ ๊ฒฝ์šฐ, preemption์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ์˜ค์ง Q2๋กœ ์ง„์ž…ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์— ํ•œ์ •ํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋ฉฐ, ๋‹ค๋ฅธ ready queue์˜ ํ”„๋กœ์„ธ์Šค๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ: Q2์— ์žˆ๋˜ P1์ด ์Šค์ผ€์ค„๋ง๋˜์–ด ์‹คํ–‰์ค‘์ด๋ผ๊ณ  ๊ฐ€์ •ํ•จ.
    • ๋งŒ์•ฝ P2์ด Wake up ํ•˜์—ฌ Q2๋กœ ์ง„์ž…ํ•˜๋Š” ๊ฒฝ์šฐ, preemption ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด P1๊ณผ P2์˜ burst time์„ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜, ๊ฐ™์€ ์‹œ๊ฐ„์— Wake upํ•œ P3๊ฐ€ Q1์œผ๋กœ ์ง„์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” preemption ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Q2๋ฅผ ์ œ์™ธํ•œ ์–ด๋– ํ•œ ready queue์—์„œ๋„ preemption์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Burst time estimation์ด ์—†์Šต๋‹ˆ๋‹ค.
    • ์‚ฌ์šฉ์ž๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ• ๋•Œ ํ”„๋กœ์„ธ์Šค๋ณ„ Burst time์„ ์ฃผ์–ด์ง„ format์— ๋งž์ถ”์–ด ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์‚ฌ์šฉ์ž๋Š” ์ฃผ์–ด์ง„ ํ”„๋กœ์„ธ์Šค๋ณ„ ์ตœ์ดˆ ์ง„์ž… Ready queue๋ฅผ ์ฃผ์–ด์ง„ format์— ๋งž์ถ”์–ด ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์ž…๋ ฅ ๊ทœ์น™์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ํ”„๋กœ๊ทธ๋žจ ์„ค๊ณ„

ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„ํ• ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ—ค๋”ํŒŒ์ผ์„ ํฌํ•จํ•ด ์ด 4๊ฐœ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค: main.h, main.c, setter.c, simulator.c
main.h ํŒŒ์ผ์€ include ๋””๋ ‰ํ† ๋ฆฌ์—, c ํŒŒ์ผ์€ src ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์š”

์†Œ์Šค ํŒŒ์ผ ํ•จ์ˆ˜ ์„ค๋ช…
main.h ํ•„์š”ํ•œ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๊ณ , ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•˜๋Š” ํ—ค๋”ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
main.c main ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ์ž‘์ง€์ ์ธ main ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
setter.c set_simulation ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ํŒŒ์ผ์„ ์ฝ์–ด์˜ค๊ณ  ํ•„์š”ํ•œ ์ž์›์„ ์„ธํŒ…ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
init_queue ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ํ•„์š”ํ•œ queue์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ ํ• ๋‹นํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
set_processes ํŒŒ์ผ์—์„œ ์ฝ์–ด์˜จ ์ •๋ณด๋ฅผ ํ”„๋กœ์„ธ์Šค์— ๋„ฃ์–ด์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
init_process ํ”„๋กœ์„ธ์Šค์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ ํ• ๋‹นํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
simulator.c start_simulation ์‹œ๋ฎฌ๋ ˆ์ด์…˜์˜ ํ•ต์‹ฌ ๊ณผ์ •์„ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
cpu_running ํ”„๋กœ์„ธ์Šค Pi๋ฅผ ์‹คํ–‰ํ•˜์—ฌ burst time์„ 1 ๊ฐ์†Œ์‹œํ‚ค๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
push_queue ํ”„๋กœ์„ธ์Šค Pi๋ฅผ ์ ์ ˆํ•œ ready queue์— ํ‘ธ์‹œํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
io_check I/O ์š”์ฒญ์ด ์ข…๋ฃŒ๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ wake upํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
arrival_check ํ”„๋กœ์„ธ์Šค Pi์˜ arrival ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
burst_check ํ”„๋กœ์„ธ์Šค Pi์˜ burst time์„ 1 ๊ฐ์†Œ๋œ ํ›„์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
fcfs ready queue Q0, Q1, Q3์—์„œ ํ”„๋กœ์„ธ์Šค Pi๋ฅผ ์Šค์ผ€์ค„๋งํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
srtn ready queue Q2์—์„œ ํ”„๋กœ์„ธ์Šค Pi๋ฅผ ์Šค์ผ€์ค„๋งํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
preemtion ready queue Q2์—์„œ ์Šค์ผ€์ค„๋งํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰์ค‘์ผ๋•Œ, preemtion ๋ฐœ์ƒ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
sleep_check sleep queue๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
sleep I/O ์š”์ฒญ ํ”„๋กœ์„ธ์Šค๋ฅผ sleep ์‹œํ‚ค๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
scheduling ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ready queue์—์„œ ํ”„๋กœ์„ธ์Šค Pi๋ฅผ ์Šค์ผ€์ค„๋งํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
get_burst_time ํ”„๋กœ์„ธ์Šค Pi์˜ ๋‚จ์€ burst time์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
delete_process ํ”„๋กœ์„ธ์Šค Pi์— ๋™์ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ bytes๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
delete_queue ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ํ•„์š”ํ•œ queue์— ๋™์ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ bytes๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

main.h

๋ฉ”์ธ ํ—ค๋”์— ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ํ•„์š”ํ•œ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์กฐ์ฒด๊ฐ€ ๋ช…์‹œ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

#ifndef __MAIN_H
# define __MAIN_H

// ํ‘œ์ค€ ์ถœ๋ ฅ๊ณผ ํŒŒ์ผ ์ž…๋ ฅ
# include <stdio.h>
// ๋ฉ”๋ชจ๋ฆฌ ๋™์  ํ• ๋‹น
# include <stdlib.h>

// ์—๋Ÿฌ ์ƒ์ˆ˜ ์ •์˜
# define ERROR      -1

/*
**	struct define
*/
// ํ”„๋กœ์„ธ์Šค์˜ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๊ตฌ์กฐ์ฒด
typedef struct      t_process
{
    int             PID;
    int             queue;
    int             arr_t;
    int             cycle_num;
    int             cycle_index;
    int             cycle_total;
    int             *seq_burst;
}                   t_process;

// ready queue๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ตฌ์กฐ์ฒด
typedef struct      t_node
{
    struct t_node   *next;
    t_process       *data;
}                   t_node;

/*
**	global variables
*/
// ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ „์—ญ๋ณ€์ˆ˜
t_process           **job_queue;			// processes before arriving ready queue
t_node              *ready_queue0;			// Q0, RR(time quantum = 2)
t_node              *ready_queue1;			// Q1, RR(time quantum = 6)
t_process           **ready_queue2;			// Q2, SRTN
t_node              *ready_queue3;			// Q3, FCFS
t_process           **sleep_queue;			// processes requesting I/O system call
int                 **process_table;		// result of the simulation
int                 process_num;

/*
**	setter.c
*/
// setter ํŒŒ์ผ์—์„œ ์ ‘๊ทผ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜
int                 set_simulation(void);

/*
**	simulator.c
*/
// simulator ํŒŒ์ผ์—์„œ ์ ‘๊ทผ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜
int                 start_simulation(void);
void                delete_queue(void);

#endif

main.c

๋ณธ ํ”„๋กœ๊ทธ๋žจ์€ main ํ•จ์ˆ˜์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์ณ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  1. ํŒŒ์ผ์—์„œ ํ”„๋กœ์„ธ์Šค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  2. ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‹ค์‹œํ•œ๋‹ค.
  3. ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  4. ์‚ฌ์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ž์›์„ ๋ฐ˜๋‚ฉํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.
int	main(int argc, char *argv[]) {
    if (set_simulation() == ERROR)      // ํŒŒ์ผ์—์„œ ํ”„๋กœ์„ธ์Šค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
        return (0);
    if (start_simulation() == ERROR)    // ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‹ค์‹œํ•œ๋‹ค.
        return (0);
    print_table();                      // ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.
    delete_queue();                     // ์‚ฌ์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ž์›์„ ๋ฐ˜๋‚ฉํ•œ๋‹ค.
    return (0);
}

setter.c

set_simulation() ํ•จ์ˆ˜์—์„œ ํŒŒ์ผ์„ ์ฝ๊ณ , ํ”„๋กœ์„ธ์Šค ๊ตฌ์กฐ์ฒด์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์  ํ• ๋‹นํ•˜์—ฌ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ž…๋ ฅ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋™์  ํ• ๋‹น ๊ณผ์ •์—์„œ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ๊ฐ€ ๊ฐ code number์™€ ํ•จ๊ป˜ ์ฒ˜๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

int	set_simulation(void)
{
    FILE	*file;

    file = fopen("input.txt", "r");
    if (file == NULL)
    {
        printf("Error code 01: failed to find \"input.txt\" file.\n");
        return (ERROR);
    }
    if (fscanf(file, "%d", &process_num) == ERROR)
    {
        printf("Error code 02: failed to read \"input.txt\" file.\n");
        return (ERROR);
    }
    if (init_queue() == ERROR)
    {
        printf("Error code 03: failed to allocate memory bytes.\n");
        return (ERROR);
    }
    if (set_processes(file) == ERROR)
    {
        printf("Error code 04: failed to read \"input.txt\" file or allocate memory bytes.\n");
        return (ERROR);
    }
    return (0);
}

์ž์„ธํ•œ ์ฝ”๋“œ๋Š” ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

simulator.c

start_simulation() ํ•จ์ˆ˜์—์„œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•ต์‹ฌ ๊ณผ์ •์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

  1. job_queue์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋„์ฐฉํ•  ์‹œ๊ฐ„์ด ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ready queue๋กœ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
  2. I/O๋ฅผ ์š”์ฒญํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด, I/O burst time์„ ํ™•์ธํ•˜๊ณ  ready queue๋กœ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
  3. ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์Šค์ผ€์ค„๋งํ•ฉ๋‹ˆ๋‹ค.
      • ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์Šค์ผ€์ค„๋งํ•˜๋Š”๋ฐ ์‹คํŒจํ–ˆ๊ณ , ๋‚จ์•„์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๋‹ค๋ฉด, ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
      • ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์Šค์ผ€์ค„๋งํ•˜๋Š”๋ฐ ์‹คํŒจํ–ˆ๊ณ , I/O ์š”์ฒญ์„ ๋Œ€๊ธฐ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.
    • ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด, Q2์—์„œ ์Šค์ผ€์ค„๋ง๋ฐ›์•„ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
      • preemption ๋ฐœ์ƒ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ธ€๋กœ๋ฒŒ ์‹œ๊ฐ„์„ 1 ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.
  5. ๋งŒ์•ฝ I/O ์š”์ฒญ์„ ๋Œ€๊ธฐ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋งŒ ๋‚จ์•˜๋‹ค๋ฉด, ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  6. ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ• ๋‹น๋ฐ›์€ ์‹œ๊ฐ„์„ 1 ์†Œ๋ชจํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ํ• ๋‹น๋ฐ›์€ ์‹œ๊ฐ„์„ ๋ชจ๋‘ ์†Œ๋ชจํ–ˆ์Œ์—๋„ burst time์ด ๋‚จ์•˜๋‹ค๋ฉด, ์ ์ ˆํ•œ ready queue๋กœ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
    • I/O๋ฅผ ์š”์ฒญํ–ˆ๋‹ค๋ฉด, sleep queue๋กœ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
    • ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ• ๋‹น๋ฐ›์€ ์‹œ๊ฐ„์„ ๋ชจ๋‘ ์†Œ๋ชจํ–ˆ๊ณ , burst time์ด ๋‚จ์•„์žˆ์ง€ ์•Š๋‹ค๋ฉด, ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
    • ์ด์™ธ์˜ ๊ฒฝ์šฐ, ๊ณ„์† ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ

๋‹ค์–‘ํ•œ ์ž…๋ ฅ์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

1. ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ I/O ์š”์ฒญ์„ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

์ž…๋ ฅ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค: input.txt

4
1 0 0 1 8
2 0 1 1 4
3 2 3 1 9
4 3 6 1 5

ํ”„๋กœ์„ธ์Šค๋Š” ์ด 4๊ฐœ๋กœ, ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ I/O ์š”์ฒญ์—†์ด cycle 1ํšŒ๋งŒ์— ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค:

result1

2. I/O์š”์ฒญ์„ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ชจ๋‘ ์žˆ๋Š” ๊ฒฝ์šฐ

์ž…๋ ฅ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค: input.txt

4
1 0 0 1 8
2 0 1 1 4 5 9 11 3 12 10
3 2 3 1 9 4 15 12 10
4 3 6 1 5 10 6

ํ”„๋กœ์„ธ์Šค๋Š” ์ด 4๊ฐœ๋กœ, ํ”„๋กœ์„ธ์Šค P1์€ I/O ์š”์ฒญ์—†์ด cycle 1ํšŒ๋งŒ์— ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ํ”„๋กœ์„ธ์Šค๋Š” ๋ชจ๋‘ I/O ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ•œ ๋ฒˆ ์ด์ƒ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค:

result2 result2_2

  • time 53 ~ 57์˜ wating์€ ready_queue์— ๋‚จ์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†์–ด cpu๊ฐ€ sleep ์ƒํƒœ์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค์˜ wake up์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

3. ready Q2์—์„œ preemption์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ

์ž…๋ ฅ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค: input.txt

2
1 2 0 1 4
2 2 1 1 1

ํ”„๋กœ์„ธ์Šค๋Š” ์ด 2๊ฐœ๋กœ, ready Q2์— ๋จผ์ € ๋„์ฐฉํ•œ P1์ด ์‹คํ–‰์ค‘์ผ ๋•Œ, burst time์ด ๋” ์งง์€ P2๊ฐ€ Q2์— ๋„์ฐฉํ•˜์—ฌ preemtion์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค:

result3

  • ์ฃผ์˜: preemtion์€ ์˜ค์ง ready Q2์— ๋“ค์–ด์˜จ ํ”„๋กœ์„ธ์Šค์— ํ•œ์ •ํ•˜์—ฌ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. P2๊ฐ€ Q1์œผ๋กœ ๋„์ฐฉํ•œ๋‹ค๋ฉด, ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด preemption์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

result3_2

์—๋Ÿฌ ์ฝ”๋“œ๋ณ„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • Error code 01: input.txt ํŒŒ์ผ์„ openํ•˜๋Š”๋ฐ ์‹คํŒจํ–ˆ์„๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ํŒŒ์ผ๊ณผ ๊ฐ™์€ ์œ„์น˜์— ๋‘์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

  • Error code 02: input.txt ํŒŒ์ผ์—์„œ ๊ฐ’์„ ์ฝ๋Š”๋ฐ ์‹คํŒจํ–ˆ์„๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ ๊ทœ์น™์— ๋งž๊ฒŒ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

  • Error code 03: ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ํ•„์š”ํ•œ queue ํฌ์ธํ„ฐ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ์‹คํŒจํ–ˆ์„๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ํ™˜๊ฒฝ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜์ง€ ์•Š์€์ง€ ํ™•์ธํ•˜์„ธ์š”.

  • Error code 04: input.txt ํŒŒ์ผ์—์„œ ๊ฐ’์„ ์ฝ๋Š”๋ฐ ์‹คํŒจํ•˜๊ฑฐ๋‚˜, ํ”„๋กœ์„ธ์Šค ํฌ์ธํ„ฐ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ์‹คํŒจํ–ˆ์„๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ ๊ทœ์น™์— ๋งž๊ฒŒ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜, ์‹คํ–‰ ํ™˜๊ฒฝ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜์ง€ ์•Š์€์ง€ ํ™•์ธํ•˜์„ธ์š”.

  • Error code 05: ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ํ•„์š”ํ•œ Node ํฌ์ธํ„ฐ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ์‹คํŒจํ–ˆ์„๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ํ™˜๊ฒฝ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜์ง€ ์•Š์€์ง€ ํ™•์ธํ•˜์„ธ์š”.

About

A project for Operating System class at SKKU.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published