内核活动:
- 系统调用或者异常(处在进程上下文,可以睡眠)
- 中断
- 软中断(可延迟函数)
注意:这是单核可抢占,所以处在进程上下文当中的系统调用或者异常是会交织执行的,但在单核不可抢占的内核中系统调用和异常之间只能串行执行。
分析要点:
- 判断谁与谁会交织执行
- 判断它们之间谁会抢占谁(有助于理解谁需要使用保护措施)
- 判断是否可以睡眠(是否处于进程上下文)
例子如下:
(1):系统调用和系统调用之间:首先在单核可抢占的情况下会交织执行;其次它们都有可能抢占对方;最后,它们处在进程上下文,所以可以使用睡眠锁。一般用信号量解决。
(2):系统调用和中断:首先中断和系统调用会交织执行;其次中断能够抢占系统调用,而系统调用不能够抢占中断(系统调用中需要保护措施,中断代码中不需要保护措施);最后中断处在中断上下文,它不能睡眠,所以采用系统调用过程中关闭中断的方式。
(3)中断与软中断:(分析方法相似)。
内核同步知识在学习软中断、tasklet机制过程中的应用:
在编写驱动模块时,选用下半部分机制可有如下考虑:
1、如果效率更重要,可以选用软中断,但是因为相同的软中断可以在多个cpu上同时执行,所以需要考虑可重入问题以及加上自旋锁加以保护(不能使用睡眠锁,因为软中断处在中断上下文)
2、如果为了方便编程,可以考虑选用tasklet机制,因为相同的tasklet不会同时执行,所以不会出现可重入问题以及同步问题。程序易于编写
几个重要的内容点:
软中断只有在所有硬件中断执行完之后才会执行(贴上一副图加以理解),而且在执行软中断的手会禁止本cpu上的软中断:
随笔记录一些理解:可以直接回收的页帧应该具备这样的条件:一般不与文件产生关系,一般不与进程产生关系。因为回收以上页帧的话需要进行回写或者交换等工作以后才能够进行回收,并不是直接回收。这样想下来,可以直接回收的那不就是有内核直接跟slab分配的小内存空间,或者直接跟buddy系统要的页面是可以直接回收的。
同步/回写、交换、回收(区别):
同步/回写的对象:与文件相映射的,这里的文件在磁盘上有固定位置,而不像交换中对应到的文件在交换分区是没有固定位置的。交换后的位置需要记录在页表当中,以便缺页中断能够找到具体的位置。
交换的对象:堆栈,无文件映射的空间。
文章将继续丰富: