当前位置: 首页 > 知识库问答 >
问题:

一个同步的单核CPU上的代码怎么可能是异步的?

叶炜
2023-03-14

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

我们如何在UP机器上的软件中具有异步行为?一切不都是按照操作系统选择的固定顺序运行的吗?

即使是无序执行的CPU也会产生按程序顺序运行指令的假象。(这与系统中其他内核或设备观察到的内存重新排序不同。在UP系统中,运行时内存重新排序仅与设备驱动程序相关。)

共有2个答案

章烨烨
2023-03-14

许多处理器能够进行多线程处理,许多操作系统可以通过在处理器内外交换任务来模拟单线程处理器上的多线程处理。

荣俊
2023-03-14

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

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

诸如来自网络数据包到达或磁盘I/O完成的中断之类的事件与CPU在中断之前所做的任何事情都是异步发生的。

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

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

在一个操作系统中,输入/输出完成可导致POSIX信号的传递(即使用POSIX异步输入/输出),信号的定时可以很容易地通过硬件中断的定时来确定,因此用户空间代码与计算机外部事物确定的定时异步运行。这不仅仅是内核的问题。

在多核系统上,显然有更多的方式在更多的时间里以不同的顺序发生。

 类似资料:
  • 是否可以调用一个异步方法,以便它从一个同步的方法异步运行?我不关心它挂起同步调用程序直到它返回,而是希望该方法被异步调用。

  • 问题内容: 我们正在与节点合作,主要用于内部项目,并了解使用该技术的最佳方法。 并非来自特定的异步背景,学习曲线可能是一个挑战,但是我们已经习惯了框架和学习过程。 使我们两极分化的是,何时才是使用同步代码与异步代码的最佳时间。我们目前使用的规则是,如果任何东西与IO进行交互,那么它必须通过回调或事件发射器(即给定的)是异步的,但是可以将任何未使用IO的其他项构造为同步函数(此方法还将取决于函数本身

  • 我有一些代码,它使用的是class的方法,它是异步的。另外,我正在使用微软的单元测试应用程序项目来测试应用程序。 问题是测试框架并没有等待异步代码的运行结束,所以我无法检查它的结果。 如何使用Unit Test App项目测试异步代码?我没有使用异步/等待修改器。

  • 异步代码是指当调用后不会立即完成的代码。 setTimeout(() => { console.log('do stuff'); }, 3000 ) 在 setTimeout 执行完3秒后 do stuff 会输出到控制台。我们可以看出当指定的时间过去后我们所提供的异步函数会触发。现在来看个更有启发性的示例: doWork( () => { console.log('call me whe

  • 我正在编写一段scala代码,其中第三方库返回一个Future[Boolean]对象,而我需要在我的scala代码中使用这个Future对象,这段代码完全是以同步方式编写的。 目前,我正在对第三方库操作执行Await.result,以确保它只返回布尔值。有没有更好的处理方法,我的scala代码需要一个布尔值来做进一步的操作?