Linux completion完成量说明
2021/12/5 7:22:29
本文主要是介绍Linux completion完成量说明,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
completion是内核中的一种同步机制,该机制主要借助等待队列实现同步,该同步机制是一种简单的同步机制。
下面简要分析下该同步机制的实现(本次源码基于linux 3.10)。
一、结构体说明
struct completion { unsigned int done; wait_queue_head_t wait; };
主要包括等待队列头以及完成量统计值done变量。
而针对等待队列头的结构体,主要包含自旋锁与链表。
struct __wait_queue_head { spinlock_t lock; struct list_head task_list; }; typedef struct __wait_queue_head wait_queue_head_t;
二、completion的初始化
主要包括宏初始化与函数初始化两种方式
2.1宏初始化
宏初始化定义如下所示,主要是将done变量设置为0,并调用静态初始化等待队列头的宏
__WAIT_QUEUE_HEAD_INITIALIZER
#define COMPLETION_INITIALIZER(work) \
{ 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) }
2.2函数初始化
该接口逻辑简单,代码如下
static inline void init_completion(struct completion *x) { x->done = 0; init_waitqueue_head(&x->wait); }
三、等待接口
该接口名称wait_for_completion,主要调用wait_for_common,而wait_for_common则主要是将当前线程加入等待队列,然后调用schedule将
自己调度出去,等到被唤醒后,则判断done变量是否大于0,若大于0则返回,否则继续等待,直至done变为1。
void __sched wait_for_completion(struct completion *x) { wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_UNINTERRUPTIBLE); }
关于wait_for_completion的调用流程图如下所示,针对completion来说,其虽然调用了__wait_for_common,但其并没有使用超时返回的操作,具体可通过schedule_timeout的实现确定,关于schedule_timeout的实现已在下面的流程中有介绍。
这篇关于Linux completion完成量说明的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-03-30[译]漫画SELinux概念
- 2024-03-29linux 移动文件
- 2024-03-28linux .so file
- 2024-03-28Linux 磁盘管理
- 2024-03-28Linux学习笔记(十三)磁盘管理(一):磁盘分区
- 2024-03-26linux 创建 文件
- 2024-03-25使用SecureCRT对Linux vim进行颜色设置
- 2024-03-202019-2020-12 20199317 《Linux内核原理与分析》 第十二周作业
- 2024-03-20Linux运维的第二周总结
- 2024-03-13how to count number of directories in linux