Summary 41 It can be implemented in a very memory-efficient way It's easy to implement for various platforms Drawbacks Pre-emption can be hard, or impossible, to fully implement, as the tasks can't be stopped in the middle of a stack frame It needs compiler support to leverage its full advantages Debugging can be difficult both due to the non-sequential program flow and the limitations on the information you get from the backtraces. Summary Y ou're still here? That's excellent! Good job on getting through all that background information. I know going through text that describes abstractions and code can be pretty daunting, but I hope you see why it's so valuable for us to go through these higher-level topics now at the start of the book. We'll get to the examples soon. I promise! In this chapter, we went through a lot of information on how we can model and handle asynchronous operations in programming languages by using both OS-provided threads and abstractions provided by a programming language or a library. While it's not an extensive list, we covered some of the most popular and widely used technologies while discussing their advantages and drawbacks. We spent quite some time going in-depth on threads, coroutines, fibers, green threads, and callbacks, so you should have a pretty good idea of what they are and how they're different from each other. The next chapter will go into detail about how we do system calls and create cross-platform abstractions and what OS-backed event queues such as Epoll, Kqueue, and IOCP really are and why they're fundamental to most async runtimes you'll encounter out in the wild.