Linux中断不能进行任务调度,关中断是否禁止任务调度?关中断能作为互斥吗?...

今天再看《嵌入式软件系统教程》((美)西蒙 著,陈向群 等译)  ,里面讲到关中断会关了任务调度,作者没说原因,我也不知道为什么,所以查了查网络。

===============================================================

在这个网址http://www.hqwic.com/bbs/topic.aspx?topicid=11253上有一个讨论,我觉得很有道理。很明显观点是关了中断,只是禁止了抢占,但并没有禁止调度。

这样看来,那本书上的观点是不正确的??

把一些自认为很有道理的解释摘抄下来:

首先说明一下,引起调度(任务切换)的原因有两个:

1、任务主动进入了阻塞状态,就像2楼说的,调用了所谓的切换函数。

2、中断,中断服务程序(isr)改变了任务状态,使某个比当前任务优先级高的任务进入了准备好(ready)状态,于是内核调用了切换函数。

这两个原因可以称为“同步方式调度”和“异步方式调度”。抢占的意义在于:如果高优先级任务进入准备好状态后,操作系统可以立即调度(任务切换),将高优先级任务投入运行。而这些动作对低优先级任务来说是完全透明的。

但是,谁?!使高优先级任务进入准备好状态,而又对低优先级任务透明呢?就是“中断”。

所以说,“抢占”是系统进行了“异步方式调度”的结果。既然关闭了中断,也就禁止了抢占。楼主,你想明白了吗?

在这里也要纠正一下3楼和5楼:“关了中断,就禁止了调度”这种说法不妥。关了中断,只是禁止了抢占,但并没有禁止调度啊。

正在运行的任务是所有就绪任务中优先级最高的,如果要运行其它优先级更高的任务,就只有发生了某些事件使得更高优先级的任务进入了就绪状态,而这些事件只有在两种情况下发生:

1. 中断改变了任务状态

2. 运行中的任务主动使优先级更高的任务进入就绪状态

2 相当于是主动放弃CPU占有权,所以说抢占是由中断引起的,是异步调度的结果(??这里逻辑有点问题。作者的意思可能是 :2是非抢占的,主动的,1是抢占的,被动的,所以说抢占是由中断引起的,是异步调度的结果。by imjacob)

所以就是你说的结论,关中断只是关了抢占,而运行中的任务依然可以主动做任务调度。这里uC/OS有一个非常重要的前提条件,就是 运行中的任务是所有就绪任务中优先级最高的,如果没有事件发生就会一直运行直到完成。

所以,你最开始的疑问:“关中断只是屏蔽了中断,并没有阻止任务切换,高优先级的任务任然可以抢占CPU并访问临界区和共享变量啊”

关了中断,就禁止了抢占,如果当前任务也没有进行主动调度,当然系统中也就不会出现比当前优先级更高的任务进入就绪了,也就谈不上去“抢占CPU并访问临界区和共享变量”了。(作者这里说加了条件“如果当前任务也没有进行主动调度”,那如果当前任务进行了主动调度会怎么样?我认为,若是在临界区中进行了主动调度,那么后果就是提问的人说的:“关中断只是屏蔽了中断,并没有阻止任务切换,高优先级的任务任然可以抢占CPU并访问临界区和共享变量”。by imjacob)

由以下网址为证:http://www.gdjy.com.cn/xuexi/UNIX-XIUGAI/ch02/os0203.htm 中2.3.4为证。

上面是这么说的:

关 中 断 之 后, 任 何 外 部 事 件 都 不 能 打 扰 处 理 机 连 续 执 行 临 界 区 程 序。 如 果 临 界 区 程 序 本 身 并 不 包 含 使 它 的 进 程 转 变 为 封 锁 状 态 的 因 素, 那 么 这 种 方 法 就 能 保 证 临 界 区 作 为 一 个 整 体 执 行。 这 种 方 法 的 优 点 是 简 单、 可 靠, 但 是 它 也 有 一 定 的 局 限 性 和 若 干 不 足 之 处。

(1) 它 不 能 用 于 多 处 理 机 系 统。 其 原 因 是: 由 于 该 系 统 中 的 多 个 处 理 机 都 有 其 各 自 的 中 断 开 关, 因 此 一 个 处 理 机 并 不 能 阻 止 在 其 它 处 理 机 上 运 行 的 进 程 进 入 同 类 临 界 区。

