小编J T*_*ler的帖子

如何创建新的Linux内核调度程序

通过调度程序源代码(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:我已经在下面回答了我自己的问题,因为我认为我已经弄明白了.

c linux scheduling scheduler linux-kernel

30
推荐指数
3
解决办法
2万
查看次数

测试互斥锁之外的值:内存排序问题

我正在尝试减少代码需要执行的锁定量,并且遇到了一些关于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线程函数调用内存排序的权威指南的指针也可以很好地工作.

c pthreads

4
推荐指数
1
解决办法
558
查看次数

标签 统计

c ×2

linux ×1

linux-kernel ×1

pthreads ×1

scheduler ×1

scheduling ×1