[CS] 프로세스 와 쓰레드 (1)쓰레드

Nick·2023년 8월 29일
0

CS

목록 보기
6/7
post-thumbnail
post-custom-banner

Summary
쓰레드와 쓰레드 풀에 대한 설명입니다.
쓰레드는 프로세스 내에서 실행되는 실행 단위이며,
쓰레드 풀쓰레드를 미리 생성해 두어 작업 처리에 사용되는 쓰레드를 제한된 개수만큼 정해 놓고 작업 큐에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리하는 기법입니다. 쓰레드 풀의 장점으로는 쓰레드를 생성/수거하는데 비용이 들지 않으며, 쓰레드 풀을 미리 만들어 두기 때문에 시스템 자원을 줄일 수 있습니다. 단점으로는 쓰레드 풀에 쓰레드를 너무 많이 생성해 두었다가 사용하지 않으면 메모리 낭비가 발생합니다.

프로세스와 쓰레드

프로세스 = 🏡프로그램을 실행해주는 주체

  • 상가건물🏢을 컴퓨터라고 한다면 치킨을 만드는 치킨집🏡을 프로세스라고 볼 수 있습니다.
    • 상가안의 식당들은 배정된 자신의 공간과 돈이 있습니다. (필요한 만큼 배정된 고유 공간)
  • ex. 카카오톡 💬을 실행하는 프로세스
  • 맥북 > 활성 상태 보기 📈 > CPU

쓰레드 💁 = 작업을 처리해주는 주체

  • 치킨집을 하는 집🏡안에서 실제 업무를 분담에서 하는 직원💁을 쓰레드라고 볼 수 있습니다.
    (치킨 튀기는 직원, 주문받고 계산하는 직원, 서빙하고 설거지하는 직원)
    - 치킨집 안의 공간과 재료를 같이 쓴다. (자원 공유)
  • ex. 메세지 발송 📤을 처리하는 쓰레드, 메세지 수신📥을 확인하는 쓰레드 등…
  • 맥북 > 활성 상태 보기 📈 > CPU > 프로세스 상세 > 통계

스레드는 필요할때마다 생성 되며, 프로세스 상세의 스레드 수는 최근 평균 스레드 개수 통계값 입니다.
치킨집에서 일할 직원을 뽑는것과 비슷한 개념이라고 보시면 됩니다.

📌 프로세스와 쓰레드 요약

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

쓰레드

프로세스🏡와 쓰레드💁의 차이점

  • 프로세스🏡 : 자신만의 고유 공간과 자원을 할당받아 사용
    • 프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 쓰레드는 이 프로세스 안에서 실행되는 흐름 단위를 말합니다.
    • 프로세스는 최소 하나의 쓰레드를 보유하고 있으며, 각각 별도의 주소공간을 독립적으로 할당 받습니다.
      (code, heap, stack)
📌 프로세스 만으로 작업을 처리할때의 문제점
  • 프로세스 생성에 큰 오버헤드가 있습니다.
    • 프로세스를 생성할때 많은 시간이 소요됩니다.
  • 프로세스 컨텍스트 스위칭의 비효율성, 오버헤드가 큽니다.
  • 프로세스 사이에 통신이 어렵습니다.
    • 비용이 비싼 IPC 사용해서 통신을 합니다. (또는 LPC, 공유 메모리)

IPC(Inter-Process Communication)는 프로세스간 통신을 위한 메커니즘입니다.
프로세스 간 데이터를 주고받기 위한 방법으로, Message Queue, Shared Memory, Semaphore, Socket 등의 방법이 있습니다.

  • 쓰레드💁 : 다른 쓰레드와 공간과 자원을 공유하면서 사용
    • 쓰레드는 프로세스안에서 작업을 처리하는 주체 입니다.
    • 쓰레드는 자원 중에 stack 만 따로 할당받고 나머지 영역은 쓰레드끼리 서로 공유합니다.
