内核同步方法

http://blog.csdn.net/unbutun/article/details/6554990


原子操作

spinlock   --- 忙等待,不释放cpu。所以用于短时间加锁。

                        用于中断处理程序时,要同时禁止本地中断。即使用spin_lock_irqsave

rwlock       --- 比较照顾读锁情况。

信号量       --- 得不到信号,就会引起进程休眠

rw信号量

互斥体       --- 就是可以休眠的互斥锁

完成变量   --- kthread中有用到。

大内核锁, lock_kernel

顺序锁      --- ???jiffies。

barrier      --- 编译器屏障,阻止编译器跨屏障对载入或存储操作进行优化;

mb等        --- 内存屏障,阻止跨越屏障的载入和存储动作重新排序;比barrier功能强。


http://blog.chinaunix.net/uid-20184656-id-138057.html

在内核里面的几种状态:

1. 进程上下文

2. 下半部

3. 中断处理程序

spin_lock_irqsave/spin_unlock_irqrestore
spin_lock_irq/spin_unlock_irq
spin_lock_bh/spin_unlock_bh/spin_trylock_bh

如果1和1冲突,锁,信号量都可以;

如果1和2共享数据时,对1中的共享数据进行保护,加锁同时还要禁止2下半部抢占//spin_lock_bh();

如果多处理器,2和2共享数据时,(单处理器,2不会抢占2)

  • 同类tasklet,不需要保护;
  • 不同tasklet共享时,普通自旋锁即可;//spin_lock
  • 软中断之间,普通自旋锁即可;//spin_lock

如果2和3共享数据时,对2操作时禁止3执行;//spin_lock_irqsave

如果 1和3共享数据时,对1中的共享数据进行保护,要同时禁止本地中断;//spin_lock_irqsave

如果多处理器,3和3冲突:

  • 只有一种中断处理程序访问共享资源;只有多核有问题;故//spin lock
  • 不同中断处理程序访问共享资源;单核多核都可能有问题;故//spin_lock_irqsave


禁止中断还可以禁止内核抢占;

但无论禁止中断,还是禁止内核抢占,都没有任何保护机制来防止来自其他处理器的并发访问;-----------只能禁止本CPU内的抢占。如果想禁止其他CPU的并发访问,则必须使用spin_lock。

同一CPU,禁止中断防止其他中断处理程序的并发访问;

锁可以防止其他处理器的并发访问;


get_cpu 禁止内核抢占

中断(或软中断)禁止用于防止同一CPU上中断(或软中断)对共享资源的非同步访问。而自旋锁则防止在不同CPU上的执行单元对共享资源的同时访问,以及不同进程上下文互相抢占导致的对共享资源的非同步访问。

http://www.kerneltravel.net/jiaoliu/001.htm

内核任务种类

硬中断操作:
硬中断是指那些由处理器以外的外设产生的中断,这些中断被处理器接收后交给内核中的中断处理程序处理。要注意的是:第一,硬中断是异步产生的,中断发生后立刻得到处理,也就是说中断操作可以抢占内核中正在运行的代码。这点非常重要。第二,中断操作是发生在中断上下文中的(所谓中断上下文指的是和任何进程无关的上下文环境)。中断上下文中,不可以使用进程相关的资源,也不能够进行调度。

软中断操作:
软中断是Linux中为了执行一些硬中断操作来不及完成的任务而采取的推后执行机制。因为硬中断操作期间的中断会被抛弃,所以硬中断是在不安全时间运行的。不安全时间应该尽量短,所以采用软中断来执行大部分任务,它会把硬中断做不完的耗时任务推后到安全时间执行(软中断期间不会丢弃中断信号)。
软中断不象硬中断那样时随时都能够被执行,笼统来讲软中断会在内核处理任务处理完毕后返回用户级程序前得到处理机会。具体的讲有三个时刻它将被执行(do_softirq()):硬件中断操作完成后;内核调度程序中;系统调用返回时,(另外的内核线程ksoftirqd周期执行软中断)。需要说明的是软中断的执行也处于中断上下文中,所以中断上下文对它的限制是和硬中断一样的。
Tasklet 和bottom half
Tasklet和bottom half都是建立在软中断之上的两种延迟机制,其中具体不同在于软中断是静态分配的,而且同类软中断可以并发地在几个CPU上运行;Tasklet可以动态分配,并且不同种类的Tasklets可以并发地在几个CPU上运行,但同类的tasklets 不可以;bottom half只能静态分配,实质上下半部分是一个不能与其它下半部分并发执行的高优先级tasklet,即使它们类型不同,而且在不同CPU上运行。


系统调用
系统调用是用户程序通过门机制来进入内核执行的内核例程,它运行在内核态,处于进程上下文中(进程上下文包括进程的堆栈等等环境),所以系统的调用代码可以对进程相关数据进行访问,可以执行调度程序,也可以睡眠。

你可能感兴趣的:(优化,存储,编译器)