中断

中断使得硬件可以发出通知给处理器,本质上是一种特殊的电信号,由硬件设备发向处理器,处理器接收到中断后,会马上向操作系统反应此信号的到来,然后就由操作系统负责处理这些新来的数据;硬件设备生成中断并不考虑与处理器的始终同步,中断可能随时产生,内核随时都有可能被中断打断;

不同设备的中断不同,而每个中断都对应一个唯一的中断值,这些中断值通常称为中断请求IRQ线;中断号并不一定是严格定义的,也可能是动态分配的,如PCI设备;

异常

异常与中断不同,它的产生必须考虑与处理器时钟同步;实际上,异常也常常被称为同步中断;在处理器执行到又编程失误而导致的错误指令的时候,就会产生一个异常;许多处理器体系结构处理异常与中断的方式类型;因此,内核对它们的处理也很类似;

中断处理程序

在响应一个特定中断的时候,内核会执行一个函数,这个函数叫中断处理程序或者中断服务例程;产生中断的每个设备都有一个相应的中断处理程序;中断处理器程序与其他内核函数的区别在于,中断处理程序是被内核调用来响应中断的,它们要运行于中断上下文中,通常,中断上下文也成为原子上下文,该上下文执行的代码不可阻塞;

中断可能随时发生,因此中断处理程序也就随时可能执行;所以必须保证中断处理程序能够快速执行,这样才能保证尽可能快的恢复中断代码执行,对于硬件和操作系统来讲,缩短响应和处理时间都极为重要;

上半部和下半部

中断处理被分为两个部分,中断处理程序是上半部–接收到一个中断,就立即开始执行,但只做严格时限的工作,例如对接收的中断进行应答或者复位硬件,这些工作都是所有中断被禁止的情况下完成的;能够允许被稍后完成的工作会退出到下半部;此后合适的时机,下半部会被开中断执行;

以网卡为例,当网卡接收来自网络的数据包时,需要通知内核数据包到了;因此,网卡立即发出中断,内核通过执行我那个口已注册的中断处理程序来做出应答;中断开始执行,通知硬件,拷贝最新的网络数据包到内存,然后读取网卡更多的数据包,这些都是重要,紧迫而又与硬件相关的工作,如果这些工作执行时间过长,就会导致网卡缓存溢出,从而产生丢包;当网络数据包被拷贝到系统内存后,中断任务执行完成,这时将控制权交给原本运行的程序;处理数据包的其他工作在随后的下半部中进行;

中断上下文

当执行一个中断处理程序时,内核处于中断上下文;

在进程上下文中,可以通过current宏关联当前进程;此外,因为进程是以进程上下文的形式连接到内核的,因此,进程上下文中可以睡眠,也可以调度程序;

中断上下文与进程并没有什么关系,与current宏也是不相干的;因为没有后备进程,所以中断上下文不可以睡眠,一些睡眠函数都不能在中断上下文中使用;

中断上下文具有严格的时间显示,因为它打断了代码;正因为这种异步的恩正,所以所有的中断处理程序必须尽可能快速、简洁;尽量把工作从中断处理程序中分离出来,放在下半部执行,因为下半部可以再更合适的时间运行;

最新文章

  1. 使用base.调用父类里面的属性
  2. 背水一战 Windows 10 (31) - 控件(按钮类): ButtonBase, Button, HyperlinkButton, RepeatButton, ToggleButton, AppBarButton, AppBarToggleButton
  3. HBase设计与开发性能优化(转)
  4. Linux4:useradd、userdel、passwd、groupadd、chgrp、chown、df、du、sort、wget
  5. vim中大小写转换
  6. angularjs获取参数方法
  7. [Android] adb 命令 dumpsys activity , 用来看 task 中的activity。 (uninstall virus)
  8. Android的Handler与Activity线程同步
  9. MVC 5 第二章 项目结构
  10. [转] 浅谈 C++ 中的 new/delete 和 new[]/delete[]
  11. 转:JMeter基础--逻辑控制器Logic Controller
  12. JavaScript设计模式之构造器、模块和原型
  13. C#基础课堂笔记
  14. gflags_static.lib 无法解析的外部符号 __imp__PathMatchSpec
  15. Oracle插入语句日期格式设置
  16. 通俗理解webService及.net中的使用方法
  17. CentOS中service命令与/etc/init.d的关系以及centos7的变化
  18. CodeForces - 516B Drazil and Tiles(bfs)
  19. QSocket类
  20. 实验二Java面向对象程序设计

热门文章

  1. ConfigParser读取配置文件时报错:ConfigParser.MissingSectionHeaderError
  2. Java后端HttpClient Post提交文件流 及服务端接收文件流
  3. nginx环境依赖
  4. 《浏览器工作原理与实践》<10>作用域链和闭包 :代码中出现相同的变量,JavaScript引擎是如何选择的?
  5. [Selenium3+python3.6]自动化测试2-入门
  6. MySQL5.7安装详解及常见安装问题解决
  7. Windows安全应急响应(一)
  8. redis运维相关
  9. [唐胡璐]Selenium技巧 - 定制元素属性检查,并写到ReportNG中
  10. js实现填写身份证号、手机号、准考证号等信息自动空格的效果