代码如何在同步的单核CPU上异步?

Ara*_*oft 2 asynchronous cpu-architecture

单处理器 (UP) 系统中中,只有一个 CPU 核心,因此一次只能执行一个线程。该执行线程是同步的(它获取队列中的指令列表并逐条运行它们)。当我们编写代码时,它会编译为 CPU 指令集。

我们怎样才能在 UP 机器上的软件中实现异步行为? 难道一切不是都按照操作系统选择的固定顺序运行吗?

即使是乱序执行的CPU 也会给人一种按程序顺序运行指令的错觉。(这与系统中其他内核或设备观察到的内存重新排序是分开的。在 UP 系统中,运行时内存重新排序仅与设备驱动程序相关。)

Pet*_*des 5

中断处理程序是一段与其余代码异步运行的代码,可以响应来自 CPU 外部设备的中断。在用户空间中,信号处理程序具有等效的语义。

或者硬件中断可能导致上下文切换到另一个软件线程。就软件线程而言,这是异步的。)

网络数据包到达中断或磁盘 I/O 完成等事件相对于 CPU 在中断之前所做的任何事情都是异步发生的。

异步并不意味着同时,只是它可以在其余代码的任意两个机器指令之间运行。用户空间程序中的信号处理程序可以在任意两个机器指令之间运行,因此主程序中的代码必须以一种即使发生这种情况也不会中断的方式工作。

例如,具有信号处理程序的程序无法对当前堆栈指针下方的堆栈上的数据(即堆栈的未保留部分)做出任何假设。是对此规则的修改,仅适用于用户空间,因为内核在将控制权转移到信号处理程序时可以尊重它。内核本身不能使用红区,因为在运行中断处理程序之前,硬件中断会在软件控制之外写入堆栈


在 I/O 完成可能导致 POSIX 信号传送(即使用 POSIX 异步 I/O)的操作系统中,信号的时序可以通过硬件中断的时序轻松确定,因此用户空间代码运行与计算机外部事物确定的定时异步。这不仅仅是内核的问题。


在多核系统上,显然有更多的方法可以让事情在更多的时间以不同的顺序发生。