[OS] 7. 스레드

KYJ의 Tech Velog·2023년 4월 12일
0

OS

목록 보기
9/23
post-thumbnail

스레드

프로세스 내에서 실제로 작업을 수행하는 주체를 의미합니다.

모든 프로세스에는 한 개 이상의 스레드가 존재합니다. 두 개 이상의 스레드를 가지는 프로세스는 멀티스레드 프로세스라고 합니다.

스레드는 자신의 Stack 영역을 보유하고 Code/Data/Heap 영역은 같은 프로세스 안에서 다른 스레드와 공유합니다.

스레드는 고유하게 Program Counter, Stack Pointer, Registers, Stack 등이 있습니다.

여러 개의 작업 단위로 구성된 프로그램에서 요청을 동시에 처리하기 위해 스레드를 사용합니다.


멀티 스레드

CPU가 하나인 환경에서 여러 스레드가 Context Switching에 의해 동시에 수행되는 것처럼 보이는 동시성 방식으로 작동합니다.

여러 CPU 환경에서 여러 스레드가 실제로 동시에 수행되는 병렬성 방식으로 작동합니다.

스레드 안전 (Thread Safe)

멀티 스레드 프로그래밍에서 어떤 공유 자원에 여러 스레드가 동시에 접근해도 프로그램 실행에 문제가 없는 상태를 의미합니다.

스레드 안전을 지키기 위한 방법은 다음과 같습니다.

  1. Re-entrancy
    한 스레드에 의해서 어떤 함수가 호출되어 실행중일 때 다른 스레드가 그 함수를 호출하더라도 결과가 각각의 스레드에게 정상적으로 전달되야 합니다.
  2. Thread-Local Storage
    공유 자원의 사용을 최대한 줄여서 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막습니다. 이 방식은 동기화 방법과 관련이 있고 공유 상태를 피할 수 없을 때 사용하는 방식입니다.
  3. Mutual Exclusion
    공유 자원을 꼭 사용해야할 때 해당 자원의 접근을 세마포어 등의 락으로 제어합니다.
  4. Atomic Operations
    공유 자원에 접근할 때 원자 연산을 이용하거나 Atomic으로 정의된 접근 방법을 사용함으로써 Mutual Exclusion을 구현할 수 있습니다.

동시성과 병렬성

  • 동시성
    동시에 실행되는 것 같이 보이는 것을 의미합니다. 싱글 코어에서 멀티 스레드를 동작 시키는 방식입니다.
  • 병렬성
    동시에 실행되는 것을 의미합니다. 멀티 코어에서 멀티 스레드를 동작 시키는 방식입니다.

스레드 풀 (Thread Pool)

미리 스레드를 생성해두고 작업하는 방식입니다. 스레드를 몇 개 생성해두고 모든 작업을 그 한정된 스레드를 재활용하며 작업하는 것입니다.

스레드 풀을 사용하지 않으면 스레드를 생성하기 위해 메모리를 계속 사용해서 메모리가 고갈될 수 있습니다. 또한 Context Switching도 계속 발생하기 때문에 오버헤드가 발생하게 될 것입니다.

스레드 풀은 메모리에 미리 스레드를 생성해놓고 그 스레드를 사용하기 때문에 언급했던 문제들을 해결할 수 있습니다.


프로세스 vs 스레드

  • 프로세스는 프로세스 간 통신에 IPC가 필요하지만 스레드는 필요하지 않습니다.
  • 프로세스는 메모리 공간을 공유하지 않지만 스레드는 Code, Data 영역을 공유합니다.
  • 스레드는 자원을 공유하고 있기 때문에 프로세스에 비해 Context Switching의 비용이 적습니다.

0개의 댓글