Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

<2주차> GCD API 동작 방식과 필요성에 대해 설명하시오 #8

Closed
namsoo5 opened this issue Nov 7, 2020 · 8 comments
Closed

Comments

@namsoo5
Copy link
Collaborator

namsoo5 commented Nov 7, 2020

No description provided.

@namsoo5
Copy link
Collaborator Author

namsoo5 commented Nov 12, 2020

동작방식

Queue - FIFO

Serial(직렬) / Concurrent(병렬) 타입
Async(비동기) / Sync(동기) 형식
총 4가지 속성의 큐를 만들 수 있음

필요성

전에는 개발자가 직접 락을 걸고 스레드 풀을 관리했었지만
직접 스레드를 생성하고 관리하는 작업을 신경쓰지않고 Queue에 Task를 생성해서 넣기만 하면 됌

참고링크

@namsoo5 namsoo5 added the 남수 label Nov 12, 2020
@dongminyoon
Copy link
Collaborator

GCD란?
Multicore Process를 위한 Thread 프로그래밍의 방법입니다. 스레드를 관리해주고 동시적으로 작업을 처리할 수 있게 해주는 저수준 API를 제공해주는 라이브러리입니다.
GCD는 멀티 코어 프로세서 시스템에 대한 응용 프로그램 지원을 최적화하기 위해 사용되는 라이브러리로 스레드 관리와 실행에 대한 책임을 운영체제 레벨로 넘겨 버림으로서 프로그래머가 쉽게 비동기적으로 작업을 처리할 수 있습니다.
실행할 작업을 클로저의 형태로 DispatchQueue에 추가하면 GCD가 스레드를 자동으로 생성하고 실행해주고 스레드를 관리해줍니다.

@iJoom
Copy link
Collaborator

iJoom commented Nov 13, 2020

Dispatch
시스템에서 관리하는 큐를 디스패치하는 작업을 제출하여 멀티 코어 하드웨어에서 코드를 동시에 실행합니다. 멀티코어에 대응하는 thread 프로그래밍
GCD - 멀티 코어 하드웨어에서 동시 코드 실행을위한 포괄적 인 지원을 제공합니다.
GCD (Grand Central Dispatch)라고도하는 Dispatch에는 macOS, iOS, watchOS 및 tvOS의 멀티 코어 하드웨어에서 동시 코드 실행 지원에 대한 체계적이고 포괄적 인 개선 기능을 제공하는 언어 기능, 런타임 라이브러리 및 시스템 향상 기능이 포함되어 있습니다. BSD 하위 시스템, Core Foundation 및 Cocoa API는 모두 이러한 향상된 기능을 사용하여 시스템과 응용 프로그램을보다 빠르고 효율적으로 실행하고 응답 성을 향상시킬 수 있도록 확장
단인 어플리케이션에서 여러 코어를 효과적으로 사용하도록 고민하고 고려하는 것

  • Serial - Sync 직렬 동기
  • Serial - Async 직렬 비동기
  • Concurrent - Sync 병렬 동기
  • Concurrent - Async 병렬 비동기

적절하게 QoS를 지정해주면 앱의 에너지 효율이 좋아짐!

DispatchQueue.global(qos: DispatchQoS.QoSClass).async {

}

case userInteractive
The quality-of-service class for user-interactive tasks, such as animations, event handling, or updating your app's user interface.

case userInitiated
The quality-of-service class for tasks that prevent the user from actively using your app.

case default
The default quality-of-service class.
case utility
The quality-of-service class for tasks that the user does not track actively.

case background
The quality-of-service class for maintenance or cleanup tasks that you create.

case unspecified
The absence of a quality-of-service class.


 let mineQueue = DispatchQueue(label: "bbb", attributes: .concurrent)
//명시적으로 지정해줌으로서 큐의 속성을 정의
//정의하지 않으면 Serial Queue

위와 같이 나만의 DispatchQueue를 만들어서 사용할 수도 있음
GCD의 필요성
앱의 UIKit 관련 코드는 메인스레드에서 작동되어져야함, 또한 서버에서 데이터를 불러올때 서버에서 데이터가 오지 않았는데 앱에서 View와 데이터를 표현하려고 할 수 있음. 그때 GCD 코딩을 하지 않는다면 당연히 에러발생

