我不确定我是否理解硬件和软件中断的概念。
如果我理解正确的话,硬件中断的目的是引起CPU的一些注意,这是实现CPU多任务处理的一部分。
- 那么什么情况下会产生硬件中断呢?是硬件驱动进程吗?
- 如果是,硬件驱动进程在哪里运行?如果它运行在CPU上,那么它就不必通过硬件中断来引起CPU的注意,对吧?那么它是否在其他地方运行?
- 硬件中断是直接中断CPU,还是先联系内核进程,然后内核进程联系/中断CPU?
另一方面,我认为软件中断的目的是让当前在CPU上运行的进程请求一些资源。
- 有什么资源?它们都是运行进程的形式吗?比如CPU驱动进程和内存驱动进程代表CPU和内存资源吗? I/O设备的驱动进程是否代表I/O资源?该进程想要与之通信的其他正在运行的进程是否也是资源?
- 如果是,软件中断是否通过内核进程间接联系进程(代表资源)?与硬件中断不同,软件中断从不直接中断CPU,而是中断/联系内核进程,对吗?
答案1
硬件中断实际上并不是 CPU 多任务处理的一部分,但可能会驱动它。
硬件中断由磁盘、网卡、键盘、时钟等硬件设备发出。每个设备或一组设备都有自己的 IRQ(中断请求)线。 CPU 将根据 IRQ 将请求分派给适当的硬件驱动程序。 (硬件驱动程序通常是内核中的子例程,而不是单独的进程。)
处理中断的驱动程序在CPU上运行。 CPU 正在处理中断,因此不需要任何额外的操作来引起 CPU 的注意。在多处理器系统中,中断通常只会中断其中一个 CPU。 (作为一种特殊情况,大型机具有硬件通道,可以在没有主 CPU 支持的情况下处理多个中断。)
硬件中断直接中断CPU。这会导致内核进程中的相关代码被触发。对于需要一些时间来处理的进程,中断代码可能允许其自身被其他硬件中断中断。
在计时器中断的情况下,内核调度程序代码可能会挂起正在运行的进程并允许另一个进程运行。正是调度程序代码的存在才支持多任务处理。
软件中断的处理方式与硬件中断非常相似。但是,它们只能由当前正在运行的进程生成。
通常软件中断是 I/O(输入或输出)请求。这些将调用内核例程来安排 I/O 的发生。对于某些设备,I/O 将立即完成,但磁盘 I/O 通常会排队并稍后完成。根据正在完成的 I/O,进程可能会挂起,直到 I/O 完成,从而导致内核调度程序选择另一个进程来运行。 I/O 可能发生在进程之间,并且处理通常以与磁盘 I/O 相同的方式进行调度。
软件中断仅与内核对话。内核负责调度任何其他需要运行的进程。这可能是管道末端的另一个进程。某些内核允许设备驱动程序的某些部分存在于用户空间中,并且内核将调度该进程在需要时运行。
软件中断不会直接中断CPU,这是正确的。只有当前正在运行的代码才能生成软件中断。中断是请求内核为正在运行的进程执行某些操作(通常是 I/O)。一种特殊的软件中断是 Yield 调用,它请求内核调度程序检查其他进程是否可以运行。
回复评论:
对于 I/O 请求,内核将工作委托给适当的内核驱动程序。该例程可以将 I/O 排队以供稍后处理(对于磁盘 I/O 很常见),或者如果可能的话立即执行。队列由驱动程序处理,通常是在响应硬件中断时处理。当一个 I/O 完成时,队列中的下一项将发送到设备。
是的,软件中断避免了硬件信号发送步骤。生成软件请求的进程必须是当前正在运行的进程,因此它们不会中断 CPU。但是,它们确实会中断调用代码的流程。
如果硬件需要让 CPU 做某事,就会导致 CPU 中断对其正在运行的代码的关注。 CPU 会将其当前状态压入堆栈,以便稍后可以返回到正在执行的操作。中断可以停止:正在运行的程序;处理另一个中断的内核代码;或空闲进程。