쓰레드
프로세스 vs 쓰레드
-
프로세스
- 자신만의 고유 공간과 자원을 할당받아 사용
- 메모리 상에서 실행중인 프로그램
- 최소 하나의 쓰레드를 보유, 각각 별도의 주소공간을 독립적으로 할당 받음(code, heap, stack)
- 프로레스는 다른 프로세스의 변수나 자료에 접근 X
- 다른 프로세스의 자원에 접근하려면 IPC(Inter-Process Communication: 프로세스 간 통신)을 사용
-
쓰레드
- 다른 쓰레드와 공간과 자원을 공유하면서 사용
- 프로세스 안에서 실행되는 흐름 단위
- stack만 할당받고 나머지 영역은 쓰레드끼리 공유
※
쓰레드가 독립적으로 가지고 있는 부분(작업 흐름과 관련)
- PC (실행할 명령어)
- Register set
- Stack Space
쓰레드가 공유하는 부분(작업 데이터와 관련)
- Code Section
- Data Section
- OS Resources
멀티 프로세스 & 멀티 쓰레드
쓰레드 풀
컴퓨터 프로그램에서 실행의 동시성을 달성하기 위한 소프트웨어 디자인 패턴
프로그램이 작업을 동시에 실행할 수 있도록 여러 쓰레드를 미리 생성해두고 유지 관리
-> 작업 처리에 사용되는 쓰레드를 제한된 개수만큼 정해 놓고, 작업 큐에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리하는 기법
쓰레드 풀의 동작
- 초기화: 쓰레드 풀의 크기, 최대 쓰레드 수, 작업 큐 등 매개변수 설정
- 작업 수신: 작업을 수신하고 처리할 준비
- 작업 수행: 작업 큐를 모니터링, 대기중인 작업을 가져와 처리
- 작업 처리: 작업을 가져와서 처리, FIFO
- 작업 완료 및 반환: 완료되면 해당 결과를 반환, 쓰레드는 대기 상태
- 작업 대기: 새로운 작업이 추가되면 쓰레드 풀의 쓰레드들은 대기 상태를 벗어나 작업을 가져와 처리
- 종료
쓰레드 풀을 사용하는 이유
- 프로그램 성능 저하를 방지하기 위해
- 다수의 사용자 요청을 처리하기 위해
장단점
장점
- 쓰레드를 생성, 수거하는데 비용이 들지 않음
- 쓰레드가 생성될 때 OS가 메모리 공간을 확보
- 미리 만들어두기 때문에 초기비용이 들지만 이전 쓰레드를 재사용할 수 있어 시스템 자원을 줄일 수 있고, 쓰레드가 대기 상태이기 때문에 딜레이가 발생하지 않음
단점
- 쓰레드를 너무 많이 생성했다가 사용하지 않으면 메모리 낭비가 심함
개선: Fork Join Thread Pool - 큰 업무를 작은 업무로 나누어 배분, 이후 취합(분할 정복 알고리즘과 비슷)
동시성 & 병렬성
동시성
싱글 코어에서 쓰레드를 동작시키기 위한 방식
멀티 태스킹을 위해 여러 개의 쓰레드가 번갈아가면서 실행되는 성질
싱글 코어의 멀티 태스킹은 각 쓰레드들이 병렬적으로 실행되는 것처럼 보이지만 사실 번갈아가면서 조금씩 실행되는 것
병렬성
멀티 코어에서 멀티 쓰레드를 동작시키는 방식
한 개 이상의 쓰레드를 포함하는 각 코어들이 동시에 실행되는 성질
-
데이터 병렬성
- 전체 데이터를 쪼개 서브 데이터들로 만든 뒤, 서브 데이터들을 병렬 처리
- 서브 데이터는 멀티 코어의 수만큼 쪼개어 각각의 데이터들을 분리된 쓰레드에서 병렬 처리
-
작업 병렬성
- 서로 다른 작업을 병렬 처리하는 것
- 웹 서버: 각각의 브라우저에서 요청한 내용을 개별 쓰레드에서 병렬 처리