[운영체제] Chapter 4: Threads
[참고자료] [Operating System Concepts 에센셜] 저자(글) · Abraham Silberschatz, Peter Baer Galvin , Greg Gagne 번역 조유근, 박민규 , 고건
Chapter 4: Threads
3개의 프로세스가 같은 프로그램을 3번 실행시켜서 만든 프로세스라면?
3개의 프로세스에서 공통되는 부분도 있고 다른 부분도 있다.
code, data, files는 공통 되는 부분
실행과 관련된 registers, stack은 개별적이게 갖고 있다.
쓰레드는 이 한쌍을 의미한다.
만약 같은 프로그램을 더 추가하고 싶으면 쓰레드 부분만 추가하면 된다.
멀티 프로세싱과의 차이점은 멀티프로세싱의 경우 fork()시에 코드부분을 제외하면 다 독립적으로 관리되고 exec()시 새로운 프로그램을 덮어씌운다.
멀티 쓰레딩은 메모리에 같은 공간을 공유하기 때문에 코드 부분과 파일, 데이터(전역변수) 까지 공유를 한다. 쓰레드는 Api를 통해 생성한다.
Motivation
많은 응용은 multiThread로 동작한다.
- 디스플레이 업데이트
- 데이터 가져오기
- 스펠 체크
- 네트워크 응답에 대답.
- 프로세스 생성은 heavy-weight지만 쓰레드 생성은 light-wight
- 코드 단순화, 효율증가
커널 자체가 여러개의 쓰레드로 이루어지기도 한다.
web 서버의 예
웹 브라우저 client (ex Chrome)
(1) 사용자 요청
(2) 서버는 요청에 따른 쓰레드 생성 (태스크 병렬성을 의미)
(3) 서버는 쓰레드 생성만 할뿐 다른 요청을 대기하고 있는다.
이득
- 대화형 프로그램
- 일부분 block, 긴 작업 수행해도 응답성 향상
- 자원 할당
- ipc는 공유메모리, 메세지 패싱을 해야 자원공유하지만 쓰레드는 자신이라 상관없다.
- 아까 위에 있는 스택, 레지스터 외엔 다 공유함.
- Economy
- context switching 이 쉽다.(데이터, 자원 공유, 통신이 쉬워 커널간의 오버헤드 감소)
- 병렬적 수행
- 성능행상
4.2 Multicore Programming
“병렬성” “동시성”
첫번째 그림은 코어가 2개일때이다. 각기 다른 태스크 수행하기 때문에(SMP 구조 이기도함 ) 이때 병렬성을 만족한다.
두번째는 하나의 코어일때 multiprogramming(=time sharing)이다. 이경우는 context switching을 통해 동시성을 만족한다.
Multicore Programming
- 데이터 병렬성 : 하나의 데이터 집합의 부분집합을 core가 나눠 동작 각 코어가 동일하게 나눠갖는다.
- 태스크 병렬성 : 쓰레드가 다른 작업을 한다. 다수의 코어에 분배한다.
독립 병행가능한 task를 나눌 수 있어야한다.
암달의 법칙
“병렬 실행 성능에 대한 법칙”
S - 순차적 실행.
N - core의 개수이다.
[문제] 75% 병렬성을 갖고 있는 응용에 대해 코어가 1→2개된다면 어느정도의 성능 향상이냐
1 / (25 + 75/2) = 2/125 1.6배 향상.
4.3 Multithreading models
유저 쓰래드
- 유저 모드에서 동작하는 쓰레드
- POSIX Pthreads , Window thread, java threads
커널 쓰래드
유저 쓰레드 실행 시 대응하는 커널 쓰레드가 1개 이상 있어햐한다.
쓰레드의 병렬 실행을 위해서는 CPU코어 의 수보다 우선적으로 하나의 쓰레드에 대응하는 커널 쓰레드가 있어야한다.
Many-to-One
- 여러개의 유저 쓰레드가 하나의 커널 쓰레드에 대응한다.
- 하지만 이때 유저쓰레드가 blocking thread 하면 유일한 커널도 blocked 되어서 나머지 유저 쓰래드는 기다려야한다.
- blocking thread란 시스템 콜요청하고 waiting으로 기다려야하는 시스템 콜(대부분의 입출력)
- 쓰래드는 메모리를 같이 갖고 있기때문에 다른 쓰레드가 기다려야한다.
즉 무늬만 다중 쓰레드지, 병렬을 기대할 수 없다.
ONE TO ONE
하나의 유저쓰래드와 대응되는 하나의 커널 쓰래드
유저쓰래드를 만들면 대응하는 커널 쓰래드가 만들어진다.
멀티 코어 병렬 수행이 가능하다.
너무 많은 쓰레드 생성될수 있어서 제한해야한다.
Many to Many
- 다수의 유저 쓰래드를 같거나 작은 커널 쓰레드로 멀티플렉싱하는것이다.
- ONE TO ONE의 단점을 개선하기 위함이기 때문에 더 많은 수는 필요없다.
- 미리 적잘한 수의 커널 쓰레드를 생성해 놓는다.
Many to one(blocking시에도 병렬가능), one to one(단점 개선)
Two level model
- Many to Many와 One to One 둘다 갖는 형태이다.
- 과거 유닉스 계열에서 사용했다.
- 병렬성이 필요한 모델은 커널 쓰레드에 대응, 나머지는 M:M모델로 사용
4.4 Thread 라이브러리
- 쓰래드 라이브러리는 프로그래머에게 쓰래드 생성/관리 할 수 있는 api를 제공한다.
- ex) POSIX Pthreads / Windows Threads/ java Threads
Pthreads
- user level, kernel level에서 구현 가능하다.
Pthreads Example
1~N까지의 정수의 합 구하기 .
#include
int sum #전역 변수 선언 러너는 여기다가 값을 저장하며, 메인을 출력한다.
if argc ! = 2 # 숫자 n이 명시 되어있는지
if atoi(argv[1] < 0) # 숫자 n이 명시 되어 있는지
pthread_arrt_init(&attr) #속성변수 attr 초기화
pthread_create(&tid, &attr, runner, argv[1]) # 새로운 쓰레드 id, 초기화한 속성변수, 지정함수,argv[1]명령줄의 n(러너 함수의 유일한 파라미터)
러너 함수 (void *pram) #스레드 생성할때 argv[1] N값 받기.
{
atoi(param) → N을 실제 정수값으로 바꾸는 함수.
sum은 전역 변수기 때문에 메인과 공유
pthread_exit(0)
Windows Multithreaded C
#include
DWORD Sum → 전역변수 (쓰렏,와 공유)
DWORD WINAPI Summation(Param) → Pthreads와는 다르게 exit가 없고 return 0이 exit와 동일기능
if 문 두개로 명령줄에 n이 숫자형태로 잘 명시 됐는지 확인
CreateThread(속성변수 = 0, 파라미터, 쓰레드아이디, 스택 사이즈 등등)
WaitForSingleObject() → Wait함수
4.5 Implicit Threading(멀티쓰래딩 이슈)
- 한 프로그램이 많은 쓰레드를 사용하면 검증 어려움, 쓰래드 많아지면 심각해진다.
대체방법 3가지
- Thread Pools
- OpenMP
- Grand Central Dispath
자세한 내용은 생략.
Thread pools
무한정 쓰레드 생성 방지
- 쓰레드를 풀 개념으로 미리 만들기
- 풀에 속한 쓰레드는 요청 발생시 할당.
- 미리 쓰레드를 생성해서 new thread 생성보다 빠르며 풀 크기를 제한 해 둔다,.
- task생성과 실행을 분리했다.
- thask를 일정한 시간뒤에 시작, 주기적 시작이 가능하다.
OpenMP
- C,C++,Fortran을 위한 compier directivces(컴파일러에게 특별 동작을 수행하도록 지시하는 명령문)과 API집합.
- 공유메모리환경의 병렬프로그램 지원
- 프로그래머는 자신의 코드 중 병렬프로그램에 대해 컴파일러 다이렉티브를 사용해 런타임 라이브러리가 병렬실행하도록.
#pragma omp parallel (complier directives) 코어 개수만큼 쓰래드 생성, 동시에 병렬실행
Grand Central Dispatch
Block “^{}”
^{printf (” I am a block”) }
블럭을 dispatch queue에 넣어서 스케쥴링 함.
블럭을 쓰레드 풀의 가용쓰레드와 매칭시켜 쓰레드가 내용 실행하도록.
- 병렬실행
- 개발자는 블럭만 쓰면됨.
Dispatch queue 두가지 종류
serial(직렬)
- First - in - Frist - Out
- 꺼내진 블럭을 다른 블럭 큐에서 꺼내기전에 실행.
- 프로세스마다 각각의 serial queue가 있고, 이걸 main queue라고함.
Concurrent (동시에)
- First in First out
- FiFo지만 한번에 여러개를 꺼내 동시에 실행 가능하도록
- low, default, high큐가 있으며 우선순위에 따라 3개의 concurrent queue중에 사용.
밑에는 디폴트 큐의 예
Threading issues
- fork(), exec()의 의미가 달라짐.
- 부모 쓰래드가 2개인데 fork하면 몇개가 될것인지 정의
- 프로세스에 가는 신호를 어떤 쓰레드에게 받게 할 것인지
- 쓰레드 종료문제
- 쓰레드 로컬저장문제
- 스케줄려 문제
댓글남기기