갬장장이
쓰레드와 프로세스, CPU 병렬 처리와 동시 처리
갬장장이
갬장장이의 코드 대장간
갬장장이
전체
오늘
어제
  • 분류 전체보기 (216)
    • 게임 연구소 (6)
    • 게임 제작 (15)
      • We need more guns (2024~) (1)
      • Rovenhell (2023) (2)
      • Geophyte (2020~2021) (5)
      • 아드레날린 러시 (2021) (2)
      • Treadmill (2019) (1)
      • 습작들 (2019~) (2)
      • 그 외 (~2018) (2)
    • mathematics (33)
      • game mathematics (30)
      • linear algebra (3)
    • networking (3)
    • computer graphics (46)
      • 3D Graphics (23)
      • DirectX (8)
      • OpenGL (13)
      • graphics theory (2)
    • game engines (10)
      • Unity (0)
      • Unreal Engine (10)
    • os (6)
      • Linux (0)
      • operating system (1)
      • multithreading, parallel co.. (5)
    • lang (34)
      • c++ (15)
      • .NET (5)
      • python (1)
      • java (3)
      • erlang, elixir (1)
      • js, ts (7)
    • software engineering (47)
      • PS (25)
      • algorithms (15)
      • data structures (2)
      • design patterns (4)
    • cs (4)
    • database (2)
      • SQL (1)
    • web (6)
      • web (3)
      • frameworks, libraries (3)
    • finance (0)
    • 음악 제작 (1)
    • life (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • [공지] 블로그 안내

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.
os/multithreading, parallel computing

쓰레드와 프로세스, CPU 병렬 처리와 동시 처리

2021. 1. 3. 09:29
목차
  1. 프로세스(Process)
  2. 쓰레드(Thread)
  3. CPU의 병렬 처리(Parallal Processing), 동시 처리(Concurrent Processing)

 

프로세스(Process)

운영체제로부터 메모리를 할당받아 실행되는 작업(task)의 단위.
더보기

Task vs Process

호기심에 찾아보았는데, task와 process는 거의 같은 의미로 사용되지만 엄밀히 따졌을 때 약간의 차이가 있다고 한다.

 

Process는 메모리 상에서 Input/output 작업을 포함하지 않고 실행되는 작업을 의미하고, Task는 Input/output을 포함하는 작업을 의미한다. 따라서 "멀티태스킹" 이 가능하다는 것은 동시에 여러 I/O Stream을 실행할 수 있다는 것을 의미하고, "멀티프로세싱"이 가능하다는 것은 동시에 여러 프로세스에서 연산이 일어날 수는 있지만, I/O Stream은 하나만 존재하며 이를 여러 프로세스에서 바꿔가며 사용한다는 것을 의미한다.

 

"Strictly speaking, "processing" is work performed in memory that does not involve input/output operations. A "task" is a process that includes I/O operations. Accordingly, a multi-tasking system can run concurrent I/O streams, whereas a multi-processing system must task switch its I/O. PC's have only one mouse, keyboard, etcetera, so they are not multi-tasking systems to me. I consider a mainframe to be a multi-tasking system."

참고: stackoverflow.com/questions/2560939/task-vs-process-is-there-really-any-difference

하나의 프로세스는 하나의 Heap, Static, Code 메모리를 할당받고, 여러 스레드를 보유할 수 있다.

 

하나의 프로세스가 중지되고 다른 프로세스가 실행되는 등, 프로세스의 실행 상태가 변할 때 Context Switching이 일어난다.

 

일반적인 상황에서 프로세스들은 서로 영향을 주지 않고, 서로가 서로의 메모리에 접근할 수 없다.

 

쓰레드(Thread)

하나의 프로세스 내에서 프로세스의 자원을 사용하며 실행되는 실행 흐름(flow)의 단위.

하나의 스레드는 자신만의 Stack, Register을 할당받는다.

자신만의 스택을 할당받았기 때문에 스레드에서는 독립적인 함수 호출이 가능하고, 따라서 하나의 스레드는 독립적인 실행 흐름(flow)를 갖는다.

 

Heap, Static, Code 메모리의 경우, 스레드는 자신이 속한 프로세스의 메모리를 사용한다.

때문에 하나의 프로세스 내에 속한 스레드들은 일부 메모리를 공유하며, 서로 빠르게 통신이 가능하다.

 

프로세스와 마찬가지로, 스레드에서도 실행, 준비, 대기 등 실행상태가 변할 때마다 Context Switching이 일어난다. 그러나 이는 프로세스에 비해 훨씬 빠르게 일어난다.

더보기

<스레드의 Context Switching이 프로세스보다 더 빠른 이유>

CPU는 연산을 처리할 때 캐쉬 메모리에 자주 사용하는 데이터를 저장한다.

 

만약 프로세스에서 Context Switching이 발생할 경우, 프로세스 간에는 메모리를 공유하지 않기 때문에 캐쉬 메모리를 리셋한 후 새로 불러와야 하는데,

반면 스레드에서 Context Switching이 발생한 경우, 스레드 간에는 일부 메모리를 공유하기 때문에 캐쉬 메모리를 리셋하지 않아도 된다.

그렇다면 멀티스레딩과 멀티프로세싱은 무엇일까?

이를 CPU가 어떻게 작업을 분할해서 처리하는지와 함께 살펴보자.

 

CPU의 병렬 처리(Parallal Processing), 동시 처리(Concurrent Processing)

 

 

<CPU의 코어를 Physical Core와 Logical Core로 분리하기도 하는데, 일반적으로 "코어"라고 하면 Physical Core을 가리킨다.>

CPU에는 코어와 스레드라는 개념이 존재한다.

하나의 CPU는 여러 개의 코어를 가질 수 있고, 하나의 코어는 여러 개의 스레드를 가질 수 있다.

 

이때, 서로 다른 코어에서는 병렬적으로 작업을 분산해 한 번에 처리할 수 있다. 

즉 하나의 작업을 쪼개 각각의 코어에서 동시에 처리할 수 있다.

이러한 과정을 병렬 처리(Parallel Computing)이라고 한다.

 

이와 굉장히 유사한 개념이 멀티 프로세싱(Multi Processing)인데, 병렬 처리가 하나의 큰 작업(one big task)을 여러 개로 분산하는 것이라면, 멀티 프로세싱은 여러 개의 작업(multiple tasks)을 동시에 진행하는 것이다.

(이 둘은 굉장히 비슷하기 때문에 거의 동의어처럼 사용되긴 한다)

 

CPU는 프로세스 단위로는 병렬적으로 연산이 가능하지만, 스레드 단위로는 병렬적으로 연산할 수 없다.

때문에 CPU는 스레드 하나를 실행하다 멈추고 다른 스레드를 실행하는 방식으로 동작하는데, 이러한 방식을 동시 처리(Concurrent Computing)라고 한다.

 

동시 처리와 유사한 개념이 멀티 스레딩(Multi Threading)이다. 멀티 스레딩은 겉으로는 여러 개의 스레드가 병렬적으로 진행되는 것 처럼 보이지만, 실제로는 CPU에서 Thread Context Switching을 반복하며, 하나의 코어에서 한 번에 하나의 스레드만을 실행한다. 

더보기

어차피 한 번에 하나의 스레드만이 실행된다면 왜 멀티스레딩을 사용할까?

 

만약 100% CPU 연산만으로 처리되는 프로그램이 있다면, 실제로 멀티 스레딩을 하면 그냥 실행했을 때보다 더 오랜 시간이 걸릴 것이다. Thread Context Switching에 추가적인 시간이 소모되기 때문이다.

그러나 대부분의 프로그램은 I/O나 네트워크의 영향을 받고, 이러한 시간동안 CPU가 가만히 쉬고 있는 것보다 쓰레드를 변경해 다른 연산을 수행하도록 하는게 전체 실행 시간을 줄일 수 있다.

 

참고 자료:

www.quora.com/If-a-computer-has-only-one-CPU-do-multi-threaded-programs-provide-any-performance-improvements-over-single-threaded-programs/answer/Lalit-Vatsal

 

지금까지의 내용을 예시로 정리해보자면,

CPU 코어 하나는 노동자 한 명이라고 할 수 있고,

코어의 스레드 하나는 해당 노동자가 일하는 컨베이어 벨트 하나라고 할 수 있다.

 

여러 노동자가 서로 다른 작업을 하는게 가능하지만, (프로세스 병렬 처리)

노동자는 한 번에 하나의 컨베이어 벨트에서만 일할 수 있다. (스레드는 병렬 처리 불가)

하지만 숙련된 노동자라면 여러 컨베이어 사이를 빠르게 옮겨가며 높은 능률을 보여줄 것이다. (스레드의 동시 처리)

 

공장에서 4명의 노동자가 역할을 나눠 한 종류의 장난감을 만들어내는 것은 병렬 처리로 볼 수 있고,

공장은 같아도 장난감 만드는 사람 1명, 샌드위치 만드는 사람 1명, 우산 만드는 사람 1명, 옷 만드는 사람 1명 이렇게 업무가 전혀 다르다면 이는 멀티 프로세싱으로 볼 수 있다.

 

노동자가 컨베이어 벨트를 바꾸는 걸 스레드의 Context Switching이라고 볼 수 있고,

(ex. 장난감 자동차의 바퀴를 조립하는 컨베이어 벨트에서 장난감 자동차에 스티커를 붙이는 컨베이어 벨트로 이동함)

노동자가 하는 작업의 종류 자체를 바꾸는 걸 프로세스의 Context Switching이라고 볼 수 있다.

(ex. 장난감 자동차 조립에서 샌드위치 포장으로 업무가 변함)

 

더보기

레퍼런스:

stackoverflow.com/questions/24513714/how-does-a-single-cpu-handle-multi-threaded-and-multi-process-applications

www.youtube.com/watch?v=hwTYDQ0zZOw&ab_channel=Max%27sTech

m.blog.naver.com/jjoommnn/130036290769

medium.com/@sanju.skm/parallel-programming-vs-concurrent-programming-f993d3f9ceea

저작자표시 비영리 변경금지 (새창열림)

'os > multithreading, parallel computing' 카테고리의 다른 글

메모리 정책(memory order), 메모리 장벽(memory fence/barrier)  (0) 2022.09.10
lock-free atomic calculation  (0) 2022.09.10
멀티스레드 환경에서 발생하는 문제들  (0) 2022.09.10
스레드의 race condition  (0) 2021.05.26
  • 프로세스(Process)
  • 쓰레드(Thread)
  • CPU의 병렬 처리(Parallal Processing), 동시 처리(Concurrent Processing)
'os/multithreading, parallel computing' 카테고리의 다른 글
  • 메모리 정책(memory order), 메모리 장벽(memory fence/barrier)
  • lock-free atomic calculation
  • 멀티스레드 환경에서 발생하는 문제들
  • 스레드의 race condition
갬장장이
갬장장이
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.