목표 쓰레드 (thread) 개념소개 Thread API Multithreaded 프로그래밍관련이슈 4 장. 쓰레드 2 4.1 개요 쓰레드 쓰레드 (Thread ) CPU 이용의기본실행단위 단일쓰레드 (Single threaded) Processes 전통적인프로세스 한개의실행단위로구성 다중쓰레드 (Multithreaded) Process 여러개의실행쓰레드를갖는프로세스 한프로세스가동시에하나이상의작업수행가능 전통적인프로세스의확장 process (single threaded) multithreaded process Thread 사용자원 같은프로세서에속한다른 thread 들과 code, data, OS 자원 ( 예 : open file, signal) 들을공유함 stack, CPU register 저장공간은 thread 전용공간사용 Thread Control Block (TCB) 쓰레드에대한정보를보관 ( 프로세스의 PCB 와유사 ) thread ID thread 실행상태 program counter, register set thread context stack thread specific 메모리공간 (static 메모리 ) threads 3 4
단일및다중쓰레드프로세스 중량프로세스와경량프로세스 share separate traditional process heavy-weight process thread light-weight process 5 thread 생성에필요한자원이 process 생성에필요한자원보다작다 경량 6 동기 장점 (Benefits) 단일응용프로그램이여러개의작업을동시에실행할필요가있음 word processor: 화면출력 + 키보드입력 + 스펠링검사 web browser: 화면출력 + 네트워크에서데이터수신 web server: 여러개 ( 수천개도가능 ) 의 client 의요청처리 OS kernel: 장치관리, 인터럽트처리등의여러작업 해결책 다중프로세스 (multiple processes) 프로세스생성오버헤드 다중쓰레드프로세스 쓰레드생성에필요한자원이적어서, 효율적 응답성 (Responsiveness) 프로그램의일부가 block 되거나, 긴작업을수행하여도, 대화형 (interactive) 작업의계속진행을허용 사용자에대한응답성증가 자원공유 (Resource Sharing) 기본적으로프로세스의메모리와자원을공유함 같은주소공간에서여러개의다른작업을수행하는 thread 허용 커널서비스호출없이 thread 간에통신가능 경제성 (Economy) thread 생성, 종료, context switch 에소요되는오버헤드가 process 에비해서적음 자원, 시간절약 ( 예 ) Solaris : 생성 30 배빠름, context switching 5 배빠름 규모확장성 (Scalability), 적응성 다중프로세서 ( 멀티코어 ) 구조에서 thread 들을병렬처리가능 multithreaded server 7 8
4.2 멀티코어프로그래밍 단일코어시스템에서의병행 (concurrent) 실행 멀티코어시스템에서의병렬 (parallel) 실행 병렬 (Parallel) 과병행 (Concurrency) 병렬실행과병행실행의구분 병렬시스템 (parallel system) 은동시에 1 개이상의작업수행 병행시스템 (concurrent system) 은 1 개이상의 task 를지원하여모든작업이진행되게함 Amdahl s Law N 개의프로세서를사용하여얻을수있는가능한성능이득 S : 순차 ( 비병렬 ) 실행요소비율 1-S : 병렬실행요소비율 N : 프로세서개수 N 이면, speedup 1/S ( 예 ) S=0.25 이면최대 4배의성능향상이가능 병렬실행 (parallelism) 의유형 data parallel 데이터의부분집합에대해서동일연산수행 task parallel 각프로세서마다고유연산수행 대부분두병렬실행방법이혼용된다. 9 10 4.3 다중쓰레드모델 사용자쓰레드와커널쓰레드 User threads : 커널지원없이사용자수준 ( 커널위 ) 에서 thread library 에의해서지원됨 Kernel threads : OS 커널에서직접지원되고관리됨. 모든현대운영체제는 kernel threads 를지원함 Windows, Solaris, Linux, Mac OS X 사용자프로그램의쓰레드와커널쓰레드간에연관관계가존재 Many-to-One 모델 One-to-One 모델 Many-to-Many 모델 11 Many-to-One 모델 다수의 user-level thread가한개의kernel thread (process) 에연관 thread 스케줄링과동기화가사용자공간의 thread library에서수행 장점 context 스위칭과동기화 overhead가작아서효율적 user process 단점 한 thread가 blocking system call을호출하여 block되면전체 process가 block됨 커널이 user-level thread의존재를알지못함 Multiprocessor 시스템에서 thread들의병렬실행불가 예 : Solaris Green Threads process GNU Portable Thread 12
One-to-One 모델 Many-to-Many 모델 각 user-level thread 가한개의 kernel thread 에연관 장점 : 더많은병행실행, 병렬실행 (multiprocessor) 한 thread 가 blocking system call 을호출하여 block 되면커널은같은 process 의다른 thread 로스케줄링 단점 : 쓰레드생성및 context 스위칭오버헤드 커널시스템호출을사용하여커널쓰레드생성해야함 커널에서 thread context switching 이이루어짐 예 최대 thread 수에제한이있음 Windows Linux Solaris 9 이후버전 user process 다수의 user-level thread 가다수의 kernel thread 에연관 kernel thread 의수는 user-level thread 의수와작거나같음 kernel thread 들을 user-level thread 들이 multiplex 하여사용 장점 kernel thread 개수는응용프로그램이나 machine 에따라서결정됨 one-to-one 모델과같은병행 / 병렬성 필요한만큼의 kernel thread 와연관되는경우 blocking system call 을호출하여 block 되었을때에다른 thread 를스케줄 user-level thread 개수보다적은 kernel thread 를사용할수있어서 kernel thread 수의제한에영향없음 user process multiplexing 13 14 세가지 thread 구현모델 One-to-One 모델 Two-level 모델 Many-to-One 모델 Many-to-Many 모델 many-to-many 모델의변형모델 일부 user-level thread 에대해서 one-to-one 연관허용 하나의 user-level thread 가하나의 kernel thread 에만연관될수있음 예 : IRIX, HP-UX, Tru64 UNIX, Solaris 8 and earlier user process bound multiplexing 15 16
Solaris 에서의 Many-to-Many 모델 (Two-level 모델 ) 4.4 Thread 라이브러리 LWP(lightweight process) 가 user thread 와 kernel thread 간의중개역할수행 user threads are mapped into LWPs Thread 라이브러리 thread 를생성하고관리하기위한 API 제공 thread 라이브러리구현 user-level library : 완전히 user space 에서구현 library 함수호출은 user space 에서의함수호출로이어짐 kernel-level library : library의코드와데이터가 kernel space에존재 library 함수호출은커널에대한 system call 호출로이어짐 주로사용되는 3가지 Thread libraries 1. POSIX Pthreads: user- or kernel-level library 2. Windows thread: kernel-level library 3. Java Thread: Java thread API 호스트시스템에서사용가능한 thread library로구현 17 18 Pthreads Pthreads API 를사용한 Multithreaded C program Thread 생성및동기화를위한 POSIX 표준 API (IEEE 1003.1c) thread library 의동작에대한명세 (specification) 구현방법을명시한것은아님 UNIX 계열 OS 에서일반적으로제공됨 (Solaris, Linux, Mac OS X) Pthread library 함수 pthread_create() - thread 생성 pthread_join() thread 종료를기다림 pthread_exit() thread 종료 pthread_attr_init() thread attribute 를 default 값으로초기화 19 20
Windows Threads Windows Threads ( 계속 ) CreateThread() thread 생성 WaitForSingleObject() 한 thread 종료기다림 WaitForMultipleObjects() - 여러 thread 종료기다림 Example code 21 22 Java Threads Extending the Thread Class Java threads 운영체제가아닌 Java 언어수준에서지원하고 JVM 이관리함 main() method 만으로구성된 Java program 은 JVM 에서단일 thread 로실행됨 Thread 생성방법 1. Extending Thread class ( 파생클래스생성 ) 2. Implementing the Runnable interface ( 인터페이스구현 ) public interface Runnable { public abstract void run(); } Thread s start() method 23 24
Implementing the Runnable Interface Joining Threads Thread thrd = new Thread(new Worker2()) public interface Runnable { public abstract void run(); } Thread s join() method 25 26 4.5 묵시적쓰레딩 Thread Pools 묵시적쓰레딩 (Implicit Threading) Thread 생성과관리를응용프로그램개발자가아닌 compiler 와 runtime library 에게넘겨주는것 멀티코어병렬처리를사용하는프로그램설계에사용 컴파일러에서멀티쓰레딩지원 Open MP GCD (Grand Central Dispatch) 멀티쓰레딩관리방법 Thread Pool Multithreaded server 에서의잠재적문제점 thread 생성오버헤드 : 요청마다 thread 를생성하는데시간이소요됨 thread 수가증가에따른자원고갈가능성 thread 수에제한이필요 해결책 Thread pool 프로세스를시작할때에일정한수의 thread 들을 thread pool 에미리생성하여대기함 요청을받을때마다 pool 에있는한 thread 를깨워서사용 장점 빠른속도 - 새 thread 생성소요시간보다기존 thread 로서비스하는것이더빠름 동시존재 thread 수제한 pool 의크기 task 생성방법을 task 에서분리하면 task 실행을다른방식으로할수있음 주기적실행, 일정시간후실행등 27 28
OpenMP GCD OpenMP (Open Multi-Processing) C, C++, Fortran 컴파일러의 directive 와 API 로 multithreaded 프로그래밍지원. 공유메모리환경에서의병렬프로그래밍지원 GCD (Grand Central Dispatch) Apple Mac OS X, ios 운영체제에서지원 C/C++ 언어의확장, API, runtime library로제공 병렬섹션을구분하여쓰레딩관리지원 블록표시 ^{ } ˆ{ printf("i am a block"); } 블록들은 dispatch queue 에넣고, queue 에서제거될때에 thread pool 에서가용 thread 에선택하여할당함 코어개수의쓰레드생성 29 30 4.6 쓰레드관련이슈 UNIX 에서의 Signal handling fork(), exec() 시스템호출 thread 에서 fork() 를호출할때의동작은? 두가지 fork() 구현방법 process 의모든 thread 들을복제 : fork no exec 의경우에사용 생성된프로세스는 multi-threaded 해당 thread 만복제 : fork exec 의경우에사용 생성된프로세스는 single threaded fork fork exec 31 Signal (Process 에대한 signal 은 CPU 에대한 interrupt 와비슷함 ) UNIX 에서프로세스에게특정 event 발생을알려주기위해서사용 동기식 signal (ex) illegal memory access, division by zero 비동기식 signal (ex) Ctrl-C로종료 signal handler signal( signal number) 을처리하기위해사용됨 signal은특정event에의해생성되어 process에게전달됨 process의 signal handler에서처리됨 process 두종류의 signal handler A default signal handler A user-defined signal handler Multithreaded process 에서의 signal 전달옵션 signal 이적용될 thread 에게전달 모든 thread 에게전달 일부 thread 에게선택적으로전달 signal 을전달받는 thread 지정 signal 의유형에따라서 signal 전달방법이정해짐 signal signal handler 32
Thread 취소 Thread-Local 저장소 Thread 취소 (cancellation) target thread 가종료되기전에 thread 를강제로중단시키는것 두가지취소방식 비동기 (asynchronous) 취소 : 즉시 target thread 를취소 지연 (deferred) 취소 : 주기적으로점검하여 target thread 를취소 thread 취소의어려운점 자원이할당되어있거나공유데이터를갱신하고있는 thread 를취소할때에처리에어려움이발생함 비동기취소방식에서자원회수에문제발생가능성 지원취소방식에서는취소시점 (cancellation point) 에서안전한취소가능여부를검사하여취소 Thread-Local Storage(TLS) thread 자신만이접근가능한저장공간 대부분의 thread library 가 TLS 지원기능제공 TLS, local variable, static variable 의비교 local 변수 함수호출동안에만일시적으로사용 static 변수 프로그램실행동안함수내의기억장소를유지 ( 같은함수를사용하는 thread 들은 static 기억장소공유 ) TLS static 변수와비슷하지만, 각 thread 별로분리된기억장소사용 33 34 Scheduler Activations 경량프로세스 (lightweight process: LWP) Many-to-many 모델에서는 user-level thread 와 kernel thread 사이에 LWP(lightweight process) 라고하는중간자료구조사용하여연결 각 LWP 는 kernel thread 에연결되며 user-thread library 에게 virtual processor 같이보여짐 가용 LWP 에 user-level thread 들을스케줄링 각응용에필요한 LWP 개수 CPU-bound 응용 : 1 개의 LWP 이면충분 I/O intensive 응용 : 여러개의 LWP 필요 Scheduler Activation upcall: thread 가 block 되거나 event 가발생하면커널에서 signal 을보내어 thread library 의 upcall handler 를호출함 upcall handler 는새 LWP 를할당받아실행되고다른 thread 에게스케줄링함 운영체제는 kernel thread 를스케줄링함 35