AKAPUCH / github-is-god

상황이 이해가 안되? 깃허브에서 무료로 지식을 나눠주고 있잖아
0 stars 0 forks source link

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

Open AKAPUCH opened 1 year ago

AKAPUCH commented 1 year ago

설명

관련 링크

AKAPUCH commented 1 year ago

GCD란?

AKAPUCH commented 1 year ago

GCD 동작과정

  1. 사용자가 DispatchQueue.main()/global().sync/async{작업1()} 코드 작성 : 대기열의 종류, 작업의 우선순위, 이후 동작 등을 지정할 수 있습니다.
  2. 런타임에 코드블럭 내부의 작업1()이 디스패치 대기열에 추가(작업 예약) : main()은 main 쓰레드에 존재하는 main 대기열로, global()은 concurrent 대기열에 작업이 추가됩니다.
  3. GCD가 현재 대기열과 연결된 thread pool에서 사용가능한 쓰레드 탐색 : main 대기열은 main thread만 존재하지만, global 대기열은 여러 작업의 병렬 수행이 가능하기 때문에 가용 쓰레드 수에 따라 작업을 나눠서 할당할 수도 있습니다.
  4. 탐색한 쓰레드로 작업 할당 및 동작유형에 따라 대기/ 다음 작업 수행 : sync()로 작업을 실행했다면 처음 코드를 실행했던 쓰레드는 디스패치시킨 작업1()이 끝날 때까지 기다려야 합니다.

유의할 점

  1. main 쓰레드에서 sync{}는 사용할 수 없습니다.
DispatchQueue.global().sync{
print("Ice Age") // 실행되지 않고 앱이 종료됩니다.
}
  1. 현재 대기열과 같은 대기열로 sync{}로 작업을 디스패치하면 안됩니다.
DispatchQueue.global().async{
  task1() // global 대기열 내부에서 작업 실행
  DisPatchQueue.global().sync{  // 코드블록 내부의 작업(task2)이 끝날때까지는 현재 쓰레드 대기
       task2()  // 현재 쓰레드는 대기중이기 때문에 task2()는 절대 실행되지 않는다. `데드락 상태`
   }
}
  1. closure의 캡처 현상 주의
    • 기본적으로 closure를 사용하여 여러 쓰레드를 넘나 들다보면 self가 자주 바뀌게된다.
    • @escaping나 전역변수에 값 할당 등으로 reference counting이 증가하여 의도치 않은 retain cycle이 발생할 수도 있으니 주의하자.
    • GCD는 weak self가 필수일까, weak self 알고쓰자 참고
AKAPUCH commented 1 year ago

GCD의 필요성

메인 쓰레드는 너무 바쁘다

멀티 쓰레딩을 통한 성능 최적화