标签:style 进程 结合 总结报告 lin 理论 控制 准备 优先级
一:进程管理
1:进程的定义:
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
2:进程的状态:
3:进程控制块
当一个进程被创建时,系统就为该进程建立一个task_struct任务结构体。
当进程运行结束时,系统撤消该进程的任务结构体。
进程的任务结构体是进程存在的唯一标志。
进程的任务结构体为内核管理进程,提供了内核所需
了解的进程信息。
进程控制块结构如下:
4:进程的调度策略
分为活动进程队列和过期进程队列,如果是普通进程,时间片用完了进入过期队列(但是如果这个普通进程是交互进程,并且要么过期队列里面的进程优先级都比这个进程低,要么过期队列里面的线程存在的时间不长,那么也会放入活动队列),实时则还是进入活动队列,为何引入活动和过期,就是为了让每个进程都能得到运行。因为调度永远是从活动队列里面选进程,随着时间推移,活动队列越来越小,直到为0,过期队列原来越大,此时过期队列的进程全部拷贝到活动队列,继续进行调度。
二:中断和异常
1:为什么要有中断?
因为I/O速度慢,如果在进行I/O的时候一直让cpu等是一件很低效的事情,所以I/O准备好再通知(中断)cpu是一个比较好的方法,在那之前cpu可以做自己的事情
2:中断(广义)会改变处理器执行指令的顺序,通常与CPU芯片内部或外部硬件电路产生的电信号相对应
中断——异步的(如敲键盘):
由硬件随机产生,在程序执行的任何时候可能出现
中断分为:
可屏蔽中断(Maskable interrupt)
I/O设备发出的所有中断请求(IRQ)都可以产生可屏
蔽中断。
可屏蔽中断可以处于两种状态:屏蔽的(masked)和
非屏蔽的(unmasked)
非屏蔽中断(Nonmaskable interrupt)
只有几个特定的危急事件才引起非屏蔽中断。如硬
件故障或是掉电
异常——同步的(如1/0,int指令,缺页,系统调用之类的):
在(特殊的或出错的)指令执行时由CPU控制单元产生
我们用“中断信号”来通称这两种类型的中断
3:中断信号的处理原则
第一是快!
当内核正在做一些别的事情的时候,中断会随时到来。无辜的正在运行的代码被打断,你当然需要尽快处理完中断使得无辜的程序恢复执行
中断处理程序在run的时候可能禁止了同级中断,同级中断也需要快速得到执行
中断处理程序对硬件操作,一般硬件对时间也是非常敏感的
内核的目标就是让中断尽可能快的处理完,尽其所能把更多的处理向后推迟
第二是:允许不同类型中断的嵌套发生,这样能使更多的I/O设备处于忙状态,多级中断中保存的eip和cs寄存器都是保存在同一个被中断进程的内核中
第三是尽管内核在处理一个中断时可以接受一个新的中断,但在内核代码中还在存在一些临界区,在临界区中,中断必须被禁止,因为临界区的代码必须被执行完,不允许打断,常见的临界区是保存现场和恢复现场
4:中断处理过程
第一阶段--获取中断号
每个CPU都有响应中断的能力, 每个CPU响应中断时都走相同的流程. 这个流程就是内核提供的中断服务程序.
在进入中断服务程序时, CPU已经自动禁止了本CPU上的中断响应, 因为CPU不能假定中断服务程序是可重入的.
中断处理程序的第一步要做两件事情:
1. 将中断号压入栈中; (不同中断号的中断对应不同的中断服务程序入口)
2. 将当前寄存器信息压入栈中; (以便中断退出时恢复)
第二阶段--中断串行化
进入do_IRQ函数, 第一步进行中断的串行化处理, 将多个CPU同时产生的某一中断进行串行化. 其方法是如果当前中断处于"执行"状态(表明另一个CPU正在处理相同的中断), 则重新设置它的"触发"标记, 然后立即返回. 正在处理同一中断的那个CPU完成一次处理后, 会再次检查"触发"标记, 如果设置, 则再次触发处理过程.
于是, 中断的处理是一个循环过程, 每次循环调用handle_IRQ_event来处理中断.
第三阶段--关中断条件下的中断处理
进入handle_IRQ_event函数, 调用对应的内核或内核模块通过request_irq函数注册的中断处理函数.
注册的中断处理函数有个中断开关属性, 一般情况下, 中断处理函数总是在关中断的情况下进行的. 而调用request_irq注册中断处理函数时也可以设置该中断处理函数在开中断的情况下进行, 这种情况比较少见, 因为这要求中断处理代码必须是可重入的. (另外, 这里如果开中断, 正在处理的这个中断一般也是会被阻塞的. 因为正在处理某个中断的时候, 硬件中断控制器上的这个中断并未被ack, 硬件不会发起下一次相同的中断.)
第四阶段--开中断条件下的软中断
上一阶段循环调用完当前所有被触发的中断处理函数后, do_softirq函数被调用, 开始处理软件中断.
在软中断机制中, 为每个CPU维护了一个若干位的掩码集, 每位掩码代表一个中断号. 在上一阶段的中断处理函数中, 调用raise_softirq设置了对应的软中断, 到了这里, 软中断对应的处理函数就会被调用(处理函数由open_softirq函数来注册).
可以看出, 软中断与中断的模型很类似, 每个CPU有一组中断号, 中断有其对应的优先级, 每个CPU处理属于自己的中断. 最大的不同是开中断与关中断.
于是, 一个中断处理过程被分成了两部分, 第一部分在中断处理函数里面关中断的进行, 第二部分在软中断处理函数里面开中断的进行.
由于这一步是在开中断条件下进行的,这里还可能发生新的中断(中断嵌套),然后新中断对应的中断处理又将开始一个新的第一阶段~第三阶段。在新的这个第三阶段中,可能又会触发新的软中断。但是这个新的中断处理过程并不会进入第四阶段,而是当它发现自己是嵌套的中断时,完成第三阶段之后就会退出了。也就是说,只有第一层中断处理过程会进入第四阶段,嵌套发生的中断处理过程只执行到第三阶段。
第五阶段--开中断条件下的tasklet
实际上, 软中断很少直接被使用. 而第二部分开中断情况下的进行的处理过程一般是由tasklet机制来完成的.
tasklet是由软中断引出的, 内核定义了两个软中断掩码HI_SOFTIRQ和TASKLET_SOFTIRQ(两者优先级不同), 这两个掩码对应的软中断处理函数作为入口, 进入tasklet处理过程.
于是, 在第三阶段的中断处理函数中, 完成关中断的部分后, 然后调用tasklet_schedule/tasklet_hi_schedule标记一个tasklet, 然后中断处理程序结束. 后面的工作由HI_SOFTIRQ/TASKLET_SOFTIRQ对应的软中断处理程序去处理被标记的tasklet(每个tasklet在其初始化时都设置了处理函数).
结尾阶段
CPU接收到中断以后, 以历以上五个阶段, 中断处理完成. 最后需要恢复第一阶段中被保存在栈上的寄存器信息. 中断处理结束.
三:总结
通过这门课我对Linux的原理有了更深入的了解,孟老师理论和实验结合,李老师着重源码分析,都给我带来了极大的启发,但是时间仓促,很多东西无法及时消化,这篇报告也还有很多地方需要改进,等考完试后我会重新修改一遍。
标签:style 进程 结合 总结报告 lin 理论 控制 准备 优先级
原文地址:https://www.cnblogs.com/lambdoor/p/13276330.html