加入收藏 | 设为首页 | 会员中心 | 我要投稿 大同站长网 (https://www.0352zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

内核中并发所所采取的方案

发布时间:2021-11-25 16:04:07 所属栏目:教程 来源:互联网
导读:多线程执行的时候会出现并发的问题,处理不好,多线程会出现数据处理的错误。SMP(对称多处理器)和内核抢占是多线程执行的两个场景。我们提出要保护共享内核资源的问题,下面有内核中常用的方式。 1、自旋锁和互斥体 首先先了解临界区的概念,临界区是访问

多线程执行的时候会出现并发的问题,处理不好,多线程会出现数据处理的错误。SMP(对称多处理器)和内核抢占是多线程执行的两个场景。我们提出要保护共享内核资源的问题,下面有内核中常用的方式。
 
1、自旋锁和互斥体
   首先先了解临界区的概念,临界区是访问共享资源的代码区域。自旋锁(spin lock)和互斥体(mutex, matual exclusion)是保护内核的两种基本的机制。
   1)自旋锁可以确保在同一时刻只有一个线程进入临界区,其他想进入的则必须等待释放的到来,当然线程不是指的内核线程,而是执行的线程。
 
基本用法:  
#include <linux/spinlock.h>   
  
spinlock_t mylock = SPIN_LOCK_UNLOCKED;  
  
spin_lock(&mylock);  
/* .... Critical Section code ... */  
spin_unlock(&mylock); /* Release the lock */  
   2)互斥体在进入一个被占用的临界区之前不会原地打转,而是使当前线程进入睡眠状态。
 
基本用法:  
 #include <linux/mutex.h>   
   
 static DEFINE_MUTEX(mymutex);  
   
 mutex_lock(&mymutex);  
 /* .... Critical Section code ... */  
 mutex_unlock(&mymutex); /* Release the mutex */  
   所以,在使用时该如何选择呢?
   1)如果临界区需要睡眠,只能选择互斥体;
   2)在中断函数中只能使用自旋锁;
   
2、原子操作
   原子操作用于执行轻量级的、仅执行一次的操作。常用于修改计数器、有条件的增加值、设置位等。原子操作可以确保操作的串行化,不需要锁来对并发进行保护。
   具体的操作接口可以查看include/asm-xxx-arch/atomic.h。
  
3、读写锁
   当每个执行单元在访问临界区域的时候要么是读要么是写,但是又没有同时访问的时候,可以选择此项。  
 
基本操作(Read):  
  rwlock_t myrwlock = RW_LOCK_UNLOCKED;  
   
  read_lock(&myrwlock);  
  /* .... Critical Section code ... */  
  read_unlock(&myrwlock); /* Release the lcok */  
    
  基本操作(Write):  
  rwlock_t myrwlock = RW_LOCK_UNLOCKED;  
   
  write_lock(&myrwlock);  
  /* .... Critical Section code ... */  
  write_unlock(&myrwlock); /* Release the lcok */  
   
   同样存在相关的中断处理时使用的:read_lock_irqsave()、read_unlock_irqstore()、write_lock_irqsave()、write_lock_irqstore。
   1)现在,在新的内核中,还存在对于读多于写的一种顺序锁(seqlock)。
   基本操作:
 
do{  
     read_seqbegin(&xtime_lock);  
     /* .... Critical Section code ... */  
 }while(read_seqretry(&xtime_lock,seq);  
   2)内核中还有另外一种机制RCU(Read--Copy--Update)。该机制用于提高读操作远多于写操作时的性能。基本理念是读线程不需要加锁,但是写线程要变的复杂的多,要首先要复制一份,然后在复制的这份数据结构上进行更新操作。为了保证读取操作的完成,副本会一致保持到所有的RCU上的上下文切换。具体可以参考Documentation/RCU/*。
 
 
4、调试工具
   1)可以配置(CONFIG_DEBUG_SPINLOCK),来输出常见的自旋锁错误。
   2)Lockmeter(http://oss.sgi.com/project/lockmeter/)工具可以用于手机锁相关的统计信息。
   3)当然要牢记,申请了锁,就要释放,死锁会是常见的问题。

(编辑:大同站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!