예전에도 프로세스와 스레드에 관한 내용을 정리한 적 있지만, 중요한 내용이기 때문에 복습 겸 다시 한번 정리해본다.
스레드는 CPU 이용의 기본 단위로, 스레드 ID, 프로그램 카운터(PC), 레지스터 집합 그리고 스택으로 구성된다. 스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 그리고 열린 파일이나 신호와 같은 운영체제 자원들을 공유한다. 전통적인 프로세스는 하나의 제어 스레드를 가지고 있다. 만일 프로세스수의 제어 스레드를 가진다면, 프로세스는 동시에 하나 이상의 작업을 수행할 수 있다.
아래의 그림은 전통적인 단일 스레스 프로세스와 다중 스레드 프로세스의 차이점을 보여주고 있다.
하나의 응용 프로그램이 여러 개의 비슷한 작업을 수행할 필요가 있는 상황들을 생각해보자 예를 들어, 웹 서버는 클라이언트로부터 웹 페이지나 이미지, 소리 등에 대한 요청을 받는다. 하나의 분주한 웹 서버는 여러 개의 클라이언트들이 병행하게 접근할 수 있다. 만약 웹 서버가 단일 스레드 프로세스로 작동한다면 자신의 단일 프로세스로 한 번에 하나의 클라이언트만 서비스 할 수 있게 되어 클라이언트는 자신의 요구가 서비스되기까지 매우 긴 시간을 기다려야한다.
이에 대한 해결책으로 여러 프로세스를 생성하는 것이지만 프로세스의 생성에는 많은 자원과 시간을 필요로한다. 하지만 새 프로ㅔ쓰가 해야 할 일이 기존 프로세스가 해야 할 일과 동일하다면 이 많은 오버헤드를 감수하기보다는 프로세스 안에 여러 스레드를 만들어 나가는 방식이 더 효율적이다.
멀티 스레드의 장점은 4가지 큰 부류로 나눌 수 있다.
멀티코어 환경에서는 단일 코어의 멀티 스레드와 비교해 생각해볼 부분이있다.
단일 코어가 있는 스스템에서는 단지 처리 코어가 한 번에 하나의 스레드만 실행할 수 있기 때문에 병행성은 시간이 지남에 따라 스레드 실행이 인터리브됨(쉽게 말해 사이사이 끼어 넣어짐)을 의미한다.
그러나 여러 코어가 있는 시스템에서 병생성은 시스템이 각 코어에 별도의 스레드를 할당할 수 있기때문에 일부 스레드가 병렬로 실행될 수 있음을 의미한다.
이런 멀티 코어 환경에서 프로그래밍적 난관이 있다. 일반적으로 멀티 코어 시스템을 위해 프로그래밍하기 위해서는 5개의 난관을 극복해야한다.
병렬 실행의 유형은 데이터 병렬 실행과 테스크 병렬 실행이 존재하는데, data praallelism은 데이터를 각각의 코어에 나눠주고, task prallelism은 데이터가 아니라 tsak를 분배한다.
스레드는 user threads(사용자 스레드)와 kernel threads(커널 스레드) 두 가지 종류가 존재한다.
user thread는 커널 위에서 지원되며 커널의 지원 없이 관리된다.
kernle thread는 운영체제에 의해 직접 지원되고 관리된다.
이 user thread와 kernel thread는 세 가지 일반적인 방법의 연관관계가 있다.
다대일 모델(Many-to-One Model)
다대일 모델은 마놓은 사용자 수준 스레드를 하나의 커널 스레드로 사상한다. 하지만 한 번에 하나의 스레드만이 커널에 접근할 수 잇고 한 스레드가 봉쇄형 시스템 콜을 할 경우, 전체 프로세스가 봉쇄된다. Java의 초기 버전에서 채택되었으나, 다중 처리 코어가 대부분의 컴퓨터 시스템에서 표준이 되었고 다중 처리 코어의 이점을 살릴 수 없기 때문에 이 모델을 사용 중인 시스템은 거의 존재하지 않는다.
일대일 모델(One-to-One Model)
일대일 모델은 하나의 스레드가 봉쇄적 스스템 콜을 호출해도 다은 스레드가 실행될 수 있기 때문에 다대일 모델보다 더 많은 병렬성을 제공한다. 이 모델은 다중 처리기에서 다중 스레드가 병렬로 수행되는 것을 허용한다. 이 모델의 유일한 단점은 사용자 스레드를 만들려면 해당 커널 스레스를 만들어야하며 많은 수의 커널 스레드가 시스템 성능에 부담을 줄 수 있다는 것이다.
다대다 모델(Many-to-Many Model)
다대다 모덱은 여러 개의 사용자 수준 스레드를 그보다 작은 수, 혹은 같은 수의 커널 스레드로 멀티플렉스한다. 이 다대다 모델이 가장 융통성 있어 보이지만 시렞로 구현이 어렵고 대부분의 시스템에서 처리 코어 수가 증가함에 따라 커널 스레드 수를 제한하는 것의 중요성이 줄어들어 대부분의 운영체제는 일대일 모델을 사용한다.
해당 게시물은 흔히 공룡책이라고 불리는 Avraham Silberschatz, ⌜Operating System Concepts 10th edition⌟, 박민규 옮김 과 인프런 주니온님의 운영체제 공룡책 강의 및 구글링을 통해 접한 글들을 보며 공부한 내용을 작성한 것입니다.
수강 강의
운영체제 공룡책 강의, 인프런, 주니온
출처 및 참고자료
Avraham Silberschatz, ⌜Operating System Concepts 10th edition⌟, 박민규 옮김