OS) Chapter 4. Threads

Chapter 4. Threads

Motivation

-       대부분의 현대 applicationmultithread화되어 있다.

-       Threadapplication과 함께 진행된다.

-       나눠진 thread에 의해 application과 함께 multiple taskimplemented된다.
n  Word processor example
u  Display update
u  Keystroke에 반응
u  background에서 spellinggrammar 확인

-       Process를 만드는 것은 무겁지만 thread 생성은 가볍다

-       전통적인 process single thread만 갖고 있었다.

Multithreaded processsingle-threaded process와 다르게 병렬적으로 thread를 실행한다. (registerstack을 각각 따로 가지고 있음)

Benefit

-       Responsiveness: 만약 process의 일부분이 block됐다면, execution을 계속 진행하도록 하는데, 이는 user interface에서 매우 중요한 역할을 한다.

-       Resource Sharing: threadprocessresource를 공유하기 때문에, shared memorymessage passing 구현이 보다 더 쉽다.

-       Economy: process creation을 만드는 데에 저렴하고, context switching하는 것보다 보다 더 적은 lower overhead이다.

-       Scalability: processmultiprocessor architecture에 큰 장점을 가지고 있다.

Multicore Programming: Multicore or multiprocessor systemprogrammer에게 다음과 같은 점들을 요구한다
ð  Dividing activities
ð  Balance
ð  Data Splitting
ð  Data dependency
ð  Testing and debugging

-       Parallelism은 증진적으로 하나의 task보다 더 많은 것을 소화할 수 있는 system을 의미한다. (multicore processor)


-       Concurrencyprogress를 만들어 하나의 task보다 더 많은 것을 소화할 수 있다. (multiprogramming)


-       Types of parallelism

n  Data parallelism: 같은 datasubset을 이용하여 multiple core에서 same operation을 수행한다.

n  Task parallelism: core에서 threaddistribute하는 것으로 각각 uniqueoperation을 수행한다.

-       Amdahl’s Law

n  Serialparallelcomponent를 갖고 있는 applicationadditional core를 더하는 것으로 performance gainidentify할 수 있다.

n  Sserial portion, NProcession Core라고 할 경우,

n  만약 application75% parallel, 25% serial이라고 일 경우, single core에서 core를 하나 더 붙이면, 1.6배의 speed up 증가가 있다.

n  N이 무한으로 발산할 경우, speedup 효과는 1/S로 수렴한다.

Thread 종류

-       User thread: user level thread library에 의해 management되는 thread(ex) POSIX Pthreads, Windows threads, Java threads

-       Kernel thread: Kernel에 의해 support되는 thread

Multithreading Models

-       User thread들은 kernel 위에서 support되지만, kernel support없이 관리된다.

-       User threadkernel thread사이에 반드시 relationship이 나타나야만 한다.
n  Many-to-One
n  One-to-One
n  Many-to-Many

Many-to-One

-       많은 user-level threadsingle kernel threadmapping된다.

-       하나의 thread blocking이 모든 threadblocking을 초래한다.

-       복수의 threadmulticore system에서 parallel하게 작동되지 않는데, 그 이유는 반드시 한번에 하나의 thread만이 kernel에 존재하기 때문이다.

-       Solaris Green Threads, GNU Portable Threads에서 사용된다.

One-to-One

-       각각의 user-level threadkernel thread에 매칭된다.

-       Kernel thread를 만드는 user-level thread를 만든다.

-       Many-to-one보다 훨씬 더 concurrency하다.

-       process마다 thread의 숫자가 overhead를 촉진할 수 있다.

-       Windows, Linux, Solaris 9 and later

Many-to-Many

-       Many user level threadmany kernel thread에 매칭시킨다.

-       Kernel thread의 유효한 숫자만큼 만드는 것을 OS에 허락한다.

Two-level Model

-       Many-to-Many Model을 일반적으로 따르나, user-thread에서 kernel-thread로 바로 건너뛰는 경우가 있는 Model


Implicit Threading

-       Threads의 개수가 늘어나는 것이 인기가 높아질수록, explicit thread와 함께 program correctness 보다 더 어려워졌다.

-       Programmer가 아닌 compilerrun-time libraries를 이용하여 수행되는 thread의 생성과 관리

-       Thread Pool, OpenMP, Grand Central Dispatch

Thread Pools
-       working하길 기다리는 thread를 모아두는 pool에다가 thread를 생성한다.

-       이는 새로운 thread를 만드는 것보다 이미 있는 thread를 요청해 서비스하므로 보통 보다 더 빠르다

-       Applicationthread 숫자를 poolsizebound시킨다.

-       Task를 만드는 mechanic으로부터 수행되는 task를 나누어 running task가 서로 다른 전략을 세울 수 있도록 한다. (Taskperiodically run하게 schedule될 수 있다.)

OpenMP
#pragma omp parallel => 모든 corethread를 전달, core가 일을 빨리 처리해버리면 다음 for loop(instruction)을 해당 core가 바로 처리 => Synchronization에 의해 그 core만 계속적으로 thread working이 진행됨


Grand Central Dispatch

Threading Issues
-       Semantics of fork() and exec() system calls: fork() - Some UNIXes have two versions of fork, exec() – usually works as normal

-       Signal handling

n  Synchronous and asynchronous

n  Signal은 보통 UNIX system에서 특정한 event가 일어날 process를 가리킨다.

