关调度与关中断

2023-11-14

关调度与关中断

关中断与关调度是两种进入临界区的方式,它们有各自的使用环境。

最近在研究 ucos-III 的源代码时发现 ucos-III 中有对临界区的优化。以关调度来代替关中断的方式工作,系统可以在特定的情况下用关调度的方式来替代关中断,从而提高了整个系统的实时性。

首先,关闭了调度之后就不存在任务间的抢占问题,当前执行的代码只能被中断打断。不同于关中断的方式,关调度的过程中系统仍旧能够正常响应中断。

关调度确实有上述好处,但对使用环境的要求极为严格。凡是不能够在中断上下文中修改的内容,都可以通过关调度的方式来制造临界区。 容易理解,却很难应用。哪些是中断上下文中不能使用的 api?那些是中断上下文中不能使用的系统数据结构?只有理清楚这两点才能够正确的使用关调度来代替关中断,而这需要对实时操作系统有很深的了解。

什么样的行为会有什么样的过程将导致什么样的结果?这就是上述问题的一个简化。例如:在 ucos-III 中使用 OSTaskCreate 来创建任务时会发生怎样的过程?这样的过程会创建了哪些新的数据?又对系统中的哪些数据结构实例产生了影响?只有当我们能够掌控这其中的所有过程时,我们才能够发现用关调度替换关中断的时机。

关闭子中断

关中断以范围划分可以分为关闭总中断与子中断。在目标均能够正常完成的情况下,关闭子中断的方式能够增强系统的实时性。当然,仅仅在少数情况中可以使用关闭子中断的方式。使用不当则可能造成临界区保护不足的问题,这种问题极难定位,很难 debug

具体的示例如下:

  1. TCP/IP 协议栈中,协议栈不同层之间存在着共享的数据结构,必须要对这些数据结构进行保护。
    协议栈的数据结构仅由协议栈独有,用户通过调用协议栈提供的 api 接口直接或间接的操作这些数据结构。因此可以通过关闭与协议栈相关的子中断的方式来完成临界区保护。Net/3 中按照不同优先级提供相应的关中断的方式。这里的关中断以 “提升优先级” 的方式完成。如 splimp 函数通过将 CPU 优先级提升为网络设备驱动中使用的优先级来阻止任意网络设备中断的发生,从而实现临界区保护功能。

  2. linux早期内核中通过使用全局的 cli(),以关闭处理器上所有中断的方式来完成临界区保护。2.5 版本之后就以本地中断控制和自旋锁取缔了此种方式。事实上,关闭所有中断确实是一种同步问题的解决方案,但是这种方案的代价太大。结合局部性原理来说,你执行局部的代码,修改局部的数据结构,却要屏蔽所有中断,这未免也太不合理了吧!

总结

