프로세스: 실행 중인 프로그램
그렇다면 어떻게 CPU가 여러개 존재한다는 것처럼 느끼게 할 수 있을까?
가상화 - 운영체제는 CPU를 가상화 하여 CPU가 여러개 존재하는 것처럼 느끼게 할 수 있음
정책: 운영체제 내에서 어떤 결정을 내리기 위한 알고리즘
프로세스: 실행 중인 프로그램
하드웨어의 상태(machine state)를 이해해야 프로세스의 구성요소를 이해할 수 있음
운영체제는 몇몇 기본 비긍에 대해서 반드시 API로 제공해야 된다.
그렇다면 프로그램이 어떻게 프로세스로 변형되는가?
프로세스는 운영체제의 스케줄링 정책에 따라 스케줄이 되면 준비상태에서 실행상태로 전이한다
전이 예시
운영체제도 일종의 프로그램이다.
운영체제도 다른 프로그램처럼 다양한 정보를 유지하기 위한 자료구조를 가진다.
프로세스 리스트: 프로세스 상태를 파악하기 위한 리스트
레지스터 문맥(register context): 프로세스가 중단되을 때 해당 프로세스의 레지스터 값들을 저장
//프로세스를 중단하고 이후에 재개하기 위해 xv6가 저장하고 복원하는 레지스터
struct context{
int eip; // 다음에 실행할 명령어 주소를 가지는 레지스터
int esp; // 하나의 스택프레임의 끝 지점에 주소 저장하는 레지스터
int ebx; // 등등
int ecx;
int edx;
int esi;
int edi;
int ebp;
};
이 레지스터 값들을 복원하여 운영체제는 프로세스 실행을 재개 (문맥교환, context switch)
현재 실행중인 프로세스, 대기중인 프로세스를 위한 자료구조도 있음
process-run.py 프로그램은 프로세스가 실행되면서 변하는 프로세스의 상태를 추적할 수 있고,프로세스가 CPU를 사용하는지(예,add명령어 실행) 입출력을 하는지(예,디스크에 요청을 보내고 완료되기를 기다린다)를 알아볼 수 있다.상세한 사항은 README 파일을 확인하기 바란다.
참고)
process-run.py -l x:y
이런식으로 프로세스 생성 가능.
x는 프로세스가 돌아가는데 걸리는 시간이고, y는 CPU 혹은 IO를 이용하는 정도이다. (y=100 이면 CPU만 사용, y=0이면 IO만 사용)
./process-run.py -l 5:100,5:100 실행시켰을 때 CPU 이용률은?
./process-run.py -l 4:100,1:0 실행시켰을 때, 두 프로세스가 모두 종료되는데 걸리는 시간은?
./process-run.py -l 1:0, 4:100 실행시켰을 때, 두 프로세스가 모두 종료되는데 걸리는 시간은? (문제 2에서 순서 바꾼것)
./process-run.py -l 1:0,4:200 -cp -S SWITCH_ON_END 실행시켰을 때, 어떤 결과?
(SWITCH_ON_END 플래그 사용하면, 입출력 하는 동안 다른 프로세스 전환 x, IO 요청 다 될 때까지 기다림)
./process-run.py -l 1:0,4:100 -cp -S SWITCH_ON_IO 실행시, 어떤 결과?
(SWITCH_ON_IO 플래그 사용하면, 입출력 하는 동안 다른 프로세스로 전환함)
./process-run.py -l 3:0,5:100,5:100,5:100 -S SWITCH_ON_IO -I IO_RUN_LATER -cp 실행시 어떤 결과?
(IO_RUN_LATER가 지정되면 입출력이 완료되을 때 입출력을 요청한 프로세스가 바로 실행될 필요가 없다. 완료 시점에 실행 중이던 프로세스가 계속 실행된다)
예상: 21틱?, 7틱 동안 IO 실행 (근데 그동안에 CPU로 전환하여 다른 프로세스 실행) * 3 = 21
실제로 첫번째 IO 실행까지는 맞음. 첫 7틱동안 IO 실행되고, CPU로 전환하여 다른 프로세스 실행시킴.
근데 이후에 IO_RUN_LATER 플래그로 인해 IO 실행을 나중에 함. 그동안 CPU를 사용하는 프로세스를 계속 수행함. 그래서 7+5+5
이후에 IO를 수행하므로 +7+7
따라서 7+5+5+7+7 = 31
./process-run.py -l 3:0,5:100,5:100,5:100 -S SWITCH_ON_IO -I IO_RUN_IMMEDIATE -cp 실행시 어떤 결과?
(IO_RUN_IMMEDIATE 플래그는 입출력이 완료되면, 요청 프로세스가 곧바로 실행되는 동작을 의미)