内核---抢占原理

内核的抢占是可以配置的:make menuconfig   按照以下图片选中则内核支持抢占,不选中则内核不支持抢占:

可以写一段代代码来验证内核是否支持抢占:

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

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
");
 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
");
 26 }
 27 
 28 module_init(test_init);
 29 module_exit(test_exit);
 30 
 31 MODULE_LICENSE("GPL");

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

while.c

  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
", sched_getcpu());
 24         sleep(1);
 25     }
 26     return 0;
 27 }

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

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

有时候,不小心知道了一些事,才发现自己所在乎的事是那么可笑。
原文地址:https://www.cnblogs.com/axjlxy/p/9048368.html