Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

codingfarm

4. 스레드(Threads) 본문

Computer Science/OS

4. 스레드(Threads)

scarecrow1992 2020. 11. 1. 17:59

4.1 개요(Overview)

  • CPU 이용의 기본 단위
  • 스레드 ID, 프로그램 카운트(PC), 레지스터 집합(Register Set) 그리고 스택으로 구성된다.
  • 같은 프로세스에 속한 스레드 끼리는 코드, 데이터섹션, 열린파일이나 신호같은 OS 자원을 공유한다.
  • 멀티스레드 기능을 통해 프로세스는 동시에 하나 이상의 작업들을 수행할 수 있다.

 

 

4.1.1 동기(Motivation)

  • 현대의 컴퓨터에서 동작하는 거의 모든 응용 프로그램들은 다중 스레드를 이용한다.
    • 웹 브라우저는 이미지 또는 텍스트를 표시하는 하나의 스레드와 네트워크로부터 데이터를 가져오는 또다른 스레드를 가질 수 있다.
    • 워드프로세서는 그래픽을 표시하는 스레드와 키보드로부터 입력을 받는 스레드, 백그라운드에서 문법을 체크하는 스레드를 가질 수 있다.
  • 다중 스레드는 멀티 코어 시스템에서 처리 능력을 향상시키도록 설계될 수 있다.
  • 하나의 프로그램이 여러개의 비슷한 작업을 수행해야할 상황에서 스레드는 프로세스보다 효율적으로 쓰인다.
    • 프로세스 생성은 많은 자원을 소모한다.

 

 

4.1.2 장점(Benefits)

  • 다중 스레드 프로그래밍의 이점은 아래와 같다.
    1. 응답성(Responsiveness)
      • 프로그램의 실행과 대화를 관리하는 스레드를 분리함으로써 응답성을 증가시킨다.
    2. 자원 공유(Resource Sharing)
      • 프로세스는 공유 메모리와 메시지 전달 기법을 통해서만 자원의 공유가 가능하다.
      • 하지만 같은 프로세스에 속한 쓰레드 끼리는 프로세스의 자원드과 메모리를 공유한다.
    3. 경제성(Economy)
      • 스레드의 생성은 프로세스의 생성보다 더 경제적이다.
    4. 규모 적응성(Scalability)
      • 각각의 스레드가 다른 처리기에서 병렬로 수행될 수 있다.

 

 

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

  • 다중 스레드 프로그래밍은 다중 계산 코어를 더 효율적으로 사용할 수 있고 병행 실행을 더 향상 시킬 수 있는 기법을 제공한다.
  • 아래그림에서 병행실행과 병렬실행의 차이를 볼 수 있다.

 

 

 

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

  • 병렬수행이 이루어지기 위해서는 여러 코어를 활용하는 스케줄링 알고리즘을 개발해야 한다.
  • 다중 코어 시스템을 위해 프로그래밍 하기 위해서는 5가지 도전 과제를 극복해야한다.
    1. 태스크 식별(Identifying Tasks)
      • 응용프로그램을 분석하여 독립된 병행가능 태스크로 나눌 수 있는 영역을 찾는 작업이 필요하다.
      • 이상적인 태스크는 서로 독립적이고 개별코어에서 실행될 수 있어야 한다.
    2. 균형(Balance)
      • 분리된 태스크들이 전체 작업에 균등한 기여도를 가지도록 해야한다.
    3. 데이터 분리(Data Spliting)
      • 태스크가 접근하고 조작하는 데이터 또한 개별 코어에서 사용할 수 있도록 나누어져야 한다.
    4. 데이터 종속성(Data dependency)
      • 태스크가 접근하는 데이터는 둘 이상의 태스크 사이에 종속성을 최소화 해야한다.
      • 종속적인 경우에는 잘 동기화 해야한다.
    5. 시험 및 디버깅(Testing and Debugging)
      • 다양한 경로 및 환경에서 충분히 실행해보고 점검해야한다.

 

 

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

  • 데이터 병렬실행과 태스크 병렬 실행의 두가지 유형이 존재한다.

 

데이터 병렬 실행

  • 동일한 데이터의 부분집합을 다수의 계산 코어에 분배한 뒤 각 코어에서 동일한 연산을 실행하는데 초점을 맞춘다.

 

태스크 병렬 실행

  • 각 스레드가 고유의 연산을 실행한다.

 

  • 현실적으로는 위 두가지 실행전략을 혼용한다.

 

 

4.3 다중 스레드 모델(Multithreading Models)

  • 스레드를 위한 지원은 사용자 스레드(user threads)와 커널 스레드(Kernel threads)를 위해 사용자수준과 커널수준에서 제공된다.
    • 사용자 스레드 : 커널위에서 지원되며 커널의 지원없이 관리된다.
    • 커널 스레드 : OS에 의해 직접 지원되고 관리된다.
  • 사용자 스레드와 커널 스레드는 연관관계가 존재해야하며 그 종류는 아래와 같다

 

