너굴 개발 일지

[용어] 프로세스? 스레드? 무슨 차이가 있을까? 본문

기타

[용어] 프로세스? 스레드? 무슨 차이가 있을까?

너굴냥 2023. 10. 5. 21:47

자바스크립트의 비동기 처리 관련 이벤트 루프를 공부하면 스레드라는  단어가 많이 나오는데 스레드의 정확한 개념과 스레드와 연관 있는 프로세스에 대해 알아보며 정리한 글입니다.

 

사전 지식

본문

정리

Q&A


CPU

CPU는 컴퓨터의 두뇌 역할로 메모리에 저장된 명령어를 읽고 해석하며 실행하는 부품입니다.

CPU의 내부 구성 요소 중 가장 중요한 3가지는 산술논리연산장치(Arithmetic Logic Unit), 레지스터(register), 제어장치(Control Unit)가 있습니다.

  • 산술논리연산장치(ALU)
    • 계산만을 위해 존재하는 부품으로 컴퓨터 내부에서 수행되는 대부분의 계산은 ALU가 도맡아 수행
  • 레지스터
    • CPU 내부의 작은 임시 저장 장치로 프로그램을 실행하는 데 필요한 값들을 임시로 저장
    • CPU안에는 여러 개의 레지스터가 존재하고 각기 다른 이름과 역할을 가짐
  • 제어장치
    • 제어 신호라는 전기 신호를 보내고 명령어를 해석하는 장치
    • 제어 신호 
      • CPU가 메모리에 저장된 값을 읽고 싶을 때, 메모리를 향해 메모리 읽기라는 제어 신호를 보냄
      • CPU가 메모리에 어떤 값을 저장하고 싶을 때, 메모리를 향해 메모리 쓰기라는 제어 신호를 보냄

위 구성 요소를 통해 CPU가 명령어를 실행하는 원리는 다음과 같습니다.

메모리 읽기

제어 장치는 1번지에 저장된 명령어를 읽기 위해 메모리에 '메모리 읽기' 제어 신호를 보냅니다.

(1) 메모리는 1번지에 저장된 명령어를 CPU에게 건네주고, 이 명령어는 레지스터에 저장됩니다. (2) 제어장치는 읽어들인 명령어를 해석한 뒤 3번지와 4번지에 저장된 데이터가 필요하다고 판단해 (3) 제어장치는 메모리에 '메모리 읽기' 제어 신호를 다시 보냅니다.

(1) 메모리는 3번지와 4번지에 저장된 데이터를 CPU에게 건네주고, 이 데이터들은 서로 다른 레지스터에 저장됩니다.
(2) ALU는 읽어들인 데이터로 연산을 수행한 후 (3) 계산의 결괏값은 레지스터에 저장됩니다.

CPU 클럭(clock)은 CPU가 연산 작업을 처리하는 속도를 의미하며 과거 CPU 성능을 높이는 가장 편리한 방법은 클럭을 올리는 것이었습니다. 하지만 클럭이 높아질수록 발열 문제가 심각해져 클럭 속도만으로는 CPU 성능을 올리는 것에 한계가 있었습니다.

따라서 코어(core)라는 것이 탄생했습니다. 코어는 명령어를 실행하는 부품으로 코어가 많아지면 연산을 여러 개의 코어가 처리하기에 훨씬 빠른 일처리가 가능해집니다. 과거에는 하나의 코어가 있는 '싱글 코어'밖에 없었지만 현대에는 코어를 여러개 포함하고 있는 '멀티 코어' 형태로 출시되고 있으며 이런 CPU를 멀티코어 CPU 또는 멀티 코어 프로세서라고 부릅니다.

스레드의 두가지 의미

CPU에서 사용되는 스레드와 프로그래밍에서 사용되는 스레드는 용례가 다르기에 스레드의 개념에 대해 간단히 짚고 아래에서 더 자세하게 다뤄보겠습니다.

스레드는 CPU에서 사용되는 하드웨어적 스레드, 프로그램에서 사용되는 소프트웨어적 스레드로 나뉘며 어떻게 다른지 알아보겠습니다.

