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

用于数据结构,链表的内存分配。例如:进程描述符的内存申请。用于:频繁申请释放。








Logo

更多推荐