-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path工作队列.mm
47 lines (47 loc) · 6.98 KB
/
工作队列.mm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<map version="1.0.1">
<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->
<node CREATED="1471051706225" ID="ID_499962660" MODIFIED="1471051715444" TEXT="工作队列">
<node CREATED="1471053279014" ID="ID_958364329" MODIFIED="1471053280951" POSITION="right" TEXT="比较">
<node CREATED="1471053250685" ID="ID_1761697584" MODIFIED="1471053257769" TEXT="不同点">
<node CREATED="1471053164118" ID="ID_436567381" MODIFIED="1471053169232" TEXT="可延迟函数">
<node CREATED="1471053186805" ID="ID_943400842" MODIFIED="1471053193860" TEXT="运行在中断上下文">
<node CREATED="1471053344142" ID="ID_1645876134" MODIFIED="1471053359517" TEXT="中断上下文不可能发生进程切换"/>
</node>
</node>
<node CREATED="1471053169501" ID="ID_1891236065" MODIFIED="1471053177016" TEXT="工作队列">
<node CREATED="1471053196325" ID="ID_1170008910" MODIFIED="1471053204502" TEXT="运行在进程上下文"/>
</node>
</node>
<node CREATED="1471053156574" ID="ID_882672608" MODIFIED="1471053271801" TEXT="相同点">
<node CREATED="1471053232373" ID="ID_52259329" MODIFIED="1471053321137" TEXT="不能访问进程的用户态地址空间">
<node CREATED="1471053419438" ID="ID_1200321586" MODIFIED="1471058188635" TEXT="工作队列由内核线程来执行"/>
<node CREATED="1471053436478" ID="ID_677080227" MODIFIED="1471058198001" TEXT="可延迟函数:不能确定哪个进程在运行"/>
</node>
</node>
</node>
<node CREATED="1471053516069" ID="ID_1822270398" MODIFIED="1471053518335" POSITION="right" TEXT="数据结构">
<node COLOR="#000000" CREATED="1471053562582" ID="ID_110555422" MODIFIED="1471054230274" STYLE="fork" TEXT="cpu_workqueue_struct workqueue_stuct[NR_CPUS]">
<node CREATED="1471053609750" ID="ID_719744554" MODIFIED="1471059360240" TEXT="work_truct[]中每个元素:
cpu_workqueue_struct {
	lock; //保护该结构的自旋锁
	remove_sequence; //flush_workqueue()使用的序列号
	insert_sequence; //flush_workqueue()使用的序列号
	worklist; //挂起(函数)链表的头结点,链表结构为work_struct,双向链表
	more_work; //等待队列,其中的工作者线程因等待更多的工作而睡眠
	work_done; //等待队列,其中的进程因等待工作队列被刷新而睡眠
	wq; //指向workqueue_struct结构的指针
	thread; //指向架构中工作者线程的进程描述符指针
	run_depth; //run_workqueue()当前的执行深度
}">
<node CREATED="1471055597202" ID="ID_1099688693" MODIFIED="1471056441935" TEXT="worklist链表中的每个元素结构:
work_stuct {
	pending
	entry
	func
	data
	wq_data
	timer
}"/>
<node CREATED="1471056528123" ID="ID_932152382" MODIFIED="1471056550407" TEXT="wq指向的workqueue_struct结构"/>
</node>
</node>
</node>
<node CREATED="1471058395725" ID="ID_1803692200" MODIFIED="1471058401617" POSITION="right" TEXT="流程">
<node CREATED="1471058402502" ID="ID_249270671" MODIFIED="1471058614986" TEXT="queue_work() //把函数插入工作队列"/>
<node CREATED="1471058415472" ID="ID_1483126630" MODIFIED="1471058660746" TEXT="queue_delay_work() //延迟一段时间插入函数,其他和queue_work()一样"/>
<node CREATED="1471058432423" ID="ID_1388505546" MODIFIED="1471058754442" TEXT="worker_thread()
工作者线程,内部不断执行循环操作,等待某些工作被插入,一旦被唤醒就调用run_workqueue()">
<node CREATED="1471058447959" ID="ID_1224998089" MODIFIED="1471058835075" TEXT="run_workqueue()
从工作者线程的工作队列链表中删除所有的work_struct描述符并执行相应的挂起函数"/>
</node>
<node CREATED="1471058857008" ID="ID_1518747507" MODIFIED="1471058901112" TEXT="flush_workqueue()">
<node CREATED="1471058933928" ID="ID_1127442542" MODIFIED="1471058966755" TEXT="接收workqueue_struct描述符的地址"/>
<node CREATED="1471058967263" ID="ID_1784628668" MODIFIED="1471059027883" TEXT="使调用进程一直保持阻塞状态,直到工作队列中的所有挂起的函数都运行结束"/>
<node CREATED="1471059029672" ID="ID_1235247773" MODIFIED="1471059082075" TEXT="不会等待在该函数被调用之后加入工作队列的函数"/>
</node>
</node>
<node CREATED="1471059176679" ID="ID_1587247409" MODIFIED="1471059181691" POSITION="right" TEXT="注意">
<node CREATED="1471059182098" ID="ID_1185721757" MODIFIED="1471059219996" TEXT="工作队列中挂起的函数是在每个CPU上串行执行的"/>
<node CREATED="1471059220479" ID="ID_1924485268" MODIFIED="1471059294436" TEXT="工作队列函数可以阻塞,因此可以让工作者线程睡眠,甚至可以让它迁移到另一个CPU上恢复执行"/>
</node>
</node>
</map>