`
isiqi
  • 浏览: 16549988 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

kthread usage

 
阅读更多

1 使用kthread_create创建线程:
struct task_struct *kthread_create(int (*threadfn)(void *data),

void *data,
const char *namefmt, ...);
这个函数可以像printk一样传入某种格式的线程名
线程创建后,不会马上运行,而是需要将kthread_create() 返回的task_struct指针传给wake_up_process(),然后通过此函数运行线程。
2. 当然,还有一个创建并启动线程的函数:kthread_run
struct task_struct *kthread_run(int (*threadfn)(void *data),
void *data,
const char *namefmt, ...);
3. 线程一旦启动起来后,会一直运行,除非该线程主动调用do_exit函数,或者其他的进程调用kthread_stop函数,结束线程的运行。
int kthread_stop(struct task_struct *thread);
kthread_stop() 通过发送信号给线程。
如果线程函数正在处理一个非常重要的任务,它不会被中断的。当然如果线程函数永远不返回并且不检查信号,它将永远都不会停止。
参考:Kernel threads made easy

--

在执行kthread_stop的时候,目标线程必须没有退出,否则会Oops。原因很容易理解,当目标线程退出的时候,其对应的task结构也变得无效,kthread_stop引用该无效task结构就会出错。

为了避免这种情况,需要确保线程没有退出,其方法如代码中所示:

thread_func()

{

// do your work here

// wait to exit

while(!thread_could_stop())

{

wait();

}

}

exit_code()

{

kthread_stop(_task); //发信号给task,通知其可以退出了

}

这种退出机制很温和,一切尽在thread_func()的掌控之中,线程在退出时可以从容地释放资源,而不是莫名其妙地被人“暗杀”。

分享到:
评论

相关推荐

    KThread和TCB的构造顺序分析

    "KThread和TCB的构造顺序分析" 在分析KThread和TCB的构造顺序时,我们需要了解它们之间的关系和构造过程。KThread是操作系统的核心组件之一,负责管理线程的生命周期,而TCB(Thread Control Block)是KThread的...

    Embedfire-imx6#embed_linux_tutorial_ppt#彻底掌握kthread_worker队列化机制1

    彻底掌握kthread_worker队列化机制kthread_init_worker()宏初始化kthread_worker__kthread_init_wor

    Linux内核线程编程方法

    头文件`<linux/sched.h>`提供了`set_current_state`和`schedule_timeout`等函数,而`<linux/kthread.h>`则包含了`kthread_create`, `kthread_run`和`kthread_stop`等内核线程相关的函数。`<err.h>`中的`IS_ERR`和`...

    基于内核线程的创建、使用和退出以及延时宏的补充说明介绍

    kthread_create():创建内核线程 代码如下:struct task_struct *kthread_create(int (*threadfn)(void *data), void *data, const char namefmt[], …); kernel thread可以用kernel_thread创建,但是在执行函数里面...

    8_task.tar.gz

    其次,"8_kthread"这个文件则可能包含了创建和管理内核线程(kthread)的代码。在Linux中,内核线程(Kernel Thread,简称kthread)是指没有用户空间堆栈的线程,它们只运行在内核态,常用于执行内核服务,例如I/O...

    山东大学计算机学院操作系统实验报告.docx

    实验的重点在于实现`KThread.join()`方法,以及利用中断提供的原子性实现条件变量。 #### 实验环境配置 - **开发语言:** Java - **开发工具:** Eclipse Luna - **操作系统:** 未具体指明,但可以推测为支持Java...

    Linux内核模块编程

    - `#define kthread_run(threadfn, data, namefmt, ...) \ ({ \ struct task_struct *__k = kthread_create(threadfn, data, namefmt, ##__VA_ARGS__); \ if (!IS_ERR(__k)) \ wake_up_process(__k); \ __k; \ })` ...

    山东大学操作系统课程设计报告 proj1

    ##### 2.1 Task1.1:实现`KThread.join()` - **题目要求**:实现`KThread.join()`函数。除了被调用一次的情况外,该函数不允许被多次调用,即便调用的线程不同。无论`join()`是否被调用,线程都应该能够正常结束。 ...

    山东大学操作系统实验7实验8

    【实验报告概述】 本实验是山东大学操作系统课程的实验7和实验8,旨在扩展Nachos操作系统的地址空间功能,以及实现系统调用Exec()和Exit()。实验在2012年12月进行,主要任务包括:1)增强AddrSpace类以支持多用户...

    山东大学操作系统nachos实验报告

    - **1.1 实现 KThread.join()** - **1.2 实现条件变量** - **1.3 完成 alarm 类** - **1.4 实现 Communicator()** - **1.5 PriorityScheduler** - **1.6 Boat()** #### 1.1 实现 KThread.join() **1.1.1 实验要求...

    eprocess图.pdf

    这里提到的_Ptr32_KTHREAD表示这是一个32位系统中的指针类型,指向_KTHREAD结构体。_KTHREAD是Windows内核中用来表示线程的数据结构,包含了线程的各种属性和状态信息,如优先级、线程ID等。 ### ApcState (_KAPC_...

    nachos java 文档

    - `wake`方法中从线程队列中选择一个线程,并调用`KThread.ready()`将其置为就绪状态,同样需要中断保护。 #### 三、多道程序设计 - **任务2.1**:设计并实现进程调度策略。包括但不限于进程的创建、销毁、挂起、...

    csci455-project2

    您与内核线程的交互将通过调用kthread列出的kthread函数来kthread.h 。 由于您实际上是在实现操作系统的上下文切换部分,因此您会发现在教科书中有关进程和线程的章节中引入了许多有用的概念:进程控制块,就绪队列...

    观察进程线程的数据结构

    对于特定的线程,可以使用 `dt_kthread` 或 `dt_KTHREAD` 命令来查看 KTHREAD 结构体的具体内容。 - **观察内容**: - **线程状态**: 当前线程的状态(就绪、运行、等待等)。 - **线程优先级**: 线程的调度...

    基于virtio-user的新exception path方案.pdf

    3. 线程模型:与KNI方案类似,virtio-user方案通过在virtio ring上放置数据包,并利用vhost-kthread完成数据拷贝,操作简单。 4. 网络功能:vhost-net本身是为网络应用设计,支持checksum计算和验证、数据包分片...

    NachosJava.zip

    山东大学操作系统课程设计nachos java源码 project 1 完整代码含测试可运行。...Task1.1 KThread.join() Task1.2 Condition2类 Task1.3 Alram类 Task1.4 Communicator类 Task1.5 PriorityScheduler类 Task1.6 Boat类

    xpsp2的未公开核心数据结构的定义

    1. **_KTHREAD**:这是表示系统中的线程的数据结构。`PKTHREAD`是其指针类型,它包含了线程的状态、调度信息、上下文切换记录等。虽然没有提供具体的定义,但在实际的NTDDK中,`KTHREAD`会包含如线程优先级、执行...

Global site tag (gtag.js) - Google Analytics