完成量和等待队列都是异步poll机制的核心实现底层支持,这两个内容相比较与之前我们讲的进程-线程-多核之间消息互通机制而言增加了额外的内容处理。完成量很像信号量在获取不到时默认直接讲驱动自己休眠掉,当数据触发的情况下完成量被满足,内部的调用机制满足完成量内部就会自己完成等待函数的处理与调度。相比较信号量是直接在调用进程自己这里休眠了,而不是通过复杂的进程调度管理机制。
通过完成量实现内核驱动开发工作,完成量底层分装了等待队列内容,实现了驱动多进程之间消息互通。实际在裸机驱动开发过程中,如果一个中断信号过来,我们通过将一个标识位置修正为一个新的量,这样对应阻塞位置的程序开始进行调度工作。
4. 完成量和信号量差别
在 linux内核中,信号量用于为关键的数据部分提供互斥,而完成变量用于在等待事件的2个线程之间进行同步.为什么不使用信号量进行这种同步?在信号量上使用完成变量有什么好处吗? 您可能希望使用完成而不是信号量有两个原因.首先,多个线程可以等待完成,并且可以通过一次调用complete_all()来释放它们.让信号量唤醒未知数量的线程会更复杂. 其次,如果等待线程要释放同步对象,则在使用信号量时存在竞,下方主要介绍关于linux – 完成变量和信号量之间的差异的全文内容,希望对你有所帮助。
在 linux内核中,信号量用于为关键的数据部分提供互斥,而完成变量用于在等待事件的2个线程之间进行同步.为什么不使用信号量进行这种同步?在信号量上使用完成变量有什么好处吗? @H_404_2@
您可能希望使用完成而不是信号量有两个原因.首先,多个线程可以等待完成,并且可以通过一次调用complete_all()来释放它们.让信号量唤醒未知数量的线程会更复杂.
其次,如果等待线程要释放同步对象,则在使用信号量时存在竞争条件.也就是说,在使用up()完成唤醒线程之前,服务员可能会被唤醒并释放对象.完成时不存在此种族. (见Lasse的帖子.)