当任务在试图访问IPC对象时,经常会因为运行条件不足而失败,被迫返回或者阻塞在该IPC对象的任务阻塞队列。而当有任务释放资源从而使得资源条件可以满足时,操作系统将会唤醒IPC对象上的阻塞任务,使得被唤醒任务继续运行。不同的访问等待机制和唤醒机制是各种操作系统的重要区别。
IPC对象是活动在内核级别的一种进程间通信的工具。存在的IPC对象通过它的标识符来引用和访问,这个标识符是一个非负整数,它唯一的标识了一个IPC对象,这个IPC对象可以是消息队列或信号量或共享存储器中的任意一种类型。
用于任务访问IPC对象的等待机制主要有3种:
- 直接返回结果:任务直接返回访问结果,成功或者失败,注意因为中断不像任务那样能够被阻塞,所以中断必须采用本模式;
- 阻塞等待模式:任务如果访问IPC对象失败,则进入该IPC对象的等待队列,直到明确得到处理;
- 时限等待模式:任务如果得不到IPC对象,则进入等待状态并开始计时。如果在等待期间得到了IPC对象则返回操作成功;如果当计时结束时任务仍然没有成功,那么它并不会继续等下去,而是返回失败的结果。
操作系统唤醒机制主要有以下3种模式:
- 当资源可使用时,唤醒该资源的全部等待任务。让这些任务与系统中的其他任务平等竞争资源。这种策略会使系统瞬间繁忙,在参与竞争资源的所有任务中,最终只有一个任务获取到资源,没有得到资源的任务将再次进入资源的等待队列;
- 将该资源等待队列中的一个合适的任务唤醒。这个任务将和系统中可能访问该资源的其他任务一起竞争这个资源。如果这个任务最终没有竞争到资源,它会再次进入该资源的等待队列;
- 操作系统从等待队列中找到一个最佳的任务并立刻把资源交给它,这样该任务直接从释放资源的那个任务那里获得资源。
目前主流的嵌入式多任务系统都采用第3种方案。