据我所知,Linux的特点是内核抢占,这意味着执行系统调用的线程可以被抢占,并被重新调度到下一个时期运行.

这让我想知道,当系统调用中的线程被重新调度时,它们是否具有任何类型的提升的优先级.

例如,假设我有一个带有SCHED_OTHER且优先级为20(0表示最低,139表示最高)的Userland进程.该进程使用标准的Read系统调用从sysfs读取SMBus设备文件.现在,当它读取SMBus设备时,SMBus控制器需要一次接收一个字节,因此定时很重要,我们不能在接收字节之间等待太长时间,否则SMBus事务将超时.

现在,当从设备接收字节时,线程被重新调度(要么Hibernate ,要么被更高优先级的线程抢占,等等).当线程被重新调度时,它是否仍然具有初始的低优先级20?这似乎是一个问题,它应该被视为更高的,因为它是与设备接口和时间是关键的(似乎我希望它被视为具有RT优先级).我还没有发现任何迹象表明线程在这些上下文中获得了"提升"的优先级.

推荐答案

要回答标题中的问题,答案是否定的,在进行系统调用时,Linux用户线程的优先级不会提升.

根据编译选项的不同,Linux内核可以是可抢占的.Linux发行版使用的"标准"内核倾向于使用所谓的"自愿抢占"选项,即在内核中运行的线程偶尔判断更高优先级的线程是否可运行.

然而,根据设备的实际低级别I/O是如何完成的,如果它是在IRQ处理程序中完成的,则下半部分中断处理程序 routine 在某种意义上以无限的优先级运行.上半部分中断处理程序运行,这取决于特定设备驱动程序的实现方式、编译选项等,同样以类似的"无限"优先级运行,或者作为单独的中断处理程序线程运行,具有可调整但默认情况下非常高的优先级.

Linux相关问答推荐

2023 年如何在现代 Linux 上安装 Firebird SQL 版本 3 或 4?

如何恢复已停止的进程?

Windows WSL 以上 Linux 中的 AF_UNIX 套接字无法绑定到 /mnt 文件:错误 95,不支持操作

在 Windows 上通过 SSH 运行 django 应用程序

当 skylake 有 fsgsbase 时,为什么使用 __builtin_ia32_wrfsbase64 会收到非法指令?

进程Forking 后 pthread_key_create() 生成的密钥会发生什么?

如何从linux调度程序中屏蔽一个cpu(防止它调度线程到那个cpu上)?

使用带有 gnome-keyring 的 Git 凭证助手作为 Sudo 时出错

如何使用 gcc 编译为程序集

我如何从 Ubuntu 上的源代码自己构建 python?

根据日期范围过滤日志(log)文件条目

判断 VT-x 是否已激活而无需在 Linux 中重新启动?

给定一个 linux 用户名和密码,我如何测试它是否是有效帐户?

我可以打开一个套接字并将其传递给 Linux 中的另一个进程吗

.NET Core 中的跨平台文件名处理

网络共享文件夹上的 GIT 存储库中的并发性

如何停止 Linux 上的不间断进程?

通过 linux x86-64 函数调用保留了哪些寄存器

具有所有内核的 Gzip

find -name "*.xyz" -o -name "*.abc" -exec 对所有找到的文件执行,而不仅仅是指定的最后一个后缀