当前位置: 首页 > 科技观察

您知道操作系统何时运行吗?

时间:2023-03-16 00:07:04 科技观察

请思考以下问题:在您阅读本文期间,计算机上的操作系统是否正在运行?或者它只是正在运行的网络浏览器?或者他们都闲着,等待你的指示?这些问题并不复杂,但它们深入到系统软件如何工作的本质。要准确回答这些问题,我们需要透彻了解操作系统的行为模型,包括性能、安全和调试等方面。在本系列文章中,我们将以Linux作为主要示例来帮助您对操作系统的行为进行建模,必要时也会涵盖OSX和Windows。对于那些深入探索的人,我会在适当的时候给出Linux内核源代码的链接。这里的基本见解是,在任何给定时刻,CPU上只有一个任务处于活动状态。在大多数情况下,此任务是一个用户程序,例如您的网络浏览器或音乐播放器,但它也可能是一个操作系统线程。可以肯定的是,它是一个任务,而不是两个或更多,不是零个,是的,永远是一个。这听起来像是个问题。例如,您的音乐播放器是否独占CPU并阻止其他任务运行?所以你不能打开任务管理工具来杀掉音乐播放器,甚至禁用鼠标点击,因为操作系统没有机会处理这些事件。你可能会大喊:“它到底在做什么?”并开始骚乱。这个时候,就轮到中断大显身手了。中断就像,在一声巨响或拍打肩膀后,神经系统告诉大脑去感知外部刺激。计算机主板上的芯片组还会中断CPU以传递新的外部事件,例如键盘上的某个键被按下、网络数据包到达、硬盘读取完成等。硬件外设、主板上的中断控制器和CPU本身共同作用来实现中断机制。打扰对于跟踪我们最宝贵的资源——时间也很重要。在计算机启动过程中,操作系统内核会设置一个硬件定时器来产生周期性的定时器中断,例如每10毫秒一次。每当定时器中断到达时,内核都会收到通知以更新系统统计信息并评估以下内容:当前用户程序是否运行了足够长的时间?TCP定时器之一是否已过期?中断使内核有机会处理这些问题并采取适当的行动。就好像你在一天中给自己设置了反复出现的警报,并将它们用作检查点:我应该做我正在做的工作吗?有没有更紧急的事情?直到你发现10年过去了……内核对CPU的这些周期性劫持被称为滴答声,也就是让你的操作系统滴答作响的中断。不仅如此,中断还用于处理一些不涉及外部硬件的软件事件,例如整数溢出和页面错误。中断是进入操作系统内核最频繁和最重要的入口。对于学习电气工程的人来说,这些并不奇怪,它们是操作系统运行的机制。话虽如此,让我们来看一些实际情况。下图说明了IntelCorei5系统中的网卡中断。图片中的一些元素带有超链接,您可以点击它们获得更详细的信息,例如,每个设备都链接到相应的Linux驱动程序源代码。链接如下:网卡USB键盘I/OAPICHPET让我们仔细看看。首先,由于系统中存在如此多的中断源,硬件只是告诉CPU“嘿,这里发生了一些事情”然后什么都不做是没有多大意义的。这造成了难以忍受的漫长等待。因此,当计算机开机时,每个设备都会获得一个中断线或IRQ。然后这些IRQ被系统中的中断控制器映射成取值在0到255之间的中断向量。当中断到达CPU时,它有一个明确定义的值,这与硬件的其他一些奇怪行为不同。相应的,在CPU中也有一个由内核维护的指针,指向一个由255个函数指针组成的数组,每个函数指针用来处理特定的中断向量。下面,我们将继续深入探索这个数组,也称为中断描述符表(IDT)。每当有中断到来时,CPU就会使用中断向量的值来索引中断描述符表,并执行相应的处理函数。这相当于在当前执行任务的上下文中发生了一个特殊的函数调用,允许操作系统以很少的开销快速响应外部事件。考虑以下场景,当Web服务器正在发送数据时,CPU间接调用操作系统函数,这听起来很酷也很可怕。下图显示了Vim编辑器运行过程中出现中断时的情况。注意这里中断的到来是如何触发CPU切换到Ring0内核模式而不改变当前活动任务的。看起来Vim编辑器直接向操作系统内核调用了一个神奇的函数,但Vim仍然在那里,它的地址空间完好无损,等待执行流返回。这很令人兴奋,不是吗?但是让我们停一下,我需要讲道理。我知道我还没有回答完这个开放式问题,甚至还没有打开一个新问题,但你至少知道在你阅读这句话时滴答声正在发生。在我们充实了对操作系统动态行为模型的理解之后,我们将回来寻找问题的答案,并且我们对Web浏览器情况的理解将变得清晰。如果您还有疑问,尤其是在这篇文章已经公开之后,请随时提问。我会在文章或后续评论中进行解答。下一篇文章将于明天发布在RSS和Twitter上。