프로세스의 개념

바탕화면에 있는 프로그램을 더블 클릭하면 프로그램이 실행됩니다. 프로그램이 실행된다는 것은 해당 코드가 메모리에 올라와 작업이 진행된다는 의미와 같습니다. 흔히 프로그램이 실행이 되면 프로세스가 된다는 표현을 합니다. 프로그램은 저장장치에 저장되어 있는 정적인 상태, 프로세스는 실행을 위해 메모리에 올라온 동적인 상태입니다.

프로그램을 쉽게 말하자면 어떤 데이터를 사용하여 어떤 작업을 할지 절차를 적어놓은 것이죠. 프로세스라는 표현은 작성된 작업 절차를 실제로 실행에 옮긴다는 의미입니다. 즉, 프로그램이 실행되면 이것은 프로세스라고 불리는 것이죠.

process=program in execution

프로그램이 프로세스로 변환되는 과정부터 천천히 프로세스에 대한 내용을 살펴보겠습니다.

프로세스로의 전환

먼저 운영체제는 프로그램을 메모리의 적당한 위치로 가져옵니다. 또한 PCB(Process Control Block)라는 제어 블록을 생성합니다. PCB에는 프로세스 실행에 필요한 여러가지 정보가 담겨있습니다. 쉽게 비유하자면 프로세스는 요리를 만드는 과정이고 PCB는 요리를 만들때 고려할 사항등을 적어놓은 주문서라고 볼 수 있습니다. 어떤 프로그램이 프로세스가 되었다는 것은 운영체제로부터 PCB를 받았다는 것을 의미합니다.

PCB의 정보 중 대표적인 세 가지는 다음과 같습니다.

  1. 프로세스 구분자 - 프로세스 id에 해당합니다. 프로세스를 구분하기 위해 사용합니다.
  2. 메모리 정보 - 프로세스의 메모리 위치 정보가 담겨 있습니다. 메모리 보호를 이한 경계 레지스터와 한계 레지스터도 포함되어 있습니다.
  3. 각종 중간값 - 프로세스가 사용했던 중간값들이 저장됩니다. 시분할 시스템에서는 여러 프로세스가 번갈아가며 실행되기 때문에, 각 프로세스는 실행되던 도중 멈추고, 다시 실행되는 과정이 반복됩니다. 따라서 다음 작업할 코드의 위치(Program Counter), 작업의 중간값 등을 저장해놓을 필요가 있습니다. PCB는 이러한 값들을 저장합니다.

프로세스를 실행하기 위해선 프로세스 구분자, 메모리 관련 정보, 프로그램 카운터와 각종 중간값을 관리해야 하며, 이러한 정보를 보관하는 데이터 구조가 PCB입니다.

PCB의 생성

PCB는 운영체제가 프로세스를 위해 관리하는 데이터 구조이기에 운영체제 영역에서 만들어집니다. 또한 프로세스가 종료되면 프로세스와 함께 폐기됩니다. 프로그램이 메모리에 올라와 프로세스가 되면서 PCB가 생성되는 과정을 그림으로 살펴보겠습니다.
프로그램과 프로세스는 다음과 같이 표현할 수 있습니다.

프로세스 = 프로그램 + PCB

프로그램 = 프로세스 - PCB

프로세스의 상태

현대 시분할 시스템에서 프로세스의 상태는 다양합니다. 실행중인 프로세스가 다른 프로세스에 CPU를 넘겨주는 일이 빈번하기 때문입니다. 프로세스는 기본적으로 다음과 같은 상태를 가지고 있습니다.
오늘날의 프로세스는 효율적인 처리를 위해 다양한 상태를 가지고 있습니다. 한가지씩 살펴보며 전체적인 흐름을 이해해보겠습니다.

  1. 생성 상태 - 프로그램이 메모리에 올라오고 PCB를 할당받은 상태입니다. 생성된 프로세스는 바로 실행되는것이 아니라 준비 상태가 되어 자신의 순서를 기다립니다. (메모리 할당과 PCB 생성)
  2. 준비 상태 - 자신의 실행을 기다리는 상태입니다. ready queue라고 불리는 곳에서 기다리며 CPU 스케줄러에 의해 관리됩니다. CPU스케줄러는 큐를 몇 개 운영할지, 어떤 프로세스의 PCB를 실행 상태로 보낼지 등을 결정합니다.
  3. 실행 상태 - 실행 상태는 프로세스가 CPU를 할당받아 실행되는 상태입니다. 준비 상태에 있는 프로세스중 CPU의 개수만큼 실행상태가 될 수 있습니다. 실행 상태의 프로세스는 일정한 시간(타임 슬라이스)동안 작업할 수 있습니다. 이 시간이 지난 후에는 timeout이 되어 다시 준비상태로 넘어가고 다른 프로세스가 CPU를 실행할 수 있도록 합니다. 만약 작업이 완료된다면 exit이 실행됩니다. 또한 프로세스가 입/출력을 요청하면 CPU는 입출력 관리자에게 입출력을 요청하고 프로세스는 대기상태로 옮겨집니다.
  4. 대기 상태 - 실행 상태에 있던 프로세스가 입출력을 요청한 뒤 입출력이 완료될 때 까지 기다리는 상태입니다. 작업의 효율을 위해 만들어진 상태로 입출력 장치별로 존재하는 대기큐에서 대기합니다. 입출력이 완료되면 인터럽트가 발생하며 해당 PCB는 다시 준비 상태로 이동합니다.
  5. 완료 상태 - 작업이 완료되어 종료되는 상태입니다. 완료 상태에서는 코드와 사용했던 데이터를 메모리에서 삭제하고 PCB를 폐기합니다.

