4 장. 스레드 (Thread) 순천향대학교컴퓨터공학과이상정 순천향대학교컴퓨터공학과 1 강의목표및내용 목표 다중스레드컴퓨터시스템의기초를이루는 CPU 이용의기본단위인스레드를소개 Pthreads API 및 Win32 와 Java 스레드라이브러리소개 내용 개요 다중코어프로그래밍 다중스레드모델 스레드라이브러리 암묵적스레드 스레드관련문제들 사례 순천향대학교컴퓨터공학과 2
스레드개요 스레드는 CPU 이용의기본단위 스레드는스레드 ID, 프로그램카운터, 레지스터집합, 스택으로구성 스레드는같은프로세스에속한다른스레드와코드, 데이터섹션그리고, 열린파일이나신호와같은자원들을공유 최근의응용들은멀티스레드로동작 응용에서의멀티태스크동작을여러스레드로구현 디스플레이갱신 데이터페치 단어스펠링체크 네트워크요청응답 프로세스생성보다가볍게스레드생성 스레드사용하면코드를간소화하면서효율증가 일반적으로커널은멀티스레드로동작 순천향대학교컴퓨터공학과 3 다중스레드서버구조 (Multithreaded d Server Architecture) t 순천향대학교컴퓨터공학과 4
단일스레드와다중스레드프로세스 순천향대학교컴퓨터공학과 5 한프로세스 3 개스레드 PCB 순천향대학교컴퓨터공학과 6
다중스레드장점 응답성 (responsiveness) 사용자에대한응답성을증가 다중스레드웹브라우저는한스레드가이미지파일을적재하고있는동안, 다른스레드에서사용자와의상호작용이가능 자원공유 (resource sharing) 프로세스의자원들과메모리를공유 한응용프로그램이같은주소공간내에여러개의다른작업을하는스레드수행가능 경제성 (economy) 스레드생성과문맥교환오버헤드가프로세스보다적음 규모가변성 (scalability) 다중처리기구조 (multiprocessor architectures) 에서각각의스레드가다른처리기 (CPU) 에서병렬로수행 순천향대학교컴퓨터공학과 7 다중코어프로그래밍 (1) (Multicore Programming) 다중코어시스템에서프로그래밍을하기위해극복해야할 과제 작업나누기 (dividing activities) 단일코어에서병행실행 멀티코어에서병렬실행 순천향대학교컴퓨터공학과 8
다중코어프로그래밍 (2) 병렬성 (parallelism) 은동시에하나이상의태스크를수행할수있는시스템을의미 병행성 (Concurrency) 는프로세스를만드는하나이상의태스크를지원 단일프로세서 / 코어, 스케줄러가병행성제공 균형 (balance) 전체태스크들이전체작업에균등한기여도를갖는것이중요 데이터분리 (data splitting) 데이터도개별코아에서사용할수있도록분리 데이터종속성 (data dependency) 둘이상의태스크가동시에접근하는데이터에종속성여부검토 종속성이있는경우태스크들간의동기화필요 시험및디버깅 (testing and debugging) 병렬로실행되는다양한실행경로로인해프로그램시험과디버깅이어려움 순천향대학교컴퓨터공학과 9 병렬실행의유형 (Types of Parallelism) 데이터병렬실행과태스크병렬실행 데이터병렬실행 (data parallelism) 동일한데이터의부분집합을다수의계산코어에분배 각코어에서동일한연산수행 태스크병렬실행 (task parallelism) 데이터가아닌태스크 ( 스레드 ) 를다수의코어에분배 각코어의스레드는각각고유연산을수행 스레드수가커지면서하드웨어아키텍처가스레드지원 오라클 SPARC T4 는 8 개코어를가짐 각코어당 8 개하드웨어스레드지원 순천향대학교컴퓨터공학과 10
사용자및커널스레드 사용자스레드 (user thread) 사용자수준스레드라이브러리로관리 주요스레드라이브러리예 POSIX Pthreads, Win32 스레드, Java 스레드 커널스레드 (kernel thread) 커널이지원 예 Windows, Solaris, Linux, Tru64 UNIX, Mac OS X 순천향대학교컴퓨터공학과 11 다중스레드모델 (Multithreading Model) 사용자스레드와커널스레드와의연관관계 다대일모델 (Many-to-One Model) 일대일모델 (One-to-One Model) 다대다모델 (Many-to-Many Model) 순천향대학교컴퓨터공학과 12
다대일모델 (Many-to-One Model) 많은사용자수준스레드를하나의커널스레드로사상 사용자공간의스레드라이브러리가스레드관리 한스레드가봉쇄형시스템호출을할경우, 전체프로세스가봉쇄 (blocking) 다중스레드가다중처리기에서병렬로작동할수없음 예 Solaris 의스레드라이브러리 (green thread) GNU Portable 스레드 순천향대학교컴퓨터공학과 13 일대일모델 (One-to-One Model) 각사용자스레드를각각하나의커널스레드로사상 하나의스레드가봉쇄적시스템호출을하더라도다른스레드가실행가능 다중처리기에서다중스레드가병렬로수행되는것을허용 사용자수준스레드를생성할때커널스레드를생성해야하는오버헤드로응용프로그램의성능저하 예 Windows Linux Solaris 9 순천향대학교컴퓨터공학과 14
다대다모델 (Many-to-Many Model) 여러개의사용자수준스레드를그보다작거나같은수의커널스레드로다중화 가개발자의필요한만큼많은커널스레드생성을허용 예 Solaris 9 이전버전 순천향대학교컴퓨터공학과 15 두수준모델 (Two-level Model) 다대다모델과비슷하며, 하나의사용자스레드가하나의커널스레드에종속되는것을허용 예 IRIX HP-UX Tru64 UNIX Solaris 8과이전버전 순천향대학교컴퓨터공학과 16
스레드라이브러리 (Threads Library) 스레드라이브러리는프로그래머에게스레드를생성하고관리하기위한 API를제공 스레드라이브러리를구현 커널의지원없이완전히사용자공간에서만라이브러리를제공 에의해지원되는커널수준라이브러리를구현 주로사용되는세종류라이브러리 POSIX 표준안의스레드확장판인 Pthread 사용자또는커널수준라이브러리로서제공 Win32 스레드라이브러리 Window 시스템에서사용가능한커널수준라이브러리 Java 스레드 API Java 프로그램에서직접스레드생성과관리 순천향대학교컴퓨터공학과 17 Pthread POSIX(IEEE 1003.1c) 1c) 가스레드생성과동기화를위해제정한표준API 스레드의동작에관한명세 (specification) 일뿐이지그것자체를구현 (implementation) 한것은아님 대부분의 UNIX 에서적용 Solaris, Linux, Mac OS X 다중스레드프로그램예 명령어라인에서 N 값입력 순천향대학교컴퓨터공학과 18
Pthread API 사용예 (1) 순천향대학교컴퓨터공학과 19 Pthread API 사용예 (2) 순천향대학교컴퓨터공학과 20
10개의스레드종료를기다리는 (join) Pthread 예 순천향대학교컴퓨터공학과 21 Java 스레드 (Java Thread) Java 스레드들은 JVM 이관리 Java 프로그램에서스레드를생성하는기법 Thread 클래스로부터파생된새로운클래스를생성하고, Thread 클래스의 run() 메서드를무효화 (override) 하는것 Runnable 인터페이스를구현하는클래스를정의 순천향대학교컴퓨터공학과 22
Java 스레드예 (1) 순천향대학교컴퓨터공학과 23 Java 스레드예 (2) 순천향대학교컴퓨터공학과 24
묵시적스레딩 (Implicit Threading) 스레드의수가늘어남에따라명시적 (explicit) 으로프로그램을작성하고검증하는것이어려워짐 프로그래머가아닌컴파일러와실행라이브러리 (run-time library) 가스레드를생성하고관리 다음 3 가지방식소개 스레드풀 (Thread Pool) OpenMP Gcd (Grand Central Dispatch) 순천향대학교컴퓨터공학과 25 스레드풀 (Thread Pool) 프로세스를시작할때아예일정한수의스레드들을미리풀로생성하고대기 장점 새스레드를만들어주기보다기존스레드로서비스해주는것이더빠름 스레드풀은동시에존재할스레드개수에제한 순천향대학교컴퓨터공학과 26
OpenMP C, C++, Fortran 컴파일러지시자와 API 로멀티스레드프로그래밍지원 공유메모리환경에서병렬프로그래밍지원 병렬로수행되는블록들을 parallel regions 로구분 #pragma omp parallel 코어개수만큼많은스레드를생성 #pragma omp parallel for for(i=0;i<n;i++) { c[i] = a[i] + b[i]; 병렬로루프를실행 순천향대학교컴퓨터공학과 27 GCD (Grand Central Dispatch) Apple Mac OS X, ios 에서지원 C, C++ 언어의확장으로 API, 실행라이브러리제공 병렬섹션을구분하고스레딩관리를지원 블록표시, ^{ ˆ{ printf("i am a block"); 블록들은발송큐 (dispatch queue) 에놓임 큐에서제거되는가용한스레드는스레드풀에지정 순천향대학교컴퓨터공학과 28
스레드와관련된문제들 fork(), exec() (Threading Issues) 스레드와관련된문제들 fork(), exec() 시스템호출 신호처리 (signal handling) 스레드취소 스레드국지저장소 (thread-local storage) 스케줄러액티베이션 (scheduler activation) fork() 및 exec() 시스템호출 한프로그램의스레드가 fork() 를호출하면새로운프로세스는모든스레드를복제또는호출한스레드만복제하는가? fork() 후 exec() 호출하는경우호출한스레드만복사해주는것이적절 순천향대학교컴퓨터공학과 29 스레드와관련된문제들 신호처리 신호처리 (signal handling) 신호 (signal) 는UNIX에서프로세스에게어떤사건 (event) 이일어났음을알려주기위해사용 신호는다음과같은형태로전달 신호는특정사건이일어나야생성 신호가생성되면프로세스에게전달 신호가전달되면반드시처리 다중스레드프로그램에서는어느스레드에게신호를전달? 신호가적용될스레드에게전달 모든스레드에게전달 몇몇스레드들에게만선택적으로전달 특정스레드가모든신호를전달받도록지정 신호를전달하는표준 UNIX 함수는 kill(aid_t aid, int signal) POSIX Pthread 는 pthread_kill(pthread_t tid, int signal) 함수도제공 순천향대학교컴퓨터공학과 30
#include <stdio.h> #include <signal.h> 시그널예 int count; // 시그널핸들러 void catch_sigint(int signum) { printf(" n(count=%d) CTRL-C C pressed n", count++); int main() { struct sigaction act; // 시그널핸들러설정 act.sa_handler = catch_sigint; sigaction(sigint, &act, NULL); while (1) { if (count == 5) break; return 0; 순천향대학교컴퓨터공학과 31 스레드와관련된문제들 취소 (1) 스레드취소 (thread cancellation) 스레드취소 (thread cancellation) 는스레드가끝나기전에그것을강제종료시키는작업 2가지방식 비동기식취소 (asynchronous cancellation) 한스레드가즉시목적스레드를강제종료 지연취소 (deferred cancellation) 목적스레드가주기적으로자신이강제종료되어야할지를점검 스레드생성및취소 pthread 코드예 순천향대학교컴퓨터공학과 32
스레드와관련된문제들 취소 (2) 스레드취소요청의처리는스레드의상태에따라다름 Pthread 의 3 가지취소모드 모드가 off 인경우스레드취소할수없음 디폴트모드는지연 (deferred) 취소 취소는스레드가취소점 (cancellation point) 에도달한경우취소수행 예, pthread_testcancel() 호출이후정리처리기 (cleanup handler) 호출하여수행 Pthread 에서는비동기식취소는권장하지않음 Linux 시스템에서는신호를사용하여스레드를취소 순천향대학교컴퓨터공학과 33 스레드와관련된문제들 스레드국지저장소 (Thread-Local Storage) 스레드- 국지저장소 (Thread-Local Storage, TLS) 스레드자신만접근가능한데이터를허용 스레드별데이터 지역변수 (local variable) 과차이 지역변수는하나의함수가호출되는동안가용 TLS 는전체함수호출동안가용 정적데이터 (static data) 와유사 대부분의스레드라이브러리들은어떤형태로든이와같은스레드국지저장소를지원 순천향대학교컴퓨터공학과 34
스레드와관련된문제들 스케줄러액티베이션 (Scheduler Activations) 다대다와두수준모델은사용자스레드와커널간의통신조정이필요 응용프로그램의성능을위해커널스레드수를동적으로조정하는것이필요 일반적으로사용자와커널스레드사이에중간자료구조를사용, LWP(lightweight process, 경량프로세스 ) 응용이사용자스레드를실행하기위해스케줄할가상처리기 (virtual processor) 처럼보임 각 LWP 는하나의커널스레드에연결 스케줄러액티베이션은업콜 (upcall) 을제공 커널에서스레드라이브러리의업콜처리기 (upcall handler) 로통신메커니즘 이러한통신기법으로한응용이올바른수의커널스레드를유지 순천향대학교컴퓨터공학과 35 과제 순천향대학교컴퓨터공학과이상정 36
실습과제 Pthread 예 1 1. 다음과같은 p.199 그림 49 4.9 의수정된버전을아래와같이두개의터미널에서실행하고결과분석 사용된 pthread API 설명분석 컴파일시다음과같이 pthread 옵션을기술 $ gcc pthread prog.c 터미널 1 에서소스작성하고실행시작후문자입력전대기 터미널2를생성하고다음을실행하고출력분석 $ ps am-l 터미널 1에서문자입력하고실행결과분석 순천향대학교컴퓨터공학과 37 #include <pthread.h> #include <stdio.h> int sum; /* this data is shared by the thread(s) */ void *runner(void *param); /* the thread */ int main(int argc, char*argv[]) { pthread_t tid; /* the thread identifier */ pthread_attr_t attr; /* set of thread attributes */ if (argc!= 2) { fprintf(stderr,"usage: a.out <integer value> n"); return -1; if (atoi(argv[1]) < 0) { fprintf(stderr,"%d must be >= 0 n",atoi(argv[1])); return -1; 순천향대학교컴퓨터공학과 38
/* get the default attributes */ pthread_attr_init(&attr); /* create the thread */ pthread_create(&tid,&attr,runner,argv[1]); /* wait for the thread to exit */ pthread_join(tid,null); printf("sum = %d n",sum); /* The thread will begin control in this function */ void *runner(void *param) { int i, upper = atoi(param); sum = 0; for (i = 1; i <= upper; i++) sum += i; printf("input any character to continue n"); getchar(); pthread_exit(0); 순천향대학교컴퓨터공학과 39 실습과제 Pthread 예 2 2. 다음프로그램을아래와같이두개의터미널에서실행하고결과분석 터미널1에서소스작성하고실행시작후문자입력전대기 터미널2를생성하고다음을실행하고출력분석 $ ps am -L 터미널 1 에서문자입력하고실행결과분석 순천향대학교컴퓨터공학과 40
#include <pthread.h> #include <stdio.h> int value = 0; void *runner(void *param); /* the thread */ int main(int argc, char *argv[]) { int pid; pthread_t tid; pthread_attr_t attr; pid = fork(); if (pid == 0) { /* child process */ pthread_attr_init(&attr); pthread_create(&tid, &attr, runner, NULL); pthread_join(tid, NULL); printf("child: value = %d n", value); /* LINE C */ else if (pid > 0) { /* parent process */ wait(null); printf("parent: value = %d n", value);/* LINE P */ 순천향대학교컴퓨터공학과 41 void *runner(void *param) { value = 5; printf("input any character to continue n"); getchar(); pthread_exit(0); 순천향대학교컴퓨터공학과 42
특별실습과제 프로젝트 2 p227 p.227, 프로젝트 2 다중스레드정렬응용 주어진정수목록 2등분하여두개의개별스레드 ( 정렬스레드 ) 에서정렬 정렬된두서브리스트는병합스레드에서병합하여정렬 전역배열 (global array) 에데이터저장하여스레드가공유 순천향대학교컴퓨터공학과 43 특별실습과제 소켓프로그램 3 장의특별과제클라이언트- 서버자바소켓프로그램을다중스레드프로그램으로변경하여작성하여라 소스프로그램및설명 실행예 순천향대학교컴퓨터공학과 44