- 하나의 프로그램에서 동시에 여러개의 일을 수행할 수 있도록 해주는 것
장점: 프로세스를 이용하여 처리하던 일을 스레드로 구현할 경우 메모리 공간과 시스템 자원 소모 ⬇
단점: 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 다른 값을 읽어오거나 수정할 수 있다.
-
global queue를 사용할 때, 작업마다 중요도를 매겨서 순위에 따라 처리하는 것
-
queue의 클로저 형태의 작업 두가지
- sync: 함수가 완료되기 전까지 다른 코드가 실행되지 않음 (동기)
→ 호출된 함수가 실행 중인 스레드와같은 스레드에서 실행
- async: 호출된 함수가 실행되는 동안에도 다른 코드가 실행됨 (비동기)
→ 보통 백그라운드에서 실행되며,호출된 함수가 완료될 때 콜백 블록 실행
- sync: 함수가 완료되기 전까지 다른 코드가 실행되지 않음 (동기)
userInteractive | userInitiated | utility | background | |
---|---|---|---|---|
사용 예시 | UI 작업, 사용자 입력 처리 |
API를 통해 데이터 호출 |
큰 양의 데이터 처리 계산같은 복잡한 작업 (필요한 시간에 처리해야 하는..) |
파일 다운로드, 위치 추적 |
우선 순위 | 1 | 2 | 3 | 4 |
- Grand Central Dispatch = DispatchQueue
GCD를 사용하면..
- 시스템에서 자동으로 작업을 분할해줌
- 적절한 스레드에 할당하여 병렬적으로 실행 가능
- 비동기적인 작업을 쉽게 구현할 수 있고 큐를 사용하여 작업의 우선순위 지정, 순서 조절 가능
- Concurrency(동시성)을 구현하는 데 중요한 역할을 한다. ⭐
그래서 왜 사용하고, 무엇을 고려해야 하는 거죠 ?!!!!
🇶. 멀티 스레딩 사용 이유
🇦. 시간이 오래걸리는 작업 진행 시 어플리케이션의 실행을 방해하면 안되기 때문에
멀티코어에서 큰 작업을 여러개로 분할하여 진행, 메모리 공간과 시스템 자원을 절약하기 위해서
🇶. 멀티 스레드로 동작하는 앱을 작성하고 싶을 때 고려할 수 있는 방식
🇦. 어떤 작업을 글로벌 큐에 넣어야 하는지 정확히 알아야 하고(위에 정리해놓은 멀티 스레딩의 단점)
글로벌 큐에서 작업을 배치할 때, 작업에 따라 QoS(중요도 순위)를 적절하게 사용해야 한다.
또한 동기, 비동기 사용을 명확하게 정의해야 한다.
Q. 단점: 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 다른 값을 읽어오거나 수정할 수 있다.
충돌이 발생할 수 있어서 단점이라고 기재를 해놓으셨나요?
A. 맞습니다. 멀티 스레딩 환경에서는 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 값을 수정할 경우 충돌이 발생할 수 있습니다.
이를 해결하기 위해서는 동기화 기법을 사용해야 합니다.(뮤텍스, 세마포어, 락 등..)
Q. 장점에서, '프로세스를 이용하여'의 프로세스는 메인 쓰레드를 말씀하시는 걸까요?
A. 아닙니다. 프로세스는 메인 쓰레드가 아니라 새로운 스레드를 말하는 것 입니다.
Q. DisPatchQueue.global(qos.: .utility).sync{}
의 경우에도 현재 함수가 호출된 쓰레드와 같은 쓰레드에서 실행될까요?
A. DispatchQueue.global(qos: .utility).sync { }
를 호출하면, 해당 블록 내부의 작업은 현재 스레드에서 실행되지 않고 해당 큐에 의해 관리되는 다른 스레드(시스템에서 관리하는 스레드)에서 실행됩니다.
Q. 동기 비동기 / 직렬 병렬 질문(?)
A. 파카님이 주신 GCD 설명 링크 참고🙏