-
Concurrent ProgrammingSwift 2021. 1. 7. 19:13
안녕하세요. 그린입니다!
이번 포스팅에서는 Concurrent Programming(동시성 프로그래밍)이 무엇인지 그리고 어떻게 사용하는지에 대해 알아보려합니다.
우선, 동시성 프로그래밍을 알기전 전반적으로 알아봐야될 개념에 대해 이야기해보겠습니다.
1. Concurrent VS Parallelism
-. Concurrent Programming(동시성 프로그래밍)
: 여러 작업을 동시에 싱글 혹은 여러 코어(CPU)에서 나눠서 처리하는것이다.
싱글코어라면 시간 분할 방식을 이용하여 스레드를 서로 번갈아가며 제공하여 실제로 여러 프로그램을 돌리는것이 아니라
논리적인 관점에서 여러 작업들이 동시에 이뤄지는것처럼 보이게 하는 프로그래밍 (싱글코어 멀티스레딩 등..)
-. Paralleism Programming(병렬 프로그래밍)
: 하나의 같은 작업을 여러 하위 작업으로 나누고 여러 코어(CPU)에서 동시에 병렬적으로 작업을 수행하는것이다.
실제로 물리적으로도 동시에 실행됨으로 최소 멀티코어 이상부터 동작이 가능하다. task 주체에 따라 데이터 병렬성과
작업 병렬성으로 나눌 수 있다.
주로, 같은 task를 동시에 나눠 시키면 유리한 그래픽 카드와 같은 부분에서 이점이 있다.
-> 정리하자면 동시성과 병렬의 차이는 논리적인지 물리적인지로 볼 수 있다.
-> iOS 환경에서는 동시성과 병렬 중 무엇을 더 신경써야 할까?
: 물론 동시성과 병렬 두 부분 모두 신경을 쓰고 이용해야하지만, 주로 iOS 애플리케이션 환경에서는 그래픽 처리를 크게 하거나 하는 특수한 경우를 제외하고는 동시성 프로그래밍을 신경쓰는것이 좋다.
2. Synchronous VS Asynchronous
-. Synchronous(동기)
: 작업에 대한 요청과 결과를 동시에 실행하며 해당 들어온 작업이 처리될때 까지는 다른 작업의 요청을 받을 수 없다.
-. Asynchronous(비동기)
: 작업에 대한 요청과 결과를 동시에 실행하지 않기에 1번 작업에 대한 요청을 받고 결과를 처리하지 않아도 2번 작업에 대해
요청을 받는것처럼 중간에 다른 작업이 가능하다. 즉 자원 효율이 높다.
3. 애플에서 동시성/병렬 프로그래밍을 위해 지원하는 기술들
1) GCD(Grand Central Dispatch)
: 멀티코어 프로세서와 멀티프로세싱 환경에 최적화된 프로그래밍을 할 수 있도록 애플에서 프레임워크로 지원을 해준다.
Dispatch Queue를 사용하여 비동기적인 방식으로 쉽게 사용이 가능하다.
2) Operation Queue(연산 대기열)
: 비동기적으로 실행되야 하는 작업을 객체지향 방법으로 사용한다.
3) Thread
: 멀티스레드 프로그래밍을 위해 애플에서 제공해주는 스레드 클래스
-. GCD VS Operation
: 공통적으로는 동시성을 지원하기 위해 작업 단위를 캡슐화하여 실행에 넘기는 동작을 한다.
Operation이 GCD의 상위수준으로 추상화한 API로 GCD를 한번 더 포장한 상위 개념이다.
1) Operation의 특징 및 이점
-. 의존성을 제공하여 작업 순서를 결정할 수 있다. 다만 짧은 시간에 수십개의 작업 생성 시 오버헤드 문제점이 발생한다.
-. KVO를 통해 관찰할 수 있는 프로퍼티를 제공하여 모니터링에 이점이 있다.
-. 동시 수행될 수 있는 작업의 갯수를 정해줄 수 있다.
-. Life Cycle이 유연하다.
-. Operation은 Foundation에 들어있다.
-. 애플이 GCD보다 권장한다..?!
2) GCD의 특징 및 이점
-. Operation을 사용하여 구현하는것보다 적은 코드 라인수로도 구현이 가능하다.
-. FIFO의 형태로 들어오지만 순서 관계없이 Concurrent하게 작업 진행이 가능하다.
-. 속도적인 측면에서 이점이 있다.
-. GCD는 별도 프레임워크가 존재한다. (Dispatch를 사용하기 위한 프레임워크 = GCD)
-> Thread를 직접 구현하며 우선순위를 모두 지정해주는 일련의 과정을 구현하기 어렵다면 GCD 사용을 권장한다.
4. Dispatch Queue
: 사용자 지정 작업 실행을 위한 C기반 매커니즘
Queue -> serial: 한번에 하나의 작업
-> concurrent: 동시에 여러 작업
5. Task VS Thread VS Process
-. Task: 수행해야 할 추상적인 작업 개념
-. Thread: 하나의 프로세스 내에서 실행되는 작업 흐름의 단위
-. Process: 프로그램 구동을 위해 프로그램 자체와 상태가 메모리상에서 실행되는 작업 단위
-. 메인스레드: 프로그램 실행과 동시에 동작한다. (그 외 파생되어 생성된 순서에 따라 서브스레드, 세컨더리스레드 등..으로 나타낸다.)
-. 멀티스레딩: 프로세스에서 둘 이상의 스레드를 동시에 실행하는것이다.
-> 직접 스레드 작성하기 보다는 앱이 특정 task를 정의한 후 시스템이 이를 수행하도록 하는것이 편리하다.
이렇게 이번 포스팅에서는 앱을 구현하면서 자주 마주치게될 동시성에 대해 다뤄보았습니다.
동시성과 병렬에 대해 많이 헷갈리지만 앱을 구현하며 실제로 GCD와 Operation을 구현해보면 차이를 익혀갈 수 있을것 같습니다.
감사합니다 :D
'Swift' 카테고리의 다른 글
CFAbsolute TimeGetCurrent (0) 2021.01.15 메모리 구조 & ARC (0) 2021.01.11 인스턴스 생성 및 소멸 (0) 2020.12.28 JSON 데이터 다루기 (0) 2020.12.23 고차함수와 함수형 프로그래밍 (0) 2020.12.18