scheduling policy 에 따라 process 가 state를 왔다갔다하며 잘 진행되면 좋은데 가끔 OS가 간섭을 해야 할 때가 있다. 언제 어떻게 하는 지 알아보자.
아래와 같은 순서로 진행된다.
OS | Program |
---|---|
OS >> 새로운 process 를 실행시키기 위해 작업공간을 새롭게 만든다. create entry for process list Allocate memory for program Load program into memory Set up stack with argc/argv Clear registers Execute call main() | |
Program >> main() 이 실행된다. Execute return from main() | |
OS >> 프로세스를 다 썼으면 할당된 모든 메모리공간에서 삭제한다. Free memory of process Remove from process list |
process 가 실행되는 동안 심각한 오류를 범하지 않도록 계속 감시를 해줘야 한다. 예를 들어 main() 함수가 작동중에 잘못된 index에 접근해서 메모리공간을 망치고 있는데 OS가 그것을 관리하지 않고 그냥 return 0; 신호만 받아서 context switch만 관리한다면 결국 큰 문제를 야기하고 말것이다.
근데 OS 또한 프로그램으로 결국 메모리공간에 올라와 실행되는 process 이므로 본인도 policy에 따라 resource를 할당받아야 한다. 언제 어떻게 해야 할까?
프로세스들이 공평하게 CPU 자원이 분배가 되는지, 입출력 같은 부분이 잘 처리되고 있는지, 권한이 있는지 검사.
kernel mode 에서 실행되는 것이 우선순위가 높다. user mode 에서는 어느정도 제약이 걸린채 실행되지만 kernel mode면 그냥 실행되어진다. user mode 에서 kernel 로 실행시킬 수 있다.
What should a user process do when it wishes to perform a privileged operations?
How does the trap know which code to run inside the OS?
프로세스가 trap 을 처리할 수는 없기 떄문에 Trap table 이 사용된다.
Trap table
미리 정해진 번호를 통해서만 restrict operation 을 처리한다. hadler 에 기록되어 있다.
시스템 콜 -> trap handler -> table -> 해당 시스템콜 호출
OS | Hardware | Program |
---|---|---|
Initialize trap table | Remember address of syscall handler | |
create entry for process list Allocate memory for program Load program into memory Set up stack with argc/argv FIll kernel Stack with regs/PC Return - from - trap < kernel -> User > | ||
Restore regs from kernel stack move to User mode Jump to main | ||
Run main() ... Call system call Trap into OS | ||
Save regs/PC to kernel stack move to kernel mode Jump to trap handler | ||
Handler trap Return - from - trap | ||
Restore regs from kernel stack Move to user mode Jump to PC after trap | ||
Return from main() Trap ( via exit()) | ||
Free Memory of process Remove from porcess list |
Hardware도 같이 움직이는 이유는 현재상황을 최신화하고 context 의 다음 위치를 계속 저장하기 위해서다.
CPU 또한 프로세스이므로 CPU가 프로세스를 관리를 하려면 CPU 또한 resoure를 얻어야한다. 어떤 프로세스가 자원을 얻은 상태에서 CPU가 어떻게 관리를 해야 하는가? 즉 어느 시점에 CPU가 관여를 할 것인가?
Wait for system calls
Applications also transfer control to the OS when they do an illegal operation
시스템콜을 기다리며 OS가 접근하려고 하면 다른 프로세스들이 자원을 차지하기 위해 계속 OS가 자원을 못 얻는 방향으로 시스템콜을 적게 호출할 것이기 때문에 OS 는 그 떄문에 별로 실행되지 못할 것이다.
시스템콜이 올때까지 기다리기 보다는 강제적으로 일정 시간마다 검사를 하는 것이 낫다. 4ms 정도마다 검사를 한다. 응용프로그램의 system call로 운영체제로 가거나 timer가 울릴때까지 검사를 한다.
검사하기 위해 필요한 값들을 커널스택에 저장하고 이후에 쓸 값을 커널스택으로부터 저장하고 이어서 일을 처리할수 있게 환경을 계속 유지해준다.
OS | Hardware | Program |
---|---|---|
Initialize trap table | ||
Remember address of syscall handler and timer handler | ||
Start interrupt timer | ||
Start timer (Interrupt CPU in X ms) | ||
Process A | ||
Timer interrupt save Uregs(A) to k-stack(A) move to kernel mode Jump to trap handler | ||
Handle the trap Call switch() routine save Kregs(A) to k-stack(A) restore Kregs(B) from k-stack(B) switch to k-stack(B) Return - from - trap (intoB) | ||
Restore Uregs(B) from k-stack(B) move to user mode Jump to B's PC | ||
Process B |