책/운영체제

운영체제 Ch04_'Thread and Concurrency-1'

RyoTTa 2021. 1. 10. 02:56
반응형

Chapter 4, Thread and Concurrency

 

4.1 개요

 스레드는 CPU 이용의 기본 단위이다.

 스레드는 스레드 ID, PC(Program Counter), 레지스터 집합, 스택 으로 구성된다.

 스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 열린 파일, 신호 등 자원등을 공유

 

4.1.1 동기(Motivation)

단일 및 다중 스레드 프로세스

 다중 코어 시스템에서 처리 능력을 향상시키도록 설계될 수있다. 이러한 응용은 다중 계산 코어를 사용하여 다수의 CPU-집중 작업을 병렬로 처리할 수 있다. 

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

 

 스레드는 가벼운 프로세스로 생각할 수 있다. 대신 스레드는 프로세스보다 생성하는것에 대해 오버헤드가 작다. 

  프로세스 : fork(), 스레드 : pthread_create()

 만약 병렬적으로 같은 일을 수행해야 한다면, 프로세스를 병렬적으로 생성하는 것은 낭비이다.

 IPC를 사용하지 않으면서 데이터를 공유할 수 있다.

 

4.1.2 장점(Benefits)

 1. 응답성(Responsiveness) : 프로그램의 한 부분이 차단(Block)된 경우에도 다른 부분이 계속 실행될 수 있다.

 2. 자원공유(Resource Sharing) : 스레드는 자동적으로 속한 프로세스의 자원들과 메모리를 공유해 IPC가 필요하지 않다

 3. 경제성(Economy) : 프로세스의 생성, 종료, 메모리 및 리소스 할당, Context Switch등에는 많은 시간이 소모된다.

 4. 규모 적응성(Scalability) : Multiprocessor(Core) 구조에서 각각의 스레드가 다른 Core에서 병렬로 수행될 수 있다.

프로세스와 스레드 생성 소모 시간 차이

 

4.2 다중 코어 프로그래밍(Multicore Programming)

 Multicore/Multiprocessor

  여러개의 CPU가 시스템에 사용되는 것

  여러개의 Core가 하나의 CPU chip에 구성되어있는 것

 

 과거와 달리 다중 스레드 프로그래밍이 여러 컴퓨팅 코어를 보다 효율적으로 사용하고 병행성을 향상시키는 기법으로 발전했다. 단일 코어가 있는 시스템에서는 하나의 스레드만 실행할 수 있기 대문에 병행성은 시간이 지남에 따라 스레드 실행이 인터리브하게 실행함을 의미한다. 

 

 Concurrency(병행성) vs Parallelism(병렬성)

  Concurrency(병행성) : 시스템이 하나 이상의 작업 진행을 지원한다.

  Parallelism(병렬성) : 시스템이 동시에 둘 이상의 작업을 동시에 수행 할 수 있다.

단일 코어 시스템에서의 병행 실행
다중 코어에서의 병렬 실행

4.2.1 프로그래밍 도전과제(Programming Challenges)

 효율적인 프로그램을 위해서는 프로그램들이 다중 스레드 실행을 지원해야 한다. 이러한 프로그램을 위해서는 5가지의 도전 과제가 존재한다.

 

 1. 태스트 인식(Identifying tasks) : 프로그램을 분석하여 독립된 병행 가능 태스크로 분할 할 수 있는 영역을 찾는 작업이 필요하다. 서로 독립적이고 개별 코어에서 병렬 실행될 수 있어야 한다.

 2. 균형(Balance) :  병렬로 실행될 수 있는 태스크들이 전체 작업에 대한 균등한 기여도를 가지도록 해야한다. 즉, 엄청나게 작은 작업을 하기위해 별도의 코어를 사용하 것은 그만한 가치가 없다.

 3. 데이터 분리(Data Spliting) : 프로그램이 독립된 태스크로 분할 되는 것처럼, 태스크들이 접근하고 조작하는 데이터 또한 개별 코어에서 사용할 수 있도록 분할되어야 한다.

 4. 데이터 종속성(Data Dependecny) : 태스크가 접근하는 데이터는 둘 이상의 태스크 사이에서 종속성이 없는지 검토되어야 한다.

 5. 시험 및 디버그(Testing and Debugging) : 프로그램이 병렬로 실행될 때, 다양한 실행 경로가 존재할 수 있다. 이러한 프로그램들은 단일 스레드 프로그램을 테스트 및 디버그하는 것보다 근본적으로 복잡하다.

 

4.2.2 병렬 실행의 유형(Types of Parallelism)

 데이터 병럴 실행(Data Parallelism) : 여러 컴퓨팅 코어에서 데이터의 부분집합을 분배한뒤 동일한 연산을 실행한다.

  ex) single core : sum [0] to [N-1]

       dual core : sum [0] to [N/2 - 1], [N/2] to [N-1

 

 태스크 병렬 실행(Task Parallelism) : 태스크(스레드)를 다수의 코어에 분배한다. 각 스레드는 각자 고유의 연산을 실행

  ex) one core : 데이터에 대한 평균값 계산

       2nd core : 데이터에 대한 모든값 합 계산

 

Data and Task Parallelism

반응형