본문 바로가기

운영체제

스레드(Thread)

728x90
반응형

Goal

  • 스레드가 무엇인지 설명할 수 있다.
  • 메모리 관점에서 프로세스와 스레드를 그리고 차이점을 설명할 수 있다.
  • 멀티 스레드 사용의 장단점에 대해서 설명할 수 있다.
  • 커널 스레드, 유저 스레드에 대한 이해

연관 포스팅 : 프로세스


스레드(Thread)란?

스레드(thread)란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다. (실행 흐름 단위)

 

  • 모든 프로세스에는 한 개(main-thread) 이상의 스레드 가 존재한다.
  • 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 한다. 
  • 스레드는 CPU 스케줄러에 의해 처리되는 작업(task) 단위이다. 즉, 각 스레드마다 CPU를 할당받아 수행해야할 작업을 실행한다.

 

스레드 탄생 배경

프로세스 간 전환시 발생하는 비용 부담이 크다.

그래서 공유되는 리소스는 그대로 두고, 교체가 필요한 리소스만 교체하는 방법(스레드)을 생각하게 됨

=> context switching시 발생하는 overhead가 줄어듦

 

멀티 프로세스 vs 멀티 스레드

멀티프로세스와 멀티스레드는 양쪽 모두 여러 흐름이 동시에 진행된다는 공통점을 가지고 있다.

하지만, 멀티프로세스에서 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지하고 있는 것과 달리

멀티스레드는 프로세스 내의 메모리를 공유해 사용할 수 있다. 또한 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다. (공유 되는 메모리가 있기 때문에 context swiching시 발생하는 overhead 비용이 더 적게든다.)

프로세스 vs 스레드

프로세스(process)

Process

  • 각각의 프로세스는 독립적인 메모리 공간을 할당 받는다. (code, data, stack, heap)
  • 프로세스 최소 1개의 스레드(메인 스레드)를 갖는다.
  • 독립적인 프로세스는 데이터를 주고 받을 때 프로세스간 통신(IPC, Inter Process Communication)을 이용한다.
    • ex) 파이프, 소켓, 공유 메모리, 파일 등

 

스레드(thread)

thread

  • 스레드 개별적인 register set과 stack 영역을 갖고 있고, 다른 메모리 영역(code, data, heap)은 공유한다.
    • 공유되는 영역이 있기 때문에 프로세스보다 context switching시 발생하는 overhead가 더 적다.
    • 여러개의 프로세스를 생성하는 것 보다 더 적은 메모리를 사용한다.
    • 각각의 스레드가 힙 메모리 영역을 공유 하고 있기 때문에 힙 메모리 영역 읽기/쓰기가 가능하다.
  • 하나의 프로세스 내에서 각각의 스레드별로 실행 흐름을 갖는다.

 

멀티 스레딩(multi-threading)의 장단점

멀티 스레딩의 핵심은 '같은 메모리 공간을 공유' 한다는 것이다. 이러한 특징 때문에 프로세스와 가장 크게 구분된다.

 

장점

  • 메모리 공간과 시스템 자원 소모가 줄어든다. (경제적)
    • ex) 프로세스 생성 소멸시 발생하는 비용보다 스레드를 생성 소멸 시키는 비용이 더 싸다.
    • context switching시 발생하는 overhead가 프로세스에 비해 더 적게 든다.
  •  같은 프로세스 내에서 스레드간 통신을 할 때, 별도의 자원을 사용하지 않고 전역 변수 또는 힙 영역을 통해 스레드간 데이터를 주고 받을 수 있다.
  • 멀티 프로세서의 활용 : CPU 코어를 최대한 활용할 수 있어서 성능이 향상된다. (CPU 병렬성 증대)

 

단점

  • 프로그래밍 난이도가 올라간다.
    • 주의 깊은 설계가 필요하다.
    • 동기화 관련 문제가 발생할 수 있기 때문에 프로그래밍 시 유의해야 한다.
    • 디버깅 난이도가 올라간다.
    • 과도한 Lock 사용은 성능 저하를 유발할 수 있다.
  • 동기화 문제
    • 두 개 이상의 스레드에서 공유 데이터에 접근할 경우 문제가 발생할 수 있으므로, 동기화를 통해 자원에 대한 접근과 순서를 제어해야 한다.
  • 스레드 스케줄링 문제
    • 스레드는 실행 순서가 보장되지 않는다. 그렇기 때문에 스레드간 작업 순서가 보장되어야 하는 경우 제어가 필요하다.

 

스레드 종류

프로세스는 커널 프로세스와 사용자 프로세스로 나뉘며 스레드에도 커널 스레드(kernel thread)사용자 스레드(user thread)가 았다.

  • 커널 스레드(kernel thread) : 커널이 직접 생성하고 관리하는 스레드
  • 사용자 스레드(user thread) : 라이브러리에 의해 구현된 일반적인 스레드
    • 커널 지원 없이 생성 및 스케줄링 관리
    • 커널 입장에서는 사용자 스레드를 인식하지 못한다.
    • 사용자 스레드가 커널 스레드를 이용하려면 시스템 호출로 커널 기능을 이용해야 한다.

 

