通过调度程序源代码(2.6.34,kernel/sched.c),我可以看到如何使用"可插拔"调度程序,我相信我理解要实现的接口.我还不明白的是如何将我的代码内置到内核中.至少,指向其他网站的指针将不胜感激.
现在,我正在内核源代码树中查找SCHED_FIFO,SCHED_RR和SCHED_NORMAL,所以我真的在寻找一种更有见地的方式来看待它:-)
编辑:作为一些背景,我对FreeBSD调度程序(以及一般的FreeBSD内核)非常熟悉,所以我不是在寻找关于如何进行进程/线程级调度的指针.我正在寻找一种方法来添加我自己的调度程序和普通的linux调度程序(类似于SCHED_FIFO).
编辑#2:下面的BFS指针是一个很好的开始,但它仍然将CFS从内核中删除.sched.c现在看起来像:
#ifdef CONFIG_SCHED_BFS
#include "sched_bfs.c"
#else
// original sched.c
#endif // CONFIG_SCHED_BFS
Run Code Online (Sandbox Code Playgroud)
我很乐意看到答案或指针如何更好地做到这一点(即保持CFS,至少目前为止).
编辑#3:我已经在下面回答了我自己的问题,因为我认为我已经弄明白了.
我正在尝试减少代码需要执行的锁定量,并且遇到了一些关于pthread_mutex_lock如何处理其内存障碍的学术问题.为了使这个易于理解,假设互斥锁正在保护一个初始化后完全静态的数据字段,但我想将此设置推迟到第一次访问时.我想写的代码如下:
/* assume the code safely sets data to null at setup,
* and the mutex is correctly setup
*/
if (NULL == data) {
pthread_mutex_lock(&lock);
/* Need to re-check data in case it was already setup */
if (NULL == data)
data = deferred_setup_fcn();
pthread_mutex_unlock(&lock);
}
Run Code Online (Sandbox Code Playgroud)
我看到的可能问题是数据是在锁内设置的,但是在锁外读取.编译器是否可以跨互斥锁定调用缓存数据值?或者我是否必须插入适当的volatile关键字以防止这种情况发生?
我知道用pthread_once调用可以做到这一点,但我想避免使用另一个数据字段(锁已经存在保护相关字段).
指向POSIX线程函数调用内存排序的权威指南的指针也可以很好地工作.