内核多任务并发控制实例.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内核多任务并发控制实例内核多任务并发控制实例

“ ” 假设存在这样一个的内核共享资源-链表。另外我们构造一个内核多任务访问链表的场景:内核线程向链表加入新节点;内核定时器定时删除结点;系统调用销毁链表。 上面三种内核任务并发执行时,有可能会破坏链表数据的完整性,所以我们必须对链表进行同步访问保护,以确保数据一致性。 内核多任务并发控制实例 系统调用:是用户程序通过门机制来进入内核执行的内核例程,它运行在内核态,处于进程上下文中,可以认为是代表用户进程的内核任务 内核线程:内核线程可以理解成在内核中运行的特殊进程,它有自己的“进程上下文” 。 定时器任务队列:任务队列属于下半部,在每次产生时钟节拍时得到处理。 内核任务及其之间的并发关系 系统调用和内核线程可能和各种内核任务并发执行,除了中断(定时器任务队列属于软中断范畴)抢占它产生并发外,它们还有可能自发性地主动睡眠(比如在一些阻塞性的操作中),于是放弃处理器,从而重新调度其它任务,所以系统调用和内核线程除与定时器任务队列发生竞争,也会与其他(包括自己)系统调用与内核线程发生竞争。 内核任务及其之间的并发关系 主要的共享资源是链表(mine),操作它的内核任务有三个:一是200个内核线程(sharelist),它们负责从表头将新节点(struct my_struct)插入链表。二是定时器任务(qt_task),它负责每个时钟节拍时从链表头删除一个节点。三是系统调用share_exit,它负责销毁链表并卸载模块。 实现机制 内核线程sharelist : 该函数是作为内核线程由keventd调度执行的,作用是向链表中加入新节点 start_kthread : 该函数用来构建内核线程Sharelist的封装函数kthread_launcher,并启动它 kthread_launcher : 该函数作用仅仅是通过kernel_thread方法启动内核线程sharelist 实现机制 qt_task : 该函数删除链表节点,作为定时器任务运行 share_init : 该函数是我们的模块注册函数,也是通过它启动定时器任务和内核线程 share_exit : 这是模块注销函数,负责销毁链表 实现机制 share_exit sharelist 链表 qt_task kevent start_kthread 进程上下文 中断上下文 进程上下文 down up 上锁 添加节点 删除节点 实现机制 并发控制实例示意图 链表是内核开发中的常见数据组织形式,为了方便开发和统一结构,内核提供了一套接口来操作链表,我们用到的接口其主要功能为: LIST_HEAD:声明链表结构 list_add():添加节点到链表 list_del():删除节点 list_entry():遍历链表 任务队列结构为 struct tq_struct kill_proc ,该函数在模块注销时被调用,其主要作用有两个:第一杀死我们生成的内核线程;第二告诉keventd回收相关子线程,以免产生“残疾”子线程序 关键代码解释 变量声明 实现代码 #define NTHREADS 200 /* 线程数 */ struct my_struct { struct list_head list; int id; int pid; }; static struct work_struct queue; /* 定义工作队列 */ static struct timer_list mytimer; /* 定时器队列 */ static LIST_HEAD(mine); /* sharelist头 */ static unsigned int list_len = 0; static DECLARE_MUTEX(sem); /* 内核线程进行同步的信号量 */ static spinlock_t my_lock = SPIN_LOCK_UNLOCKED; /* 保护对链表的操作 */ static atomic_t my_count = ATOMIC_INIT(0); /* 以原子方式进行追加 */ static long count = 0; /* 行计数器,每行打印4个信息 */ static int timer_over = 0; /* 定时器结束标志 */ static int sharelist(void *data); /*从共享链表增删节点的线程*/ static void kthread_launcher(struct work_struct *q); /*创建内核线程*/ static void star

文档评论(0)

ganqludp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档