在给定的时间段内,线程执行的指令数量是不是最少? [关闭]
Posted
技术标签:
【中文标题】在给定的时间段内,线程执行的指令数量是不是最少? [关闭]【英文标题】:Is there a minimum number of instructions executed by thread during given time slot? [closed]在给定的时间段内,线程执行的指令数量是否最少? [关闭] 【发布时间】:2017-08-11 05:20:55 【问题描述】:在任何给定的时间段内,是否有保证由线程执行的最少指令数。 Execution Model 的***页面说“加法运算是许多语言中不可分割的工作单元”
我想了解更多关于使用 C/C++ 的 POSIX 线程的执行模型以及保证在单个时隙中执行的不可分割指令或语句的最小数量。有人可以指点一下我可以从哪里了解更多信息。谢谢提前
【问题讨论】:
您想解决什么问题,您认为对您的问题的回答会让您更接近解决方案? C++ 标准唯一保证的是“[intro.multithread]/3 实现应确保所有未阻塞的线程最终都能取得进展。” 不是您问题的答案,而是:在某些机器上的某些情况下,加法可能是一条指令,而在其他机器上则不止一条。如果您要添加两个相同大小的寄存器并将结果放回相同大小的寄存器中,那么它可能是一条指令,而在没有指令流水线的机器上,它可能是一个周期。但是,如果您需要从内存中读取值怎么办——这几乎总是需要一个以上的周期。如果寄存器的大小不同,处理器可能必须执行读取-修改-写入,这绝对不是不可分割的。 我在编写多线程应用程序时从未考虑过这一点,因为它似乎几乎无关紧要,但我想答案是“一条机器指令”。将线程设置为在内核上运行然后几乎立即被已准备好在某些 I/O 中断或线程间信号发送上的更高优先级线程中断和抢占并不是不合理的。 【参考方案1】:不,不能保证每次指令的数量。无论如何,事情的工作方式比执行一组指令要复杂得多。
执行的指令更多地取决于处理器架构而不是语言。许多介绍性设计课程中教授的“传统” MIPS 体系结构将在每个时钟周期执行一条指令;像这样设计的以 1MHz 运行的处理器每秒将执行一百万次操作。现实世界的处理器使用流水线、分支预测、“超线程”等技术,并且每个时钟周期没有固定数量的操作。
除此之外,现实世界的处理器通常会在具有多任务处理能力的操作系统下运行。这意味着一个线程可以在未知点被内核中断,并且根本不执行任何代码,因为其他线程有处理器时间。有一些“实时”操作系统旨在为执行在处理器上运行的代码提供更多保证。
你已经对***做了一些研究;上面的一些关键字应该有助于找到更多关于该主题的文章,并且您应该能够从那里找到大量主要资源来了解有关该主题的更多信息。
【讨论】:
在没有最小指令数的情况下,如果两个线程调用 pthread_lock() 如何保证一个特定线程在另一个之前成功锁定。这种机制是如何运作的? 有些处理器指令是“原子的”,如 TSL(测试集锁定)。这些指令执行比较并将结果存储在单个指令中,并用于实现操作系统的锁定。对于您的示例,两个线程都尝试获取锁,并且作为该操作的一部分使用 TSL 指令。成功执行 TSL 指令的第一个线程获取锁;执行指令的第二个线程将失败并进入锁定等待状态。【参考方案2】:在 POSIX 线程中,有两种主要的调度策略(FIFO 和 Round Robin)。 Round Robin 是默认调度程序,因为它更公平。
当使用 RR 调度程序时,每个线程都有一定的时间(AKA 量子)来运行,因此无法保证会执行 X 条指令 - 除非我们知道每条指令需要多少时间。
您可以在此处找到有关 PThreads 调度算法的更多信息:http://maxim.int.ru/bookshelf/PthreadsProgram/htm/r_37.html
只是想说明一下 Linux 是如何定义圆形量子的:
/*
* default timeslice is 100 msecs (used only for SCHED_RR tasks).
* Timeslices get refilled after they expire.
*/
#define RR_TIMESLICE (100 * HZ / 1000)
#endif /* _LINUX_SCHED_RT_H */
【讨论】:
以上是关于在给定的时间段内,线程执行的指令数量是不是最少? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章