异步的底层实现

很好奇编程语言的异步支持是怎么实现的?
没搜到什么权威的文章,很多都是说另外开线程去做?
难道不需要操作系统的支持吗

阅读 6.8k
5 个回答

clipboard.png

DMA(直接内存访问)
拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源。
只要CPU在发起数据传输时发送一个指令,硬件就开始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。
这些无须消耗CPU时间的I/O操作正是异步操作的硬件基础。

1.我们所说的线程都需要操作系统支持,比如很久以前 应该是C98吧我们在C 语言中几乎找不到可以支持任何操作系统的多线程库。java 中的多线程是jvm 在底层对操作系统的线程进行啦抽象封装。
2.JS 是目前使用最多的异步编程语言。他的底层其实也是通过多线程操作做的--》message模型

说到异步通常是指IO操作异步,操作系统可以支持,如果不支持,需要库来模拟。例如windows中的I/O Complete port是真正的异步。原理上,用户代码调用异步IO请求的系统调用,操作系统将请求放在设备队列里面,IO完成后,操作系统找到队列中相应的请求,并通知用户代码(回调)

理论上,库或语言也可以在用户空间模拟这个过程。

举个栗子,NodeJS 异步是基于线程池原理的,在 *nix 系统上自行实现了线程池,而在 windows 使用了系统的 IOCP,它们被封装为 libuv 层实现跨平台。

有两种方向:

  1. 把程序内的 "执行流" (为避免混淆,下称语言线程) 绑定到操作系统提供的原生线程 (下称OS线程),由OS负责调度。典型例子是常见那个JVM。
  2. 在程序内自己管理执行流,解释器/运行时负责调度。即"绿色线程"。

    一个OS线程可能对应这样的代码:

    for p in 语言线程:
        p.向前执行几条指令()

    for p in 任务队列:
        p.run()

    典型例子是lua


更复杂的情况可能两种都有: 考虑一个用了多个JVM线程的 (有多线程的语言的解释器)。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题