隔离并绑定线程到cpu使内核线程独占cpu

隔离cpu

1.运行htop,观察各个cpu负载情况:
在这里插入图片描述

2.修改/etc/default/grub

GRUB_CMDLINE_LINUX=“isolcpus=2”

更新

sudo update-grub

重启

3.htop查看负载分布

在这里插入图片描述

cpu的隔离没有问题。

编写内核模块来开启内核线程并绑定cpu

内核线程操作的头文件为<linux/kthread.h>,其中

kthread_create为一个宏定义函数,实则调用的是kthread_create_on_node。用来开启一个线程。

kthread_bind将创建的线程绑定到cpu上面

wake_up_process启动线程

kthread_stop是停止线程

内核模块程序

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/timer.h>
#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/err.h>
#define PFX "kthread: "
#define CPU_NUM 2
struct  timeval timer1,timer2;
static struct task_struct *k;
int running;
int cyclic_task(void *arg){
    while(running){
        do_gettimeofday(&timer1);
        printk(KERN_INFO PFX"interval: %ld - %ld = %ld us\r\n",timer1.tv_usec,timer2.tv_usec,timer1.tv_usec-timer2.tv_usec);
        timer2=timer1;
        udelay(200);
    }
    return 0;	
}

static int hrtime_init(void)
{
    printk(KERN_INFO PFX "start!\n");
    running =1;
    k = kthread_create(cyclic_task, NULL, "cwd_thread");
    //k = kthread_create_on_node(cyclic_task, NULL, cpu_to_node(CPU_NUM), "cwd_thread");
    if (IS_ERR(k))
		return -1;
    kthread_bind(k, CPU_NUM);
    printk(KERN_INFO PFX "kthread_create!\n"); 
    wake_up_process(k);
    printk(KERN_INFO PFX "create ktrhead ok! pid=%d\n",k->pid);  
    
	return 0;
}
static void hrtime_exit(void)
{
    running = 0;
    printk(KERN_INFO PFX "create ktrhead ok! pid=%d now closing\n",k->pid);
    if (!IS_ERR(k)){  
        int ret = kthread_stop(k);  
        printk(KERN_INFO PFX "thread function has run %ds\n", ret);  
    }
	
}
MODULE_LICENSE("GPL");
module_init(hrtime_init);
module_exit(hrtime_exit);

makefile 文件

ifneq ($(KERNELRELEASE),)
obj-m :=kthread.o $(LIBS)
drv-objs := kthread.o 
else
KERNEL_DIR :=/lib/modules/$(shell uname -r)/build

PWD :=$(shell pwd)
all: modules

modules:
	make -C $(KERNEL_DIR) M=$(PWD) modules
clean:
	rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order
endif

编译运行:

make

sudo insmod kthread.ko

使用htop查看

在这里插入图片描述

使用top查看
在这里插入图片描述

使用taskset 查看线程运行的cpu

imc@imc:~$ taskset -pc 5166
pid 5603’s current affinity list: 2


版权声明:本文为cwdben原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。