프로그램, 프로세스, 그리고 쓰레드

Jiwoo Kim·2021년 8월 21일
0

척척학사개발자

목록 보기
4/7
post-thumbnail

이 포스팅은 아래 질문의 답을 명확하게 정리하는 글이다.

🙋 프로그램, 프로세스, 쓰레드가 뭔가요?


📝 실행 단위

우선 프로그램, 프로세스, 쓰레드의 정의에 대해 알아보고, 헷갈리는 용어들을 차근차근 비교해보자.


📌 Data Memory Hierarchy

그 전에, 프로그램, 프로세스, 쓰레드의 정의를 이해하려면 컴퓨터의 데이터 저장소 계층구조를 알아야 한다. 데이터가 어디에 어떤 형태로 위치하는 지에 따라 각 용어가 정의되기 때문이다.

컴퓨터는 데이터를 효율적으로 저장하고 사용하기 위해 데이터 기억장치를 여러가지 종류를 나누어 관리한다. 컴퓨터의 작동 속도를 높이기 위해서는 CPU의 처리속도 뿐 아니라, CPU까지 데이터를 불러오고 저장하는 속도도 중요하기 때문이다.

우선 데이터 기억장치는 레지스터(Reg), 캐시 메모리(SRAM), 주기억장치(DRAM)와 보조기억장치(Disk)로 나뉜다. 레지스터는 중앙처리장치에 포함된 기억장치다. 캐시 메모리는 레지스터와 주기억장치 사이에서 IO 속도를 높이기 위해 사용된다. 또한, 주기억장치는 CPU가 직접 데이터를 읽고 쓰고 있는 장치이고, 보조기억장치는 할 수 없는 장치를 의미한다.

위의 그림에서 알 수 있듯이, 상위에 있을 수록 CPU에 가깝고, 빠르고, 용량이 작으며, 하위에 있을 수록 CPU에서 멀고, 느리고, 용량이 크다.


📌 Program

Disk에 정적으로 존재하는 실행파일

프로그램은 정적으로 디스크에 존재하는 명령어의 묶음이다.

컴퓨터가 특정 작업을 하기 위해 수행해야 할 일들을 정의하고 나열한 것을 소스코드라 하고, 이것을 실행가능한 형태로 만든 것을 실행파일이라 한다. 프로그램은 이러한 실행파일이 디스크에 정적으로 고정된 형태로 저장되어 있는 것을 의미한다.


📌 Process

Memory에 존재하는 실행 중인 프로그램

메모리로 로드돼서 실행 중인 프로그램의 인스턴스를 프로세스라 한다.

프로그램을 실행시키면 구동에 필요한 데이터가 복사되어 메모리로 로드되고, OS로부터 수행에 필요한 자원을 할당받는다. 이 때 하나의 복사된 프로그램을 인스턴스라 칭하고, CPU 자원을 할당 받아서 인스턴스를 실행 중인 것을 프로세스라 한다.

각 프로세스는 개별적, 독립적인 문맥(Context)를 가지며, OS는 이 Context에 따라 실행상태를 제어한다.

Context

Context는 OS가 프로세스의 현재 상태를 규명하기 위해 필요한 요소를 의미한다. Context의 요소는 크게 HW Context, Kernel Address Space, Process Address Space 세 가지로 구분된다. 그 중 HW Context와 Kernel Address Space는 CPU Scheduling 실행을 위한 공간이기 때문에 모든 프로세스를 아울러 공통으로 관리된다.

HW Context

HW Context는 Program Counter, Register 값들을 포함한다. 그 중 Program Counter는 다음에 수행해야 할 코드의 주소를 가리키고, CPU를 할당받으면 PC 위치에 있는 명령어부터 차례로 수행한다.

Kernel Address Space

Kernel Address Space는 커널 영역으로, 각 프로세스의 Process Control BlockKernel Stack을 포함한다.

그림에서 볼 수 있듯이, Kernel Address Space는 각 프로세스의 PCB와 Kernel Stack을 모아 관리하는 영역이다. Ready, Blocked 상태였던 프로세스가 다시 Running 될 때 프로세스의 문맥을 복구하기 위해 OS Kernel 영역에 저장해놓는 것이다.

Process Control Block

각 프로세스의 PCB는 당연히 프로세스별로 독립적으로 생성되고 관리된다. 내부 구성은 위의 오른쪽 그림과 같고, 저장되는 위치는 Kernel Address Space의 Data 영역이다. 프로세스에 관해 OS가 알아야 할 중요한 정보이기 때문에, 일반 사용자가 접근할 수 없는 커널 영역에서 관리된다.

Process Address Space

Process Address Space는 프로세스의 메모리 구조로, PCB와 마찬가지로 프로세스별로 독립적으로 생성되고 관리된다. 프로세스마다 별도의 4GB 가상 메모리를 할당해서 부여하며, 물리 메모리에 로드할 때는 필요한 양만큼만 할당해서 사용한다.

구조는 아래 그림과 같이 Code, Data, Heap, Stack으로 이루어져 있다.

Heap과 Stack은 논리적인 구분이며, 물리적으로는 하나의 Stack 공간에 함께 존재한다. Heap은 낮은 주소에서 높은 주소로 쌓이고, Stack은 높은 주소부터 낮은 주소까지 쌓인다.

각 영역의 내용과 특징은 아래 표와 같다.

ContentsRead & WriteAllocation
CodeCodeRead-OnlyStatic
DataGlobal variables, Static variablesRead-WriteStatic
HeapDynamic memory allocationRead-WriteDynamic on Runtime
StackLocal variables, Parameters of Executing FunctionRead-WriteDynamic on Compile

📌 Thread

실행 흐름의 단위

프로세스로부터 파생되어 프로세스의 자원을 활용하는 실행 단위를 쓰레드라 한다.

프로세스는 최소 한 개 이상의 쓰레드를 가지며, 프로세스 최초 실행 시 실행되는 쓰레드를 Main Thread라고 한다. 쓰레드는 프로세스 주소 공간 중 Code, Data, Heap은 공유하지만 Stack은 독립적으로 사용한다.


다음 포스팅에서는, 프로그램에 대한 다중 처리방식에 대해 알아보자.


참고

Reading Notes: Chapter 6 of CSAPP-Memory Hierarchy
OPERATING SYSTEMS (OS)

0개의 댓글