- 출처: Operating System - Three Easy Pieces
- 개요
Process 란 무엇인가? 한마디로 정의하기에는 너무나 중요하고 복잡하지만 그중 가장 간단하고 직관적인 정의는 "프로그램 을 실행하는것"이다. 프로그램 자체는 생명주기를 갖지 않는다. 프로그램은 저장 장치(ex - Disk)에 존재하는데, 사용자가 실행하면 OS는 이를 가져와서 실행한다.
우리는 프로그램을 1개만 실행하지 않는다. 웹 브라우저를 켜놓고 게임을 하면서 음악을 듣는다. 시스템은 어느 CPU가 여유가 있어서 사용가능한지 신경쓰지 않는다. 이렇게 CPU 보다 많은 프로그램을 실행할 수 있는것은 OS가 CPU 가상화를 제공해서 가능하다.어떻게 CPU 가상화를 하길래 이런 상황이 가능한가?
여러 기술이 있겠지만 하나의 CPU를 여러 프로그램이 사용할 때에는 시간을 기준으로 CPU를 나눠쓸 수 있도록 하는 time sharing 기술이 대표적이며, 구현은 2 가지 수준으로 나누어서 생각해볼 수 있다.
- low-level: 기계적인 매커니즘(machinery mechanisms) 리거 히먀. 대표적으로 1 프로그램을 정지하고 다른 프로그램을 실행하는 context switching 와 같은것을 말한다.
- high-level: 스케줄링 정책(scheduling policies) 라고 하며, 만약 여러 프로그램이 CPU 상에 있을 때 어떤 것을 먼저 실행해야 하느냐에 관한것이다. 과거 수행이력이나 성능 지표등을 참고하여 결정될 수 있다.
- Process 추상화
실행중인 프로그램을 process 라고 한다. Process가 어떻게 이루어져 있는지를 이해하려면 "machin state"를 이해할 필요가 있다.
- Memory: 명령어(Instruction)은 메모리상에 존재한다. 실행중인 프로그램의 읽고 쓰는 데이터도 메모리에 존재한다.
- Register: 많은 명령어(Instruction)가 명시적으로 register를 읽고 갱신한다. 또한 특별한 유형의 register도 있는데 예를 들어 PC(program counter 혹은 IP, instruction pointer)는 프로그램의 어떤 명령어가 실행되고 있는지에 대한 register 이다. 또 Stack pointer(Frame pointer)는 함수 인자, 지역 변수, 반환 주소 stack을 관리한다.
- I/O information: 현재 open한 파일정보와 같은 것들을 관리한다.
- Process API
- Create: Process를 생성한다.
- Destroy: Process를 종료한다. 프로그램이 모든 일을 수행하면 정상적으로 종료되지만 강제종료하는 경우도 필요하다.
- Wait: 실행이 중지된 상태
- Miscellaneous Control: 그 외 suspend, resume
- Status: Process 상태 조회(ex - process를 얼마나 오래 실행했는지, 어떤 상태인지 등)를 한다.
- Process 생성
Process가 생성된다는건 디스크에 존재하는 프로그램을 변환하여 실행한다는것이다. 실제 과정은 더 복잡하겠지만 대략적으로 아래와 같은 작업을 통해 Process가 생성된다.
- 메모리 적재: 디스크에 존재하는 프로그램 코드와 정적 데이터를 메모리로 불러온다. 과거의 OS는 프로그램 실행전 관련 사항들을 한꺼번에 모두 불러왔지만 최근 OS는 필요시 불러오는 lazy load 방식이다. 이를 가능하게 하는데에는 paging과 swapping 이라는 기술이 사용된다.
- Stack과 Heap: Process 실행전 OS가 해야할것들이 있다. 우선 프로그램은 run-time stack(=stack) 이 할당되어야 한다. stack은 함수 인자, 지역 변수, 반환 주소등을 관리한다. 또한 stack과 더불어 heap 을 할당한다. heap은 동적으로 요청되는 데이터(ex - malloc, free) 에 관한 공간을 관리하는데 처음에는 그 크기가 작으나 시간이 지날수록 점점 커질 수 있다.
- 기타 초기화 작업들: 위에 언급한 사항 외에도 기타 초기화 작업들이 있는데 I/O 관련 작업들도 그 중 하나이다. UNIX 시스템의 경우 각 Process가 실행되면 input, output, error 파일 디스크립터를 갖는다.
- Process States
Process는 3가지 상태를 갖는다.
- Running: 프로세서가 Process를 실행한다. (명령어 실행)
- Ready: Process가 Ready 된 상태여서 언제든지 실행 가능한 상태이다.
- Blocked: 다른 이벤트 발생으로 인해 Ready가 아닌 상태이다. 예를 들어 Disk에 I/O를 요청중인 경우 프로세서가 여유가 있다해도 해당 Process를 실행할 수 없다.
각 상태는 아래와 그림과 같이 전이될 수 있다.
- 데이터 구조
OS가 Process를 수행하는 과정을 설명하고는 있지만 사실 OS 자체도 프로그램이기 때문에 다양한 정보를 관리하기 위한 주요 데이터구조가 존재한다. 예를 들면
- Ready 상태인 모든 process 목록 추적
- Running 상태인 process 목록 추적
- I/O 이벤트가 완료되면 다시 실행하기 위해서 Block 상태인 process 목록 추적
// The registers xv6 will save and restore
// to stop and subsequently restart a process
struct context {
int eip;
int esp;
int ebx;
int ecx;
int edx;
int esi;
int edi;
int ebp;
};
// The different states a process can be in
enum proc_state {
UNUSED,
EMBRYO,
SLEEPING,
RUNNABLE,
RUNNING,
ZOMBIE
};
// The information xv6 tracks about each process
// including its register context and state
struct proc {
char *mem; // Start of process memory
uint sz; // Size of process memory
char *kstack; // Bottom of kernel stack
// for this process
enum proc_state state; // Process state
int pid; // Process ID
struct proc *parent; // Parent process
void *chan; // If non-zero, sleeping on chan
int killed; // If non-zero, have been killed
struct file *ofile[NOFILE]; // Open files
struct inode *cwd; // Current directory
struct context context; // Switch here to run process
struct trapframe *tf; // Trap frame for the current interrupt
};
위의 코드는 xv6 kernel 에서 각 process를 관리하기 위해 OS가 필요한 정보들과 관련된 코드이다. Linux, Mac OS X, Window 등과 같은 실제 OS 에도 더 복잡하지만 이와 비슷한 코드가 존재한다.
위의 코드에서 2 가지 중요한 부분이 존재하는데,
- register context: process가 멈출 때 해당 process의 register 들은 메모리 공간으로 저장된다. 그 후 이 register 들을 복구함으로써 OS는 해당 process를 재개하게 된다. 이 기술은 널리 알려진 용어로 "context switch" 라고 한다.
- process state: proc_state를 보면 단순히 running, ready, blocked 뿐만 아니라 몇 가지 상태가 더 존재한다. process가 생성되는 중에는 "initial" 상태, process가 종료되었지만 관련한 사항들이 완전이 회수되지 않았다면 "final" (UNIX 기반 system 에서는 "zombie") 상태가 존재한다.
마치면서
OS의 추상화중 가장 기본적인 추상화인 process에 대해 알아보았다. OS는 아래 2 가지 수준의 구현사항을 결합하여 CPU 가상화를 제공한다.
- low-level: process 구현에 필요한 low-level mechanism
- high-level: process 들을 적절한 방법으로 실행하기 위한 스케줄링하는 정책
'Concepts > OS' 카테고리의 다른 글
File System (0) | 2024.11.03 |
---|---|
Limited Direct Execution (0) | 2024.05.25 |
Process API (0) | 2024.05.15 |
Introduction OS (0) | 2024.05.03 |
댓글