개요

프로세스process는 운영체제로부터 자원을 할당받은 작업의 단위로, 쉽게 말해서 현재 실행 중인 프로그램을 말한다.

보조기억장치에 저장된 프로그램이 메모리에 적재되고 CPU가 해당 명령어를 실행하는 순간, 그 프로그램은 프로세스가 된다. 이 과정을 ‘프로세스를 생성한다’고 표현한다.

프로세스 제어 블록PCB, Process Control Block

운영체제는 프로세스의 실행 순서를 관리하고, 프로세스에 자원을 배분하기 위해 프로세스 제어 블록을 사용한다.

PCB는 프로세스와 관련된 정보들을 저장하는 자료 구조다. 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다. 다음과 같은 정보를 저장한다.

  • 프로세스 IDPID, Process ID
  • 레지스터 값
  • 프로세스 상태
  • CPU 스케줄링 정보
  • 메모리 관련 정보
  • 사용한 파일과 입출력 장치 목록

문맥 교환

우선 문맥context이란 앞서 언급했던 PCB에 저장되는 정보들로, 프로세스의 수행을 재개하기 위해 기억해야 하는 데이터들이다.

하나의 프로세스에서 다른 프로세스로 실행 순서가 넘어가면, 1) 기존 프로세스의 문맥은 PCB에 저장되고, 2) PCB로부터 실행될 프로세스의 문맥을 복구한다.

이처럼 기존 프로세스의 문맥을 PCB에 저장하고, 새로운 프로세스를 실행하기 위해 (해당 프로세스의) 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 문맥 교환context switching이라고 한다.

메모리 공간

프로세스가 생성되면 프로세스는 다음 4가지의 메모리 영역을 할당받게 된다.

  • 코드 영역: ‘텍스트 영역’이라고도 하며, 실행할 수 있는 코드(즉, 기계어로 이루어진 명령어)가 저장된다. 데이터가 아닌 CPU가 실행할 명령어가 담겨 있기 때문에, 읽기 전용read-only 공간이다.
  • 데이터 영역: 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간이다. GVAR초기화된 변수가 저장되는 영역, BSS초기화되지 않은 변수가 저장되는 영역 섹션이 포함된다.
  • 스택 영역: 함수의 실행이 끝나면 사라지는 매개변수, 지역변수 같이 잠깐 사용하는 데이터를 일시적으로 저장하는 공간이다. 힙 영역과 주소가 겹쳐지는 일이 발생하지 않도록 스택 영역은 높은 주소에서 낮은 주소 방향으로 증가한다.
  • 힙 영역: 프로그래머가 직접 할당할 수 있는 저장 공간이다. malloc()이나 new로 할당하고, free() 등으로 해제한다. 힙 영역에 할당한 메모리 공간을 반환하지 않아 메모리가 낭비되는 현상을 ‘메모리 누수memory leak’라고 한다. 일반적으로 낮은 주소에서 높은 주소 방향으로 증가한다.

여기서 코드 영역과 데이터 영역은 그 특성 상 프로세스가 실행되는 동안 크기가 변하지 않아 ‘정적 할당 영역’이라고도 부른다.

반면 힙 영역과 스택 영역은 코드 영역과 데이터 영역과는 달리 프로세스 실행 과정에서 크기가 변할 수 있어 ‘동적 할당 영역’이라고도 부른다.

이 메모리 공간은 각 프로세스가 독립적으로 가지는 것으로, 다른 프로세스의 메모리에는 직접 접근할 수 없다. 또한 기본적으로 각 프로세스는 메모리 공간을 포함한 자원을 서로 공유하지 않는다.

멀티 프로세스

여러 개의 프로세스를 동시에 실행하는 것을 멀티 프로세스multi process라고 한다.

하나의 부모 프로세스parent process가 여러 개의 자식 프로세스를 생성함으로써 다중 프로세스child process를 구성하는 구조다.

부모 프로세스와 자식 프로세스는 각각 고유한 PID를 가진다. 즉, 부모 프로세스와 자식 프로세스는 독립적으로 실행되는 서로 다른 프로세스라는 것이다. 그렇기에 독립적인 메모리 공간을 사용한다.

그러나 부모 프로세스와 자식 프로세스는 서로의 PID를 알고 있다. 부모 프로세스는 자식 프로세스의 PID를 이용해 자식 프로세스를 제어할 수 있고, 자식 프로세스는 부모 프로세스의 PID를 통해 통신할 수 있다.

스레드

스레드thread란 프로세스를 구성하는 실행의 흐름 단위이다.

자세한 내용은 스레드 참고.

프로세스의 자원 공유

앞서 언급했듯, 프로세스는 독립된 자원과 메모리 공간을 가지며, 기본적으로 자원을 공유하지 않는다. 그러나 프로세스 간에도 자원을 공유하고 데이터를 주고 받을 수 있다. 이를 프로세스 간 통신IPC, Inter-Process Communication이라 부른다.

참고자료