Linux设备驱动之并发控制(1)

来源:互联网 发布:jsp网上购物系统源码 编辑:程序博客网 时间:2024/06/05 22:56

在对称多处理器系统与单核系统都有可能发生并发执行的情况,所以需要有一种机制来避免对临界资源的访问冲突。

除了SMP(多处理器系统)是真正并行外,其他都是“宏观并行,微观串行”,但实质问题与SMP相似。

 

访问共享资源代码区域称临界区(critical sections),它需要以互斥机制加以保护。

包括: 中断屏蔽,原子操作,自旋锁和信号量

 

中断屏蔽:

单核CPU中避免竞态的简单访问是进入临界区前屏蔽系统中断。但要求当前内核应尽快执行完临界区的代码以避免长时间屏蔽中断引起数据丢失或系统崩溃。

 

原子操作:

执行过程中不会被别的代码所中断的操作。Linux内核中它们分为两类,分别针对位和整型变量进行原子操作。内核代码可安全地调用它们而不被打断。

   整型原子操作:

   void atomic_set(atomic_t *v, int i); //设置原子变量为i

   atomic_t v = ATOMIC_INIT(0);//定义v并初始化为0.

   atomic_read(atomic_t *v);//返回值

   void atomic_add(int i, atomic_t *v);//增加i

   void atomic_sub(int i, atomic_t *v);//减少i

   void atomic_inc(atomic_t *v);//自增1

   void atomic_dec(atomic_t *v);//自减1

  //操作并测试,测试其是否为0,为0返回true,否则返回false.

   int atomic_inc_and_test(atomic_t *v);

   int atomic_dec_and_test(atomic_t *v);

   int atomic_sub_and_test(int i, atomic_t *v);

  //操作并返回

   int atomic_add_return(int i,atomic_t *v);

   int atomic_sub_return(int i,atomic_t *v);

   int atomic_inc_return(atomic_t *v);

   int atomic_dec_return(atomic_t *v);

原创粉丝点击