멀티 스레드 환경

sun202x·2023년 1월 19일
0

운영체제

목록 보기
14/23
post-thumbnail

해당 게시글은 kocw에서 제공하는 금오공과대학교 최태영 교수님의 무료 강의를 공부하고 정리하기 위해서 만들어졌습니다.

Concurrency vs Parallelism

  • 동시성(Concurrency)를 제공하기 위해 멀티 프로그래밍 환경이 나오게 됐다.
  • 반면에 병렬성(Parallelism)을 제공하기 위해 멀티 코어 프로그래밍 환경이 나오게 되었다.

Single and Multithreaded Processes

  • 하나의 프로세스 안에 여러 스레드를 사용하는 것이 멀티 프로세스보다 공간 효율이 더 좋다.
    • 멀티 스레드 환경은 코드, 데이터, 파일이 공유되고
    • 각 스레드 마다 register(PC 등 - context), stack과 실행 공간만 제공해주면 되기 때문이다.
  • 이러한 멀티 코어 환경으로 발전하게 된 이유는,
    • 컴퓨터는 집적도가 높아야만 성능이 좋아진다.
    • 그러나 집적도가 높아지면 높아질수록 발열도 같이 심해진다는 문제가 발생한다.
    • 그렇게 하여 집적도를 높여 멀티 프로그래밍을 수행하게 한다 해도 반드시 속도가 빨라지지는 않는다.
    • Amdahl’s Law에 따라 아무리 병렬을 진행한다 해도 성능이 그만큼 늘어나지 않기 때문이다.
  • 라이브러리에서 제공해주는 스레드의 성질에는 두 가지가 있다.
    • User thread
      • 모든 것이 유저 모드에서 수행된다.
      • 두 개 이상의 스레드를 마치 하나의 스레드가 동작하는 것처럼 해주는 것이 유저 스레드이다.
      • POSIX Pthreads
      • Windows threads
      • Java threads
    • Kernel thread
      • 커널에서 생성하는 스레드, 커널 모드에서 수행된다.
      • 커널에서 스레드를 생성하면, 프로세스처럼 PCB를 만든다.
      • 커널에서 스케줄링을 하게 된다.
      • 멀티코어 환경에서의 운영체제는 모두 이 기능을 제공하고 있다.

Multithreading Models

  • 두 개의 스레드 성질은 PCB가 스레드 마다 생성 되느냐 되지 않느냐로 구분할 수 있다.
  • 이 특징에 따라 크게 세 가지 멀티 스레드 모델로 나눠진다.
    1. Many-to-One
    • 유저스레드-to-커널스레드
    • 먼저 나오는게 유저 스레드 개수이고 나중에 나오는게 커널 스레드 개수이다.
    • 여러 개의 유저 스레드가 하나의 커널 스레드에 묶인 구조
    • 이 경우 스레드 간의 컨텍스트 스위칭 비용이 굉장히 적다.
    • 커널을 부르지 않고 함수 호출 만으로 해결하기 때문이다.
    • 그러나 문제가 하나 있는데,
    • 유저 스레드 하나가 read를 호출하면 커널은 read를 위한 디바이스 큐에 PCB를 넣게 된다.
    • 그렇게 되면 나머지 유저 스레드들은 read를 하지 않았다고 해도, 같이 PCB에 딸려 들어가서 블락이 되버린다.
    • 해당 모델을 제공해 주는 데는 잘 없지만
      • Solaris Green Threads
      • GNU Portable Threads
      • 정도가 있다.
    1. One-to-One
    • 컨텍스트 스위칭 오버헤드가 많은 대신 한 스레드가 쉬더라도 다른 스레드는 cpu를 얻을 기회가 있다.
      • PCB가 각각 생성되기 때문이다.
    • 대부분의 운영체제가 제공해준다.
    1. Many-to-Many
    • Solaris 에서 제공해주고 있다.
    • 컨텍스트 스위칭 오버헤드를 줄일 수 있다는 점과 스레드의 블락 없이 동작할 수 있다는 장점이 있다.
    • 여러 개의 유저 스레드를 여러 개의 커널 스레드로 묶고,
    • 컨텍스트 스위칭을 유저 스레드간에 하면서 동시에 같은 커널 스레드에 묶는 형식으로 사용한다.
    • 그렇게 여러 커널 스레드를 두었기 때문에 한 스레드가 블락 되더라도 연결된 커널 스레드가 다른 스레드들은 블락되지 않는다.
    • 굉장히 복잡한 구조라서 문제가 많이 발생한다.
    • 이 것을 극복하기 위해 나온게
    • Two-level Model이다.
      • MtoM 모델은 커널 스레드가 자유롭게 유저 스레드와 매핑이 가능한데,
      • 해당 모델은 한번 매핑되면 중간에 바뀔 수 없다는 특징이 있다.
  • 요즘은 cpu 성능이 매우 좋아졌기 때문 컨텍스트 스위칭 비용을 크게 신경쓰지 않게 되었다.
    • 그렇기 때문에 One-to-One 모델이 많이 쓰인다.
  • 위 모델들을 사용할 수 있게 운영체제에서는 이러한 기능들을 라이브러리로 제공해준다.
  • 기본적으로 제공해주지 않으면 써드파티 라이브러리를 쓰기도 한다.
  • 대부분 기준인 Pthreads를 사용하고 있다.
    • 리눅스도 이제는 대부분 Pthreads만 사용하고 있다고 한다.

Implicit Threading

  • 지금까지는 프로그래머가 관리하는 스레드 위주로 알아보았는데, 프로그래머가 몰라도 알아서 스레드가 동작하도록 하는 것이 Implicit Thread이다.
  • Thread pools 같은 기능들

Thread pools

  • 스레드를 수행하기 위해 공간을 만들고 미리 스레드를 만들어 두어, 요청이 들어올 때 스레드 풀 안에서 스레드를 하나 골라서 처리하는 방식을 의미한다.
    • 이렇게 처리된 스레드는 busy 상태로 변경되고,
    • 모든 스레드가 busy 상태인 경우 스레드 풀은 블락된다.
  • 이렇게 스레드의 수를 정해 둠으로써 한꺼번에 처리되는 스레드의 수를 제한하므로 과부하를 방지하고 메모리를 효율적으로 사용할 수 있다.
profile
긍정적으로 살고 싶은 개발자

0개의 댓글