본문 바로가기
iOS/Combine

[iOS/Combine] CPU와 코어, 그리고 프로세스와 스레드의 개념

by iosdevlime 2023. 4. 3.

동기, 비동기, 동시성 프로그래밍, 스레드, 큐.. 

프로그래밍을 학습하는 과정에서 느닷없이 마주치게 되는 익숙한 용어지요?

 

하지만,

프로그래밍을 언어(문법) ➟ 개발 프레임워크(UIKit, SwiftUI) 순서로 접한 저로서는

막상 두렵고, 어렵기만 한 해당 용어와 개념을 접근하기엔 상당히 부침이 있었습니다.

(🫣 언제 써야되는거고, 왜 써야하는거지?)

 

사실, 바로 Combine을 살펴보고자 했는데..

관련된 CS 기본 개념에 대한 이해가 필요할 것 같아

 

아래와 같은 주제로 3회차에 걸친 포스팅을 통해 확실하게 짚고 넘어가볼까 합니다.

  • 1차 : CPU와 코어, 프로세스와 스레드
  • 2차 : 동시성 프로그래밍의 중요성과 큐(Queue)의 역할 
  • 3차 : 스레드 작업처리 방식과 큐의 작업 분산방식

(Combine을 코드로 다루는 것은, 그 이후에..)

 

 

[참고링크]

