内核多任务并发控制实例

内核多任务并发控制实例

ID:45942766

大小:2.72 MB

页数:16页

时间:2019-11-19

内核多任务并发控制实例_第1页
内核多任务并发控制实例_第2页
内核多任务并发控制实例_第3页
内核多任务并发控制实例_第4页
内核多任务并发控制实例_第5页
资源描述:

《内核多任务并发控制实例》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、假设存在这样一个的内核共享资源-链表。另外我们构造一个内核多任务访问链表的场景:内核线程向链表加入新节点;内核定时器定时删除结点;系统调用销毁链表。上面三种内核任务并发执行时,有可能会破坏链表数据的完整性,所以我们必须对链表进行同步访问保护,以确保数据一致性。<>内核多任务并发控制实例系统调用:是用户程序通过门机制来进入内核执行的内核例程,它运行在内核态,处于进程上下文中,可以认为是代表用户进程的内核任务内核线程:内核线程可以理解成在内核中运行的特殊进程,它有自己的“进程上下文”。定时器任务队列:任务队列属于下半部,在每次产生时钟节拍时得到处理。<>内核任务及其之

2、间的并发关系系统调用和内核线程可能和各种内核任务并发执行,除了中断(定时器任务队列属于软中断范畴)抢占它产生并发外,它们还有可能自发性地主动睡眠(比如在一些阻塞性的操作中),于是放弃处理器,从而重新调度其它任务,所以系统调用和内核线程除与定时器任务队列发生竞争,也会与其他(包括自己)系统调用与内核线程发生竞争。<>内核任务及其之间的并发关系主要的共享资源是链表(mine),操作它的内核任务有三个:一是200个内核线程(sharelist),它们负责从表头将新节点(structmy_struct)插入链表。二是定时器任务(qt_task),它负责每个时钟节拍时从链表

3、头删除一个节点。三是系统调用share_exit,它负责销毁链表并卸载模块。<>实现机制内核线程sharelist:该函数是作为内核线程由keventd调度执行的,作用是向链表中加入新节点start_kthread:该函数用来构建内核线程Sharelist的封装函数kthread_launcher,并启动它kthread_launcher:该函数作用仅仅是通过kernel_thread方法启动内核线程sharelist<>实现机制qt_task:该函数删除链表节点,作为定时器任务运行share_init:该函数是我们的模块注册函数,也是通过它启动定时器任务和内核线

4、程share_exit:这是模块注销函数,负责销毁链表<>实现机制share_exitsharelist链表qt_taskkeventstart_kthread进程上下文中断上下文进程上下文downup上锁添加节点删除节点实现机制并发控制实例示意图链表是内核开发中的常见数据组织形式,为了方便开发和统一结构,内核提供了一套接口来操作链表,我们用到的接口其主要功能为:LIST_HEAD:声明链表结构list_add():添加节点到链表list_del():删除节点list_entry():遍历链表任务队列结构为structtq_structkill_proc,该函数在

5、模块注销时被调用,其主要作用有两个:第一杀死我们生成的内核线程;第二告诉keventd回收相关子线程,以免产生“残疾”子线程序<>关键代码解释变量声明<>实现代码#defineNTHREADS200/*线程数*/structmy_struct{structlist_headlist;intid;intpid;};staticstructwork_structqueue;/*定义工作队列*/staticstructtimer_listmytimer;/*定时器队列*/staticLIST_HEAD(mine);/*sharelist头*/staticunsigned

6、intlist_len=0;staticDECLARE_MUTEX(sem);/*内核线程进行同步的信号量*/staticspinlock_tmy_lock=SPIN_LOCK_UNLOCKED;/*保护对链表的操作*/staticatomic_tmy_count=ATOMIC_INIT(0);/*以原子方式进行追加*/staticlongcount=0;/*行计数器,每行打印4个信息*/staticinttimer_over=0;/*定时器结束标志*/staticintsharelist(void*data);/*从共享链表增删节点的线程*/staticvoid

7、kthread_launcher(structwork_struct*q);/*创建内核线程*/staticvoidstart_kthread(void);/*调度内核线程*/模块注册函数share_init<>实现代码staticintshare_init(void){inti;printk(KERN_INFO"sharelistenter");INIT_WORK(&queue,kthread_launcher);//初始化工作队列setup_timer(&mytimer,qt_task,0);//设置定时器add_timer(&mytimer);//添加定

8、时器for

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。