Introducing coroutines
At the end of your journey, we’d like to remind you about the knowledge you received in Chapter 1 and Chapter 2 about processes and threads. If you remember well, a process is simply a running instance of a program. It has its respective address space, which is not shared with others, except through shared memory. Threads reside in a process, and they cannot exist outside of them, although both processes and threads are treated as tasks in Linux. They are scheduled in the same manner and have the same controlling structures on the kernel level. Still, threads are considered lightweight because the bigger overhead for the initial load of a program is taken by the parent process.
But this is not the full picture. There are fibers and coroutines as well. If the processes and threads are truly concurrent and working in parallel over shared resources, fibers are just like threads but are not concurrency-compliant. While threads often depend on preemptive...