4.3.1 다대일 모델(Many-to-One Model)

  • 많은 사용자 수준 스레드를 하나의 커너 스레드로 사상한다.
  • 스레드 관리는 사용자 공간의 스레드 라이브러리에 의해 행해진다.
  • 효율적인편이다.
  • 단점
    • 한 스레드가 봉쇄형 시스템 호출을 할 경우, 전체 프로세스가 봉쇄된다.
    • 한번에 하나의 스레드만이 커널에 접근 할 수 있으므로, 다중 스레드가 다중 코어 시스템에서 병렬로 실행 될 수 없다.
  • ex) 그린 스레드(green thread0)

 

 

4.3.2 일대일 모델(One-to-One Model)

  • 각 사용자 스레드를 각각 하나의 커널 스레드로 사상한다.
  • 다대일 모델의 단점을 모두 보완한다.
  • 단점
    • 사용자 수준 스레드 생성을 위한 커널 스레드 생성에 따른 성능 저하 발생
  • ex) Windows, Linux...

 

 

4.3.3 다대다 모델(Many-to-Many Model)

  • 여러개의 사용자 수준 스레드를 그보다 작은 수 혹은 같은수의 커널 스레드로 멀티플렉스 한다.

 

4.3.4 두 수준 모델(two-level model)

 

 

 

4.6.3 스레드 취소(Thread Cancellation)

  • 스레드가 끝나기 전에 강제 종료 시키는 작업을 일컫는다.
    • 가령 여러스레드들이 DB를 병렬로 검색하다 어느 한 스레드가 결과를 찾았다면 나머지 스레드들은 취소되어도 된다.
    • 또는 웹 브라우저에서 사용자가 웹 페이지를 더 이상 적재하지 않기 위해 스톱버튼을 클릭 할 수도 있다.(웹 페이지의 이미지들은 별도의 스레드에 의해 적재된다.) 
  • 목표 스레드(target thread) : 취소 되어야 할 스레드
  • 목표 스레드의 취소는 2가지 방식으로 발생 가능하다.

 

  1. 비동기식 취소(asynchronous cancellation)
    • 한 스레드가 즉시 목표 스레드를 강제 종료시킨다.
    • 강제 종료시 할당된 자원 문제가 주로 발생한다.
    • 스레드가 다른 스레드와 공유하는 자료구조를 갱신하는 도중에 취소요청이 오면 문제 발생
      • 비동기식 취소의 경우 더 심각해진다.
      • OS는 취소된 스레드로부터 모든 시스템 자원을 다 회수하지 못하는 경우가 있다.
  2. 지연 취소(Deferred cancellation)
    • 목표 스레드가 주기적으로 자신이 강제 종료 되어야 할지를 점검한다.
    • 스레드가 취소점(cancellation point)에 도달했을 때에 취소 작업이 일어난다.
    • 목표 스레드가 질서 정연하게 강제 종료 될 수 있다.
    • 실제 취소는 목표 스레드자신이 취소되어도 안전하다고 판단되는 시점에 이루어지므로 안전하다.
    • 실제 스레드 취소는 정리 처리기(clean handler)함수의 호출에 의해서 이루어진다.
      • 스레드가 획득한 모든 자원을 스레드가 종료되기 전에 반환하게 만든다.

 

 

  • 스레드는 비동기식 취소를 권장하지 않는다.
  • 기본적으로 스레드의 취소는 지연취소에 의해 발생하게된다.

 

 

4.6.4 스레드 로컬 저장소(Thread-Local Storage)

  • 한 프로세스에 속한 스레드들은 그 프로세스의 데이터들을 모두 공유한다.
  • 하지만 상황에 따라서는 각 스레드가 자기만 액세스 할 수 있는 데이터를 가져야 할 필요도 있다.
  • 그러한 데이터를 스레드 로컬 저장소(Thread Local Storage, TLS)라고 부른다.
  • TLS는 각 스레드의 고유한 정보를 저장한다.
  • TLS는 단순히 지역 변수가 아니다.
    • 지역변수 : 하나의 함수가 호출 되는 동안에만 접근 가능
    • TLS : 함수 호출 전후에도 접근 가능

 

 

경량 프로세스(Light Weight Process; LWP)

  • 다대다 또는 두수준 모델을 구현하는 시스템들이 커널과 스레드 사이에 두는 structure
  • 커널 스레드를 스케줄링 한다.
  • 응용프로그램이 사용자 스레드를 수행하기 위하여 스케줄할 가상 처리기(virtual process)이다.
  • 입출력 완료를 기다리는동안 커널 스레드가 봉쇄되면 LWO에 부속된 사용자 수준 스레드도 봉쇄된다.

 

 

 

4.6.5 스케줄러 액티베이션(Scheduler Activations)

  • 사용자 스레드 라이브러리와 커널 스레드간의 통신방법
  • 계속

 

 

 

 

 

 

 

 

 

 

 

 

'Computer Science > OS' 카테고리의 다른 글

1.서론(Introduction)  (0) 2020.02.28
Comments