multithreading - 对于CPU调度或中断,CPU会不会执行完当前指令?

标签 multithreading operating-system

我们知道,像C++中的“counter++”这样的高级语言指令会被翻译成多条汇编语言指令。

我的问题是单个汇编语言指令怎么样?是不是某些汇编语言指令也会被翻译成硬件可以直接读取的几条机器指令?

如果是肯定的,当线程/进程调度发生时,上下文切换(或其他需要在调度期间完成的事情)是否会在 CPU 执行完当前机器指令后立即发生,即使还有几条指令留下单个汇编语言指令与当前指令一起使用?

例如,
一个汇编语言指令A可以被翻译成机器指令a1、a2、a3。上下文切换可以在 a2、a3 之间发生吗?

单条汇编语言指令A对应的机器指令:

a1(已执行)
a2 (executing..) <--- 下一个上下文切换即将发生
a3(尚未执行)<--- 我可以在下一次上下文切换之前执行吗?

我的猜测是 a3 不会被执行,因为硬件只知道它的机器指令并且不知道汇编语言。所以每条指令都是分开执行的。我对吗?

最佳答案

实际上,在不少机器上,counter++将转换为单个指令(例如, inc counter )。

几乎汇编语言的定义是,您正在编写的只是实际机器代码的助记符,因此一条汇编指令转换为一条机器指令。

某些 CPU (x86) 是微编码的,因此您作为单个指令输入的内容实际上是作为一系列微操作执行的。从指令到微操作的确切映射通常没有记录(例如,英特尔在 Pentium Pro/Pentium II 时间范围内做了,但大多数情况下不再有)。

中断有两种。大多数只会在当前机器指令执行完毕后执行。但是,有一些可以在执行单个指令期间中断。一个典型的例子是尝试访问不存在的内存页面。如果这样做,机器将中断当前指令,并跳转到异常处理程序。异常处理程序通常会调入该地址的数据。当它返回时,存在地址的数据。指令重新启动,可以成功执行。

关于multithreading - 对于CPU调度或中断,CPU会不会执行完当前指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5738968/

相关文章:

python - 多处理中的有序状态打印

linux - 无法在 x86 ubuntu linux 上添加自定义系统调用

在linux机器上调用系统调用

python - 为什么在我给出位置参数时 lambda 返回 "<lambda>() takes 0 positional arguments but 1 was given"?

java - Spring集成MessageQueue无需轮询

c++ - 多线程应用程序中无锁队列的访问冲突

c++ - 为什么在使用线程池时对 boost::async 的嵌套调用会阻塞?

java - 需要帮助在 Android 中实现多线程服务,该服务可以根据字符串对特定线程排队任务

linux - 如何从 Ubuntu 18.04 中删除 notepad++ 软件包?

macos - Mac OS X Mavericks : How do I remove the quarantine flag from my Sparsebundle mount?