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๋ฅผ ๋ฐํํ๋ ํจ์์ ๋๋ค. |
๋ฉ์ธ ํค๋์ ์๋ฎฌ๋ ์ด์ ์ ํ์ํ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ์ ์ ์ ๊ตฌ์กฐ์ฒด๊ฐ ๋ช ์๋์ด์์ต๋๋ค.
#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 ํจ์์์ ๋ค์๊ณผ ๊ฐ์ ์ ์ฐจ๋ฅผ ๊ฑฐ์ณ ์คํ๋ฉ๋๋ค.
- ํ์ผ์์ ํ๋ก์ธ์ค ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ์๋ฎฌ๋ ์ด์ ์ ์ค์ํ๋ค.
- ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
- ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ ์์์ ๋ฐ๋ฉํ๊ณ ์ข ๋ฃํ๋ค.
int main(int argc, char *argv[]) {
if (set_simulation() == ERROR) // ํ์ผ์์ ํ๋ก์ธ์ค ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค.
return (0);
if (start_simulation() == ERROR) // ์๋ฎฌ๋ ์ด์
์ ์ค์ํ๋ค.
return (0);
print_table(); // ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ณ ์ข
๋ฃํ๋ค.
delete_queue(); // ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ ์์์ ๋ฐ๋ฉํ๋ค.
return (0);
}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);
}์์ธํ ์ฝ๋๋ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
start_simulation() ํจ์์์ ์๋ฎฌ๋ ์ด์ ํต์ฌ ๊ณผ์ ์ด ์งํ๋ฉ๋๋ค.
- job_queue์ ์๋ ํ๋ก์ธ์ค๊ฐ ๋์ฐฉํ ์๊ฐ์ด ๋์๋์ง ํ์ธํ๊ณ ready queue๋ก ํธ์ํฉ๋๋ค.
- I/O๋ฅผ ์์ฒญํ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ฉด, I/O burst time์ ํ์ธํ๊ณ ready queue๋ก ํธ์ํฉ๋๋ค.
- ํ์ฌ ์คํ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
- ์คํ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ฉด, ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์ค์ผ์ค๋งํฉ๋๋ค.
- ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์ค์ผ์ค๋งํ๋๋ฐ ์คํจํ๊ณ , ๋จ์์๋ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ฉด, ์๋ฎฌ๋ ์ด์ ์ ์ข ๋ฃํฉ๋๋ค.
- ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์ค์ผ์ค๋งํ๋๋ฐ ์คํจํ๊ณ , I/O ์์ฒญ์ ๋๊ธฐ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ฉด, ๋๊ธฐํฉ๋๋ค.
- ์คํ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ฉด, Q2์์ ์ค์ผ์ค๋ง๋ฐ์ ์คํ์ค์ธ ํ๋ก์ธ์ค์ธ์ง ํ์ธํฉ๋๋ค.
- preemption ๋ฐ์ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ํ๋ก์ธ์ค๋ฅผ ๊ต์ฒดํฉ๋๋ค.
- ์คํ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ฉด, ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์ค์ผ์ค๋งํฉ๋๋ค.
- ๊ธ๋ก๋ฒ ์๊ฐ์ 1 ์ฆ๊ฐ์ํต๋๋ค.
- ๋ง์ฝ I/O ์์ฒญ์ ๋๊ธฐ์ค์ธ ํ๋ก์ธ์ค๋ง ๋จ์๋ค๋ฉด, ๋๊ธฐํฉ๋๋ค.
- ์คํ์ค์ธ ํ๋ก์ธ์ค๊ฐ ํ ๋น๋ฐ์ ์๊ฐ์ 1 ์๋ชจํฉ๋๋ค.
- ๋ง์ฝ ํ ๋น๋ฐ์ ์๊ฐ์ ๋ชจ๋ ์๋ชจํ์์๋ burst time์ด ๋จ์๋ค๋ฉด, ์ ์ ํ ready queue๋ก ํธ์ํฉ๋๋ค.
- I/O๋ฅผ ์์ฒญํ๋ค๋ฉด, sleep queue๋ก ํธ์ํฉ๋๋ค.
- ํ๋ก์ธ์ค๊ฐ ํ ๋น๋ฐ์ ์๊ฐ์ ๋ชจ๋ ์๋ชจํ๊ณ , burst time์ด ๋จ์์์ง ์๋ค๋ฉด, ํด๋น ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํฉ๋๋ค.
- ์ด์ธ์ ๊ฒฝ์ฐ, ๊ณ์ ์คํํฉ๋๋ค.
๋ค์ํ ์ ๋ ฅ์ ํตํด ํ๋ก๊ทธ๋จ ์คํ ๊ฒฐ๊ณผ๋ฅผ ํ ์คํธํฉ๋๋ค.
์ ๋ ฅ์ ์๋์ ๊ฐ์ต๋๋ค: 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ํ๋ง์ ์ข ๋ฃ๋ฉ๋๋ค.
์ถ๋ ฅ์ ์๋์ ๊ฐ์ต๋๋ค:
์ ๋ ฅ์ ์๋์ ๊ฐ์ต๋๋ค: 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 ์์คํ ํธ์ถ์ ํ ๋ฒ ์ด์ ์์ฒญํฉ๋๋ค.
์ถ๋ ฅ์ ์๋์ ๊ฐ์ต๋๋ค:
- time 53 ~ 57์ wating์ ready_queue์ ๋จ์ ํ๋ก์ธ์ค๊ฐ ์์ด cpu๊ฐ sleep ์ํ์ ์๋ ํ๋ก์ธ์ค์ wake up์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์์ ์๋ฏธํฉ๋๋ค.
์ ๋ ฅ์ ์๋์ ๊ฐ์ต๋๋ค: input.txt
| 2 | ||||||||||
| 1 | 2 | 0 | 1 | 4 | ||||||
| 2 | 2 | 1 | 1 | 1 |
ํ๋ก์ธ์ค๋ ์ด 2๊ฐ๋ก, ready Q2์ ๋จผ์ ๋์ฐฉํ P1์ด ์คํ์ค์ผ ๋, burst time์ด ๋ ์งง์ P2๊ฐ Q2์ ๋์ฐฉํ์ฌ preemtion์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค.
์ถ๋ ฅ์ ์๋์ ๊ฐ์ต๋๋ค:
- ์ฃผ์: preemtion์ ์ค์ง ready Q2์ ๋ค์ด์จ ํ๋ก์ธ์ค์ ํ์ ํ์ฌ ๋ฐ์ ๊ฐ๋ฅํฉ๋๋ค. P2๊ฐ Q1์ผ๋ก ๋์ฐฉํ๋ค๋ฉด, ์๋ฎฌ๋ ์ด์ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ด preemption์ด ๋ฐ์ํ์ง ์๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฒ์ ๋๋ค. ์ธ๋ถ ์ฌํญ์ ์ฐธ๊ณ ํ์ธ์.
-
Error code 01: input.txt ํ์ผ์ openํ๋๋ฐ ์คํจํ์๋ ๋ฐ์ํฉ๋๋ค. ํ์ผ์ ํ๋ก๊ทธ๋จ ์คํํ์ผ๊ณผ ๊ฐ์ ์์น์ ๋์๋์ง ํ์ธํ์ธ์.
-
Error code 02: input.txt ํ์ผ์์ ๊ฐ์ ์ฝ๋๋ฐ ์คํจํ์๋ ๋ฐ์ํฉ๋๋ค. ์ ๋ ฅ ๊ท์น์ ๋ง๊ฒ ํ์ผ์ ์์ฑํ์ธ์.
-
Error code 03: ์๋ฎฌ๋ ์ด์ ์ ํ์ํ queue ํฌ์ธํฐ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์คํจํ์๋ ๋ฐ์ํฉ๋๋ค. ์คํ ํ๊ฒฝ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ถ์กฑํ์ง ์์์ง ํ์ธํ์ธ์.
-
Error code 04: input.txt ํ์ผ์์ ๊ฐ์ ์ฝ๋๋ฐ ์คํจํ๊ฑฐ๋, ํ๋ก์ธ์ค ํฌ์ธํฐ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์คํจํ์๋ ๋ฐ์ํฉ๋๋ค. ์ ๋ ฅ ๊ท์น์ ๋ง๊ฒ ํ์ผ์ ์์ฑํ๊ฑฐ๋, ์คํ ํ๊ฒฝ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ถ์กฑํ์ง ์์์ง ํ์ธํ์ธ์.
-
Error code 05: ์๋ฎฌ๋ ์ด์ ์ ํ์ํ Node ํฌ์ธํฐ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์คํจํ์๋ ๋ฐ์ํฉ๋๋ค. ์คํ ํ๊ฒฝ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ถ์กฑํ์ง ์์์ง ํ์ธํ์ธ์.




