본문 바로가기

취업을 준비하며 정리하는 컴퓨터 지식/Operating System

[Operating System] 프로세스는 뭐야?

728x90

< 맥 Activity Monitor 일부 >

위의 사진을 보면 process name 부분에 메모장, 파워포인트, 엑셀과 같은 프로그램들이 있는 것을 확인할 수 있습니다. 방금 언급했듯이 메모장, 파워포인트, 엑셀은 프로그램인데 왜 프로세스로 분류되어 있을까?

 

컴퓨터를 사용할 때 또는 개발을 할 때 프로세스라는 단어는 어렵지 않게 찾아볼 수 있습니다. [Operating System] 프로세스는 뭐야? 에서는 프로세스를 공부하면 궁금했던 점들을 위주로 정리해보겠습니다.

프로그램 vs 프로세스

메모장은 프로그램도 될 수 있고, 프로세스도 될 수 있습니다. 그렇다면 어떻게 구분하는지는 두 용어의 정의를 확인해보면 알 수 있습니다.

  • 프로그램:  보조 기억 장치에 저장된 실행 가능한 파일로 명령어와 정적인 데이터의 묶음으로 메모리에 적재되어 있지 않다.
  • 프로세스:  프로그램이 메모리에 적재되어 실행 중인 상태

위의 정의들을 살펴보면 프로세스와 프로그램은 메모리에 적재 유무에 따라서 구분할 수 있다는 것을 알 수 있습니다.

 

프로세스에서 실행 중인 상태란 CPU에 의해 현재 실행되고 있거나, ready state 상태로 기다리고 있거나, 입출력 등으로 중단되어 CPU로부터 실행을 대기하고 있는 상태를 말합니다.

하나의 프로그램을 여러 번 실행시킬 수 있을까?

컴퓨터를 사용할 때 크롬 웹 브라우저에서 유튜브, 자료조사, 블로글 글 작성을 동시에 할 수 있는 것 처럼 하나의 프로그램 (크롬)을 여러 번 실행시킬 수 있습니다. 다음은 하나의 프로그램을 여러 번 실행시킬 때의 메모리 구성 예시입니다.

 

chrome 프로그램의 다중 인스턴스 프로세스

이렇게 프로그램을 실행 시킬 때마다 독립된 프로세스들이 생겨나고, 이 프로세스들을 프로그램의 다중 인스턴스라고 말합니다. 같은 프로그램이지만 다른 프로세스 번호를 가지고 있고, 서로 다른 메모리에 적재되는 등 별개의 프로세스들로 다뤄집니다.

프로세스의 구성

프로세스는 4개의 메모리 영역을 구성되어 있습니다. 4개의 메모리 영역은 다음과 같습니다.

  • 코드 영역: 프로세스 코드가 적재되는 영역
  • 데이터 영역: 프로세스의 전역 변수와 정적 변수들이 적재되는 영역
  • 힙 영역: 프로세스가 실행 중에 동적 할당받는 영역 ex) c언어: malloc, c++: new
  • 스택 영역: 함수가 호출될 때, 지역변수, 매개변수, 함수의 리턴 값 등이 저장되는 영역

위의 4가지 영역을 시각화하면 다음과 같습니다.

< 프로세스 영역 시각화 >

위의 자료를 확인해보면 힙 영역과 스택 영역이 자라는 방향과 코드 영역, 데이터 영역, 힙 영역이 붙어 있는 것을 확인할 수 있습니다.

 

이것을 통해 프로세스가 실행 중일 때에는 힙 영역과 스택 영역만 메모리 공간을 사용하고, 데이터 영역과 코드 영역의 크기는 프로세스가 실행 중에는 변하지 않는다는 것을 알 수 있습니다.

 

여담으로 stackoverflow 에러를 한번쯤 경험해보았을 거라고 생각되는데 stackoverflow는 스택 영역이 힙의 영역을 침범했을 때 발생하는 에러입니다.

프로세스 제어 블록 (PCB)는 어떤 정보를 가지고 있나?

프로세스 번호, PID(Process Identification Number)

