본문 바로가기

IT/iOS

iOS Concurrency 프로그래밍, 동기/비동기 처리, GCD/Operation 에 대한 이해 (2)

2. 디스패치큐(GCD)의 종류와 특성

  • iOS에서는 메인 쓰레드의 일을 다른 쓰레드로 보내서 처리할 떄 쓰레드를 직접적으로 관리하는 것이 아닌 중간에 큐라는 매개체를 사용하여 작업을 분배하는 작업을 한다.
  • 그리고 큐의 종류는 크게 2가지로 GCD와 Operation 으로 나뉘어진다.
  • 그리고 GCD를 세분화하면 메인, 글로벌, 프라이빗(커스텀) 3가지로 나뉘어진다.
  • 큐에 대한 개략도는 아래와 같다.

  • GCD 큐의 3가지 세분화가 이뤄진다는 것은 즉, 대기열의 종류가 여러개라는 것을 의미한다.
  • 그리고 이말은 대기열 종류가다 특성이 조금씩 다르며 작업의 특성, 원하는 일처리에 따라 대기열(큐)의 특성에 맞게 작업을 보내면 된다.
  • 그리고 원하는 큐들에 작업을 보내게 되면 각 큐들은 각자 쓰레드를 만들어서 작업들을 처리한다.
  • 해당 개념의 개략도는 아래와 같다.

  • 개념 정리

 

1) GCD 메인

  • 번 쓰레드는 메인 쓰레드이자 메인큐이다. (위 개략도 참고)
print("print something")
  • 위와 같은 코드는 실질적으로 1번 쓰레드 즉, 메인 스레드에서 작업을 동기적으로 처리하고 있었다. 그러므로 아래의 코드와 동일하다고 보면 될 것이다.
DispatchQueue.main.sync {
	print("print something")
}

2) GCD 글로벌

  • 위 그림과 같이 글로벌큐는 동시성의 성향을 가지고 있다. 즉, 작업을 하나의 쓰레드에 배분하여 일을 처리하는 것이 아닌 동시적으로 여러 쓰레드에 보내어 일처리를 진행한다.
  • 그리고 글로벌큐에는 서비스 품질에 따라 6가지로 구분이 된다. 각 큐의 특성은 아래와 같이 정리된다.

  • 큐의 중요도에 따라서 작동적이 부분에서 어떤 차이가 있는지는 아래 개략도를 보면 이해가 갈 것이다.

  • 글로벌큐의 중요도에 따라서 종류가 나눠지고 중요도가 높은 작업의 경우 쓰레드 배분을 더 하여 일처리를 진행한다. 즉, 중요도가 높은 일이면 자원할당을 더 하여 일처리를 한다는 것이다.

  • 위와 같이 큐의 중요도를 처음에 다소 낮은 .background 로 설정을 하였는데, 향후 작업의 중요도를 .background 보다 높은 .utility 로 설정을 할 경우, 큐의 중요도도 자신의 중요도보다 높은 작업의 중요도에 맞춰서 설정되게 된다.
  • .background → .utility

3) GCD 프라이빗 (커스텀)

  • 생성 방법은 아래와 같다.

  • 프라이빗 (커스텀) 의 경우, 디폴트설정이 Serial 로 되어있는 것이 중요하다.

4) 공통

  • iOS 에서는 OS가 알아서 QoS (서비스 품질)을 알아서 추론하여 쓰레드를 적절하게 배분하여 작업한다.

5) 조합 (동기/비동기, 직렬/병렬)

  • 총 4가지 조합이 나오게 된다.

1. 동기 && 직렬

DispatchQueue.main().sync {

}
  • 위와 같은 코드가 동기&&직렬의 조합으로 위와 같이 코드를 구현할 경우 메인큐에서 작업을 순서대로 진행하면서 한작업이 끝난 후에 다음 작업으로 넘어가게 된다.

2. 동기 && 병렬

DispatchQueue.main().async {

}
  • 위와 같이 코드를 구현할 경우 메인 큐안에 있는 작업을 순차적으로 진행하면서 작업들을 기다리지 않고 다음 작업을 실행하는 것을 의미한다.

3. 비동기 && 직렬

DispatchQueue.global().async {

}
  • 위와 같이 코드를 구현할 경우 글로벌 큐로 작업을 보내고, 멀티 스레드에서 작업들을 기다리지 않고 다음 작업을 실행하는 것을 의미한다.

4. 비동기 && 병렬

DispatchQueue.global().sync {

}
  • 위와 같이 코드를 구현할 경우 글로벌 큐로 작업을 보내고, 멀티 스레드에서 작업 하나하나 실행하는 것을 기다린다는 것을 의미한다.