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_Operating System_Cpu_Scheduling - Fatal编程技术网

Multithreading 调度和线程数量

Multithreading 调度和线程数量,multithreading,operating-system,cpu,scheduling,Multithreading,Operating System,Cpu,Scheduling,我想知道过多的线程是否会影响特定线程的时间量 例如,如果我的进程有100个线程,那么下一个/调度的线程是否会比有1000个线程的量子/突发更少,因为调度需要更多的时间 在我看来,由于调度运行它自己的进程,它有自己的线程来执行调度,因此它不应该影响其他线程(但应该为下一个/调度的线程的执行引入一些延迟) 还有什么想法吗?使用令人困惑的“一对多”术语,您真正要处理的是模拟线程。这不是一个操作系统实现,而是一个库实现。库将不了解量子,操作系统将不了解线程。因此,正如您所建议的,线程对数量和进程调度没有

我想知道过多的线程是否会影响特定线程的时间量

例如,如果我的进程有100个线程,那么下一个/调度的线程是否会比有1000个线程的量子/突发更少,因为调度需要更多的时间

在我看来,由于调度运行它自己的进程,它有自己的线程来执行调度,因此它不应该影响其他线程(但应该为下一个/调度的线程的执行引入一些延迟)


还有什么想法吗?

使用令人困惑的“一对多”术语,您真正要处理的是模拟线程。这不是一个操作系统实现,而是一个库实现。库将不了解量子,操作系统将不了解线程。因此,正如您所建议的,线程对数量和进程调度没有任何影响。

除非您的操作系统从一开始就设计为a(例如or),否则您会发现操作系统的调度程序对线程何时开始运行提供的保证非常少,或者当他们真的跑步时,他们还能继续跑多久

综上所述,同一台计算机上的其他线程(无论是您自己进程中的线程还是其他进程中的线程)很可能会影响您自己的线程接收的CPU时间。例如,如果其他线程的运行优先级高于您的线程,并且存在对CPU核心的争用(即,在某个特定时间运行的线程数超过了要运行它们的CPU核心数),则调度程序将在其数量到期之前将您的一个正在运行的线程从其当前CPU核心中踢出,因此,现在准备运行的高优先级线程可以立即开始执行

一般来说,这类问题的答案是“有龙”的类型——也就是说,如果您正确编写了多线程程序,那么您就不必知道(或关心)线程接收的量子大小,因为无论调度程序如何将时间片分配给线程,您的代码都应该能够正确运行

(例外情况是,您可能希望在能够为您提供所需保证的实时操作系统上运行)


至于调度程序决定开始运行哪个线程所需的时间,拥有更多线程确实会增加调度程序的开销,但在大多数操作系统上,这种增加是非常有限的——就线程数量而言,调度算法是
O(logn)
甚至
O(1)
。当然,如果您无限期地添加更多线程,您仍然可以让计算机“撞到墙”,但您最终达到的限制很可能与RAM耗尽有关,而不是与调度算法的性能有关。

很抱歉造成混淆。我之所以这样说是因为,在某些语言上,您无法直接创建内核线程,这可能会影响调度程序的压力,对吗?好吧,你可以创建一个过程(或者一个轻量级的过程)来实现你想要的(压力方面的)语言,但这不是我的观点。无论哪种方式,系统中的线程越多,调度器就越需要花更多的时间来确定应该给哪个进程/线程一个插槽/突发来运行。我的问题是,调度“延迟”会以任何方式影响这个突发时间吗?感谢您的详细解释!但我仍然不太明白,如果调度程序启动了自己的线程(或进程),或者它“偷走”了当前运行的内核线程的一些时间,我从来没有听说过调度程序有自己的线程或进程。相反,当中断例程运行一个调度程序函数来决定下一个允许运行哪个线程时,中断将关闭,正在运行的用户线程将短暂挂起。请解释“一对多环境”的含义。主流语言/库都只使用内核管理的线程,因此这将是一对一的,原因很简单,任何其他机制都会对代码结构施加约束(例如,“你不能进行任何可能阻塞的直接操作系统调用”),这是大多数用户不希望或无法处理的。你的问题不清楚。我想说‘一对一’,但我打错了。现在,我去掉了那个部分。