운영체제가 각 프로세스의 고유성을 확인하기 위해 프로세스에 부여한 ID를 저장하고, 이를 PID라고 부릅니다.

 

부모 프로세스 번호, PPID(Parent Process Identification Number)

최초의 init 프로세스를 제외하고는 모든 프로세스는 부모 프로세스가 존재합니다. 따라서 프로세스들 간에는 부모-자식 관계가 형성되므로 부모 프로세스 ID를 저장하고, 이를 PPID라고 부릅니다.

 

프로세스 상태 정보 (Process State)

프로세스는 new, running, ready, blocked 등 여러 가지 상태를 가지고, 실행 중에 지속적으로 상태가 변하게 됩니다. 따라서 운영체제는 프로세스의 상태가 변경될 때마다 PCB에 상태 정보를 저장하게 됩니다.

 

프로세스 컨텍스트 정보 (Process Context)

운영체제에서 현재 실행 중인 프로세스를 중단시키고 다른 프로세스를 실행시킬 때, 현재 프로세스의 context를 PCB에 저장합니다. context에는 다음과 같은 정보들이 있습니다.

  • PC 레지스터: 다음에 실행할 기계 명령의 메모리 주소를 저장하는 레지스터
  • IR 레지스터: 실행하기 위해 메모리에서 읽어 온 명령이 저장된 레지스터
  • SP 레지스터: 스택 영역의 꼭대기 메모리 주소를 저장하는 레지스터

스케줄링 정보

프로세스 스케줄링 시에 사용되는 다음 값들을 저장합니다.

  • 프로세스의 우선순위
  • 프로세스가 사용한 CPU 시간, 최근에 CPU를 할당받아 실행한 시간

종료 코드

프로세스가 종료할 때 종료된 이유를 부모 프로세스에게 전달하기 위해 종료 코드를 PCB에 저장합니다.

프로세스의 생명 주기와 상태 변이

메모리에는 여러 프로세스들이 올려놓고 번갈아가며 실행시키기 때문에 프로세스의 상태는 지속적으로 변하게 됩니다. 따라서 운영체제는 프로세스의 상태를 정의해놓고 관리합니다. 다음은 프로세스의 생명 주기와 상태 변이를 나타낸 것입니다. 위 자료에서 보이는 상태들에 대해서 알아보겠습니다.

< 프로세스 상태 변이 >

  • new: 프로세스를 생성할 때 상태를 나타낸다. 이때, 운영체제는 프로세스를 메모리에 적재하고 PCB를 만들어 프로세스의 상태를 new로 저장한다.
  • ready: 프로세스가 스케줄링을 기다리는 준비 상태를 나타낸다. ready 상태의 프로세스들은 커널에 있는 ready queue에 저장되고 스케줄링을 통해 선택되는 것을 기다린다. 이때, 오래 동안 선택받지 못한 프로세스를 starving process라고 부른다.
  • running: 프로세스가 CPU에 의해 실행되고 있는 상태를 나타낸다. 프로세스의 실행이 완료되면 커널은 프로세스를 terminated/zombie 상태로 변환시킨다.
  • waiting: 프로세스가 자원을 요청하거나 I/O를 요청하고 완료를 기다리는 상태를 나타낸다. 이때, 자원이나 I/O 요청이 완료되어도 running 상태로 돌아가지 않고, ready 상태로 변환한 후에 ready queue에서 스케줄러의 선택을 기다린다.
  • termintead/zombie: 프로세스가 종료하고 부모 프로세스가 종료 코드를 읽어주기는 기다리는 상태를 나타낸다. 이때 자식 프로세스의 종료 코드는 PCB에 저장된 채 남아있게 된다. 따라서 종료되었지만 완전히 종료되지 않은 상태이므로 Zombie Process라고 부른다. 
  • terminated/out: 부모 프로세스가 Zombie 상태의 자식 프로세스의 종료 코드를 읽어갈 때(wait() 호출)의 상태를 나타낸다.

참고문헌 - 명품 운영체제 / 황기태 저 / 2021 / 생능출판사

728x90