workqueue机制分析之process_one_work分析
工作者线程不断执行,从work_poll结构中卸下一个work, 然后进入函数process_one_work
来执行这个work.
process_one_work(struct worker *worker, struct work_struct *work)
下面一行行代码分析下:
首先,struct pool_workqueue *pwq = get_work_pwq(work);
我们知道了,原来,work_struct 结构体中一直有个域指向了pool_workqueue.得到pwq结构体是为了得到workqueue,[ by pwq->wq], pwq中有许多属于锁啊,包括是不是绑定在CPU上啊这些信息, 都是在处理一个任务的时候需要的
struct worker_pool *pool = worker->pool;
每一个worker对应着一个池子,worker_pool,
[一个work可能要被多个线程执行,什么情况下会如此呢?]
然后把当前的工作, 加入到woker->hentry的哈希表中
pool->busy_hash是一个哈希表struct hlist_head name[1 << (bits)], 这是个开链的哈希表,
把这个worker链到这个woker_pool上的哈希表上
[看来,并不是一个work_poll对应这一个worker, 多个线程对应着一个worker_poll, 这样设计有其合理性啊,因为如果系统当前比较空闲,但是就是有大量的工作被挂载了当前的work_pool上面, 这样的话, 我们就要多个线程来执行啊]
对于UNBOUND的线程来说,一个work_poll对应着多个worker线程看来是很正常的事情.
然后就是对worker->current_work设置:
worker->current_work = work;
worker->current_func = work->func;
worker->current_pwq = pwq;
然后最重要的一件事情就是worker->current_func(work);
这里就是调用实际的工作函数了:
比如wb_workfn了!
workqueue机制分析之process_one_work分析的更多相关文章
- Linux kernel workqueue机制分析
Linux kernel workqueue机制分析 在内核编程中,workqueue机制是最常用的异步处理方式.本文主要基于linux kernel 3.10.108的workqueue文档分析其基 ...
- Linux kernel workqueue机制分析【转】
转自:http://www.linuxsir.org/linuxjcjs/15346.html 在内核编程中,workqueue机制是最常用的异步处理方式.本文主要基于linux kernel 3.1 ...
- ASP.NET MVC的运行机制--url的全局分析
全局 首先我们来看一副图片 首先,用户通过Web浏览器向服务器发送一条url请求,这里请求的url不再是xxx.aspx格式,而是http://HostName/ControllerNam ...
- Android的消息循环机制 Looper Handler类分析
Android的消息循环机制 Looper Handler类分析 Looper类说明 Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在ru ...
- Cocos2d-X3.0 刨根问底(七)----- 事件机制Event源码分析
这一章,我们来分析Cocos2d-x 事件机制相关的源码, 根据Cocos2d-x的工程目录,我们可以找到所有关于事件的源码都存在放在下图所示的目录中. 从这个event_dispatcher目录中的 ...
- ActiveMQ的安全机制使用及其源代码分析 [转]
ActiveMQ是目前较为流行的一款开源消息服务器.最近在项目开发中,需要为ActiveMQ开发基于IP的验证和授权机制,因此,对ActiveMQ的安全机制进行了了解,以下将介绍ActiveMQ的安全 ...
- .NET中反射机制的使用与分析
.NET中反射机制的使用与分析 [日期:2008-06-30] 来源: 作者:志伟 .NET反射的定义:审查元数据并收集关于它的类型信息的能力. 元数据是一种二进制信息,用以对存储在公共语言 ...
- Guava cacha 机制及源码分析
1.ehcahce 什么时候用比较好:2.问题:当有个消息的key不在guava里面的话,如果大量的消息过来,会同时请求数据库吗?还是只有一个请求数据库,其他的等待第一个把数据从DB加载到Guava中 ...
- Workqueue机制的实现
Workqueue机制中定义了两个重要的数据结构,分析如下: cpu_workqueue_struct结构.该结构将CPU和内核线程进行了绑定.在创建workqueue的过程中,Linux根据当前系统 ...
随机推荐
- 【代码笔记】iOS-首页3张图片变化
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...
- OC字符串NSString
========================== 面向对象编程进阶和字符串 ========================== Δ一.类的设计模式—单例 [单例]程序允许过程中,有且仅有一块内存 ...
- Vmware快速安装linux虚拟机(SUSE)
安装环境:Vmware 11.SUSE11 64位 vmware快速安装linux虚拟机的过程还是比较简单的,步骤如下: 1.点击文件,新建虚拟机. 2.选择典型安装. 3.在红框中选择想要安装的虚拟 ...
- php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
在php5.3环境下运行,常常会出现 Deprecated: Function ereg() is deprecated in...和Deprecated: Function ereg_replace ...
- 在eclipse中使用maven创建springMVC项目
一.在eclipse中创建maven-archetype-webapp项目: 1.新建项目选择maven项目 2.默认,下一步 3.选择maven-archetype-webapp,其他保持默认即可 ...
- Javascript字数统计
字数统计功能,原理是给textarea添加onKeyup事件,事件读取textarea内容并获得长度,并赋值给统计字数的那个文本节点,这里有一点要注意的是添加onKeypress和onKeydown事 ...
- 用字符串模拟两个大数相加——java实现
问题: 大数相加不能直接使用基本的int类型,因为int可以表示的整数有限,不能满足大数的要求.可以使用字符串来表示大数,模拟大数相加的过程. 思路: 1.反转两个字符串,便于从低位到高位相加和最高位 ...
- STM32的USART
转载自:http://www.cnblogs.com/TrueElement/archive/2012/09/14/2684298.html 几个问题: 1.状态寄存器(USART_SR)中的TC(T ...
- 中国版的 Office 365
与Windows Azure一样,中国版的Office 365也是由世纪互联运营的——与国际版完全隔离的定制版.而言,从功能方面来看,中国版的Office 365并没有损失太多功能,并且其更新速度也基 ...
- MMORPG大型游戏设计与开发(客户端架构 part2 of vegine)
一个好的接口是尽可能让更多实用的方法进行整理封装,要记住的是不常用的方法和类最好不好封装到接口中,因为那样会造成本身的困惑.基础模块中并没有太多封装,甚至连一个类的封装也没有,而是一些很常用的工具方法 ...