Linux内核学习笔记 -35动手实践 - 内核多任务并发实例

 为了在内核中模拟多任务并发访问共享链表,我们需要完成下面几个任务。

1. 首先,需要在内核中建立一个共享链表,并使用自旋锁结构对其进行访问保护

2. 利用工作队列机制建立若干个内核线程,每个内核线程都应该对共享链表进行插入/删除操作

3. 创建一个内核定时器,并编写其回调函数,使其在到期时能够删除共享链表中的节点

4. 在模块卸载函数中实现链表的销毁

Linux内核学习笔记 -35动手实践 - 内核多任务并发实例_第1张图片

对于共享链表,我们利用内核提供的链表结构list_head来创建其节点, (代码16行)这里将内核提供的list_head类型的链表结构,包含到我们定义的共享链表节点的结构体中,就完成了共享链表节点的定义。通过内核list_head建立的链表,可以直接使用内核中的函数对链表进行插入/删除/遍历等操作。

接着,我们需要为链表创建一个头节点mine(代码22行),这里使用LIST_HEAD宏来完成,这里需要注意的是,头节点是一个list_head类型的结构体,而并不是我们所定义的共享链表节点my_struct结构体,操作时需要特别留意

对于自旋锁,我们使用DEFINE_SPINLOCK的宏来声明,并初始一个自旋锁my_lock,这样我们就完成了第一个任务。在内核中建立了一个头节点为mine的共享链表,并为其创建了一个自旋锁my_lock对其进行访问保护。

下面看如何使用工作队列创建内核线程,为了方便起见,这里使用内核工作队列kevent。

(代码20行)第一步需要定义一个work_struct类型的工作queue,紧接着使用DEFINE_SEMAPHORE的宏声明一个信号量sem并将其初始化为1(代码

你可能感兴趣的:(Linux内核)