在实际开发过程中,我们经常会听到中断这个名词,而在操作系统底层,中断则发挥了至关重要的作用,本文旨在详解中断在操作系统中的产生原因、具体功能以及问题解决
为什么我会将中断成为程序之间互相通信的响应行为呢?原因很简单,距离来讲,好比你是一个外卖员去送快递,到了指定地点没有人接受,你这时需要等待,这就是中断,也就是说,中断其实就是操作系统中程序之间通信的一种等待状态,因为程序A需要接受程序B信息,但是程序B还在运行,因此程序A要中断运行直至程序B将数据返回给程序A,所以需要中断
但是在操作系中,中断并不简单地用于程序之间的通信,它对于CPU对于资源的分配调度也有很大作用,如果一个程序不允许中断,那么它会一直独占CPU,导致其他程序不能运行,这肯定不是我们希望看到的,因此CPU在执行程序之前会开启中断保证CPU能够定时调度,让每个程序都可以有运行的时间空间,比较典型的例子就是在内核态到程序态的转变,如果对这个不了解的可以看我这篇文章:https://cloud.tencent.com/developer/article/2457403,在内核态调用syacall执行对应程序之前,会开启中断(intr_on函数),使得CPU能够抢占资源进行任务调度:
因此,在操作系统中,中断主要有这几点好处:
1)异步处理:中断使得程序之间的运行无需一直等待,而是先临时中断直至有数据到达,有助于提高程序运行的效率,提高了处理程序运行的能力
2)资源调度:中断机制的存在使得CPU能够抢占任务资源进行程序调度,使得CPU有运行多程序多进程的能力
我们知道,中断能够使得程序之间异步处理,提高运行效率,但是这里出现了一个问题,好比我们使用控制台输入命令,此时硬件设备正在等待我们输入指令,如果我们没有输入指令,那么控制台会一直处于等待状态,那么控制台从哪里获取数据,又如何知道用户是否输入指令的呢?
关于这一点,我将会从xv6操作系统的解决方案介绍:
在xv6中,实现用户控制台与终端的通信连接主要靠的是uart芯片,我们对uart芯片进行编程,从而完成对控制台的读写操作,而uart通过构建一个队列完成控制台与终端的异步处理:
在这个队列中,每一块存储通信数据,同时有两个指针,一个是read ptr读指针,另一个是write ptr写指针,在uart.c中定义如下:
在这里,uart_tx_buf就是uart存放控制台输入字符的队列,同时还有uart_tx_w写指针uart_tx_r读指针,这里还定义了缓冲区的大小UART_TX_BUF_SIZE为32,因此可以简单理解,其实现在的消息队列就是应用了这种数据结构的思想,只不过将功能丰富拓展了一下
那么uart芯片又是如何对控制台字符进行读写的呢,让我们关注uartputc函数:
在写入字符前,会先获取uart中的锁,避免造成缓冲区数据不一致的问题,之后进行判断,如果此时缓冲区已满,那么uart芯片会锁住读锁睡眠等待,直至读取数据后将它唤醒,如果缓冲区未满,那么会更新缓冲区数据与大小,调用uartstart函数,最后释放锁,而在uartstart函数中,uart芯片又会将新写入的字符写到寄存器中用于指令执行,同时会更新读指针并唤醒读锁,使得缓冲区能够继续写入:
由此可见,操作系统在底层处理不同程序因为中断导致的异步调用是通过通信队列这种形式解决的,而这种方式也使得程序之间无需有严格顺序上的等待,让CPU能够在程序中断产生时充分调度CPU资源,使得资源利用最大化
好了,这就是有关于操作系统里中断的全部讲解了,虽然中断并不会引起人们注意,可是它对CPU整个资源的调度还是起关键作用的,希望对你有所帮助,祝好!!!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。