1. Thread
1) Thread Pool 개념
● 스레스 풀을 사용하지 않을 때 문제점1
스레드를 통해 작업을 병렬적으로 처리하는데 스레드를 생성하고 스레드를 종료하는 마무리 작업이 시간이 많이 걸린다.
따라서 스레드라는 것이 작업보다 스레드를 생성하고 종료하는데 시간이 더 오래걸린다.
● 스레스 풀을 사용하지 않을 때 문제점2
모든 요청마다 새 스레드를 만들어서 서비스해 줄 때 최대 스레드 생성 개수를 지정해야하고 그렇지 않으며 언젠가 CPU 시간, 메모리 공간 등의 자원이 고갈된다.
● 스레드 풀이 뭐냐?
메모리에 일정한 수에 스레드를 미리 만들어 놓는다. 그리고 작업이 생기면 스레드 풀에 있는 스레드에 작업을 실어서 보낸다.
작업을 Queue에 넣고 Queue에 있는 작업들이 하나 씩 풀에 있는 스레드에 할당되어 처리 된다. 하드웨어의 성능이 충분하다면 성능에 맞추어 스레드 풀을 생성한다.
-> 시스템 성능에 따라서 스레드 풀을 생성하고 이는 시스템 오버헤드 현상이 발생하지 않고
스레드를 생성하고 종료하는 과정이 줄어들어 효율성이 증가하게 된다.
스레드 풀 안에 있는 스레드의 개수에 따라서 스레드에서 실행될 수 있는 애플리케이션의 수가 제한 되게 된다.
2. 스레드 모델 구현 및 구현 예제
1) 싱글 and 멀티 스레드
컴퓨터의 CPU, RAM 등이 할당된 것이 실행중인 프로세스이다.
멀티스레드에서 각 스레드가 생성되면 각 스레드만의 레지스터와 스택이 할당된다.
처음 코드가 실행되면 메인 스레드가 존재하는데 스택 영역에 스레드가 사용할 스택 공간을 할당한다.
그리고 각각의 스레드는 하나의 코어에서 실행된다. 따라서 각 스레드에서만 사용할 수 있는 레지스터와 스택이 주어지게 된다.
스레드 간에도 컨텍스트 스위칭이 일어난다.
문제는 프로세스간에 CW와 스레드간에 CW의 비용은 서로 다르다.
램에는 한 개의 프로세스만 저자할 수 있다고 해보자.
P1과 P2가 있을 때 P1에 해당하는 정보가 램에 있다가 프로세스간에 CW가 일어난다면 RAM에는 P1을 끄집어 내고 P2를 넣어야한다.
스레드간에 CW는 레지스터에 대한 환경 설정만 변경해주면 된다.
따라서 프로세스 간에 CW의 비용이 더 크다.
2) AMdahl’s Law
멀티코어가 있을 때 순차 실행 구성요소와 병렬 실행 구성 요소가 있을 때 이 둘간의 비율이 얼만큼 됐을 때 성능이 최대화가 되는지 지정한 것이다.
S 만큼은 반드시 순차적으로 실행을 해야하고 N은 CPU코어 개수이다.
예를 들어 25%는 반드시 순차적으로 실행되야한다고 정해놓을 때 (S = 0.25)
코어가 1개에서 2개로 바뀌면 n이 1일 때는 1값은 1이며 n이 2가 되면 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
예를 들어 Java의 thread와 POSIX의 Pthread가 있다.
사용자 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 모델이 많이 사용된다.
'전공 > 운영체제' 카테고리의 다른 글
Chapter5 프로세스 스케줄링(Multilevel Queue, Multilevel Feedback Queue ) (0) | 2022.06.27 |
---|---|
Chapter5 프로세스 스케줄링(Multilevel Queue Scheduling Algorithm을 위한 여러가지 알고리즘) (0) | 2022.06.27 |
Chapter3 Process (0) | 2022.05.05 |
Chapter2 운영체제 개요2(OS의 구조) (0) | 2022.05.05 |
Chapter1 운영체제 개요1 (0) | 2022.05.05 |