프로세스란?
프로그램은 실제 실행하기 전까지는 단순한 파일에 불과합니다.
프로그램을 실행하면 그제서야 프로세스가 만들어지고 프로그램이 실행됩니다.
이렇게 운영체제 안에서 실행중인 프로그램을 프로세스라고 합니다.
즉, 프로세스는 실행 중인 프로그램의 인스턴스입니다.
프로세스는 실행 중인 프로그램의 인스턴스이다. 각 프로세스는 독립적인 메모리 공간을 갖고 있으며, 운영체제에서 별도의 작업 단위로 분리해서 관리된다. 각 프로세스는 별도의 메모리 공간을 갖고 있기 때문에 서로 간섭하지 않는다. 그리고 프로세스가 서로의 메모리에 직접 접근할 수 없다. 프로세스는 이렇듯 서로 격리되어 관리되기 때문에, 하나의 프로세스가 충돌해도 다른 프로세스에는 영향을 미치지 않는다. 쉽게 이야기해서 특정 프로세스(프로그램)에 심각한 문제가 발생하면 해당 프로세스만 종료되고, 다른 프로세스에 영향을 주지 않는다는 말이다.
컴퓨터에서 하나의 프로그램이 실행되면 운영체제는 이를 프로세스로 인식하고, 해당 프로세스에 필요한 메모리 공간을 할당합니다.
이 메모리는 단순히 하나의 덩어리가 아니라, 용도에 따라 여러 영역으로 나뉘어 구성됩니다. 각 영역은 코드 실행, 데이터 저장, 동적 메모리 할당, 함수 호출 등을 위해 특별한 목적을 가지고 있으며, 프로그램의 안정성과 효율적인 실행에 핵심적인 역할을 합니다.
이제 이러한 프로세스의 메모리 구조가 어떻게 구성되어 있는지 살펴보겠습니다.
프로세스의 메모리 구성
- 코드 섹션: 실행할 프로그램의 코드가 저장되는 부분
- 데이터 섹션: 전역 변수 및 정적 변수가 저장되는 부분(그림에서 기타에 포함)
- 힙 (Heap): 동적으로 할당되는 메모리 영역
- 스택 (Stack): 메서드(함수) 호출 시 생성되는 지역 변수와 반환 주소가 저장되는 영역(스레드에 포함)
스레드란?
프로세스는 하나 이상의 스레드를 반드시 포함한다.
스레드는 프로세스 내에서 실행되는 작업의 단위이다.
한 프로세스 내에서 여러 스레드가 존재할 수 있으며, 이들은 프로세스가 제공하는 동일한 메모리 공간을 공유한다.
스레드는 프로세스보다 단순하므로 생성 및 관리가 단순하고 가볍다.
멀티스레드 환경에서는 하나의 프로세스 내에서 여러 스레드가 동시에 실행됩니다. 이때 각 스레드는 같은 프로세스의 메모리 공간을 공유하면서 작업을 수행하게 되는데, 이 구조는 자원 공유와 통신을 용이하게 하는 동시에, 스레드 간의 동기화 문제를 유발하기도 합니다. 또한, 모든 것을 공유하는 것은 아니며, 스레드마다 자신만의 독립적인 스택 메모리를 가지고 있어 함수 호출, 지역 변수 관리 등이 가능하도록 설계되어 있습니다. 지금부터 스레드 관점에서의 메모리 구성을 살펴보겠습니다.
스레드의 메모리 구성
- 공유 메모리: 같은 프로세스의 코드 섹션, 데이터 섹션, 힙(메모리)은 프로세스 안의 모든 스레드가 공유한다.
- 개별 스택: 각 스레드는 자신의 스택을 갖고 있다. (자신만의 독립적인 스택 메모리)
프로그램이 실행된다는 것은 무슨 의미일까?
프로그램을 실행하면 운영체제는 먼저 디스크에 있는 파일 덩어리인 프로그램을 메모리로 불러오면서 프로세스를 만든다고 했습니다.
그럼 만들어진 프로세스를 어떻게 실행할까요?
프로그램이 실행된다는 것은 사실 프로세스 안에 있는 코드가 한 줄씩 실행되는 것입니다.
(코드는 보통 main() 부터 시작해서 하나씩 순서대로 내려가면서 실행된다)
이 코드를 하나씩 실행하면서 내려가는 것의 정체가 무엇일까요?
public class Operator {
public static void main(String[] args) {
int sum1 = 1;
int sum2 = sum1 + 1;
System.out.println("sum1 = " + sum1);
System.out.println("sum2 = " + sum2);
}
}
생각해보면 어떤 무언가가 코드를 하나씩 순서대로 실행하기 때문에 프로그램이 작동하고 계산도 하고, 출력도 할 수 있습니다.
비유를 하자면 마치 실(thread) 같은 것이 코드를 위에서 아래로 하나씩 꿰면서 하나씩 내려가는 것 같지 않나요?
이렇듯 프로세스의 코드를 실행하는 흐름을 스레드(thread)라 합니다. - (스레드는 번역하면 "실", "실을 꿰다"라는 뜻이다.)
스레드는 프로세스 내에서 실행되는 작업의 단위이고, 위에서 보았듯이 프로세스가 제공하는 동일한 메모리 공간을 공유합니다.
그리고 스레드는 한 프로세스 내에 하나의 스레드가 존재할 수 있고, 한 프로세스 내에 여러 스레드가 존재할 수도 있습니다.
하지만, 하나의 프로세스 안에는 최소 하나의 스레드가 존재해야합니다. 그래야 프로그램이 실행될 수 있습니다.
- 단일 스레드: 한 프로세스 내에 하나의 스레드만 존재
- 멀티 스레드: 한 프로세스 내에 여러 스레드가 존재
🤔 멀티스레드가 필요한 이유?
하나의 프로그램도 그 안에서 동시에 여러 작업이 필요하다.
워드 프로그램으로 문서를 편집하면서, 문서가 자동으로 저장되고, 맞춤법 검사도 함께 수행된다.
유튜브는 영상을 보는 동안, 댓글도 달 수 있다.
정리하면 프로세스는 실행 환경과 자원을 제공하는 컨테이너 역할을 하고, 스레드는 CPU를 사용해서 코드를 하나하나 실행합니다.
'CS' 카테고리의 다른 글
[CS] IPC(Inter Process Communication)란? (1) | 2025.05.19 |
---|---|
[CS] 멀티 코어 vs 멀티 프로세스 vs 멀티 스레드 (0) | 2024.12.17 |
[CS] 스레드의 종류 (0) | 2024.12.10 |
[CS] 동기와 비동기 (0) | 2024.12.05 |
[CS] 인터럽트와 시스템 콜 (1) | 2024.12.03 |