內核的搶佔是能夠配置的: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