하드웨어적 스레드

  • 스레드란 하나의 코어가 동시에 처리하는 명령어 단위
  • 1코어 1스레드 일수도 있고 여러 스레드를 처리하는 코어일 수도 있음
  • 2코어 4스레드는 명령어 실행 부품이 2개(코어)이며, 한번에 네개의 명령어 처리할 수 있는 CPU를 의미 (한코어당 2개의 하드웨어 스레드를 처리한다는 의미로 봐도 무방)
  • 이처럼 하나의 코어로 여러 명령어를 처리하는 CPU를 멀티 스레드 프로세서라고 함
  • 하이퍼스레딩이란 인텔의 멀티스레드 기술을 의미

2코어 4스레드 CPU

소프트웨어적 스레드

  • 하나의 프로그램에서 독립적으로 실행되는 단위로 CS를 공부할 때 접하는 스레드는 보통 소프트웨어적 스레드를 의미
  • 하나의 프로그램에서 실행되는 과정이 한 부분만 실행될 수도 있지만, 프로그램의 여러 부분이 동시에 실행될 수도 있음

결론

스레드의 하드웨어적 정의는 '하나의 코어가 동시에 처리하는 명령어 단위'를 의미하고, 소프트웨어적 정의는 '하나의 프로그램에서 독립적으로 실행되는 단위'를 의미합니다.

한번에 하나씩 명령어를 처리하는 1코어 1스레드 CPU도 소프트웨어적 스레드를 수십개 실행할 수 있습니다. 즉, 1코어 1스레드 CPU로도 프로그램 여러 부분을 동시에 실행한다는 의미입니다.

 

프로세스

프로그램은 실행되기 전까지 그저 보조기억장치에 있는 데이터 덩어리지만 프로그램을 메모리에 적재해 실행하는 순간 프로세스가 됩니다. (이 과정을 프로세스를 생성한다고 표현합니다)

프로그램
컴퓨터에서 실행할 수 있는 명령어들의 집합으로 코드가 구현된 파일을 의미합니다. (웹 브라우저 등)

모든 프로세스는 실행을 위해 CPU를 필요로 하지만 CPU 자원은 한정되기에 프로세스들은 차례대로 돌아가며 한정된 시간만큼 CPU를 이용합니다.

OS는 빠르게 번갈아 수행되는 프로세스의 실행 순서 관리, CPU를 비롯한 자원 배분을 위해 프로세스 제어 블록(Process Control Block)을 사용합니다.

PCB란 프로세스와 관련된 정보를 저장하는 자료 구조로 프로세스 식별을 위해 필요한 정보를 저장하며 이는 커널 영역에 생성됩니다. 또한 생명주기는 프로세스 생성시 만들어지고 실행이 끝나면 폐기됩니다.

하나의 프로세스에서 다른 프로세스로 실행 순서가 넘어갈 경우, 직전에 실행된 프로세스는 지금까지의 중간 정보(레지스터 값, 메모리 정보 등)를 PCB에 백업하며 이때 저장되는 중간 정보, 즉 하나의 프로세스 수행 재개를 위해 기억해야할 정보를 문맥(Context)라고 합니다.

PCB와 Context

 

기존 프로세스 문맥을 PCB에 백업하고, 새로운 프로세스 실행을 위해 문맥을 PCB로부터 복구해 새로운 프로세스를 실행하는 것을 문맥 교환(Context Switching)이라고 함

문맥 교환은 여러 프로세스가 끊임 없이 빠르게 번갈아가며 실행되는 원리로 이로 인해 프로세스들이 동시에 실행되는 것처럼 보입니다.
이처럼 Context Switching을 통해 동시에 실행되는 것처럼 보이는 것을 동시성(Concurrency)라고 합니다.

Context Switching

프로세스 메모리 영역

