나만의 공부 노트
GCD에 관하여 본문
큐에는 두가지 종류가 있따
1. Serial ( = 직렬, 순서대로 ) <- main queue + custom queue
2. Concurrent ( = 동시에, 시분할 ) <- global queue(4개)
그리고
1. async (= 비동기성) <- 얘는 블록을 큐에 넣고, 기다리지 않고 바로 다음 명령 실행(싱크 신경 안씀)
2. sync (= 동기성) <- 얘는 블록이 끝나면 다음 명령 실행(싱크 맞춤)
+
serial큐는 큐에 있는 작업들이 FIFO를 만족하며 작업되는 큐
concurrent큐는 큐에 있는 작업들이 시분할 방식으로 조금씩 번갈아가며 작업되는 큐
+
병렬성 프로그래밍
동시성 프로그래밍과 다르게 동시에 돌아가는 것처럼 보이는 것이 아닌 실제로 동시에 실행되는 것을 의미합니다! 멀티 코어에서 멀티 스레드를 동작시키는 방식으로 데이터 병렬성과 작업 병렬성으로 나뉘게 됩니다.
+
병렬성 프로그래밍이라 한들 직렬큐는 매 순간 하나의 스레드에 하나의 작업만 들어가고
concurrent큐는 들어갈 스레드가 많으니 분산되어 들어갈 듯?
직렬큐에서 동기성으로 큐를 넣으면 deadlock 발생하네..
(현재 작업은 보냈던 작업 기다리고 있고.. 보냈던 작업은 뒤에가서 줄서있고..)
다양한 상황 상정해봐야겠따.. 운체 듣고 오자
아래는 코드
DispatchQueue.main.async { code }
여기서 클로저는 인자와 반환값 x
직렬큐(serial)이고 ui를 처리해야함
DispatchQueue.global(qos: not the main queue) {
여기서 일하고
끝나면
DispatchQueue.main.async {
UI처리
}
}
-> async 비동기 처리 방식(큐가 준비되었을때 처리)
병렬큐에 기본으로 있는 4가지 큐
QOS = quality of service(우선순위)
1. QOS_CLASS_USER_INTERACTIVE
2. QOS_CLASS_USER_INITIATED
3. QOS_CLASS_UTILITY
4. QOS_CLASS_BACKGROUND
새로운 직렬큐 만들기!
DispatchQueue(label: <#T##String#>)
테이블에서 이미지를 가져올 때 1.과 같은 병렬큐에 넣으면
쓰레드가 동시에 여러개 실행되고
병렬로 처리하려다 보니 네트워크 접속 통로를 여러개 열어놔서 거대해짐..
따라서 직렬큐에 넣어두면 네트워크 접속 통로를 한개씩만 만들어놓으므로
거대해지는 현상을 막을 수 있다! <- MyWeather에서 병렬로 넣어부렀네 ㅜㅜ
*추가로 URLSession에서 클로저를 넣었잖슴? 그 클로저 메인 큐로 실행되는 게 아니라 다른 큐로 들어가서 비동기적으로 처리됨 (흠.. 그 큐가 직렬인지 병렬인지 나중에 session할때 알아보자)
정리를 해보자면
기본적으로
1. main(직렬큐) 2. custom(직렬큐) + qos(병렬큐)가 있고
main큐가 직렬로 다 처리하고 한가해지면 직렬큐(custom) + 병렬큐(2.1, 2.2, 2.3, 2.4)을 처리함
큐는 우선순위에 따라 선택되고,
선택된 큐는 다시 안에 들어있는 내용물을 병렬로 또는 직렬로 처리함
-> 네트워크 관련 일을 병렬로 처리해버리면 네트워크 자원을 많이 잡아먹는다!
*추가로 viewWillAppear에 네트워크 처리 등을 넣어주면 좋음(비동기로 여기서 시작하면 됨)
'정리 X > Multi Threading' 카테고리의 다른 글
| Operation Queue에 대하여 (0) | 2021.02.06 |
|---|---|
| 멀티 쓰레딩에 관하여 (0) | 2021.02.06 |