Multithreading 如何通过实验确定进程/线程的调度量?
只是为了避免任何关于“为什么你需要知道这个?”的评论:这只是我好奇的一个谜题,不是出于任何实际原因我需要做的事情 给定一个典型的POSIX系统[1],您将如何设计一个实验来确定CPU受限进程的调度量[2] [1] :但不允许通过syscall或/proc接口查询此信息Multithreading 如何通过实验确定进程/线程的调度量?,multithreading,scheduling,experimental-design,Multithreading,Scheduling,Experimental Design,只是为了避免任何关于“为什么你需要知道这个?”的评论:这只是我好奇的一个谜题,不是出于任何实际原因我需要做的事情 给定一个典型的POSIX系统[1],您将如何设计一个实验来确定CPU受限进程的调度量[2] [1] :但不允许通过syscall或/proc接口查询此信息 [2] :“调度量”定义为进程在其调度时间结束且操作系统允许另一个进程运行之前,在CPU上运行而不阻塞或让步的时间量。我不确定它的准确性,但这可能有效: 确保您的计算机处于空闲状态(或尽可能使其处于空闲状态) 生成2N个线程(其中
[2] :“调度量”定义为进程在其调度时间结束且操作系统允许另一个进程运行之前,在CPU上运行而不阻塞或让步的时间量。我不确定它的准确性,但这可能有效:
请注意,这假设您的时钟分辨率大于调度程序的量子大小;如果不是(例如,如果您试图使用10毫秒分辨率的时钟来测量5毫秒的量子长度),那么测量量子长度将非常困难。我认为您可以通过对以下系统的足够运行进行统计分析来获得答案:
- 为清除终止标志的每个处理器运行一个线程,然后为固定的迭代次数或直到设置终止标志(以先到者为准)运行循环。这些线程记录它们是由于运行所有迭代而终止,还是由于设置了终止标志而终止
- 同时,运行另一个设置终止标志的线程
但是,如果在足够多的不同循环迭代限制下进行足够多的重复,那么这将为您提供在一个时间片中迭代循环的次数。然后,您可以在未加载的系统上运行大量迭代,以获得每次迭代所需的时间长度,然后计算每个时间片的挂钟时间。请注意,优先级较高的进程通常会在需要时尽快运行(否则就没有必要拥有更高的优先级)。也许在你的最后一段中,你想说“……在预定时间结束之前,操作系统允许另一个优先级相同的进程运行。”@JeremyFriesner我认为在典型的系统中,进程在其时间片过期之前不会被抢占。我弄错了吗?它在Linux或FreeBSD中是如何工作的?不管怎样,我已经编辑了这个问题。通常一个进程将一直运行,直到(a)其量程过期(并且另一个具有相同优先级的进程准备运行),或者(b)另一个具有更高优先级的进程准备运行。(另一种选择是,一个准备运行的高优先级进程没有运行,因为一个低优先级进程正在运行,这被称为优先级反转,这是调度程序设计人员试图避免的)@JeremyFriesner因此在单核系统上,如果一个高优先级CPU绑定的线程永远旋转,那么其他任何线程都无法运行,除非调度程序发现它需要降低优先级?这似乎是错误的,但我不是专家。在一个具有静态优先级的系统中,这正是可能发生的事情。这是常见的,例如在实时系统中,如果高优先级线程从未放弃CPU,那么您可能必须重新启动计算机以重新获得对它的控制。当然,让有缺陷的程序使您的计算机无法控制并不是一个非常理想的行为,这就是为什么一些非实时操作系统(尤其是Unix/Linux)在长时间内无法自动放弃CPU(例如通过阻塞)时会动态更改进程的优先级。(请参阅:)这可能很接近,但我认为在std::chrono::Stadium_clock::now()需要系统调用的系统中,它可能会被丢弃(因此,上下文切换和调度将在循环中的每一次都发生,而不仅仅是在时间片过期之后)。系统调用不会导致切换到另一个任务。这将是一个极其昂贵的系统设计。它可能需要一个从用户模式到内核模式的上下文切换,尽管@usr通常是这样的——特别是当调用不能立即完成时(想想
read
等),时钟调用不会阻止系统调用。在多处理器系统上,线程2/总是/不会在可用处理器上立即运行吗?@Brennan很好-如果有的话