假设存在这样一个的内核共享资源-链表
另外我们构造一个内核多任务访问链表的场景:内核线程向链表加入新节点;内核定时器定时删除结点;系统调用销毁链表
上面三种内核任务并发执行时,有可能会破坏链表数据的完整性,所以我们必须对链表进行同步访问保护,以确保数据一致性
内核多任务并发控制实例系统调用:是用户程序通过门机制来进入内核执行的内核例程,它运行在内核态,处于进程上下文中,可以认为是代表用户进程的内核任务内核线程:内核线程可以理解成在内核中运行的特殊进程,它有自己的“进程上下文”
定时器任务队列:任务队列属于下半部,在每次产生时钟节拍时得到处理
内核任务及其之间的并发关系系统调用和内核线程可能和各种内核任务并发执行,除了中断(定时器任务队列属于软中断范畴)抢占它产生并发外,它们还有可能自发性地主动睡眠(比如在一些阻塞性的操作中),于是放弃处理器,从而重新调度其它任务,所以系统调用和内核线程除与定时器任务队列发生竞争,也会与其他(包括自己)系统调用与内核线程发生竞争
内核任务及其之间的并发关系主要的共享资源是链表(mine),操作它的内核任务有三个:一是200个内核线程(sharelist),它们负责从表头将新节点(structmy_struct)插入链表
二是定时器任务(qt_task),它负责每个时钟节拍时从链表头删除一个节点
三是系统调用share_exit,它负责销毁链表并卸载模块
实现机制内核线程sharelist:该函数是作为内核线程由keventd调度执行的,作用是向链表中加入新节点start_kthread:该函数用来构建内核线程Sharelist的封装函数kthread_launcher,并启动它kthread_launcher:该函数作用仅仅是通过kernel_thread方法启动内核线程sharelist实现机制qt_task: