Skip to content

Latest commit

 

History

History
97 lines (68 loc) · 4.96 KB

GCD&Operation.md

File metadata and controls

97 lines (68 loc) · 4.96 KB

GCD & Operation 비교

📌 GCD : Grand Central Dispatch

  • 멀티 코어 시스템에서 동시성 실행을제공하는 프로그래밍 언어 요소, 라이브러리를 말한다.
  • 이 CGD의 개념으로 동시성 프로그래밍을 하는것이 Dispatch Queue 이다.
  • DispatchQueue에 작업을 정의해서 넣어주면, 운영체제가 작업들을 적절한 스레드에 할당해준다.
  • 큐의 종류, qos 우선순위, sync, async를 설정해서 지정한 작업이 현재 스레드 혹은 다른 스레드에서 실행 될 수 있도록 한다.

DispatchQueue

Class
: 앱의 main thread 혹은 background thread 에서 serially 혹은 concurrently 하게 작업을 실행을 관리하는 객체이다.

DispatchQueue를 크게 두가지로 나눌 수 있다.

  • Serial
    • 큐에 등록된 작업을 한 번에 하나씩 처리하는 것이다.
    • 한 작업이 끝날 때까지 큐에 있는 다른 작업은 건드리지 않기 떄문에 실행 순서가 언제나 같다.

  • Concurrent
    • 동시에 여러 작업을 수행할 수 있다.
    • 운영체제는 Dispatch Queue에서 꺼내온 현재 작업이 끝나지 않아도 다음작업을 다른 스레드에 할당해 여러 작업이 실행되게 한다.

3종류의 큐를 선택해서 사용할 수 있다.

  • Main
    • 메인스레드에서 작업을 보관하고 수행하는 큐이다.
    • 메인 스레드에서 동작하기 때문에 단 하나만 존재할 수 있고, serial한 특성을 가지고 있다.
    • (큐에 쌓이는 순서대로 실행)
    • 메인에서 가장 중요한 업무는 UI 업데이트를 하는 것이다.
  • Global
    • 메인이 아닌 다른 스레드에서 작업을 처리한다. 그리고 concurrent 특성을 가지 기 떄문에 여러 스레드로 분산 처리가 가능하다.
    • 작업이 완수되는 순서를 보장하지 않는다.
  • Custom
    • 사용자가 어떤 특성의 큐로 생성할지 결정할 수 있게 해줍니다.
    • 기본적으로는 serial 하지만, attributes인자로 concurrent로 바꿔줄 수 있다.

📌 Qos : Quality of Service

gobal과 custom에 적용가능 옵션이다.

작업 분산 처리시 작업의 중요도를 설정하여 실행의 우선순위를 부여하여, 우선순위가 높은 큐를 더 많은 스레드에 작업분산을 시킨다.
(종류: userInteractice > userInitiated > default > utility > background)

주의 사항

📌 main.sync 금지!

  • Main에서 sync를 호출하면 메인스레드는 해당 작업이 끝날 때까지 block 됩니다.
  • 그러면 메인스레드는 아무것도 할 수 없는 상태가 되어 작업을 수행할 수 없습니다.
  • 큐에 등록된 작업은 시작되지 못하고, 끝나지도 않는 데드락이 발생합니다.

📌 같은 큐에서 sync 금지!

  • 같은 큐에 작업을 등록하고, 해당 작업을 동일 큐에 sync하게 등록하면 같은 스레드에 작업을 또 할당할 수도있다.
  • 이것을 운영체제에서 스레드를 할당하는 과정에서 데드락이 발생할 수 있다.

📌 DispatchGroup

  • 작업을 Dispatch Queue에 보내면 GCD가 스레드를 적절히 생성하여 분배해준다.
  • 여러 스레드로 분배된 작업이 끝나는 시점을 각각 파악하는 것이 아니라 하나의 그룹을 지어 한번에 파악하고 싶을 때 사용한다. → 그룹으로 묶인 작업의 마지막 시점을 파악
- 그룹 생성
- 작업을 그룹에 추가 (작업을 다른 큐로 보내도 같은 그룹으로 지정 가능)
- 작업이 끝나면 실행할 코드를 담은 notify 작성

wait() 을 통해 모든 작업이 완료될때까지 현재 스레드를 block할수 있음
→ 함수를 실행하는 곳인 메인큐에 wait하면 안됨. task들이 다른 스레드에서 실행되는만큼 앱이 멈춘다.
→ 그룹 내의 작업은 wait이 실행되고 이는 현재 스레드로 할당해선 안된다. wait상태에서 할당되면 데드락이발생.

📌 Operation

  • 단일 작업에 관란 데이터와 코드를 나타내는 추상 클래스

  • Operation 객체들을 priority에 의해 실행시키는 큐이다.

  • 한번 operation queue에 넣으면 작업이 끝날 때까지 queue가 존재

  • 해당 queue에서 Operation을 삭제, 명령시킬 수 있다는 장점이 있다.

  • 서브 클래싱이 가능한데, 이게 가능하다는 것은 캡슐화를 했다는 의미이므로 기능에 관한 모듈성이 향상

  • 작업의 실행 상태를할수 있고, 취소 및 순서 지정을 해줄 수 있다 → 진행 상황과 종속성을 체크하면서 여러 클래스에 대한 책임을 분리할 수 있다.

  • 상태의 종류

    • pending, ready, executing, finished, cancelled

📌 Operation vs GCD

  • Operation Queue는 내부적으로 GCD를 사용한다.
  • GCD는 동시에 실행될 작업 단위를 나타내는 방버이고 종속성 설정이 어렵다.
  • Operation은 GCD에 비해 복잡하지만, 작업 간 종속성, 재사용, 취소, 중지 등이 가능하다