면접스터디 8W

apwierk·2022년 12월 15일
0

개인 공부

목록 보기
16/20

GCD API 동작 방식과 필요성에 대해 설명하시오.

GCD

: 백그라운드에서 스레드를 관리하면서 작업을 실행시키는 저수준 API를 제공하는 라이브러리

동작 방식

Dispatch Queue : FIFO 순서로 작업을 실행
Serial Dispatch Queue : 한 번에 한 작업만 실행
Concurrent Dispatch Queue : 작업이 끝나는 것을 기다리지 않고 가능한 많은 작업 실행 (병렬)
Main Dispatch Queue : 앱의 메인 스레드에서 작업할 수 있는 전역에서 사용 가능한 시리얼 큐

직렬/병렬과 동기/비동기는 다르다

serial과 concurrent는 한 번에 하나만 작업하는지 여러개를 작업하는지의 차이이고,

sync와 async는 처리가 끝날 때까지 기다리는지 기다리지 않는지의 차이이다.

필요성

GCD를 사용하면 스레드 생성, 유지, 삭제 등을 개발자가 신경쓸 필요 없이 해야할 작업(코드)를 큐에 예약하기만 하면 되니 편리하다.

UI관련 코드는 main스레드를 이용해야한다.

왜??

  • UIKit은 Thread-Safe 하지 않기 때문 (Thread-safe 할 경우 성능상 느리기 때문에 애플에서는 Thread-Safe하지 않도록 구현)
  • iOS의 Graphics rendering(graphics pipeline)이 궁극적으로 동기식이기 때문

꼬리질문

  • GCD를 사용해본 경험
  • UI관련 코드는 왜 main 스레드를 이용하는가

hanni66's velog
dispatch vs operation

Golbal DispatchQueue의 Qos에는 어떤 종류가 있는지, 각각 어떤 의미인지 설명하시오.

    1. userInteractive
      main thread에서 작업, 사용자 인터페이스(UI) 새로고침 또는 애니메이션 수행과 같이 사용자와 상호작용 하는 작업
      작업이 신속하게 수행되지 않으면, UI가 중단된 상태로 표시될 수 있음
      반응성(responsiveness)과 성능(performance)에 중점을 둡니다.
      Duration of work to be performed - 순식간에 끝난다.(Work is virtually instantaneous.)
    1. userInitiated
      사용자가 시작한 작업이며, 저장된 문서를 열거나, 사용자 인터페이스에서 무언가를 클릭할 때 작업을 수행하는 것과 같은 즉각적인 결과가 필요
      사용자 상호작용을 계속하려면 작업이 필요합니다. (The work is required in order to continue user interaction) 반응성과 성능에 중점을 둡니다.
      Duration of work to be performed : 거의 순식간이며, 몇 초 또는 그 이하입니다.
    1. default
      QoS의 priority level은 user-initiated와 utility사이에
      이 QoS는 개발자가 작업을 분류하는데 사용하기 위한 것이 아님, QoS정보가 할당되지 않은 작업은 Default로 처리되며 GCD global queue는 이 level(default)에서 실행됩니다
    1. utility
      작업을 완료하는 데 약간의 시간이 걸릴 수 있으며, 데이터 다운로드 또는 import와 같은 즉각적인 결과가 필요하지 않음
      유틸리티 작업에는 일반적으로 사용자가 볼 수 있는 progress bar가 있음, 반응성, 성능 및 에너지 효율성 간에 균형을 유지하는 데 중점
    1. background
      백그라운드에서 작동하며, indexing, 동기화 및 백업과 같이 사용자가 볼 수 없는 작업
      에너지 효율성에 중점
      Duration of work to be performed : 작업은 분(minutes) 또는 시간(hour)과 같은 상당한 시간(significant time)이 걸림
    1. unspecified
      이는 QoS정보가 없음을 나타내며, 환경 QoS(environmental QoS)를 추론해야 한다는 단서를 시스템에 제공
      쓰레드가 기존(legacy) API를 사용하는 경우, Unspecified QoS를 사용할 수 있으며, 이경우 쓰레드가 QoS를 벗어날 수 있음

gnjs224's velog

NSOperationQueue와 GCD Queue의 차이점을 설명하시오.

Operation Queue는 Concurrent Dispatch Queue와 동일하게 동작하는데, dispatch는 FIFO 로 작업을 실행하지만 operation은 작업의 순서를 결정할 때 다른 요인을 고려한다.

그리고 각각 Operation Queue는 objective -c 기반 Dispatch Queue는 C기반이다. NSOperation이 오버헤드가 더 발생하고 느리다. 그러나 아래와 같은 기능이 있다.

Operation Queue

  • 동시에 실행할 수 있는 연산의 최대 수를 지정할 수 있다.
  • KVO를 사용할 수 있는 프로퍼티가 있다.
  • 연산 일시중지, 취소, 재개 가능

꼬리질문

  • 어떤 기준으로 어떤 queue를 사용할 지 기준을 말해줘라.

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

고려해야할 점은 어떤 작업을 글로벌 큐에 넣어야 하는지 정확히 알아둬야 하고
글로벌 큐에 작업을 배치할 때, 작업에 따라 QoS를 적절하게 사용해야한다.
또한, 동기로 할지, 비동기로 할지를 명확하게 정의하고
상황에 따라 작업 간 인과관계를 설정하거나, 특정 시간 이후에 처리하도록 설정해야합니다.

꼬리질문

  • 멀티 쓰레드를 이용 중 문제 발생한 적이 있는가.?
    -> 은행 창구 매니저 기능 구현 시 한 창구를 한 스레드로 만들었는데 여러 창구를 이용하는 경우를 멀티 스레드를 이용하는 경우로 구현했다. 그 때 중지 기능을 구현하고 싶었는데 GCD로 만들어서 중지 기능이 없어 operation queue를 이용할 걸 후회했다.
    혹은 UI 관련 코드를 main으로 감싸주지 않아 문제가 됐다.

hayeon's velog

profile
iOS 꿈나무 개발자

0개의 댓글