기어가더라도 제대로

4. 디스패치 큐의 종류 본문

CS/동시성

4. 디스패치 큐의 종류

Damagucci-juice 2022. 9. 26. 21:00

목차

1. 메인큐

2. 글로벌큐

3. 커스텀큐

4. 오퍼레이션

4.디스패치 큐의 종류  image

  • 작업의 특성에 따라서 원하는 큐로 보내면 된다.
  • 각 큐가 어떤 식으로 일을 처리하는 지 알고 있으면 좋다.

메인 큐

  • 유일한 한개
  • 직렬큐(시리얼큐)
  • 메인스레드 이용
    • 1번 스레드는 메인 스레드이자 메인큐이다.
    • `DispatchQueue.main.async { }` 처럼 사용

이런 식으로 사용하는데 메인쓰레드에서 사용한다.

예를 들어 우리가 일반적으로 사용하는 명령들은 모두 원래는 이렇게 사용하고 있었다.

  • Swift의 기본 코드는 기본적으로 메인 스레드에서 동작한다.
    • 하지만 명시적으로 저렇게 선언하면 에러가 나는데, 그 이유는 다음에 이야기
// 원래 사용하는 방식
print("print something")

// Swift가 내부적으로 처리하는 방식
DispatchQueue.main.sync {
    print("print something")
}

글로벌 큐

  • 글로벌큐는 기본적으로 여러개의 큐로 보내서 작업을 처리하는 큐이다.
  • 순서가 중요하지 않은 작업을 수행한다.
  • 큐의 품질(중요도) 에 따라 6가지의 종류를 사용

4.디스패치 큐의 종류  image

  • 중요도에 따라서 iOS가 알아서 우선적으로 중요한 일에 많은 쓰레드를 배치
    • 더 여러개의 쓰레드를 배치해서 우선적으로 처리한다는 뜻
    • 순서에 상관없이 먼저 실행된다는 뜻이 아님

4.디스패치 큐의 종류  image

큐의 우선순위와 보내는 작업의 서비스 품질이 부딪힐 때

4.디스패치 큐의 종류  image

  • 생성을 백그라운드 큐로 하긴 했지만, 보내는 작업에 영향을 받아서 큐도 utility로 인식하고 처리한다고 함

커스텀(프라이빗) 큐

  • 디폴트 설정은 시리얼(동시큐로 설정가능, attribute)
  • Qos 설정 가능
  • 생성 방법

4.디스패치 큐의 종류  image

‏‏‎ ‎

실제 코드 예시

Global Queue에서 실행된 작업들이 무엇이 먼저 끝날까?

4.디스패치 큐의 종류  image

  • 정답
    • 알 수 없다.
    • 글로벌 큐의 특징은 기본적으로 동시큐이기 때문에 여러 스레드를 사용하는데,
    • 각 task가 각기 다른 스레드로 배치가 되어서 완료되기 때문에 어느 스레드가 먼저 완료될지는 알 수없다.

프라이빗 큐에서 작업을 수행하면 어떻게 될까?

4.디스패치 큐의 종류  image

  • 정답
    • 프라이빗 큐는 기본적으로 직렬큐
    • 문제는 다시말하자면, 직렬큐에 비동기적으로 작업을 보내면 어떻게 실행이 될까?
    • 작업의 시작과 완료가 순차적으로 이루어진다. 다만 작업의 완료를 기다리지는 않는다.
    • 각 task에 sleep() 명령어가 있어서 콘손에는 몇초 후에 뜨겠지만 실행은 순식간에 끝난다
      • 비동기 작업이기 때문
    • 하지만 작업의 완료 순서는 1 - 2 - 3 순서로 보장이 된다.
      • 직렬 큐이기 때문

‏‏‎ ‎

큐의 종류 정리

4.디스패치 큐의 종류  image

'CS > 동시성' 카테고리의 다른 글

6. weak self 관련  (0) 2022.09.26
5. GCD 사용시 주의해야할 사항  (0) 2022.09.26
3. 직렬과 동시  (0) 2022.08.31
2. 동기(Synchronous) VS Asynchronous(비동기)  (0) 2022.08.31
1. GCD 와 Operation  (0) 2022.08.31
Comments