Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156594
  • 博文数量: 49
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 445
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-16 23:55
文章分类
文章存档

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.6linux是抢占式的。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 updateRCU6 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_RUNNINGTASK_UNINTERRUPTIBLE,并把进程加入到等待队列。

  所以在执行down()的时候,有几种情况发生。参看p211

  中断和异常不能用down(),因为决不能被挂起。

  还有一种down_interruptible(),这种被设备驱动广泛应用。在没有获得信号量的时候直接忽略操作。不确定是不是这样。。。

  7 local interrupt disabling :关中断来实现进入critical region

阅读(862) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~