ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 4 (Thread and Concurrency)
    운영체제(OS) 2022. 10. 19. 22:34
    728x90

    What is Thread ?

    thread는 process의 작업 흐름을 말합니다.

    하나의 process가 하나의 작업만 하는 것을 single thread 라고 하며, 

    하나의 process가 동시에 여러 작업을 수행하는 것은 multi thread라고 합니다.

    각 개인의 thread는 최소 자신만의 register를 갖고, stack을 소유할 수 있습니다.

    multi thread는 한 process의 code, address space 그리고 여러 resource들을 공유합니다.

     

    그냥 단순히 process를 여러개 돌리면 되는데 우리는 보통 multi thread 방식을 선호합니다.

    process 끼리 통신하는 IPC 방식은 많은 overhead와 성능을 저하 시킵니다. 

    비록 thread 전환에도 context switch 가 일어나지만 크게 신경을 쓰지 않아도 됩니다.

    single thread와 multi thread

    이러한 thread를 통해

    1. Concurrency(동시성)와 Parallelism(병렬성)을 달성

    (동시성이란 single processor 에서 사용되는 방식으로 processor가 여러개의 thread를 번갈아가며

    수행함으로써 동시에 실행되는 것처럼 보이게 하는 방식입니다.)

    (병렬성은 multicore 시스템에서 여러개의 core가 각 thread를 동시에 동시에 수행하는 방식입니다.)

    2. I/O 와 computation을 포함해 처리량

    3. MP 구조의 유용성

    4. 응답성

    5. 자원 공유

    6. 경제

    모두를 이룰 수 있게 되었습니다.

     

    User-Level vs Kernel-Level Thread

    user level thread는 사용자 수준의 thread library가 관리하는 thread입니다.

    안정성은 떨어지지만 성능이 좋습니다.

     

    kernel level thread는 kernel이 지원하는 thread 입니다. 

    이 때, 이러한 kernel을 multithread kernel 이라고 부릅니다.

    안정적이지만 mapping이 계속 일어나므로 성능이 저하됩니다.

     

    Multithreading Models (Mapping Model)

    user thread와 kernel thread의 관계를 설계하는 여러가지 방법이 있습니다.

    하나의 kernel thread에 여러개의 user thread를 연결한 모델입니다.

    user thread는 user space에서 thread library에 의해 관리됩니다.

    user thread가 system call을 차단할 경우 매핑된 kernel thread가 blocking 됩니다.

    multi core 또는 multi process 에서 parallelism을 할 수 없습니다.

    concurrency는 가능합니다.

    요즘에 잘 사용되지 않습니다.

    하나의 user thread에 하나의 kernel thread가 일대일 대응하는 모델입니다.

    concurrency를 높여주고, multiprocessor 시스템에서는 동시에 여러 thread를 수행할 수 있도록

    해줍니다.

    user thread를 늘리면 kernel thread도 같이 늘어나는데 kernel thread를 늘리는 것은 

    overhead가 많이 발생하므로 성능저하가 발생할 수 도 있습니다.

    ex) window, linux 등등

     

    many-to-many 모델은 여러 user thread에 작거나 같은 수의 kernel thread가 대응하는 모델입니다.

    OS는 충분한 수의 kernel thread를 만들 수 있고, kernel thread의 구체적인 개수는 프로그램이나

    작동 기기에 따라 다릅니다.

    concurrency와 parrallelism 모두 수행 가능합니다.

     

    two-level-model은 many-to-many와 비슷합니다.

    특정 user thread를 위한 kernel thread를 따로 제공하는 모델을 말합니다.

    많이 사용하고 점유하고 있는 user thread를 더 빠르게 처리해줄 수 있습니다.

     

    Process and Threaded Models

     

    Threading Issues

    1. fork() 및 exec() system call

    multi thread 프로그램에서 fork를 하게 되면 자식 process는 부모 process의 모든 thread를

    복제해야 할 수 도 있습니다.

    또한 평소처럼 그냥 1개의 thread를 갖는 process로 복제할 수 도 있습니다.

    현재 UNIX 내에서는 2가지 version 모두 지원합니다.

     

    2. Signal

    signal은 UNIX 에서 process에게 어떤 사건이 일어났음을 알려주기 위해 사용됩니다.

    signal은 일어난 event의 종류에 따라 Synchronous(동기식) 또는 Asychronous(비동기식) 으로

    전달 될 수 있습니다.

     

    Synchronous signal은 현재 내가 수행하고 있는 process 내에서 발생한 signal 입니다.

    (불법적인 메모리 접근, 0으로 나누기 등등)

    Asynchronous signal은 현재 process 외부에서 일어난 event에 의해 생성됩니다.

    (ctrl + c를 눌러 터미널을 종료)

     

    Signal handling이 single thread에서 일어날 경우

    signal은 특정한 event에 생성되고 signal은 process에 전달 됩니다.

    이어서 signal은 처리되는데

    이때, default signal handler 또는 user-defined signal handler에 의해

    처리됩니다.

     

    Signal handling이 multi thread에서 일어날 경우

    동기적 신호는 해당 신호를 발생시킨 thread에게 전달되어야 하고, 다른 thread에게는 전달되면 안됩니다.

    비동기적 신호는 누가 신호를 발생시켰는지 불명확하므로, 모든 thread에게 signal이 전달됩니다. 

     

    3. Thread Cancellation

    thread cancellation이란 thread가 끝나기 전에 그것을 강제 종료시키는 작업을 말합니다.

    예를 들어 여러 thread들이 작업을 하다 어떤 thread가 일을 다 마치면 나머지 thread들이

    종료되어야 합니다. 이렇게 종료되어야 할 thread들을 target thread라고 부릅니다.

    thread cancellation은 두가지 방식이 있습니다.

    Asynchronous cancellaiton

    한 thread가 즉시 target thread를 강제 종료 시킵니다.

    Deferred cancellation

    target thread가 주기적으로 자신이 강제 종료되어야 할지 점검합니다.

     

    4. Thread Pools

    웹서버에서 client의 요청을 받을 때 마다 thread를 생성하는데 이게 너무 많아지면

    문제가 됩니다. 

    이를 방지하기 위해 thread pool을 생성합니다.

    기본 개념은 process를 시작할 때 미리 일정한 수의 thread를 미리 pool로 만들어 놓는 것입니다.

    pool에 만들어진 thread는 해야할 작업이 없을 경우 계속 기다립니다. 

    그러다 일이 생기면 한 thread에 request를 할당 합니다.

    만약 pool에 남아있는 thread가 없으면 서버는 free thread가 생길 때 까지 기다려야 합니다.

     

    장점

    1. 미리 만들어둔 thread를 사용하는 것이 새 thread를 만들어 주는 것보다 빠릅니다.

    2. 임의의 시간에 존재할 수 있는 thread의 개수에 제한을 둡니다.

     

    5. Thread Local Storage (TLS)

    한 process에 속한 thread들은 그 process의 data를 모두 공유 합니다.

    하지만 어떤 경우 thread들이 자신만의 데이터 저장소가 필요할 때가 있습니다.

    이러한 data를 thread-local-storage라고 부릅니다.

    tls는 local variable과 혼동하기 쉽습니다.

    local variable이 하나의 함수를 호출되는 동안에만 보이는 반면에 tls는 전체 함수 호출에 보입니다.

    tls는 static data와 비슷한데, 차이점은 tls data는 각 thread의 고유한 정보를 저장합니다.

    '운영체제(OS)' 카테고리의 다른 글

    Chapter 9 (Main Memory)  (0) 2022.11.21
    Chapter 5 (CPU Scheduling)  (0) 2022.10.26
    Chapter 6 - 7 (Synchronization Tools and Examples)  (0) 2022.10.22
    Chapter 3 (Processes)  (0) 2022.10.11
    Chapter 1(Introduction) & 2(System Structures)  (0) 2022.10.10
Designed by Tistory.