隔离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版权协议,转载请附上原文出处链接和本声明。