AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 472591
Accepted
Tim
Tim
Asked: 2018-10-02 06:50:13 +0800 CST2018-10-02 06:50:13 +0800 CST 2018-10-02 06:50:13 +0800 CST

中断是否用于表示输出准备就绪或输入已完成?

  • 772

操作系统概念 说:

在 I/O 期间,各种设备控制器在准备好服务时会引发中断。这些中断表示

  • 该输出已完成,或
  • 输入数据可用,或者
  • 检测到故障。

中断是否用于表示输出准备就绪或输入已完成?

如果不是,是否需要用其他方式表示?

io interrupt
  • 3 3 个回答
  • 128 Views

3 个回答

  • Voted
  1. AndrejaKo
    2018-10-02T07:02:49+08:002018-10-02T07:02:49+08:00

    你把它放在或标题中是一件好事,因为答案是肯定的。

    也就是说,确切的答案取决于您所询问的确切中断。我们以 SPI 端口和 DMA 为例。SPI 是一个双向串行接口。

    例如,DMA 中断标记所谓的水位是很常见的。当 DMA 缓冲区已满、“几乎满”(例如 3/4)、“几乎为空”(例如 1/4)以及完全为空时,您将获得中断。

    对于 SPI 端口,您将有两个 DMA 通道。一个将处理来自外部设备的数据,另一个将处理从您的计算机发送到设备的数据。
    因此,当输出 DMA 通道中断指示缓冲区为空时,这意味着输出已完成。当输入 DMA 通道中断指示缓冲区不为空时,这意味着输入数据可用。

    • 5
  2. Best Answer
    sourcejedi
    2018-10-02T07:44:29+08:002018-10-02T07:44:29+08:00

    该输出已完成,或

    中断[也]用于表示输出已准备好吗?

    是的。

    考虑写入串行端口设备。该设备有一个称为 FIFO 的接收缓冲区,用于存储少量数据,例如 16 字节。

    当

    1. 缓冲区变空,输出完成。这个是用来tcdrain()在Linux上实现的。据称“在更改影响输出的参数时应使用此功能”。例如,当你想改变串行端口的“波特率”(频率)时,你可以使用它来等待,直到所有缓冲数据都已使用当前波特率传输。
    2. 一个字节已经从缓冲区中传出。现在有可用空间。设备现在已准备好让 CPU 将另一个字节推入缓冲区。

    输入数据可用,或者

    中断[也]用于表示输入已完成吗?

    也许。不过,我不确定这里有两种不同的东西,至少在我的例子中是这样。

    考虑从串行端口设备读取。该设备有一个称为 FIFO 的传输缓冲区,用于存储少量数据,例如 16 字节。

    当 FIFO 从输入中收集到至少一个字节时,设备将发送一个中断。例如,它可能会在连接到 CPU 的线路上从低电压变为高电压。

    CPU 可以通过从 IO 端口或 IO 内存读取来消耗缓冲区中的字节。

    旁注:此类事务可能比从系统 RAM 中读取花费的时间更长。为此,IO 设备必须在总线上插入“等待状态”。即有一个简短的握手,在 IO 设备设置“数据就绪”位之前可能需要几个总线频率周期。写入 IO 端口/IO 内存时,同样可以应用等待状态。但是,等待状态仅用于覆盖不同设备之间已知的操作频率/延迟差异。它们不用于等待外部输入或输出。这是因为它们会阻止 CPU 继续执行任何其他操作。

    因此,当输入可用时,会发出中断信号。如果愿意,当 CPU 读入输入字节时,您可以说输入“完成”。但是不需要中断来发出这个信号。正如不需要中断来表示从内存中读取已完成一样。

    输入缓冲区已满的情况实际上看起来更像是错误情况 - 它表明缓冲区溢出。该条件可能确实被设备记录下来,从而使操作系统能够检测到错误。但是,我认为没有理由专门针对溢出发送中断。因为当输入可用时,设备可能已经发送了中断。

    • 4
  3. Alexis Wilke
    2021-06-25T09:36:34+08:002021-06-25T09:36:34+08:00

    当重要事件发生时,大多数现代设备确实会产生中断。

    然而,中断是有代价的。它停止处理器当前正在执行的操作,迫使它处理中断。如果你收到太多中断,它实际上会破坏你的操作系统。我遇到过蓝牙中断过多(即每秒超过 700,000 次)之类的问题。

    在黑暗时代,在 Apple 2 上,你根本没有中断。一切都是通过投票类型的方案完成的。你会读取 I/O 端口,并根据不同的位知道你是否读取新数据。例如,要从软盘加载一个字节,您将循环直到一个字节为负(第 7 位已设置):

    $1
      LDA 0xC030
      BPL $1
    

    请注意,在 Intel 处理器(可能还有其他处理器)上,中断非常重载。也就是说,无论是VBL中断、USB端口中断,还是全新的SSD硬盘中断,都可能使用中断0x20。然后 CPU 的工作就是确定需要为哪一个或哪些服务。在最后一种情况下,即多个设备同时引发相同的中断,您必须确保在返回之前它们都得到服务,因为您不会再收到另一个中断(即大多数设备发送一个中断信号,它们不会重复它直到服务)。

    更详细的一点是,在处理一个中断时,CPU 会阻止更多中断(在 Intel 处理器上为STI/ )。CLI这意味着它可以完成当前中断的所有工作,然后最终它必须处理另一个中断。这确保了 I/O 数据处理中的序列化。这就是为什么我们经常从设备获取相对少量的数据。这允许将数据放置在用户空间中,然后可以由任意数量的线程处理。在现代 CPU 上,每个特定的中断都可以由单独的 CPU 处理。这允许并行处理多个中断。不过,根据我目前所见,您必须提前决定哪个 CPU 将处理哪个中断。它不会在 CPU 之间进行乒乓。

    • 0

相关问题

  • 产生过多中断的硬件能否独占 CPU?

  • 为什么 /proc/[PID]/io 中忽略 memmap IO

  • Linux - 提取 Tar 显着降低服务器速度

  • KVM/LXC 主机上的高 IO 会挂起服务器,但不会挂起来宾(Proxmox/Debian)

  • 有什么方法可以杀死或结束“磁盘睡眠”中的进程

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve