kthread_create与kernel_thread的区别

news/2024/7/7 12:45:57

kernel thread可以用kernel_thread创建,但是在执行函数里面必须用daemonize释放资源并挂到init下,还需要用completion等待这一过程的完成。
kthread_create是比较正牌的创建函数,这个不必要调用daemonize,用这个创建的kernel thread都挂在了kthread线程下。
从表面上来看,这两个函数非常的类似,但是实现却是相差甚远。
kthread_create是通过work_queue来实现的,kernel_thread是通过do_fork来实现的。
kthread_create:
DECLARE_WORK(work, keventd_create_kthread, &create);
调用keventd_create_kthread,keventd_create_kthread中调用kernel_thread:
    pid = kernel_thread(kthread, create, CLONE_FS | CLONE_FILES | SIGCHLD);
参考:
http://www.scs.ch/~frey/linux/kernelthreads.html
http://kernelnewbies.org/Simple_UDP_Server
http://mail.nl.linux.org/kernelnewbies/2006-07/msg00373.html
http://linux.sheup.com/linux/linux7553.htm

 

 

 

kernel_thread 的使用

转载文章,版权归原作者所有。
原文出处:http://hi.baidu.com/wild_boar/blog/item/92eb8b5432543b1c3b293546.html

可以在非内核线程中调用kernel_thread, 但这样创建的线程必须在自己调用daemonize(...)来释放资源, 成为真正的内核线程。

#include <linux/kernel.h>
#include <linux/module.h>

static int noop(void *dummy)
{
int i = 0;
daemonize("mythread");
while(i++ < 5) {
printk("current->mm = %p/n", current->mm);
printk("current->active_mm = %p/n", current->active_mm);
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(10 * HZ);
}
return 0;
}

static int test_init(void)
{
kernel_thread(noop, NULL, CLONE_KERNEL | SIGCHLD);
return 0;
}

static void test_exit(void) {}
module_init(test_init);
module_exit(test_exit);

”mythread“就是给这个内核线程取的名字, 可以用ps -A来查看。
schedule()用于进程调度, 可以理解为放弃CPU的使用权.

kernel thread可以用kernel_thread创建,但是在执行函数里面必须用daemonize释放资源并挂到init下,还需要用completion等待这一过程的完成。
kthread_create是比较正牌的创建函数,这个不必要调用daemonize,用这个创建的kernel thread都挂在了kthread线程下。


http://www.niftyadmin.cn/n/4464350.html

相关文章

matlab学习笔记(七)---空域变换增强-图像间的代数运算

1、图像相加运算 1.1增强图像的亮度 I imread(rice.png);J imadd(I,50);subplot(1,2,1), imshow(I),title(原图像);subplot(1,2,2), imshow(J), title(增强图像的亮度);效果图如下&#xff1a;1.2图像叠加 I imread(rice.png);J imread(cameraman.tif);K imadd(I,J,uint1…

matlab学习笔记(八)---空域滤波增强

1、平滑滤波器 1.1线性平滑滤波器 1.1.1给图像加入椒盐噪声 Iimread(eight.tif); Jimnoise(I,salt & pepper,0.02); subplot(121),imshow(I),title(原始图像); subplot(122),imshow(J),title(加入椒盐噪声的图像);效果图如下&#xff1a;1.1.2对一个图像进行不同大小模板…

va_start va_end

C语言中可变参数的用法 我们在C语言编程中会遇到一些参数个数可变的函数,例如printf() 这个函数,它的定义是这样的: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是 可变的,例…

添加系统调用 http://docs.huihoo.com/joyfire.net/6-1.html

第一步:1.找到linux 内核代码所在地,一般在你的系统这个位置(你下载代码放其他地方我不反对) /usr/src/linux/ 但是也可能是这个位置 /usr/src/linux-2.4/或者其他 找到后cd /usr/src/linux*/ 转到该目录下. linux*表示代码所在的文件夹2.修改内核代码 a.添加源文件 假设新加…

matlab学习笔记(九)---频域增强

1、低通滤波 1.1对图像eight.tif加入椒盐噪声后&#xff0c;实现Butterworth低通滤波。 clear; I1imread(eight.tif); subplot(221),imshow(I1),title(原始图像); I2imnoise(I1,salt & pepper); %加入椒盐噪声 subplot(222),imshow(I2),title(噪声图像); fdouble(I2)…

matlab学习笔记(十)---边缘检测

分别采用roberts、sobel、prewitt、canny、log算子来检测图像的边缘并比较 Iimread(rice.png); B1edge(I,roberts); B2edge(I,sobel); B3edge(I,prewitt); B4edge(I,canny); B5edge(I,log); subplot(231),imshow(I),title(原始图像); subplot(232),imshow(B1),title(roberts算子…

2.6.8内核中通过模块添加系统调用,不用编译内核

我在2.6.8中通过模块添加系统调用&#xff0c;发现了两个问题&#xff1a;1.是sys_call_table的符号不可以被解析2.除了283 所有的系统调用号都已经被占用 &#xff0c;且没有空余。&#xff08;要是想添加的系统调用号大于283,我们就要先改变unistd.h中的NR_syscalls 改的大一…

fedora 升级内核

尽管在Fdora Core 8下可以使用yum升级内核&#xff0c;但是毕竟是别人编译通用内核&#xff0c;里面添加了很多自己系统不需要的模块&#xff0c;而自己需要的模块却没有开启。因此&#xff0c;学会自己手动编译升级内核也是必要的。 1、下载内核 linux内核可以从http://kernel…