OS复习笔记ch1-2

引言

承接上文,我们在讲解中断之前先回顾一下组原(以下简称CO)的一些知识。
我们都知道CPU是计算机的中央处理单元,几乎所有的运算都会经过CPU,而一般外设作为输入和输出设备,其速度和CPU完全不在一个量级上,那么它们如何和CPU进行交互呢?


外设与CPU交互的方式

主要有以下三种方式

  • Programmed I/O 程序控制I/O

  • Interrupt-driven I/O 中断驱动I/O

  • Direct memory access (DMA) 直接存储器访问

CO中断的概念由此引入,但是为了知识的循序渐进性,也为了让读者能更明白其中的原理,我们对这三种交互方式都会进行一定的讲解。

程序控制I/O

程序控制,顾名思义就是需要程序(软件)在代码中写出控制逻辑,某些时候该方式又称为轮询(polling)。
举一个例子就是

int a = -1;

while(1) {
	printf("请输入一个正整数\n");
	scanf("%d",&a);
	bool flag = a > 0;
	if(flag)
		calculate(a);
	...
}

这里就是我们初学C语言经常写的代码,程序等待用户的输入一个正整数,满足a>0的条件,这样整个程序才能执行calculate函数,否则一直循环。

这里的flag其实就是一个标志位。与之类似,外设的接口处有Ready标志位,CPU想要和外设之间进行数据交互,就要先查询接口的标志位。询问外设是否准备就绪,如果没有准备就绪,CPU一会儿再来访问;如果外设准备就绪,进行数据传输。
​程序控制I/O的特点:

  1. 由程序发起IO请求,并且等待完成;
  2. 交互必须通过CPU的参与。

很显然,这种方式实现起来比较简单,但是效率低。当用户迟迟不输入/无效输入,你总不能让CPU一直在while循环里兜圈子吧,其他程序也不能占用CPU,交互体验就很糟糕。

如果没有中断机制,那么CPU会发生轮询(Polling),它是一种CPU决策如何提供周边设备服务的方式,又称“程控输入输出”(Programmed I/O)。接下来就要详细说我们的中断了。

中断

定义:中断是指程序执行过程中,当发生某个事件时,中止CPU上现行程序的运行,引出处理该事件的程序执行的过程。

PS:由于计算机是新兴学科,很多概念一直没有统一的定义。如果有小伙伴们使用的教材或者老师上课的PPT与之不同,建议不去深究。

通过中断的定义,我们就可以知道一个很重要的点,中断是会中止CPU现行程序的运行
强调中止不是终止,同时针对的是现行程序,即需要I/O的程序。
对比一下我们之前学的轮询的方式,中断是会中止CPU现行程序的运行,也就意味着CPU不会一直等待I/O设备Ready,而会去做其他的事情,如下图所示。
image.png

图中是计算机操作系统中的控制流,涉及到I/O(输入/输出)操作时的程序行为差异。左边的图(a)展示了没有中断时的情况,右边的图(b)则展示了有中断时的情况。

在图(a)中:

  1. 用户程序开始执行WRITE操作。
  2. I/O指令被发送到I/O程序,此时CPU在等待I/O操作完成。
  3. 用户程序因I/O操作而暂停,直到该操作完成。
  4. I/O程序完成操作,返回控制给用户程序。
  5. 用户程序继续执行,直到结束。

这个过程中,CPU在I/O操作期间是空闲的,没有做任何工作,这导致资源利用率低。

在图(b)中:

  1. 用户程序开始执行WRITE操作(1执行完,代码位置p0)。
  2. 在I/O指令发出后,用户程序并不等待,而是继续工作,执行任务2a,I/O程序并发执行4。
  3. 当I/O操作结束需要通知CPU时,会发出一个中断信号到p0位置。
  4. CPU接收到中断信号后,会暂停当前的用户程序(停在2a和2b分界,代码位置p1),转而执行中断处理程序5 。
  5. 中断处理程序处理完I/O操作后,返回控制给用户程序。
  6. 用户程序从p1开始继续执行2b
  7. 遇到下个WRITE操作,同理重复1-6的过程。

这里CPU的时间得到了更有效的利用,因为在等待I/O操作完成的同时,它可以执行其他任务。这样的设计显著提高了系统的效率和吞吐量。

接下来让我们了解一下中断的几种分类。

分类1
  • 强迫性中断

