스레드(Thread)

vvinter·2024년 5월 2일
0

개발용어

목록 보기
28/28

스레드를 이해하기 위해선 먼저 프로세스에 대해 알아야 하므로 프로세스에 대해 잠깐 알아보고 넘어가자.

프로세스란?

프로세스(process)란 단순히 실행 중인 프로그램(program)이라고 할 수 있는데, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 뜻한다. 이러한 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성된다.

  • 독립된 객체로서 생성되며 각각의 메모리 자원을 할당받고, 서로에게 접근이 불가함.
  • 따라서 여러 개의 프로세스를 처리하기 위해서 서로의 상태 자원을 공유하려면 IPC라는 커뮤니케이션 기법이 필요함.
    • IPC는 커널의 공유 메모리를 활용하여 프로세스들 간의 데이터 상태 정보를 주고받음

☁️  IPC : Inter-Process Communication

각 프로세스는 별도의 공간에서 실행되기 때문에, 한 프로세스에서 다른 프로세스의 메모리 영역에 접근할 수 없다. 따라서 프로세스가 다른 프로세스 자원에 접근하려면 IPC를 사용해야 한다.

IPC란 운영체제상에서 실행 중인 프로세스 간에 정보를 주고받는 것을 말하며, 하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신을 뜻한다.

IPC의 종류로는 메일슬롯, 파이프, 소켓, 시그널, 공유메모리 등이 있다.

스레드란?

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

  • 프로세스 내부에서 실행되는 작은 작업 단위
  • 스레드는 프로세스의 실행 흐름을 구성하는 단위로, 하나의 프로세스 안에는 여러 개의 스레드가 포함될 수 있음
  • 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 함

즉, 프로세스를 생성하면 기본적으로 하나의 (메인)스레드가 생성되는 셈이다.