- CPU 코어와 스레드  (https://www.youtube.com/watch?v=_dhLLWJNhwY)

- iOS 동시성 프로그래밍 (https://www.youtube.com/watch?v=F1ovBEBGHeM)

- 동시성, 비동기 프로그래밍 (https://www.boostcourse.org/mo326/lecture/16866?isDesc=false)

 

 


 

 

 

CPU와 Core(코어), 그리고 하드웨어 Thread(스레드)

프로세서(Processor)인 CPU와 코어(Core)1:1 혹은 1:n의관계를 가진다

 

CPU(Central Processing Unit), 즉 컴퓨터의 뇌 역할을 담당하는 하드웨어는

물리적 계산을 진행하는 '코어(Core)'라는 연산회로 유닛을 가지고 있습니다.

 

"아, 그렇다면 CPU 1개당 = 코어 1개가 존재하겠네요?"

 

이는 2005년 이전에 사용되고 있던 '싱글코어 CPU'에겐 해당되는 말이지만,

현재는 아시다시피 2코어(듀얼코어), 4코어(쿼드코어), 8코어(옥타코어)등을 지원함으로서

CPU와 Core의 관계는 1:1에서 ➟ 1:n으로 발전해왔습니다.

 

각각의 도구에 대한 상세한 내용을 살펴보기에 앞서,

아래와 같은 예시를 활용하여 보다 쉽게 개념에 대해 알아가 보도록 하겠습니다.

 

얼마전, 스타트업 회사를 개업한 👨🏻‍🦰Josh(사장)은
👩🏻‍💻Kate라는 직원과 함께 모바일 앱을 개발 중이다.

 

 

CPU(Central Processing Unit) ➟  👨🏻‍🦰Josh (사장)

  • CPU는 기억, 연산, 제어 등 컴퓨터의 논리적 사고담당하는 일종의 '뇌' 역할을 담당합니다.
    • 이는 하드웨어(HW)측면에서 컴퓨터 내 프로그램을 수행하며, 프로세서(Processor)의 일원입니다.
    • 프로세서(CPU)가 2개 운용된다면 듀얼 프로세서, 다중 프로세서를 가지면 멀티 프로세서라고 합니다.
      (프로세서라는 용어는, 점차적으로 CPU로 대체되어 사용됩니다)

 

Core(코어)  👩🏻‍💻Kate (직원)

  • Core는, CPU에 있어서 실제로 작업을 담당하는 주요 연산회로 입니다.
    • 각종 연산작업을 하는 CPU의 핵심 요소입니다.
    • CPU(뇌)의 실질적인 업무를 담당하게 되며, 직원(Kate)으로 비유할 수 있습니다.
  • CPU가 1개의 Core, 혹은 그 이상을 보유하고 있는 경우 다음과 같이 표현합니다.
    • 싱글 코어 : 하나의 CPU에 하나의 Core가 내장되어 있는 것 (직원 1명)
    • 듀얼 코어 : 하나의 CPU에 2개의 Core가 내장되어 있는 것 (직원 2명)
    • 멀티 코어 프로세스 : 여러개의 코어를 가진 CPU (직원 n명)

 

싱글 코어와 듀얼 코어 (코어-직원-의 수에 따른 차이)
싱글 코어와 듀얼 코어 (코어-직원-의 수에 따른 차이)

 

 

 

Hardware Thread (스레드) 🖥️ (모니터)

  • 하드웨어 측면에서의 Thread란, Core가 할 수 있는 최소 단위의 일(혹은 도구)을 의미합니다.  
    • Core는, 기본적으로 1개의 Thread를 보유하고 있습니다 (1:1 관계)
    • 하이퍼스레딩(Hyper-threading)기술이 도입됨에 따라 2개 이상의 스레드를 지원할 수 있습니다 (1:n 관계)
  • 예시를 통해 살펴보자면, 직원들은 기존 1대의 모니터가 아닌 듀얼모니터를 보유하게 됩니다.
    • 기존 직원1명 당 1대의 모니터를 이용하다 보니, 업무의 효율이 떨어지는 일이 발생합니다.
    • 따라서, 2대의 모니터를 보유함으로서 다중적 업무처리가 가능해집니다.

코어와 스레드(하드웨어)의 관계

 

 

 


 

 

 

프로세스(Process)와 스레드(Thread)

프로그램이 작동되는 과정은 프로세스(Process), 프로세스 내 일련의 작업 흐름은 스레드

 

위에서부터 쭈욱 살펴본 내용을 예시와 함께 정리하자면 아래와 같습니다.

  • CPU(Processor) : 논리적 사고를 담당하는 사장님 Josh 👨🏻‍🦰
  • Core : CPU의 논리적 사고를 바탕으로 연산업무를 처리하는 직원 Kate 👩🏻‍💻
  • Thread(H/W) : Core가 할 수 있는 최소한의 작업단위이자 도구, 모니터 🖥️

 

그렇다면,

이러한 도구들이 실제 작동하고, 업무를 수행하는 과정은 어떻게 진행될까요?

 

 

그 전에, 활용 가능한 예시를 다시 한번 더 정의하고 넘어가도록 하겠습니다.

 

 

👨🏻‍🦰Josh(사장)새로운 프로젝트를 구상중이다.
해당 프로젝트는 다음주 월요일부터 진행될 예정이다.
(일이 바빠질것 같아, 새로운 직원 Jason👨🏽‍💻을 추가로 고용했다)

 

 

 

Program (프로그램)   💡프로젝트

  • 프로그램이란, 컴퓨터에서 실행할 수 있는 파일(.exe, .dmg)을 의미합니다.
    • 아직 해당 파일을 실행하지 않은 상태이므로, 정적 프로그램(Static Program)이기도 합니다.
    • 쉽게 말해, Swift나 C언어, JAVA와 같은 프로그래밍 언어로 작성된 코드 모음입니다.
  • 프로그램은 결국 아직 진행되지 않은 '프로젝트'와도 같습니다.
    • 실질적으로 프로젝트는 시작되지 않았으므로, 추진(구동)작업이 필요한 상황입니다.
    • 프로젝트가 실행되는 과정이 바로 '프로세스(Process)'입니다.

 

 

 

Process(프로세스)   ⚙️ 프로젝트 진행과정

  • 프로세스란, 프로그램을 실행시켜 동적상태로 변환, 작업중인 프로그램을 의미합니다.
    • 정적인 프로그램이 실행되는 순간, 메모리(Memory)상에 올라갑니다.
    • CPU로부터 자원을 할당받아 프로그램 내부에 있는 코드가 실행되고 있는 상태 ing 입니다.
  • 프로세스는 메모리 상에 할당될 시, 각각의 '독립된 메모리 영역'을 각자 할당 받게됩니다.
    • 프로그램을 실행할 경우, Code, Data, Stack, Heap 영역에 데이터가 할당됩니다.
    • 메모리 할당 및 구조에 대한 내용은 CS관련 포스팅을 참고해주시길 바랍니다.

1:1 관계의 프로그램과 프로세스
1:1 관계의 프로그램과 프로세스

 

  • 효율적인 작업을 목표로 멀티 프로세스(Multi Process)를 진행할 수 있습니다. 
    • 프로그램 1 : 프로세스 1 관계가 아닌, 프로그램 1 : 프로세스 n 관계로 구성합니다.
    • 각각의 프로세스는 ①별도의 작업(Task)을 수행하며, ②독립적인 메모리가 할당 됩니다.

1:N 관계의 프로그램과 프로세스 (멀티 프로세싱)
1:N 관계의 프로그램과 프로세스 (멀티 프로세싱)

 

  • 멀티 프로세싱의 경우, 독립된 메모리 영역을 할당받아 안정성이 높다는 장점이 있습니다. 
    • 예시로 살펴보자면, 디자인(Process)개발(Process)병렬형으로 진행되고 있습니다.
    • 따라서, 각각의 독립된 구조로서 진행되므로 서로의 자료구조에 대해 접근할 수 없습니다.
      (만약, 접근이 필요한 경우 파일, 소켓 등 프로세스 간 통신 IPC를 사용해야 합니다)
  • 반면에, 메모리 영역을 병행하여 할당하는 과정에서 CPU의 부담이 매우 증가합니다.
    • 각각의 프로세스는 별도의 메모리가 존재하므로, CPU의 부담과 오버헤드 발생 우려가 존재합니다.
    • 또한, 프로세스 간 독립된 구조는 오히려 자원 공유가 어렵다는 단점으로도 해석될 수 있습니다.

 

 

 

Software Thread (스레드)  📊 진행과정 내 개별 작업 흐름

  • 스레드(Thread)란, 프로세스(Process) 내부에 위치한 일련의 작업 흐름을 의미합니다.
    • 스레드는 프로세스 내부에서 동시에 다양한 작업을 수행할 수 있는 흐름(Thread)입니다.
    • 하나의 프로세스에, 다중의 프로세스가 존재한다면 이를 멀티(다중) 스레드라고 부릅니다.
  • 스레드(Thread)는 Code, Data, Heap 메모리 영역은 공유, Stack만 독립적으로 할당 받습니다.  
    • 공유 영역이 존재하기 때문에, CPU는 비교적 낮은 부담(빠른 Context Switching)을 갖게 됩니다.
    • 또한, Stack 영역을 제외한 나머지 영역을 공유하므로 데이터 간 통신이 수월합니다.

멀티 스레드(Multi Thread) 작업 예시
멀티 스레드(Multi Thread) 작업 예시

 

  • 다만, 스레드(Thread)는 자원 공유로 인한 동기화 문제가 발생할 가능성이 존재합니다.
    • 공유영역의 데이터(자원)을 특정 스레드가 변경한다면, 타 스레드에선 영향을 받게 됩니다.
    • 이는 동기화 문제로, 특정 스레드에서 발생된 문제가 전체 프로그램의 문제로 번질 수 있습니다. 

 

 


 

간단한 예시를 통해 CPU와 코어, 그리고 프로세스와 스레드에 대해 알아보았습니다.

 

다음 포스팅에서는

Combine을 다루기에 앞서 알아두어야 할 주요 개념인

시성 프로그래밍과 비동기 프로그래밍 (Sync, Async)에 대해 알아보도록 하겠습니다. 

 

 

댓글