强迫性中断,指的是被优先级更高的中断强制打断当前正在运行的低优先级的中断。因此,所有的硬件中断都可以属于强迫性中断,因为硬件中断的优先级都比软件任务高。例如,时钟中断、串口中断、DMA中断等都可以是强迫性中断。

  • 自愿中断

自愿中断,顾名思义是程序自己主动放弃CPU的控制权产生的中断,有的时候又叫软件中断。
e.g., Linux中的int 80h。当一个程序需要执行如文件操作、网络通信或者是进程控制等内核级操作时,它不能直接执行这些操作,因为这些操作涉及到系统的安全和稳定性。相反,程序会使用 int 80h 指令来发起一个中断,然后由操作系统接管,执行所需的系统调用。

分类2
  • 外部中断(来自CPU以外的中断)
     外中断是指处理机之外的事件引起的中断,如外部设备的输入输出服务、电源掉电、其他处理机的服务请求、机器重启动等。

  • 内部中断(CPU内部的中断,不能屏蔽)
     内中断是指由处理机内部的硬件或软件引起的中断,包括来自运算器、控制器、存储器、总线等部件的中断服务请求(比如除数为0),也包括程序断点及单步执行等软件引起的中断请求(比如int 80h)。

分类3
  • 软件中断(Software Interrupt)
    从软件中断指令而来。在32位x86中,为了实现linux用户态到内核态的切换,linux使用软中断指令“int 0x80”来触发异常,切换CPU特权级,实现系统调用。它们往往是同步
  • 硬(件)中断(Hardware Interrupt)
    由硬件设备产生的中断信号,用于告知处理器需要立即处理某个事件。这些事件通常是外部的,如键盘输入、网络数据包到达、硬盘I/O完成等。它们往往是异步

ps:
在Linux内核中还有一个软中断(softIRQ)的概念,这里简单提一下。

首先明确软中断≠软件中断,两者的区别很大,网上很多帖子都混为一谈。
软中断是内核在启动时为每一个内核创建了一个特殊的进程,这个进程会不停的poll检查是否有软中断需要执行,如果需要执行则调用注册的接口函数。所以软中断是运行在进程上下文的,而且可能并发执行在不同CPU上。所谓的软中断就是内核利用内核线程配合抽象的数据结构进行管理线程合适时间调用注册的接口的一套软件管理机制。

而中断的具体执行过程和多重中断的情况在组原的课程中有研究,这里就不在深入探讨。
实际上,中断还有很多相关概念像陷阱trap、异常exception、系统调用system call等都会在后续课程中涉及,但是由于目前有很多东西没有铺垫,就不再深入探讨了。

DMA

中断机制解决了 CPU 轮询、忙等待的问题,CPU 与外部硬件交互的利用率可能还是很低,这是为什么呢?


我们针对操作系统与打印机交互而言,操作系统每次执行OUT指令传递一个字符到打印机控制器中,此时如果打印机忙等,CPU 会去执行另一个用户程序。当CPU 响应打印机的中断信号,就会切换模式执行中断处理程序,然后再执行OUT指令传递一个字符到打印机控制器,如此反复。
由于每次打印一个字符都要响应一次中断并消耗 CPU 时间,导致了打印一个较长的字符串会特别耗时,主要的原因是CPU 参与了数据移动(将数据移动到打印控制器的数据寄存器)。

解决方法就是使用 DMA(Direct Memory Access) 机制
DMA 控制器存储了数据源地址、数据目的地址、数据长度,当应用程序需要打印字符串时,CPU 通过系统调用陷入内核,设置 DMA 控制器,其余的I/O工作就可以让 DMA 来完成,CPU 可以去执行其余的应用程序。
当一次打印完成后,DMA 控制器通过中断控制器发出中断信号给 CPU,CPU 查表执行中断处理程序,只需要简单的切换回原先执行打印的应用程序即可。一次任务只需要一次中断,提高了 CPU 的利用率。

以上,可以简单的理解为CPU每次中断都参与太累了,找了一个外包叫做DMA,专门用来处理批量的I/O操作,既提高了I/O效率,又提高了CPU的利用率。

这样也就说完了CPU与外设交互的三种方式。

后记

这一小节,回顾了CPU和外设交互的相关概念,详细解释了不同中断在OS中的体现。后续的课程中会多次涉及中断概念,所以该节可能会有些枯燥,希望小伙伴们能多看几遍加深一下影响。至于章节练习,由于笔者目前的时间有限,暂时不考虑更新章节练习,后续讲解的过程中会考虑多插入一些问题来代替。

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值