只是为了阻止任何关于“你为什么需要知道这个??”的评论:这只是一个我很好奇的谜题,而不是我出于任何实际原因需要做的事情。
给定一个典型的 POSIX 系统[1],您将如何设计一个实验来确定 CPU 绑定进程的调度量[2]?
[1]:但不能让您通过系统调用或 /proc 接口查询此信息
[2]:“调度量子”定义为进程在其调度时间结束并且操作系统允许不同进程运行之前在 CPU 上运行而不会阻塞或让步的时间量。
只是为了阻止任何关于“你为什么需要知道这个??”的评论:这只是一个我很好奇的谜题,而不是我出于任何实际原因需要做的事情。
给定一个典型的 POSIX 系统[1],您将如何设计一个实验来确定 CPU 绑定进程的调度量[2]?
[1]:但不能让您通过系统调用或 /proc 接口查询此信息
[2]:“调度量子”定义为进程在其调度时间结束并且操作系统允许不同进程运行之前在 CPU 上运行而不会阻塞或让步的时间量。
我不确定它有多准确,但这可能有效:
请注意,这假设您的时钟分辨率大于调度程序的量子大小;如果不是(例如,如果您尝试使用分辨率为 10mS 的时钟来测量 5mS 的量子长度),那么测量量子长度将是困难的 AFAICT。
我认为您可以通过对以下系统的足够运行次数进行统计分析来获得答案:
每个处理器运行一个线程以清除终止标志,然后运行一个循环进行固定次数的迭代或直到设置终止标志,以先到者为准。这些线程记录它们是由于运行所有迭代而终止,还是由于设置了终止标志。
同时,运行一个设置终止标志的附加线程。
在循环中进行各种迭代次数。
如果循环在线程时间片内完成,它将完成所有迭代。如果它没有在线程时间片内完成,终止线程将有机会中断循环线程之一。
现在,终止线程有时会首先被调度,并且可能还有其他线程在运行使行为复杂化,因此您可能需要在多处理器系统上运行很多次并统计分析结果。您还需要考虑线程启动时间和内存访问时间等因素,因为在通过循环检查标志的每次迭代中可能会有一个内存屏障。
但是,在足够不同的循环迭代限制下有足够的重复次数,这应该会给您在一个时间片内可以迭代循环的次数。然后您可以在卸载的系统上运行大量迭代以获取每次迭代所需的时间长度,然后计算每个时间片的挂钟时间。