倒挂的解决方案你现在是一位计算机专家,来聊一聊:“美国的火星探测器Mars Path-finder 就是因为优先级倒挂而出现故障的故事”

news/2024/11/8 8:59:18/

目录

倒挂的解决方案

你现在是一位计算机专家,来聊一聊:“美国的火星探测器Mars Path-finder 就是因为优先级倒挂而出现故障的故事”

●使用中断禁止


 具体证明请参阅LiuKayland1973年发表的论文。

 

因时序或外部中断或进程挂起而导致操作系统获得 CPU 控制权。
操作系统在所有就绪的进程中按照某种算法遴选进程。
如果选中的是非当前进程,则操作系统将当前进程(中断或挂起的进程)状态予以保护。
将选中的进程的环境布置好(设置寄存器、栈指针、状态字等)。
跳转到选中的进程

倒挂的解决方案

优先级倒挂的问题在 20 世纪 70 年代就已经发现,但却没有找到一个可以预测其发生的方法。这是因为在实际 运行中很难判断哪些进程之间会进行资源竞争,哪些进程又会从别人的资源竞争中渔翁得利。不过,虽然我 们不能预测其发生,但却可以采取手段防止其出现。由于优先级倒挂必须满足某些条件,因此我们只需将这 些条件排除即可防止优先级倒挂。
那么如何防止优先级倒挂呢?首先我们应该看到,优先级倒挂有两种形式:
不持有资源的低优先级进程阻碍需要资源的高优先级进程的执行。
持有资源的低优先级进程阻碍需要资源的高优先级进程的执行。

你现在是一位计算机专家,来聊一聊:“美国的火星探测器Mars Path-finder 就是因为优先级倒挂而出现故障的故事”

美国的火星探测器Mars Pathfinder是NASA于1997年成功发射的一项太空任务,旨在研究火星的地质特征、气候和大气条件。该任务的主要目标是通过着陆器和一辆名为Sojourner的火星漫游车来获取火星表面的图像和数据。

在Mars Pathfinder任务中,的确出现了一个与优先级倒挂相关的故障。这个问题源于任务中的软件设计。在探测器的软件中,任务控制代码使用了优先级反转(priority inversion)的方式来管理任务的执行顺序。

优先级反转是指当一个高优先级任务被一个低优先级任务占用所需的共享资源时,导致低优先级任务阻塞高优先级任务的现象。在Mars Pathfinder任务中,由于设计缺陷,当Sojourner火星漫游车需要访问共享资源时,它的任务优先级会被提高,从而导致其他高优先级任务被阻塞。

具体而言,在火星探测任务中,Sojourner火星漫游车需要与探测器上的无线电设备进行通信。由于设计上的错误,当无线电设备正在被其他高优先级任务使用时,Sojourner任务的优先级会被提高,以确保通信任务能够尽快完成。然而,这种优先级反转的机制却导致了其他高优先级任务被阻塞,影响了任务的正常执行。

这一故障的出现对Mars Pathfinder任务造成了一些延误和数据传输中断的问题。不过,NASA的工程师们很快意识到了问题,并通过重新设置优先级和优化软件设计来解决了这个问题。他们对任务的软件进行了修改,确保了高优先级任务能够在必要时获得优先执行,并且成功地恢复了任务的正常运行。

这个故事提醒了我们在设计和开发复杂系统时,需要仔细考虑任务的优先级和资源管理,避免出现优先级倒挂等问题。尤其在航天探测等对可靠性和安全性要求较高的领域,合理的软件设计和优先级管理至关重要。通过总结故障经验和进行改进,可以提高系统的鲁棒性和可靠性,确保任务的顺利执行。

使用中断禁止

