内核---抢占原理

内核的抢占是能够配置的:make menuconfig   按照如下图片选中则内核支持抢占,不选中则内核不支持抢占:linux

能够写一段代代码来验证内核是否支持抢占:tcp

下面这段代码:在模块安装的时候运行:函数

insmod_test.c学习

  1 #include <linux/init.h>
  2 #include <linux/module.h>
  3 #include <linux/sched.h>
  4 #include <linux/delay.h>
  5 
  6 //当模块安装的时候执行
  7 static __init int test_init(void)
  8 {
  9     printk("test_init\n");
 10     //模拟一段须要执行事件很长的代码
 11 
 12     while (1);
 13     //关闭内核抢占
 14     //preempt_disable();
 15     //mdelay(5000);
 16     //打开内核抢占
 17     //preempt_enable();
 18 
 19     return 0;
 20 }
 21 
 22 //当模块卸载的时候执行
 23 static __exit void test_exit(void)
 24 {
 25     printk("test_exit\n");
 26 }
 27 
 28 module_init(test_init);
 29 module_exit(test_exit);
 30 
 31 MODULE_LICENSE("GPL");

下面这段代码的功能是每一秒打印一下本函数在CPU的哪一个核上运行:spa

while.c3d

  1 #define _GNU_SOURCE
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <sched.h>
  5 #include <utmpx.h>
  6 
  7 int main(void)
  8 {
  9     int ret;
 10 
 11     cpu_set_t set;
 12 
 13     CPU_ZERO(&set);
 14     CPU_SET(1, &set);
 15     CPU_SET(2, &set);
 16 
 17     ret = sched_setaffinity(0, sizeof(cpu_set_t), &set);
 18     if (ret < 0) {
 19         perror("sched");
 20         exit(1);
 21     }
 22     while (1) {
 23         printf("cpu:%d\n", sched_getcpu());
 24         sleep(1);
 25     }
 26     return 0;
 27 }

实际验证的时候,先运行while.c而后再安装insmod_test.c这个模块.发现若是内核支持抢占,则while.c的每秒打印函数会正常运行,若是内核不支持抢占,则while.c函数的打印将会被阻塞.code

上面的insmod中注释掉的一段代码preempt_disable相关的是关闭内核抢占和打开内核抢占的函数:你们学习的过程当中不要忽略!其实也就是动态调整内核功能的一对函数!blog

相关文章
相关标签/搜索