Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何通过实验确定进程/线程的调度量?_Multithreading_Scheduling_Experimental Design - Fatal编程技术网

Multithreading 如何通过实验确定进程/线程的调度量?

Multithreading 如何通过实验确定进程/线程的调度量?,multithreading,scheduling,experimental-design,Multithreading,Scheduling,Experimental Design,只是为了避免任何关于“为什么你需要知道这个?”的评论:这只是我好奇的一个谜题,不是出于任何实际原因我需要做的事情 给定一个典型的POSIX系统[1],您将如何设计一个实验来确定CPU受限进程的调度量[2] [1] :但不允许通过syscall或/proc接口查询此信息 [2] :“调度量”定义为进程在其调度时间结束且操作系统允许另一个进程运行之前,在CPU上运行而不阻塞或让步的时间量。我不确定它的准确性,但这可能有效: 确保您的计算机处于空闲状态(或尽可能使其处于空闲状态) 生成2N个线程(其中

只是为了避免任何关于“为什么你需要知道这个?”的评论:这只是我好奇的一个谜题,不是出于任何实际原因我需要做的事情

给定一个典型的POSIX系统[1],您将如何设计一个实验来确定CPU受限进程的调度量[2]

[1] :但不允许通过syscall或/proc接口查询此信息


[2] :“调度量”定义为进程在其调度时间结束且操作系统允许另一个进程运行之前,在CPU上运行而不阻塞或让步的时间量。

我不确定它的准确性,但这可能有效:

  • 确保您的计算机处于空闲状态(或尽可能使其处于空闲状态)
  • 生成2N个线程(其中N是计算机中的核心数)。所有这些线程都应设置为以彼此相同的优先级运行
  • 每个线程都应该运行一个无限循环,在这个循环中,它什么也不做,只是使用一个高分辨率计时器(例如调用std::chrono::staddy_clock::now()或类似程序)重复检索当前单调递增的wallclock时间
  • 在循环的每次迭代中,每个线程都应该检查“突然间隔”的结果时间值,即时钟时间从(t)跳到(t+n毫秒,其中n大于通常的增量值)。这些间隙很可能表示线程离开CPU的时间段,以便另一个线程可以运行
  • 在某个时刻,计算所有这些间隙大小的平均值,这是您对调度程序的量子大小的估计

  • 请注意,这假设您的时钟分辨率大于调度程序的量子大小;如果不是(例如,如果您试图使用10毫秒分辨率的时钟来测量5毫秒的量子长度),那么测量量子长度将非常困难。

    我认为您可以通过对以下系统的足够运行进行统计分析来获得答案:

    • 为清除终止标志的每个处理器运行一个线程,然后为固定的迭代次数或直到设置终止标志(以先到者为准)运行循环。这些线程记录它们是由于运行所有迭代而终止,还是由于设置了终止标志而终止

    • 同时,运行另一个设置终止标志的线程

    在循环中的各种迭代次数中执行此操作

    如果循环在线程时间片内完成,它将完成所有迭代。如果没有在线程时间片内完成,终止线程将有机会中断其中一个循环线程

    现在,有时会首先调度终止线程,并且可能还有其他线程正在运行,这会使行为复杂化,因此您可能需要在多处理器系统上多次运行该线程,并对结果进行统计分析。您还需要考虑线程启动时间和内存访问时间,因为在循环的每次迭代中都可能会有内存障碍来检查标志


    但是,如果在足够多的不同循环迭代限制下进行足够多的重复,那么这将为您提供在一个时间片中迭代循环的次数。然后,您可以在未加载的系统上运行大量迭代,以获得每次迭代所需的时间长度,然后计算每个时间片的挂钟时间。

    请注意,优先级较高的进程通常会在需要时尽快运行(否则就没有必要拥有更高的优先级)。也许在你的最后一段中,你想说“……在预定时间结束之前,操作系统允许另一个优先级相同的进程运行。”@JeremyFriesner我认为在典型的系统中,进程在其时间片过期之前不会被抢占。我弄错了吗?它在Linux或FreeBSD中是如何工作的?不管怎样,我已经编辑了这个问题。通常一个进程将一直运行,直到(a)其量程过期(并且另一个具有相同优先级的进程准备运行),或者(b)另一个具有更高优先级的进程准备运行。(另一种选择是,一个准备运行的高优先级进程没有运行,因为一个低优先级进程正在运行,这被称为优先级反转,这是调度程序设计人员试图避免的)@JeremyFriesner因此在单核系统上,如果一个高优先级CPU绑定的线程永远旋转,那么其他任何线程都无法运行,除非调度程序发现它需要降低优先级?这似乎是错误的,但我不是专家。在一个具有静态优先级的系统中,这正是可能发生的事情。这是常见的,例如在实时系统中,如果高优先级线程从未放弃CPU,那么您可能必须重新启动计算机以重新获得对它的控制。当然,让有缺陷的程序使您的计算机无法控制并不是一个非常理想的行为,这就是为什么一些非实时操作系统(尤其是Unix/Linux)在长时间内无法自动放弃CPU(例如通过阻塞)时会动态更改进程的优先级。(请参阅:)这可能很接近,但我认为在std::chrono::Stadium_clock::now()需要系统调用的系统中,它可能会被丢弃(因此,上下文切换和调度将在循环中的每一次都发生,而不仅仅是在时间片过期之后)。系统调用不会导致切换到另一个任务。这将是一个极其昂贵的系统设计。它可能需要一个从用户模式到内核模式的上下文切换,尽管@usr通常是这样的——特别是当调用不能立即完成时(想想
    read
    等),时钟调用不会阻止系统调用。在多处理器系统上,线程2/总是/不会在可用处理器上立即运行吗?@Brennan很好-如果有的话