iOS Concurrency

이승원·2022년 11월 22일
0

iOS

목록 보기
6/6
post-thumbnail

GCD (Grand Central Dispatch)를 이번에 공부하면서 처음 접하게 되었다. 앞서 Main Thread에 관한 포스트를 올리기 위해 공부하면서 계속 나왔던 용어인데 계속 나중으로 미루다가 이제야 제대로 공부를 하게 되었다.

GCD를 설명하기 이전에, 지난 포스트에서 말한 Main Thread에서 이미 UI 관련 작업을 전부 담당하고 있다고 말했다. 그러면 다른 작업들도 만약 Main Thread에서 담당하면, 너무 비효율적이라는 생각이 든다. 그러면 UI를 제외한 다른 작업들은 다른 Thread한테 넘겨줘야 하는데, 개발자가 일일이 모든 Thread를 관리할수도 있지만, 편리성을 추가하는 Swift에서는 절대 그렇지 않다.

예를 들어서 우리는 총 4개의 Thread 가 있다고 하고 총 4개의 Task가 있다고 가정해보자. 우리가 만약 아무런 행동을 취하지 않는다면, 모든 Task는 사실 Main Thread에서 혼자 다 처리하고 있었던것이다.

근데 만약 각각의 Thread 마다 task가 분배가 된다면, 같은 시간안에 효율적으로 작업을 마칠수 있지 않을까? 사실 이건 너무 당연한 이야기다. 그러면 우리는 어떻게 해야 task들을 적당하게 Thread에 분배를 할 수 있을까?

iOS에서는 굉장히 간단하게 Queue (대기 행렬)에 보내기만 하면 알아서 다른 Thread로 분산처리가 됩니다. 생각보다 너무 단순한데? 그러면 Queue에서는 어떻게 알아서 Thread로 분배를 하는거지?

GCD가 여기서 등장을 합니다. Main Thread에서 있는 Task 들을 Queue에다가 전달해주고, GCD가 Queue에서 작업에 맞는 Thread을 찾아서 Task을 분배한다.

여기서 Async (비동기) 와 Sync (동기) 개념이 등장하게 된다.

1. Async (비동기) : Queue에 넘어간 Task의 완료 여부와 상관없이, Main Thread에서는 계속 다른 Task 진행 가능.

2. Sync (동기) : Queue 에 넘어간 Task가 종료 될떄 까지 기다린다.

솔직히 그림을 보고 비동기는 사실 어느정도 이해가 갔다. task를 나눠줬으면 바로 일을 해야지, task가 끝나면 다시 본인 Task를 진행한다는것이 이해가 가진 않았다. 물론 나중에 가서 복잡한 경우에는 Sync가 필요한 경우가 있다고 한다, 하지만 내가 지금 배우는 단계에서는 이해하기 어려운 방식이라고 생각한다. 또한 자료에 따르면, Sync로 진행하면, 어쩌피 Main Thread 에서 작동하는것과 Thread 1에서 작동하는것과 차이가 없다고 판단해서, Sync적으로 코드를 짜더라도, Main Thread에서 작업한다고 한다.

그럼 이제 Queue의 특성에 대해서 알아보자, Queue는 두개의 특성이 있다.

1. Serial (직렬) : queue 에 있는 모든 Task들을 FIFO 룰에 따라 하나의 Thread에 전부 할당하는 Queue 특성. [순서가 중요한 Task들을 처리할때는 Serial]

2. Concurrent(동시) queue에 있는 Task들을 여러개의 Thread로 분산처리 하는 queue. [각자 독립적인 Task를 처리할때는 Concurrent]

Queue 특성을 알았으니, Queue 종류의 대해서도 알아보자.

1. Main Queue : 이곳에 할당되는 Task들은 Main Thread에서만 처리된다. 그렇다는 의미는 Serial 특성을 갖고 있는 Queue라는것을 알 수 있다, 왜냐하면 다른 Thread가 없기 때문이다.

2. Global Queue : 이곳에 할당되는 Task 들은 Main Thread을 제외한 다른 Thread에 할당이 되고, 그렇기에 Concurrent 특성을 갖고 있다.

3. Custom Queue : 말그대로 커스텀 Queue다, 기본적으로는 Serial 특성을 갖고 있지만, Concurrent로 설정이 가능하다.

이제 코드로 한번 배운 내용들을 살펴보자.

DispatchQueue.main.async{
 // UI 관련된 Task 들을 Main Thread로 전달하는 Queue
 // Serial
}

DispatchQuqu.gloabl.async{
 // Main Thread이 하는 업무 말고 다른 Thread가 하는 업무 전달하는 Queue
 // Concurrent
}

이번 포스트에서는 간단하게 iOS Concurreny 에 대해서 공부를 해보았다.

profile
개발자 (진)

0개의 댓글