很好奇编程语言的异步支持是怎么实现的?
没搜到什么权威的文章,很多都是说另外开线程去做?
难道不需要操作系统的支持吗
1.我们所说的线程都需要操作系统支持,比如很久以前 应该是C98吧我们在C 语言中几乎找不到可以支持任何操作系统的多线程库。java 中的多线程是jvm 在底层对操作系统的线程进行啦抽象封装。
2.JS 是目前使用最多的异步编程语言。他的底层其实也是通过多线程操作做的--》message模型
说到异步通常是指IO操作异步
,操作系统可以支持,如果不支持,需要库来模拟。例如windows中的I/O Complete port
是真正的异步。原理上,用户代码调用异步IO请求的系统调用,操作系统将请求放在设备队列里面,IO完成后,操作系统找到队列中相应的请求,并通知用户代码(回调)
理论上,库或语言也可以在用户空间模拟这个过程。
有两种方向:
在程序内自己管理执行流,解释器/运行时负责调度。即"绿色线程"。
一个OS线程可能对应这样的代码:
for p in 语言线程:
p.向前执行几条指令()
或
for p in 任务队列:
p.run()
典型例子是lua
更复杂的情况可能两种都有: 考虑一个用了多个JVM线程的 (有多线程的语言的解释器)。
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
DMA(直接内存访问)
拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源。
只要CPU在发起数据传输时发送一个指令,硬件就开始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。
这些无须消耗CPU时间的I/O操作正是异步操作的硬件基础。