TL;DR
프로세스는 운영체제가 실행 중인 프로그램 인스턴스를 관리하기 위해 만든 실행·자원·보호 경계다. 보통 독립된 가상 주소 공간을 가지며, 실제 실행 흐름은 하나 이상의 스레드로 표현된다.
프로세스

프로세스는 운영체제가 실행 중인 프로그램 인스턴스를 관리하기 위해 만든 단위다. 프로그램 파일은 정적인 코드와 데이터이고, 프로세스는 그 프로그램을 실행하기 위해 생성된 런타임 컨텍스트다.
POSIX/Linux 기준에서 새 프로세스는 fork()로 만들어질 수 있다. fork() 이후 부모와 자식 프로세스는 독립적으로 실행될 수 있으며, 자식 프로세스는 고유한 PID를 가진다. exec() 계열 함수는 새 프로세스를 만드는 함수가 아니라, 현재 프로세스의 process image를 새 실행 파일 이미지로 교체한다.
프로세스는 보통 독립된 가상 주소 공간을 가진다. 운영체제와 하드웨어의 메모리 보호 기구는 한 프로세스가 다른 프로세스의 주소 공간을 임의로 읽고 쓰지 못하게 막는다. 다만 [[공유 메모리]]나 파일 매핑처럼 명시적으로 공유한 영역은 예외다.
프로세스의 주소 공간은 보통 다음 영역으로 설명한다.
| 영역 | 역할 |
|---|---|
code | 실행할 명령어가 들어 있는 영역 |
data | 전역 변수와 정적 데이터가 놓이는 영역 |
heap | 런타임에 동적으로 할당되는 메모리 영역 |
stack | 함수 호출, 지역 변수, 반환 주소 등 실행 흐름에 필요한 정보가 놓이는 영역 |
프로세스의 핵심 성질은 격리다. 한 프로세스의 메모리는 기본적으로 다른 프로세스에서 직접 접근할 수 없다. 이 격리는 안정성과 보안을 높이지만, 프로세스 사이에서 데이터를 주고받으려면 [[IPC]], [[pipe]], [[socket]], [[공유 메모리]] 같은 명시적인 통신 수단이 필요하다.
따라서 프로세스는 실행 자원의 경계이자 장애 격리의 단위다. 한 프로세스가 비정상 종료되더라도 다른 프로세스의 주소 공간은 기본적으로 보호된다. 실제 CPU에 올라가는 실행 흐름은 하나 이상의 스레드로 표현될 수 있으므로, 프로세스를 단순히 CPU 스케줄링 단위로만 설명하면 부정확하다.
References
Connections
- 스레드 — 프로세스 내부에서 실행되는 더 작은 실행 흐름
- [[프로세스와 스레드의 차이]] — 프로세스의 격리와 스레드의 공유를 비교하는 관계 노트
- [[IPC]] — 격리된 프로세스 사이에서 데이터를 주고받는 통신 방식
- [[공유 메모리]] — 여러 실행 주체가 같은 메모리 영역을 보는 방식
- [[컨텍스트 스위칭]] — 운영체제가 실행 대상을 바꾸는 비용
- [[멀티프로세싱]] — 여러 프로세스를 사용해 작업을 분산하는 실행 방식


Discussion
Comments
댓글은 승인 후 공개됩니다.