linux-kernel - 如果默认时间片为 100 毫秒,Linux 进程如何每秒产生 60 次图形输出?
问题描述
关于多任务处理在 Linux 中的工作原理,我从根本上不了解(可能也是一般情况下)。如果我理解正确,每次进程想要将其输出更改到屏幕时,它都需要进行一些计算并发送数据。但如果我理解正确的话,在大多数 Linux 发行版的默认设置下,进程在被抢占之前最多可以占用 CPU 100 毫秒。这似乎排除了进程被频繁解锁以能够以 60Hz 刷新屏幕的可能性。鉴于此,我想我可能对 Linux 如何管理其稀缺的 CPU 时间和/或进程如何将数据发送到 I/O 设备有很多基本的误解。
问题。这里发生了什么?
解决方案
您似乎混淆了不同的调度策略。
在 Linux 中,有几种调度策略可以确定不同的时间片。100ms 默认时间片仅适用于SCHED_RR
策略,用于实时进程。实际上,没有正常的进程在SCHED_RR
.
正常进程在 下运行SCHED_OTHER
,这是默认的调度程序策略。在这种调度下,时间片是在运行时动态确定的,而且要低得多。默认情况下,它可以在 0.75ms 到 6ms 之间的任何地方。您可以看到这些默认值(以纳秒为单位)分别定义在kernel/sched/fair.c
assysctl_sched_min_granularity
和sysctl_sched_latency
中。您可以通过阅读/proc/sys/kernel/sched_min_granularity_ns
或获取系统上的实际值/proc/sys/kernel/sched_latency_ns
。
推荐阅读
- amazon-web-services - Aws dax 稳定性问题
- spring - 在 Spring MVC 中初始化 PostgreSQLQueryFactory bean
- hibernate - 可嵌入类包含复合键生成太多列?
- r - 使用 R 中的函数保存结果
- vue.js - Vuex在模块中改变状态与其他模块中的功能
- react-native - 我应该对大量数据使用 AsyncStorage 吗?
- python - 在 Python 中使用原子分组的最佳方式?
- javascript - getElementById() vs querySelectorAll() 有问题
- r - 使用 dbplyr 和 corrr 的两个变量之间的分组相关性
- tensorflow - 如何在我的模型中使用预训练的 bert 模型作为嵌入层?