linux 关中断 调度,关中断是否禁止任务调度?关中断能作为互斥吗?
正 文
关中断是否禁止任务调度?关中断能作为互斥吗?(2008/11/25 21:36)
今天再看《嵌入式软件系统教程》((美)西蒙 著,陈向群 等译) ,里面讲到关中断会关了任务调度,作者没说原因,我也不知道为什么,所以查了查网络。
===============================================================
在这个网址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)资源时,可能导致的一种所有参与任务全部被阻塞的状态。这分明是属于应用程序的逻辑概念,而调度则是属于操作系统的逻辑概念,怎么能混为一谈。
后记:
评 论
4楼 52RD网友 发表于 2008/11/27 12:29 回复
这是一个不浅也不深的问题,如果RTOS支持时间按片,那么与OS TIMER INT无法产生,基于时间片的调度就无法进行。 中断关了,CPU在公所,只有OS,你想想与这个有关吗?
3楼 JohnsonJin 发表于 2008/11/26 13:15 回复
所以,关中断不会禁止调度,还要在关中断处理的这个过程中不调用任何的OS函数,至少不能调用哪些会引起调度的函数。比如:资源申请,(内存申请,万一内存没有了呢),semaphore等同步函数的操作,给其他进程发消息....。
2楼 JohnsonJin 发表于 2008/11/26 13:11 回复
以上大部分都片面!我们先看调度发生的时机: 1. 中断 2. 系统调用。 然后我们看中断为什么会引起调度,通常中断会做一些处理,然后引起上层的“注意”。上层包括进程和负责进程调度的OS。如果系统支持时间片调度,那时钟中断引起OS把时间片到期的任务试着切换出去(如果没有相同优先级的进程在等待CPU的话,就不切换)。如果中断处理所需要引起的上层注意者是进程(中断ISR给进程发消息,信号,释放semaphore等),也就是本来在等待事件的进程被放到了ready队列。在中断处理结束的时候,OS的中断后处理过程会重新调度。这个时候就看谁的优先级高了,如果唤醒的是高优先级的进程,则做进程切换。系统调用其实也是一样的道理,在系统调用中,通常会引起资源或者锁的释放,或者触发其他高优先级进程ready,在系统调用结束的一刻,OS会重新尝试调度。
1楼 JohnsonJin 发表于 2008/11/26 13:10 回复
以上大部分都片面! 我们先看调度发生的时机: 1. 中断 2. 系统调用 然后我们看中断为什么会引起调度,通常中断会做一些处理,然后引起上层的“注意”。上层包括进程和负责进程调度的OS。如果系统支持时间片调度,那时钟中断引起OS把时间片到期的任务试着切换出去(如果没有相同优先级的进程在等待CPU的话,就不切换)。如果中断处理所需要引起的上层注意者是进程(中断ISR给进程发消息,信号,释放semaphore等),也就是本来在等待事件的进程被放到了ready队列。在中断处理结束的时候,OS的中断后处理过程会重新调度。这个时候就看谁的优先级高了,如果唤醒的是高优先级的进程,则做进程切换。 系统调用其实也是一样的道理,在系统调用中,通常会引起资源或者锁的释放,或者触发其他高优先级进程ready,在系统调用结束的一刻,OS会重新尝试调度。
linux 关中断 调度,关中断是否禁止任务调度?关中断能作为互斥吗?相关推荐
- Linux中断不能进行任务调度,关中断是否禁止任务调度?关中断能作为互斥吗?...
今天再看<嵌入式软件系统教程>((美)西蒙 著,陈向群 等译) ,里面讲到关中断会关了任务调度,作者没说原因,我也不知道为什么,所以查了查网络. ==================== ...
- 关中断是否禁止任务调度?关中断能作为互斥吗?
本文引自链接http://www.52rd.com/Blog/Detail_RD.Blog_imjacob_16830.html?WebShieldDRSessionVerify=COR6tnpfsO ...
- 【Linux开发】linux设备驱动归纳总结(六):3.中断的上半部和下半部——tasklet...
linux设备驱动归纳总结(六):3.中断的上半部和下半部--tasklet xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- 嵌入式之linux用户空间与内核空间,进程上下文与中断上下文
文章目录 前言 用户空间与内核空间 内核态与用户态 进程上下文和中断上下文 上下文 原子 进程上下文 中断上下文 进程上下文VS中断上下文 原子上下文 前言 之前在学习嵌入式linux系统的时候,一直 ...
- linux设备驱动归纳总结(六):3.中断下半部之tasklet
CU首页 ┊ fh265>>博客 微博 相册 个人中心 好友 消息 [退出] ┊ 随便看看 公告:缅怀Dennis Ritchie活动开赛啦! 小白的博客--提升自已,分享别人 xiaob ...
- linux块设备驱动中断程序,linux设备驱动归纳总结(六):1.中断的实现
linux设备驱动归纳总结(六):1.中断的实现 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- Linux内核深入理解中断和异常(5):外部中断
Linux内核深入理解中断和异常(5):外部中断 rtoax 2021年3月 1. 外部中断简介 外部中断包括:键盘,鼠标,打印机等. 外部中断包括: I/O interrupts; IO中断 Tim ...
- linux驱动的中断函数,嵌入式Linux驱动开发(四)——字符设备驱动之中断方式以及中断方式获取按键值...
之前我们完成了关于通过查询的方式获取按键键值的驱动程序,可以参考:嵌入式Linux开发--裸板程序之中断控制器. 虽然读取键值没有什么问题,但是测试程序占用CPU过高,一直在不断的查询,资源消耗过大, ...
- Linux中断技术、门描述符、IDT(中断描述符表)、异常控制技术总结归类
相关学习资料 <深入理解计算机系统(原书第2版)>.pdf http://zh.wikipedia.org/zh/%E4%B8%AD%E6%96%B7 独辟蹊径品内核:Linux内核源代码 ...
最新文章
- 一文读懂目标检测模型(附论文资源)
- Http和Https对比
- Apache Spark源码走读之6 -- 存储子系统分析
- Thread中,join()方法
- JVM 垃圾收集器CMS相关参数
- python绘制直方图显示数字_python plotly绘制直方图实例详解
- python控制浏览器导出数据_Django导出数据为Excel,调用浏览器下载
- PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.4. 额外特性
- 单页面响应式模板:黑石
- suse linux rpm 安装
- 突破大文件上传 和内网ip的端口转发
- 1章 SpringBoot介绍
- c++ opengl 分形树_推荐一些适合新手练手的C/C++项目,小白练手最适合!
- 永远不要低估自己,love your fear.
- My SQL数据库基本操作
- lua 的斗地主逻辑算法
- java中long类型数据的运算_在Java中,byte类型数据占【】个字节,short类型数据占【】个字节,int类型数据占【】个字节,long类型数据占【】个字节。...
- 嵌入式入门基础知识有哪些?
- 用计算机时按错了按什么键恢复出厂设置,电脑开机按什么键进入一键还原 选择高级—将系统恢复到过去某...
- 实现火车站售票的例子