지난 시간
지난 시간에는 GCD 의 종류에 이어서 DispatchGroup, DispatchWorkItem, Semaphore 까지 다양한 방법으로 비동기 작업을 할 수 있는 방법에 대해서 알아보았다. 하지만 이러한 비동기 처리를 하게 되면 발생되는 문제들이 있다. 이번 포스팅에서는 문제들을 역시나 간단하게 알아보려고 한다. (심화과정은 제가 더 공부해야 할 것 같아요)
Thread-Safety
문제점이라면서 갑자기 Thread-Safety 가 뭐야? 할 수 있겠지만...! 아래에서 설명할 동시성 관련 문제들을 해결하여 여러 개의 스레드를 사용하는 환경에서 프로그램이 예상대로 동작하고, 데이터의 무결성, 일관성을 보장할 수 있게 Thread-Safety 하게 프로그래밍하는 것이 목표이기 때문에 위의 용어를 먼저 설명해 보았다. 그렇다면 이제 진짜 문제에 대해서 알아보자.
Race Condition 경쟁 상황
두 개 이상의 스레드가 동일한 데이터에 동시에 접근할 때 발생한다. 하나의 변수에 두 가지 비동기 작업이 이루어진다면 어떻게 될까? 간단하게 그림을 그려보았다. 10 이라는 변수에 1 을 더하는 두 개의 작업이 비동기적으로 이루어 진다면...? 결국 두개의 작업이 경쟁하게 된다. 결과는 11로 나오겠지만 그렇다면 하나의 일은 무의미해지게 된다. 만약 작업이 더 복잡하다면 어떠한 문제가 생길지 모르는 위험한 상황이다!
Deadlock 교착상태
서로가 서로를 막고 있는 상황이라고 이해하면 쉬울 것 같다. 아래에 재밌는 그림이 있어서 가져와봤다.
간단하게 그림을 그려서 설명한다면... 두 가지 작업이 각각 서로의 자원을 원하는데 접근이 막혀있어서 서로의 작업이 종료되기를 기다리는 상황이 데드락이다. 두가지 작업이 서로의 작업이 종료되기를 기다린다면 영원히 두가지 작업은 진행이 되지 않을 것이다.
Priority Inversion 우선순위 뒤바뀜
이 부분은 간략하게 이해했는데 위의 하나의 작업이 하나의 자원을 점유하고 있을 경우 그 작업이 우선순위가 낮더라도 먼저 처리된다는 것이다. 왜냐하면 높은 우선순위더라도 자원을 사용할 수 없게 된다면 처리할 수가 없게 된다는 것이다. Task 2 가 가장 높은 우선순위였지만 Task 1 을 기다리는 동안 그림에는 없는 Task 3, Task 4 가 처리될 수도 있다. 하지만 이러한 부분은 GCD 에서 Task 2 가 Task 3, Task 4 보다 우선적으로 처리될 수 있게끔 알아서 해준다고 한다.
결론
결국 동시처리를 위해 순서를 지정해주지 않아 발생하는 문제들이 이런 것들이 있구나 이러한 것들을 고려하여 Thread-Safety 한 코드를 만들어야겠구나 생각이 들었다. DispatchBarrier 을 사용하거나 Semaphore, Serial Queue와 Sync 를 활용하여 위의 문제들을 해결 할 수 있다.
'→ Swift Study' 카테고리의 다른 글
[Swift] Do, Try, Catch 간단하게 알아보기 (0) | 2024.02.09 |
---|---|
[Swift] 약한참조 (weak self) Swift 로 실습해보기 (0) | 2024.01.21 |
[Swift] GCD 알아보기 3 - DispatchGroup (0) | 2024.01.11 |
[Swift] GCD 알아보기 2 - GCD 종류 (0) | 2024.01.09 |
[Swift] GCD 알아보기 1 - 동기, 비동기, 직렬, 동시, 병렬 (1) | 2024.01.08 |