전공/운영체제

Chapter4 Thread

문정훈 2022. 6. 27. 09:09

1. Thread

1) Thread Pool 개념

스레스 풀을 사용하지 않을 때 문제점1

스레드를 통해 작업을 병렬적으로 처리하는데 스레드를 생성하고 스레드를 종료하는 마무리 작업이 시간이 많이 걸린다.

따라서 스레드라는 것이 작업보다 스레드를 생성하고 종료하는데 시간이 더 오래걸린다.

 

스레스 풀을 사용하지 않을 때 문제점2

모든 요청마다 새 스레드를 만들어서 서비스해 줄 때 최대 스레드 생성 개수를 지정해야하고 그렇지 않으며 언젠가 CPU 시간, 메모리 공간 등의 자원이 고갈된다.

 

스레드 풀이 뭐냐?

메모리에 일정한 수에 스레드를 미리 만들어 놓는다. 그리고 작업이 생기면 스레드 풀에 있는 스레드에 작업을 실어서 보낸다.

 

작업을 Queue에 넣고 Queue에 있는 작업들이 하나 씩 풀에 있는 스레드에 할당되어 처리 된다. 하드웨어의 성능이 충분하다면 성능에 맞추어 스레드 풀을 생성한다.

-> 시스템 성능에 따라서 스레드 풀을 생성하고 이는 시스템 오버헤드 현상이 발생하지 않고

스레드를 생성하고 종료하는 과정이 줄어들어 효율성이 증가하게 된다.

 

스레드 풀 안에 있는 스레드의 개수에 따라서 스레드에서 실행될 수 있는 애플리케이션의 수가 제한 되게 된다.


 

2. 스레드 모델 구현 및 구현 예제

1) 싱글 and 멀티 스레드

컴퓨터의 CPU, RAM 등이 할당된 것이 실행중인 프로세스이다.

멀티스레드에서 각 스레드가 생성되면 각 스레드만의 레지스터와 스택이 할당된다.

처음 코드가 실행되면 메인 스레드가 존재하는데 스택 영역에 스레드가 사용할 스택 공간을 할당한다.

그리고 각각의 스레드는 하나의 코어에서 실행된다. 따라서 각 스레드에서만 사용할 수 있는 레지스터와 스택이 주어지게 된다.

 

스레드 간에도 컨텍스트 스위칭이 일어난다.

문제는 프로세스간에 CW와 스레드간에 CW의 비용은 서로 다르다.

램에는 한 개의 프로세스만 저자할 수 있다고 해보자.

P1P2가 있을 때 P1에 해당하는 정보가 램에 있다가 프로세스간에 CW가 일어난다면 RAM에는 P1을 끄집어 내고 P2를 넣어야한다.

스레드간에 CW는 레지스터에 대한 환경 설정만 변경해주면 된다.

따라서 프로세스 간에 CW의 비용이 더 크다.

 

2) AMdahl’s Law

멀티코어가 있을 때 순차 실행 구성요소와 병렬 실행 구성 요소가 있을 때 이 둘간의 비율이 얼만큼 됐을 때 성능이 최대화가 되는지 지정한 것이다.

 S 만큼은 반드시 순차적으로 실행을 해야하고 NCPU코어 개수이다.

예를 들어 25%는 반드시 순차적으로 실행되야한다고 정해놓을 때 (S = 0.25)

코어가 1개에서 2개로 바뀌면 n1일 때는 1값은 1이며 n2가 되면 1.6이 나옴


 

3) 병렬 실행의 유형

데이터 병렬 실행

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

 

ex1

a = 1; b = 2; (1)

c = 3 (2)

a = a + b (3)

c++; (4)

(1)(3)을 묶고 (2)(4)를 묶어 병렬로 처리한다.

 

ex2

크기가 N인 배열의 내용을 더하는 경우가 잇는데 단일 코어 시스템에서는 하나의 스레드가 원소 0 ~ N-1까지 다 더하면 된다.

듀얼 코어에서는 코어 0에서 스레드는 0 ~ (N/2 1) 절반을 계산하고 코어 1에서 스레드에서 나머지 절반을 각각 병렬로 계산한다.

 

 

테스크 병렬 실행

데이터를 나누지 않고 스레드를 다수의 코어로 분배한다.

다른 스레드들이 동일한 데이터에 대한 연산을 할 수도 있고 서로 다른 데이터에 연산을 실행할 수도 있다.

 

if문과 else문 코드 부분이 별도로 다른 스레드로 나뉘어 처리되는 것을 예로 들 수 있다.


 

4) User Threads and kernel Threads

스레드의 종류에는 아래 2가지가 있다.

User Threads

예를 들어 JavathreadPOSIXPthread가 있다.

사용자 level thread 라이브러리르 사용하여 구현한다.

 

Kernel Threads

커널 스레드는 커널에서 제공하는 스레드이다.

User 레벨에서 스레드를 만든다고해도 어쩃든 CPU를 통해 스레드를 실행하기 떄문에 커널 레벨에서 스레드는 실행된다.

즉 아무리 User 레벨에서 스레드를 많이 만든다고해도 실제 실행은 커널 레벨에서 스레드가 실행된다.

사용자 레벨 스레드를 CPU에서 그대로 실행할 수 없다. 커널 레벨 스레드와 매핑을 하여 커널 레벨 스레드 형태로 CPU에서 실행해야한다.

아랜 3가지 방법은 사용자 레벨 스레드 -> 커널 레벨 스레드로 매핑 하는 3가지 유형을 소개함

 

Many-to-One

사용자 레벨 스레드가 여러개 이고 이는 커널에서는 한 개의 스레드로 매핑이된다.

사용자 레벨 스레드가 하나의 커널 레벨 스레드와 매핑이된다.

사용자 레벨스레드 T1이 커널 스레드에 매핑되어 실행되다 T2가 다음으로 커널 레벨 스레드와 매핑되어 실행되고... 이렇게 실행된다.

 

단점

- 코어의 개수가 4개라면 나머지 코어 3개는 놀기 때문에 비효율적인 방법이다. 그리고 멀티 코어인데도 프로세스들의 스레드들을 동시에 실행할 수 없다.

- 한 스레드가 봉쇄형 시스템을 콜을 할 경우, 전체 프로세스가 봉쇄된다.

 

One-to-One

사용자 스레드는 하나씩 커널 레벨 스레드와 매핑된다. 사용자 레벨 스레드가 추가되면 커널 레벨 스레드도 추가된다.

장점

다대일 모델모다 많은 병렬성 제공

 

단점

근데 이러면 커널 레벨 스레드가 계속해서 생성되기 때문에 OS가 매우 바빠진다.

 

Many-to-Many Model

커널의 스레드 수는 정해져있다.

3개가지고 사용자 애플리케이션이 매핑되어 사용된다.

 

장점 CPU에서 실행하는 커널 레벨 스레드를 한정 시킴으로써 시스템의 부하가 일어나지 않는다.

단점

대신 애플리케이션의 속도는 위 방법보다는 떨어질 것이다. OS가 구현하기 어려울 것이다.

 

따라서 단순한 One-to-One 모델이 많이 사용된다.