Thread & Concurrency

dong5854·2022년 8월 8일
0
post-thumbnail

예전에도 프로세스와 스레드에 관한 내용을 정리한 적 있지만, 중요한 내용이기 때문에 복습 겸 다시 한번 정리해본다.

스레드는 CPU 이용의 기본 단위로, 스레드 ID, 프로그램 카운터(PC), 레지스터 집합 그리고 스택으로 구성된다. 스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 그리고 열린 파일이나 신호와 같은 운영체제 자원들을 공유한다. 전통적인 프로세스는 하나의 제어 스레드를 가지고 있다. 만일 프로세스수의 제어 스레드를 가진다면, 프로세스는 동시에 하나 이상의 작업을 수행할 수 있다.
아래의 그림은 전통적인 단일 스레스 프로세스다중 스레드 프로세스의 차이점을 보여주고 있다.


멀티 스레드가 필요한 이유

하나의 응용 프로그램이 여러 개의 비슷한 작업을 수행할 필요가 있는 상황들을 생각해보자 예를 들어, 웹 서버는 클라이언트로부터 웹 페이지나 이미지, 소리 등에 대한 요청을 받는다. 하나의 분주한 웹 서버는 여러 개의 클라이언트들이 병행하게 접근할 수 있다. 만약 웹 서버가 단일 스레드 프로세스로 작동한다면 자신의 단일 프로세스로 한 번에 하나의 클라이언트만 서비스 할 수 있게 되어 클라이언트는 자신의 요구가 서비스되기까지 매우 긴 시간을 기다려야한다.

이에 대한 해결책으로 여러 프로세스를 생성하는 것이지만 프로세스의 생성에는 많은 자원과 시간을 필요로한다. 하지만 새 프로ㅔ쓰가 해야 할 일이 기존 프로세스가 해야 할 일과 동일하다면 이 많은 오버헤드를 감수하기보다는 프로세스 안에 여러 스레드를 만들어 나가는 방식이 더 효율적이다.

멀티 스레드의 장점

멀티 스레드의 장점은 4가지 큰 부류로 나눌 수 있다.

  • Responsiveness(응답성): 논 블로킹 처리를 통해 응답성을 증가시킨다. 예를 들어 시간이 많이 걸리는 연산을 시작하는 단추를 클릭했을 때 단일 스레드는 그 연산의 완료를 기다리며 사용자에게 응답하지 않지만 이를 비동기적 스레스에서 실행하면 여전이 사용자에게 응답을 할 수 있다.
  • Resource Sharing(자원 공유): 프로세스는 공유 메모리와 메시지 전달 기법을 통해서만 자원을 공유할 수 있지만 스레드는 자동으로 속한 프로세스의 자원들과 메모리를 공유한다.
  • Economy(경제성): 스레드는 자신이 속한 프로세스의 자원을 공유하기 때문에 생성 비용과 컨텍스트 스위칭의 비용이 더 경제적이다.
  • Scalability(규모 적응성): 멀티 프로세스 아키텍쳐에서 확장성에 있어 장점을 갖는다.

멀티코어 프로그래밍

멀티코어 환경에서는 단일 코어의 멀티 스레드와 비교해 생각해볼 부분이있다.
단일 코어가 있는 스스템에서는 단지 처리 코어가 한 번에 하나의 스레드만 실행할 수 있기 때문에 병행성은 시간이 지남에 따라 스레드 실행이 인터리브됨(쉽게 말해 사이사이 끼어 넣어짐)을 의미한다.

그러나 여러 코어가 있는 시스템에서 병생성은 시스템이 각 코어에 별도의 스레드를 할당할 수 있기때문에 일부 스레드가 병렬로 실행될 수 있음을 의미한다.

programming challenge

이런 멀티 코어 환경에서 프로그래밍적 난관이 있다. 일반적으로 멀티 코어 시스템을 위해 프로그래밍하기 위해서는 5개의 난관을 극복해야한다.

  • Identifying tasks(테스크 인식): 프로그램에서 병행적으로 실행 가능한 테스크를 찾는 작업이 필요하다. 예를 들자면 정렬같은 경우에는 각 테스트간의 의존관계가 있기 때문에 완벽히 병행실행을 할 수 없다.
  • Balance(균형): 태스크 간에 작업에 균형을 잡아 하나의 스레드는 작업이 빨리 끝나 놀고 다른 쓰레드는 계속 작업중인 상황을 만들지 말아야한다.
  • Data splitting(데이터 분리): 태스크가 접근하고 조작하는 데이터가 개별 코어에서 사용할 수 있도록 나누어져야 한다.
  • Data dependency(데이터 종속성): 데이터의 종속석을 수용할 수 있도록 적절한 동기화가 필요하다.
  • Testing and debugging(테스트와 디버깅): 멀티 스레드 환경에서는 테스트와 디버깅의 난이도가 훨씬 높아진다.

병렬성의 종류


병렬 실행의 유형은 데이터 병렬 실행과 테스크 병렬 실행이 존재하는데, 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⌟, 박민규 옮김

profile
https://github.com/dong5854?tab=repositories

0개의 댓글