프로세스란 무엇일까? (프로세스와 프로그램, PCB, 프로세스 상태, 컨텍스트 스위칭까지 전부 알아보자)

Chan Young Jeong·2023년 2월 1일
0

운영체제

목록 보기
1/11
post-thumbnail
post-custom-banner

프로세스

프로세스와 프로그램의 차이

프로세스는 컴퓨터에서 실행되고 있는 프로그램을 말하며 CPU 스케줄링의 대상이 되는 작업(Task)이라는 용어와 거의 같은 의미로 쓰입니다.
다음 그림에서 볼 수 있는 것처럼 보조기억장치(HDD/SDD)에 저장되어 있는 프로그램이 인스턴스화되어(이것저것 자원을 할당 받음) RAM에 올라간 것을 프로세스라고 할 수 있습니다. 그리고 이 프로세스는 CPU 스케줄링의 대상이 되어 CPU에서 처리하게 됩니다.

+) 동시에 다양한 프로세스가 실행되는 것도 바로 사실은 운영체제의 CPU 스케줄링을 통해 프로세스를 빠르게 교체하기 때문입니다.(멀티태스킹)

예를 들어 어떤 실행 파일이 있을 때(KaKaoTalk.exe) 이를 더블 클릭하면 카카오톡이 실행되는 것이 바로 프로세스가 시작되는 것입니다.

작업관리자를 보면 다음과 같이 현재 실행중인 프로세스를 확인할 수 있습니다.

비교) 프로그램
프로그램은 컴파일러가 컴파일 과정을 거쳐 컴퓨터가 이해할 수 있는 기계어로 변역되어 실행될 수 있는 파일을 의미합니다. 참고로 여기서 말하는 프로그램은 C언어 기반 프로그램을 의미하며, 별도로 컴파일 과정 없이 한 번에 한 줄씩 읽어 들여서 실행하는 프로그램인 인터프리터 언어로 된 프로그램과는 다릅니다. 이에 대해서는 컴파일러와 인터프리터에 대해 더 찾아보면 될 것 같습니다.

좀 더 자세하게 위키피디아를 보면 다음과 같이 정의하고 있습니다.

컴퓨터에서 실행될 때 특정 작업(specific task)을 수행하는 일련의 명령어들의 모음(집합)이다. 특정 문제를 해결하기 위해 처리 방법과 순서를 기술하여 컴퓨터에 입력되는 일련의 명령문 집합체로 ... 대부분의 프로그램들은 하드디스크 등의 매체에 바이너리 형식의 파일로 저장되어 있다가 사용자가 실행시키면 메모리로 적재되어 실행된다.

프로세스의 메모리 구조

운영체제는 프로세스에 적절한 메모리를 할당하는데 다음과 같은 구조를 기반으로 할당합니다.

크게 스택 영역 ,힙 영역, 데이터 영역 , 코드 영역으로 나뉩니다.
스택 영역은 지역 변수, 매개 변수, 함수가 저장되고 컴파일할 때 크기가 결정됩니다.
힙 영역은 동적 할당할 때 사용되며 런타임 때 크기가 결정됩니다.

스택과 힙영역은 동적인 특징을 가집니다. 왜냐하면 재귀적으로 함수를 호출하는 상황을 보면 동적으로 크기가 늘어날 수 있기 때문에 스택 또한 동적으로 크기가 변합니다. 그렇기 때문에 스택과 힙 영역은 겹치면 안되기 때문에 사이의 공간을 비워 놓습니다.

데이터 영역은 전역 변수, 정적 변수가 저장됩니다. 그리고 BSS 영역과 Data 영역으로 나뉘고 BSS영역에는 초기화 되지 않은 변수가 0으로 초기화 되어 저장되며 Data영역에는 그 외의 값으로 할당된 변수들이 저장됩니다.
코드영역은 프로그램 소스 코드가 들어가는 영역으로 수정 불가능한 기계어로 저장되어 있으며 정적인 특징을 갖습니다. CPU는 코드영역에 저장된 명령어를 하나씩 처리합니다.

프로세스는 어떻게 구성이 되어있나요?

프로세스에 대한 정보는 프로세스 제어블록(PCB, Process Control Block)또는 프로세스 기술자(process descriptor)라고 부르는 자료구조에 저장됩니다. 프로세스에 대한 메타데이터를 저장하고 있습니다.
앞서 말했다시피 운영체제는 다양한 프로세스들을 번갈아서 실행한다고 했습니다. 그럼 이전에 작업했던 내용을 이어서 실행하기 위해서는 당연히 이전 작업과 관련된 내용을 저장해야할 텐데 이때 이 작업의 결과물들이 저장되느 곳이 PCB입니다.

PCB는 프로세스의 중요한 정보를 갖고 있기 때문에 일반 사용자가 접근하지 못하도록 커널 스택의 가장 앞부분에서 관리됩니다.

프로세스 제어블록은 다음과 같은 정보를 포함합니다.

  • 프로세스 ID : 프로세스의 고유 번호
  • 프로세스 스케줄링 상태 : 준비 ,대기 ,실행 등의 상태
  • 프로세스 권한: 컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보
  • 프로그램 카운터: 프로세스에서 실행하야할 다음 명령어 주소에 대한 포인터
  • CPU 레지스터: 프로세스를 실행하기 위해 저장해야할 레지스터에 대한 정보
  • CPU 스케줄링 정보: 스케줄러에 의해 중단된 시간 등에 대한 정보
  • 계정 정보: CPU 사용량, 실행한 유저의 정보
  • I/O 상태 정보: 프로세스에 할당된 I/O 디바이스 목록

프로세스의 상태

new, terminated

