在until循环中的代码是否以某个间隔运行?
e.g。在循环完成之前不会处理其他指令,或者循环是否在每个其他指令之间运行?
由于
答案 0 :(得分:0)
在最低级别,有很多物理学与计算机科学,循环等没什么关系。在芯片级,现代芯片可以并行运行大量的东西。即使忽略多个内核,如果您正在运行具有长循环的程序,很可能会发生多个中断,这将导致芯片暂停执行循环,处理中断并返回。请注意,如果您在任何类型的操作系统上运行,该中断可能会导致操作系统暂停运行循环的进程并运行完全不同的进程。
答案 1 :(得分:0)
编译器将所有高级语言代码分解为汇编(或中间代码,然后汇编)。然后,一次执行一次指令。
但是,某些指令比其他指令需要更多的时钟周期(例如,必须读取/写入主存储器)。
由于处理器的流水线架构,在此期间执行其他指令通常是有益的。请在处理器的instruction pipeline上阅读此内容以了解基本阶段。
许多编译器将对汇编指令的排序执行优化,以减少等待时间(最大化处理器的流水线性质)。
循环本身并不是单个指令,而是汇编中的几个指令。
最后,我认为你无法保证所需的时间。但是要知道,一次迭代与另一次迭代相比,它很可能无法辨别。
我不确定我是否回答了你的问题,或者过度回答了问题。如果您想了解更多细节或资源,请与我们联系。这是圆顶的顶部。
答案 2 :(得分:0)
假设控制线程开始处理循环。在该控制线程上执行任何其他代码之前,循环将运行完成。
如果你有一个多线程程序,你的程序可以在该循环运行时继续做其他事情。不同的线程独立执行,它们的执行可以在多线程环境中重叠。
下面真正发生的事情取决于硬件以及如何在处理器上调度线程。如果线程在同一个处理器核心上进行调度,那么它们的执行将是交错的:调度程序通常会将一些量程分配给一个线程,下一个量程分配给其他某个线程,等等。如果线程在不同的处理器上进行调度,则量子可以重叠,线程实际上可以同时处理指令。
高级语言循环通常被翻译成依赖于跳转的机器语言代码(其中至少有一个指向程序中的早期地址)。首先评估一些条件 - 在英特尔架构上你可能有CMP
或SUB
或者任何设置适当标志的指令 - 然后你会有JNZ
之类的指令(跳转如果不为零)或JG
(如果大于,则跳转)依赖于比较指令设置的标志以将指令指针更新为适当的值。指令指针更新后,为该控制线程取出的下一条指令来自正确的位置。
当调度程序在处理器内核上切换控制线程时,它执行所谓的上下文切换以使用正确的值更新指令指针,寄存器等,以便控制线程看到与上次执行时相同的可观察处理器状态。这需要一些时间并且表示与时间量子调度方法相关联的低效率(例如,可能仅在他们不再需要记住状态时调度控制线程,或者允许线程在存储之后明确地产生以某种方式,线程可以在以后明确检索它的状态,等等。)
这是如何工作的计算机体系结构的主题,所以我会推荐一本好的本科水平的教科书,以供进一步阅读。