2009年(49)
分类: LINUX
2009-05-25 12:17:21
CHAPTER 5 KERNEL SYNCHRONIZATION
underscore
vt.
划线于...下, 强调
n.
底线
drastic
adj.
激烈的, (药性等)猛烈的
内核不会一直顺序的进行,它会交错的运行,因此会产生race condition,所以需要一定的同步技术。Synchronization
内核是怎样以交错的顺序执行的,请参看p189
抢占式内核
Planned process switch 和 forced process switch
在非抢占式内核条件下,在内核态是不允许进程切换的。(必须切换回user mode)
使用抢占式内核的主要原因就是为了减少dispatch latency,就是进程变成runnable到真正的运行之间的时间。
2.6的linux是抢占式的。2.4就不是了?
如果thread_info里面的preempt_count大于0,那么抢占式就被禁止了。
有三种条件会使他禁止: 1 内核在运行中断服务程序。2 defferable func 被禁止 3 内核可抢占的功能直接被禁止。
在中断已经发生的情况下,内核里面的data structure如何实现不会被同时访问?:关中断来实现critical region,这时候就不能产生中断嵌套,所以就不会出现同时被访。
在系统调用的情况下,如果data structure被同时访问,那么在single processor情况下,可以简单的将preemption禁止就可以了。
有很多种关于kernel同步的操作。
1 per_CPU variables 2 atomic operations 3 optimization and memory barriers 4 spin locks 5 read-copy update(RCU)6 semaphores 7 local interrupt disabling 8 disabling and enabling deferrable functions 这些具体的primitives请参看p194开始。
2 atomic operation :汇编语言里有一种操作是read-modify-write的,就是同时读出old val,然后写入new val。汇编语言里面可实现这种操作, 在c语言里面,有一种特殊的数据结构叫做atomic_t。
4 spin locks : 它是为多处理器设计的。一个处理器在一个关键区域的时候,另一个处理区会进入忙等待,就是一直开这把锁,直到打开。不过在spin状态下,还是可以抢占这个进程。
6 semaphores : linux里面有两种信号量。一种是内核的信号量,用在内核控制路径中。另一种是SYSV 里面的IPC 的信号量,用在user mode process。信号量使用的时候会使相应的进程挂起,所以中断服务和defferable function不能用信号量。因为中断不能被睡眠。
Semaphore结构里面包含:count, wait, sleepers
Count 就是信号量
Wait 就是挂起的wait_queue
Sleepers 说明当前有无被挂起的进程。
Up() down() 用来设定和释放信号量。
Down()可能会引起进程的状态改变。TASK_RUNNING到TASK_UNINTERRUPTIBLE,并把进程加入到等待队列。
所以在执行down()的时候,有几种情况发生。参看p211
中断和异常不能用down(),因为决不能被挂起。
还有一种down_interruptible(),这种被设备驱动广泛应用。在没有获得信号量的时候直接忽略操作。不确定是不是这样。。。
7 local interrupt disabling :关中断来实现进入critical region。