
비동기 함수의 실행 상태를 관리하기 위한 구조
함수 재실행에 필요한 정보를 저장
함수는 자신이 동작하는 스레드의 Stack에 매개 변수, 동작을 쌓아 실행된다.


하지만 Swift Concurrency에서는 GCD와 다르게 제한된 Thread들로 돌려가며 쓰기 때문에 Thread가 하던 작업을 멈추고 다른 작업을 하기 위해 Stack을 비워줄 필요가 생긴다.
위에서 설명했듯이 Thread를 각 비동기 함수들이 공유하기 때문에 Stack에 저장할 수는 없다.
그렇기 때문에 모든 Thread가 접근할 수 있는 곳. 순서가 존재하지 않는 곳. heap을 사용한다.
게다가 heap 영역은 process 내의 모든 Thread가 공유하는 메모리 영역이기 때문에 문맥 교환없이 재개가 가능하므로 성능 향상을 기대할 수 있다.
func someAsyncFunc() async -> Int {
let someInt: Int = 3
await someAction() // 이때 위의 someInt값과 실행정보들이 asyncFrame형태로 감싸져 heap에 저장
...
}
비동기 함수가 await을 만나면서 스레드 제어권이 시스템에 넘어가기 전에 함수의 정보를 async Frame이라는 무형의 형태로 담아 heap에 저장된다.
사실 Async Frame은 Continuation을 apple이 새로 이름 붙인 느낌이다.
프로세스 실행 중 특정 시점의 계산 프로세스를 나타내는 데이터 구조입니다. 위키백과
여기서 설명하는 Continuation을 보자.
"Say you're in the kitchen in front of the refrigerator, thinking about a sandwich. You take a continuation right there and stick it in your pocket."
당신이 주방에서 냉장고 앞에 서서 샌드위치를 생각하고 있다고 해봅시다. 그 순간, Continuation을 "저장"해서 주머니에 넣습니다.
👉 해석: 현재의 상태(냉장고 앞에 있고, 샌드위치를 만들기 전 상태)를 저장함.
"Then you get some turkey and bread out of the refrigerator and make yourself a sandwich, which is now sitting on the counter."
그 다음에 칠면조 고기와 빵을 꺼내 샌드위치를 만들었고, 그것은 이제 식탁 위에 있습니다.
👉 해석: 실제로 프로그램이 데이터를 처리한 것. 샌드위치를 만들었고, 그 결과물이 있음.
"You invoke the continuation in your pocket, and you find yourself standing in front of the refrigerator again, thinking about a sandwich."
이제 주머니에서 Continuation을 꺼내 실행하면, 다시 냉장고 앞에서 샌드위치를 생각하던 시점으로 돌아갑니다.
👉 해석: 이전에 저장했던 실행 상태로 복귀
"But fortunately, there's a sandwich on the counter, and all the materials used to make it are gone. So you eat it. :-)"
하지만 다행히도 샌드위치는 여전히 식탁 위에 있고, 재료들은 사라졌습니다. 그래서 그 샌드위치를 먹습니다.
👉 해석: Continuation은 코드 실행 상태만 저장. 외부 상태(예: 만들어진 샌드위치)는 여전히 존재.
그냥 비동기 함수의 동작에 대해 매끄럽게 이어나갈 수 있도록 만든 구조다.
참고: