포스트

프로세스

프로세스 개요

프로세스란 실행 중인 프로그램을 의미한다. 프로그램 자체는 디스크 내 파일로 존재하는, 동작을 하지 않는 정적이며 수동적인 개체이기 떄문에 이를 실행시키려면 운영체제로부터 프로그램이 동작하는 데 필요한 자원들(CPU, 메모리, 입출력장치 등)을 할당받아야 한다. 이처럼 자원을 할당받아 실행에 들어간 프로그램을 프로세스라 하며, 프로세스는 프로그램과 달리 ‘동작을 하는 능동적인 개체’로 본다.

프로세스의 동작은 CPU가 해당 프로세스의 명령들을 실행하는 것이다. 이 때문에 운영체제는 실행 준비가 된 프로세스들이 적절히 CPU를 배정받아 효율적으로 작업을 처리할 수 있도록 관리해야 하며, 배정을 효율적으로 하는 정책을 스케줄링이라고 한다.

프로세스의 구성

프로세스의 구성은 크게 메모리 구조와 프로세스 제어 블록으로 나누어 생각할 수 있다. 메모리 구조는 프로그램 실행에 직접적으로 필요한 코드와 데이터로 이루어지고, 프로세스 제어 블록은 운영체제가 프로세스를 관리하기 위해 필요한 정보들로 이루어진다.

여기서 메모리 구조는 다시 코드 영역과 데이터 영역으로 나뉘는데, 코드 영역은 해당 프로세스의 프로그램 자체를 의미한며 CPU는 이 코드 영역에서 명령을 하나씩 꺼내 처리한다. 데이터 영역은 프로세스가 사용하는 상수 또는 변수의 값, 서브프로그램의 호출상태 등의 프로그램 실행 중 필요한 데이터를 보관한다. 이 데이터 영역은 정적 데이터 영역, 스택 영역, 그리고 힙 영역으로 한 번 더 세분화된다.

프로세스 제어 블록(Process Control Block)은 운영체제가 각 프로세스를 관리하기 위해 구성하는데, 여기에는 해당 프로세스의 정보가 보관된다.
프로세스 제어 블록의 주요 항목들은 다음이 있다:

  • 프로세스 번호 (Process Identification: PID): 프로세스의 구분 기준이 되는 식별자
  • 프로세스 상태: 실행, 준비 등 프로세스의 현재 상태
  • 프로그램 카운터 (Program Counter: PC): 프로세스 수행을 위해 다음에 실행할 명령의 주소의 목록
  • 레지스터: CPU의 레지스터에 해당하는 정보
  • 메모리 관리 정보: 가상주소와 실주소의 매핑 정보
  • 프로세스 우선순위: 운영체제의 프로세스 스케줄링 정책

process

  • 코드(code) 영역: 작성한 코드가 적재되는 공간으로, 0과 1로 변환된 기계어가 저장된다.
  • 데이터(data) 영역: 작성한 코드에서 선언된 전역변수, 정적변수, 상수 등이 저장되며, 프로세스 시작 시 초기화된다.
  • 스택(stack): 지역변수, 매개변수, return 주소들이 저장된다.
  • 힙(heap): 동적으로 생성되는 데이터 구조나 객체들이 저장된다. 동적으로 할당되는 메모리로, 실행 중 동적으로 확장될 수 있다.

Program Counter와 Stack Pointer

프로그램 카운터(Program Counter)

  • 실행할 명령어의 주소를 가리키는 레지스터이다.
  • 코드를 실행시키면 코드가 한 줄씩 내려가면서 실행이 되는데, 다음 실행할 코드의 주소를 알아야만 이를 찾아 실행이 가능하다.
  • 명령어를 순차적으로 실행시키며 PC값을 증가시켜 다음에 실행할 명령어를 가리킨다.
  • 프로그램의 흐름이 분기 또는 점프 명령어를 만나면 PC의 값은 분기된 주소로 변경되며 해당 줄에서의 명령어를 실행한다.
  • 인터럽트(예외상황)이 발생하면 현재 실행 중이던 명령어의 주소를 저장하고, 인터럽트가 적절하게 핸들링 된 후 다시 실행될 코드의 위치를 제공한다.

스택 포인터(Stack Pointer)

  • 현재 실행 중인 프로세스의 스택의 최상단을 가리키는 레지스터이다.
  • 데이터가 Push되어 스택에 삽입되면 삽입된 데이터의 주소를 가리킨다.
  • 데이터가 Pop되어 스택에서 제거되면 이전의 주소를 기리킨다.

프로세스의 상태관리

프로세스는 생성, 준비, 실행, 대기, 종료의 다섯 가지 상태 중 하나에 있게 된다.

process

  • 생성 (New): 프로세스가 생성 중인 상태
  • 실행 준비 (Ready): 실행을 위해 준비된 상태로, CPU 할당을 기다림
  • 실행 (Running): 현재 CPU를 할당받아 실행 중인 상태
  • 대기 (Waiting): 입출력 완료 등 특정 이벤트를 기다리는 상태
  • 종료 (Terminated): 실행이 완료되어 종료된 상태

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.