하이 헬로 봉쥬르?
오늘은 프로세스와 스레드에 대해 글을 써보겠읍니다.
프로그램과 프로세스의 차이
본론으로 들어가기 전에 프로그램과 프로세스의 차이를 먼저 간단하게 짚고 넘어가보려고 합니다. (제가 헷갈렸던 개념이었기 때문)
프로그램과 프로세스는 CPU 메모리상에 로드가 되어있냐, 안되어있냐로 나눌 수 있습니다. 프로그램과 프로세스를 간단히 요약해보자면,
프로그램은 실행 가능한 코드의 묶음입니다. 즉, 실행되기 전의 정적 상태로, 디스크에 저장된 실행 파일(exe 등)을 말합니다.
프로세스는 프로그램이 실행되어 운영체제에 의해 독립적인 메모리를 할당받고, 실제로 실행되고 있는 동적 상태로, 메모리에 올라가 CPU에서 처리 중인 작업입니다.
프로그램을 실행하면 하나의 메인 프로세스가 생성이 되며, 메인 프로세스를 통해 자식 프로세스를 생성할 수 있습니다.
위 사진처럼 메모장이라는 프로그램을 두 번 실행했습니다. 그렇다면 프로그램과 프로세스는 각각 몇 개일까요?
정답은 프로그램은 하나, 프로세스는 두 개 혹은 그 이상입니다!
프로세스와 스레드를 자세히 알아보자
1. 프로세스 ID (PID)
운영체제는 수많은 프로세스를 어떻게 구분하여 관리할까요?
운영체제는 각 프로세스마다 프로세스 테이블에 데이터를 저장하는데요, 이 테이블에는 각 프로세스의 상태, PID, 할당된 메모리 등의 정보가 저장됩니다.
그중 프로세스 ID (PID)를 통해 프로세스를 구분 합니다.
운영체제는 이 ID를 통해 각 프로세스에 접근하여 상태, 메모리 등을 관리하게 됩니다.
2. 프로세스의 주소 공간
프로세스는 앞서 운영체제에 의해서 독립적인 메모리 공간을 할당받는다고 말했습니다.
운영체제는 한정된 공간에서 메모리를 최대한 효율적으로 관리하기 위해 메모리 영역을 4개로 나눴습니다.
위와 같이 스택, 힙, 데이터, 코드 총 4개의 영역이 있습니다. 각 영역에 대해 간단하게 알아보자면,
- 스택(Stack): 자동으로 관리되는 메모리 영역입니다. 함수가 호출될 때마다 필요한 메모리 공간을 위에 차곡차곡 쌓은 후, 함수가 종료될 때마다 차례대로 메모리를 해제합니다. 때문에 단편화 현상이 일어날 일이 없고, 메모리 할당 및 해제의 오버헤드가 적습니다.
- 힙(Heap): 수동으로 관리되는 메모리 영역입니다. 개발자가 필요할 때 메모리 영역을 할당받고, 다 쓰면 직접 메모리를 해제하는 방식입니다. 각 메모리의 수명이 다르기 때문에 단편화 현상이 일어나고, 그에 따른 성능 저하가 발생할 수 있습니다.
- 데이터(Data): 전역 변수와 정적 변수가 저장되는 메모리 영역입니다. 프로그램의 시작 시 한 번만 할당되고, 프로그램이 종료될 때까지 유지되므로, 메모리 할당 및 해제의 오버헤드가 줄어듭니다. 데이터 영역의 메모리는 모든 함수에서 접근 가능하므로, 필요한 데이터를 쉽게 관리할 수 있습니다.
- 코드(Code): 실행할 프로그램의 기계어 코드가 저장되는 메모리 영역입니다. 보통 읽기 전용으로 설정되어 있어 코드의 무결성을 보장합니다. 코드가 한 곳에 모여 있으면 캐시 히트율이 올라가기 때문에, 성능이 향상될 수 있습니다.
이처럼, 프로세스의 각 주소 공간들은 역할이 명확이 구분되어 있습니다. 또한 성능과 안정성 등 많은 측면에서 중요한 역할을 하기 때문에 각 역할을 이해하고 잘 쓰는게 중요합니다.
3. 프로세스의 스레드
공장이 노동자의 노동력에 의해 굴러가는 것처럼 프로세스도 일꾼이 있습니다.
그것이 바로 스레드(Thread)입니다.
스레드는 많은 특징을 가지고 있습니다. 나열해보면,
- 프로세스는 최소 한 개 이상의 스레드를 가지며, 이를 메인 스레드라고 합니다.
- 메인 스레드를 통해 자식 스레드를 만들 수 있습니다.
- 각 스레드는 자신만의 독립적인 스택 메모리 영역을 할당받습니다.
- 대신, 그 외의 프로세스 메모리 영역은 공유하여 사용할 수 있습니다.
- 반대로, 각 스레드는 서로의 스택 메모리 영역에 접근할 수 없습니다.
한 프로세스 내에 여러 스레드가 존재할 수 있으며, 이를 멀티스레드 기법이라고 합니다. 부하가 큰 작업을 여러 스레드가 나눠 처리하거나, 각 역할의 코드를 독립적으로 실행시키고 싶을 때 사용하는 기법입니다.
멀티 프로세스, 멀티 스레드?
앞서 설명했듯이 프로세스와 스레드는 여러 개 존재할 수 있습니다. 사실 서로의 용도가 다르기 때문에 정확히 무슨 차이가 있을까요?
차이점을 알기 전에 알아야 할 개념이 있습니다. 바로 동시성, 병렬성, 컨텍스트 스위칭입니다.
1. 동시성과 병렬성
멀티 프로세스와 멀티 스레드의 공통점은 동시에 실행된다는 점입니다. 여기서 "동시"라는 용어는 두 가지 의미를 내포하고 있습니다.
- 동시성(Concurrency): 짧은 시간 동안 여러 작업이 수행되어 마치 동시에 여러 작업이 진행되고 있는 것처럼 보이게 하는 것을 의미합니다.
- 병렬성(Parallelism): 실제로 여러 작업이 동시에 수행되고 있는 상태를 의미합니다.
2. 컨텍스트 스위칭(Context Switching)
앞서 동시성에 대해 알아본 이유는 CPU의 특성때문입니다. 왤까요?
그렇습니다... CPU는 한 번에 여러 프로세스를 처리할 수 없습니다. 때문에 한 CPU가 여러 프로세스를 다루려면 프로세스1을 처리하고 프로세스2로 넘어가는 작업을 거쳐야 하는데요. 여기서 CPU가 다음 프로세스에게 작업 제어권을 주는 것을 컨텍스트 스위칭이라고 합니다.
이처럼 CPU가 여러 프로세스의 작업을 처리하는 것을 시분할 시스템이라고 부릅니다.
CPU가 프로세스를 처리할 때 효율적인 분담을 위해 스케줄링을 하게 되는데.... 이건 길어지니까 나중에 쓰겠읍니다..
컨텍스트 스위칭의 중요한 점은 오버헤드가 일어난다는 점입니다.
CPU가 다른 프로세스의 작업을 하기 위해선, 프로세스의 정보(레지스터 값, 프로그램 카운터, 스택 포인터 등)를 저장 및 불러오는 과정을 거칩니다. 또한 스케줄링 판별, 캐시 미스 등의 많은 이유로 오버헤드가 일어나게 됩니다.
때문에 잦은 컨텍스트 스위칭은 성능저하를 일으킬 수 있습니다.
때문에 Core(CPU)의 수가 적을수록 컨텍스트 스위칭이 자주 일어나며 오버헤드가 일어나게 됩니다.
3. 멀티 프로세스
멀티 프로세스란 2개 이상의 프로세스가 동시에 실행되는 것을 말합니다.
이때 CPU가 여러 프로세스의 작업을 번갈아 가면서 처리하게 되는데, 이 때문에 동시성(Concurrency)이 높습니다.
멀티 프로세스의 특징은 다음과 같습니다.
- 각 프로세스 간의 독립성이 보장됩니다. 여기서 독립성은 메모리 공간 등을 의미합니다.
- 각 프로세스는 서로의 메모리를 침범하지 못합니다.
- 한 프로세스가 장애를 일으켜도 나머지 프로세스들은 영향을 받지 않습니다.
- 프로세스 간에 컨텍스트 스위칭(Context Switching)이 빈번하게 일어나게 됩니다. 이로 인한 오버헤드가 발생할 수 있습니다.
- 프로세스 생성과 메모리 할당 과정에서 시스템 콜이 발생해 오버헤드가 일어납니다.
4. 멀티 스레드
멀티 스레드는 한 프로세스에 2개 이상의 스레드가 작업을 하는 것을 말합니다.
실제로 여러 스레드가 동시에 작업을 하므로, 병렬성(Parallelism)을 높일 수 있습니다.
멀티 스레드의 특징은 다음과 같습니다.
- 각 스레드는 서로 자원을 공유할 수 있어 데이터를 주고받기가 편리합니다.
- 동시 요청을 처리할 수 있습니다.
- 한 스레드가 데이터를 쓰는 동안 다른 스레드가 읽는 경우 의도치 않은 오류가 발생할 수 있습니다.
- 프로세스 생성과 메모리 할당 과정이 필요하지 않아 오버헤드가 비교적 적습니다.
주의할 점은 멀티 스레드는 싱글 코어 환경에서 동시에 작업이 안된다는 점이다...
때문에 싱글 코어에서의 멀티 스레드는 성능향상을 꾀할 수 없다.
'프로그래밍 > CS' 카테고리의 다른 글
[CS] 인터럽트 (0) | 2024.10.22 |
---|---|
[CS] CPU 스케줄링 (4) | 2024.10.21 |
[CS] CPU의 메모리 계층 구조 (4) | 2024.10.13 |
[CS] 커널(Kernel)과 그 종류에 대해 (0) | 2024.10.13 |
[CS] 유저영역, 커널영역 그리고 SystemCall (1) | 2024.10.13 |