GCD / Operation 의 선택
sync (동기) 와 async (비동기) 차이점을 배우면서, Task 2, 3, 4 를 Queue 에 보냈다.
이제 GCD or Operation 은 Queue 에 쌓여있는 Task 를 다른 Thread 로 보내야한다. 어떠한 방식으로 Thread 에게 Task 를 분배할까? 이는 바로 Queue 의 특성에 따라 결정된다.
Serial (직렬) 과 Concurrent (동시)
어떤 Queue 를 선택하느냐에 따라 Serial 과 Concurrent 로 나뉠 수 있다.
1. Serial (직렬) Queue
한 개의 Thread 에서 모든 Task 를 다 처리한다.
2. Concurrent (동시) Queue
여러 개의 Thread 에서 Task 를 처리한다.
Serial (직렬) 과 Concurrent (동기), 어떠한 상황일 때 사용할까?
1. Serial (직렬) Queue 에서의 작업
하나의 Thread 에만 Task 들이 분배되므로, 각 Task 의 시작과 종료에 대한 순서 예측이 가능하다. 즉, 순서가 중요한 작업을 처리할 경우 Serial Queue 를 통해 Task 를 하나의 Thread 로 분배한다.
2. Concurrent (동시) Queue 에서의 작업
여러 개의 Thread 로 Task 들이 분배된다. 선입 선출이 바탕이 되는 Queue 로서 여러 Thread 로의 Task 배분은 순차적으로 진행되지만, 나중에 분배한 Task 가 실행 시간이 짧아 먼저 끝날 수 있다. 한마디로 끝나는 순서를 알 수 없는 경우인데, 순서가 중요하지 않고 빠른 처리가 요구되는 경우 Concurrent Queue 를 사용한다.
Sync / Async 와 Serial / Concurrent
둘이 같은 개념인가? 완전히 다르다.
Sync / Async 는 Main Thread 에서 Queue 로 Task 를 전달하고 난 후, 남은 Task 를 수행하는 시점에서 앞서 Queue 로 전달된 Task 가 끝나기를 기다리는지 말지에 대한 개념이고,
Serial / Concurrent 는 이렇게 Queue 로 보내진 Task 들을 하나의 Thread 에서 처리할 것인지, 여러 Thread 에서 처리할 것인지에 대한 개념이다.
그렇다면 다음과 같이 4가지 조합이 만들어질 수 있다.
1. SerialQueue.sync
Main Thread 의 작업 흐름이 Queue 에 전달한 Task 가 끝나는 시점까지 멈춰있다.
Queue 로 넘겨진 Task 는 먼저 담겨진 Task 들이 수행되어왔던 같은 Thread 로 보내지므로, 앞선 Task 들이 모두 수행되어야 실행한다.
2. SerialQueue.async
Main Thread 의 작업 흐름이 Task 를 Queue 에 전달하자마자 반환된다. (이전 Task 가 끝나기를 기다리지 않고 바로 다음 Task 수행)
Queue 로 넘겨진 Task 는 Queue 에 먼저 담겨져있던 Task 들과 같은 Thread 로 보내지므로, 앞선 Task 들이 모두 수행되어야 실행한다.
3. ConcurrentQueue.sync
Main Thread 의 작업 흐름이 Queue 에 전달한 Task 가 끝나는 시점까지 멈춰있다.
Queue 로 넘겨진 Task 는 먼저 담겨져 있던 Task 들과 다른 Thread 로도 보내지므로, 앞선 Task 들이 끝나지 않아도 실행한다.
4. ConcurrentQueue.async
Main Thread 의 작업 흐름이 Task 를 Queue 에 전달하자마자 반환된다. (이전 Task 가 끝나기를 기다리지 않고 바로 다음 Task 수행) Queue 로 넘겨진 Task 는 먼저 담겨져 있던 Task 들과 다른 Thread 로도 보내지므로, 앞선 Task 들이 끝나지 않아도 실행한다.
' iOS > 동시성 프로그래밍' 카테고리의 다른 글
동시성 프로그래밍 - 동기 / 비동기 (2) | 2022.10.01 |
---|---|
동시성 프로그래밍 - GCD 와 Operation (1) | 2022.09.30 |