티스토리 뷰

Tech/iOS

DispatchQueue 클래스

Ellie Kim 2019. 8. 8. 18:47

DispatchQueue는 앱의 메인 스레드 또는 백그라운드 스레드에서 작업을 직렬 또는 병렬로 실행을 관리하는 오브젝트입니다.

 

DispatchQueue는 DispatchObject를 상속하고 있는 클래스입니다.

DispatchObject는  OS_object를 상속하고 있으며 많은 디스패치 오브젝트 타입을 가집니다.

예를 들어 DispatchQueue, DispatchGroup, DispatchSource등이 있습니다.

또한 기본적인 디스패치 오브젝트 인터페이스를 사용하면 메모리 관리, 실행, 일시중지 및 재실행 등을 수행할 수 있습니다.

 

디스패치 큐는 앱이 블록 개체 형태로 작업을 제출할 수 있는 FIFO 큐입니다.

디스패치 큐는 작업을 순차적serially으로 또는 동시 concurrently에 실행합니다.

 

디스패치 큐에 제출된 작업은 시스템이 관리하는 스레드 풀에서 실행됩니다.

 

여기서 스레드 풀은 뭘까요  

스레드 풀은 작업 처리에 사용되는 스레드를 제한된 개수만큼 정해 놓고 작업 큐에 들어오는 작업들을 스레드가 맡아 처리하는 것을 말합니다.

 

다시 디스패치 큐를 살펴봅니다.

시스템은 앱에서 디스패치 큐 메인 스레드를 제외하고 작업을 실행하는데 사용하는 스래드를 보장하지 않습니다.

 

DispatchQueue는 동기 또는 비동기로 작업을 처리하는데

작업 항목을 동기적으로 하면 코드는 해당 항목이 실행 완료될 때까지 대기합니다.

작업 항목을 비동기식으로 하면 작업 항목이 다른 곳에서 실행되는 동안 코드가 계속 실행됩니다.

 

main Quque에서 작업항목을 동기식으로 실행하면 교착 상태 deadlock가 발생합니다.

여기서 데드락은 둘 이상의 스레드가 자원을 점유한 상태에서 서로 점유하고 있는 자원을 요구하며 무한정 기다리는 현상을 말합니다.

 

 

이 그림 많이 보셨쥬

운영체제 시간에 자주 봤던 차 막히는 그림 

볼 때마다 답답해서 빨리 페이지를 넘기곤 했는 사진

 

즉 교착상태가 발생해서 끝날 때까지 무기 한정으로 기다리고 있겠죠

그런 경우가 UI가 freeze되는 경우입니다.

 

그럼 스레드 여러 개로 두어 main을 안 막히게 하면 되지 않냐 

 

그렇다고 과도한 스레드를 생성해서도 안됩니다.

 

동시로 작업을 할 때는 현재 실행 스레드를 차단하는 메서드를 호출하면 안 됩니다.

동시 디스패치 큐에 의해 스케줄 된 태스크가 스레드를 차단하면, 시스템은 추가 큐를 만들어서 큐에 있는 다른 동시 태스크를 실행합니다.

너무 많은 작업이 차단되면 시스템에 스레드가 부족할 수 있습니다.

또한 동시 디스패치 큐를 너무 많이 만들어 많은 스레드가 생기게하면 안됩니다.

각 디스패치 큐는 스레드 자원을 소비하므로 추가 동시 디스패치 큐를 작성하면 스레드 소비 문제가 악화됩니다.

 

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

 

'Tech > iOS' 카테고리의 다른 글

제네릭,프로토콜로 dequeueReusableCell 처리하기  (0) 2019.08.16
DispatchGroup 클래스  (0) 2019.08.09
iOS NavigationBar 색 변경  (0) 2019.07.11
UIImageView ContentMode 종류  (0) 2019.04.29
iOS Application lifecycle  (0) 2019.04.05
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
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
글 보관함