首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果处理器没有产生中断,系统软件必须做什么?

如果处理器没有产生中断,系统软件必须做什么?
EN

Stack Overflow用户
提问于 2019-10-01 16:29:01
回答 2查看 590关注 0票数 4

与中断有关的问题

如果处理器没有能力服务中断,那么系统软件需要做什么来确保每一次键盘击键都被检测到,每一次鼠标移动都被注册,以太网(网络)数据被正确处理,文件被成功地加载到内存中?

EN

回答 2

Stack Overflow用户

发布于 2019-10-02 05:49:04

如果处理器没有能力服务中断,那么系统软件需要做什么来确保每一次键盘击键被检测到,每一次鼠标移动都被注册,以太网(网络)数据被正确处理,文件被成功加载到内存中?

有两种方法可以做IO。

异步IO

执行IO的好方法是CPU要求设备执行IO,然后让CPU执行其他工作(包括运行其他程序),直到出现IRQ通知OS IO请求完成为止。对于具有(例如)4个CPU和20个设备的计算机;这允许所有4个CPU和所有20个设备同时进行有用的工作。这是每个现代操作系统所使用的方法(包括现代的“单任务”操作系统)。

在这种情况下,如果没有IRQ,您必须经常检查IO请求的完成情况(例如,在任何地方插入check_for_IO_completion()函数调用),其中“多长时间”是“设备性能”(延迟、完成IO请求和知道完成IO请求并能够启动下一个请求的操作系统之间可以传递多少时间)和"CPU性能“(在所有check_for_IO_completion()调用上浪费多少CPU时间)。当然(特别是如果存在任何安全性-例如,“内核空间”与“用户空间”隔离)没有很好的妥协--不管您牺牲了多少性能,您都不能期望性能与使用IRQ时的性能相同。

同步IO

执行IO的坏方法是CPU要求设备执行IO,然后不断轮询该设备,直到IO完成为止。对于一台拥有(例如)4个CPU和20个设备的计算机来说,永远不可能有超过4件事情同时发生(这4个CPU中的每一个都在做有用的工作或等待IO请求完成),而且您总是有至少20块硬件(设备或CPU)被浪费/无法完成有用的工作。

这是固件使用的方法(例如,BIOS和UEFI),因为它更简单,而且固件只用于启动操作系统(这主要涉及“从磁盘加载内核”,并且允许许多硬件同时工作并不能带来太大好处),而且固件在那之后被丢弃/忽略。也有一些可怕的旧操作系统使用这种方法(例如,MS)。

对于这种方法,IRQ并没有被真正使用,所以如果没有IRQ,也就无关紧要了。

注意:有几种不需要软件来传输数据的设备(例如键盘、鼠标、网卡接收而不发送数据包)。没有IRQ和同步IO;这类设备需要足够大的缓冲区来存储数据,直到软件请求数据和/或以某种方式处理缓冲区溢出导致数据丢失(例如TCP/IP重试)。

票数 4
EN

Stack Overflow用户

发布于 2019-10-02 04:45:37

在所有代码(包括用户空间)中,协同多任务处理( yield() )调用轮询,使操作系统能够频繁地使用CPU,从而可以轮询硬件.。

如果只允许为中断提供服务,那么仍然可以使用硬件机器来处理来自设备的信号,并创建一个需要服务的优先级队列。因此,与其循环遍历每个驱动程序并让它轮询自己的硬件,轮询还可以通过一个I/O读取来检查是否需要服务。也许CPU会支持内核中的队列,而不是中断,所以检查需要服务的挂起的东西甚至不需要关闭内核,只需要几个周期。

这将稍微减少一些可怕的开销,但它仍然需要系统中的所有代码都非常频繁地使用yield(),否则HW的服务将远远落后。

例如,在一个循环中有一个无限循环错误,您期望它足够短,如果没有yield(),那么除了重置按钮之外,您的整个系统将无法恢复。(经典的MacOS是这样的,只不过当这种情况发生时,你仍然可以移动鼠标。)

这个系统的HW应该设计成不需要太多的CPU交互,例如给磁盘控制器一个带有DMA地址的命令缓冲区。

您可以将鼠标控制器与视频卡集成,以便在不涉及CPU的情况下进行硬件光标移动。

NIC将有一个硬件接收队列,在CPU对其进行检查期间存储多个传入以太网帧的空间。(我认为现实生活中的NIC是这样工作的,至少是好的。在高流量情况下,真正的NIC驱动程序实际上可以/确实切换到轮询模式,而不是让HW为每个传入的数据包引发中断,以减少CPU开销。特别适用于10G /100 G的小帧以太网。但是,轮询是由100 is的计时器中断或其他什么来完成的,而不仅仅是使用产率()。

和文件已成功加载到内存中?

磁盘控制器不知道文件,只是块设备的扇区。但是是的,磁盘读取请求的报告可以通过轮询来完成。

或者在低端系统上,磁盘I/O可以用编程的I/O来完成,CPU必须分别读取每个字节或单词并将其存储到内存中。( x86上的IDE磁盘控制器过去是这样工作的,使用DMA作为一种选择,但是有些控制器有错误的DMA。所以Linux通常默认为PIO,您可以使用hdparm来启用DMA。虽然中断仍然存在,但我认为,可能是为了让CPU知道数据何时准备好在突发时从磁盘的缓冲区复制。您不想让CPU旋转几毫秒,等待头部寻找,然后才能开始传输。但是在具有固态存储的系统上,如SSD / Flash,搜索时间要小得多,因此您可以简化它,并阻止整个系统启动I/O,直到扇区传输完成为止。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58188945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档