Serial Queue, Concurrent Queue, Sync, Async

박성민·2021년 1월 21일
0

iOS

목록 보기
8/31

Serial Queue

Serial Queue에 들어온 작업은 하나의 작업이 끝나야 다음 작업을 시작합니다.

"분산처리시킨 작업을 다른 한 개의 쓰레드에서 처리하는 큐"

Concurrent Queue

Concurrent Queue는 큐에 추가된 순서대로 작업 수행을 시작합니다. 동시에 여러 작업을 수행하므로 작업이 끝나는 순서를 알 수 없고, 큐에서 몇개의 작업이 수행중인지도 알 수 없습니다.

"분산처리시킨 작업을 다른 여러 개의 쓰레드에서 처리하는 큐"

Sync (Synchronous)

Synchronous 함수는 작업이 다 끝난 다음에만 현재의 queue에게 컨트롤을 넘깁니다. 그 전까지 현재의 queue 는 block 되어 작업이 끝날 때까지 기다려야 합니다.

원래의 작업이 진행되고 있던 곳(메인스레드)에서 디스패치 글로벌 큐로 보낸 작업을 동기적으로 기다립니다.

Async (Asynchronous)

Asynchronous 함수는 작업을 수행할 다른 큐에게 작업을 넘기자마자 현재의 queue에게 컨트롤을 돌려줍니다. 작업이 끝나기 전까지 기다릴 필요가 없으며 현재의 queue 도 block 되지 않습니다.

"원래의 작업이 진행되고 있던 곳(메인스레드)에서 디스패치 글로벌 큐로 보낸 작업을 기다리지 않습니다."

정리

async - concurrent

제어권이 즉시 main thread로 돌아간다. 큐에 있는 작업이 동시에 여러개가 동작하고 있을 수 있다.

async - serial

제어권이 즉시 main thread로 돌아간다. 해당 큐에 있는 작업이 단 한개만 동작하고 있다.

sync - concurrent

코드는 다른 thread에서 실행되지만 main thread에서는 해당 작업이 끝나기를 기다린다.(UI update같은 것들이 블럭됨) 큐에 있는 작업이 동시에 여러개가 동작하고 있을 수 있다. (async로 이미 작업들이 동작하고 있을 수 있다.)

sync - serial

코드는 다른 thread에서 실행되지만 main thread에서는 해당 작업이 끝나기를 기다린다.(UI update같은 것들이 블럭됨) 해당 큐에 있는 작업이 단 한개만 동작하고 있다.

Main Queue에서 Sync 함수를 부른다면??

Main queue는 serial queue입니다. Sync 함수를 부르면 main queue는 sync블럭의 task가 완료 될 때 까지 blocking waiting상대가 됩니다. 하지만 task는 메인 스레드에서 serial하게 실행되는 main queue에 들어있으므로 이미 block상태인 메인 스레드에서 작업은 영영 시작되지 않습니다.(DeadLock)

Quality of Service

QoS는 중요도와 우선순위에 따라 User-interactive, User-initiaded, Utility, Background 4가지로 구분됩니다.

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

2) userInitiated
userInteractive 정도는 아니더라도 유저가 빠른 결과를 기대할 때 사용하는 QoS입니다. 유저가 실행시킨 작업으로 Async하게 처리해야할 일들을 처리합니다. 유저가 UI상으로 블록을 당하지 않게 하면서도 빠른 결과를 기대할 때 사용합니다.

3) utility
시간이 다소 오래 걸리는 작업을 처리합니다. 유저에게 처리가 진행되는 모습도 보입니다. 프로그레스 바처럼 말입니다. 계산, I/O, 네트워킹, 데이터 피드 등의 작업에 주로 사용합니다.

4) background
유저가 인지하지도 못하는 뒷단에서 실행되는 작업들입니다. 유저 인터렉션이 필요한 것도 아니고 급히 필요하지도 않은 작업들이 수행되게 됩니다.

참고 및 출처

profile
iOS시작~

0개의 댓글