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

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

Open
Taehyeon-Kim opened this issue Nov 7, 2021 · 3 comments
Open
Labels

Comments

@Taehyeon-Kim
Copy link
Contributor

No description provided.

@Taehyeon-Kim
Copy link
Contributor Author

동시성 프로그래밍이 필요한 이유

문제 상황
앱을 개발하다보면 동작이 버벅이는 경우를 만날 수 있다.

문제 원인
하나의 쓰레드가 너무 많은 작업을 처리하고 있다!

해결 방법
작업을 어떻게 다른 쓰레드에서 일을 하게 할 수 있을까에 대한 답으로 우리는 작업을 대기행렬, 즉 큐라는 곳에 보내면 된다. 큐에 보내면 알아서 작업을 쓰레드에 분배해준다.

GCD

GCD(Grand Central Dispatch)는 멀티 쓰레드 환경에서 작업들이 동시에 이뤄질 수 있도록 도와주는 기술이고, OS가 쓰레드를 관리해준다. GCD는 DispatchQueue라고 불리는 큐로 구성되어있다. DispatchQueue는 작업을 동기 또는 비동기적으로 쓰레드로 보낼 수 있고, 직렬 또는 동시에 쓰레드로 작업을 분배할 수 있다.

보통 다음과 같은 형태의 코드를 작성하게 된다. main, global 또는 custom형태의 큐를 선택할 수 있고, 동기 또는 비동기 방식을 선택할 수 있다. 첫번째 코드 블럭을 해석해보면, "메인 큐로 비동기적으로 작업(task)을 보내라" 라고 해석할 수 있다.

DispatchQueue.main.async { 
// task
}

DispatchQueue.global.async { 
// task
}

@hyesuuou
Copy link
Member

동작방식

GCD API는 DispatchQueue를 이용하여 Multi-threading을 지원한다.

앱을 실행하면 DispatchQueue는 Main Queue, Global Queue 이렇게 두 가지 형태로 만들어진다.

먼저 Main Queue는 메인 스레드에서 사용되는 Serial Queue(직렬큐) 형태이기 때문에, 등록된 작업을 한번에 하나씩 처리한다. 모든 UI처리는 메인큐에서 진행해야 한다.

Global Queue는 시스템에 의해 관리되는 Concurrent Queue(동시큐) 형태로, 작업을 한번에 하나씩 실행하는 것이 아니라, 여러 작업을 동시에 진행하며 순서를 보장하지 않는다. Global Queue는 메인 큐에서 동작하는 작업에 영향을 끼치지 않아야 할 때 사용하며, QoS 를 지정하여 작업의 우선순위를 정할 수 있다.

  • 작업의 단위는 Task로, 하나의 Task(작업)은 하나의 블록(클로저)를 나타낸다.

필요성

프로그램을 실행하다 보면, 순차적으로 실행했을 때 문제가 되는 경우가 있습니다.
예를 들어서 너무 큰 용량의 이미지를 다운받아야 하는데 프로그램이 순차적으로 진행된다면 이미지를 다운받는 동안 아무런 작업도 할 수 없게 됩니다.
이럴 때 스레드를 분리하여 메인스레드가 아닌 곳에서 이미지를 다운로드하고, 메인 스레드에서는 그 동안 다른일을 할 수 있도록 하여 이 문제를 해결할 수 있습니다.

하지만 개발자가 직접적으로 스레드를 관리해주기는 어렵기 때문에, 애플에서 제공하는 GCD API가 필요합니다. GCD API를 사용하면 쉽게 멀티스레딩 처리를 해 줄수 있고, 스레드를 관리하기 위한 코드가 줄어들어 훨씬 깔끔한 코드를 작성할 수 있습니다. 또한 스레드 관리가 용이해집니다.

@dlwns33
Copy link
Member

dlwns33 commented Nov 21, 2021

우리는 일하는 친구들을 '스레드' 라고 부른다. 그런데, 이 스레드는 '큐' 구조이기 때문에, 할당된 일들은 모두 순서대로 처리된다.
배정된 일이 많아지면 많아질수록 앞에서 일을 처리하는 시간이 길어져서 앱이 버벅거리는 등, 문제가 생기게 된다. 그렇다면, 우리는 효율적으로 일을 분배하기 위해 일하는 친구들을 늘리는, 즉 스레드를 여러개 이용하는 방법을 떠올릴 수 있다. 이것이 바로 멀티스레딩이다!

GCD : Grand Central Dispatch

  • 애플에서 자체적으로 개발한 멀티 스레드를 이용하기 위한 기술로, 스레드 관리를 운영체재에서 대신 해준다.
  • 우리가 이것을 사용하기 위해 해줘야 하는 일은, 할일들을 큐에 보내주는 것이다. (Dispatchqueue)

DispatchQueue에는 Main, Global, 그리고 Custom queue등이 있다.
Main : 메인쓰레드에서 처리되는 serial queue의 형태로, UI관련 요소들은 모두 이곳에서 처리해야한다
Global : 전체 시스템에서 공유되는 concurrent queue , 동시에 진행되기 때문에 QoS를 통해서 작업의 우선순위를 결정하게 된다.
Custom : 큐를 커스텀해서 쓸수 있다.

let zeddQueue = DispatchQueue(label: "zedd")
//이렇게 만들면 그냥 serial queue 가 된다
let zeddQueue = DispatchQueue(label: "zedd", attributes: .concurrent)
//요렇게 해줘야 concurrent!

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

No branches or pull requests

3 participants