异步编程

线程

线程是CPU的最小调度单位,一个线程上下文本质是由PC、寄存器等构成,保存线程就是保存这些状态到内存,切换到这个线程也是恢复这些状态到CPU中。

I/O

异步的主要工作。这得益于现代计算机的I/O逻辑可以做到基本不需要CPU参与,否则异步就没有意义了。I/O是由操作系统内核完成,也就是用户线程被”挂起”后,I/O被OS接管,OS在完成I/O后将对应的文件描述符状态改变,供程序查看。

虚线程

JDK21正式引入了虚线程,虚线程本质是模拟线程,并不是真正的线程,区别于OS线程。 OS线程是虚线程的载体,虚线程是内容,虚线程异步操作时会挂起,其他虚线程加载到OS线程上继续执行,异步完成后再被调度到OS线程上。

理解模型

流水线工作,传送带上依次放入货物(调度虚线程进入OS线程),遇到有问题的货物拿下来(异步挂起),处理好后再放回去(异步完成再次调度进入OS线程)

生成器

生成器也可以进行异步编程。 原理:包装为生成器后,可以冻结函数栈帧(也就是函数执行体上下文),即异步时可以进行冻结,继续执行主线程,当异步操作完成后(冻结的是函数栈帧,I/O由操作系统内核完成),恢复栈帧到调用栈(入栈)继续执行。 比如python和js的async/await逻辑大致就是这样。但是2者的实现完全不同,python用的协程,js用的是回调模型,只不过模拟了协程的风格。