new, terminated, 상태는 말 그대로new는 새롭게 프로세스가 만들어질 때, terminated는 프로세스가 종료될 때 상태입니다. new와 terminated는 생기고 사라질 때 잠시 임시적으로 있는 상태이고 running, ready, waiting 3개의 상태가 돌아가면서 프로세스가 실행이 됩니다.

running

말 그대로 현재 cpu에서 실행이 되고 있는 상태입니다.

ready와 waiting

ready는 running할 준비가 되어 있는 것을 말합니다. "준비가 되어 있으면 바로 CPU쓰면 되는 거 아니야?" 할 수 있지만 "현재 다른 프로세스가 CPU를 사용 중이니까 나는 조금 기다려야 하는 구나" 하면서 ready 상태에 머물러 있는 겁니다. 현재 CPU를 사용 중인 프로세스가 사용을 끝내면 CPU를 차지하고 수행될 것을 기다리고 있는, 만반의 준비를 하고 있는 상태가 바로 ready입니다.

그렇다면 waiting은 뭘까요? 둘 다 기다리고 있는건데... 바로 waiting과 ready의 차이는 ready는 마치 달리기를 할 때 "준비 땅!"하면 바로 튀어나가 CPU를 사용할 준비가 되어 있는 상태이지만 waiting은 마치 계주에서처럼 바통이 오는 것을 기다리고 있는 상태입니다. 즉 waiting은 ready와는 다르게 I/O나 다른 이벤트가 발생하기를 기다리는 것을 나타내는 상태입니다.

running -> waiting ( I/O or Event Wait ,Block)

I/O 등의 자원 요청 후 즉시 할당받을 수 없어, 할당받을 때까지 기다리기 위해 running에서 waiting 상태로 전이되는 과정입니다.
I/O 처리는 CPU가 아닌 I/O 프로세스가 담당하기 때문에 Block이 발생합니다.

waiting -> ready ( I/O or Event Completion)

필요한 자원이 할당되면 프로세스가 waiting에서 ready 상태로 전이되는 과정입니다.

running -> ready (interrupt)

할당된 CPU 시간이 지나면 Timeout Interrupt 가 발생하여 CPU를 다른 프로세스에게 양도하고 자신은 ready 상태로 전이되는 과정입니다.

ready -> running (scheduler dispatch)

운영체제가 ready 상태에 있는 프로세스들 중 수행될 프로세스를 고르는 작업을 스케줄링이라고 합니다. 여기서 더 자세하게는 스케줄링은 다음으로 실행될 프로세스를 고르는 것이라 보면 되고 디스패치는 고른 애를 CPU에 올려 놓는 것입니다.

어떻게 스케줄링이 되는지는 다음 포스팅에서 알아보겠습니다.

컨텍스트 스위칭

멀티프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값(Context)을 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(Context)를 교체하는 작업을 Context Switch(Context Switching)라고 한다.

컨텍스트 스위칭은 앞서 PCB를 교환하는 과정을 말합니다. 한 프로세스에 할당된 시간이 끝나거나 인터럽트가 발생하면 ready상태에 있던 다른 프로세스가 실행되는데 이 때 컨텍스트 스위칭이 발생합니다. 즉 앞으로 수행될 프로세스의 정보가 CPU 레지스터에 저장이 됩니다.

컨텍스트 스위칭이 일어나는 과정을 보면 다음과 같습니다.

프로세스 Po가 CPU에서 실행 되고 있다가 인터럽트나 시스템 콜로 인해 실행이 멈추게 되어 waiting상태가 되었다고 합시다. 그러면 운영체제는 다른 프로세스 P1를 스케줄링하게 됩니다.

이 때 CPU 레지스터의 값은 이제 앞으로 실행될 프로세스에 관한 상태 정보로 교체되어야 합니다. (당연히 CPU는 레지스터에 있는 값을 보고 연산을 수행하니까!)
따라서, 이전까지 실행됐던 프로세스 Po의 상태 정보를 Po의 PCB에 저장하고 (다음에 다시 실행될 때를 위해서 이전에 실행된 위치를 저장해 놓는 것! 마치 SAVE POINT) 다음으로 수행될 프로세스 P1의 PCB를 CPU 레지스터에 로드합니다.

이렇게 프로세스를 변경할 때 레지스터에 프로세스의 정보가 바뀌는 것을 컨텍스트 스위칭이라고 합니다.

overhead

위 그림을 보면 Po가 실행되다가 idle이 될 때 바로 P1이 실행되지 않고 idle을 좀 더 하다가 실행이 됩니다. 그 이유는 Po의 상태를 Po의 PCB에 저장하고 P1의 상태를 P1의 PCB에서 가져와야 하기 때문입니다. 이 과정에서 CPU는 아무런 일도 하지 못하게 됩니다. 따라서 컨텍스트 스위칭이 너무 잦으면 오버헤드가 발생하여 성능이 떨어집니다.

+) 그래서 스레드가 프로세스보다 빠른 이유도 컨텍스트 스위칭이 한 몫합니다. 스레드는 컨텍스트 스위칭될 때 공유부분 말고 스택 및 간단한 정보만 저장하면 되기 때문에. ( 자세한 건 스레드 포스팅에서)

정리

프로그램 보조 기억장치에 저장되어 있는 바이트 코드고 이것이 실행되어 메모리에 적재된 것이 프로세스! 프로세스의 구조는 스택, 힙, 데이터 , 코드 영역으로 되어 있고 자신의 상태 정보를 저장하는 PCB가 존재한다! 그리고 프로세스는 여러 상태를 갖을 수 있다. (ready, running, waiting,new, terminated) 그리고 운영체제가 스케줄링을 통해 프로세스를 교체하는데 이를 컨텍스트 스위칭이라고 한다.


출처

위키피디아
면접을 위한 CS 전공지식 노트
양햄찌가 만든 세상

post-custom-banner

0개의 댓글