在本文中我讨论了关中断与关调度两种保护临界区的方式。就原理来看,关中断方式能够更彻底的保护临界区数据,却可能会造成系统实时性的降低。关调度的方式仅仅能在特定的环境中使用,却能够增强系统的实时性。具体应该使用哪种方式来进行临界区保护,需要根据实际情况来选择!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关调度与关中断 的相关文章

  • Linux“屏幕”的 Windows 等效项还是其他替代方案?

    我正在寻找一种在 Windows 环境中控制程序的方法 我希望它与 Linux 软件有点相似 screen 我搜索的原因是我需要使用标识符启动一个程序 在 Windows 上 这样我以后就能够关闭该特定程序 而无需关闭其他任何程序 即使实际
  • 错误:命令“c++”失败,退出状态为 1

    所以我尝试按照以下说明安装 Pyv8https andrewwilkinson wordpress com 2012 01 23 integrating python and javascript with pyv8 https andre
  • 在 Linux 上创建线程与进程的开销

    我试图回答在 python 中创建线程与进程有多少开销的问题 我修改了类似问题的代码 该问题基本上运行一个带有两个线程的函数 然后运行带有两个进程的相同函数并报告时间 import time sys NUM RANGE 100000000
  • 如何设置Java线程的CPU核心亲和力?

    我搜索了以前关于类似主题的帖子 但找不到合适的答案 因此提出这个问题 非常感谢您帮助回答 我知道在 Linux 中通过任务集命令设置进程与特定 CPU 核心的关联性 但我想设置 Java 线程与特定 cpu 核心的亲和力 以便属于同一进程的
  • 无需 root 访问权限即可安装 zsh? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有可能 以及如何 我确实需要在几台具有 ssh 访问权限 但没有 root 访问权限 的远程计算机上使用此功能 下载 zsh wget O zsh t
  • 运行此处编译的 C 程序会导致在另一台服务器上找不到 GLIBC 库错误 - 是我的错还是他们的错?

    此处编译的 C 程序在我们的 Ubuntu 服务器上运行良好 但是当其他人尝试在他们的特定 Linux 服务器上运行它时 他们会收到以下错误 myprog install lib tls libc so 6 version GLIBC 2
  • 用于读取文件的 Bash 脚本

    不知道为什么最后一行没有从脚本中删除 bin bash FILENAME 1 while read line do cut d f2 echo line done lt FILENAME cat file 1 test 2 test 3 t
  • 使用 ProcessBuilder 运行 shell 脚本

    我正在尝试使用 Java 和 ProcessBuilder 运行脚本 当我尝试运行时 我收到以下消息 error 2 没有这样的文件或目录 我不知道我做错了什么 但这是我的代码 ps 我尝试只执行不带参数的脚本 错误是相同的 String
  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s
  • 如何在文件夹中的 xml 文件中 grep 一个单词

    我知道我可以使用 grep 在这样的文件夹中的所有文件中查找单词 grep rn core 但我当前的目录有很多子目录 我只想搜索当前目录及其所有子目录中存在的所有 xml 文件 我怎样才能做到这一点 我试过这个 grep rn core
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • 比较linux中的两个未排序列表,列出第二个文件中的唯一项

    我有 2 个包含号码列表 电话号码 的文件 我正在寻找一种列出第二个文件中第一个文件中不存在的数字的方法 我尝试过各种方法 comm getting some weird sorting errors fgrep v x f second
  • 如何在linux中使用iptables将http和https流量转发到透明代理[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 如何通过不同的接口路由 TCP/IP 响应?

    我有两台机器 每台机器都有两个有效的网络接口 一个以太网接口eth0和 tun tap 接口gr0 目标是使用接口在机器 A 上启动 TCP 连接gr0但然后让机器 B 的响应 ACK 等 通过以太网接口返回 eth0 因此 机器 A 发出
  • 为什么无论 -rdynamic 如何,backtrace 都不包含 Objective-C 符号?

    Update 我正在 Linux 上使用 GNU 运行时 问题是not发生在带有 Apple 运行时的 MacOS 上 更新2 我在 MacOS 上编译了 GNU 运行时并用它构建了示例 该错误确实not发生在带有 GNU 运行时的 Mac
  • Linux下单个目录下文件过多会怎样?

    如果一个目录中有大约 1 000 000 个单独的文件 大部分大小为 100k 其中没有其他目录和文件 是否会以任何其他可能的方式降低效率或产生缺点 ARG MAX 会对此提出异议 例如 rm rf 在目录中时 会说 参数太多 想要执行某种
  • Linux >2.6.33:可以使用 sendfile() 来实现更快的“猫”吗?

    必须将大量大文件连接成一个更大的单个文件 我们目前使用 cat file1 file2 output file but are wondering whether it could be done faster than with that
  • 命名互斥体的 Mono 替代方案

    在 Windows NET 上 命名的互斥体可用于同步多个进程 不幸的是 Mono 在 Linux 上不太支持这一点 他们的发行说明 http www mono project com Release Notes Mono 2 8 Shar

随机推荐

  • 第十届蓝桥杯省赛C++B组 迷宫

    试题 E 迷宫 本题总分 15 分 问题描述 下图给出了一个迷宫的平面图 其中标记为 1 的为障碍 标记为 0 的为可 以通行的地方 010000 000100 001001 110000 迷宫的入口为左上角 出口为右下角 在迷宫中 只能从
  • 攻防世界weak_auth知识详解

    1 进入环境 当我们点进去的时候 出来一个网页 让我们输入username和password 先随便输入一下 然后弹出是说让我们用admin作为username登入 那我们就按照它的要求吧 进行修改 这次它只是提醒了密码错误 我们的重心开始
  • Es_算分函数使用详情

    算分函数查询 相关性计算 当我们利用match查询时 文档结果会根据与搜索词条的关联度打分 score 返回结果时按照分值降序排列 例如 我们搜索 虹桥如家 结果如下 score 17 850193 source name 虹桥如家酒店真不
  • 递归遍历树节点

    考虑这样一种场景 从一个object找到id对应的对象 obj如下结构 调用 fn obj 121 返回 对应object id 121 child const obj id 0 child id 1 child id 12 child i
  • Failed to read the 'localStorage' property from 'Window' 的解决办法

    参考链接 https stackoverflow com questions 30481516 iframe in chrome error failted to read localstorage from window access d
  • 【PHP小皮】使用教程

    博主介绍 主攻JAVA 因不可逆的原因 被迫学PHP 刚人门多多关照 文章目录 前言 一 官网下载小皮 二 使用步骤 1 打开小皮页面 2 使用步骤如下 总结 前言 随着快爱情的发展 php也不是那么的繁琐 下载集成工具小皮就可以省去很多时
  • 史上最全的maven的pom.xml文件详解

    本文转自 https www cnblogs com hafiz p 5360195 html 原作者 阿豪聊干货
  • Flask后端笔记(二)request、bort、响应、session、钩子

    Flask后端笔记 获取请求参数 上传文件 with的使用 bort函数与自定义异常处理 abort函数 自定义异常处理 返回的响应数据 元组 make response json模块的使用 使用jsonify返回json数据 重定向 设置
  • 最新的单机Lustre文件系统的安装

    1 单机Lustre的搭建 主机名 IP地址 内存 添加的共享磁盘大小 Centos7 9 test机 192 168 10 30 24 1G 20G 1 安装E2fsprogs包 下载OSS服务器所需要的包 E2fsprogs包只是在Ex
  • 该linux文件目录的owner权限

    sudo chown R admusr 要改的用户名 admusr path
  • “过早优化是万恶之源”这句话的源头

    来自于一篇大神的论文 而且原意没有一句话那么简单 Premature optimization is the root of all evil Programmers waste enormous amounts of time think
  • python 下载安装

    在下载Python之前我们要明确我们的开发环境的操作系统 这里我们选择Windows Python下载步骤 Python安装步骤 测试安装是否成功 注意 如果输入python后 没有出现如图效果 而是显示 python 不是内部或外部命令
  • .NET Core 获取自定义配置文件信息(多种方式)

    引用 Microsoft AspNetCore App 元包或将包引用添加到 Microsoft Extensions Options ConfigurationExtensions 包 简而言之 直接可以用 Appsetting json
  • ES分布式搜索引擎

    初始化RestClient 引入依赖 因为SpringBoot默认的ES版本是7 6 2 所以我们需要覆盖默认的ES版本
  • Linux用nohup后台运行python程序及停止

    在Ubuntu上用python flask写了一个后端代码 每次运行要CMD先远程连上服务器 然后python xxx py启动 这样操作会让cmd窗口被占用 没办法进行其他操作 ls cd这种 如果把窗口关了 程序就停止了 看了网上的例子
  • CTFSHOW【萌新计划】Writeup

    CTFSHOW 萌新计划 web1 萌新计划 web2 萌新计划 web3 萌新计划 web4 萌新计划 web5 萌新计划 web6 萌新计划 web7 萌新计划 web8 萌新计划 web9 萌新计划 web10 萌新计划 web11
  • 《我的眼睛--图灵识别》第五章:基础:形状识别

    我的眼睛 图灵识别 第五章 基础 形状识别 1 图形认识 三角形 三角形是由同一平面内不在同一直线上的三条线段 首尾 顺次连接所组成的封闭图形 三角形按边分有不等边三角形 等腰三角和等边三角形 按角分有直角三角形 锐角三角形 钝角三角形等
  • antd的Form表单控制实例的使用

    Form表单的控制实例 一 业务常景 二 使用Form表单的实例来解决 一 业务常景 遇到一种业务场景 即一个简单的Modal框 Form的一个组合 仔细思考了一下 和我们平时直接使用Form表单还是有一定的区别 我们通常是通过给Form表
  • springcloudAlibaba 链路追踪SkyWalking

    一 链路追踪SkyWalking简介 在大型系统的微服务化构建中 一个系统被拆分成了许多模块 这些模块负责不同的功能 组合成系统 最终可以提供丰富的功能 在这种架构中 一次请求往往要涉及到多个服务 互联网应用构建在不同的软件模块集上 这些软
  • 关调度与关中断

    关调度与关中断 关中断与关调度是两种进入临界区的方式 它们有各自的使用环境 最近在研究 ucos III 的源代码时发现 ucos III 中有对临界区的优化 以关调度来代替关中断的方式工作 系统可以在特定的情况下用关调度的方式来替代关中断