동시성
하나의 코어에서 여러 쓰레드가 **동시에 처리되는 것**처럼 보이는 것.
병렬성
한가지 일을 여러 코어가 일을 분배해서 하는 것.
운영체제가 조절을 해 주는 부분이라 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 는 다중 쓰레드에서 작업을 처리한다.
global에 대해서 날진 님의 블로그를 보고 공부하다가 궁금한 점이 생겨 질문을 했다.
global() 메서드를 사용해서 큐를 생성할 경우, 커스텀큐가 생성이 되는 형태고
qos를 지정하면 그에 맞는 글로벌 큐를 반환해준다.
'iOS > Swift' 카테고리의 다른 글
[Memory] heap memory (0) | 2024.02.01 |
---|---|
[Trouble] stride(from: to: by:) 와 stride(from: through: by:) (0) | 2023.04.07 |
[Trouble] protocol get set (0) | 2023.03.28 |
[Swift] Timer 사용방법, 주의사항 (0) | 2023.03.22 |