(2) 在 临 界 区 中 如 果 包 含 有 使 执 行 它 的 进 程 有 可 能 进 入 封 锁 状 态 的 因 素, 则 也 不 能 使 用 这 种 方 法。 因 为 在 该 进 程 进 入 封 锁 状 态 后, 系 统 将 调 度 另 一 进 程 使 用 处 理 机, 如 果 需 要, 该 进 程 也 可 以 执 行 临 界 区 程 序, 不 会 受 到 任 何 阻 拦, 所 以 在 这 种 情 况 下, 开、 关 中 断 不 能 实 施 临 界 区 互 斥。

(3) 如 果 临 界 区 比 较 长, 则 本 法 会 降 低 中 断 响 应 速 度。

(4) 这 是 一 把 锁 处 理 各 类 临 界 区, 不 必 要 地 扩 大 了 互 斥 范 围。

“为什么关中断开中断可以作为互斥条件,而且是最粗暴的方式呢?”按上面的解释,开关中断是可以作为互斥条件的,但的确很粗暴。众所周知,嵌入式实时操作系统最关键的性能指标之一便是中断响应时间。中断响应时间越短,实时性就越好。但很多嵌入式操作系统(包括uCos在内)的中断响应时间都比较长。原因就是在这些操作系统中大量使用了关中断这种“粗暴”的方式(OS_ENTER_CRITICAL),你可以看看uCos, FreeRTOS等操作系统的源码,这样的写法比比皆是。当然,不用OS_ENTER_CRITICAL是不可能的,那会造成数据混乱,这是它们的系统结构所决定的。

如果能保证在中断处理中不去写共享数据(包括可能改变共享数据的系统调用),就可以不用关中断了,但这需要改变系统结构,把中断服务分为两个部分,这就是所谓的“Top half 和 Bottom half”。如果想了解具体,你可以去网上查查。应用这种技术的操作系统有Linux, Windows, eCos等。

不用中断来进行调度的操作系统,就是没有抢占,说白了就是一个协作式操作系统,怎么会一定导致死锁?难道抢占式操作系统就不会出现死锁?

其实,死锁是多个任务在企图获取多个独占(exclusive)资源时,可能导致的一种所有参与任务全部被阻塞的状态。这分明是属于应用程序的逻辑概念,而调度则是属于操作系统的逻辑概念,怎么能混为一谈。

后记:

