我们尝试评估在用户或内核中创建一些与hw相关的任务是否更好。 任务必须响应中断并执行一些将数据复制到物理(映射)存储空间的任务。
根据我的理解,在用户空间或内核中都要完成相同的任务。
唯一的问题是内核线程优先级高于用户线程优先级。
我们将pthread
用于用户空间,或kthread
用于内核线程。
所以,我的问题是:
当两个线程准备就绪时,内核线程的优先级是否高于用户线程?
修改 如果使用SCHED_FIFO创建kthread_create并给定优先级x, 和pthread_create是用SCHED_FIFO创建的,优先级为y, 并且pthread的优先级高于kthread,还是kthread会在用户线程之前进入调度程序吗?
谢谢!
答案 0 :(得分:2)
内核模式线程必须始终可以抢占用户线程,因为内核模式线程需要响应硬件事件。这是因为操作系统设计而发生的。
内核线程的优先级高于用户线程,因为内核线程用于为应用程序提供特权服务。
除此之外,内核还使用它们来跟踪系统上正在运行的内容,将多少资源分配给哪个进程以及安排它们。
如您所知,对于用户空间中存在的每个线程都有相应的内核线程,因此如果系统范围(内核)中进程的线程具有足够高的优先级,则它们将同时在多个CPU上进行调度。意味着其他内核线程将被代表用户空间运行的内核线程抢占。
答案 1 :(得分:0)
Linux系统中的进程由struct task_struct
结构表示。
现在对于内核线程p-> mm来说就是进程'地址空间为NULL,其活动地址空间由p-> active_mm表示。因此,当调度内核线程时,其next->active_mm
将被设置为已调度的任务的prev->active_mm
。这有助于最小化切换地址空间时的TLB刷新。
特定于arch的常量PROC_CHANGE_PENALTY
定义了对同一cpu中的进程有利的cpu亲和性,它还优先于用户线程上的内核线程(它们的 - > mm!= NULL并需要开销)