百科问答小站 logo
百科问答小站 font logo



CPU检测到中断信号时,怎么知道是发给哪个进程的? 第1页

  

user avatar   ling-jian-94 网友的相关建议: 
      

题主应该先系统学一下微机原理相关的教材的,我说的简单一点

硬件中断从来不是发送给进程的,而是发送给操作系统内核,由内核统一处理,而不关心当前正在执行的是哪个进程,不管哪个进程操作都是一样的:保存现场,进入内核,执行需要的操作,返回中断前的现场,继续进程执行。

CPU写入外部设备有两种不同的方式,一种是直接操作硬件设备寄存器,这一般是不需要中断的,CPU在写入一个寄存器的时候会处于阻塞状态,直到写入完成之前不能继续,因此通常只有处理非常少的数据的时候才会这样做。另一种方式是使用DMA,DMA是一个专用的外部设备,CPU将需要发送的数据提前在内存中准备好,然后设置DMA设备的寄存器,让DMA设备从内存的指定位置开始,将内存中数据依次写到对应地址的外部硬件寄存器里,这样在DMA写入的同时CPU就可以做其他工作。DMA写入完成后会产生一个中断通知CPU。这些都和当前执行的进程无关。进程只是直接跟操作系统内核通信,内核负责通过调度来通知进程操作是否完成之类的信息。

再举个详细点的例子,比如某个进程要读取一个文件,向内核发送了一个read的syscall调用,陷入内核,内核会设置DMA,然后把进程挂起。因为进程挂起了,内核另找了一个进程切换进来执行。当DMA完成发生中断的时候,不管当前执行的是哪个进程,都会直接通过中断进入内核,这个过程外部执行的进程是察觉不到的,它在执行的途中被打断然后冻结在了执行现场,就像时间停止了一样(这就是“中断”的含义),CPU开始执行内核中的中断处理程序,内核通知之前挂起的进程操作已经完成,并且取消挂起,这时候这个进程是否会立即抢占进来,取决于优先级,在Linux当中一般会把因为IO挂起的进程优先级稍微调高一点让它们立即抢占进来,提高IO效率;但如果不能抢占进来,就会恢复当前的进程的执行,等到高优先级执行结束后,再让之前挂起的进程切换进来继续执行,这对于执行IO的进程来说是不可见的。




  

相关话题

  为什么Interrupt需要存储PSW(程序状态字)但子程序调用不需要? 
  页表放在主存中,那么页表基址寄存器中存放的页表基址是虚拟基址还是主存中页表实际基址? 
  32位保护模式下,段基地址应尽量选取16字节对齐的那些地址,可使访问的性能最大化? 
  芯片里面有几千万的晶体管是怎么实现的? 
  cpu超频真的有必要吗?是降低使用寿命,还是带来更大的性能提升? 
  内存(DRAM)的连续读写速度和随机读写速度是一样的吗? 
  现在这个时间段CPU该如何去做选择? 
  为什么会有许多人认为C盘太满会影响电脑运行速度? 
  呜呜呜呜呜呜呜呜呜X﹏X? 
  为什么 Windows 操作系统开很多应用和游戏都不会杀后台? 

前一个讨论
为何中国人迷恋吴恩达的机器学习课?
下一个讨论
2021 年音视频领域有哪些突破性技术与发展?明年甚至更远的未来是否会迎来技术性拐点?





© 2024-12-22 - tinynew.org. All Rights Reserved.
© 2024-12-22 - tinynew.org. 保留所有权利