📌 쓰레드가 해결한 문제들
  • 프로세스 보다 크기가 작은 실행 단위 구현

  • 프로세스의 생성 및 소멸에 따른 오버헤드 감소

  • 쓰레드간 자원을 공유 함으로써 빠른 컨텍스트 스위칭

  • 프로세스 들의 통신 시간, 방법 어려움 해소

  • 프로세스와 쓰레드 비교

    • 운영체제는 프로세스마다 독립된 메모리 영역을 Code/Data/Stack/Heap의 형식으로 할당합니다.

      • 각각 독립된 메모리 영역을 할당해주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없습니다.
    • 이와 다르게, 스레드는 메모리를 서로 공유할 수 있습니다.

      • 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 다로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유합니다.

      • 따라서, 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 됩니다.

      • 즉, 치킨집에서 각자 일하는 공간이 있지만, 같이 보는 업무 가이드(Code)가 있고, 주문도 같이 받고(Data), 손님이 오고가는 홀 공간도 같이 쓴다(Heap)는 점과 비슷합니다.

        스레드들이 프로세스의 Code/Data/Heap 메모리 영역을 공유하는 모습 (이미지 출처: Heee's Development Blog )

        	스레드들이 프로세스의 Code/Data/Heap 메모리 영역을 공유하는 모습 (이미지 출처: Heee's Development Blog )
  • 정리하자면,

    • 프로세스는 운영체제로부터 별도의 메모리 영역을 할당 받고
    • 스레드는 Stack 을 제외한 Code/Data/Heap 부분은 공유해 서로 읽고 쓸 수 있게 됩니다. (공유자원)

    프로세스🏡와 쓰레드💁의 주소공간

    프로세스의 주소공간

    프로세스를 알기 전에 프로그램을 알아야 한다. 프로그램(Program)은 어떤 작업을 위해 실행할 수 있는 파일을 말합니다.

    프로세스의 사전적 정의는 다음과 같습니다.

    • 컴퓨터에서 연속적으로 실행하고 있는 컴퓨터 프로그램

    • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)

    • 운영체제로부터 시스템 자원을 할당받는 자원의 단위

    • 정리하면 프로그램의 실행된 부분을 의미합니다.

      프로세스는 다음의 특징을 갖습니다.

    • 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받습니다.

      • 코드 영역(code area): 프로그래머가 작성한 프로그램이 저장되는 영역
      • 데이터 영역(data area): 코드가 실행되면서 사용한 환경이나 파일들의 각종 데이터들이 모여있습니다.
      • 스택 영역(stack area): 호출한 함수가 종료되면 되돌아올 메모리의 주소나 지역 변수 등이 저장됩니다.
      • 힙 영역(heap area): 동적으로 할당되는 데이터를 위해 존재합니다.
    • 최소 1개 이상의 스레드(메인 스레드)를 가지고 있다.

    • 각 프로세스는 별도의 주소 공간에서 실행되며 기본적으로 다른 프로세스의 자원에 접근할 수 없다.

    • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간 통신(IPC)를 사용해야 한다.

      • ex. 파이프, 파일, 소켓 등을 이용한 통신 방법
    • 그림에서 여러 프로세스가 동시에 실행되고 관리 되는 것 처럼 보인다. 하지만 CPU는 한 번에 한 가지 명령밖에 처리할 수 없다. 즉, 동시가 아니라 빠르게 프로세스들을 번갈아가면서 실행하고 관리하고 있는 것이다.

    스레드의 주소공간

    스레드의 사전적 정의는 다음과 같다.

    • 프로새스 내에서 실행되는 여러 흐름의 단위
    • 프로세스의 특정한 수행 경로
    • 프로세스가 할당받은 자원을 이용하는 최소 실행 단위

    스레드는 다음의 특징을 갖습니다.

    • 프로세스 내에서 각 필요한 Stack만 할당받고 Code, Data, Heap 영역은 공유해서 각 스레드가 공유합니다.
    • 같은 프로세스 내 스레드끼리 자원(Heap 등)을 공유하며 실행됩니다.
      • 즉, 스레드는 공유하는 자원인 Heap 영역에 있는 변수를 수정할 수 있습니다.
    • 프로세스 하나만을 사용해서 프로그램을 실행하기에는 메모리의 낭비가 발생합니다.
      • 레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동합니다.

      • 즉, 프로세스가 할당받은 자원을 이용하는 처리 작업(실행의 흐름)의 단위 입니다.

    📌 치킨집에서 각자 일하는 공간(Slack)이 있지만,
    • 업무 메뉴얼(Code)도 같이 보고

    • 손님의 주문(Data)도 같이 받고

    • 손님이 주문한 치킨을 서빙 하는 홀 공간(Heap)도 같이 쓴다는 점과 비슷합니다.

  • 스레드가 독립적으로 가지고 있는 부분 = 작업 흐름과 관련됨

    • program counter (실행할 명령어)
    • register set
    • stack space
  • 스레드가 동료 스레드와 공유하는 부분 = 작업 데이터와 관련됨

    • code section
    • data section
    • OS resources
  • 전통적인 개념의 heavy weight process 는 하나의 thread 를 가지고 있는 작업(task)으로 볼 수 있습니다.

  • 멀티 프로세스🏡🏡와 멀티 쓰레드💁‍♂️💁

    📌 쓰레드 요약
    쓰레드는 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령어의 가장 작은 흐름 입니다. 하나의 프로세스는 하나 이상의 쓰레드를 갖고 있습니다.

    • 멀티 프로세스 : 하나의 운영체제 안에서 여러 프로세스가 실행되는 것
    • 멀티 쓰레드 : 하나의 프로세스가 여러 작업을 여러 쓰레드를 사용해 동시에 처리하는 것
    profile
    배우고 도전하는것을 멈추지 않는 개발자 입니다.
    post-custom-banner

    0개의 댓글