另外在查网络的时候,还看到一本中国人的书(http://books.google.cn/books?id=X8lmMtog0XcC&pg=PT59&lpg=PT59&dq=%E5%85%B3%E4%B8%AD%E6%96%AD+%E4%BA%92%E6%96%A5&source=bl&ots=GwX4qh0hM0&sig=j1ieBs1RvU-bTpkddC4OyxoneTc&hl=zh-CN&sa=X&oi=book_result&resnum=2&ct=result) 3.2.2 硬件方法中写:“ 因为cpu只在发生中断时引起进程切换,这样禁止中断就能保证当前运行进程将临界区代码顺利执行完,从而保证了互斥的正确实现。”显然也是错的。我们可以当作练习把它改正了。哈哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win10系统怎样让打开图片方式为照片查看器

打开注册表编辑器之后,我们双击左侧的目录,依次打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft目录,如下图所示。 在Microsoft目录下,我们需要找到Windows Photo Viewer\Capabilities\FileAssociations目录项,直到看到该子…

python爬虫开发 从入门到实战 pdf 谢乾坤_python字符串和整数相互转换的实例分享...

python 字符串和整数的转换方法数字转成字符串方法一:使用格式化字符串:tt322tem%d %tttem即为tt转换成的字符串常用的格式化字符串:%d 整数%f%F 浮点数%e%E 科学计数%g%G e 和%f/%E 和%F 的简写%% 输出%格式化操作符辅助指令符号 作用* 定义宽度或者小数…

c语言插入排序算法_插入排序算法,流程图和C,C ++代码

c语言插入排序算法In the last article, we discussed about the bubble sort with algorithm, flowchart and code. In this article, we are going to discuss about another basic sorting technique i.e. insertion sort. 在上一篇文章中,我们讨论了用算法&…

EF使用CodeFirst方式生成数据库技巧经验

前言 EF已经发布很久了,也有越来越多的人在使用EF。如果你已经能够非常熟练的使用EF的功能,那么就不需要看了。本文意在将自己使用EF的方式记录下来备忘,也是为了给刚刚入门的同学一些指导。看完此文,你应该就学会以CodeFirst的方…

java jar包示例_Java包getImplementationVersion()方法和示例

java jar包示例包类的getImplementationVersion()方法 (Package Class getImplementationVersion() method) getImplementationVersion() method is available in java.lang package. getImplementationVersion()方法在java.lang包中可用。 getImplementationVersion() method …

c语言中字母的定义,c语言字符串定义与初始化 - 且听风吟

字符串的两种定义方式char数组char sa[] “hello world”;char指针char *sp “hello world”;这两种方式都产生了一个”hello world”的字符串常量,字符串常量存储在静态存储区中,静态存储区中的内容在程序运行的整个过程中都存在,而且只存储一份。数组…

python计算两字符串中的位置_python – 计算两个字符串之间距离的算法

是否有任何字符串距离算法没有考虑到单词的顺序?以下算法未提供所需结果(在该示例中,所需结果应为1):import jarojaro.jaro_winkler_metric(uMichael Jordan,uJordan Michael)>>>0.47import LevenshteinLevenshtein.ratio(Michael Jordan,Jorda…

php unset函数_PHP | 使用unset()函数从数组中删除元素

php unset函数Given an array and we have to remove an element from the array. 给定一个数组,我们必须从数组中删除一个元素。 unset()函数 (unset() function) To remove an element from an array, we can use a PHP library unset() function, it accepts th…

vi显示行号

vi显示行号 :set nu 带行号查看,并不改变文件内容:set nonu 取消带行号查看在每个用户的主目录下,都有一个 vi 的配置文件".vimrc"或".exrc"用户可以编辑它,使这些设置在每次启动 vi 时,都有效.例如,加入如下设置行:set nu 显示行号…

对象过滤某个属性 循环 php_37道PHP面试题(附答案)

1、什么事面向对象?主要特征是什么?面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。2、SESSION 与 COOKIE的区别是什么,请从协议,产生的…

项响琴C语言书籍在线浏览,电子琴 c语言程序

实用#include unsigned char code table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char temp;unsigned char key;unsigned char i,j;unsigned char STH0;unsigned char STL0;unsigned int code tab[]{64021,64103,64260,…

Java File类boolean createNewFile()方法(带示例)

文件类布尔型createNewFile() (File Class boolean createNewFile()) This method is available in package java.io.File.createNewFile(). 软件包java.io.File.createNewFile()中提供了此方法。 This method is used to create a new file by using createNewFile() method a…

oracle   SQL执行过程

1.sql执行过程1>解析(判断对象是否存在,是否有权限查询,语义解析,检查缓存中是否有相同的SQL等等)2>优化(CBO确定优化模式,确定访问路径,联接顺序,过程中通过很多综…

vue-video-player修改src就会报错_4、修改入口点代码

在riscv上电时,会进行CPU自检,然后跳转到bootloader处执行。bootloader设置好kernel的运行环境后,从硬盘加载kernel到内存,最后再跳转到kernel入口地址。我们采用的bootloader为OpenSBI,被加载到0x80000000地址&#x…

数码管超声波c语言黑51,51单片机开发板-超声波测距-数码管显示

《51单片机开发板-超声波测距-数码管显示》由会员分享,可在线阅读,更多相关《51单片机开发板-超声波测距-数码管显示(16页珍藏版)》请在人人文库网上搜索。1、计算机技术系项目工作报告课程名称单片机开发板设计与制作实训班级学号姓名项目名称超声波测距…

java 方法 示例_Java ArrayDeque带有示例的removeFirstOccurrence()方法

java 方法 示例ArrayDeque类removeFirstOccurrence()方法 (ArrayDeque Class removeFirstOccurrence() method) removeFirstOccurrence() method is available in java.lang package. removeFirstOccurrence()方法在java.lang包中可用。 removeFirstOccurrence() method is use…

社交应用动态九宫格图片的规则

这里主要以微信和QQ空间为作为研究对象,得到的结论如下。 QQ空间里的动态 iOS设备,以iPhone6为分界 iPhone6及以上分辨率的设备: 当宽且高同时 > 512px时,判断 宽/高的比例值:大于 2时,以高度为基准&…

c语言实现链表结构6,用c语言实现的链表结构--数据结构实验

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include"stdio.h"//使用new指针来将临时变量重新初始化#include"stdio.h"typedef int ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;void InitList(LinkList &L)//…

splunk中 如何隐藏input_翻糖制作中,如何避免裂缝,如何隐藏裂缝,如何防粘?...

翻糖蛋糕 因精致的样子和栩栩如生的各种造型深得人们的喜爱,它不仅满足了人们对蛋糕口味及装饰日益多样化的需求,同时也在动手制作的过程中,享受到美食与生活的无穷乐趣。不过裂缝,不平整,干燥对翻糖作品来说无疑是噩梦…

Java DataInputStream readUnsignedByte()方法(带示例)

DataInputStream类readUnsignedByte()方法 (DataInputStream Class readUnsignedByte() method) readUnsignedByte() method is available in java.io package. readUnsignedByte()方法在java.io包中可用。 readUnsignedByte() method is used to read 1 byte (i.e. 8 bit) of …