티스토리 뷰

iOS

iOS) About GCD(Grand Central Dispatch) / Dispatch Queue

행복하고 싶은 사람 2022. 12. 27. 01:11

Dispatch Queue를 사용하면서 GCD를 한번쯤은 들어보셨을 겁니다.

이번엔 GCD/ Dispatch Queue에 대해 알아보겠습니다.

 

GCD

Dispatch, also known as Grand Central Dispatch (GCD), contains language features, runtime libraries, and system enhancements that provide systemic, comprehensive improvements to the support for concurrent code execution on multicore hardware in macOS, iOS, watchOS, and tvOS.

공식 문서를 보면 이렇게 써있습니다.

GCD는 멀티 코어 시스템에서 동시 코드 실행을 지원하기 위해 체계적이고 포괄적인 개선을 제공하는 언어 기능, 런타임 라이브러리 및 시스템 향상을 포함한다.

 

GCD의 장점

- 코드 단순화

- 스레드 관련 코드 삭제

- 스레드 스택 저장을 위한 페널티 감소

이정도가 될 수 있겠네요

 

DispatchQueue

dispatch queues를 사용하면 비동기/ 동기 방식으로 임의의 코드 블록을 수행할 수 있습니다. 

그니까 Dispatch Queue를 사용하면 개발자가 스레드를 각각 관리하지 않고 작업을 정의해서 Dispatch Queue에 넣어만 주면 알아서  실행해주는 거죠 참 간편한 기능이죠?

 

DispatchQueue의 사용법에 대해 알아보겠습니다

DispatchQueue에는 두가지 종류가 있습니다

 

Serial

Concurrent

 

Serial은 하나의 작업이 끝나야 다음 작업이 시작되는 queue입니다

Concurrent는 동시에 여러 작업들이 실행되는 queue입니다. 동시에 여러 작업들이 실행된다고 순서 없이 되는게 아니라 queue니까 순서대로 실행된다고 하네요

출처: https://www.raywenderlich.com/148513/grand-central-dispatch-tutorial-swift-3-part-1

 

Cocoa Application은 미리 만들어진 2가지 queue를 제공합니다 흔히 사용하던 main과 global이죠

 

먼저 main을 볼게요!

main dispatch queue는 앱의 main 스레드에서 task를 실행하는 serial queue입니다. Main Queue는 메인 스레드에서 동작하기 때문에 단 하나만 존재하고 큐에 들어오는 작업을 순차적으로 실행합니다. 그리고 중요한 역할이 있는데 UI를 담당하는 것입니다.

그래서 main dispatch queue에는 UI 관련된 task만 넣어야만 한다고 합니다.  왜??

-> main dispatch queue는 serial이니까 이전 task가 끝나야 다음 task가 실행되잖아요 그런데 main task에 UI관련이 아닌 파일 다운로드, 업로드 요런게 들어가면 사용자 입장에서 앱이 멈췄다고 생각할테니 main dispatch queue에는 UI 관련 task만 넣어야 한다고 알고있습니다

 

다음은 global queue입니다.

global dispatch queue는 동시에 하나 이상의 task를 실행합니다.

global dispatch queue에는 파라미터로 qos라는게 들어갑니다.  qos란? Quality of Service란 뜻으로 중요도로 보면 됩니다. 요걸로 task의 우선순위를 정하는 것이죠

 

qos에는

- userInteractive - 진짜 중요 지금 당장 해야함

- userInitiated - 거의 바로 해줘야 함. 사용자가 기다림

- defailt: 디폴트

- utility: 시간이 좀 걸리는 일들. 사용자가 당당 기다리지 않는 task

- background : 사용자한테 당장 인식될 필요가 없는것들

이렇게 다양한 종류가 있습니다

 

DispatchQueue.global(qos: .userInitiated).async {
    //code
}

이런 식으로 QoS를 적절하게 지정해주면 앱의 효율이 좋아진다네요!!!

 

그리고 custom Queue를 만들 수도 있긴합니다

let concurrentQueue = DispatchQueue(label: "concurrent", qos: .background, attributes: .concurrent)
let serialtQueue = DispatchQueue(label: "serial", qos: .background)

요런 식으로 말이죠

 

snyc, async

Sync는 큐에 작업을 등록한 이후에 해당 task가 완료될 때 까지 코드를 실행지 않고 기다립니다.

Async는 큐에 task를 등록한 이후에도 다른 코드를 실행합니다

 

serial, concurrent 모두 sync, async 둘다 사용할 수 있습니다.

저도 처음 볼때 헷갈렸는데요 concurrent, serial은 큐에 들어온 task를 어떻게 처리하냐에 대한 문제였고

sync, async는 Dispatch Queue에 task를 등록하는 주체에 대한 문제입니다

main.sync는 안됩니다@!

Main DispatchQueue에서 snyc를 사용하면 메인 스레드는 그대로 진행을 멈추고 등록한 작업이 끝날때까지 기다리게 됩니다. 그리고 큐에 등록돤 task는 메인 스레드에 할당됩니다. 그런데 메인 스레드는 이미 아무것도 못하는 상태이기 때문에 작업을 수행할 수 없고 결국 데드락(deadlock)상태에 빠지게 됩니다

 

sync, async에 대한 예시는 

https://zeddios.tistory.com/516

 

iOS ) GCD - Dispatch Queue사용법 (1)

안녕하세요 :) Zedd입니다.ㅂㄷㅂㄷ 다시 쓰겠음 의 앞부분을 읽고오시면 도움이 될 것 같아요. GCD에 대한 개념?은 건너뛰고 사용법만 볼거라..그리고 글에서 문서를 그만읽는다고 했었는데, 문서

zeddios.tistory.com

제드님이 보기 좋게 정리해 놓으셨더라구요 

가서 보시는거 추천드립니다

 

참고

https://developer.apple.com/documentation/dispatch/dispatchqueue

 

Apple Developer Documentation

 

developer.apple.com

https://zeddios.tistory.com/516

 

iOS ) GCD - Dispatch Queue사용법 (1)

안녕하세요 :) Zedd입니다.ㅂㄷㅂㄷ 다시 쓰겠음 의 앞부분을 읽고오시면 도움이 될 것 같아요. GCD에 대한 개념?은 건너뛰고 사용법만 볼거라..그리고 글에서 문서를 그만읽는다고 했었는데, 문서

zeddios.tistory.com

https://jeonyeohun.tistory.com/279

 

[Swift] GCD(Grand Central Dispatch) - Dispatch Queue

GCD(Grand Central Dispatch)랑 Dispatch Queue랑 같은거야? 이 포스트를 준비하면서 "우리는 왜 Dispatch Queue를 GCD라고 할까?"라는 의문이 먼저 들었습니다. 그래서 공식문서를 찾아보니 GCD와 Dispatch Queue는 내

jeonyeohun.tistory.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함