这种办法的核心是通过禁止中断来保护临界区。在采用此种策略的系统中只有两个优先级:可抢占优先级和 中断禁止优先级。前者为一般进程运行时的优先级,后者为运行于临界区进程的优先级。由于不存在第3 种 优先级,因此第1 种优先级倒挂无法发生。由于系统里只存在一把锁(禁止中断操作在任何时候只能由一个 进程执行),不能发生乱序,因此也不会发生死锁。又由于进入临界区的进程总是能够不被打断而一直运行 到结束,因此也不会发生悬挂(hang)。此时,即使高优先级进程采用繁忙等待也不会发生死锁。
这里需要注意的是,所有中断都必须禁止。如果禁止的仅仅是一个特定的硬件设备的中断,则硬件的中断优 先处理机制将再次引入优先级倒挂。
该方法普遍应用于简单的嵌入式系统。这种系统的特点是可靠性、简易性和资源需求低。不过这种方法对程 序员的要求较高,因此在程序设计时需要将临界区设计得很短(中断禁止时间过长会造成系统响应时间增加而导致错误或灾难),通常应该在100 微秒以下。而这个时间对于通用计算机来说很不现实。
在多 CPU 环境下,由于不能使用中断禁止,因此使用一个简单的变种:单一共享标志锁。该方法在共享内存 里面提供一个单一标志。所有CPU 在进入跨 CPU 临界区时都必须先获得该标志。这个标志在有的操作系统里 面称为旋锁。本书将在第七篇对旋锁进行讨论。

 


http://www.ppmy.cn/news/74375.html

相关文章

加密与解密 调试篇 动态调试技术

目录 OllyDbg调试器的使用 CPU窗口 反汇编窗口 信息面板 数据面板 寄存器面板 栈面板 OllyDbg的配置 界面设置 调试设置 加载符号文件 基本操作 调试 单步跟踪 如果我们想直接运行 如果想重新运行 设置断点 下面对这个程序进行完整的调试分析 方法1 猜函数 方法…

第七章 面向对象编程(基础)

一、类与对象 1. 类和对象的区别和联系 (1)类是抽象的,概念的,代表一类事物,比如人类、猫类... 即它是数据类型。 (2)对象是具体的,实际的,代表一个具体事物&#xff0c…

Linux systemd

这里写目录标题 一:配置文件内容二:配置文件位置三:开机启动配置四:systemctl使用 一:配置文件内容 systemd服务配置文件存放在/usr/lib/systemd目录下,有系统system和用户user之分,需要开机不登录就能运行的程序,放在/usr/lib/systemd/syst…

排序问题之归并排序

题目描述 给定一个长度为 N 的数组 A,请你先从小到大输出它的每个元素,再从大到小输出它的每个元素。 输入描述 第一行包含一个整数 N。 第二行包含 N 个整数 1,...,a1​,...,an​,表示数组 A 的元素。 1≤N≤5105,−109≤ai≤109 输出…

Git常用命令fetch和pull和push

Git常用命令pull和push 1、fetch 从远程获取代码库。 # 会将所有远程分支都拉到本地 # 并不会合并代码 $ git fetch# 下载远程仓库的所有变动 $ git fetch remote $ git fetch origin# 指定拉取远程remote的branch分支到本地 $ git fetch remote branch $ git fetch origin …

Kafka 和 RocketMQ 在文件布局上的异同

Kafka 中文件的布局是以 Topic/partition 为主 ,每一个分区拥有一个物理文件夹,Kafka 在分区级别实现文件顺序写。如果一个 Kafka 集群中有成百上千个主题,每一个主题又有上百个分区,消息在高并发写入时,IO 操作就会显…

HarmonyOS低代码开发-创建新工程方式

使用低代码开发应用或服务有以下两种开发方式: 创建一个支持低代码开发的新工程,开发应用或服务的UI界面。在已有工程中,创建Visual文件来开发应用或服务的UI界面。ArkTS工程和JS工程使用低代码的步骤相同,接下来以JS工程为例讲解…

【Python pymongo】零基础也能轻松掌握的学习路线与参考资料

Python pymongo是一款基于Python的MongoDB数据库的驱动程序,它提供了操作MongoDB数据库的接口和方法。学习Python pymongo可以帮助开发者更好地使用MongoDB数据库,从而实现更好的数据存储和管理。在这篇文章中,我们将介绍Python pymongo的学习…