消息邮箱和消息队列

来源:互联网 发布:无线路由器破解软件 编辑:程序博客网 时间:2024/05/22 17:26

邮箱是一个通过在系统共享存储区内传递消息来实现同步和通信的对象。

每个邮箱包含一个用于发送消息的消息队列和一个用来接受消息的消息队列。由于是在共享存储区域,因此它对每个任务都是可见的。

而一般的消息队列,还可用来处理任务与外部事件之间的通信。比如一个按键消息。然后其中一个任务可以在消息队列中尝试去获取消息。消息的分发可以由一个线程对立进行,或是通过事件处理例程进行发派。

总的来说,邮箱的空间开销比一般的消息队列要大(每个邮箱包含两个消息队列),不过由于是共享的,因此任务之间的消息同步可以通过邮箱进行。而传统的消息队列除了在任务之间进行消息传递之外,还可以让事件处理例程进行消息发派。每个任务可以有一个私有的消息队列,然后该任务可以通过将自己队列的地址进行注册,告诉给系统;或者传递给其它任务。另外,传统的消息队列中的消息的长度可以是不定长的。而由于邮箱定义在全局共享区,一般每个邮箱的大小及规格是固定的。

它们的共同点是,如果某个任务去接受消息,但失败,那么它就会处于等待状态。这时也可以结合事件进行唤醒触发,不过系统或另一个任务向它发送消息后会自动将其唤醒。


邮箱在数据结构上是一个双队列。一端由发送方发送消息,然后由系统在某一时刻将发送队列中的消息移入接收消息队列。
这就好比你写封信给你的一个朋友,你先是把信塞进邮筒,然后由邮局将邮筒的信件做统一批处理,最后分发给每户人家。这里其实也差不多,只不过这里没有邮递员和邮局的处理,而是发送者直接将信件发送到接收者家的邮箱中。

对于一份邮件,它包含了消息ID,发送者以及接收者(就像你写信,要写发信人和收信人地址一样)以及消息内容(通常是一个void*指针)。在你投信出去时,系统可能并不会马上将发送的的信转到接收队列,而且发送方一次可以发多个信件,因此这个动作可能在特定事件下,如:调度、定时器超时等,或者是在DSR(延迟的中断服务例程)中进行处理。
然后接收者就可以在指定的邮箱中等待接收信件了。

像楼上的xiaopoy(10楼)和xxgamexx(8楼)都说的不错。邮箱的特点是可以批传输消息,也就是说一次可以发多份消息,或者是在很短的时间间隔内连续发送消息。对于某些需要批消息处理的可以使用邮箱机制。

这里举个例子,比如说我们在玩PC时会有几个按键同时按下的情况(如:Alt+Delete+Ctrl)。这时可以利用邮箱来判断在某段时间内,有哪几个按键被同时按下。当按键扫描线程在扫到一个按键被按下时,立即将它放入邮箱,然后再扫,直到这段时间片被用完,系统将这些键值全都放入到邮箱的接收消息队列。然后在应用程序端可以通过邮箱接收到0个或多个键值的组合来作出不同的事件处理。


一般邮箱可能被做成单工的,也就是说对于一个邮箱,发送者不能逆转为接收者。然后,发送者和接收者都知道所创建邮箱的地址。

而对于消息队列,它的伸缩性比邮箱更强,可以做成各种形式的。对于一个消息一定有消息接收者的地址,系统将某个消息发送给接收者时,如果此时接收者处于阻塞状态,那么可以将其唤醒。而邮箱一般不是通过单个消息将接收者唤醒的,而是邮箱本身,即当系统将某个邮箱的发送队列中的消息送往接收队列之后,做唤醒操作。所以从实时性上看,消息队列应该比邮箱反应更快。不过,邮箱却可以捕获更多的实时内容。因为做一次唤醒,然后任务切换的消耗可能是比较大的。


摘自:http://bbs.csdn.net/topics/290026540

原创粉丝点击