![您如何知道某项任务是由硬件还是操作系统来处理的?](https://linux22.com/image/1291940/%E6%82%A8%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E6%9F%90%E9%A1%B9%E4%BB%BB%E5%8A%A1%E6%98%AF%E7%94%B1%E7%A1%AC%E4%BB%B6%E8%BF%98%E6%98%AF%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%9D%A5%E5%A4%84%E7%90%86%E7%9A%84%EF%BC%9F.png)
在我的课堂上布置的很多阅读材料中,计算机系统被描述为使用底层硬件和操作系统的组合来处理某个请求或任务。
但是我的教科书从来没有真正解释过为什么有一条线(以及这条线画在哪里),硬件和操作系统各自说“好的,这部分任务是我的责任”,以及为什么操作系统不能自己完成所有任务,或者硬件不能自己完成所有任务?
我知道这个问题可以用更好的措辞来表达,但要表达我想要问的问题有点困难。这个问题应该很简单,我想你可以总结为“为什么某些事情通常由硬件来处理,而其他事情通常通过操作系统?
答案1
为什么某些事情通常由硬件来处理,而其他事情通常由操作系统来处理?
这不是非此即彼的情况,而是“软件(操作系统和用户程序)指示硬件应该如何做和做什么”。换句话说,软件总是在做一些事情,硬件也总是在做一些事情。
有时软件会等待硬件操作完成,因此发明了中断和多任务来提高计算机的整体效率。当确实无事可做时,操作系统会被迫进入闲置的循环/过程。对于每个指令周期,软件必须执行某项操作,否则将执行硬件 HALT(或 SLEEP)指令。
有时,硬件操作会等待另一个硬件操作完成,例如,当发生内存缓存未命中并且必须从主内存读取数据时(因此 CPU 必须执行等待周期)但是对于每个时钟周期,硬件都必须做一些事情。
您的问题可能暗指 CPU 密集型任务与 I/O 密集型任务。也就是说,某些作业(例如复制文件)需要大量数据传输,并且需要等待 I/O 完成,而不是使用 CPU 周期。其他作业(例如计算素数)需要大量 CPU 周期,并且几乎不需要等待任何 I/O 完成。
附录
也许您最初的问题是基于“X 如何工作?”这样的问题,并且有“操作系统这样做”或“硬件那样做”这样的回答。这种(简化)答案的问题可能会导致您最初的问题。这些答案基于响应者的观点或功能(本质上)实现或易于解释的位置。
像“操作系统确实……”这样的回答暗示该功能本质上是在软件中实现的。这意味着该软件是在相当标准的硬件平台上执行的。
像“硬件确实……”这样的回答意味着该功能本质上是在硬件中实现的。这意味着执行软件已激活或使用该硬件来执行该功能。
请注意,功能应该在哪里实现,这存在一条很微妙的(或者说模糊的)界限。大多数程序员认为高级语言必须编译(成机器语言),但有些计算机可以直接执行“高级语言”(又称“直接执行”)。随着硬件成本越来越低和/或对速度的需求越来越大,一些以前在软件中实现的功能被迁移到硅片中实现(例如音频和视频编码器和解码器)。RISC 处理器采取了相反的方法,使指令集变得相当简单,这给软件和操作系统带来了一些复杂性。有时“在硬件中完成”的是一个“黑匣子”或专用集成电路,如果深入研究,就会发现它由一个嵌入式处理器、RAM、ROM(用于固件)和外围设备组成,构成一个子系统。
例子
如果你问“虚拟内存是如何工作的?”,你可能会得到各种各样的答案,有些答案明显是软件或操作系统的观点(“操作系统做……”),有些答案则是硬件的观点(“硬件做……”)。理想情况下,答案应该显示软件如何和硬件必须相互影响(以及整个操作系统如何设计)来实现虚拟内存之类的功能。例如:
- 用户程序中的一条指令引用一个内存位置;
- 该位置导致页面错误:
- 用户程序暂停,并执行 PF 中断处理程序。
确定存在页面错误通常在硬件(内存管理单元)中完成,但操作系统必须提供中断服务程序来处理这种情况。软件和硬件包括一个系统。