n  Signal handler signalprocess하는 데에 쓰인다.
u  Signal은 특정 event에 의해 생성된다.
u  Process signal이 전달된다.
u  Signal은 두 개의 signal handler 중 하나에 의해 조작된다.
l Default
l User-defined

n  모든 signalsignal을 조작할 때 kernel을 작동시키는 default handler를 가지고 있다.
u  User-defined signal handler default(기본값)을 무시할 수 있다.

n  Multi-threaded을 위해 signal이 어디로 운송되어야 하는가?
u  Signal 적용이 되는 threadsignal을 운송해야 한다.
u  Process의 모든 threadsignal을 운송해야 한다.
u  process에서 확실한 thread만 운송해야 한다.
u  Process을 위해 모든 signal을 받는 특정한 threadassign해야 한다.

-       Thread cancellation of target thread: thread가 종결되기 전에 강제적으로 종료하는 것. 강제적으로 종료되어야 할 threadtarget thread라고 함.

n  Asynchronous or deferred
u Asynchronous cancellation: target thread를 즉시 종결시킨다.
u Deferred cancellation: 만약 그것을 periodically하게 종결시킬 수 있으면 target thread가 종결되도록 한다.
u Thread cancellation을 호출하는 것은 cancellation을 요구하지만, 실제적인 cancellationthread의 상태에 달려있다.

u  기본값은 deferred cancellation으로 오직 threadcancellation point에 도달했을 때만 cancellation이 일어난다.

-       Thread-local storage: Thread-local storage(TLS)는 각각의 thread에 그것의 data 복사본을 갖도록 한다. 이는 만약 사용자가 thread creation process 생성 권한이 없을 경우 유용하다.
n  이는 thread 생성시 나오는 stack 영역이 아니라 직접 만들 수 있는 arealocal variable과는 다르다.
n  Static data와 매우 유사하다. (TLS는 각각 Threadunique하다)

-       Scheduler Activations
n  M:MTwo-level model 둘 다 application에 할당된 kernel thread의 갯수를 유지하기 위해 communication을 필요로 한다.
n  대표적으로 userkernel thread 사이의 중간체 data structurelightweight process(LWP)를 사용한다.
u Process가 작동하려는 user threadschedule할 때에 가상의 processor로 나타난다.
u 각각의 LWPkernel thread에 부착된다.
n  Scheduler의 활성화는 upcall을 제공한다. – upcall: kernel로부터 thread libraryupcall handler까지 향하는 communication mechanism

4.2 User-level threadkernel-level thread에서의 두 가지 차이점과, 다른 것들 보다 나은 점은 무엇인가?

1) User-levelthreadkernel에서 알지 못한다. kernel에서 user-levelprocess만 알아보기 때문이다. kernel-levelthread의 존재는 kernel이 알고 있다.

2) M:1 이나 M:N mapping을 사용하여, user-level threadthread library에 의해 schedule된다. 이렇게 매칭된 일종의 한 segment(kernel이 읽을 땐 process.)process처럼 운영이 되기 때문에 그 내부 segmentthread들 사이에는 context-switching이 존재하지 않는다.

3) 모든 user-threadprocess에 소속되어 있는 반면, kernel-thread는 그럴 필요가 없다. 그렇기 때문에 kernel threaduser thread보다 유지하는 데 보다 더 값비싸다. Kernel-threadprocess에 소속되어 있지 않기 때문에 multi-processor system에서 보다 더 유리한 면이 있지만, thread-switching에서 overhead가 발생한다.

4.3 kernel-level thread 사이에서 벌어지는 kernel context-switch가 발생했을 때 어떻게 작동하는 지 설명하시오
User-level threadkernel context-switch가 발생하지 않는다.
먼저 kernel에서는 process 단위로 읽기 때문에 user-level thread의 존재를 알지 못하고 그 전체인 process 단위로 보게 된다. 그렇기 때문에 각기 다른 thread끼리 context-switch할 필요 없이 전체 processing을 하는 것이다. 이러한 threaduser-level에서 스케쥴링하기 때문에 parallism하지 않고 concurrent하다 (multi-processor에서 효율적이지 않음(프로세스 단위로만 배당이 됨))

반면에 kernel context-switch 같은 경우에는 threadprocess취급하여 parallism하게 돌릴 수 있다는 장점이 있다. 하지만, kernel에서 kernel로 넘어갈 때, 쓰케쥴 스케줄러를 다시 불러오거나, system call같은 overhead가 있기 때문에 연산이 길어지면 전체 프로세스의 응답성이 확 떨어진다.

그렇기 때문에 kernel thread에서의 context switchCPUregisterthread로부터 값을 저장하고, 새로운 threadCPU register의 값을 다시 저장하는 과정이 필요하다.

4.4 Thread가 생성될 때 어떠한 자원이 소모되는가? 또한 process가 만들어질 때와는 어떠한 차이점이 있는가?

쓰레드가 process보다 보다 더 작은 단위이기 때문에, process 생성보다 더 적은 자원을 사용한다. Process를 만드는 것은 보다 더 큰 data structurePCB를 할당해야 한다. PCBmemory map, open filelist, 환경 변수들을 포함하고 있다. Memory map을 할당하고 관리하는 것이 가장 시간 소요가 가장 크다. Thread를 만드는 것은 register set, stack, priority와 같은 작은 data structure 생성만을 요구한다.



댓글

댓글 쓰기

가장 많이 본 글