![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux内核的同步机制
文章平均质量分 79
wangpengqi
这个作者很懒,什么都没留下…
展开
-
读写自旋锁详解,第 3 部分(来自IBM)
基于简单共享变量的读写自旋锁的不足本系列文章的第 2 部分中给出的实现都基于简单共享变量,简洁实用,但在大规模多核、NUMA 系统上可扩展性较差。我们说某个读写自旋锁的实现是可扩展的,通俗地讲是指在线程访问模式(读者写者数目之比、各自到来的频率及持有锁的时间)不变的前提下增加处理器的个数,线程的吞吐量(单位时间内获得锁的线程数目)也随之大幅增加。如果能接近线性(甚至由于缓存的影响使得超线性)增转载 2012-10-04 21:09:18 · 529 阅读 · 0 评论 -
内核并发控制---原子操作(来自网易)
定义在头文件asm/atomic.h中;原子操作指的是在执行过程中不会被别的代码路径所打断的操作;Linux内核提供了一系列的函数来实现内核中的原子操作,这些函数又分为两类,分别针对位变量和整型变量进行原子操作;它们的共同点是:在任何情况下操作都是原子的,内核代码可以安全地调用它们而不会被打断;位变量和整型变量的原子操作都依赖于底层CPU的原子操作来实现,因此所有这些函数都是与CPU架构密转载 2012-10-08 15:43:16 · 825 阅读 · 0 评论 -
内核并发控制---中断屏蔽 (来自网易)
定义在头文件linux/irqflags.h中;在单CPU内部避免竞态的一种方法是在进入临界区之前先屏蔽系统的中断,离开临界区之前再恢复系统中断;CPU一般都应该具有打开中断和关闭中断的功能;这项功能可以保证正在执行的内核代码执行路径不会被中断处理程序所抢占,防止某些竞态条件的发生;具体而言,中断屏蔽将使得中断与进程之间的并发不再出现,而且,由于Linux内核的进程调度等操作都是依赖中断来实现转载 2012-10-08 15:44:18 · 988 阅读 · 0 评论 -
Linux 内核的同步机制,第 1 部分(来自IBM)
一、 引言在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问。尤其是在多处理器系统上,更需要一些同步机制来同步不同处理器上的执行单元对共享的数据的访问。在主流的Linux内核中包含了几乎所有现代的操作系统具有的同步机制,这些同步机制包括:原子操作、信号量(semaphore)、读写信号量(rw_semaph转载 2012-10-09 09:37:42 · 629 阅读 · 0 评论 -
读写自旋锁,第1部分(来自IBM)
读写自旋锁简介什么是读写自旋锁由于互斥的特点,使用自旋锁的代码毫无线程并发性可言,多处理器系统的性能受到限制。通过观察线程在临界区的访问行为,我们发现有些线程只是简单地读取信息,并不修改任何东西,那么允许它们同时进入临界区不会有任何危险,反而能大大提高系统的并发性。这种将线程区分为读者和写者、多个读者允许同时访问共享资源、申请线程在等待期内依然使用忙等待方式的锁,我们称之为读写自旋锁(Re转载 2012-10-04 20:58:01 · 684 阅读 · 0 评论 -
内核并发控制---读写自旋锁 (来自网易)
定义在头文件linux/spinlock.h或linux/rwlock.h中;自旋锁并不关心其锁定的临界区究竟会进行怎么样的操作,不管是读还是写,都一视同仁,即便是多个执行单元同时并发地读取临界区资源,也会被锁住;而事实上,对共享资源的访问,多个执行单元同时读取临界资源,是不会有问题的;读写自旋锁可以允许读操作的并发;读写自旋锁是从自旋锁衍生过来的;它是一种比自旋锁粒度更小的锁机制,它保留转载 2012-10-08 15:37:39 · 786 阅读 · 0 评论 -
内核并发控制---顺序锁 (来自网易)
定义在头文件linux/seqlock.h中;顺序锁(seqlock)是对读写锁的一种优化,若使用顺序锁,读执行单元绝对不会被写执行单元所阻塞,也就是说,读执行单元可以在写执行单元对被顺序锁保护的共享资源进行写操作的同时仍然可以继续读,而不必等待写执行单元完成之后再去读,同样,写执行单元也不必等待所有的读执行单元读完之后才去进行写操作;但是写执行单元与写执行单元之间仍然是互斥的,即:如果有转载 2012-10-08 15:45:20 · 569 阅读 · 0 评论 -
内核并发控制---信号量 (来自网易)
定义在头文件linux/semaphore.h中;信号量(semaphore)是用于保护临界区的一种常用方法,它的使用方式与自旋锁类似;与自旋锁相同,只有得到信号量的进程才能执行临界区的代码;但是,与自旋锁不同的是,当获取不到信号量的时候,进程不会在原地打转,而是进入休眠等待状态;1).定义信号量:struct semaphore sem;2).初始化信号量:void sema转载 2012-10-08 15:46:17 · 765 阅读 · 0 评论 -
Linux内核同步机制之信号量与锁
Linux内核同步控制方法有很多,信号量、锁、原子量、RCU等等,不同的实现方法应用于不同的环境来提高操作系统效率。首先,看看我们最熟悉的两种机制——信号量、锁。一、信号量 首先还是看看内核中是怎么实现的,内核中用struct semaphore数据结构表示信号量(中):struct semaphore { spinlock_t lock; u转载 2012-10-11 13:15:47 · 836 阅读 · 0 评论 -
内核同步 (来自chinaunix总结)
内核同步内核服务请求的方式 老板(硬件中断),客人(用户态发出的系统调用,或异常) 不顾客人顾老板 顾完新老板,再顾旧老板 顾完老板,可能顾旧客人,也可能顾新客人抢占和并发 抢占 抢占式内核的特定:进程切换的时机多了。 与抢占无关的切换: 当前进程自愿放弃CPU(如:睡等资源) 进程由内核态转载 2012-10-08 14:37:38 · 786 阅读 · 0 评论 -
高性能自旋锁 MCS Spinlock 的设计与实现(来自IBM)
引言林 昊翔 (linhaoxiang@hotmail.com), Linux 内核爱好者林昊翔,计算机科学硕士,毕业于清华大学计算机系,Linux 内核爱好者秦 君 (qinjun@cn.ibm.com), 软件工程师, IBM 自旋锁(Spinlock)是一种在 Linux 内核 [1] 中广泛运用的底层同步机制,长期以来,人们总是关注于自旋锁的安全和高效,而忽转载 2012-10-08 19:51:10 · 1561 阅读 · 0 评论 -
内核并发控制---互斥量(来自网易)
定义在头文件linux/mutex.h中;互斥体(mutex)是Linux系统提供的另外一种互斥机制;在Linux内核中是真实存在的;1).定义互斥体struct mutex my_mutex; //定义互斥体mutex_init(&my_mutex); //初始化互斥体2).获取和释放互斥体:void mutex_lock(struct mutex* lock转载 2012-10-08 15:49:32 · 760 阅读 · 0 评论 -
读写自旋锁详解,第 2 部分(来自IBM)
读者优先的读写自旋锁我们先不考虑性能,搞出一个可用的实现再说。首先,用一个整型变量 status 来记录当前状态;另一个整型变量 nr_readers 来记录同时持有锁的读者数量,只有当 nr_readers 为 0 的时候,锁才被读者彻底释放。此外不需要额外变量。其次,我们使用高级互斥原语-普通的自旋锁,决定线程的执行顺序。读写自旋锁居然在内部使用普通自旋锁,这看起来有点古怪,还能够提高转载 2012-10-04 21:04:08 · 536 阅读 · 0 评论 -
内核并发控制---自旋锁(来自网易)
定义在头文件linux/spinlock.h中;自旋锁(spin lock)是一种对临界资源进行互斥访问的典型手段;为了获得一个自旋锁,在某CPU上运行的代码需要首先执行一个原子操作,该操作测试并设置某个内存变量,由于该操作是原子操作,所以在该操作完成之前,其它执行单元对该内存变量的访问被禁止;如果测试结果表明该自旋锁已经空闲,则程序获得这个自旋锁并继续运行;如果测试结果表明该自旋锁仍然被转载 2012-10-08 15:42:06 · 588 阅读 · 0 评论 -
内核并发控制---完成量 (来自网易)
定义在头文件linux/completion.h中;完成量(completion)是Linux系统提供的一种比信号量更好的同步机制,是对信号量的一种补充;它用于一个执行单元等待另一个执行单元完成某事;使用完成量等待时,调用进程是以独占睡眠方式进行等待的;不是忙等待;1).定义完成量:struct completion my_completion; //定义完成量my_comple转载 2012-10-08 15:48:47 · 700 阅读 · 0 评论 -
内核并发控制---RCU (来自网易)
定义在头文件linux/rcupdate.h中;一、RCU原理RCU,全名Read-Copy-Update(读-拷贝-更新);对于被RCU所保护的共享资源,读执行单元不需要获得任何锁就可以访问到它,也不需要使用原子指令,而且在除Alpha的所有架构上也不需要使用内存栅(Memory Barrier),因此不会导致锁竞争、内存延迟以及流水线停滞;不需要锁,也使得使用更加容易,因为死锁问题就不转载 2012-10-08 15:50:24 · 781 阅读 · 0 评论 -
Linux 内核的同步机制,第 2 部分(来自IBM)
六、大内核锁(BKL--Big Kernel Lock)大内核锁本质上也是自旋锁,但是它又不同于自旋锁,自旋锁是不可以递归获得锁的,因为那样会导致死锁。但大内核锁可以递归获得锁。大内核锁用于保护整个内核,而自旋锁用于保护非常特定的某一共享资源。进程保持大内核锁时可以发生调度,具体实现是:在执行schedule时,schedule将检查进程是否拥有大内核锁,如果有,它将被释放,以致于其它的进程能转载 2012-10-09 09:32:56 · 710 阅读 · 0 评论 -
内核并发控制---读写信号量(来自网易)
定义在头文件linux/rwsem.h或linux/rwsem-spinlock.h中读写信号量与信号量之间的关系,类似于读写自旋锁与自旋锁之间的关系;读写信号量可能会引起进程阻塞,但是它允许N个读执行单元同时访问共享资源,而最多只允许有一个写执行单元访问共享资源;因此,读写信号量是一种相对放宽条件的、粒度稍大于信号量的互斥机制;备注:信号量不允许任何操作之间有并发,即:读操作与读操作之间转载 2012-10-08 15:47:08 · 2227 阅读 · 0 评论 -
linux中同步例子(完成量completion)
这是一个公交司机和售票员之间的线程调度,用于理解完成量,完成量是对信号量的一种补充,主要用于多处理器系统上发生的一种微妙竞争在这里两个线程间同步,只有当售票员把门关了后,司机才能开动车,只有当司机停车后,售票员才能开门。#include #include #include #include #include MODULE_LICENSE("D转载 2012-10-10 23:20:40 · 914 阅读 · 0 评论