[Swift] Concurrency Programming - 1

Martin Kim·2022년 2월 9일
0

swift-concurrency

목록 보기
2/4

Concurrency Programming

  • 멀티 스레드 환경에서 여러 가지 작업을 동시에 처리하는 기술을 말한다.

용어 정리

코어

  • CPU의 핵심으로 CPU에서 실제로 연산을 처리하는 역할 (노예)
  • 코어는 한번에 한가지 역할만 수행할 수 있다.
  • 하지만 실제로는 싱글 코어의 컴퓨터 역시 여러가지 일을 한번에 처리 할 수 있는데 이처럼 여러 가지 작업을 시분할로 나누어 번갈아 가며 처리하는 것을 동시성 프로그래밍이라고 한다.
  • 요리를 예시로 들면 여러 요리를 해야 할 때 오래걸리는 물 끓이기를 먼저하고... 물 끓는 동안 재료 썰고....

스레드

  • 하드웨어에서의 스레드와 소프트웨어에서의 스레드로 나뉜다.
  • 하드웨어에서의 스레드는 하이퍼스레딩 기술을 이용하여 하나의 코어로 2가지 작업을 동시에 수행할 수 있도록 하는 논리적인 '코어'로 예를 들어 1코어 2스레드라면 실제로 코어는 1개이지만 코어가 2개인 것처럼 작업을 처리한다.
  • 소프트웨어에서의 스레드는 논리적인 '스레드'로 프로세스(프로그램) 내부에서의 작업 단위가 되는 가상의 스레드이다. 여기서 스레드는 프로그램의 작업을 처리하는 녀석들을 말한다.
  • 우리가 주목할 것은 소프트웨어에서의 스레드로, 동시성 프로그래밍이란 소프트웨어에서의 멀티 스레딩을 이용한 기술이다. 즉 여러 스레드를 이용하여 여러 작업을 동시에 처리하는 것이다.
  • 소프트웨어에서의 스레드는 가상으로 만들어진 스레드이기 때문에 물리적인 스레드 갯수와는 상관없이 많은 스레드를 만들 수 있다.

병렬 프로그래밍

  • 여러 개의 CPU(코어)가 하나의 작업(Task)을 분담해서 처리하는 프로그래밍.
  • 그렇기 때문에 실제 물리적으로 멀티코어인 환경에서만 처리가 가능하다.

동시성 프로그래밍

  • 논리적으로, 여러 개의 스레드를 사용하여 동시에 여러 작업을 처리하는 프로그래밍.
    concurrency
    배고파지네...
  • 위 그림과 같이 여러 스레드를 조금씩 번갈아 가며 작업을 처리하는데 이렇게 작업을 전환하는 것을 Context Switching 이라고 한다.

    Context Switching: 현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정 (위키피디아)

직렬성 프로그래밍

  • 동시성 프로그래밍과 반대되는 프로그래밍으로 단 하나의 스레드 만을 사용하는 프로그래밍. 즉 동시에 여러 작업을 처리할 수 없다.

동기

  • 작업이 끝나기를 기다리는 것
  • 작업이 끝나야 다음 작업으로 넘어가겠다는 뜻

비동기

  • 작업이 끝나기를 기다리지 않는다
  • 작업이 끝나기를 기다리지 않고 바로 다음 작업을 시작한다.

주의할 점

  • 동시성/직렬성은 동기/비동기와 반대되는 개념이 아님.
    - 동시성: Serial이냐, Concurrent인가는 스레드가 단일 스레드인가, 다중 스레드인가의 구분
    - 동기/비동기: 스레드의 수와는 무관하게 작업이 끝나기를 기다리냐, 기다리지 않느냐의 구분
  • 여러가지 일을 여러 코어에서 작업하는 것은 병렬 프로그래밍이 아니다.
    - 정확히 말하자면 병렬 프로그래밍일 수도 있고 아닐 수도 있다.
    - 병렬 프로그래밍은 하나의 일을 여러 코어가 분담해서 처리하는 것이기 때문이다.

동시성 프로그래밍이 필요한 이유?

  • 효율적이고, 사용성, 반응성이 좋은 소프트웨어를 위해서
    - 예를 들어, 이미지 로딩 등

Swift에서 동시성 프로그래밍을 구현하는 방법

  • GCD
    - 가장 먼저 등장
  • Operation
    - GCD를 기반으로 등장
  • async, await
    - swift 5.5버전 부터 등장

출처: 야곰 닷넷 동시성 프로그래밍 강좌

profile
학생입니다

0개의 댓글