Linux kernel 如果默认时间片为100ms,Linux进程如何每秒生成60次图形输出?

Linux kernel 如果默认时间片为100ms,Linux进程如何每秒生成60次图形输出?,linux-kernel,operating-system,scheduling,multitasking,Linux Kernel,Operating System,Scheduling,Multitasking,关于Linux中的工作原理,我基本上不了解一些东西,一般来说也不了解。如果我理解正确的话,每当一个进程想要改变它在屏幕上的输出时,它都需要做一些计算并发送数据。但如果我理解正确的话。这似乎排除了进程频繁解锁的可能性,足以以60Hz刷新屏幕。有鉴于此,我想对于Linux如何管理其稀缺的CPU时间和/或进程如何向I/O设备发送数据,我可能有很多基本的误解 问题。这是怎么回事?理论上;这可能比你想象的要糟糕得多——如果有100个其他进程,每个进程都消耗了允许的最大时间片100毫秒;然后可能需要100*

关于Linux中的工作原理,我基本上不了解一些东西,一般来说也不了解。如果我理解正确的话,每当一个进程想要改变它在屏幕上的输出时,它都需要做一些计算并发送数据。但如果我理解正确的话。这似乎排除了进程频繁解锁的可能性,足以以60Hz刷新屏幕。有鉴于此,我想对于Linux如何管理其稀缺的CPU时间和/或进程如何向I/O设备发送数据,我可能有很多基本的误解


问题。这是怎么回事?

理论上;这可能比你想象的要糟糕得多——如果有100个其他进程,每个进程都消耗了允许的最大时间片100毫秒;然后可能需要100*100毫秒=10秒,游戏进程才能再次获得CPU时间

然而:

a编译内核时,最大时间片长度是可配置的,对于桌面系统,最大时间片长度更可能为10毫秒

b占用允许的最大时间片的进程非常罕见。如果一个进程被给予最大10毫秒,但在1毫秒后阻塞,因为它必须等待磁盘IO或网络或互斥或。。。然后该过程将仅使用1毫秒

对于现代计算机,极有可能有多个CPU

d还有其他调度策略,请参见,任务优先级和cgroup。所有这些都可以用来确保一个特殊的进程,例如,一个游戏在其他进程之前获得CPU时间和/或比其他进程获得更多的CPU时间


大多数玩游戏的人根本没有其他进程同时占用CPU时间——他们可能有多个进程不占用任何CPU时间,但不会有多个进程试图消耗100%的CPU时间。

您似乎混淆了不同的调度策略

在Linux中,有许多用于确定不同时间片的方法。100ms默认时间片仅适用于SCHED_RR策略,该策略用于实时进程。实际上,没有正常的进程在SCHED_RR下运行

正常进程在SCHED_OTHER下运行,这是默认的调度程序策略。在此计划下,时间片在运行时动态确定,并且要低得多。默认情况下,它可以在0.75ms到6ms之间的任何位置。您可以在中以纳秒为单位看到这些默认值,分别定义为sysctl_sched_min_粒度和sysctl_sched_延迟。您可以通过读取/proc/sys/kernel/sched_min_粒度或/proc/sys/kernel/sched_延迟来获取系统上的实际值


您可以了解有关Linux内核CFS调度程序的更多信息或获取更多文档。

为什么要投票?这是一个完全合理的问题。这个网站真是太奇怪了…有些事情能够做并不意味着它真的发生了。当然,如果每个核心都有一个占用它的线程,那么屏幕上就不能有60Hz的更新,除非其中一个线程正在进行更新。那么,为什么当我打开Python控制台并键入math.factorial10000时,我所有的GUI程序(如Firefox)都会以全60Hz的频率刷新,而控制台却在努力计算值呢?这是因为Python控制台一次只能运行10毫秒吗?@goblin:Python使用了多少个CPU,全部还是一个?请注意,GUI程序通常会在发生更改时更新屏幕,而不考虑时间,并且根本没有60 Hz的刷新。还有一些特殊情况,如视频卡硬件解码/显示的视频,理论上不使用CPU;这可能比你想象的要糟糕得多——绝对不是。100ms是SCHED_RR的默认时间片,在正常系统上,SCHED_RR下基本上没有进程运行。默认策略是SCHED_OTHER,该策略的时间片是在运行时计算的,并且比10毫秒短得多。@MarcoBonelli:理论上;等待许多任务都有一些CPU时间可能比OP最初只等待另一个任务有一些CPU时间的假设要糟糕得多。时间片的最大长度基本上是不相关的。