728x90
앞서 알아본 내용에는 여러개의 프로세스가 메모리에 올라가고 각 프로세스를 시분할하여 마치 동시에 실행되는것 처럼 동작하였다. 하지만 이런 방식은 동일한 프로세스가 수행해야할 작업을 동시에 처리하기 위해서는 동일한 프로세스를 복사하여 수행해야 하는 문제가 있다. 따라서 프로세스의 목적성을 유지하면서 가볍게 처리하기 위한 방법이 쓰레드이다.
쓰레드는 다음과 같은 특징이 있다.
- 가벼운 프로세스 (aka. LWP)
- CPU 활용의 기본 단위
- 쓰레드 ID, 프로그램 카운트, 레지스터 셋, 스택등으로 구성
이렇듯 쓰레드는 자기가 속한 프로세스의 코드와 데이터등을 공유하며 동시에 여러개가 수행되기 때문에 다음과 같은 이점을 가지고 있다.
- 반응성
- 실행 흐름이 여러 작업을 처리해도 지속적으로 이어질 수 있어 UI같은 경우 사용자는 외부 작업을 요청해도 UI가 멈추지 않고 반응할 수 있다.
- 자원 공유
- 앞서 멀티-프로세싱의 경우 공유 메모리 또는 메세지를 이용해 복잡한 구현이나 의존적인 데이터 공유 방식을 활용해야 했지만, 쓰레드의 경우 동일한 프로세스 내에 각기 다른 실행 흐름을 가지기 때문에 동일한 프로세스내의 쓰레드는 별다른 구현이나 시스템을 사용하지 않고 자원을 공유할 수 있다.
- 경제적인 비용
- 프로세스의 Context switching은 많은 정보를 저장&불러오기를 반복하기 때문에 비싼 처리비용이 들지만, 쓰레드간의 스위칭은 적은 비용으로 가능하다.
- 확장성
- 멀티-프로세스 아키텍쳐에서 프로세스의 이점을 가질 수 있다. (이후 챕터에서 배움)
멀티 코어 시스템에서의 멀티 쓰레딩
컴퓨터는 점점 발전해서 싱글 코어에서 멀티 코어가 되며 복잡성이 증가했다. 이전 싱글 코어에서 멀티 쓰레딩의 경우 시분할을 통해 수행하던 반면 멀티 코어의 경우 병렬적으로 수행이 가능하게 되었다. 하지만 성능적인 높은 향상이 있지만 많은 해결해야 할 문제가 생기는데 다음과 같다.
- 개별 작업을 하기 위한 작업 영역 기준점 찾기
- 작업별 처리할 양의 밸런스
- 개별 코어에서 병렬적으로 처리할 수 있게 데이터 나누기
- 데이터의 의존성
- 테스트와 디버깅의 높아지는 난이도
병렬 처리의 종류
데이터를 나눠 각 코어에 할당하는 방법과 동일한 데이터에 각각의 코어가 수행하는 구조가 있지만 현대의 컴퓨터는 더욱 복잡해진 분산 시스템을 사용하게 된다.
멀티 쓰레딩
쓰레드의 경우 2가지 타입이 존재하는데 하나는 user thread 또 하나는 kernel thread이다.
- User thread
- 유저 모드에서 동작하는 쓰레드
- Kernel thread
- 운영체제가 직접 제어 및 관리하는 쓰레드
이와 같이 유저/커널 쓰레드 사이에는 관계가 존재하는데 각각의 의미는 다음과 같다.
- Many-to-One Model
- One-to-One Model
- Many-to-Many Model