Operating System

[Operating System] Thread

Ocean_ 2023. 1. 1. 11:30

프로세스

  • 자원 소유의 단위
    • 메인메모리, IO장치, 파일시스템
  • 스케줄링의 단위
    • 문맥교환은 프로세스 사이에 발생하며 다음 실행될 프로세스를 선택
    • Thread 라고 정의

멀티 쓰레드

  • OS가 하나의 프로세스 내에서 여러 쓰레드를 지원하는 것.
  • 여러 process가 동시에 실행될 수 있으면서, 각 process 내에 여러 thread가 함께 존재하는 것이다.
  • 멀티쓰레딩 환경에서 프로세스는 보호의 단위, 자원할당의 단위로도 정의된다.
  • 스케줄링의 단위는 프로세스가 아닌 쓰레드가한다.
    • 각쓰레드는 문맥교환 수행을 위해 독립된 Program counter를 보유한다.
    • 독립된 stack을 보유한다. 하지만 heap, data,text같은 메모리영역은 프로세스내 다른 쓰레드 와 공유한다.
    • process에게 할당된 stack memory 영역을 여러 thread들이 나누어 사용하고, 나머지 memory 영역은 process 단위로 공유하는 것이다. 따라서 기본적으로 memory 등의 모든 자원은 process 내의 모든 thread들이 공유한다고 볼 수 있다.

이점 : 성능 향상에 큰 도움이 된다. 쓰레드 만드는게 비용이 더 적다.

프로세스/쓰레드

유사점 - 문맥교환 단위. Program Counter 보유.

차이점 - 프로세스는 pcb가 관리, 쓰레드는 tcb가 관리.

  - 프로세스는 다른 프로세스의 자원에 접근할 수 없지만, 쓰레드는 다른 쓰레드의 자원에 접근가능하다.

    - 프로세스단위의 문맥교환 후에는 메모리 주소공간이 달라지지만 쓰레드 단위의 문맥교환 후에는 메모리 주소공간의 변화가 없다.

쓰레드의 상태

  • 쓰레드 상태는
    • 생성 - 새로운 프로세스가 생성되면 이 프로세스를 위한 쓰레드도 함께 생성
    • 블록 - 쓰레드가 어떤 사건을 기다리는 상태. 자신의 사용자 레지스터,프로그램 카운터, 스택포인터 저장
    • 비블록 - 쓰레드를 블록시킨 사건이 발생했을때 그 쓰레든느 준비큐로 이동
    • 종료

사용자 수준 쓰레드 / 커널 수준 쓰레드

  • ULT는 각 thread가 모두 사용자 주소 공간에 위치하기 때문에 dispatch를 할 때에 kernel mode로 변경될 필요 없이 user mode에서 모두 수행 가능하다.
  • KLT는 dispatch를 할 때마다 kernel mode로 변경되어야만 한다
  • ULT는 운영 체제에 종속적이지 않고 어떠한 kernel의 변경 없이도 원활히 수행될 수 있는 반면, KLT는 운영 체제에 따라 존재하지 않을 수도 있다는 차이점
  • KLT는 어떤 응용이라도 다중쓸레드로 프로그래밍되며, 단일 프로세스내에서 지원된다. 커널에 의한 스케줄링은 쓰레드를 기반으로 이뤄진다.

사용자 수준 쓰레드 / 커널 수준 쓰레드 장단점

ULT 장점

  • 커널모드의 특권이 요구되지 않는다.
  • 쓰레드 관리를 위해 커널모드로 전환되지 않는다.
  • 커널의 변경불필요하고 어떠한 운영체제에서도 적용 가능하다.

ULT 단점

  • 일반 OS에서 대부분의 시스템콜은 해당쓰레드 블록시킨다.
  • 다중처리의 장점을 살릴 수 없다.
  • , ULT의 경우에는 하나의 thread에서 system call을 호출할 경우 같은 process 내의 모든 thread들이 함께 block이 된다는 치명적인 단점. KLT의 경우에는 한 thread가 block된다고 하더라도 다른 thread들은 자유롭다.

KLT 장점

  • 커널은 여러 처리기에서 같은 프로세스 내의 여러 쓰레드를 동시에 스케줄 가능
  • 커널 루틴 자체가 다중 쓰레드로 구성 ㄱ나ㅡㅇ

KLT 단점

  • 같은 프로세스 내의 한 쓰레드에서 다른 쓰레드로 제어를 넘길때 커널로의 모드 전환이 필요

ULT와 KLT 결합 방법

  • Solaris
    • 쓰레드 생성은 완전히 사용자 공간에서
    • 한 응용쓰레드들이 다수처리기에서 병렬로 수행될 수 있고 전체프로세스를 블록시키지 않는다.