代码如何在同步的单核CPU上异步?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码如何在同步的单核CPU上异步?相关的知识,希望对你有一定的参考价值。
在uniprocessor (UP) system中,只有一个CPU核心,因此一次只能执行一个执行线程。这个执行线程是同步的(它获取队列中的指令列表并逐个运行)。当我们编写代码时,它会编译为CPU指令集。
如何在UP机器上的软件中进行异步行为?是不是所有东西都按照操作系统选择的固定顺序运行?
即使是out-of-order execution CPU也会产生按程序顺序运行指令的错觉。 (这与系统中其他核心或设备观察到的memory reordering是分开的。在UP系统中,运行时内存重新排序仅与设备驱动程序相关。)
中断处理程序是一段代码,它与代码的其余部分异步运行,并且可以响应来自CPU外部设备的中断而发生。在用户空间中,信号处理程序具有等效的语义。
(或者硬件中断可能导致上下文切换到另一个软件线程。就软件线程而言,这是异步的。)
来自网络数据包到达或磁盘I / O完成的中断等事件与中断前CPU正在进行的任何操作异步发生。
异步并不意味着同步,只是它可以在其余代码的任何两个机器指令之间运行。用户空间程序中的信号处理程序可以在任何两个机器指令之间运行,因此主程序中的代码必须以在发生这种情况时不会中断的方式工作。
例如具有信号处理程序的程序不能对当前堆栈指针下方的堆栈上的数据做出任何假设(即,在堆栈的未保留部分中)。 x86-64 SysV ABI中的red-zone仅对用户空间的此规则进行了修改,因为内核在将控制转移到信号处理程序时可以遵守它。内核本身不能使用红区because hardware interrupts write to the stack outside of software control, before running the interrupt handler。
在I / O完成可以导致POSIX信号传递的操作系统中(即使用POSIX异步I / O),信号的时序可以很容易地由硬件中断的时序决定,因此用户空间代码运行与计算机外部事物决定的时间异步。这不仅仅是内核的问题。
在多核系统上,显然有更多的方法可以让事情在不同的时间内发生。
许多处理器都能够进行多线程处理,许多操作系统可以通过将任务交换进出处理器来模拟单线程处理器上的多线程。
以上是关于代码如何在同步的单核CPU上异步?的主要内容,如果未能解决你的问题,请参考以下文章