@iJoom iJoom added the 인준 label Nov 13, 2020
@choidam
Copy link
Member

choidam commented Nov 13, 2020

GCD 는 백그라운드에서 스레드를 OS에서 관리하면서 동시적으로 작업을 실행시키는 저수준 API 를 제공하는 라이브러리 입니다. DispatchQueue 클래스를 통해서 FIFO 순서로 실행됩니다.

  • Serial queue
    • 분산처리시킨 작업을 다른 한 개의 스레드 에서 처리하는 큐
    • 주어진 시간에 하나의 작업만 실행하는 것을 보장합니다.
  • Concurrent queue
    • 분산처리시킨 작업을 다른 여러 개의 스레드 에서 처리하는 큐
    • 동일한 시간에 여러개의 작업을 실행하는 것을 허용합니다.
  • Sync queue
    • 큐에 추가된 작업이 종료될 때까지 기다리는 큐
  • Async queue
    • 큐에 작업을 추가하지만 완료 여부는 보장하지 않는 큐

  • Main queue
    • 메인 스레드에서 실행되는 Serial queue
    • 보통 concurrent queue 에서 작업 완료한 후 UI 업데이트 시 사용합니다.
  • Global queue
    • 전체 시스템에 의해 공유되는 Concurrent queue
    • 백그라운드에서 UI 가 아닌 작업을 수행할 때 사용합니다.
  • Custom queue : 개발자가 직접 생성하는 큐 (Serial / Concurrent)

@choidam choidam added the label Nov 13, 2020
@Juhyeoklee
Copy link
Collaborator

@elesahich elesahich added the 승호 승호 label Nov 13, 2020
@elesahich
Copy link
Collaborator

@5anniversary
Copy link
Collaborator

Grand Central Dispatch

여러가지 메서드를 단일 스레드가 아닌 여러 스레드에 나눠서 처리 하기위한 역할을 함.

  • Serial Dispatch Queue : 등록된 작업들을 하나씩 수행함. 하나의 작업이 끝나면 다음 작업을 수행하는 형태

  • Concurrent Dispatch Queue : 여러가지의 작업을 같이 수행함.

  • sync : 동기처리 메소드

  • async : 비동기처리 메소드


필요성

  • CGD 사용이전에는 멀티 스레딩 사용을 위해서는 Thread와 OperationQueue등의 클래스를 사용했는데 Thread의 경우에는 복잡하고 Critical Section을 이용한 Lock처리가 불편했음. OperationQueue는 무겁고 Boilerplate 코드들이 많이 필요한 문제가 있음.

이런 문제점을 Apple에서 GCD를 제공함으로서 기존의 어플리케이션 레벨에서 멀티스레딩 사용시 스레드 관리를 운영체제 레벨로 올림.

@khyunjiee
Copy link
Member

GCD (Grand Central Dispatch)

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

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

DispatchQueue Class

Task를 담아두면 선택된 스레드에서 실행

  • Serial Dispatch Queue : 등록된 작업을 한 번에 하나씩 처리한다. 처리 중인 작업이 완료되면 다음 작업을 실행한다.
  • Concurrent Dispatch Queue : 여러 작업을 동시에 처리한다.
  • 앱이 실행될 때의 Queue
    • Main Queue : 메인 스레드(UI 스레드)에서 사용되는 Serial Queue. 모든 UI 처리는 메인 스레드에서 처리한다.
    • Global Queue : 편의상 사용할 수 있게 만들어 놓은 Concurrent Queue. 처리 우선순위를 위한 qos (quality of service) 파라미터를 제공해 병렬적으로 동시에 처리한다.
      => 작업 완료 순서를 정할 수는 없지만, 우선적으로 일을 처리하게 할 수는 있다.
  • sync : 동기
  • async : 비동기. 네트워크, 파일 I/O 등의 시간이 많이 소요되는 작업에 사용한다.

serial/concurrent와 sync/async는 관련이 없다

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

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

✨필요성

간단한 비동기 작업의 경우 NSOperationQueue보다 GCD를 쓰는 것이 구현이 쉽다.

NSOperationQueue보다 빠르고 오버헤드가 적기 때문에 복잡한 로직이 아니면 GCD를 사용하는 것이 편하다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

8 participants