스레드란?
스레드는 CPU 이용의 기본 단위이다. 스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 그리고 스택으로 구성된다. 스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 그리고 열린 파일이나 신호와 같은 운영체제 자원들을 공유한다. 전토억인 프로세스는 하나의 제어 스레드를 가지고 있다. 만일 프로세스가 다수의 제어 스레드를 가진다면, 프로세스는 동시에 하나 이상의 작업을 수행할 수 있다.
멀티 스레드 프로그래밍의 이점을 다음 4가지 큰 부류로 나눌 수 있다.
- 응답성: 사용자가 오래걸리는 작업을 시작하는 단추를 클릭했을 떄 비동기 스레드에서 실행된다면 여전히 다른 작업들에 대해서 사용자에게 응답할 수 있다.
- 자원 공유: 프로세스는 공유 메모리와 메시지 전달 기법을 통해서만 자원을 공유할 수 있다. 멀티스레드는 그들이 속한 프로세스의 자원과 메모리를 공유한다. 프로세스는 별도의 메모리공간을 필요로 하는데에 비해 스래드는 주소 공간 내에 열개의 다른 작업을 할 수 있다.
- 경제성: 프로세스 생성을 위해 메모리와 자원들을 공유하는 것은 비용이 많이 든다. 스레드는 자신이 속한 프로세스의 자원들을 공유하기 때문에 스레드를 생성하고 문맥 교환하는 것이 더욱더 경제적이다. 일밙거으로 스레드 생성은 프로세스 생성보다 시간과 메모리를 덜 소비한다. 또한 문맥 교환은 일반적으로 프로세스 사이보다 스레드 사이에서 더 빠르다.
- 규모 적응성: 다중 스레드의 이점은 다중 처리기 구조에서 더욱 증가할 수 있다. 다중 처리기 구조에서는 각각의 스레드가 다른 처리기에서 병렬로 수행될 수 있기 때문이다, 단일 스레드 프로세스는 처리기가 아무리 많더라도 오직 한 처리기에서만 실행된다.
멀티코어 프로그래밍(Multicore Programming)
단일 컴퓨팅 칩에 여러 컴퓨팅 코어를 배치하고 각 코어는 운영체제에 별도의 CPU처럼 동작한느 시스템을 다중 코어라고 하며, 멀티코어 프로그래밍은 이러한 컴퓨팅 코어를 보다 효율적으로 사용하고 병행성을 향상시키는 기법을 제공한다.
병행성(동시성)과 병렬성
요즘에는 병행성보다 동시성이라는 용어를 많이 쓰기 때문에 동시성이라고 표현하겠다. 동시성은 하나의 코어에서 여러개의 태스크가 빠르게 컨텍스트 스위치가 일어나면서 마치 동시에 실행되는 것처럼 보이게 하는 것을 말한다. 병렬성은 다중 코어가 각각 하나의 태스크를 맡아 병렬적으로 처리하는 것을 말한다. 즉 하나의 코어에서 동시성은 가질 수 있지만 병렬성은 가질 수 없다.
병렬 실행의 유형
병렬 실행은 일반적으로 데이터 병렬 실행과 태스크 병렬 실행 두 가지 유형이 존재한다.
- 데이터 병렬 실행: 동일한 데이터의 부분 집합을 다수의 계산 코어에 분배해 각 코어에서 동일한 연산을 실행하는데 초점을 맞춤
- 태스크 병렬 실행: 데이터가 아니라 스래드를 다수의 코어에 분배하고 각 스레드는 고유의 연산을 실행한다. 다른 스레드들이 동일한 데이터들에 대해 연상을 실행할 수 도 있고, 다른 데이터에 연산을 실행할 수도 있다.
이 두가지 전략은 서로 상호 배타적이지 않으며 실제로 응용프로그램은 이 두가지 전략을 혼합하여 사용할 수 있다.
다중 스레드 모델
스레드를 위한 자원은 사용자 스레드를 위해서는 사용자 수준에서, 커널 스레드를 위해서는 커널 수준에서 제공된다. 사용자 스레드는 커널 위에서 지원되며 커널의 지원 없이 관리된다. 반면에 커널 스레드는 운영체제에 의해 직접 지원되고 관리된다. 이러한 사용자 스레드와 커널 스레드 사이에는 어떤 연관관계가 존재 해야한다. 이 연관관계에는 일반적으로 세가지 방법이 있다.
- 다대일 모델: 많은 사용자 수준 스레드를 하나의 커널 스레드로 사상
- 일대일 모델: 하나의 사용자 수준 스레드마다 하나의 커널 수준 스레드를 생성해 사상
- 다대다 모델: 사용자 수준 스레드와 같가나 작은 수의 커널 스레드로 멀티플렉스
다대다의 구현이 어렵기 때문에 대부분의 운영체제는 일대일 모델을 사용하지만 일부 현대 병행 라이브러리는 개발자가 태스크를 식별하면 다대다 모델을 사용하여 스레드에 매핑될 수 있게 한다.
'CS' 카테고리의 다른 글
Application Layer (0) | 2022.03.25 |
---|---|
CPU 스케줄링 (0) | 2022.03.11 |
프로세스란? (0) | 2022.03.11 |
네트워크 기본 - OSI 모델과 TCP/IP 모델 (0) | 2022.01.17 |