하나의 프로세스는 사용자 영역에 4가지 영역으로 나뉘어 저장되며 4가지의 영역은 다음과 같습니다.

  • 코드 영역
    • 텍스트 영역이라고도 하며 실행할 수 있는 코드, 즉 기계어로 이뤄진 명령어가 저장
    • 데이터가 아닌 CPU가 실행할 명령어가 담겨 있기에 쓰기 금지 → 읽기 전용 공간
  • 데이터 영역
    • 프로그램이 실행되는동안 유지될 데이터 저장 공간 (ex: 전역 변수)
    • 프로그램 구성 명령어들이 갑자기 바뀔 일은 없으니 코드 영역, 데이터 영역은 크기가 변하지 않음 → 정적 할당 영역
  • 힙 영역
    • 프로그래머가 직접 할당할 수 있는 저장 공간
    • 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면, 해당 공간을 반환해야 함 → 그렇지 않으면 할당한 공간은 메모리 내에 계속 남아 메모리 낭비를 초래 (메모리 누수)
  • 스택 영역
    • 데이터를 일시적으로 저장하는 공간으로 데이터 영역과는 달리 잠깐 쓰다 말 값들이 저장됨 (ex: 함수 매개변수, 지역 변수)
    • 힙, 스택 영역은 실시간으로 크기가 변할 수 있음 → 동적 할당 영역
    • 일반적으로 힙 영역은 메모리 낮은 → 높은 주소로 할당, 스택은 높은 → 낮은 주소로 할당해 새롭게 할당되는 주소가 겹치는 일이 없게 함

 

프로세스 상태

프로세스는 저마다의 상태가 있으며 PCB에 기록하고 운영체제는 실행되는 많은 프로세스를 계층적으로 관리합니다.
프로세스가 빠르게 번갈아가며 실행되는 과정에서 하나의 프로세스는 여러 상태를 거치며 실행되며 상태의 종류는 다음과 같습니다.

  • 생성 상태
    • 프로세스를 생성 중인 상태로 막 메모리에 적재되어 PCB를 할당받은 상태
  • 준비 상태
    • 당장이라도 CPU를 할당받아 실행할 수 있지만 자신의 차례가 아니기에 기다리고 있는 상태
    • 준비 상태 → 실행 상태로 전환되는 것을 dispatch라고 함
  • 실행 상태
    • CPU를 할당받아 실행중인 상태로 할당된 일정 시간동안만 CPU를 사용
    • 타이머 인터럽트에 의해 할당된 시간을 다 사용하면 준비 상태가 됨
    • 실행 도중 입출력 장치를 사용하게 되면 작업 끝날때까지 대기 상태 됨
    • 입출력 작업 외의 원인도 있지만 대부분의 원인이 입출력 작업임
  • 종료 상태
    • 프로세스가 종료된 상태로 OS는 PCB와 프로세스가 사용한 메모리 정리

 

프로세스 계층 구조

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있으며 이때 생성 주체를 부모 프로세스, 생성된 프로세스를 자식 프로세스라고 합니다.
부모 프로세스로부터 생성된 자식 프로세스는 실행 과정에서 또 다른 자식 프로세스를 생성할 수 있습니다.
이처럼 OS는 프로세스가 프로세스를 낳는 계층적인 구조로써 프로세스들을 관리합니다.

프로세스 계층 구조 예시

만약 사용자가 컴퓨터 켜고 로그인 창을 통해 로그인해 bash 셸로 vim 문서 편집기 프로그램 실행했다고 가정했을 때 프로세스 생성 순서는 다음과 같습니다.

  1. 사용자가 컴퓨터를 켠 순간 생성된 최초 프로세스는 로그인 담당 프로세스 생성
  2. 로그인 프로세스는 bash 셸 자식 프로세스 생성
  3. bash 프로세스는 vim 프로세스 생성

 

스레드

프로세스를 구성하는 실행의 흐름 단위로 하나의 프로세스는 여러 개의 스레드를 가질 수 있고 스레드를 이용해 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있습니다.

단일 스레드 프로세스와 멀티 스레드 프로세스

전통적인 관점에서 하나의 프로세스는 한 번에 하나의 일만 처리했으며 '실행의 흐름 단위가 하나'라는 점에서 이렇게 실행되는 프로세스들은 단일 스레드 프로세스라고 합니다.

하지만 스레드라는 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었습니다. 즉, 프로세스를 구성하는 여러 명령어들이 동시에 실행할 수 있게 되었으며 이를 멀티 스레드 프로세스라 합니다.

스레드는 프로세스 내에서 각기 다른 스레드 ID, 레지스터값, 스택으로 구성되며 스레드마다 각자의 값을 가지기에 각기 다른 코드를 실행할 수 있습니다.

스레드의 구성 요소

