linux内核一些面试题总结
1中断机制1 reuqest_irq是有可能睡眠的2 linux的中断不能重入。3共享中断。当发生中断的时候,会依次调用每一个共享中断的处理函数。4.软中断 中断上下文 用在网络和SCSI。5.tasklet 中断上下文5工作队列 进程上下文 可以睡眠2内核同步(锁的应用,内在逻辑应用场景)1.原子操作
1中断机制
1 reuqest_irq是有可能睡眠的
2 linux的中断不能重入。
3共享中断。当发生中断的时候,会依次调用每一个共享中断的处理函数。
4.软中断 中断上下文
用在网络和SCSI。
5.tasklet 中断上下文
5工作队列 进程上下文 可以睡眠
2内核同步(锁的应用,内在逻辑应用场景)
1.原子操作 atomic
当前变量i(在内存中)--->一个寄存器
寄存器++
寄存器---->变量i(内存)
如果是多线程,就有可能有打断阿。原子操作就是把这个三个操作变成一个操作。atomic_t 类型。
用途:计数器。
实现:内联函数
优点:开销小,对高速缓存影响小。
2.自旋锁 spin_lock
用途:临近区跨越几个函数。为了节省上下文切换时间,所以持有锁的时间不要太长。
特点:spin_lock最多被一个可执行线程持有。
优点:轻量级加锁。不用切换上下文。
缺点:别的线程在征用被使用的spin_lock,将自旋。特别浪费处理器时间。
难点:如果中断程序中,用到全局变量。怎么保护。解决方法:中断程序用spin_lock。 主程序:用spin_lock_irqsave, (保护的区域中间为禁止中断) spin_unlock_irqrestore
注意关闭的是当前处理器的中断。
自旋锁和下半部,分情况讨论
1:下半部和进程上下文共享数据。都要进行数据保护
2.中断处理程序和下半部共享数据。下半部要禁止中断。
总结:自旋锁的死锁比较可怕,如果死锁,死锁所在的cpu讲不能运行别的程序,即不能调度到别的程序。
3.读写自旋锁。
优点:有利于读操作。
缺点:写饥饿。持有锁是不能睡眠。
4.信号量
优点:睡眠锁。可以在持有信号量的时候睡去。
缺点:开销大。
使用范围:在进程上下文。锁被持有的时间较长。比较长用在,内核和用户空间同步上。比较复杂,尽量使用互斥体,和完成量。
5.互斥体:
信号量的一种。
优点:简单,有调试功能。
使用规范:谁加锁,谁解锁。同一个上下文加锁解锁。不能在中断和下半部中使用。
6完成量
信号量的一种。
7BLK
8顺序锁
用途:读jiffies。读多,写小,不能使写者饥饿。读的内容很少。
10禁止抢占:也就是停止调度。
用途:变量foo,foo在每个cpu上都有,cpu只会操作自己的foo
11rcu 写时copy
12
内存管理
ZONE_DMA 0-16MB
ZONE_NORMAL
ZONE_HGHMEM 高896MB 不能被永久映射
分配内存
以页单位:alloc_page
以字节为单位:kmalloc 物理地址和虚拟地址都连续。
vmalloc 虚拟地址连续,物理地址不连续。会影响性能,会使得TLB抖动。
只有aloc_pages才能分配高端内存。
slab
用于数据结构,链表的内存分配。例如:进程描述符的内存申请。用于:频繁申请释放。
更多推荐
所有评论(0)