전자전기공학/운영체제

[Operating System/운영체제][Thread]

Sim 2024. 10. 8. 17:30
반응형

· 목차
  - Thread의 기본
  - Kernel threads and user-level threads


 
 
 
 
 
 
 
안녕하세요, 이번에는 지난 시간의 Process에 이어서 Thread에 대해서 배워보도록 하겠습니다.
 
 
스레드(Thread)는 운영체제에서 프로세스 내에서 실행되는 작업의 가장 작은 단위입니다.
 
스레드는 프로세스의 자원을 공유하며, 다중 스레드를 통해 하나의 프로세스가 여러 작업을 동시에 처리할 수 있습니다.
스레드는 특히 병렬 처리를 통해 시스템의 성능을 향상시키는데 중요한 역할을 합니다.
 
 
 
 
 
 
 
 

Thread의 기본

 
 
 
 
 
 
위에서 말한 스레드의 특징을 조금 더 자세히 살펴보자면 다음과 같습니다.
 

 
 
 
1. Lightweight Process(경량 프로세스)
 
    스레드는 기본적으로 프로세스의 자원을 공유하여 프로세스보다 가볍고, 프로세스 간의 전환보다 스레드 간 전환이 더 빠릅니다.
    각 스레드는 독립적인 실행 흐름을 가지지만, 메모리나 파일과 같은 자원은 프로세스 내에서 공유합니다.
 
2. 자원 공유
 
    같은 프로세스 내의 스레드는 프로세스의 메모리 공간을 공유합니다. 이로 인해 스레드 간 통신이 빠르고 효율적이지만, 자원을
    공유하는 만큼 동기화 문제가 발생할 수 있어서 주의해야 합니다.
 
3. 독립적인 실행 흐름
 
    스레드는 독립적으로 실행되지만, 같은 프로세스 내에서 실행되므로 서로 영향을 줄 수 있습니다. 이를 관리하지 않으면, 동기화
    문제나 교착상태가 발생할 수 있습니다.

 
 
 
즉, 스레드를 사용하는 가장 큰 장점 중에서 두 가지는 다음과 같습니다.
 
스레드는 프로세스에 비해서 쉽게 생성하고 없앨 수 있으며, 스레드는 address space를 공유한다는 장점입니다.
 
 
 
 
그렇다면 스레드와 프로세스와 차이에서 오는 장단점은 무엇이 있을까요?
 

 
 
1. 프로세스와 스레드의 차이
 
    프로세스는 프로그램의 실행 단위로, 각 프로세스는 독립적인 메모리 공간을 가지고 운영체제로부터 자원을 할당받습니다.
    스레드는 프로세스 내에서 실행되는 순차적인 실행 흐름입니다. 각 스레드는 독립적인 레지스터, 스택, 프로그램 카운터 등을
    가지고 있으며, 스레드 간의 데이터 공유는 같은 프로세스 내에서 이루어집니다. 그리고 스레드 또한 프로세스와 같이
    TCB(thread control block)을 가지고 있습니다.
 
2. 스레드는 프로세스에 종속되어 있다.
 
    스레드는 항상 하나의 프로세스에 종속되어 있습니다. 즉, 한 스레드는 자신이 속한 프로세스의 자원을 사용하고, 프로세스
    내에서 실행됩니다.
    반대로 하나의 프로세스는 여러 스레드를 포함할 수 있습니다. 예를 들어, 멀티스레드 프로그램은 동시에 여러 작업을 처리하기        위해 여러 스레드를 실행할 수 있습니다.
 
3. 스레드 간 데이터 공유의 효율성
 
    스레드 간 데이터 공유가 효율적이라는 것은, 같은 프로세스 내에서 실행되는 모든 스레드는 동일한 주소 공간(address space)
    을 공유하기 때문입니다.
     
4. 스케줄링의 단위로서의 스레드
 
    스레드가 스케줄링의 단위로 사용된다는 것은, CPU가 어느 작업을 실행할지 결정할 때 더 이상 프로세스를 기준으로 하지 않고,
    각 스레드를 기준으로 실행 순서를 결정합니다.
    스레드는 프로세스 내에서 독립적인 실행 흐름을 가지므로, 각 스레드가 스케줄링에 의해 실행 상태, 대기 상태, 또는 차단 상태로
    전환됩니다.
    반면 프로세스는 단순히 스레드를 담고 있는 '컨테이너'처럼 동작합니다. 
 
 

 
 

 
 
 
 
위의 구조는 기존에 Thread Model입니다. 현재는 overwrite문제로 인해서 address space의 구조 등이 바뀌었습니다.
 
 
 
 

 
 
 
왼쪽이 address space인데, 프로세스는 Stack이 구분되어 있지 않고 하나의 Stack입니다.
 
 
스레드가 프로세스의 Address space를 공유하면서도 스택을 각각 별도로 가지는 이유는 스레드들이 병렬로 실행되면서
발생할 수 있는 오버라이팅(overwriting)문제를 방지하기 위함입니다.
 
 
쉽게 예를 들어서, 하나의 스레드가 함수 호출을 하여 스택에 데이터를 쌓는 도중, 다른 스레드가 같은 스택 공간에 접근하여
자신의 데이터를 덮어쓸 수 있기 때문입니다. 또 다른 예로, 스레드가 스택을 수정하는 동안 다른 스레드가 같은 스택을
사용하는 경우, 함수의 리턴 주소나 지역 변수가 잘못 설정될 수 있어 프로그램의 흐름이 비정상적으로 진행될 수 있기 때문입니다.
 
 
결론적으로, 스레드는 Stack은 각자 고유의 Stack을 가지고 있고, heap, static data, code는 공유하게 됩니다.
 
 
 
 
 
 
 
 
 