프로세스의 스레드들은 실행에 필요한 최소한의 정보(레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행합니다. (코드, 데이터, 힙 영역 공유)

또한 최근에 많은 OS는 CPU에 처리할 작업을 전달시 프로세스가 아닌 스레드 단위로 전달합니다.

 

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

멀티 프로세스 - 여러 프로세스를 동시에 실행하는 것
멀티 스레드 - 하나의 프로세스 안에서 여러 스레드가 동시에 실행되는 것

그렇다면 단일 스레드 프로세스를 여러개 실행하는 것(멀티 프로세스)과 하나의 프로세스에 여러 스레드(멀티 스레드)로 실행하면 똑같지 않을까요?

프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유한다는 점에서 큰 차이가 발생하며 차이점은 다음과 같습니다.

멀티 프로세스

멀티 프로세스

  • 단일 스레드로 구성된 프로세스를 여러개 실행하는 경우
    • 같은 작업을 하는 동일한 프로세스를 여러개 실행하면 메모리에 동일한 내용들이 중복돼서 적재 → 낭비일 수 있음
    • 멀티 프로세스 환경에서는 하나의 프로세스에 문제가 생겨도 다른 프로세스에는 지장이 적거나 없음

멀티 스레드

멀티 스레드

  • 하나의 프로세스를 여러 스레드로 실행하는 경우
    • 스레드는 각기 다른 레지스터값, 스택을 가질뿐 프로세스가 가진 자원을 공유하기에 여러 프로세스 병행 실행보다 효율적인 메모리 사용 가능
    • 멀티 스레드 환경에서 하나의 스레드에 문제가 생기면 다른 스레드도 영향을 받을 수 있음 → 프로세스 전체에 문제가 생길 수 있음

 

정리

  • 프로세스는 실행 중인 프로그램으로 운영체제는 PCB를 통해 여러 프로세스를 관리
  • 프로세스 간에 실행을 전환하는 것을 Context Switching이라고 함
  • 프로세스 사용자 영역에는 코드, 데이터, 힙, 스택 영역으로 나뉘어 배치됨
  • 많은 운영체제는 프로세스가 프로세스를 낳는 프로세스 계층 구조(부모 프로세스, 자식 프로세스)로 프로세스들을 관리
  • 스레드는 프로세스 내의 실행 흐름 단위를 의미
  • 여러 프로세스를 동시에 실행하는 것을 멀티 프로세스, 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티 스레드라고 함

 

Q&A

공부를 하기 전 궁금했던 부분으로 다음과 같은 답을 알 수 있었습니다.

  • Q) 멀티 프로세스와 멀티 스레드가 있다면 멀티 프로세스가 훨씬 좋은 거 아닌가? (스레드는 프로세스의 일부일뿐이니까)
    • A) 프로세스는 독립적이기에 같은 프로세스를 여러개 실행하면 메모리에 동일한 내용들이 중복 존재하기에 낭비일 수 있음, 하지만 한 프로세스에 문제 생겨도 다른 프로세스에는 지장이 적거나 없음
    • A) 스레드는 프로세스 자원을 공유하기에 메모리 효율성이 더 좋을 수 있지만 하나의 스레드에 문제 생기면 다른 스레드도 영향 받을 수 있음
    • A) 결론적으로 뭐가 좋다, 나쁘다라고 결론 내릴 수 없으며 장단점이 존재함
  • Q) cpu의 코어들은 여러 프로세스를 처리? 아니면 여러 스레드를 처리?
    • A) 최근 많은 OS는 CPU에 처리할 작업을 전달시, 프로세스가 아닌 스레드 단위로 전달

 


참고 자료

https://m.hanbit.co.kr/media/books/book_view.html?p_code=B9177037040 

 

혼자 공부하는 컴퓨터 구조+운영체제

어려운 컴퓨터 구조와 운영체제의 원리를 누구나 쉽게 이해할 수 있도록 용어와 개념은 한 번 더 풀어쓰고, 적절한 예시와 이해하기 쉬운 그림으로 재미있게 구성했다. 또한 일상 소재를 활용한

m.hanbit.co.kr

https://library.gabia.com/contents/infrahosting/1227/

 

가비아 라이브러리

IT 콘텐츠 허브

library.gabia.com