티스토리 뷰

728x90

비동기 처리기술 GCD, OperationQueue

GCD란..?

GCD란 뭘까요?? GCD는 Grand central Dispatch 의 약자로 멀티코어와 멀티 프로세싱 환경에서 최적화된 프로그래밍을 할 수 있도록 애플이 개발한 기술이에요. GCD를 가장 먼저 설명한 이유는, 앞으로 Swift에서 비동기 프로그래밍을 공부하기 위해 자주 사용하게 될 DispatchQueue가 GCD의 일부분이기 때문이죠.

프로그래머가 실행할 태스크(작업)을 생성하고 Dispatch Queue라는 큐에 추가하면 GCD는 앱이 실행될 때 태스크(작업)에 맞는 스레드를 자동으로 생성해서 실행하고, 
작업이 종료되면 해당 스레드 제거해주는 역할을 해줘요.

그럼 GCD를 알아봤으니 ... 이제 DispatchQueue라는 녀석에 대해 알아봐야겠죠..?

그 전에 앞으로 설명할 개념들을 이해하기 위해 알아야 될 개념들에 대해 설명하고 시작할게요! ㅠ _ㅜ..

알아야 할 내용들

  • 프로세스
  • 스레드
  • 비동기프로그래밍
  • 병렬성 프로그래밍
  • 동시성 프로그래밍

1. 프로세스

프로세스란 뭘까요?? 첫 면접때 이 질문을 받고 대답을 못했었는데.. 프로세스란 단순하게 실행중인 프로그램 을 프로세스라고 해요.

정확하게 말하면 하나의 프로그램이 메모리에서 적재되어 실행되는 작업 단위

프로세스는 스케줄링의 대상이 되는 작업(Task)과 같은 의미로 쓰여요..

프로세스의 적재 과정

  1. 프로세스는 실제 디스크에 있는 프로그램을 실행하게 되면, 실행을 하기 위해 메모리 할당되어지는 과정이 이루어 지고,
  2. 할당된 공간으로 바이너리 코드가 올라가게 되는데(메모리에 적재됨)
  3. 이 순간부터 프로세스라고 불러요.

프로세스 끝!

2. 스레드

스레드는 프로세스 내부의 작업 흐름, 단위에요. 크게 프로세스의 하위 작업들을 하나하나들을 스레드라고 생각하면 될거에요.

프로세스 > 스레드

그래서 프로세스 안에는 적어도 하나 이상의 스레드가 존재해요. 그런데 만약 하나보다 많은 2개 이상이 되면 스레드가 여러개 있는거자나요?? 그걸 멀티스레드 라고 해요!

스레드의 종류에는 메인 스레드, 서브스레드가 있는데, 메인스레드 는 프로그램이 시작될 때부터 동작하는 스레드를 메인스레드 라고 부르고,

그 이후에 생성되는 스레드들을 서브스레드 라고 불러요.

스레드의 생명주기

간단하게.. 생성 -> 설정 -> 수행 -> 종료 이런 과정을 거쳐요.

스레드 끝!

3. 비동기 프로그래밍

비동기 프로그래밍에 대해 알아보는거니 이게 뭔지도 알아야겠죠?? ㅋㅋ iOS에선 비동기 프로그래밍이 중요하더라구요. 그래서 이것도 면접 단골질문이라 생각하고.. 면접때 대답을 못했었습니다.. ㅠ _ㅜ.. 그래서 비동기 프로그래밍이란!

여러 작업을 처리할 때 하나의 작업이 끝나기까지 기다리지 않고 별도의 공간에 맡겨둔 뒤 다음 코드를 실행하는 병렬처리 방식의 프로그래밍 을 비동기 프로그래밍이라고 해요!

여러 공간에서 병렬적으로 일하게 만드는거죠.. 작업 큐에 넣어 다른 공간에 각각 스레드에서 수행시키는..

비동기 프로그래밍 끝!

4. 동시성 프로그래밍

동시성 프로그래밍은 이름만 봤을때는 동시에 일어나는거니깐 비동기네?? 라고 생각하기 쉽지만 아니에요!!

동시성 프로그래밍은 동시에 일어나는것이 아닌 시간을 분할해서 하나의 CPU가 여러 스레드를 번갈아 실행하게되면서 동시에 여러 프로그램이 동작하는 것처럼 보이도록 하는 프로그래밍 방식을 동시성 프로그래밍 이라고 해요.

동시에 X

동작하는것처럼 빠르게 O

동시성 프로그래밍 끝!

5. 병렬성 프로그래밍

동시성 프로그래밍과 다르게 여러 스레드를 여러 CPU가 실행해서 진짜로 여러 프로그램이 동작하는 프로그래밍 방식을 병렬성 프로그래밍이라고 해요.