유저 모드와 커널 모드

  • 커널 모드(Kernel Mode) : 유저 영역 + 커널 영역에 접근할 수 있는 모드
  • 유저 모드(User Mode) : 유저 영역(사용자 프로세스 공간)에 접근할 수 있는 모드

모드 전환은 시스템에 부하를 준다.

 

<참고> 커널 모드, 유저 모드 특징

더보기

커널 모드의 특징 (Windows에서)

  • 커널 모드에서 실행되는 모든 코드는 단일 가상 주소 공간을 공유한다.
    • 운영체제 및 다른 드라이버와 분리되어 있지 않기 때문에 커널 모드에서 주소 공간의 충돌이 일어나면 전체 시스템에 치명적인 문제가 될 수 있다.
  •  다양한 시스템 기능을 제공 받을 수 있다.
  • 커널 모드에서는 모든 메모리 공간에 접근이 가능하다.

 

유저 모드의 특징

  • 사용자 프로세스의 개인 가상 공간은 비공개이다. 따라서 유저 모드에서는 다른 프로세스에 속한 데이터를 변경할 수 없다.
  • 기능상 제한이 있다. (하지만 더 안전) 
  • 프로세스 별로 독립적인 메모리 공간을 갖는다. 따라서 유저 모드에서의 충돌은 해당 프로세스로 제한된다.
  • 운영 체제는 충돌로 인한 영향을 받지 않는다. (커널 모드에 비해 안전하다)

 

멀티 스레드 모델

멀티 스레드 모델은 유저 스레드와 커널 스레드 어떠한 형태로 매핑되는지에 따라 구분한다.

 

1. 다-대-일(Many-to-One) / 유저 레벨 스레드(User Level Tread)

Many-to-One

 

하나의 커널 스레드에 여러개의 사용자 스레드가 매핑되는 형태이다.

 

장점

  • 라이브러리가 직접 스레드를 스케줄링하고 작업에 필요한 정보를 처리하기 때문에 context switching이 필요 없다. (필요한 값만 저장하고 복구시킴) 따라서 커널 모드로의 전환이 없기 때문에 빠르다.

단점

  • System Call 등으로 인해 커널 스레드가 중단 되면 모든 스레드가 중단 된다(프로세스 자체가 중단)
    • => 이는 스레드 정보가 커널 영역에 없기 때문에 커널이 프로세스 단위로 중단 시키기 때문이다.
  • 여러개의 CPU를 동시에 사용할 수 없다. (CPU 코어의 병렬성을 활용하기 힘듬)
  • 사용자 스레드에서는 커널이 제공하는 기능을 사용할 수 없다. (보호 기능 같은 것을 제공받지 못하므로 보안에도 취약할 수 있다.)

 

2. 일-대-일(One to One) / 커널 레벨 스레드(Kernel Level Thread)

 

하나의 커널 스레드에 하나의 사용자 스레드가 매핑되는 형태이다.

 

장점

  • 여러개의 CPU를 사용할 수 있다. (CPU 병렬성 활용)
  • 하나의 스레드가 중단되도 다른 스레드는 작업을 계속할 수 있다.
  • 커널이 제공하는 기능을 사용하므로 보안에 강하고 안정적으로 동작한다.

단점

  • 스레드 생성 개수가 제한된다. (커널 스레드가 한정되어 있기 때문에)
  • 커널 모드로의 전환이 필요하고 context switching시 발생하는 overhead 때문에 느리다.

 

3. 다-대-다(Many to Many) / 멀티 레벨 스레드(Multi Level Thread)

Many to Many

 

User Level Thread와 Kernel Level Thread는 서로 반대되는 장단점들을 가지고 있기 떄문에 이 두 모델의 장점을 활용하여 유연하게 동작하는 방식이다.

 

M to N 형태로 여러 개의 사용자 스레드가 여러 개의 커널 스레드로 매핑되는 형태의 모델이다.

빠르게 동작해야 하는 스레드는 사용자 레벨 스레드로 작동하게 하고, 안정적으로 움직여야 하는 스레드는 커널 레벨 스레드로 동작하게 한다.

 

TCB(Thread Control Block), 스레드 상태, 상태 전이

스레드도 프로세스와 마찬가지로 스레드를 제어하는 TCB(Thread Control Block)가 있다.

또한, 스레드도 프로세스 마찬가지로 스레드 상태(create, running, ready, blocked, terminated)가 있고 이 상태들은 스케줄링을 하면서 한 상태에서 다른 전이된다.

 

References

[OS] 프로세스와 스레드의 차이 - 희정님 블로그

boanin.tistory.com/84

728x90
반응형

'운영체제' 카테고리의 다른 글

동기화(Synchronization)  (0) 2020.11.13
스케줄링(Scheduling)  (0) 2020.11.03
프로세스(Process)  (0) 2020.10.23
메모리(memory)  (0) 2020.10.06
중앙처리장치(CPU) - 5 (병렬 컴퓨팅, 병렬 컴퓨터)  (0) 2020.09.30