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

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

在这个网址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只在发生中断时引起进程切换,这样禁止中断就能保证当前运行进程将临界区代码顺利执行完,从而保证了互斥的正确实现。”显然也是错的。我们可以当作练习把它改正了。哈哈。

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

  1. linux 关中断 调度,关中断是否禁止任务调度?关中断能作为互斥吗?

    正 文 关中断是否禁止任务调度?关中断能作为互斥吗?(2008/11/25 21:36) 今天再看<嵌入式软件系统教程>((美)西蒙 著,陈向群 等译)  ,里面讲到关中断会关了任务调度, ...

  2. 关中断是否禁止任务调度?关中断能作为互斥吗?

    本文引自链接http://www.52rd.com/Blog/Detail_RD.Blog_imjacob_16830.html?WebShieldDRSessionVerify=COR6tnpfsO ...

  3. 【Linux进程、线程、任务调度】四多核下负载均衡 中断负载均衡,RPS软中断负载均衡 cgroups与CPU资源分群分配 Linux为什么不是硬实时 preempt-rt对Linux实时性的改造

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 上一篇文章(点击链接:点击链接阅读上一篇文章)讲了: CPU/IO消 ...

  4. linux kernel的中断子系统之(三):IRQ number和中断描述符【转】

    转自:http://www.wowotech.net/linux_kenrel/interrupt_descriptor.html 一.前言 本文主要围绕IRQ number和中断描述符(interr ...

  5. linux设备驱动归纳总结(六):2.分享中断号【转】

    linux设备驱动归纳总结(六):2.分享中断号 转自:http://blog.chinaunix.net/uid-25014876-id-90837.html xxxxxxxxxxxxxxxxxxx ...

  6. Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    栈是什么?栈有什么作用? 首先,栈 (stack) 是一种串列形式的 数据结构.这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 ...

  7. Linux中断(interrupt)子系统之四:驱动程序接口层 中断通用逻辑层

    在本系列文章的第一篇:Linux中断(interrupt)子系统之一:中断系统基本原理,我把通用中断子系统分为了4个层次,其中的驱动程序接口层和中断通用逻辑层的界限实际上不是很明确,因为中断通用逻辑层 ...

  8. 一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 栈是什么?栈有什么作用? 首先,栈 (stack) ...

  9. Linux中的各种栈:进程栈 线程栈 内核栈 中断栈

    Linux中的各种栈:进程栈 线程栈 内核栈 中断栈 栈的作用 1. 函数调用 2. 多任务支持 Linux 中有几种栈?各种栈的内存位置? 1. 进程栈 2. 线程栈 3. 进程内核栈 4. 中断栈 ...

最新文章

  1. 监控组策略应用---组策略建模
  2. css实现提示信息,单纯使用CSS实现动态提示信息
  3. 2017沈阳站流水账+感想
  4. SpringBoot | 第十五章:基于Postman的RESTful接口测试
  5. Don't Laugh!I'm An English Book笔记(五)——面部词语大总结加补充
  6. 关于 VB,VC,Delphi,SDK 的笑话
  7. php case语句吗,【PHP公开课|关于PHP switch case语句,你知道怎么用吗,这个例子你一定要来看看】- 环球网校...
  8. 从程序员到项目经理(24):慎于问敏于行 - 忠于工作不等于奴性
  9. RVA和文件偏移的转换
  10. 全球及中国电动车行业品牌竞争策略与投资机会分析报告2022版
  11. wallys//Routerboard/IPQ4018/IPQ4028 802.11ac Wave2
  12. 智协云店通+BitCOO的4WiN.io全球互贸链 | 翼次元空间+Fund++
  13. 图像去雾去雨去模糊去噪
  14. Excel自动求和-乘法
  15. Codeforces Round #612 (Div. 2) C. Garland题解
  16. HTTP/3 ,它来了。
  17. cad隐藏图层命令快捷键_Auto CAD如何快速隐藏图层,快捷键是什么?
  18. 计算机分区的优点,作为一个电脑老手来告诉你们:电脑分区真的是越多越好吗?...
  19. 台式计算机主板检测与维修,主板故障!教你如何用主板诊断卡检测维修电脑主板故障...
  20. java经典递归 背包问题

热门文章

  1. pcb天线和纯铜天线_如何简化天线设计?相控阵波束成形IC来助您
  2. 英文数据集txt_YOLOv5在建筑工地中安全帽佩戴检测的应用(已开源+数据集)
  3. python 文档字符串_新款Python文档字符串生成器来了
  4. dhcp只能分配与路由器相同网段么_路由器的桥接详解
  5. 【Java从入门到头秃专栏 7】语法篇(六) :Lambda表达式(->) 方法引用(::) stream流
  6. 浏览器拦截跨域请求处理方法(已阻止跨源请求:同源策略禁止读取远程资源)
  7. Linux系统CPU相关信息查询
  8. 看懂架构设计中的服务隔离
  9. Centos 7安装与配置nagios监控(一)
  10. Varnish缓存代理简介与配置