[CS] 프로세스와 스레드 (Process & Thread)

Deah (김준희)·2023년 9월 3일
0

Computer Science

목록 보기
2/5
post-thumbnail

프로그램 (Program, Static Program)

  • 사전적 의미로는 무언가의 진행 계획이나 순서, 목록, 차례 등을 의미
  • 컴퓨터에서 어떠한 작업을 실행하기 위해 작성된 명령문의 집합체 = 코드의 집합체
  • 즉 컴퓨터에서 어떠한 작업을 위해 실행할 수 있는 '정적 상태(static)의 파일' = 실행되지 않은 상태의 파일
  • .exe, .dmg, '카카오톡', '엑셀', '브라우저' 등

프로세스 (Process)

  • 정적 상태의 프로그램(코드 집합체)이 CPU로부터 메모리 공간(RAM)을 할당받아 실행되어 동적인 상태에 있는 것
  • 즉 컴퓨터에서 작업 중인 프로그램을 의미
  • 컴퓨터의 '작업관리자 - 프로세스'에서 현재 실행 중인 프로그램 리스트를 확인할 수 있다.

image

메모리 공간(RAM)

  • 코드 영역(Code) : 실행 명령을 포함하는 코드
  • 데이터 영역(Data) : Static 변수 혹은 Global 변수
  • 스택 영역(Stack) : 동적 메모리 영역
  • 힙 영역(Heap) : 지역변수, 매개변수, 반환값 등의 일시적인 데이터

프로세스 제어 블록 (Process Control Block, PCB)

  • 각 프로세스가 생성될 때 고유하게 생성되며, 프로세스를 관리하기 위한 중요 정보를 저장하고 있는 운영체제의 자료구조
  • 컨텍스트 스위칭(Context Switching) : 작업 상태에 있던 프로그램이 전환되면서 각 프로그램의 작업 상황을 PCB에 저장하고, 이후 다시 CPU를 할당받게 되면 PCB 내에 저장되어있던 기존 작업의 진행 상황을 불러와 종료됐던 시점부터 다시 작업을 수행
  • 프로그램이 많아지면 프로세스가 많아지고, 많은 메모리를 차지하며 CPU에서 할당받는 자원도 중복 = 스레드 등장의 이유

스레드 (Thread)

  • 프로세스의 실행단위, 하나의 프로세스 내에서 동시에 진행되는 작업의 갈래나 흐름
  • 예를 들어, 브라우저를 실행하면 하나의 프로세스가 생성된다. 해당 브라우저 내에서 검색하기, 유튜브 보기, 파일 다운로드 등의 여러 작업의 갈래가 생기는데 이러한 갈래를 스레드라고 한다.
  • 경량화된 프로세스라고 표현되기도 한다. 왜냐하면 프로세스 내의 주소 공간이나 자원을 공유하기 때문 (코드, 데이터, 힙 영역을 공통으로 사용하고 각 스레드별 별도 스택을 가짐)

image


프로세스와 스레드의 차이

프로세스는 프로그램이 실행될 때마다 각각의 메모리 공간을 할당 받아 코드, 데이터, 스택, 힙 영역을 가진다. 그리고 프로세스 제어 블록(PCB)를 만들어 중요한 정보를 저장한다. 반면에 스레드는 하나의 프로세스 내에서 여러 갈래로 나누어져 스레드마다 각각의 스택만 가지며 코드, 데이터, 힙 영역은 공유 자원으로 사용한다.



멀티 프로세스와 멀티 스레드 (Multi-Process & Multi-Thread)

멀티 프로세스 (Multi-Process)

  • 하나의 어플리케이션을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 수행하도록 하는 것
  • 여러 개의 요청을 처리해야 하는 상황이 왔을 때 부모 프로세스가 자식 프로세스를 만들어 각각의 요청을 수행하도록 한다.
  • 자식 프로세스는 부모 프로세스와 별개의 메모리 영역을 가지게 된다.



멀티 스레드 (Multi-Thread)

  • 하나의 어플리케이션을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 수행하도록 하는 것
  • 프로세스 안에 스레드가 1개일 경우 싱글 스레드(단일 스레드), 여러 개일 경우 멀티 스레드라고 부른다.
  • 싱글 스레드는 프로세스 그 자체라고 보아도 무방하지만 저세히 살펴보면 프로세스 안에 하나의 스레드이다.



멀티 프로세스와 멀티 스레드의 장점과 단점

멀티 프로세스

  • 여러 개의 프로세스 중 하나의 프로세스에 문제가 발생해도 다른 프로세스로 확산되지 않는다.
  • 각 프로세스가 독립된 메모리 영역(코드, 데이터, 스택, 힙)을 가지기 때문에 컨텍스트 스위칭 과정에서 캐시 메모리 초기화 등의 무거운 작업이 진행되어 많은 시간이 소요되고 오버헤드가 발생한다.

멀티 스레드

  • 스택을 제외한 나머지 자원을 공유하기 때문에 메모리 사용 공간이 줄고 시스템 자원의 효율성이 증가하여 스레드 간의 통신이 간편하다.
  • 공유되는 데이터가 있으므로 주고 받을 데이터의 양이 줄어들어 컨텍스트 스위칭이 일어날 때 캐시 메모리를 초기화할 필요가 없어 비용이 적게 들고 빠른 전환이 가능하다. (프로그램 응답 시간 단축)
  • 오류로 인해 하나의 스레드가 종료되면 전체 스레드(= 프로세스)가 종료될 수 있다. (e.g. 브라우저에서 여러 개의 탭을 이용 중 오류로 인해 전체 창이 종료되는 경우)
  • 스택을 제외한 메모리를 공유하므로 동기화 문제가 발생할 수 있다.
  • 이러한 이유들로 프로그래밍을 할 때 주의깊은 설계가 필요하며 디버깅 작업이 까다롭다.

무엇을 사용해야 하나?

멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 안고 있다.
반면에 멀티 프로세스 방식은 하나의 프로세스에 오류가 생겨도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행된다는 장점이 있지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 존재한다.
이 두 가지는 동시에 여러 작업을 수행한다는 점에서 같지만 적용해야 하는 대상 시스템의 특징에 따라 적합한 동작 방식을 선택하고 적용해야 한다.

profile
기록 중독 개발자의 기록하는 습관

0개의 댓글