스레드는 무엇일까?

권태형·2023년 3월 20일
0

지식정리

목록 보기
39/72
post-thumbnail

😀프로세스를 땔래야 땔수없는 개념이 스레드이다. 프로세스에 관해 검색을 시도하면 어떻게 해서든 스레드가 연관되서 나온다.
스레드는 왜 프로세스와 땔 수 없는 개념인 걸까?

스레드(thread)란?

프로세스 내에서 프로세스의 자원을 이용하여 실행되는 여러 흐름의 단위
스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체

스레드는 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령어의 가장 작은 시퀀스이다.

또한, 하나의 프로세스는 하나 이상의 스레드를 갖고 있다.

😀개념의 정의에서부터 프로세스의 특징까지 프로세스와 스레드는 땔 수 없는 관계라는 것을 알 수 있다.


스레드의 목적

😀프로세스는 독립적인 특성을 가지고 있다고 하였다. 이러한 프로세스가 같은 일을 처리하기 위해 동일한 프로그램을 여러개의 프로세스로 만들게 되면, 그만큼 메모리를 차지하고, 그 외 에서 CPU에서 할당받는 자원이 중복되어 할당 받게 될 것이다. 따라서 중복되는 자원의 낭비를 줄일 필요성이 있고, 중복될 자원을 한번만 받아서 여러 곳에 사용할 수 있다면 더 효율적이게 될 것이다.

이러한 부분을 해결해 주는 것이 스레드이다. 스레드가 생긴 목적에 대해서 추려보면 다음과 같다.

1. 프로그램의 응답성 향상
스레드를 사용하면 하나의 프로세스 내에서 여러 작업을 동시에 처리할 수 있기 때문에, 다른 스레드에서 실행 중인 작업이 끝나기를 기다리지 않고, 동시에 여러 작업을 처리하여 프로그램의 응답성을 향상시킬 수 있다.

2. 자원 공유
스레드를 사용하면 같은 프로세스 내에서 메모리 공간을 공유할 수 있다.
이를 통해 데이터를 공유하고, 프로세스 간의 통신을 더욱 효율적으로 할 수 있다.

3. 비용 감소
스레드를 사용하면 새로운 프로세스를 생성하는 것보다 적은 비용으로 여러 작업을 처리할 수 있다.

4. 병렬 처리
스레드를 사용하면 하나의 작업을 여러 개의 스레드로 나누어 병렬적으로 처리할 수 있다. 이를 통해 작업을 더욱 빠르게 처리할 수 있다.


스레드의 구성

스레드는 프로그렘 카운터, 레지스터 셋, 스택을 보유하고 있다.

😀프로그렘 카운터, 레지스터 셋 이 두가지는 분명 프로세스의 문맥(context)의 구성정보와 일치한다. 따라서 스레드의 동작에 따라서 프로세스의 컨텍스트 또한 변경될 수 있다.

  • 프로그램 카운터 (Program Counter): 스레드가 다음에 실행할 명령어의 주소를 가리키는 포인터이다.

  • 레지스터 집합 (Register Set): 스레드가 현재 실행되는 상태를 저장하는 데 사용되는 레지스터 집합이다.

  • 스택 (Stack): 스레드에서 함수 호출 및 반환을 관리하기 위해 사용되는 스택이다.

위의 큰 구성정보 이외에도 식별을 위한 스레드ID, 상태, 스레드의 우선순위, 지역변수 등을 포함하고 있다.


스레드의 특징

😀스레드는 독립적으로 동작하는 프로세스와 달리, 프로세스 내에서 스레드끼리 일부 메모리를 공유하여 동작한다.

  • 메모리 공유 (Shared Memory)
    스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
    스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행된다.

  • 경량성 (Lightweightness)
    프로세스에 비해 스레드는 더 적은 자원을 사용한다. 스레드는 프로세스 내에서 메모리와 자원을 공유하기 때문에, 프로세스를 생성하는 것보다 더 적은 메모리를 사용한다. 또한, 스레드 간의 전환은 프로세스 간의 전환보다 빠르기 때문에 더 경량적이다.

  • 상호 협력성 (Cooperativeness)
    스레드는 다른 스레드와 상호 협력하여 작업을 수행할 수 있다. 프로세스간의 통신에서는 IPC기능을 통한 통신이 이루어지는 반면
    스레드는 데이터, 힙 영역을 공유함으로 데이터를 주고 받을 수 있다. 이러한 협력성은 프로세스와는 달리 더 높은 수준의 동시성을 제공해 준다.


멀티스레드

  • 멀티스레딩이란?
    하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것이다.
    윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티 스레딩을 기본으로 하고 있다.
    웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.

장점

  • 높은 성능
    여러 개의 스레드가 병렬적으로 작업을 처리하므로, 작업 처리 속도가 빠르고, 시스템 전체의 성능이 향상다.

  • 높은 자원 활용도
    멀티 스레드는 하나의 프로세스에서 여러 개의 스레드가 작동하므로, 프로세스가 가진 자원들을 스레드들이 공유하여 더 효율적으로 사용할 수 있다. 또한 문맥교체를 할 때 공유하고 있는 메모리 만큼 메모리 자원을 아낄 수 있다.

  • 높은 응답성
    멀티 스레드는 각각의 스레드가 별도의 작업을 처리하므로, 어떤 스레드에서 오류가 발생하더라도 다른 스레드는 정상적으로 작동하여 시스템이 멈추지 않고 계속해서 작업을 처리할 수 있다.

단점

  • 동기화 문제
    멀티 스레드에서는 여러 개의 스레드가 공유 자원을 사용하기 때문에, 동기화 문제가 발생할 수 있다.
    한 스레드가 공유 자원을 사용하는 동안 다른 스레드가 해당 자원을 사용하게 되면 데이터의 일관성이 깨질 수 있다.

  • 교착상태
    멀티 스레드에서는 여러 개의 스레드가 서로 대기하면서 무한정 기다릴 수 있는 상황이 발생할 수 있다.

  • 디버깅의 어려움
    멀티 스레드에서는 여러 개의 스레드가 동시에 실행되기 때문에, 디버깅이 어려울 수 있다.
    스레드 간의 의존성이 복잡하게 얽혀 있을 경우 디버깅이 더욱 어려워진다.


프로세스와 스레드의 비교

😀이전에 작성한 프로세스 포스팅을 참고하여 스레드와 간단하게 비교해보자

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

참고자료(출처)
권희정 github.io 포스팅 [OS] 프로세스와 스레드의 차이
벨로그 aeong98 포스팅 [운영체제] 프로세스와 스레드
티스토리 게임이 더 좋아 포스팅 Thread 스레드란?
면접을 위한 CS 전공지식 노트 (도서)
벨로그 bjo6300 포스팅 [CS] Process vs Thread
티스토리 장장스 포스팅 [OS] 프로그램 VS 프로세스 VS 스레드

profile
22년 12월 개발을 시작한 신입 개발자 ‘권태형’입니다. 포스팅 하나하나 내가 다시보기 위해 쓰는 것이지만, 다른 분들에게도 도움이 되었으면 좋겠습니다. 💯컬러폰트가 잘 안보이실 경우 🌙다크모드를 이용해주세요.😀 지적과 참견은 언제나 환영합니다. 많은 댓글 부탁드립니다.

0개의 댓글