일반적으로 프로세스는 실행중인 프로그램으로 정의한다.
운영체제는 어떻게 무한대에 가까운 CPU가 존재하는 것과 같은 환상을 만드는가?
CPU 가상화의 효율적 구현을 위해서는 "도구"와 "지능"이 필요하다.
이 "도구"를 메커니즘이라고 부르는데, 메커니즘은 필요한 기능을 구현하는 방법이다.
"지능"은 정책(policy)의 형태로 나타난다.
정책은 운영체제가 결정을 내리는 데 사용되는 알고리즘이다.
ex) 다수의 실행가능한 프로그램이 존재할 때, 어느프로그램을 먼저 실행시키는가는 스케쥴링 정책이 정한다.
코드와 정적데이터 메모리에 탑재 → 스택과 힙을 생성 및 초기화 → 입출력 등의 셋업
→ 운영체제는 프로그램 실행을 위한 준비가 끝났다.
→ 프로그램이 시작된다.
프로세스가 스케쥴되면 준비에서 실행상태로 전이되는 것.
실행상태에서 준비상태로 전이되는 것은 나중에 스케쥴 될 수 있다는 상태.
파일 입출력등의 이벤트가 발생하면 이벤트가 끝날 때까지 대기 상태로 전이.
대기가 끝나면 준비상태로 전이되고, 운영체제의 스케쥴링 정책에 따라 직후에 바로 실행 상태로 전이될 수 있다.
RUN:CPU 는 1tick이 소요됨.
RUN:IO는 RUN + waiting*4 -> 5tick
CPU 이용률 예상 : 100%
총 Time 예상 : 5 + 5 -> 10
결과
Time PID: 0 PID: 1 CPU IOs
1 RUN:cpu READY 1
2 RUN:cpu READY 1
3 RUN:cpu READY 1
4 RUN:cpu READY 1
5 RUN:cpu READY 1
6 DONE RUN:cpu 1
7 DONE RUN:cpu 1
8 DONE RUN:cpu 1
9 DONE RUN:cpu 1
10 DONE RUN:cpu 1
Stats: Total Time 10
Stats: CPU Busy 10 (100.00%)
Stats: IO Busy 0 (0.00%)
두 프로세스가 모두 종료되는데 걸리는 시간 예상
: 4 + 6 -> 10
Time PID: 0 PID: 1 CPU IOs
1 RUN:cpu READY 1
2 RUN:cpu READY 1
3 RUN:cpu READY 1
4 RUN:cpu READY 1
5 DONE RUN:io 1
6 DONE WAITING 1
7 DONE WAITING 1
8 DONE WAITING 1
9 DONE WAITING 1
10* DONE DONE
Stats: Total Time 10
Stats: CPU Busy 5 (50.00%)
Stats: IO Busy 4 (40.00%)
두 프로세스가 모두 종료되는데 걸리는 시간 예상
: 6
-> 첫 프로세스가 Block 되어있는 동안 두 번째 프로세스가 실행 될 것이라 예상.
Time PID: 0 PID: 1 CPU IOs
1 RUN:io READY 1
2 WAITING RUN:cpu 1 1
3 WAITING RUN:cpu 1 1
4 WAITING RUN:cpu 1 1
5 WAITING RUN:cpu 1 1
6* DONE DONE
Stats: Total Time 6
Stats: CPU Busy 5 (83.33%)
Stats: IO Busy 4 (66.67%)
두 프로세스가 모두 종료되는데 걸리는 시간 예상
: 9
-> -S SWITCH_ON_END는 IO가 끝날 때까지 기다림
Time PID: 0 PID: 1 CPU IOs
1 RUN:io READY 1
2 WAITING READY 1
3 WAITING READY 1
4 WAITING READY 1
5 WAITING READY 1
6* DONE RUN:cpu 1
7 DONE RUN:cpu 1
8 DONE RUN:cpu 1
9 DONE RUN:cpu 1
Stats: Total Time 9
Stats: CPU Busy 5 (55.56%)
Stats: IO Busy 4 (44.44%)
두 프로세스가 모두 종료되는데 걸리는 시간 예상
: 6
-> -S SWITCH_ON_IO는 IO가 Block 되어있는 동안 다른 프로세스로 전환.
Time PID: 0 PID: 1 CPU IOs
1 RUN:io READY 1
2 WAITING RUN:cpu 1 1
3 WAITING RUN:cpu 1 1
4 WAITING RUN:cpu 1 1
5 WAITING RUN:cpu 1 1
6* DONE DONE
Stats: Total Time 6
Stats: CPU Busy 5 (83.33%)
Stats: IO Busy 4 (66.67%)
모두 종료되는데 걸리는 시간 예상
: 예상 어려움
-> IO_RUN_LATER는 IO를 요청한 프로세스가 IO가 완료 됐을 때
그 후 바로 실행 될 필요 없음.
Time PID: 0 PID: 1 PID: 2 PID: 3 CPU IOs
1 RUN:io READY READY READY 1
2 WAITING RUN:cpu READY READY 1 1
3 WAITING RUN:cpu READY READY 1 1
4 WAITING RUN:cpu READY READY 1 1
5 WAITING RUN:cpu READY READY 1 1
6* READY RUN:cpu READY READY 1
7 READY DONE RUN:cpu READY 1
8 READY DONE RUN:cpu READY 1
9 READY DONE RUN:cpu READY 1
10 READY DONE RUN:cpu READY 1
11 READY DONE RUN:cpu READY 1
12 READY DONE DONE RUN:cpu 1
13 READY DONE DONE RUN:cpu 1
14 READY DONE DONE RUN:cpu 1
15 READY DONE DONE RUN:cpu 1
16 READY DONE DONE RUN:cpu 1
17 RUN:io DONE DONE DONE 1
18 WAITING DONE DONE DONE 1
19 WAITING DONE DONE DONE 1
20 WAITING DONE DONE DONE 1
21 WAITING DONE DONE DONE 1
22* RUN:io DONE DONE DONE 1
23 WAITING DONE DONE DONE 1
24 WAITING DONE DONE DONE 1
25 WAITING DONE DONE DONE 1
26 WAITING DONE DONE DONE 1
27* DONE DONE DONE DONE
Stats: Total Time 27
Stats: CPU Busy 18 (66.67%)
Stats: IO Busy 12 (44.44%)
첫 IO가 끝난 뒤, 다른 프로세서들이 실행되고 그 프로세서들이 끝날 때까지
기다렸다가 남은 두 번의 IO를 진행.
27번
모두 종료되는데 걸리는 시간 예상
: 16
-> IO_RUN_IMMEDIATE는 IO를 요청한 프로세스가 IO가 완료 됐을 때
그 후 바로 실행.
Time PID: 0 PID: 1 PID: 2 PID: 3 CPU IOs
1 RUN:io READY READY READY 1
2 WAITING RUN:cpu READY READY 1 1
3 WAITING RUN:cpu READY READY 1 1
4 WAITING RUN:cpu READY READY 1 1
5 WAITING RUN:cpu READY READY 1 1
6* RUN:io READY READY READY 1
7 WAITING RUN:cpu READY READY 1 1
8 WAITING DONE RUN:cpu READY 1 1
9 WAITING DONE RUN:cpu READY 1 1
10 WAITING DONE RUN:cpu READY 1 1
11* RUN:io DONE READY READY 1
12 WAITING DONE RUN:cpu READY 1 1
13 WAITING DONE RUN:cpu READY 1 1
14 WAITING DONE DONE RUN:cpu 1 1
15 WAITING DONE DONE RUN:cpu 1 1
16* DONE DONE DONE RUN:cpu 1
17 DONE DONE DONE RUN:cpu 1
18 DONE DONE DONE RUN:cpu 1
Stats: Total Time 18
Stats: CPU Busy 18 (100.00%)
Stats: IO Busy 12 (66.67%)
첫 IO가 끝나고 바로 바로 다음 IO들이 실행.
IO들이 block되는 동안 cpu 프로세스들이 실행 되어서 18 time.
아무 생각없이 block이 안된 run때도 된다고 생각했음;