Summary
쓰레드와 쓰레드 풀에 대한 설명입니다.
쓰레드는 프로세스 내에서 실행되는 실행 단위이며,
쓰레드 풀
은쓰레드를 미리 생성
해 두어 작업 처리에 사용되는 쓰레드를 제한된 개수만큼 정해 놓고 작업 큐에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리하는 기법입니다. 쓰레드 풀의 장점으로는 쓰레드를 생성/수거하는데 비용이 들지 않으며, 쓰레드 풀을 미리 만들어 두기 때문에 시스템 자원을 줄일 수 있습니다. 단점으로는 쓰레드 풀에쓰레드를 너무 많이 생성
해 두었다가 사용하지 않으면 메모리낭비가 발생
합니다.
- 상가건물🏢을 컴퓨터라고 한다면 치킨을 만드는 치킨집🏡을 프로세스라고 볼 수 있습니다.
- 상가안의 식당들은 배정된 자신의 공간과 돈이 있습니다. (필요한 만큼 배정된 고유 공간)
- ex. 카카오톡 💬을 실행하는 프로세스
- 맥북 > 활성 상태 보기 📈 > CPU
스레드는 필요할때마다 생성 되며, 프로세스 상세의 스레드 수는 최근 평균 스레드 개수 통계값 입니다.
치킨집에서 일할 직원을 뽑는것과 비슷한 개념이라고 보시면 됩니다.
프로세스 : 자신만의 고유 공간과 자원을 할당받아 사용
쓰레드 : 다른 쓰레드와 공간과 자원을 공유하면서 사용
IPC(Inter-Process Communication)는 프로세스간 통신을 위한 메커니즘입니다.
프로세스 간 데이터를 주고받기 위한 방법으로, Message Queue, Shared Memory, Semaphore, Socket 등의 방법이 있습니다.
프로세스 보다 크기가 작은 실행 단위 구현
프로세스의 생성 및 소멸에 따른 오버헤드 감소
쓰레드간 자원을 공유 함으로써 빠른 컨텍스트 스위칭
프로세스 들의 통신 시간, 방법 어려움 해소
프로세스와 쓰레드 비교
운영체제는 프로세스마다 독립된 메모리 영역을 Code/Data/Stack/Heap의 형식으로 할당합니다.
이와 다르게, 스레드는 메모리를 서로 공유할 수 있습니다.
프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 다로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유합니다.
따라서, 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 됩니다.
즉, 치킨집에서 각자 일하는 공간이 있지만, 같이 보는 업무 가이드(Code)가 있고, 주문도 같이 받고(Data), 손님이 오고가는 홀 공간도 같이 쓴다(Heap)는 점과 비슷합니다.
스레드들이 프로세스의 Code/Data/Heap 메모리 영역을 공유하는 모습 (이미지 출처: Heee's Development Blog )
정리하자면,
프로세스를 알기 전에 프로그램을 알아야 한다. 프로그램(Program)은 어떤 작업을 위해 실행할 수 있는 파일을 말합니다.
프로세스의 사전적 정의는 다음과 같습니다.
컴퓨터에서 연속적으로 실행하고 있는 컴퓨터 프로그램
메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
운영체제로부터 시스템 자원을 할당받는 자원의 단위
정리하면 프로그램의 실행된 부분을 의미합니다.
프로세스는 다음의 특징을 갖습니다.
각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받습니다.
최소 1개 이상의 스레드(메인 스레드)를 가지고 있다.
각 프로세스는 별도의 주소 공간에서 실행되며 기본적으로 다른 프로세스의 자원에 접근할 수 없다.
한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간 통신(IPC)를 사용해야 한다.
그림에서 여러 프로세스가 동시에 실행되고 관리 되는 것 처럼 보인다. 하지만 CPU는 한 번에 한 가지 명령밖에 처리할 수 없다. 즉, 동시가 아니라 빠르게 프로세스들을 번갈아가면서 실행하고 관리하고 있는 것이다.
스레드의 사전적 정의는 다음과 같다.
스레드는 다음의 특징을 갖습니다.
스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동합니다.
즉, 프로세스가 할당받은 자원을 이용하는 처리 작업(실행의 흐름)의 단위 입니다.
업무 메뉴얼(Code)도 같이 보고
손님의 주문(Data)도 같이 받고
손님이 주문한 치킨을 서빙 하는 홀 공간(Heap)도 같이 쓴다는 점과 비슷합니다.
스레드가 독립적으로 가지고 있는 부분 = 작업 흐름과 관련됨
스레드가 동료 스레드와 공유하는 부분 = 작업 데이터와 관련됨
전통적인 개념의 heavy weight process 는 하나의 thread 를 가지고 있는 작업(task)으로 볼 수 있습니다.
📌 쓰레드 요약
쓰레드는 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령어의 가장 작은 흐름 입니다. 하나의 프로세스는 하나 이상의 쓰레드를 갖고 있습니다.
- 멀티 프로세스 : 하나의 운영체제 안에서 여러 프로세스가 실행되는 것
- 멀티 쓰레드 : 하나의 프로세스가 여러 작업을 여러 쓰레드를 사용해 동시에 처리하는 것