해당 포스팅은 iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해 강의를 수강하고 개인적으로 정리한 내용을 기록한 것 입니다.
동시성과 관련된 문제란 2개 이상의 스레드를 사용하면서, 동일한 메모리 접근 등으로 인해 발생할 수 있는 문제들을 의미하는 것으로, 실행 시마다 항상 같은 순서로 발생하는 것이 아니기 때문에 디버그 하기가 어렵다.
Race Condition (경쟁 상황)
다른 스레드에 놓인 2개 이상의 작업들이 공통 변수(메모리)에 접근하게 될 때 발생
Deadlocks (교착 상태)
교착상태의 다양한 발생 가능성
- 동기 작업이 현재의 스레드가 필요한 경우
- 앞선 작업이 현재의 스레드가 필요한 경우
- 여러 개의 세마포어가 존재할 때, 순서 잘못 설계 등
문제 해결
시리얼 큐로 해결 가능(세마포어와 같은 제한된 리소스 순서가 존재할 시 주의해야 한다.)
Priority Inversion (우선 순위의 뒤바뀜)
우선순위가 각각 다른 스레드 사이에서 하나의 스레드가 접근할 때 잠금 처리 되는 공통 변수에 접근할 때 발생
낮은 우선 순위의 작업이 자원을 배타적으로 사용하고 있을 때, (다른 작업이 자원을 사용하지 못하게 막고 있으므로) 작업의 우선 순위가 바뀔 수 있음
우선 순위 뒤바뀜의 다양한 발생 가능성
- 시리얼큐에서 높은 우선순위 작업이 낮은 우선순위의 뒤에 보내지는 경우
- 낮은 우선순위의 작업이 높은 우선순위가 필요한 자원을 잠그고 있는 경우 (lock 코드, 세마포어 등)
- 높은 우선순위 작업이 낮은 작업에 의존하는 경우
문제 해결
- 1차적으로 GCD가 우선 순위를 조정해서 알아서 해결(낮은 우선순위 작업의 우선 순위를 높여서 우선 처리)
- (안전하게) 공유된 자원 접근 시 동일한 QoS 사용
이미지 출처: https://www.inflearn.com/course/iOS-Concurrency-GCD-Operation