프로세스의 정의
A process is an instance of a running program
프로세스는 실행 중인 프로그램의 인스턴스이다.
프로그램을 컴파일(compile)하면 Object Code가 생성되고 기계어 집합이 된다.
프로세스는 코드가 메모리에 적재된 이후에 CPU를 사용할 수 있는 상태를 말한다.
compile이란, 인간이 이해할 수 있는 언어로 작성된 소스 코드(고수준 언어 : C, C++, Java 등)를 CPU가 이해할 수 있는 언어(저수준 언어 : 기계어)로 번역(변환)하는 작업을 말한다.
컴파일된 기계어 집합이 메모리의 Code, Stack, Heap, Data 영역에 할당된다.
프로세스는 각 프로그램에게 두가지 중요한 추상화를 제공한다.
Logical control flow
os위에서 실행 중인 프로세스는 CPU를 독점하고 있는 것처럼 사용하고 있다.
하지만, 실제로 프로세스는 CPU는 공유하고 있다.
각 프로세스에 해당되는 Time quantum이 10ms라고 하면, 프로세스 A가 실행되고 있을 때 10ms가 지나면 os의 스케줄러에 의해 스케줄링되어 다음 프로세스로 context switch가 발생한다. 이런 방식으로 os가 프로세스를 time sharing 하는 것으로 프로세스가 CPU를 독점하고 있는 것이 아니다.
즉, kernel의 context swtich를 통해 프로세스가 CPU를 독점하는 것처럼 보이게 한다.
Private address space
프로그램은 로더에 의해 코드와 데이터 부분이 메모리에 적재된다.
os의 스케줄러에 의해서 코드가 실행되면 런타임 스택, 런타임 힙에 사용자가 동적으로 할당해서 쓴다.
프로그램이 볼 때 자신만의 private한 주소 공간을 가진 것처럼 실행된다.
프로그램은 virtual memory라는 kernel의 기능을 제공받아서 main memory를 독점적으로 사용하는 것처럼 보인다.
Multiprocessing: The Illusion
프로그램이 독점적으로 전체 메모리를 사용하는 것처럼 느끼지만 실제로 그렇지 않다.
여러 프로그램이 같이 실행 중이기 때문이다.
각 프로세스가 CPU, 메모리를 독점해서 사용하는 것처럼 실행되고 있다.
프로그램이 여러 개 실행 중인데 이런 프로세스들이 실제로 하나의 물리적인 CPU를 공유하고 있지만 사용자는 알지 못한다. 왜냐하면 매우 빠르게 Time sharing 하면서 context switch가 일어나기 때문이다.
Multiprocessing: The (Traditional) Reality
Single CPU는 여러 프로세스를 동시에 실행한다.
CPU안의 Register는 프로그램의 명령어를 실행하기 위한 저장공간이다.
Register내에 있는 명령어, PC, Stack, Pointer 등이 프로그램을 실행하는 데 사용되는 Context라고 할 수 있다.
프로세스가 실행 중에 Timer interrupt가 발생하면 CPU에 있는 interrupt pin이 high로 변하고 signal을 발생시킨다. 명령어를 읽을 때 interrupt pin을 보고 interrput handler가 수행된다. 핸들러가 context switch를 하고 그 안에서 스케줄링 함수를 호출하여 다음에 수행할 프로세스를 스케줄러가 알고리즘에 따라 선택한다.
다음 프로그램을 실행시키려면 interrupt 된 프로세스의 CPU register값을 저장해야 한다.
interrupt로 인해 명령어를 실행하다가 중단된 것이기 때문에 다시 실행될 때 해당 주소부터 시작해야 하기 때문이다.
각 프로세스마다 레지스터를 저장할 수 있는 컨텍스트가 있는데 이 컨텍스트는 커널 메모리에서 관리한다.
컨텍스트를 저장하고 다음 프로세스를 실행하기 위해 해당 프로세스의 컨텍스트를 CPU에 복원해준다. 이것을 컨텍스트 스위치라고 한다.
Concurrent Processes
Concurrent processes는 여러 개의 프로세스가 동시에 실행되는 것을 말한다.
Sequental processes는 프로세스가 동시에 실행되지 않은 것을 말한다.
Concurrent : A & B, A & C
Sequential : B & C
User View of Concurrent Processes
앞에서 말한 것은 프로세스가 물리적으로 CPU를 공유하고 있기 때문에 완전하게 병렬적으로 실행되지 않는다.
물리적으로 disjoint 하고 동시에 프로그램이 실행된다고 생각하지만 실제 물리적인 시간을 보면 Time sharing을 한다.
Context Switching
멀티 프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값(Context)을 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(Context)을 교체하는 작업을 Context Switch(Context Switching)라고 한다.
Context
사용자와 다른 사용자, 사용자와 시스템 또는 디바이스 간의 상호작용에 영향을 미치는 사람, 장소, 개체 등의 현재 상황(상태)을 규정하는 정보들을 말한다.
android나 servlet등에서도 context가 있지만 OS에서 Context는 CPU가 해당 프로세스를 실행하기 위한 해당 프로세스의 정보들이다.
이 Context는 프로세스의 PCB(Process Control Block)에 저장된다.
그래서 Context Switching 때 PCB의 정보를 읽어(적재) CPU가 전에 프로세스가 일을 하던 거에 이어서 수행이 가능한 것이다.
PCB의 저장 정보
- 프로세스 상태 : 생성, 준비, 수행, 대기, 중지
- 프로그램 카운터 : 프로세스가 다음에 실행할 명령어 주소
- 레지스터 : 누산기, 스택, 색인 레지스터
- 프로세스 번호
* 참고로 Context Switching 때 해당 CPU는 아무런 일을 하지 못한다. 따라서 컨텍스트 스위칭이 잦아지면 오히려 오버헤드가 발생해 효율(성능)이 떨어진다.
Context가 뭔지 알았고 멀티 프로세싱하기 위해 CPU를 나눠서 사용하기 위해 Context를 교체하는 것이 Context Switching임을 알았다. 그리고 PCB에 Context가 저장됨도 알았다.
남은 것은 인터럽트 요청이 뭐고 어떤 종류가 있는지 + 서브로 우선순위에 대한 이야기다.
Context Switching - 인터럽트(Interrupt)
인터럽트는 CPU가 프로그램을 실행하고 있을 때 실행 중인 프로그램 밖에서 예외 상황이 발생하여 처리가 필요한 경우 CPU에게 알려 예외 상황을 처리할 수 있도록 하는 것을 말한다.
어떤 인터럽트 요청이 와야 Context Switching이 일어날까?
1. I/O request (입출력 요청할 때)
2. time slice expired (CPU 사용시간이 만료되었을 때)
3. fork a child (자식 프로세스를 만들 때)
4. wait for an interrupt (인터럽트 처리를 기다릴 때)
+ 더 있겠지만 자세한 것은 생략.
* 우선순위는 해당 OS의 스케줄러가 우선 순위 알고리즘에 의해 정해지고 수행하게 되어있다.
라운드 로빈 스케줄링(Round Robin Scheduling)은 시분할 시스템을 위해 설계된 선점형 스케줄링의 하나다.
쉽게 설명하면 순서대로 시간 단위(Time Quantum)를 CPU에 할당하는 방식이다.
꽤 효율적인 스케줄링 알고리즘이지만 이 시간 단위를 작게 설정하면 CPU가 조금 일하고 Context Switching을 반복하므로 아까 말했듯이 효율이 떨어진다.
* Context Switch를 하는 주체 = OS 스케줄러
출처: https://jeong-pro.tistory.com/93 [기본기를 쌓는 정아마추어 코딩블로그]