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