Search
Duplicate

동기(Sync) vs 비동기(Async), 직렬(Serial) vs 동시(Concurrent)

Created
2023/07/07 12:41
Tags
태그
Swift

동기(Sync) vs 비동기(Async)

둘 다 다른 쓰레드로 작업을 보내는 것은 동일하다.

동기 (Sync)

다른 쓰레드로 작업을 보내고, 그 작업이 끝날 때까지 기다린다.
작업이 끝나야 다른 작업을 시작할 수 있다.
print("1") syncMethod() // 동기함수(5초동안 일처리 함수) // 5초동안 기다렸다 일이 다 끝나고 다음줄로 넘어감 // 2번 쓰레드에서 하는 일이 다 끝날떄까지 기다렸다가 print("2")
Swift
복사

비동기 (Async)

다른 쓰레드로 작업을 보내고, 그 작업이 끝나는 것을 기다리지 않고 다른 작업을 시작한다.
print("1") asyncMethod() // 비동기함수(5초동안 일처리 함수) // 안기다리기 때문에 바로 다음줄로 넘어감 // 2번 쓰레드에서 하는 일이 다 끝날때까지 기다리지 않음 print("2")
Swift
복사

예시

프린트집을 하고 있을 때, 나에게는 A, B, C, D 복사기가 4대 있다. 학생 2명이 나에게 300장 짜리 복사를 맡겼다.
동기(Sync)일 경우
A 복사기에 100장 복사를 시작했다. 근데 다른 복사기를 사용할 수 없다. A 복사기의 복사가 먼저 끝나야 하기 때문이다.
비동기(Async)일 경우
A 복사기에 100장 복사를 시작했다. A 복사기의 복사가 끝나는 것에 상관없이 B, C 복사기에도 100장 복사를 시작했다.
작업의 순서에만 집중해서 보면, 차이가 극명하게 보일 것이다.
동기는 설계가 간단하고 직관적이지만, 결과가 주어질 때까지 대기를 해야하는 단점이 있고, 비동기는 설계는 복잡하지만 자원을 효율적으로 사용할 수 있다는 장점이 있다.

비동기 처리

print("1") DispatchQueue.global().async { task6() } DispatchQueue.global().async { task7() } DispatchQueue.global().async { task8() } DispatchQueue.global().async { task9() } DispatchQueue.global().async { task10() } print("2") /* 1 2 Task 6 시작 Task 7 시작 Task 8 시작 Task 9 시작 Task 10 시작 Task 7 완료★ Task 10 완료★ Task 6 완료★ Task 9 완료★ Task 8 완료★ */
Swift
복사

비동기적인 함수의 정의

// 비동기적인 함수의 정의 func task4() { DispatchQueue.global().async { print("Task 4 시작") sleep(2) print("Task 4 완료★") } } func task5() { DispatchQueue.global().async { print("Task 5 시작") sleep(2) print("Task 5 완료★") } } func task6() { DispatchQueue.global().async { print("Task 6 시작") sleep(2) print("Task 6 완료★") } }
Swift
복사

직렬(Serial) vs 동시(Concurrent)

큐에 특성에 관한 것

직렬 (Serial)

분산처리 시킨 작업을 오직 한 개의 쓰레드에서만 처리하는 것
즉, A 쓰레드에서 4개의 작업을 분산처리 시켰는데, B 쓰레드에서만 처리하는 것이다.
순서가 중요한 작업을 처리할 때 사용
직렬 큐
let serialQueue = DispatchQueue(label: "com.inflearn.serial") serialQueue.async { task1() } serialQueue.async { task2() } serialQueue.async { task3() }
Swift
복사

동시 (Concurrent)

몇 개의 쓰레드로 분산할지는 시스템이 정하지만, 시스템이 정한 여러 개의 쓰레드로 분산 처리하는 것.
작업들이 각자 독립적이지만 유사한 작업들일 때, 굉장히 유용하다 (예를 들면, 테이블뷰 셀 같은 것들을 서버에서 받아오는 것)
동시 큐
let concurrentQueue = DispatchQueue.global() concurrentQueue.async { task1() } concurrentQueue.async { task2() } concurrentQueue.async { task3() }
Swift
복사

비동기와 동시는 비슷한 개념?

비동기와 동시는 비슷해보이지만 아예 다른 개념!
동기와 비동기는 메인 쓰레드에서 대기열을 어떤 방식으로 처리할 지 정하는 것.
직렬과 동시는 어떤 대기열을 사용할 지 정하는 것

직렬을 사용하는 이유

바로 작업의 ‘순서’가 중요할 때 직렬이 사용된다.
동시는 여러 개의 쓰레드에서 분산 작업하기 때문에 순서를 상관하지 않고, 쓰레드에 할당된 작업은 각 쓰레드가 모조리 처리한다.
따라서, 만약 어떤 작업이 꼭 먼저 이뤄져야 한다면, 그럴떄는 직렬을 사용하는 게 좋다.

왜 동시성 프로그래밍이 iOS에 필요할까?

성능/반응성
최적화
분산처리
→ GCD / Operation