章节列表

事件的等待与通知

2018-03-12 11:36:28 +0000 李述铜

本小节我们学习事件控制块的两个核心操作:事件的等待与通知。这两个操作也是其它同步与通信组件的等待与通知基础。

从实现上来说,这两个操作并不复杂。与之前学习的任务延时/退出延时所涉及的操作基本类似,区别就只在于这里是将任务插入事件等待队列而不是延时队列。

嗯,从某种意义上讲,任务延时到达也算是一种事件,可以考虑用事件控制块来处理。只不过为简单起见,二者独立实现。

主要内容

引入了事件控制块后,OS内核的核心数据组织就有了如下变化。如下图所示,可以看到每引入一个事件控制块,就多了一个任务队列。

同时还会导致任务的状态变迁图中多了一个状态。

在任务等待/退出等待操作中,任务需要在就绪表、延时队列(如果有设置超时)、事件控制块等待队列三者之间完成相应的插入/删除操作。

重点难点

注意事项

唤醒哪个任务

在最初设计这门课时,为了简单起见,唤醒事件控制块中的任务时总是唤醒队列首部的任务,而这个任务并不一定是高优先级任务。如果你希望让高优先级任务真正地具有高优先权,那么当通知时,也应当唤醒最高的优先级任务,让其处理这个事件。

注意,在这里的处理策略直接影响到了后面的邮箱、事件控制块、互斥信号等等模块。

如果你认为这是个“问题”,并期望解决,可以重新设计从队列中取任务的方式。 </span>

常见问题