여기까지가 일반적인 프로세스의 다섯 상태입니다. 위 다섯가지 상태를 "활성상태"라고 하며 일반적인 프로세스는 이런 상태를 가지고 운영됩니다. 활성 상태 이외에 또 다른 상태가 있는데 이는 보류상태라고 불립니다. 위 그림의 아래에 있는 상태에 해당합니다.

보류상태는 프로세스가 메모리에서 잠시 쫒겨난 상태로 일시 정지 상태 라고도 불립니다. 프로세스는 일반적으로 다음과 같은 경우 보류상태가 됩니다.

  • 메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보내야 할 때
  • 프로그램에 오류가 있어서 실행을 미뤄야 할 때
  • 바이러스와 같은 악의적은 프로세스라고 판단될 때
  • 매우 긴 주기로 반복되는 프로세스라 메모리 밖으로 쫒아내도 큰 문제가 없을 때
  • 대기상태의 프로세스의 입출력이 계속 지연될 때

이외에도 다양한 이유로 프로세스는 보류상태가 되는데, 대부분이 컴퓨터의 성능을 떨어뜨리거나 실행을 미루어도 큰 지장이 없는 프로세스입니다.

보류 상태에 들어간 프로세스는 메모리 밖으로 쫒겨나 "스왑 영역"이라는 장소에 보관됩니다. 스왑 영역은 메모리에서 쫒겨난 프로세스가 일시적으로 보관되는 곳입니다.

보류상태는 준비상태와 대기상태에서 각각 옮겨진 경우로 나뉘며 각 상태에서 재시작 되는 경우 원래의 활성 상태로 옮겨집니다. 또한 보류 대기 상태에서 입출력이 완료되면 보류 준비 상태로 옮겨집니다.

PCB

프로세스의 전반적인 상태를 살펴봤으니 PCB를 살펴보겠습니다.
PCB는 프로세스를 실행하는데 필요한 정보를 저장하는 자료구조입니다. 모든 프로세스는 고유의 PCB를 가지며 프로세스 생성 시 만들어져 프로세스가 실행을 완료하면 폐기됩니다. PCB에는 다음과 같은 정보가 들어있습니다.

  1. 포인터 - 프로세스의 준비상태나 대기상태는 큐로 운영되는데, 프로세스 제어 블록을 연결하여 준비 상태나 대기 상태의 큐를 구현할 때 포인터를 사용합니다.
  2. 상태(status) - 생성, 준비, 실행, 대기, 보류 등의 상태가 있으며 현재 프로세스가 어떤 상태인지 나타냅니다.
  3. 프로세스 구분자 - 프로세스 id입니다.
  4. 프로세스 카운터 - 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터의 값을 저장합니다.
  5. 프로세스 우선순위 - 프로세스의 중요도는 각기 다릅니다. 사용자 프로세스보다 커널 프로세스가 우선순위가 높고, 같은 사용자 프로세스끼리도 우선순위가 전부 다릅니다.
  6. 각종 레지스터 정보 - 프로세스가 실행되는 중에 사용하던 중간값들이 보관됩니다.
  7. 메모리 관리 정보 - 프로세스가 메모리의 어디에 있는지 나타내는 메모리 위치 정보와 메모리 보호를 위한 경계 레지스터 값, 한계 레지스터 값 등이 저장됩니다. 이외에도 세그먼테이션 테이블, 페이지 테이블 등의 정보도 보관합니다.
  8. 할당된 자원 정보 - 프로세스 실행을 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보를 말합니다.
  9. 계정 정보 - 계정 번호, CPU 할당 시간, CPU 사용 시간 등이 저장됩니다.
  10. 부모 프로세스 구분자와 자식 프로세스 구분자 - 부모 프로세스 구분자를 가리키는 PPID와 자식 프로세스를 가리키는 CPID정보가 저장됩니다.

문맥 교환(Context Switching)

문맥 교환은 CPU를 사용하던 프로세스가 나가고 새로운 프로세스가 CPU를 점유하는 작업을 말합니다. 이때 두 프로세스의 PCB 정보가 변경됩니다. 실행 상태에서 나가는 프로세스의 PCB는 지금까지의 작업 정보를 저장하고, 실행 상태로 들어오는 프로세스의 PCB의 내용으로 CPU가 다시 세팅됩니다. 이와 같이 두 프로세스의 PCB를 교환하는 작업을 문맥 교환이라고 합니다.

프로세스 p1과 p2의 문맥교환을 간단하게 나타내면 다음과 같습니다.

  1. p1 실행, p2 준비
  2. p1 타임아웃
  3. p1의 상태를 pcb1에 저장, pcb2에서 p2의 상태를 가져옴
  4. p2 디스패치
  5. p2 실행, p1 준비
  6. p2 타임아웃
  7. p2의 상태를 pcb2에 저장, pcb1에서 p1의 상태를 가져옴
  8. p1 디스패치
  • 쉽게 배우는 운영체제, 조성호, 한빛아카데미
profile
웹 개발을 공부하고 있는 윤석주입니다.

1개의 댓글

comment-user-thumbnail
2021년 10월 30일

우와앙 !!
너무 이해가 잘됩니다

답글 달기