首页 理论教育Linux内核同步操作服务解析

Linux内核同步操作服务解析

【摘要】:相应的操作围绕着wait_queue_head_t、wait_queue_t和task来完成。2完成量completion除了针对应用task的同步操作服务外,内核经常会有任务需要同步,比如初始化时某个任务需要等待另外任务的一个操作完成等。这只是两个任务之间简单的同步,使用等待队列显得大材小用了,因此内核提供完成量completion来进行这种类型的操作。

1ᤫ等待队列wait queue

用户对数据的访问有同步和异步两种方式,用户同步的访问在内核中通常并不是直接执行的,而是需要在另外的上下文执行。这就需要内核针对这种同步操作提供相应的服务,通常的方式就是用户的上下文进行等待,等到操作完毕再进行唤醒,这种等待和唤醒都需要在驱动内部执行,只是驱动在不同的上下文执行罢了。内核针对这种情况提供的同步操作服务就是等待队列wait_queue。

等待队列框图如图5-35所示。

978-7-111-49426-3-Chapter05-143.jpg

图5-35 等待队列框图

从图5-35可见,wait_queue_head_t为等待队列的头。如果需要等待相应的task则会通过wait_queue_t加入到等待队列中。相应的操作围绕着wait_queue_head_t、wait_queue_t和task来完成。下面介绍主要的接口

定义和初始化等待队列头:

978-7-111-49426-3-Chapter05-144.jpg

定义并初始化等待队列项:

978-7-111-49426-3-Chapter05-145.jpg

添加/移除等待队列项:

978-7-111-49426-3-Chapter05-146.jpg(www.chuimin.cn)

等待事件:

978-7-111-49426-3-Chapter05-147.jpg

唤醒队列:

978-7-111-49426-3-Chapter05-148.jpg

下面是驱动中将任务加入等待队列的基本流程:

978-7-111-49426-3-Chapter05-149.jpg

其中会包括必要的数据保护操作以及设备状态的检查。这样希望同步操作的任务就可以等待相关操作的完成了。在驱动操作完成的回调中,通过等待队列的唤醒队列的接口,唤醒相关的上下文继续执行,使得schedule返回,继续进行后续的操作,这样就完成同步服务了。

2ᤫ完成量completion

除了针对应用task的同步操作服务外,内核经常会有任务需要同步,比如初始化时某个任务需要等待另外任务的一个操作完成等。这只是两个任务之间简单的同步,使用等待队列显得大材小用了,因此内核提供完成量completion来进行这种类型的操作。相关接口如下:

978-7-111-49426-3-Chapter05-150.jpg

从接口可见,完成量十分简洁,非常适合两个任务之间的同步服务。