본문 바로가기

Computer Science/운영체제

[운영체제] CH3. Process(2)

Thread

A thread(or lightweight process) is a basic unit of CPU utilization

쓰레드는 프로세스 내부에 있는 CPU 수행 단위이다.

각각의 쓰레드는

  • Program Counter
  • register set
  • stack space

로 이루어져 있다.

쓰레드가 동료 쓰레드와 공유하는 부분(=task)

  • code section
  • data section
  • OS resources

같은 일을 하는 여러 개의 프로세스를 띄어놓으면 프로세스마다 각자의 주소 공간이 만들어져 메모리 낭비가 된다. 이런 경우에 주소 공간을 하나만 띄어놓고 각자 다른 부분의 코드를 실행할 수 있게 하는것이 쓰레드의 개념이다.

 프로그램의 실행 위치를 가리키는 Program Counter를 여러 개를 두어, 프로그램 하나에 CPU 수행 단위만 여러 개를 두고 있는 것을 쓰레드라고 부른다.

 프로세스 하나 안에 여러 개의 쓰레드가 있기 때문에 메모리 주소 공간과 프로세스 상태, 프로세스가 사용하는 자원들을 공유하고, CPU 수행에 관련된 정보(PC, registers 등)들만 쓰레드 각자가 갖고 있다.

 

전통적인 개념의 heavyweight process는 하나의 쓰레드를 가지고 있는 task로 볼 수 있다.

 

 

쓰레드의 장점

 

Responsiveness - 응답성

빠른 응답성을 가진다. 다중 쓰레드로 구성된 태스크 구조에서는 하나의 서버 쓰레드가 blocked (waiting) 상태인 동안에도 동일한 태스크 내의 다른 쓰레드가 실행 (running)되어 빠른 처리를 할 수 있다.

e.g) multi-threaded web - 한 쓰레드가 blocked되어도(e.g 네트워크), 다른 쓰레드가 동작한다.(e.g 디스플레이 출력)

 

Resource Sharing - 자원 공유

똑같은 일을 하는 프로그램을 별도의 프로세스들로 사용하지 않고, 하나의 프로세스만 만들고, 그 안에 CPU 수행 단위만 여러 개를 만들어 code, data, 프로세스의 resources를 공유함으로써 자원을 효율적으로 사용할 수 있다.

 

Economy - 경제성

응답성과 조금 다른 개념이다. 프로세스를 하나 만드는 것 자체가 오버헤드가 상당한 것에 비해, 쓰레드를 하나 생성하는 것은 오버헤드가 그리 크지 않다(creating).

context switching또한 오버헤드가 크다. 이에 반해 프로세스 내부에서 쓰레드간에 CPU switching은 매우 간단하다.

e.g) Solaris OS의 경우, 위 두 가지 overhead가 각각 30배, 5배 차이난다.

 

Utilization of Multi Processor Architectures

여러 개의 CPU가 있는 환경에서 쓰레드를 두었을 때 얻을 수 있는 장점이다.

각각의 쓰레드가 서로 다른 CPU(Processor)에서 병렬적으로 일을 할 수 있어 효율적으로 실행이 가능하다.

e.g) 굉장히 큰 행렬을 곱하는 경우 등..

Utilization of Multi Processor Architectures

여러 개의 CPU가 있는 환경에서 쓰레드를 두었을 때 얻을 수 있는 장점이다.

각각의 쓰레드가 서로 다른 CPU(Processor)에서 병렬적으로 일을 할 수 있어 효율적으로 실행이 가능하다.

e.g) 굉장히 큰 행렬을 곱하는 경우 등..

 

 

쓰레드의 구현

어떤 쓰레드는 커널의 지원을 받고, 어떤 쓰레드는 library의 지원을 받는다. 각각의 쓰레드를 Kernel Threads, User Threads라고 부른다. 여러 운영체제, 시스템들이 나오면서 이 둘의 구분은 희미해졌다.

 

Kernel Thread는 쓰레드가 여러 개가 있다는 사실을 운영체제, 즉 커널이 알고 있다. 하나의 쓰레드에 대해서 다른 쓰레드로 CPU가 넘어가는 것도 커널이 CPU 스케줄링하듯이 넘겨준다.

 

User Thread는 운영체제는 쓰레드가 여러 개가 있다는 사실을 모른다. 유저 프로그램이 라이브러리의 지원을 받아서 스스로 여러 개의 쓰레드를 관리한다. 그렇기 때문에 구현 상의 제약점들이 있을 수 있다.

 

 

 

 

본 포스팅은 이화여대 반효경 교수님의 강의와 경북대 탁병철 교수님의 강의를 토대로 작성한 글입니다.