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

작업을 다른 쓰레드에게 전달했을 때,

동기: 전달한 작업이 완료될 때까지 기다린다. 쓰레드는 블락된다.

비동기: 전달한 작업의 완료 유무에 관계 없이 다음 작업을 바로 시작한다. 안기다린다.

스크린샷 2025-02-04 오후 5.24.15.png

스위프트에서는 sync & Blocking, async & Non-Blocking 개념으로만 사용한다.

비동기 프로그래밍이 필요한 이유?

네트워크 통신, 즉 서버에 데이터를 요청하는 일은 부하가 많이 걸린다. 예를 들어 테이블 뷰를 스크롤할 때 즉, 실시간으로 서버에서 데이터를 받아 화면에 표시될 때 비동기 처리를 하지 않으면 버벅이는 현상이 발생한다. 비동기 처리를 하지 않아 화면 주사율 메커니즘이 제대로 작동하지 않게 되면서 버벅이게 된다.

image.png

스크린샷 2025-02-03 오후 7.00.50.png

프로그래밍을 할 때, 따로 처리를 하지 않으면 모든 작업은 메인 쓰레드에서 처리된다.

앱이 시작될 때 앱을 담당하는 메인 런루프가 생기고, 이벤트가 들어오면 어떤 함수를 실행시킬 것인지 선택하고 실행한다. 그 함수의 실행 결과를 화면에 보여줘야 하기 때문에 필요 시 화면을 다시 그린다. 업데이트 사이클 시점에 화면이 다시 그려지고, 화면을 그리는 일은 메인 쓰레드가 담당한다.

화면 주사율이 x Hz 라고 했을 때, 정상적인 경우라면 1/x 초마다 화면이 다시 그려진다. 하지만 메인 쓰레드에 맡겨진 작업이 1/x 초보다 오래 걸린다면 화면이 그려지는 시점이 딜레이되면서 버벅이는 현상이 발생한다. 그렇기 때문에 비동기 프로그래밍이 필요하다.


직렬(Serial) vs 동시(Concurrent)

작업을 다른 쓰레드에게 전달할 때,