
以下是根据一些资料和个人理解总结的,如有错误希望指出。
首先需要明确的是,这里的中断指的是硬件中断。
从事实上说明 有下面这些理由。
硬件中断本身就是用来作为处理紧急事件的一种方法,所以硬件中断服务程序应该尽量的快。不应该睡眠
硬件中断服务程序会打断某个无辜的进程(甚至是另一个中断服务程序)。所以它应该尽量快(突然被打断运行已经够无辜了,总不能还让一直等待吧)
硬件中断是无法预测的,如果在中断服务程序中睡眠就会导致睡眠过程中该中断请求的丢失。(linux中一个中断处理程序在运行时,相应中断线会被屏蔽掉)
要理解为什么硬件中断处理程序中不能睡眠的内在机制。需要理解下面这些概念。
1 linux内核的工作模式 linux内核有两种工作模式,进程上下文和中断上下文。
11 进程上下文指内核代表进程执行
比如进程执行系统调用产生异常陷入内核后,内核就代表该进程执行 *** 作。可以通过current宏关联到当前进程,
因为陷入内核时进程造成的或需求的,所以内核的执行与当前进程相关。所以说他代表该进程执行
12 执行一个硬件中断处理程序时就处于中断上下文
中断上下中和进程没什么关系(虽然此时current指向被中断的进程)。这也容易理解,因为硬件中断随时
都有可能发生。不像上面提到的像系统调用之类的异常是由于程序执行某些指令造成的,所以陷入
内核后,因为要坐的工作基本都是和当前这个进程相关的(因为是他执行一些指令导致产生的异常),
所以我们说内核代表进程执行。
但是硬件中断的产生完全无法预测,所以谁也不知道硬件中断将会打断哪个进程。所以硬件中断服务程序与进程无关
它处于中断上下文中
2 异常和硬件中断的区别
21 异常属于中断的一种,和硬件中断的区别在与它是"同步",是由于执行一些指令造成的。如除0
或者执行过程中产生缺页,以及软中断实现的系统调用。(这也是叫“同步中断”的原因,因为指令的执行是要时钟同步的)。
当执行的指令会陷入内核时,就会运行在进程上下文中。内核代表进程
22 硬件中断时一种 异步中断,他随时都可能发生,无法预测。中断执行时处于中断上下文中。
综上,linux中硬件中断服务程序不能睡眠的原因在与。执行硬件中断服务程序时,内核处于中断上下文
中,此时内核与进程无关。如果睡眠后就不能调度回来了。因为调度程序调度的是进程,而之前的硬件中断服务程序却是和进程无关的
Linux下强制中断一个程序的执行使用键盘按键可以有多种方法。
1、CTRL+C键,这相当于发送Terminal信息到当前的程序。比如下图,在通过find命令查找名称带3b76的文件,可以直接按ctrl+c键结束掉循环。
2、CTRL+Z键,这是暂停键,暂停程序执行。可以再通过fg命令返回重新运行被暂停的程序。比如下图,在mysql中执行命令,这时候希望查询一下当前目录下的文件,就可以按CTRL+Z,然后执行完ls命令后,再执行fg命令即可回到mysql中。
3、CTRL+D键,发送exit信号,退出程序,比CTRL+C要温柔一些,比如下图,退出phython35就可以按CTRL+D键。
Linux的HUP,INT,KILL,TERM,TSTP中断信号区别为:键入不同、对应 *** 作不同、启用不同。
一、键入不同
1、HUP中断信号:HUP中断信号是当用户键入<Ctrl+X>时由终端驱动程序发送的信号。
2、INT中断信号:INT中断信号是当用户键入<Ctrl+I>时由终端驱动程序发送的信号。
3、KILL中断信号:KILL中断信号是当用户键入<Ctrl+Z>时由终端驱动程序发送的信号。
4、TERM中断信号:TERM中断信号是当用户键入<Ctrl+ \>时由终端驱动程序发送的信号。
5、TSTP中断信号:TSTP中断信号是当用户键入<Ctrl+T>时由终端驱动程序发送的信号。二、对应 *** 作不同
1、HUP中断信号:HUP中断信号的对应 *** 作为让进程挂起,睡眠。
2、INT中断信号:INT中断信号的对应 *** 作为正常关闭所有进程。
3、KILL中断信号:KILL中断信号的对应 *** 作为强制关闭所有进程。
4、TERM中断信号:TERM中断信号的对应 *** 作为正常的退出进程。
5、TSTP中断信号:TSTP中断信号的对应 *** 作为暂时停用进程。
三、启用不同
1、HUP中断信号:HUP中断信号发送后,可以重新被用户再次输入恢复启用进程。
2、INT中断信号:INT中断信号发送后,不可以重新被用户再次输入恢复启用进程。
3、KILL中断信号:KILL中断信号发送后,不可以重新被用户再次输入恢复启用进程。
4、TERM中断信号:TERM中断信号发送后,可以重新被用户再次输入启用进程。
5、TSTP中断信号:TSTP中断信号发送后,可以重新被用户再次输入继续使用进程。
一个Linux包含进程管理、内存管理、文件管理、输入输出管理四大基本功能。
1进程管理
提到进程,首先要介绍进程映像的概念。进程映像由程序段、相关数据段和进程控制块(PCB)组成。所谓创建进程,本质上是创建进程映像中的PCB;而撤销进程,本质上是撤销进程的PCB。因此,PCB是进程存在的唯一标志。
在Linux *** 作系统中,当一个进程被创建时,系统就为该进程建立一个task_struct任务结构体。当进程运行结束时,系统撤消该进程的任务结构体。进程的任务结构体是进程存在的唯一标志。进程的任务结构体为内核管理进程,提供了内核所需了解的进程信息。
2内存管理
内存管理是 *** 作系统设计中最重要和最复杂的任务之一。有效的内存管理不仅方便用户使用存储器,提高内存效率,还可以通过虚拟内存技术从逻辑上扩充存储器。
在Linux *** 作系统中,每个进程都有独自的内存空间,使用虚拟内存技术。该 *** 作系统为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。根据”最近最经常使用“算法,将一些不经常使用的页面交换到虚拟内存。
3文件管理
文件是 *** 作系统中的一个重要概念,是以计算机硬盘为载体存储在计算机上的信息集合。
Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统(VFS),为各类文件系统提供一个统一的 *** 作界面和应用编程接口。
4输入输出管理
IO设备管理是 *** 作系统中最凌乱也最具挑战性的部分。由于它包含了很多领域的不同设备及与设备相关的应用程序,很难有一个通用且一致的设计方案。输入输出设备的管理离不开中断这一 *** 作系统最重要的机制。
中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。Linux中通常分为外部中断和内部中断。
中断分软中断跟硬中断,硬中断是由硬件从外部触发,软中断由软件触发,就像linux系统调用int 80一样。至于中断的上下部其实就是因为中断的处理时间跟它的优先级不一定成正比,所以一般先处理中断最重要的部分(上半部),待到不怎么忙的时候,再来处理比较悠闲的部分(下半部)。就像输入的时候,拿到键盘输入的是什么才是最重要的(上半部),显示字符才是次要的(下半部)。
*** 作系统工作的基础:
1、存储程序计算机
冯诺伊曼首先提出了“存储程序”的概念,按照存储程序的原理,计算机在执行程序时须先将要执行的相关程序和数据放入内存储器中,在执行程序时CPU根据当前程序指针寄存器的内容,按地址顺序取出存放在内存储器中的指令(按地址顺序访问指令),然后分析指令,执行指令的功能,遇到转移指令时,则转移到转移地址,再按地址顺序访问指令(程序控制)。linux *** 作系统就是以存储程序计算机的工作原理为基础去管理整个计算机以及整个计算机的执行工作流程。
存储程序计算机以运算单元为中心, 采用存储程序原理,存储器是按地址访问、线性编址的空间,控制流由指令流产生, 指令由 *** 作码和地址码组成,数据以二进制编码。(维基百科)
2、堆栈
堆栈(此处不同于数据结构的中堆栈)是内存中的一段存储区域。堆栈用到的寄存器主要有%esp和%ebp,c语言中堆栈机制主要用于函数调用中上一层函数相关寄存器(包括堆栈相关寄存器,eip寄存器等)的保存,以便从调用函数返回至上一层函数,堆栈还会保存调用函数的参数以及函数中创建的局部变量。
*** 作系统中的堆栈分为用户态堆栈和内核态堆栈,而程序的执行又是以进程为单位来执行的, *** 作系统使每个进程有各自独立的4G地址空间,0~3G为用户态,3G~4G为内核态,Linux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数据结构:Thread_info和进程内核堆栈。当我们进行系统调用或其他中断时内核栈会保存用户栈的寄存器信息以及返回地址等信息,当内核进行进程调度切换上下文时堆栈会保存前一个进程的上下文,再载入下一进程的上下文。
3、中断
中断机制最初是未解决计算机和外设的处理速度不匹配问题,为了提高cpu的工作效率, *** 作系统引入中断机制。
处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器向硬件发出一个请求,然后专门等待回应的办法,显然降低内核效率。中断可以让内核不用等待硬件响应,而是去执行其他事务进程,当硬件处理完毕,通过中断告知CPU硬件数据准备好,CPU再切换来处理此硬件事务。
不同的设备对应的中断不同,而每个中断都通过一个惟一的数字标识,即中断号。从而使得 *** 作系统能够对中断进行区分,并知道哪个硬件设备产生了哪个中断。这样, *** 作系统才能给不同的中断提供不同的中断处理程序。
中断使得进程能够并发的去执行,当然,并发并不是并行,而是中断允许CPU在多个进程之间切换,大大提高了CPU的利用率。中断是多进程能够正常执行以及进程间的切换的必不可少的要素。
以上就是关于Linux硬件中断服务程序中为什么不能睡眠全部的内容,包括:Linux硬件中断服务程序中为什么不能睡眠、Linux下如何强制中断一个程序的执行(利用按键,而不是kill命令)、Linux几种中断信号的区别:HUP,INT,KILL,TERM,TSTP等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)