日期:2014-05-16  浏览次数:20719 次

《linux设备驱动程序III》学习---第五章

 

       第四章中讲的是内核的调试技术。。。以后用到在学习吧

 

    第五章   并发和竞态

1,操作系统编程的核心问题之一是并发管理

2,什么是竞态:linux中存在大量的并发源,当这些并发源访问可共享的数据时就会发生竞态

3,竞态的危害:竞态会导致共享的数据非控制访问,导致系统崩溃、数据破坏及安全问题

4,如何避免竞态:常用的技术是 锁定和互斥

5,记:linux中信号量的作用绝大多数是为互斥

 自旋锁

6,锁定功能的实现用的多的是自旋锁,自旋锁要更高效

7,自旋锁由spinlock_t 类型定义

  初始化:

      spinlock_t my_lock=SPIN_LOCK_UNLOCKED;

void spin_lock_init(spinlock_t my_lock);

通过void spin_lock(spinlock_t *lock);获得自旋锁

通过void spin_unlock(spinlock_t *lock);释放

8,自旋锁弄不好会出现死锁的问题,这里要遵守一定的规则:

  @任何拥有自旋锁的代码必须是原子的。因为内核的抢占机制,当有高优先级的进程代码排挤带有自旋锁的代码时,带有自旋锁的代码就一直不能运行,就会陷入死锁状态。 这里解释下自旋锁的机制:共享代码被上锁后,其他进程要想访问,就得一直等着解锁,等待的过程中会一直访问,这种状态称为自旋。

 @中断中有自旋锁会进入自旋陷阱,所以要禁止中断。

  @自旋锁必须最短时间拥有。因为自旋是原子操作,如果时间长的话,其他优先级高的真正需要先运行的就要等待,内核延迟。

   最后说一点个人理解:自旋锁的作用是内核管理并发出现竞态问题的有效手段,用法和线程间的锁是一个原理,访问共享资源的时候,锁定,这个时候其他线程要访问的话会先看是不是上锁,如果上锁的话其他进程会等待。退出前释放,其他进程就可以再用这个共享资源了。