컴퓨터 실행 내부 요소를 살펴볼 때 가장 먼저 접하게 되고 중요한 개념이 프로세스와 스레드이다. 오늘은 이 프로세스와 스레드 개념에 대해 알아보고, 어떻게 작동하는지, 나아가 멀티프로세스와 멀티스레드의 차이점에 대해서도 알아보자.
프로세스와 스레드의 개념
- 프로세스: 운영체제로부터 자원을 할당받은 작업의 단위
- 스레드: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
다시 말해서 프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 스레드는 이 프로세스 안에서 실행되는 흐름 단위를 말한다. 실제로는 이 스레드 단위로 스케줄링을 한다.
프로세스의 특징
- 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받는다.
- 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드를)가지고 있다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 접근하기 위해서는 프로세스 간의 통신(파일, 소켓 등)을 이용해야 한다.
* 프로세스의 메모리 영역
- Code 영역: 실행할 프로그램의 코드나 명령어들이 기계어 형태로 저장된 영역, CPU는 코드영역에 저장된 명령어들을 하나씩 처리한다.
- Data 영역: 코드에서 선언한 전역 변수와 정적 변수가 저장되는 영역, 프로그램이 실행되면서 할당되고 종료되면서 소멸한다.
- Stack 영역: 함수 안에서 선언된 지역변수, 매개변수 및 일부 다른 값들이 저장되는 영역, 함수 호출시 기록되고 종료되면 제거된다.
- Heap 영역: 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 자유 공간
스레드의 특징
- 스레드는 프로세스 내에서 각각 stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
- 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원을 같은 프로세스 내에서 공유(Code, Data, Heap)하며 실행된다.
- 한 스레드가 프로세스 자원을 변경하면 다른 아웃 스레드도 그 변경 결과를 즉시 볼 수 있다.
프로세스와 스레드의 작동 방식
하나의 웹 브라우저가 실행된다고 가정하여 작동 방식을 살펴보자.
- 프로세스 생성
- 사용자가 웹 브라우저를 실행하면, 운영체제는 웹 브라우저 프로그램을 위한 프로세스를 생성한다.
- 이 프로세스는 CPU 시간과 메모리 공간을 할당받아 실행된다.
- 스레드 생성
- 웹 브라우저 프로세스 내에서는 다양한 작업을 수행해야 한다. 예를 들어, 여러 개의 탭에서 동시에 웹 페이지를 로드하거나 화면을 그리는 등의 작업이 이루어진다.
- 이를 위해 웹 브라우저 프로세스 내에서는 각 탭별로 별도의 스레드를 생성한다. 이러한 스레드들은 사용자가 여러 웹 페이지를 동시에 열 때 각각의 탭을 처리한다.
- 프로세스 및 스레드 간 통신
- 사용자가 여러 탭을 열고 각각의 탭에서는 서로 다른 웹 페이지를 로드하게 된다. 이 때 각 탭이나 스레드는 웹 페이지의 내용을 다운로드하고 사용자에게 보여준다.
- 이를 위해 프로세스 내의 스레드들은 프로세스의 메모리를 공유하여 필요한 데이터를 주고받는다. 예를 들어, 다운로드된 웹 페이지의 내용은 공유된 메모리에 저장되어 각 스레드에서 접근할 수 있다.
- 프로세스 및 스레드 종료
- 사용자가 웹 브라우저를 종료하면, 해당 프로세스는 운영체제에 의해 종료된다. 이 때 프로세스에 속한 모든 스레드도 함께 종료된다.
- 종료된 프로세스와 스레드가 사용하던 메모리 및 다른 자원들은 운영체제에 반환된다.
멀티프로세스와 멀티스레드
- 멀티 프로세싱: 여러 개의 독립적인 프로세스가 동시에 실행되는 방식
- 특징: 운영체제로부터 독립적인 메모리 공간을 할당받으며 각각의 프로세스 제어 블록(PCB)를 가진다.
- 장점: 안정성이 높고 각 프로세스 간의 충돌이 발생해도 다른 프로세스에 영향을 주지 않는다.
- 단점: 프로세스 간의 통신이 복잡하고 오버헤드가 크다.
- 특징: 운영체제로부터 독립적인 메모리 공간을 할당받으며 각각의 프로세스 제어 블록(PCB)를 가진다.
- 멀티 스레드: 하나의 프로세스 내에서 여러 개의 스레드가 동시에 실행되는 방식
- 특징: 동일한 프로세스 내에서 실행되기 때문에 프로세스의 메모리 공간을 공유한다.
- 장점: 데이터 공유가 간편하고 스레드 간의 통신이 용이하다. 오버헤드가 적고 자원의 효율성이 높다.
- 단점: 스레드 간의 데이터 공유로 인해 동기화 문제가 발생할 수 있으며 이를 해결하기 위해 락 등의 동기화 메커니즘이 필요하다.
- 특징: 동일한 프로세스 내에서 실행되기 때문에 프로세스의 메모리 공간을 공유한다.
작업 간에 독립성이 높고 서로 영향을 미치지 않아야 할 때는 멀티 프로세스를 선택해야 한다. 그러나 자원을 공유하고 효율적으로 활용해야 할 때는 멀티 스레드를 선택해야 한다.
멀티 스레드는 동시성을 높일 수 있지만 실제 병렬 처리가 필요한 경우에는 멀티 프로세스를 선택해야 한다. 멀티 프로세스는 각각의 프로세스는 각각의 프로세스가 독립적으로 실행되므로 여러 개의 프로세스를 병렬적으로 실행하여 실제로 병렬성을 달성할 수 있다. 그러나 멀티 스레드는 하나의 프로세스 내에서 스레드들이 작업을 번갈아가며 실행되기 때문에 병렬성이 제한적이다.
* 동시성: 여러 작업이 동시에 진행되는 것(처럼 보이는 것), 실제로는 한 번에 하나의 작업만 진행됨
* 병렬성: 실제로 여러 작업이 동시에 실행되는 것
참고
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
반응형