[Swift] 동시성, 병렬성, 동기, 비동기

코르피·2022년 10월 27일
0

동시성

하나의 코어에서 여러 쓰레드가 동시에 처리되는 것처럼 보이는 것.

병렬성

한가지 일을 여러 코어가 일을 분배해서 하는 것.
운영체제가 조절을 해 주는 부분이라 iOS 앱 개발자가 신경을 별로 쓰지 않아도 된다.

동시성이 필요한 이유

화면의 스크롤을 내리는 경우 동시적으로 처리를 해주지 않는다면
다음화면을 불러오고 스크롤을 내리기 때문에 버벅거리는 현상이 나올 수 있다.

이런 경우 동시적으로 처리를 해준다면 좀 더 부드러운 화면이 나오고
앱의 완성도가 높아질 수 있기 때문에 사용한다.

프로세스가 논리적인 쓰레드를 여러개를 생성해서 DispatchQueue에 넣고 GCD가 CPU의 쓰레드에 넣어주는 것일까? 🤔

동기 / 비동기

동기

동기란 synchronous 라고 하고

task가 실행되고 완전히 마칠때까지 기다리는 것을 의미한다.

비동기

비동기란 asynchronous 라고 하고

코드가 실행되고 마칠때까지 기다리지 않고 다음 task로 넘어가는 것을 의미한다.
이 때 기다리지 않고 다음 task로 넘어가며
main 또는 global DispatchQueue에 task를 넘기고 넘어간다.

여기서 global은 프로세스, 그러니까 앱에서 만들어낸 쓰레드이다.
(그래서 새로 생성되기때문에 global은 DispatchQueue.global() 으로 메서드 인 것 같다.)

DispatchQueue

DispatchQueue는 GCD(Grand Central Dispatch)를 사용하기 위한 대기열로
이 대기열에 작업만 추가해주면 DispatchQueue로 넘어간 task들은 iOS운영체제에 의해 어떠한 스케쥴링으로 CPU에 할당된다.
iOS 앱 개발자들은 스케쥴링이 어떻게 되는지, 코어가 어떻게 동시성, 병렬성으로 실행되는지 까지는 신경을 별로 쓰지 않아도 된다.

DispatchQueue는 main과 global 을 사용해서 추가할 수 있는데
메인 쓰레드에 넣을지 새로 생성한 쓰레드에 넣을지를 정하는 것이다.

이후 async, sync를 사용해서 동기, 비동기를 결정한다.

serial / concurrent

// Serial Queue
DispatchQueue(label: "시리얼")
DispatchQueue.main

// Concurrent Queue
DispatchQueue(label: "병렬", attributes: .concurrent)
DispatchQueue.global()

따로 attributes 설정을 해주지 않는 이상 라벨이 뭐든 기본값은 Serial 이 된다.

serial 은 단일 쓰레드에서만 작업을 처리하고
concurrent 는 다중 쓰레드에서 작업을 처리한다.

profile
행복합시다!!

0개의 댓글