本帖最后由 杨为民 于 2023-5-18 15:39 编辑
谢谢答复,我现在明白是什么问题了。 (1)这种多个任务访问同一个公共变量的问题从操作系统一诞生的时刻就有了。在操作系统(包括RTOS)中,这种变量(广义称为资源)就叫做“临界变量”(广义临界资源),对这种临界资源的保护问题被称为“临界区保护”问题,保护的方法被称为“临界区保护方法”。 (2)临界资源的保护对所有的多任务系统而言都十分重要,因此在所有的操作系统教科书中都要用专门的章节来介绍,最著名的例子是哲学家就餐问题:(百度百科) 哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。哲学家就餐问题有时也用米饭和筷子而不是意大利面和餐叉来描述,因为很明显,吃米饭必须用两根筷子。 哲学家从来不交谈,这就很危险,可能产生死锁,每个哲学家都拿着左手的餐叉,永远都在等右边的餐叉(或者相反)。即使没有死锁,也有可能发生资源耗尽。例如,假设规定当哲学家等待另一只餐叉超过五分钟后就放下自己手里的那一只餐叉,并且再等五分钟后进行下一次尝试。这个策略消除了死锁(系统总会进入到下一个状态),但仍然有可能发生“活锁”。如果五位哲学家在完全相同的时刻进入餐厅,并同时拿起左边的餐叉,那么这些哲学家就会等待五分钟,同时放下手中的餐叉,再等五分钟,又同时拿起这些餐叉。 在实际的计算机问题中,缺乏餐叉可以类比为缺乏共享资源。一种常用的计算机技术是资源加锁,用来保证在某个时刻,资源只能被一个程序或一段代码访问。当一个程序想要使用的资源已经被另一个程序锁定,它就等待资源解锁。当多个程序涉及到加锁的资源时,在某些情况下就有可能发生死锁。例如,某个程序需要访问两个文件,当两个这样的程序各锁了一个文件,那它们都在等待对方解锁另一个文件,而这永远不会发生 见下图:
在这个问题里,筷子就相当于公共变量(临界资源),哲学家就相当于任务。大家都要去拿,两个人一起抢他们中间的筷子。最尴尬的情况是每个人都只拿到了一支筷子,谁也无法就餐。 (3)对于像Linux和Windows这样的计算机操作系统,当然不能用关闭总中断来进行临界区保护,而是采用加锁解锁等各种方法,有兴趣的读者简单的可以搜“哲学家就餐问题”的解法。 (4)对于像单片机上的没有标准操作系统支持的RTOS,只能采用关闭总中断的方法来进行临界区保护,笔者在本论坛里有专门帖子介绍,有兴趣的读者可以前往观看。 (5)uC/OS-II对于临界区保护同时提供了两种方法:单片机的关闭总中断的方法和操作系统对任务调度(切换)程序加锁解锁的方法。后者是标准的操作系统临界区保护方法,根本不涉及任何中断,就可以对RTOS的系统过程进行临界区保护。 (6)这是笔者选uC/OS-II来进行移植的原因之一,以后随着对移植过程的逐步展开,会专门介绍在那些不允许关闭总中断的的单片机应用场合如何使用这种方法来进行临界区保护。
|