Kernel threads and user-level threads

 
 
 
 
 
 
스레드는 크게 유저 레벨 스레드(User-Level Thread)커널 레벨 스레드(Kernel Level Thread)로 나눌 수 있습니다.
 
둘의 주요한 차이점이라고 한다면, 누가 생성하고 관리하느냐에 대한 책임이 있는지로 나뉘게 됩니다.
 
 
 
 
 

User-level threads

 
 
 
 
우선 유저 레벨 스레드에 대해서 살펴보자면, 운영체제의 커널이 아닌 사용자 영역의 라이브러리에 의해서 관리되는 스레드입니다.
결국, 운영체제는 프로세스 내에 스레드가 있다는 사실을 모르며, 스레드의 생성, 스케줄링, 관리는 전적으로
사용자 수준의 스레드 라이브러리가 담당하는 것 입니다.
 
 
유저 레벨 스레드의 장단점은 빠른 Context Switching과 블로킹 문제 등이 있습니다.
 

 
1. 빠른 Context Switching
 
    스레드 전환 시 커널 모드로의 전환이 필요없기 때문에 오버헤드가 적습니다. 결론적으로, 스레드 간 전환이 매우 빠르며,
    효율적인 스케줄링이 가능합니다.
 
2. 블로킹 문제
 
    커널은 스레드의 존재를 모르기 때문에, 스레드 관련 시스템 콜이 없습니다. 모든 스레드 작업이 사용자 공간에서 이뤄지기
    때문인데, 한 스레드가 System call이나 I/O작읍로 인해 블로킹되면, 해당 프로세스의 모든 스레드가 블로킹됩니다.
    해당 이유는 커널이 프로세스 단위로 스케줄링을 하기 때문이라고 할 수 있습니다.
 
4. 병렬성 제한
 
    앞에서 말한 것과 같이, 커널이 스레드의 존재를 모르고 있기 때문에 문제가 발생하는 것으로 커널은 프로세스 단위로 CPU 코어
    를 할당하므로, 하나의 프로세스 내의 여러 스레드가 하나의 코어에서 시분할로 실행됩니다.

 
 
 
 
 

Kernel thread(or Kernel-level thread)

 
 
 
 
커널 레벨 스레드는 운영체제의 커널에 의해 직접 관리되는 스레드 입니다. 스레드 생성, 스케줄링, 관리는 운영체제 커널이
담당하며, 커널은각 스레드를 개별적인 실행 단위로 인식합니다.
 
 
그렇다면 커널 레벨 스레드의 장단점에는 무엇이 있을까요? 
 
 

 
1. 장점
 
    - 진정한 병렬성
       멀티코어 환경에서 스레드들이 동시에 실행될 수 있어 성능이 향상됩니다.
 
    - 개별 블로킹 처리
      한 스레드의 블로킹이 프로세스나 다른 스레드에 영향을 주지 않습니다.
 
2. 단점
 
     - 오버헤드 증가
        스레드의 생성, 소멸, 전환 시 커널 모드 전환으로 인한 오버헤드가 발생합니다.
 
     - 복잡성 증가
        커널이 스레드를 관리하므로, 운영체제의 복잡성이 증가합니다.
 
     - 개발자 제어 한계
       스케줄링 알고리즘 등이 커널에 의해 결정되므로, 개발자가 스레드 스케줄링을 세부적으로 제어하기 어렵습니다.

 
 
 

구분유저 레벨 스레드커널 레벨 스레드
관리주체사용자 영역 라이브러리운영체제 커널
Context Switching빠름(커널의 개입이 없음)느림(커널 개입 필요)
블로킹 시 영향한 스레드 블로킹 시 전체 블로킹다른 스레드에 영향 없음
병렬 실행실제 병렬성 제한적멀티코어에서 병렬 실행 가능
스케줄링 제어개발자 구현 가능커널에 의해 제어

 
 
 
 
 

좌: user-level thread, 우: kernel-level thread

 
 
 
그림에 적혀있는 것 처럼 Thread table은 TCB와 비슷한 것으로, CPU상태, execution등 상태를 나타낸 것 입니다.
 
 
 
 

Hybrid Approach(혼합형 접근법)

 
 
 
 
일부 시스템은 유저 레벨 스레드와 커널 레벨 스레드의 장점을 결합하여 사용합니다. 이러한 접근법에서는 스레드 풀링이나
다대다 매핑(Many-to-Many Mapping)을 통해 스레드의 효율성과 병렬성을 모두 추구합니다.
스레드 풀링과 다대다 매핑은 다음에 따로 찾아서 정리해 보도록 하겠습니다.
 
 

 
 
 
 
 
 


 
 
 
 
 
 
지금까지 스레드(thread)에 대해서 배워봤습니다. 다음에는 Synchronization에 대해서 배우며,
프로세스와 스레드에서 발생하는 문제점들과 해결 방안에 대해서 배워보도록 하겠습니다.
 
 
 
감사합니다.
 
 
 

반응형