[Swift] Concurrency 개념 정리

Jenny·2024년 2월 28일

Swift Grand-Central-Dispath

  • GCD에 단점은 프로세스에 다른 스레드를 제공함으로써 각 코어는 언제든지 작업(work)을 실행 중인 스레드를 계속 갖고 있을 수 있다. 이를 통해 지속적인 수준의 동시성을 제공해준다.
  • 차단된 스레드는 추가 진행을 위해 세마포어와 같은 리소스를 기다리고 있을 수 있다. queue 에서 작업을 계속하기 위해 실행되는 새 스레드는, 첫 번째 스레드에서 대기 중인 리소스의 차단을 해제 (unblock) 하는 데 도움이 될 수 있습니다.

Swift GCD or Async/Await 내용 정리

  • Swift Concurrency 에서는 Thread의 제어건을 포기하고 suspended 라는 현상이 발생한다. 그러기에 다시 제어권을 돌려 받을때 어디서 부터 실행할지를 알아야 하는데 async function 의 경우 Heap에 suspension point에서 실행하는데 필요한 함수 컨텍스트들을 저장해서 제어권을 돌려받을때 어디서실행할지를 알수있게 됩니다. 이것을 continuation이라고 부릅니다

Swift GCD

  • Grand-Central-Dispatch를 사용하면 async 로 작업을 수행하고 나서 보통 탈출 클로져를 이용한 completion handler 를 통해 작업이 끝났을 때의 처리를 해주게 된다.
  • 기존 completion handler 같은 경우 self Property를 참조하게 될 경우 retain Cycle 이 발생할 수 있습니다.
  • completion handler이 중첩 될 경우 코드의 가독성이 떨어지며 콜백 지옥의 코드를 보실 수 있습니다.

Swift async/await

  • async 코드는 동시(Concurrent) 콘텍스트 에서만 실행이 가능합니다.
  • await를 통해 비동기 함수의 실행을 동기 시키는 명령을 한다. await 키워드를 만나면 해당 지점은 Suspension point를 표시하게 된다.
  • await 는 함수 안에서 실제로 어떤 명령에서 Suspension point가 생겨날 수 있는지 명시 하는 역할을 한다.

Swift Suspension point

  • Suspension pointawait를 통해 함수를 호출 하게 되면 그 지점이 Suspension point 가 되며 해당 함수를 호출한 Thread 의 제어권을 System에 게 넘기는 것을 말한다. (suspend)
  • 제어권을 넘겨 받은 System은 다른 Task 를 수행하다가 비동기 함수가 완료 되었을때 다시 Thread 제어권을 돌려준다.
  • 이러한 과정을 거치며 Suspension point에서 작업 재개 한다 (resume)
  • 이러한 스레드 관리를 개발자기 직접 처리하는 것이 아닌 System 자체에서 처리하기에 안전성을 보장 받을 수 있다.

img

Swift continuation

  • continuation 이란 특정 지점에서 함수실행 콘텍스트를 추적할수 있는 객체 이다.
  • Stack에는 async function 을 실행할때 사용되지 않는 지역변수를 저장하며, 추가로 Heap 에는 suspension point에서 실행하는데 필요한 함수 콘텍스트들을 저장한다. 이를 통해 일시 정지된 함수의 상태를 추적해 어디서 부터 재개해야 할지 알 수 있다.
  • continuationHeap에 저장되기 때문에 스레드 간의 함수 컨텍스트 공유를 할 수 있다.

continuation 장점

  • 최대로 실행되는 Thread 개수와 코어 개수와 동일하며 Thread간의 Context switch가 없다.
  • 추가적인 스레드 생성없이 스레드 재사용을 할 수 있다. 즉 Thread explosion을 방지 할 수 있다.
profile
"Jenny 있게 iOS 개발을 하며 대체 불가능한 인재가 되자"

0개의 댓글