Windows CE 提供的处理程序间的通讯 (IPC,Interprocess Communication)机制比较简单实用,和桌上型计算机使用的操作系统相比,它没有提供诸如消息(message)、端口 (port)、监督程序 (monitors) 之类的复杂通讯机制,而是提供了使用等待队列的基本通讯方式:临界区 (critical section)、事件 (event)、同步(synchronization) 以及互斥器 (mutex),它们都被实作为系统对象。系统对象是由系统管理的资源实体,系统透过列表记录追踪它们的信息,当某个处理程序向系统请求一个系统对象的时候,系统将传回一个句柄加以标识,处理程序就可以透过这个句柄存取该对象。此外系统还提供了互斥的变量运算。对于嵌入式系统来说,这些方法简单实用、并且较不耗费系统成本。
通讯机制的一个基础,就是在某个对象上的等待队列。它就好像在银行领钱需要排队一样:银行的每个柜台办理不同的业务,当某个柜台正在为一位客户服务的时候,需要该服务的其它客户就需要排队,柜台就是系统对象,排队的客户就是要使用对象的处理程序或者执行绪、队伍就是等待队列。因为对系统对象的存取经常具有互斥性,所以当一个系统对象被多个执行绪共享时,系统就有可能产生等待队列,具体的实作可以参考第3 章的内容。
1. 临界区 (critical section)
这是系统内部最常用的互斥方式,经常用于重要系统数据的修改。一般情况下,临界区对象用于保证一段程序代码执行的不间断性。一个临界区对象的使用被限制在某一个处理程序或者动态链接库当中,它不能被多个处理程序同时使用。
使用InitializeCriticalSection 函数可以向系统取得一个临界区对象,当使用完毕之后,需要呼叫DeleteCriticalSection 释放该资源。一段临界程序代码执行时,相关的临界区对象句柄必须是有效的, 而这段程序代码需要以EnterCriticalSection 或者TryEnterCriticalSection 函数开始, 而以
LeaveCriticalSection 结束。这样,系统可以保证当多个执行绪试图同时进入同一段临界程序代码时,只有一个会成功。
2. 事件 (event)
一个事件对象类似于一种特定的短消息,它用来通知某个执行绪系统发生了一个特定的事件或者告诉这个执行绪该做什么事了。例如随插即用管理器发现了一个新的设备,它会设置一个特定事件,系统就会触发和该事件相关联的执行绪,并告诉它系统增加了一个设备。
类似临界区对象,事件对象使用前也需要向系统要求资源句柄,在使用后则必须释放句柄,不同的是,系统藉由SetEvent 或者PulseEvent 设置一个事件,使用ResetEvent 可以还原这个事件对象的状态。
3. 互斥器 (mutex)
互斥器的拥有者只能有一个,它的操作也相当简单,当使用CreateMutex 申请资源成功时,执行绪就拥有了该资源的所有权,别的执行绪申请同样的资源就会进入等待队列,直到这个执行绪呼叫ReleaseMutex 函数,释放资源为止。如果执行绪退出的时候没有呼叫ReleaseMutex,则这个资源会自动释放,等待队列上的第一个执行绪就会得到这个互斥器的所有权。
4. 号志 (semaphore)
号志和互斥器的基本原理是一样的,但是它允许特定数目的执行绪共享这个资源,获得和释放的函数分别为:CreateSemaphore 和ReleaseSemaphore。
5. 互斥的变量运算
系统提供了8 个函数用来改变某个共享变量的值,例如把某个共用计数变量的值增加1 或者减少1。这些函数的共同特征是测试并改变这些变量的过程在处理程序中是不可中断的,可以视作不可分割的操作。
6. 内存共享
Windows CE 中处理程序间的储存空间共享主要在两个层面:在逻辑储存层,主要藉由建立共享heap 来处理程序之间达到内存共享的目的;而在虚拟内存管理的层次,系统则是藉由直接将不同的虚拟地址对应到同一实体地址来达到内存共享的目的。存取共享储存空间时,一般需要前面几种同步机制配合以保证程序执行的正确性。