Process Context


이전 포스트에서, Process의 구성 요소는 Code, Data, Process Context라고 언급하였다.

이 중, Process Context에 대해 알아보자.

Process Context란?

Process context는 프로세스의 특정 시점의 정확한 상태를 규명하기 위해 필요한 정보들을 말한다.

즉, Process Context, 프로세스 문맥을 알고 있다면 프로세스 실행이 중지되었던 그 시점부터 바로 프로세스를 다시 실행할 수 있다.

프로세스 문맥은 크게 User context와 System Context로 나뉜다.
User Context는 프로세스의 Code, Data, User Stack이 포함된다.

User Stack은 사용되는 지역 변수, 함수의 인자 등을 저장하는 Stack이다.

System Context에는 PCB, 커널 함수에 대한 정보를 저장하는 Kernel Stack이있다.

Process가 생성되는 과정

아래 그림은 C 코드를 gcc를 통해 컴파일하였을 때, 프로세스가 생성되는 과정을 나타내었다.

실행 파일인 a.out의 구조를 살펴보면 다음과 같다.

header는 실행 파일에 대한 전체적인 제어 정보를 가지고 있다.
code에는 컴파일 된 바이너리가 들어가 있다.
data에는 global variable이 저장되어 있고,
bss에는 초기화되지 않은 global variable이 저장되어 있다.
마지막으로, stack에는 local variable이 저장된다.

실행 파일의 code부터 bss는 가상 주소 공간의 가장 낮은 주소인 0x0부터 채워지고,
가상 주소 공간의 3G ~ (4G - 1) 주소까지는 kernel Stack이 저장된다.
다음으로 3G부터 낮은 주소 쪽으로 local 변수를 저장하는 Stack이 저장된다.
bss와 stack 사이에는 heap 영역이 있어 변수들을 유동적으로 저장할 수 있다.

code는 컴파일 된 바이너리로 변하지 않기 때문에 그림처럼 code를 virtual address space로 옮기지 않고,
보통 실행 파일의 code를 가리키는 방식으로 구현한다.

이러한 프로세스 구조에서, user context는 code ~ stack이고, System Context는 kernel이다.

Main memory와 Virtual address space의 관계

아래 그림은 Main memory와 virtual address space의 관계를 나타내었다.

VAS는 보조 기억 장치에 위치하며, 프로세스가 New 상태일 때 생성된다.
프로세스가 New 상태에서 Ready 상태로 전환되면, VAS에 저장된 User Context가
메인 메모리에 들어가 프로세스를 실행할 수 있게 된다.

kernel은 VAS의 kernel 부분이 메인 메모리에 들어가는 것이 아니라, 매핑하는 것이다.


Process Switch


Process Switch란?

Process Switch는 프로세서가 현재 프로세스의 실행을 중단하고 다른 프로세스를 실행하는 것이다.

Context Switch라고도 한다.

Mode Change vs. Process Switch

Mode Change는 프로세스를 실행하다가 커널 함수를 실행하기 위해 커널 모드로 변경하는 것이고,
Process Switch는 프로세스를 실행하다가 중단하고 다른 프로세스를 실행하는 것이다.

만약, 어떠한 프로세스 A를 실행하다가 커널 함수인 dispatch를 실행하고 다시 프로세스 A를 실행하였다면, 이는 Mode Change가 이루어진 것이고 Process Switch가 이루어진 것은 아니다. Process Switch는 이전에 실행하던 프로세스와 다른 프로세스를 실행해야 하기 때문이다.

Process Switch는 언제 일어나는가?

process Switch는 다음과 같은 상황에서 일어난다 :

  • 프로세스 종료 시
프로세스가 종료되면, CPU의 이용률 감소 방지를 위해 다른 프로세스를 메인 메모리로 이동시켜 실행하게 된다.
따라서, 프로세스가 종료되면 Process Switch가 일어난다.
  • Blocked 상태로 변경되었을 시
프로세스가 Running 상태이다가 Blocked 상태로 변경되면 다른 프로세스가 메인 메모리로 이동되어 실행된다.
따라서, 프로세스가 Blocked 상태로 변경되면 Process Switch가 일어난다.
  • Time Slice 종료 시
TimeSharing 방식으로 진행되었을 때, Time Slice가 종료되면 해당 Process는 잠시 중단되고
dispatcher을 통해 커널 모드로 변경된 뒤 다른 Process를 실행시킨다.

즉, Time Slice가 종료되었을 경우에도 Process Switch가 일어난다.
  • I/O interrupt
interrupt가 발생해서 현재 프로세스보다 우선순위가 높은 프로세스가 깨어나게 되면,
현재 프로세스가 Ready 상태로 자동 변경되면서 CPU를 뺏기게 된다.
이를 통해 Process Switch가 일어난다.

단, 현재 프로세스보다 우선순위가 낮은 프로세스가 깨어난 경우에는
CPU를 뺏기지 않아 Process Switch가 일어나지 않는다.

Context Switch가 일어나는 과정

  1. 프로세스의 레지스터 값PCB에 저장한다.
  2. 현재 실행 중인 프로세스의 PCB를 업데이트한다.
  3. PCB를 Ready / Blocked / Suspended Blocked 큐에 Enqueue한다.
  4. 실행할 다른 프로세스를 선택한다.
  5. 선택된 프로세스의 PCB를 업데이트한다.
  6. 선택된 프로세스의 메모리 정보를 업데이트한다.
  7. 선택된 프로세스가 이전에 실행되었던 시점부터 시작되도록 복구한다.


Interprocess Communication (IPC)


IPC는 프로세스 간의 상호 커뮤니케이션을 하는 방법이다.
IPC 메커니즘에는 여러 가지가 있지만, 그 중 두 가지 메커니즘을 정리하였다.

  • Message Passing
Message Passing은 커널에 구현된 Message Queue에 전달할 메시지를 저장하고, 이를 전달하는 방식이다.

프로세스 A에서 메시지 큐에 전달할 메시지를 저장하고, Time Slice 종료로 인해 다른 프로세스들이 실행되다
프로세스 B가 실행된다면, 프로세스 B에서는 메시지 큐에 있는 메시지들에 접근하여 프로세스 A와 소통한다.

이 방식은 커널 모드와 사용자 모드를 번갈아 사용하므로 시간이 오래 걸린다는 단점이 있지만,
안전한 방식이라며, 동기적인 방식이라 안정적이라는 장점이 있다.
  • Shared Memory
Shared Memory는 User process들을 통해 shared Memory 공간을 생성하여
직접적으로 프로세스들이 Memory 공간을 공유하고, 이를 통해 소통하는 방식이다.

이 방식은 커널에 접근할 필요가 없으므로, Message Passing에 비해 속도가 빠르다는 장점이 존재하지만,
Message Passing에 비해 불안정하고, 비동기적이기 때문에 동기화 코드를 작성해야 한다는 단점이 있다.
profile
주니어 컴공학부생🌱

0개의 댓글

Powered by GraphCDN, the GraphQL CDN