스레드 개념과 멀티코어 시스템

sun202x·2023년 1월 19일
0

운영체제

목록 보기
13/23
post-thumbnail

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

Thread

  • 스레드는 하나의 수행단위를 프로세스로 제한하지 않고, 프로세스 안에서 여러 개의 수행단위(흐름)를 만들어서 사용하는 것이다.
  • 요즘 프로그래밍은 스레드 프로그래밍을 하는 것과 같다.
    • 현대의 나온 프로그래밍은 대부분이 다 스레드 프로그래밍이다.
  • 스레드를 사용하므로써 생기는 이점은
    • 작업(역할)을 나눠서 처리하기 때문에, 쉽게 프로그래밍 할 수 있고, 유지보수 하기 쉬워진다.
    • 한 스레드가 다른 스레드에 영향을 주지 않기 때문에 OOP가 가능해 진다.
    • 여러 프로세스를 생성해서 처리하는 것 보다 스레드를 여러개 만드는 것이 시간이 더 적게 소모된다.
      • 스레드 생성 비용이 더 적다.
    • 기능을 교체하려면 스레드를 교체하면 되기 때문에 더 쉬워진다.
    • 현대의 os는 모두 멀티 스레드 환경으로 구성되어 있다.

Multithreaded Server Architecture

  • 보통 웹서버를 쉽게 만들어서 사용가능하다.
  • 웹서버는 하나의 프로그램이다.
  • 요청이 올 때마다 그 요청을 처리할 스레드를 생성한다.
  • 생성된 스레드는 요청을 다 처리하고 자기가 직접 클라이언트에게 결과를 보내준다.
  • 이런 식으로 멀티 스레드 환경으로 구성하면 요청을 처리하기 굉장히 편리해진다.
  • 멀티스레드를 쓰면 생기는 장점은 4가지로 요약할 수 있다.
    • Responsiveness
      • 응답성이 좋아진다.
      • 요청이 오면 즉각적으로 반응할 수 있다.
    • Resource Sharing
      • 스레드 끼리는 자원을 공유한다.
      • 프로세스는 통신 하기 위해 통신 방식을 선택해야 한다.
        • shared memory
        • message passing
      • 스레드는 프로세스 내에 존재하기 때문에, 프로세스 자원(전역변수, 파일 등)을 공유해서 쓸 수 있다.
    • Economy
      • 여러 스레드로 구성하여 하나의 프로세스를 실행하는 것이 훨씬 빨리 실행이 된다.
      • 시간이 절약되고, 메모리를 줄일 수 있다.
      • 스레드간 스위칭은 프로세스 간 스위칭보다 훨씬 간단하고 비용이 적게 든다.
      • 스레드의 컨텍스트가 작기 때문
    • Scalability
      • 멀티 스레드 환경으로 만들면, cpu 코어의 개수가 많을 수록 성능이 올라간다.
      • 멀티 프로세스 환경은 cpu 코어에 관계없이 항상 일정한 속도를 가지기 때문에, 멀티 스레드 환경이 더 유리하다.

Multicore Programming

  • 멀티 코어 프로그래밍을 잘하기 위한 고민
    • Identifying task
      • 작업 분류를 얼마나 잘 해야 하는가
    • Balance
      • 수행 되는 작업의 균형을 어떻게 잘 맞출수 있는지
    • Data splitting
      • 나눠진 작업의 데이터를 어떻게 잘 나눌지
    • Data dependency
      • 처리되는 데이터의 순서를 어떻게 나눌지
    • Testing and debugging
      • 멀티코어에서 테스트와 디버깅을 어떻게 쉽게 제공할지
  • 이러한 고민을 그나마 줄여줄 수 있는 것이 멀티스레드 프로그래밍이다.
  • 프로그래머는 스레드를 되도록 많이 만들고,
  • 이를 어디에 할당하고 어디에 쓸지는 모두 커널에게 맡겨둔다.
  • 그렇게 하면 커널이 적당히 잘 나눠주게 된다.
  • 멀티코어 프로그래밍을 하려면 두가지 개념을 알아야 한다.
    • Parallelism(병렬성)
      • 동시에 무언가가 같이 수행되고 있는 상황을 말한다.
      • 최소 듀얼 코어, 듀얼 cpu 환경이 되어야 Parallelism이 제공된다.
    • Concurrency(동시성)
      • 두 개 이상이 수행이 되는 것이다.
      • 꼭 동시에 수행될 필요는 없다.
  • 병렬성이 더 엄격한 개념이다. 병렬성은 멀티 코어에서만 가능하고 동시성은 싱글 코어에서도 가능하다.
  • 멀티 프로그래밍을 예로 들면,
    • 멀티 프로그래밍은 반드시 동시성을 만족한다.
      • 이미 싱글 코어에서 나온 개념이며, 동시에 프로그래밍이 수행되는 듯한 기능을 제공하는 것이다.
      • 항상 cpu를 사용하는 것은 한 프로세스 밖에 없다.
    • 그러나 멀티 프로그래밍은 병렬성은 보장되지 않는다.
      • 반드시 듀얼 코어 이어야만 병렬성이 제공되기 때문이다.
  • 원래 스레드가 나온 계기도 멀티 코어 환경에서 더 적합하게 동작하기 위해서이다.
    • 멀티 코어를 잘 동작하기 위해 하드웨어가 발전했다.
  • cpu의 각 코어는 하나의 스레드를 실행시킨다.
  • 그러나 현대의 인텔 cpu는 hyperthreading 기능을 제공하여,
    • 코어 하나당 스레드를 두 개이상 실행시킬 수 있다.
    • 엄밀히 따지면 하나의 스레드만 실행할 수 있는데,
    • 내부에서 마치 멀티 프로그래밍처럼 동작하도록 제공해준다.
    • cpu 내에서 t1(스레드)의 일을 처리하기 위해 cache 메모리에 접근하고,
    • cache에 해당 내용이 없으면 메모리에서 꺼내오게 된다.
    • 이 때 bus를 통해 데이터를 주고 받는데, bus는 매우 혼잡하므로 시간이 소요되게 된다.
    • 이 시간이 소요 되는 동안 t2(다른 스레드)를 동작 시키게 된다.
profile
긍정적으로 살고 싶은 개발자

0개의 댓글