프로세스와 스레드
프로세스란
디스크에 저장된 프로그램이 메모리에 로드되어 실행 중인 상태를 프로세스라고 한다.
프로그램 vs 프로세스
프로그램
프로그램은 디스크에 저장된 정적인 실행 파일이다. 예를 들어 Chrome.exe 파일은 하드디스크에 저장되어 있는 명령어와 데이터의 집합에 불과하며, 아직 실행되지 않은 상태다.
이 상태에서 프로그램은 어떠한 시스템 자원도 사용하지 않는다. 단지 디스크 공간만 차지할 뿐, CPU나 메모리를 소비하지 않는다. 사용자가 언제든 실행할 수 있도록 디스크에 대기하고 있는 상태라고 볼 수 있다.
프로세스
반면, 프로세스는 프로그램이 메모리에 로드되어 실행 중인 동적 상태다. 사용자가 Chrome.exe를 더블 클릭하면 운영체제는 이 프로그램을 메모리에 로드하고, CPU와 메모리 등의 시스템 자원을 할당한다. 이렇게 생성된 프로세스는 CPU를 사용하여 실제로 작업을 수행한다.
중요한 점은 하나의 프로그램으로 여러 개의 프로세스를 생성할 수 있다는 것이다. 예를 들어 Chrome 브라우저를 여러 창으로 열면 동일한 Chrome.exe 프로그램으로부터 여러 개의 독립적인 프로세스가 실행된다. 각 프로세스는 서로 다른 메모리 공간을 사용하며 독립적으로 동작한다.
프로세스의 메모리 구조
프로세스는 메모리에서 다음과 같은 구조를 가진다:
Stack (스택)
함수 호출 정보, 지역 변수, 매개변수가 저장되는 영역이다. 함수가 호출될 때마다 스택에 새로운 프레임이 생성되고, 함수가 종료되면 해당 프레임이 제거된다. 일반적으로 스택은 높은 주소에서 낮은 주소로 자라나지만, 아키텍처에 따라 다를 수 있으며 크기가 제한되어 있어 무한 재귀 호출 시 스택 오버플로우가 발생할 수 있다.
Heap (힙)
프로그래머가 동적으로 메모리를 할당하고 해제하는 영역이다. C/C++의 malloc, new나 Java의 new 키워드를 통해 할당된 메모리가 이곳에 위치한다. 많은 시스템에서 힙은 낮은 주소에서 높은 주소로 자라나지만 구현에 따라 달라질 수 있으며, 명시적으로 해제하지 않으면 메모리 누수가 발생할 수 있다.
Data (데이터)
초기화된 전역 변수와 정적 변수가 저장되는 영역이다. 예를 들어 int global = 10;과 같이 초기값이 지정된 전역 변수가 이곳에 위치한다. 프로그램이 시작될 때 초기값이 로드되며, 프로그램 종료까지 유지된다.
BSS (Block Started by Symbol)
초기화되지 않은 전역 변수와 정적 변수가 저장되는 영역이다. 예를 들어 int global;처럼 초기값 없이 선언된 전역 변수가 이곳에 위치한다. 프로그램 실행 시 자동으로 0으로 초기화되며, Data 영역과 분리하여 실행 파일 크기를 줄일 수 있다.
Code (코드)
실행 가능한 프로그램 코드가 저장되는 영역이다. 컴파일된 기계어 명령어들이 이곳에 위치하며, 읽기 전용으로 설정되어 실행 중 코드가 변경되는 것을 방지한다. 여러 프로세스가 같은 프로그램을 실행할 때 이 영역을 공유할 수 있다.
스레드란
스레드는 프로세스 내에서 실행되는 흐름의 단위로 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.
스레드의 메모리 구조
스레드는 프로세스와 달리 메모리를 부분적으로 공유한다는 특징이 있다.
같은 프로세스 내의 모든 스레드는 Code, Data, Heap 영역을 공유한다. 이러한 공유 덕분에 스레드 간 통신이 매우 간편하고 메모리를 효율적으로 사용할 수 있다.
반면, 각 스레드가 독립적인 실행 흐름을 유지하기 위해 각 스레드는 Stack과 Register를 독립적으로 가진다.
이러한 구조 덕분에 스레드는 프로세스보다 생성 비용이 낮고 Context Switching이 빠르다. 하지만 공유 메모리로 인해 한 스레드의 오류가 전체 프로세스에 영향을 줄 수 있다는 단점도 있다.