스레드

?에서 !로·2022년 1월 7일
0

스레드


스레드란?

스레드(Thread)란 프로세스 내부에서 독립적으로 실행되는 하나의 작업단위를 의미한다. 모든 프로세스에는 최소 한 개 이상의 스레드가 존재하며, 프로세스 내에서 스레드 ID, 레지스터 집합, 스택영역을 독립적으로 할당 받고 나머지 자원들을 공유한다.

PC (Program Counter)
다음에 실행할 명령어의 주소 저장, 제어 레지스터

SP (Stack Pointer)
현재 스택 영역에서 가장 마지막 부분(가장 최근에 저장된)을 가르킴, 데이터 레지스터

스레드와 프로세스
프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고 쓰레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다. 프로세스는 서로 독립적인 메모리 영역에서 실행되기에 때문에 프로세스간 통신(IPC)을 통해 데이터를 교환해야 한다. 스레드는 프로세스보다 생산과 Context Switching에 있어 경제적이며 프로세스 내의 데이터를 서로 공유하기 때문에 효율적으로 통신이 가능하다.
+) 스택을 스레드마다 독립적으로 할당하는 이유
스택은 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 영역이 독립적으로 할당 되는 것은 독립적인 함수 호출이 가능하다. 이는 스레드의 정의에 따라 독립적인 실행 흐름을 가질 수 있다. 또한 스택은 Lifo 의 구조이기 때문에 공유하게 된다면 원활한 실행 흐름을 제어하기 어렵습니다.
+) PC Register 를 스레드마다 독립적으로 할당하는 이유
스레드는 CPU를 할당받았다가 스케쥴러에 의해 다시 선점당한다. 그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다. 따라서 PC 레지스터를 독립적으로 할당한다.
+) Java Thread(자바 스레드)란?
일반 스레드와 비슷하며 JVM이 운영체제의 역할을 합니다. 자바에는 프로세스가 존재하지 않고 스레드만 존재하며, 자바 스레드는 JVM에 의해 스케쥴링 되는 실행 단위 코드 블록이다.

멀티 스레드

하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 작업 처리 효율을 향상시키는 것을 멀티스레딩이라고 한다.

멀티 스레드 장단점

장점

  • 경재성 :
    - 프로세스 내 자원들과 메모리를 공유하기 때문에 메모리 공간과 시스템 자원 소모가 줄어든다.
    - 스레드 간 통신이 필요한 경우에도 쉽게 힙 영역을 통해 데이터를 주고 받을 수 있다.
    - 프로세스의 context switching과 달리 스레드 간의 context switching은 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다.
    - 프로세스를 생성하여 자원을 할당하는 시스템 콜이 감소하여 자원의 효율적 관리가 가능
  • 멀티프로세서 활용 : 다중 CPU 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있으므로 CPU 활용도가 증가한다.
  • 응답성 : 프로그램의 일부분(스레드)이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속 되어 사용자에 대한 응답성이 증가한다.

단점

  • 자원을 공유하기 때문에 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받는다. 따라서 동기화가 필요하지만 과도한 동기화는 병목현상, 교착상태의 문제가 생길 수 있다. 그래서 주의 깊은 설계가 필요하고 디버깅이 어렵다.

멀티 프로세스

하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 1개의 작업을 처리하도록 하는 것

여러개의 작업을 동시에 처리하기 위해 fork를 통해 프로세스를 복사할 수 있는데, 부모-자식 관계라고 해도 환경변수와 프로세스 핸들 테이블이 상속 가능할 뿐, 자신만의 메모리 영역을 가진다.

프로세스 간 통신을 하려면 IPC(Inter Process Communication)를 통해야 한다.

장점

독립된 메모리 구조이기 때문에 안전성이 높다.

단점

각각 독립된 메모리 영역을 갖고 있어,

  • Context Switching시 CPU 레지스터 교체 뿐만 아니라 캐쉬에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야 하기 때문에 오버헤드 발생.
  • 프로세스는 각각 독립적인 메모리를 할당받았기 때문에 통신하는 것이 어렵다.

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

두 가지는 동시에 여러 작업을 수행한다는 점에서 같지만 적용해야 하는 시스템에 따라 적합/부적합이 구분된다. 또한 멀티 스레드는 멀티 프로세스에 비해 상당한 이점을 가지는 반면 위험 부담도 따른다. 따라서 대상 시스템의 특징에 따라 적합한 동작 방식을 선택하고 적용해야 한다.

스레드 풀

스레드가 생성될 때, 운영체제(OS)가 요청을 받아들여 메모리 공간을 확보해주고 그 메모리를 스레드에게 할당해준다. 요청이 들어올 때 마다 스레드를 생성하고 작업 후에 제거하는 작업은 프로그램 성능과 퍼포먼스에 영향을 미칠 수 있기 때문에 스레드를 미리 만들어 놓고 재사용 하는 것을 스레드 풀이라 한다.

미리 생성된 스레드 풀의 스레드들이 처리가 필요한 Task가 쌓이는 Task Queue에서 Task들을 꺼내 처리하는 구조이다.

하지만 너무 많이 만들어 놓을 경우 메모리 낭비가 발생할 수 있다.

0개의 댓글