멀티 쓰레드로 동작하는 앱을 작성하고 싶을 때 고려할 수 있는 방식들을 설명

이하연·2021년 8월 15일
2

[Swift] 스위프트

목록 보기
11/27

Q. 멀티 스레딩을 사용하는 이유

시간이 오래걸리는 작업 진행 시 어플리케이션의 실행을 방해하면 안되기에

멀티 코어에서 큰 작업을 여러개로 분할하여 진행해야 하기에

메모리 공간과 시스템 자원 절약하기 위해서

Q. 멀티 쓰레드로 동작하는 앱을 작성하고 싶을 때 고려할 수 있는 방식들을 설명해주세요

A :고려해야할 점은 어떤 작업을 글로벌 큐에 넣어야 하는지 정확히 알아둬야 하고

글로벌 큐에 작업을 배치할때, 작업에 따라 QoS를 적절하게 사용해야한다.

또한, 동기로 할지, 비동기로 할지를 명확하게 정의하고

상황에 따라 작업 간 인과관계를 설정하거나, 특정 시간 이후에 처리하도록 설정해야합니다.

A: 직접적으로 스레드를 관리하지 않고 Queue를 활용하여 작업을 분산 처리하고 GCD, Operation을 이용하여 iOS에서 알아서 스레드 숫자를 관리한다. 그리고 다른 스레드에서 작업들이 "비동기적으로 동작"하도록 만든다.

DispatchQueue.global().async { 작업의 한 단위 == task } //task는 동기적으로 작동함

QoS

QoS란, global queue를 사용할때, 작업마다 중요도를 매겨서 순위에 따라 처리하는 것

  • userInteractive
    • 가장 높은 우선순위로, user-interative한 작업을 위한 것
    • 예 : 애니메이션, 이벤트 핸들러, UI 업데이트
  • userInitiated
    • 두번째 우선순위로, 사용자가 하는 것에 대한 결과를 바로 보여줘야하는 작업, 사용자가 앱을 사용하는 것을 막을지도 모르는 작업을 위한 것
    • 예 : API를 통해 데이터를 불러올 경우
  • utility
    • 네번째 우선순위, 앱을 사용하는 것을 막지 않는 작업을 위한 것
    • 오래 걸리는 작업을 할 경우
  • background
    • 가장 낮은 우선순위, 앱이 실행되는 동안 백그라운드에서 하고 싶은 작업을 위한 것
    • 데이터베이스에 데이터를 저장할 때

Queue에서 클로저 형태의 작업들은 두가지 방식으로 담기는데

  1. sync : 작업이 끝나는 것을 기다렸다가 실행
  2. async : 기다리지 않고 바로 실행

GCD

  • grand central dispatch ( dispath : 보내다 ) = DispatchQueue
  • 간단한 일
  • 함수를 사용하는 작업 = 메소드 위주

Operation

  • 단위(패키지) 작업을 클래스화
    • 데이터와 기능을 캡슐화한 객체
  • Default : 동기적으로 작동
  • 인스턴스화 → 작업 한번만 실행 가능
  • 복잡한 일
  • 기능 : 취소, 순서지정(의존성), 상태 체크, KVO notification, QoS 수준, CompletionBlock, 일시중지 ( 상태 추적 )
  • 라이프 사이클

Operation Queue

Operation을 담아서 사용하는 Operation Queue → 큐 안에 담기는 것이 Operation

  • Serial? Concurrent?

    maxConcrrentOperationCount 변수를 사용해서 분산 시킬 스레드 갯수를 결정 할 수 있음

    default =-1 → iOS가 시스템 상황에 따라서 스레드 갯수 결정

    maxConcrrentOperationCount = 1 → Serial

    maxConcrrentOperationCount = 2 → Concrrent (2개 스레드 사용)


Synchronous VS Asynchronous

Async 비동기

  • 안 기다림

  • 작업의 완료를 기다리지 않고 즉시 Return

  • 메인 스레드에서 다른 스레드에 일을 넘기고 작업 완료까지 대기하지 않는다.

sync 동기

  • 기다림

  • 작업을 시작하고 끝날때까지 기다린다.

  • 따라서 다른 스레드로 보내는 의미가 없다.

    → 동기적으로 코드를 작성해도 실질적으로 메인 스레드에서 작업을 진행한다.


Serial VS Concurrent

Serial (직렬 큐)

  • 분산처리 시킨 작업을 다른 한 개의 스레드에서 순서가 중요한 작업을 처리할때 사용

Concurrent (동시 큐)

  • 분산처리 시킨 작업을 다른 여러개의 스레드에서 각각 독립적이지만 유사한 여러개 작업을 처리할 때 사용

나중에 참조

[GCD] DispatchQueue.. main큐와 gloabal큐? sync와 asnyc? 궁금증 해결해보자.

0개의 댓글