본문 바로가기

시스템

[시스템 프로그래밍] Process와 Context Switching

Process

- an instance of a running program

- a context(state) for the program execution

각 process는 실행되기 위해서
1. CPU 와 CPU 내부의 registers
2. memory 내부의 stack, heap, data, code의 저장공간
이 필요하다.

 

Process라는 개념이 주는 2가지 이득 (abstractions)

① Logical control flow : 각 process는 CPU를 독점하는 것처럼 보인다. by context switching

② Private address space : 각 process는 memory를 독점하는 것처럼 보인다. by virtual memory

 

Kernel

- a shared chunk of memory-resident OS code

- not a separate process, runs between processes for managing

 

Context switching

: processes간 control flow의 passing. (by kernel)

→ 하나의 CPU가 여러 processes를 동시에 실행하는 것처럼 보일 수 있다. 

→ 실제로는 각 processes를 번갈아가면서 실행하는 것! (실행되지 않는 processes의 register 값들은 memory에 저장되어 있다.)

→ 이렇게 동시에 실행되는 것처럼 보이지만 실제로는 번갈아가면서 실행되고 있는 특징을 concurrency, 동시성이라고 한다.

* context switching의 과정 (p1 -> p2)
① p1의 registers를 memory에 저장한다.
② 다음으로 실행될 process(p2)를 선택한다. <scheduling>
③ memory에 저장되어 있던 p2의 registers를 load한다.
cf) multiprocessor와 multicore의 차이
multiprocessor : CPU가 여러개
multicore : CPU 내부의 핵심인 core가 여러개
→ 이러한 2가지 경우에는 실제로 동시에 여러 processes가 실행된다. (parallelism, 병렬성)

 

Context switching에서 kernel의 역할

  위에서 서술한 context switching은 kernel에 의해 일어난다고 하였다.

하지만 그 과정을 살펴보면 kernel의 k자도 찾을 수 없는데.. 저 ①~③을 하는게 kernel인 거다!

대체 어떻게 kernel에 의해 일어난다고 하는 것인지 구체적으로 알아보자.

user mode → kernel mode
context switching (위에서 서술한 ①~③)
kernel mode → user mode

context switching 앞뒤로는 user mode와 kernel mode간의 mode 변환이 있다.

이때 kernel이 control을 가져오고 돌려주는 것이다.

그렇다면 control을 어떤 방식으로 가져오는지, 2가지 방식을 정리해보자.

1. system call

syscall은 user가 OS에게 서비스 요청을 보낼 때 발생하는 exception control flow이다. (ecf 중 trap이다.)

이를 통해 control flow가 OS에게 넘어가면, 암묵적으로 kernel이 context switch시점인지를 체크하게 된다.

2. timer interrupt

timer interrupt는 few ms마다 external timer chip이 발생시키는 exception control flow이다. (ecf 중 interrupt다.)

ecf가 발생했으니 handler code가 실행될텐데 이 handler coder가 kernel code이고, 이렇게 kernel이 control을 넘겨받는 것이다.