병렬성 프로그래밍 끝!

고생하셧습니다.. 그럼 이제부터 DispatchQueue에 대해 알아볼게요..

디스패치 대기열(Dispatch Queue)

DispatchQueue는 위에서 설명드렸듯 GCD의 일부분으로써 작업(Task)항목의 실행을 관리하는 클래스 큐에요.

종류

DispatchQueue에는 Serial DispatchQueue와 Concurrent DispatchQueue 2가지 가 있어요

  • Serial DispatchQueue: 한번에 하나의 작업만 실행하며, 해당 작업이 대기열에서 제외되고 새로운 작업이 시작되기 전까지 대기

  • Concurrent DispatchQueue: 이미 시작된 작업이 완료될 때까지 기다리지 않고 가능한 많은 작업을 진행

    Concurrent DispatchQueue 이게 효율이 좋아 보이죠?? 그럼 DispatchQueue의 특징에 대해 알아볼게요.

DispatchQueue 특징

DispatchQueue는 작업을 연속적 or 동시에 진행하기는 하지만 언제나 먼저 들어오면 먼저 나가는 순서로 실행
되요!(FIFO - First in First out)

Swift에서의 DispatchQueue

Swift에서 앱 실행시 기본적으로 2개의 Queue를
생성해요. MainQueue와 GlobalQueue.

  • MainQueue: 메인 스레드에서 사용되는 Serial Queue 에요.
  • GlobalQueue: 편의상 사요할 수 있게 만들어 놓은 Concurrent Queue이고, GlobalQueue에는 처리 우선 순위를 위한 qos(Quality of service) 파라메터가 있어요.

GlobalQueue 에서의 qos

  • 1.userInteractive 중요도가 높고 즉각적인 반응이 요구되는 작업을 위해 가장 자원을 많이 쓰도록 하는 QoS 에요. UI 업데이트, 이벤트 핸들링 등 가볍고 신속히 처리가 필요한 작업 수행용이고 global queue 항목임에도 main thread에서 실행되는 qos입니다.

  • 2.userInitiated: userInteractive 정도는 아니더라도 유저가 빠른 결과를 기대할 때 사용하는 qos입니다.

  • 3.default

  • 4.utility: 시간이 다소 오래 걸리는 작업을 처리

  • 5.background: 유저가 인지하지도 못하는 뒷단에서 실행되는 작업들

  • 6.unspecified

DispatchQueue 끝!

연산 대기열 (Operation Queue)

OperationQueue는 뭘까요..? OperationQueue는 DispachQueue에 있었던 Concurrent DispatchQueue와 동일하게 작동하고 OperationQueue 클래스에 의해 구현되요.

이미 시작된 작업이 완료될 때까지 기다리지 않고 가능한 많은 작업 진행!

Operation은 백그라운드 스레드에서 실행할 Task를 캡슐화한 객체 입니다.

OperationQueue는 작업 실행순서를 결정할 때나 다른 요인들을 고려해서 순서를 정합니다.

GCD와 OperationQueue의 차이점

  • DispatchQueue는 FIFO / OperationQueue는 작업 실행순서를 결정할 때나 다른 요인들을 고려해서 순서를 정합니다.
  • Operation Queue에서는 동시에 실행할 수 있는 연산(Operation)의 최대 수를 지정할 수 있어요.
  • Operation Queue에서는 KVO(Key Value Observing)을 사용할 수 있는 많은 프로퍼티들이 있어요.
  • Operation Queue에서는 연산(Operation)을 일시 중지, 다시 시작 및 취소를 할 수 있어요.

그럼 둘 중 뭘 써야 할까요? =_=

  • OperationQueue : 비동기적으로 실행되어야 하는 작업을 객체 지향적인 방법으로 사용하는 데 적합해요. KVO(key Value Observing)를 사용해 작업 진행 상황을 감시하는 방법이 필요할 때도 적합합니다.

  • GCD : 작업이 복잡하지 않고 간단하게 처리하거나 특정 유형의 시스템 이벤트를 비동기적으로 처리할 때 적합해요. 예를 들면 타이머, 프로세스 등의 관련 이벤트입니다.

후.. 그럼 이만... 다들 새해 복 많이 받으세용~

728x90

'개발 블로그 > iOS' 카테고리의 다른 글

[Swift] 위젯을 만들기 2탄 (Today Extension, Widget)  (0) 2020.04.20
Swift Array 보고가실게요!  (0) 2020.01.05
[Swift] Optional이란..?  (0) 2019.12.20
[Swift]String 제대로 알고 가자!  (0) 2019.12.20
[Swift]ARC란..?  (0) 2019.12.18
댓글