suspended 라는 현상이 발생한다. 그러기에 다시 제어권을 돌려 받을때 어디서 부터 실행할지를 알아야 하는데 async function 의 경우 Heap에 suspension point에서 실행하는데 필요한 함수 컨텍스트들을 저장해서 제어권을 돌려받을때 어디서실행할지를 알수있게 됩니다. 이것을 continuation이라고 부릅니다async 로 작업을 수행하고 나서 보통 탈출 클로져를 이용한 completion handler 를 통해 작업이 끝났을 때의 처리를 해주게 된다.completion handler 같은 경우 self Property를 참조하게 될 경우 retain Cycle 이 발생할 수 있습니다.completion handler이 중첩 될 경우 코드의 가독성이 떨어지며 콜백 지옥의 코드를 보실 수 있습니다. async 코드는 동시(Concurrent) 콘텍스트 에서만 실행이 가능합니다.await를 통해 비동기 함수의 실행을 동기 시키는 명령을 한다. await 키워드를 만나면 해당 지점은 Suspension point를 표시하게 된다.await 는 함수 안에서 실제로 어떤 명령에서 Suspension point가 생겨날 수 있는지 명시 하는 역할을 한다.Suspension point 란 await를 통해 함수를 호출 하게 되면 그 지점이 Suspension point 가 되며 해당 함수를 호출한 Thread 의 제어권을 System에 게 넘기는 것을 말한다. (suspend)System은 다른 Task 를 수행하다가 비동기 함수가 완료 되었을때 다시 Thread 제어권을 돌려준다.Suspension point에서 작업 재개 한다 (resume)System 자체에서 처리하기에 안전성을 보장 받을 수 있다.
continuation 이란 특정 지점에서 함수실행 콘텍스트를 추적할수 있는 객체 이다.Stack에는 async function 을 실행할때 사용되지 않는 지역변수를 저장하며, 추가로 Heap 에는 suspension point에서 실행하는데 필요한 함수 콘텍스트들을 저장한다. 이를 통해 일시 정지된 함수의 상태를 추적해 어디서 부터 재개해야 할지 알 수 있다.continuation 은 Heap에 저장되기 때문에 스레드 간의 함수 컨텍스트 공유를 할 수 있다.