운영체제 Threads

김영민·2022년 4월 9일
0

1. What is thread?

  • 가장 작은 execution 단위
  • registers과 stack을 각각 분리하여 가지고 있음
  • code, data, files를 thread끼리 공유

2. Thread의 장점

  • 높은 병렬성에 좋은 퍼포먼스
    • thread : light-weight process
    • 프로세스를 만드는 것보다 쓰레드를 만드는 것이 적은 overhead
      • process: fork() and exec() -> time consuming
      • thread : pthread_create() -> library 함수여서 메모리 추가 X
  • resource 사용에 있어서 효율적임
    • 만약 같은 task를 parallel로 실행할 때, 프로세스를 만드는 것은 비효율적
    • pipe와 같은 IPC가 필요없음으로 데이터를 공유하는 것이 쉽다.
  • 장점

1) 응답성(Responsiveness )

멀티 쓰레드 프로그램에서는, 하나의 쓰레드가 block되거나 시간이 걸리는 작업을 하더라도, 다른 쓰레드들은 실행되고 있기 때문에 사용자 입장에서는 그 프로그램이 interactive하다고 볼 수 있다.

2) 자원 공유(Resource sharing)

쓰레드들 간에는 프로세스의 메모리 및 다른 자원들을 공유한다.

3) 경제성(Economy)

fork() 시스템 콜을 사용하는 등 여러 개의 프로세스를 생성하여 사용하는 것 보다, 여러 개의 쓰레드를 생성하여 사용하는 것이 비용이 적게 소모된다.

4) 확장성(Scalability)

여러 개의 쓰레드가 각각 다른 프로세서에서 동시에 실행이 가능하다. (parallelism)

3. Multicore Programming

  • Multicore processor
    • 다중의 CPU가 같은 칩 안에 있음.
    • 성능 개선에는 한계가 있음
  • thread
    • 각각의 코어가 하나의 스레드를 사용하면서 병렬성 증가
    • 싱글코어 : 다중의 쓰레드가 서로 공유함

4. concurrency vs. parallelism

  • parallelsim (병렬성, 말 그대로 동시에)

  • concurrency (동시성) : 조금씩 진행하면서 program이 번갈아 진행되는 것.

  • Hyperthreading
    : instruction 사이의 비는 시간도 CPU가 활용할 수 있게 하여 가상의 CPU가 하나 더 있는 것처럼 보이게 함.

5. Multicore의 과제

  • identifying task
    : 어떤 프로그램이 독립적이고, 병렬로 돌릴 수 있는가 ?
  • Balance
    : 균등한 기여도를 가지고 일처리를 하는가?
  • Data splitting
    : 데이터의 imbalance (예를 들어 매트릭스에서 NxN에 0이 많고 적은 것들 )
  • Data dependency
    : task가 접근하는 데이터가 여러 task 사이에 종속성이 없는가?
  • Testing and debugging
    : 멀티쓰레드로 돌리면 다양한 실행경로가 있기 때문에 테스트하고 디버깅하기 어렵다.
    : 두 개 이상의 쓰레드가 하나의 리소스에 접근하려고 하는 race condition 문제가 있다.

6. 병렬의 종류

  • Data 병렬
    : 데이터를 나눔
  • Task 병렬
    : 일을 나눔
    : 예 ) core1은 평균만 구하고, core2는 덧셈만 하기.

7. Multithreading Models

  • User level thread
    : 커널은 쓰레드의 존재를 알지 못한다.
    : Thread library가 쓰레드에 관한 매니징을 모두 담당.
    : 커널이 관여하지 않기 때문에, 스위칭이 적게 일어나 가볍게 쓰레딩 가능
    : 하나의 쓰레드만 작동을 멈춰도 그 프로세스 자체가 block,멀티 프로세서를 활용하지 못함
    : run-time system = 작은 커널의 역할
    : 하나의 커널 쓰레드(프로세스)가 여러 개의 유저 레벨 쓰레드를 관리 => many to one 모델

  • Kernel level thread
    : 커널이 모든 프로세스와 모든 쓰레드를 관리하는 방식
    : 커널에 의해 독자적으로 스케줄링됨.
    : 여러 개의 커널 쓰레드가 각각 한 개의 쓰레드를 관리, 여러 개의 커널 쓰레드가 여러개의 쓰레드 관리
    : one to one , many to many 모델

8. User thread VS. Kernel Thread

9. Multithreading Models

10. Thread Library

  • 프로그래머에게 Thread를 생성하고 관리하기 위한 API를 제공하는 것

  • thread Library를 구현하는 법

    • In user space
      • kernel 도움 X
        • 모든 코드와 데이터 구조는 user space에 있다.
        • API 호출 시 system call이 생성되지 않음
    • Using kernel-level library
      • 모든 코드와 데이터 구조는 kernel space에 있다.
        • 라이브러리 API를 호출하는 것은 system call을 하는 것과 같아진다.

11. Existing Thread libraries

  • posix pthread : 사용자 또는 커널 수준 라이브러리
  • windows thread API : 커널 수준 라이브러리
  • Java thread API : Java 프로그램에서 직접 스레드 생성과 관리 가능

12. Thread pool

  • Thread pool X : 새 요청이 들어옴 -> 새 thread를 만들고, 요청을 handling -> 끝나면 thread destroy
    문제점 : 쓰레드 만들고 제거하는 데의 overhead, 쓰레드 생성이 무한하다.

  • Thread pool O : 처음에 스레드를 미리 만들어놓음 -> 새 요청 들어옴 -> thread pool에서 가능한 thread를 고름 -> 끝나면 다시 Thread pool로 돌려놓음.

13. Threading Issues

  • fork()
      1. 모든 스레드를 복사하는 것
      1. fork() system call을 한 스레드만 복사하는 것
  • exec() : fork() 이후 바로 exec()가 호출되면 모든 프로그램이 대체될 것이므로, 모든 스레드를 복제해서 만들어 주는 것은 불필요
  • signal handling
    • default signal handler : 시그널마다 기본적 처리방법 정의
    • user defined siganl handler : 사용자가 처리 방법 정의
  • Signal의 두 가지 유형
    • Synchronous signal: 어떤 사건을 처리하기 위해 발생 ex)불법적인 메모리 접근, 0으로 나누기
    • Asynchronous signal: 임의 시점에 발생. ex) interrupt(ctrl-C키), timer 만료
  • Multithread에서 signal 처리 방법
    • signal을 발생시킨 thread가 처리
    • 모든 쓰레드에게 broadcasting해주고, 그 중 적절한 쓰레드가 처리
    • 미리 쓰레드를 정해놓고 전담하여 signal 처리

14. Thread Issues

  • Thread Cancellation : 쓰레드를 종료시키고 싶을 때
    • Asynchronous cancellation : 바로 죽임 , 죽는 쓰레드가 Resource를 가지고 있었다면 문제가 생길 수도 있음.
    • deferred cancellation : cancellation point라는 곳에서만 죽임.
  • Thread cancellation의 과제
    • 공유된 데이터를 업데이트하는 중간에 종료
    • 죽은 쓰레드가 resource를 가지고 있을 때
  • Pthread는 default가 defeered cancellation이다. ( Pthread_testcancel() )

0개의 댓글