內核---搶佔原理

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

相關文章
相關標籤/搜索