해당 포스팅은 iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해 강의를 수강하고 개인적으로 정리한 내용을 기록한 것 입니다.

동시성과 관련된 문제란 2개 이상의 스레드를 사용하면서, 동일한 메모리 접근 등으로 인해 발생할 수 있는 문제들을 의미하는 것으로, 실행 시마다 항상 같은 순서로 발생하는 것이 아니기 때문에 디버그 하기가 어렵다.

상반되는 개념 - Thread-Safety
여러 스레드가 동시에 쓰여도 안전하다는 의미.
동시적 처리를 하면서도 한번에 한 개의 스레드만 접근 가능 하도록 처리하여 (경쟁 상황의) 문제없이 스레드를 안전하게 사용하는 것.




Race Condition (경쟁 상황)


다른 스레드에 놓인 2개 이상의 작업들이 공통 변수(메모리)에 접근하게 될 때 발생


Deadlocks (교착 상태)



교착상태의 다양한 발생 가능성

  • 동기 작업이 현재의 스레드가 필요한 경우
  • 앞선 작업이 현재의 스레드가 필요한 경우
  • 여러 개의 세마포어가 존재할 때, 순서 잘못 설계 등

문제 해결

시리얼 큐로 해결 가능(세마포어와 같은 제한된 리소스 순서가 존재할 시 주의해야 한다.)


Priority Inversion (우선 순위의 뒤바뀜)


우선순위가 각각 다른 스레드 사이에서 하나의 스레드가 접근할 때 잠금 처리 되는 공통 변수에 접근할 때 발생
낮은 우선 순위의 작업이 자원을 배타적으로 사용하고 있을 때, (다른 작업이 자원을 사용하지 못하게 막고 있으므로) 작업의 우선 순위가 바뀔 수 있음

우선 순위 뒤바뀜의 다양한 발생 가능성

  • 시리얼큐에서 높은 우선순위 작업이 낮은 우선순위의 뒤에 보내지는 경우
  • 낮은 우선순위의 작업이 높은 우선순위가 필요한 자원을 잠그고 있는 경우 (lock 코드, 세마포어 등)
  • 높은 우선순위 작업이 낮은 작업에 의존하는 경우

문제 해결

  • 1차적으로 GCD가 우선 순위를 조정해서 알아서 해결(낮은 우선순위 작업의 우선 순위를 높여서 우선 처리)
  • (안전하게) 공유된 자원 접근 시 동일한 QoS 사용


이미지 출처: https://www.inflearn.com/course/iOS-Concurrency-GCD-Operation