Swift

10. 멀티 스레딩과 GCD

Daesiker 2022. 12. 4. 18:23
반응형

멀티스레딩이란?

Multi Threading이란 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행능력을 향상시키는 것을 멀티 스레딩이라고 한다.

하나의 프로그램에 동시에 여러개의 일을 수행할 수 있도록 해주는 것이다.

멀티 프로세스와 멀티 스레드의 차이점은 메모리 영역의 자원을 어떻게 공유하는지에 차이점이 있는데, 멀티 프로세스는 데이터 영역, 힙 영역, 스택 영역 모두를 비공유하지만, 멀티 쓰레드는 메모리 영역 중 스택 영역만 자원을 공유하지 않는다.

멀티 스레딩의 장점

  • 프로세스의 생성은 많은 시간과 자원을 소비하는데 이 시간을 단축시킨 스레드를 만듦으로써, 시간 소비를 줄였다.
  • 데이터 영역과 힙 영역을 공유함으로써, 컨텍스트 스위칭을 할 때 데이터 영역과 힙 영역을 올리고 내릴 필요가 없다.
  • 데이터 영역과 힙 영역을 통해 자유로운 데이터 교환이 가능하다.

멀티 스레딩의 단점

  • 서로 다른 스레드가 데이터와 힙 영역을 공유하기 때문에 서로 다른 스레드가 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있기 때문에 동기화 작업이 필요하다.
  • 동기화 과정 중에서 과도한 락에 의해 병목현상이 발생하여 성능이 저하될 가능성이 높다.

※ 동기화 : 작업 처리 순서를 컨트롤하고 공유 자원에 대한 접근을 제한하는 방법

※병목현상 : 어떠한 시스템 내 데이터의 집중적인 사용으로 인해 전체 시스템에 절대적 영향을 미치는 부분의 사용빈도가 늘어나 그 부분의 성능이 저하되어 전체 시스템이 마비되는 현상

GCD란?

Dispatch Queue는 iOS에서 Multi Threading을 할 때 도와주는 라이브러리이다.

이전에는 NSOperation이라는 Objective-C 기반의 고수준 API로 사용했었는데, 다소 무겁고 약간의 오버헤드를 발생시켜서 이 문제점을 해결하기 위해 만든 라이브러리이다.

Closure로 구현되어 있어 코드 가독성면에서 좋고, 간단하게 사용이 가능하지만 작업 취소, KVO, 재사용 등등 직접 사용자가 작성해야해서 불편함이 있다.

Dispatch Queue

Dispatch Queue는 GCD에서 작업을 관리해 주는 도구이다. Dispatch Queue를 사용하면 호출자와 관련하여 비동기/동기식으로 임의의 코드 블록이 수행 가능하다. 또한 별도의 스레드에서 수행하는 거의 모든 task를 수행할 수 있다.

Main Queue

Main Thread에서 사용되는 Queue로 Serial Queue이고, UI 관련 작업을 처리한다. Main Queue네서는 sync을 사용할 수 없고, 사용하면 런타임 에러가 떨어진다. 이것은 main thread가 thread-safe하지 않기 때문인데, 스레드로부터 안전하게 만들면 성능적으로 도움이 되지 않기 때문에 Apple 측에서 의식한 디자인 결정이다.

DispatchQueue.main.async {
    //원하는 작업
}

Global Queue

Global Queue는 편의상 사용할 수 있게 만들어 놓은 Concurrent Queue이고, 우선 순위를 Qos를 통해 사용자가 직접 명시가 가능하다. async, snyc 둘다 사용이 가능하다. Qos를 잘 사용하면 애너지 효율성이 좋아진다.

Qos

  • userInteractive
    • 중요도가 높고 즉각적인 반응이 요구되는 작업(UI 업데이트, 이벤트 핸들링)
    • Main Thread에서 실행되는 Qos
    • 즉각적으로 실행이 된다.
  • userInitiated
    • 유저가 빠른 결과를 기대할 때 사용
    • 보통 저장된 파일을 여는 경우에 사용
    • 몇 초 이하나 거의 즉각적으로 반응
  • default
    • 작업을 분리하지 않을 때 사용되는 Qos
    • qos를 따로 지정하지 않을 때 기본값으로 사용
  • utility
    • 즉각적인 결과가 필요하지 않을때 사용
    • 보통 네트워크 다운로드, 계산, 데이터를 가져올 때 사용
    • 몇 초에서 몇 분사이에 반응
  • background
    • 급히 필요하지 않은 작업일 때 사용
    • 사용자에겐 보이지 않는 처리를 할 때 사용
    • iPhone 저전력 모드에선 실행되지 않는다.
    • 몇 분 ~ 몇시간 사이에 반응한다.
  • unspecified
    • Qos 정보가 없음을 나타낸다.
    • 시스템에게 Qos를 추론하라는 신호를 준다.

Private Queue

사용자가 직접 init을 통해 만든 Queue

let myQueue = DispatchQueue.init(label: "myQueue", qos: .default, attributes: .concurrent)
myQueue.async {
	//원하는 작업
}

※ Serial Queue : 작업들을 순차적으로 처리하며, 한 번에 한개의 작업만 처리하는 Queue

※ Concurrent Queue : 여러 작업을 동시에 처리가 가능한 Queue

반응형

'Swift' 카테고리의 다른 글

12. Unit Test(2)  (0) 2022.12.16
11. Unit Test(1)  (0) 2022.12.09
9. 프로세스와 스레드  (0) 2022.08.25
8. [Swift] App’s Life Cycle(앱 생명주기)  (0) 2022.08.17
7.[Swift] View Life Cycle(UIKit, SwiftUI)  (0) 2022.08.09