본문 바로가기
ios

동기/비동기, 직렬/동시

by 고고 2021. 12. 21.

1. 동기 vs 비동기

 

안녕하세요◠‿◠ 고고입니다.

 

카페를 예로 들자면

동기 - 앞의 사람이 주문을 해서 음료(결과)를 받을 때까지 뒤의 사람들은 모두 다 대기합니다.

비동기 - 앞의 사람이 주문을 하고 진동벨을 받아가고, 뒤의 사람은 주문을 한다. 진동벨이 울리면 음료를 받아가면 됩니다.

 

 

요약하면

동기 - 요청을 보낸 후 응답(=결과)를 받아야지만 다음 동작이 이루어지는 방식

비동기 - 요청을 보낸 후 응답(=결과)와는 상관없이 다음 동작이 이루어지는 방식

 

 

 

동기(sync)

장점 - 설계가 간단하고 직관적

단점 - 결과가 주어질 때까지 아무것도 하지 못하고 대기해야 함

 

비동기(Async)

장점 - 아래 예제처럼 서버로부터 데이터를 가져오는 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있음

단점 - 동기보다는 복잡

 

 

 

 

그림 출처 : https://webclub.tistory.com/605

 

 

 

 

 

 

 

2. 직렬 vs 동시

직렬(Serial) 큐 - 분산처리 시킨 작업을 다른 개의 스레드에서 처리하는 큐 

동시(Concurrent) 큐 - 분산처리 시킨 작업을 다른 여러 개의 스레드에서 처리하는 큐

 

 

Serial 큐 - 순서가 중요한 작업들. task의 시작과 종료에 대한 순서를 예측할 수 있다.

Concurrent 큐 - 각자 독립적이지만 중요도나 작업의 성격이 유사한 여러 개의 작업들. 끝나는 순서를 예측할 수 없다.

 

그림 출처 : https://www.raywenderlich.com/5370-grand-central-dispatch-tutorial-for-swift-4-part-1-2

 

 

 

 

 

+) Async vs Concurrent ?

동기/비동기 - 작업을 보내는 시점에서 기다릴지 말지에 대해 다루는 것

직렬/동시 - Queue(대기열)로 보내진 작업들을 여러 개의 스레드로 보낼 것인지 한 개의 스레드로 보낼 것인지에 대해 다루는 것

 

 

 

 

+) iOS에서 Serial 큐는 하나의 스레드 객체에서만 처리할까?

실험

let queue = DispatchQueue(label: "test.serial")

queue.async {
    print("hi \(Thread.current)")
}
queue.async {
    print("hi \(Thread.current)")
}
queue.async {
    print("hi \(Thread.current)")
}
queue.async {
    print("hi \(Thread.current)")
}
queue.async {
    print("hi \(Thread.current)")
}

 

 

결과: 두 개의 스레드 객체를 사용.

hi <NSThread: 0x7fc26a467b90>{number = 2, name = (null)}
hi <NSThread: 0x7fc26a467b90>{number = 2, name = (null)}
hi <NSThread: 0x7fc26a467b90>{number = 2, name = (null)}
hi <NSThread: 0x7fc26a467b90>{number = 2, name = (null)}
hi <NSThread: 0x7fc26b1003e0>{number = 3, name = (null)}

 

 

요약 : 하나의 스레드는 항상 같은 스레드 객체를 의미하지 않습니다.

 

Dispatch Serial Queue는 한 번에 하나의 스레드만 Queue에서 Task을 실행하도록 보장합니다.

어떤 특정 스레드가 해당 Task를 수행할지 보장하지 않습니다. 

 

Dispatch는 worker 스레드 풀을 유지 관리하고 task를 실행할 수 있게 되면 해당 task를 실행하기 위해 해당 풀에서 하나의 스레드를 자동으로 할당합니다.

 

+) 근데 제가 위에 걸 실험해보니까 다 같은 스레드 객체만 나오더라구요... 희귀한 케이스 아닌가 싶습니다.

 

 

출처 : serial Dispatch Queue will use only one thread?

'ios' 카테고리의 다른 글

GCD에서 의도치 않은 교착상태를 피하는 법  (0) 2021.12.22
DispatchQueue 교착상태  (0) 2021.12.22
DispatchQueue 종류 세 가지  (0) 2021.12.21
Error: realm accessed from incorrect thread  (0) 2021.11.19
[iOS] Carthage 전환 후기  (0) 2021.11.18

댓글