프로세스
- 프로그램을 실행하는 주체, 자신만의 고유 공간과 자원을 할당받아 사용한다.
- 프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 스레드는 이 프로세스 안에서 실행되는 흐름단위를 말한다.
- 프로세스는 최소 하나의 스레드를 보유하고 있으며, 각각 별도의 주소 공간을 독립적으로 할당 받는다. (code, heap, stack)
스레드
- 작업을 처리해주는 주체, 다른 쓰레드와 공간 및 자원을 공유하면서 사용한다.
- 스레드는 자원 중에 stack만 따로 할당받고 나머지 영역은 스레드끼리 서로 공유한다.
프로세스와 스레드 비교
- 프로세스는 운영체제로부터 별도의 메모리 영역을 할당받는다.
- 스레드는 stack을 제외한 공유자원(code, data, heap) 부분은 공유해 서로 읽고 쓸 수 있게 된다.
프로세스와 스레드의 주소 공간
프로세스의 주소공간
- 각각 독립된 메모리 영역을 할당받는다.
- 코드 영역(code area): 프로그래머가 작성한 프로그램이 저장되는 영역
- 데이터 영역(data area): 코드가 실행되면서 사용한 환경이나 파일들의 각종 데이터들이 모여있다.
- 스택 영역(stack area): 호출한 함수가 종료되면 되돌아올 메모리의 주소나 지역 변수 등이 저장된다.
- 힙 영역(heap area): 동적으로 할당되는 데이터를 위해 존재한다. - 최소 1개 이상의 스레드를 가지고 있다.
- 각 프로세스는 별도의 주소 공간에서 실행되며 기본적으로 다른 프로세스의 자원에 접근할 수 없다.
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간 통신(IPC)를 사용해야한다.
- 아래 그림에서 여러 프로세스가 동시에 실행되고 관리되는 것 처럼 보이지만 CPU는 한 번에 한 가지 명령만 처리할 수 있다. 빠르게 프로세스들을 번갈아가면서 실행하고 관리하고 있는 것이다.
스레드의 주소 공간
- 프로세스 내에서 각 필요한 stack만 할당받고 code, data, heap 영역은 공유해서 각 스레드가 공유한다.
- 같은 프로세스 내 스레드끼리 자원을 공유하며 실행된다.
- 스레드는 공유하는 자원인 heap 영역에 있는 변수를 수정할 수 있다. - 프로세스 하나만을 사용해서 프로그램을 실행하기에는 메모리의 낭비가 발생한다.
- 스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다.
- 즉 프로세스가 할당받은 자원을 이용하는 처리 작업(실행의 흐름)의 단위이다.
멀티 프로세스와 멀티 스레드
멀티프로세스
하나의 운영 체제 안에서 여러 프로세스가 실행되는 것
- 여러개의 자식 프로세스 중 하나에 문제가 발생해도 다른 자식 프로세스는 영향을 받지 않는다.
- 문맥 교환 (Context Switching) 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되면서 오버헤드가 발생한다.
- 프로세스 간 통신을 위해서는 IPC를 통해야 한다.
- 프로세스 간 공유하는 메모리가 없어서 문맥 교환 (Context Switching)이 발생하면 데이터를 처음부터 불어와야 한다.
문맥 교환(Context Switching)
CPU 코어를 여러 프로세스가 돌아가면서 사용해서 작업을 처리하는 방식이다.
해당 프로세스의 상태(Context)를 자신의 PCB에 저장하고 대기하고 있던 다음 순서의 프로세스가 이전의 프로세스 상태를 복구하는 작업이다.
멀티 스레드
하나의 프로세스가 여러 작업을 여러 스레드를 사용해 동시에 처리하는 것
- 시스템 자원 소모 감소 (자원의 효율성)
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어서 자원을 효율적으로 관리할 수 있다. - 시스템 처리량 감소 (처리비용)
- 스레드 간 데이터를 주고 받는 것이 간단해지면서 시스템 자원 소모가 줄어든다.
- 스레드 사이의 작업량이 작아 스레드 간 문맥 교환 (Context Switching)이 활발하게 일어난다.
스레드 풀
스레드 풀이란?
작업 처리에 사용되는 스레드를 제한된 개수만큼 정해 놓고 작업 큐(Queue)에 들어오는 작업들을 각 스레드가 하나씩 맡아 처리하는 것을 말한다.
스레드 풀의 동작
1. 초기화:
쓰레드 풀을 사용하기 전에 초기화해야 합니다. 이 단계에서는 쓰레드 풀의 크기, 최대 쓰레드 수, 작업 큐 등의 매개변수를 설정합니다.
2. 작업 수신:
쓰레드 풀은 작업을 수신하고 처리할 준비를 합니다. 작업은 일반적으로 작업 큐에 추가됩니다.
3. 작업 수행:
쓰레드 풀에서는 미리 생성된 쓰레드들이 작업 큐를 모니터링하고 대기 중인 작업을 가져와 처리합니다. 이때 쓰레드 풀 내의 쓰레드들은 일반적으로 무한 루프를 돌면서 작업을 가져오기 위해 대기합니다.
4. 작업 처리:
쓰레드 풀의 스레드가 작업을 가져와서 처리합니다. 작업은 일반적으로 작업 큐에서 FIFO(선입선출) 방식으로 가져오게 됩니다.
5. 작업 완료 및 반환:
작업이 완료되면 해당 결과를 반환하고, 쓰레드는 다시 작업 큐에서 새로운 작업을 가져오기 위해 대기 상태로 돌아갑니다.
6. 작업 대기:
작업 큐에 새로운 작업이 추가되면 쓰레드 풀의 스레드들은 대기 상태를 벗어나 작업을 가져와 처리합니다. 이를 반복하여 계속적으로 작업을 수행합니다.
7. 종료:
쓰레드 풀을 더 이상 사용하지 않을 때 종료합니다. 종료할 때는 모든 작업이 완료되었는지 확인하고, 필요에 따라 남은 작업들을 처리하거나 버릴 수 있습니다.
스레드 풀을 사용하는 이유
- 프로그램 성능 저하 방지
- 작업을 병렬 처리하기 위해 스레드를 생성/수거하는데 따른 부담은 프로그램의 퍼포먼스를 저하시킨다.
- 스레드 또한 프로세스가 할당한 메모리를 사용한다. - 다수의 사용자 요청 처리
- 스레드가 빠르게 생성되더라도 시스템 스케줄러에서 스레드의 우선 순위를 매번 할당해야하는데 스레드 풀을 이용하면 일정 스레드가 이미 생성되기 때문에 스레드 풀에 의해 라이프 사이클이 관리되고 작업 큐를 이용하게 되어 우선 순위가 배분 및 처리된다.
스레드 풀의 장단점
- 장점
- 스레드를 재사용할 수 있으므로 시스템 자원을 줄일 수 있다.
- 대기 중인 스레드를 사용하기 떄문에 작업에 딜레이가 발생하지 않는다. - 단점
- 스레드를 필요 이상으로 생성해두면 메모리 낭비가 발생한다.
동시성과 병렬성
동시성
싱글 코어에서 멀티 스레드를 동작시키기 위한 방식으로 멀티 태스킹을 위해 여러 개의 스레드가 번갈아가면서 실행되는 성질을 말한다. 동시성을 이용한 싱글 코어의 멀티 태스킹은 각 스레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 번갈아가면서 조금씩 실행되고 있는 것이다.
병렬성
멀티 코어에서 멀티 스레드를 동작시키는 방식으로 한 개 이상의 스레드를 포함하는 각 코어들이 동시에 실행되는 성질을 말한다. 병렬성은 데이터 병렬성과 작업 병렬성으로 구분된다.
- 데이터 병렬성 (Data Parallelism)
전체 데이터를 쪼개 서브 데이터들로 만든 뒤, 서브 데이터들을 병렬 처리하여 작업을 빠르게 수행하는 것을 말한다.
서브 데이터는 멀티 코어 수만큼 쪼개어 각각의 데이터들을 분리된 스레드에서 병렬 처리한다. - 작업 병렬성 (Task Parallelism)
서로 다른 작업을 병렬 처리하는 것을 말한다.
대표적인 예는 웹 서버로 각각의 브라우저에서 요청한 내용을 개별 스레드에서 병렬로 처리한다.
출처 및 참조
https://cocoon1787.tistory.com/688
https://velog.io/@hyunmoo0_0/%EC%8A%A4%EB%A0%88%EB%93%9C%ED%92%80Thread-pool
https://hochoon-dev.tistory.com/entry/Thread-Pool%EC%9D%B4%EB%9E%80
'Development > CS' 카테고리의 다른 글
프로세스 생명주기와 프로세스 메모리 (0) | 2023.06.18 |
---|---|
CPU와 메모리 (0) | 2023.06.11 |