linux中断管理之工作队列(二)——工作调度
Table of Contents1将一个work加入系统workqueue1将一个work加入系统workqueueLinux系统中,schedule_work()函数将一个work放入系统workqueue中,schedule_work()函数的工作流程图如下:...
Table of Contents
Linux系统中,schedule_work()函数将一个work加入系统workqueue中,work加入系统workqueue中后挂在该workqueue对应的工作线程池worker_pool的pending工作链表worklist中,工作线程池worker_pool中的工作线程worker会通过worker_thread()函数去调度这些pending状态的work,放入自己的scheduled链表中,然后去执行这些work。
1将一个work加入系统workqueue
Linux系统中,schedule_work()函数将一个work放入系统workqueue中,schedule_work()函数的工作流程图如下:
驱动开发者调用schedule_work()函数将一个work加入到系统workqueue中的PENDING链表,等待调度,将一个work加入到系统workqueue的过程中,主要有以下关注点:
- 整个过程是在关中断状态下进行的
- 加入workqueue PENDING链表的work要设置WORK_STRUCT_PENDING_BIT标志位
- 要小心处理SMP并发情况
- 在寻找pool_workqueue时,如果该work正在一个工作线程池worker_pool里运行,就选择该worker_pool对应的pool_workqueue,否则就在本地CPU或者node中选一个
- 将work加入到workqueue后,如果当前工作线程池worker_pool中没有正在运行的工作线程,就调用wake_up_worker(),从worker_pool的idle_list中唤醒一个工作线程
2 工作线程的处理
Linux系统中,在工作线程池中创建worker在创建的时候,创建了一个线程worker_thread(),该线程用于处理工作线程池中的work,以下是worker_thread()函数的工作流程图
- 工作线程WORKER_DIE标志位置位的时候,退出
- 当前线程池worker_pool中没有可唤醒的工作线程worker的时候,当前worker会尝试去获取worker_pool的管理权来为当前worker_pool创建新的worker,worker只要成功获取到管理锁manager_arb,就获取到了管理权,一个线程池中在同一个时间最多只能有一个工作线程能够成功获取管理权
- 创建新的工作线程后,需要重新检查当前worker_pool的状态,因为在创建新的工作线程过程中,当前worker_pool状态又发生了变化
- 工作线程worker执行时,对应的线程池worker_pool中只能有一个活跃线程。
更多推荐
所有评论(0)