(출처 : https://inpa.tistory.com/entry/👩‍💻-프로세스-⚔️-쓰레드-차이#스레드)

프로세스와 스레드

(출처 : https://charlezz.medium.com/process와-thread-이야기-5b96d0d43e37)

프로세스스레드
개념프로그램이 동작중인 상태
운영체제로부터 자원을 할당받는 작업의 단위
프로세스의 실행 가능한 가장 작은 단위
프로세스의 자원을 이용하여 실행되는 여러 흐름의 단위
자원공유독립적인 메모리를 가지고 있다코드, 데이터, 힙 영역의 메모리를 공유한다
문맥교환의 비용문맥교환의 비용이 크다문맥교환의 비용이 적다
동기화독립적인 특징으로 동기화를 필요로 하지않는다.공유자원에 대해 접근 시 동기화가 필요하다

💡 프로세스 : 자신만의 고유 공간과 자원을 할당받아 사용
     스레드 : 다른 스레드와 공간과 자원을 공유하면서 사용

특징

  • 메모리 공유
    • 스레드는 프로세스 내에서 각각 스택만 따로 할당받고 코드, 데이터, 힙 영역은 공유함
    • 스레드는 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행됨
      ⇒ IPC 기법과 같은 번거로운 작업 필요 없음.
  • 경량성
    • 스레드는 프로세스 내에서 메모리와 자원을 공유하기 때문에, 프로세스를 생성하는 것보다 더 적은 메모리를 사용함.
    • 또한, 스레드 간의 전환은 프로세스 간의 전환보다 빠르기 때문에 더 경량적임.
  • 상호 협력성
    • 스레드는 다른 스레드와 상호 협력하여 작업을 수행할 수 있음.
    • 프로세스 간의 통신에서는 IPC 기능을 통한 통신이 이루어지는 반면, 스레드는 데이터, 힙 영역을 공유함으로 데이터를 주고받을 수 있음.
    • 이러한 협력성은 프로세스와는 달리 더 높은 수준의 동시성을 제공해줌.

장단점

🔎 장점

  1. 응답성(성능) 향상
    • 스레드 간의 작업 분할과 병렬 처리로 인하여 빠른 응답성(결과)을 제공할 수 있음.
  2. 자원 공유 효율성 향상
    • 스레드는 프로세스 내부에 있기 때문에 별도의 메모리 공간을 할당할 필요 없이, 프로세스 내부에서 thread stack이라는 공간에 데이터를 관리함.
      ⇒ 따라서 스레드를 사용하면 자원 공유의 효율이 높음
  3. 동시성
    • 여러 개의 스레드가 동시에 실행될 수 있어서, 작업을 병렬로 처리할 수 있음.
  4. 간결성
    • 작업을 분리할 수 있어서 코드가 간결해질 수 있음.

🔎 단점

  1. 스레드 간의 상호간섭
    • 멀티 스레드가 실행 중인 상황에, 스레드 간의 상호간섭 문제가 발생할 수 있음
    • 프로세스는 독립된 객체라 한 개가 다운되어도 다른 프로세스에 영향이 가지 않지만, 스레드는 다른 스레드가 작업을 방해하거나 우선순위 설정에 문제가 있을 경우 서로에게 영향을 미치기 때문에 예상치 못한 이슈가 발생할 수 있음
  2. 성능 저하
    • 스레드를 많이 생성하면 성능 저하가 발생할 수 있음
      ⇒ 스레드가 많으면 스레드 스케줄러에서 각각의 스레드들이 병렬로 실행되기 위해 컨텍스트 스위칭이 빈번하게 발생해야 하기 때문
  3. 동기화 이슈
    • 여러 스레드가 공유 자원에 동시에 접근할 때, 동기화 문제가 발생할 수 있음
    • 경쟁 상태 문제는 스레드 간의 실행 순서나 타이밍에 따라 예측할 수 없는 결과가 발생할 수 있음
  4. 자원 소비
    • 스레드는 개별적인 실행 흐름을 가지기 때문에, 스레드마다 스택 및 레지스터 등의 메모리 자원을 소비함.
    • 따라서 스레드 수가 증가하면 메모리 사용량도 증가하게 되어 시스템 자원이 한계에 도달할 수 있음

🧩  구성요소

  • 스레드 ID
    • 각 스레드는 고유한 스레드 ID를 가지고 있음
    • 이를 통해 각각의 스레드를 구분함
  • 프로그램 카운터
    • 스레드가 다음에 실행할 명령어의 위치를 가리킴
  • 레지스터값
    • 각 스레드는 레지스터값을 가지고 있음
  • 스택
    • 스레드는 자체적인 스택의 값을 가지고 있음
    • 스택은 메서드 호출과 로컬 변수의 관리에 사용되며, 각 스레드는 독립적인 스택을 유지함

(출처 : https://velog.io/@yeol/스레드)


스레드 풀

컴퓨터 프로그램에서 실행의 동시성을 달성하기 위한 소프트웨어 디자인 패턴이다.

  • 프로그램이 작업을 동시에 실행할 수 있도록 여러 스레드를 미리 생성해두고 유지 관리
  • 여러 스레드를 동시에 만들어 실행(병렬처리)할 수 있음
  • 처리해야 할 일이 등록되기 전에 생성되며, 풀이 생성됨과 동시에 스레드들도 생성되어 풀에서 대기하게 됨

즉, 작업 처리에 사용되는 스레드를 제한된 개수만큼 미리 정해 놓고 작업 큐에 들어오는 작업을 하나씩 맡아 처리하는 것을 말한다.

🪜 동작 방식

  1. 스레드 풀에 스레드를 미리 생성
  2. 새로운 작업이 들어올 때마다 큐의 대기열에 추가
  3. 작업을 큐에서 하나씩 꺼내어 적절한 스레드로 할당
    • 작업을 수행하지 않고 있는 스레드에 작업을 할당한다는 의미
  4. 작업이 끝나면, 이를 콜백 형태로 작업을 요청한 주체에게 결과를 알려줌.

(출처 : https://velog.io/@haero_kim/Java-Thread-Pool-개념과-동작원리)


🔎 장점

  • 여러 스레드를 동시에 만들어 실행, 병렬 처리할 수 있음
  • 비효율적인 할당과 해제시키는 비용을 절약할 수 있음
  • context switching 상황에도 딜레이를 줄일 수 있음
  • 스레드가 생성될 때 OS가 메모리 공간을 확보해주고 메모리를 스레드에 할당해줌

🔎 단점

  • 스레드 풀에 스레드를 너무 많이 생성해 두었다가 사용하지 않으면 메모리 낭비가 발생함
    ⇒ 상황에 맞게 예측하고 할당해서 사용하는 것이 좋음






📎  참고

https://charlezz.medium.com/process와-thread-이야기-5b96d0d43e37
https://www.tcpschool.com/java/java_thread_concept
https://jerryjerryjerry.tistory.com/184
https://velog.io/@kwontae1313/스레드는-무엇일까
https://baebalja.tistory.com/359
https://inpa.tistory.com/entry/👩‍💻-프로세스-⚔️-쓰레드-차이#스레드
https://code-piggy.tistory.com/entry/운영체제-스레드-단일-스레드-프로세스와-멀티-스레드-프로세스-스레드의-구성요소-멀티프로세스와-멀티-스레드
https://velog.io/@yeol/스레드
https://velog.io/@dodozee/OSJava-스레드-풀이란Thread-pool]
https://velog.io/@haero_kim/Java-Thread-Pool-개념과-동작원리

0개의 댓글