1、内核如何为不同的请求提供服务
(1)内核抢占:如果一个进程还在处理一个异常的时候,分配给它的时间片到期了,会发生什么事情呢?这取决于有没有启用内核抢占(Kernel Preemption),如果没有启用,进程就继续处理异常,如果启用了,进程可能会立即被抢占,异常的处理也就暂停了,直到schedule()再度选择原先那个进程(注意:内核处理中断的时候,必然会禁用内核抢占,所以这里才说是异常)。
内核抢占的目的是减少用户态进程的分派延迟。
2、同步原语
3、每CPU变量:
4、原子操作
5、优化和内存屏障
6、自旋锁
7、顺序锁
8、读-拷贝-更新(RCU)
RCU只保护被动态分配并通过指针引用的数据结构
在被RCU保护的临界区中,任何内核控制路径都不能睡眠。
9、信号量
Linux提供两种信号量:
内核信号量,由内核控制路径使用
System V IPC信号量,由用户态进程使用
(1)读/写信号量
(2)补充原语
(3)禁止本地中断
(4)禁止和激活可延迟函数
10、对内核数据结构的同步访问
(1)内核开发者才去下述由经验得到的法则:把系统中的并发度保持在尽可能高的程度。
系统中的并发度主要取决于两个因素:同时运转的I/O设备数和进行有效工作的CPU数。
(2)为了有效地利用CPU,应该尽可能避免使用基于自旋锁的同步原语
11、在自旋锁、信号量及中断禁止之间选择
(1)保护异常所访问的数据结构
(2)保护中断访问的数据结构
(3)保护可被延迟函数所访问的数据结构
(4)保护由异常和中断访问的数据结构
(5)保护由异常和可延迟函数访问的数据结构
(6)保护由中断和可延迟函数访问的数据结构
(7)保护由异常、中断和可延迟函数访问的数据结构
12、避免竞争条件的实例
(1)引用计数器
(2)大内核锁
(3)内存描述符读/写信号量
(4)slab高速缓存链表的信号量
(5)索引节点的信号量