컴퓨터를 사용하다보면 이 프로세스(Process)라는 용어를 많이 들어봤을 것입니다.

프로세스는 간단하게 메모리에서 실행 중인 프로그램을 말합니다.

보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 되며, 이 과정을 프로세스를 생성한다라고 합니다.

여기서 프로세스(Process)와 프로그램(Program)의 차이점은 무엇일까요?
일단, 프로그램은 파일 시스템에 존재하는 실행 파일입니다. 프로세스는 그 프로그램을 실행 시키는 실행 주체, 인스턴스라고 말하는데, 메모리에 올라와 CPU를 할당받고 프로그램이 실행되고 있는 상태를 말합니다.
그래서, 프로세스를 프로그램의 인스턴스라고도 말합니다.

이 프로세스는 사용자가 볼 수 있는 공간에서 실행되는 포그라운드 프로세스(Foreground Process)와 사용자가 보지 못하는 뒤편에서 실행되는 백그라운드 프로세스(Background Process)가 존재합니다.

백그라운드 프로세스 중에 사용자와 상호작용하지 않고 그저 묵묵히 정해진 일만 수행하는 백그라운드 프로세스가 있는데, 이를 윈도우에서 서비스(Service)라고 부르며, 유닉스에서는 데몬(Daemon)이라고 부릅니다.

프로세스 제어 블록(PCB)

프로세스들은 실행을 위해 CPU 자원을 사용하는데, 모든 프로세스가 동시에 CPU를 사용할 순 없습니다.

그래서, 프로세스들은 정해진 시간만큼만 CPU를 이용하고, 인터럽트가 발생하면 자신의 차례를 넘기고 다음 차례가 올 때까지 기다립니다.

운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분합니다.

이를 위해 운영체제는 프로세스 제어 블록(Process Control Block)을 이용합니다.

프로세스 제어 블록은 프로세스에 대한 모든 정보가 들어있으며, 커널 영역에 생성됩니다.

프로세스 제어 블록 안에는 프로세스 번호(PID), 프로세스의 상태(running, waiting...), 프로세스의 PC(Program Counter) 값, MMU 정보, CPU 시간, 등의 정보가 들어있습니다.

프로세스 제어 블록에 대해서 요약하자면, CPU는 한 프로세스가 종료될 때까지 수행하는 것이 아니라 여러 프로세스를 계속 바꿔가면서 수행합니다.

그렇기 때문에 CPU는 수행중인 프로세스를 잠시 중지할때, 이 프로세스의 정보를 어딘가에 저장하고 있어야 다음에 이 프로세스를 수행할 때 이전에 수행한 그 다음부터 이어서 작업할 수 있습니다.

이러한 정보를 저장하는 곳이 프로세스 제어 블록입니다.

문맥 교환(Context Switching)

프로세스 A가 CPU 자원을 할당받아 사용하다가 프로세스 B에게 넘긴다면, 프로세스 A의 정보(각종 레지스터 값, 메모리 정보 등)들을 백업해야 다음 차례가 와서 실행했을 때, 이어 받아 실행을 재개할 수 있을 것입니다.

바로 위에서 설명한 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 문맥(Context)이라고 합니다.

이 문맥은 해당 프로세스의 PCB에 기록됩니다.

그래서 문맥 교환이 무엇일까요?

CPU가 한 프로세스에서 다른 프로세스로 옮겨가는 것을 뜻하며, 실행 중인 프로세스를 중지하고 다른 프로세스를 실행하는 식으로 동작합니다.

이 문맥 교환은 한 작업이 끝날 때까지 기다리는 것이 아니라 여러 작업을 끊임없이 빠르게 번갈아가며 실행되는 원리입니다. 그래서 사용자들 눈에는 프로세스들이 동시에 실행되는 것처럼 보입니다.

또한, 문맥 교환은 인터럽트가 발생하면 현재 프로세스의 정보를 PCB에 저장하고 새로운 프로세스의 상태를 레지스터에 저장하는 방식으로 동작합니다.

프로세스의 메모리 영역

프로세스가 생성되면 커널 영역에 PCB가 생성되며, 사용자 영역에는 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장됩니다.

코드 영역

실행할 수 있는 코드(기계어로 이루어진 명령어)가 저장됩니다. 코드 영역에는 데이터가 아닌 CPU가 실행할 명령어가 저장되어 있기 때문에 쓰기가 금지되어 있습니다. 즉, 읽기 전용(Read-Only) 공간입니다.

데이터 영역

프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간이며, 전역 변수(Global Variable)가 대표적입니다.

위에서 설명한 코드 영역데이터 영역은 프로그램을 구성하는 명령어들이 갑작스럽게 바뀔 일도 없고 데이터 영역에 저장된 내용은 프로그램이 실행되는 동안 계속 유지될 것이기 때문에 공간의 크기가 변하지 않는 저정 할당 영역이라고 부릅니다.

힙 영역

개발자가 직접 할당할 수 있는 저장 공간으로, 프로그래밍 과정에서 이 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 합니다.

메모리 공간을 반환하지 않는다면 메모리 낭비를 초래하며, 이를 메모리 누수(Memory Leak)라고 합니다.

스택 영역

데이터를 일시적으로 저장하는 공간으로, 데이터 영역과는 다르게 잠깐 사용하다가 없어지는 함수의 매개 변수, 지역 변수가 대표적입니다.

스택 자료구조처럼, 일시적으로 저장할 데이터는 PUSH되고, 더 이상 필요하지 않은 데이터는 POP됨으로써 스택 영역에서 사라집니다.

힙 영역과 스택 영역은 실시간으로 크기가 변할 수 있기 때문에 동적 할당 영역이라고 부릅니다. 그래서, 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고, 스택 영역은 높은 주소에서 낮은 주소로 할당됩니다. 이러면 서로 주소가 겹칠 일이 없게 됩니다.

이상으로 프로세스에 대해서 간단히 알아봤습니다.

참고

  • KOCW - 운영체제, 양희재 교수님
  • 혼자 공부하는 컴퓨터구조 + 운영체제
profile
꾸준함으로 성장하는 개발자 지망생

0개의 댓글