Multithreading 异步和调度-库如何避免在最低级别阻塞?
我已经使用各种并发结构有一段时间了,但我没有考虑所有这些神奇的事情是如何发生的,这最近让我越来越不安 为了弥补这一点。。。感觉上,我一直在阅读async如何在引擎盖下工作。当我说async时,在本例中我指的是userland/greenthread/cooperative multitasking,尽管我假设其中一些概念也适用于传统操作系统管理的线程,因为涉及到调度器和工作线程 我知道一个工作进程如何挂起自己并让其他工作进程执行,但在非阻塞库代码的最低级别,调度程序如何知道以前挂起的工作进程何时完成并唤醒该工作进程?Multithreading 异步和调度-库如何避免在最低级别阻塞?,multithreading,asynchronous,nonblocking,fibers,green-threads,Multithreading,Asynchronous,Nonblocking,Fibers,Green Threads,我已经使用各种并发结构有一段时间了,但我没有考虑所有这些神奇的事情是如何发生的,这最近让我越来越不安 为了弥补这一点。。。感觉上,我一直在阅读async如何在引擎盖下工作。当我说async时,在本例中我指的是userland/greenthread/cooperative multitasking,尽管我假设其中一些概念也适用于传统操作系统管理的线程,因为涉及到调度器和工作线程 我知道一个工作进程如何挂起自己并让其他工作进程执行,但在非阻塞库代码的最低级别,调度程序如何知道以前挂起的工作进程何时
- 例如,如果您在某种异步块中启动一个worker,并执行一个通常会阻塞的操作(例如HTTP请求、SQL查询、其他I/O),那么即使您的调用代码是异步的,该操作(库代码)最好善用您的异步框架,否则您已经有效地挫败了使用它的目的,并且在调度程序等待在非阻塞调用代码中执行的阻塞调用完成时阻止了它调用其他等待操作(问题)
- 现在我们有异步代码调用其他异步库代码,现在我再次问自己这个问题-异步库代码如何知道何时暂停和恢复操作?
- 这些套接字如何启动操作,在完成之前继续,然后select如何知道数据何时可用
- 您是否一直在检查一些缓冲区,以查看字节是否已在无限循环中传递,如果没有,则继续
- David Beazley的精彩视频中,他带领您完成了一个简单的调度器实现,该调度器通过在等待队列中休眠来触发回调并暂停执行。我发现这段视频非常有启发性,但它的结尾有点短,因为它向您展示了如何使用异步睡眠释放调度程序来执行其他工作程序,但并没有真正探讨当您调用这些工作程序中的代码时会发生什么,这些工作程序本身必须是非阻塞的,这样它才能很好地与调度程序配合
- -这使我的理解更进一步,但仍有一些不确定性