프로그래밍을 공부하면서 '비동기 처리'라는 말을 굉장히 많이 듣게 된다.
그렇다면 비동기란 뭘까 ??
Thread와 Task
동기와 비동기의 개념을 이해하기 위해 스레드와 테스크에 대해 아주 간단히만 설명하자면,
테스크(Task)는 우리가 요청한 작업이고 스레드(Thread)는 테스크를 하는 아이이다. 스레드가 1개라면 작업을 할 수 있는 사람이 한 명이지만 스레드가 여러 개라면 작업을 할 수 있는 사람이 여러 명인 것과 같다.
동시성이 필요한 이유
우리가 요청한 작업은 아래 그림과 같이 하나의 스레드에서 순차적으로 작업이 이뤄진다. 요청한 작업을 처리하는데 걸리는 시간이 얼마 걸리지 않는다면 순차적으로 처리해도 문제가 되지 않는다.
만약 작업을 처리하는데 걸리는 시간이 길어진다면 어떨까?? 4번 작업을 시작하기까지 대기해야 하는 시간이 길어질 것이다.
이럴 때 처리해야 하는 작업들을 다른 스레드로 나누어서 작업을 한다면 동시에 여러 작업을 수행할 수 있다.
동기(Sync)와 비동기(Async)
동기
프로그래밍에서 동기는 작업이 순차적으로 진행되는 방식을 의미한다. 즉, 진행 중인 작업이 끝날 때까지 다음 작업을 시작할 수 없다.
아래 그림으로 이해할 수 있다.
작업1을 처리하라고 요청을 하면 해당 작업이 끝날 때까지 main 스레드는 아무것도 할 수가 없다.
비동기
프로그래밍에서 비동기는 작업의 완료 여부와 상관없이 다른 작업을 실행할 수 있는 방식을 말한다. 즉, 진행 중인 작업이 있어도 다른 작업을 시작할 수 있다.
main 스레드를 '나' 라고 할 때, 작업1을 내가 작업하지 않고 스레드1에게 시킨 다음 나는 다른 일 할게!
라는 느낌 ㅎ.ㅎ
직렬(Serial)과 동시(Concurrent)
직렬 처리
직렬 처리란, 처리해야 하는 작업들을 다른 스레드에 보내기는 할건데 여러 스레드에 나누어 보내는 것이 아닌, 하나의 스레드에 보내서 순차적으로 처리하도록 하는 방식이다.
동시 처리
동시 처리란, 처리해야 하는 작업들을 여러 개의 다른 스레드에 보내서 처리하는 것을 의미한다. 몇 개의 스레드로 나누어 보낼지는 시스템이 결정한다.
직렬 처리가 필요한가 .. ?
동기의 경우 작업을 순차적으로 처리를 하고, 직렬의 경우 작업을 다른 스레드로 보내긴 하지만 결국 순차적으로 처리를 하는데 둘이 같은거 아냐??
라고 생각이 들 수 있다.
`동기와 비동기의 차이`는 응답의 기다림 여부이고 `직렬과 동시의 차이`는 작업을 처리하는 스레드의 수이다.
메인 스레드에서 작업을 분산 처리 할 때 작업들을 큐에 넣는데, 직렬 큐에 넣는다면 작업이 순차적으로 진행되고 동시 큐에 넣는다면 여러 스레드로 분산되어 처리가 될 것이다.
그럼 `직렬 처리`가 왜 필요해 ?? 라고 한다면 비동기로 처리하는 경우에도 순서가 중요한 작업들은 있을 수 있다.
반대로 `동시 처리`는 유사한 작업들을 빠르게 처리해야할 때 사용한다.
iOS의 동시성
앱 개발에서 비동기는 보통 네트워크 통신/처리에서 사용된다.
예를 들어, 인스타그램의 피드를 스크롤할 때 많은 사진들을 화면에 보여주는데 동기로 처리를 하게 된다면 아주 오래.. 걸릴 것이다.
iOS에서 동시성을 처리할 때 아래 것들을 사용한다.
- GCD
- Operation Queue
- Async, Await
'iOS' 카테고리의 다른 글
[iOS] Thread와 GCD(Grand Central Dispatch) 기본 (1) | 2024.11.24 |
---|---|
[iOS] CMPedometer로 사용자의 걷기 데이터 받아오기 (이동 거리, 평균 페이스) (3) | 2024.10.13 |
[iOS] Naver Map SDK Swift Package 만들기 (3) | 2024.09.07 |