linux内核 同步
锁
linux本身实现了集中锁机制,各种锁机制之间的差别是,当锁已经被其他线程持有的时候,一些锁使用自旋的方式来等待,另外一些锁会当当前线程改变为睡眠状态然后等待被唤醒。
锁的争用
如果一个锁处于高度争用状态,那么这个锁会成为系统的瓶颈,严重降低系统性能。
伸缩性
作者在树上说是扩展性,或者翻译的问题,我理解为伸缩性更加贴切。把锁的粒度(在什么层面建立锁)细化,可以提供系统的伸缩性,也就是说增加处理器或者内存带来的性能提升更高
原子操作
linux原子操作包含对int和bit两种的原子操作。操作依赖于底层处理器对原子操作的支持。针对bit和int,基本现在大部分处理器都是支持这些常见的原子操作的:
- 原子的读取和设置数值
- 原子的加i并返回结果
自旋锁
我的理解:自旋锁应该是通过不断的CAS机器指令来实现的。
自旋锁的作用:适用于不会短时间持有的锁。
因为使用睡眠锁,将会导致两次上下文切换(一次切换出去,一次切换进来),如果锁的持有时间很短,上下文切换带来的浪费还不如使用自旋锁。
信号量
linux中的信号量是一种睡眠锁。
如果一个任务视图获取一个被其他任务持有的睡眠锁,那么这个锁将会被推进等待队列,然后让其睡眠。当持有的信号量被释放后,处于等待队列的任务将被唤醒,
计数信号量和二值信号量
二值信号量就是计数为2的信号量。可以理解为二值信号量就是普通的互斥睡眠锁(相对应与自旋锁)。
信号量的实现:
信号量内部维护一个原子int类型,初始化的时候将这个int类型设置为信号量的计数值。如5。
信号量支持P(),V()操作。P和V是发明信号量的荷兰人的命名。linux中一般叫做down和up。
down就是加锁操作:也就是对原子变量执行--操作并返回结果的操作,如果返回结果<0,那么证明信号量不可用,将当前线程压入这个锁的等待队列。
up也就是释放锁的操作:也就是对原子变量执行++的操作,然后唤醒等待队列中一个或者多个等待的线程。
互斥体
实际上,二值信号量就可以作为互斥的睡眠锁,但是信号量的实现逻辑还不够简单,所以针对这种二值的互斥睡眠锁,linux又发明了互斥体。互斥体的基本原理和二值信号量一致,就是多了一些优化,这里不再赘述。
顺序和屏障
linux提供了三种内存屏障:
rmb():读屏障,不会发生跨越rmb()的载入(读)操作重排序。
wmb():写屏障,不会发生跨越wmb()的写操作重排序。
mb():读写屏障,不会发生跨越mb()的读写操作的重排序。
如下:
a=1;
b=2;
rmb();
c=3;
由于rmb()在存在,所以前两句代码不会发生在后一句代码之后。但是不能保证前两句代码发生重排序。
linux内核 同步的更多相关文章
- [内核同步]浅析Linux内核同步机制
转自:http://blog.csdn.net/fzubbsc/article/details/37736683?utm_source=tuicool&utm_medium=referral ...
- Linux内核同步机制--转发自蜗窝科技
Linux内核同步机制之(一):原子操作 http://www.wowotech.net/linux_kenrel/atomic.html 一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个 ...
- Linux内核同步机制
http://blog.csdn.net/bullbat/article/details/7376424 Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环 ...
- Linux内核同步机制之(五):Read Write spin lock【转】
一.为何会有rw spin lock? 在有了强大的spin lock之后,为何还会有rw spin lock呢?无他,仅仅是为了增加内核的并发,从而增加性能而已.spin lock严格的限制只有一个 ...
- Linux内核同步
Linux内核剖析 之 内核同步 主要内容 1.内核请求何时以交错(interleave)的方式执行以及交错程度如何. 2.内核所实现的基本同步机制. 3.通常情况下如何使用内核提供的同步机制. 内核 ...
- Linux内核同步机制之completion【转】
Linux内核同步机制之completion 内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束.这个活动可能是,创建一个新的内核线程或者新的用户空间进程.对一个已有进程的 ...
- Linux内核同步 - Read/Write spin lock
一.为何会有rw spin lock? 在有了强大的spin lock之后,为何还会有rw spin lock呢?无他,仅仅是为了增加内核的并发,从而增加性能而已.spin lock严格的限制只有一个 ...
- Linux内核同步 - spin_lock
一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享数据被中断上下文和进程上下文访问,该如何保护呢?如果只有进程上下文的访问,那么可以考虑使用semaphore或者mutex的锁机 ...
- 浅析Linux内核同步机制
非常早之前就接触过同步这个概念了,可是一直都非常模糊.没有深入地学习了解过,最近有时间了,就花时间研习了一下<linux内核标准教程>和<深入linux设备驱动程序内核机制>这 ...
- Linux内核同步机制之(四):spin lock【转】
转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...
随机推荐
- 【计算机视觉】行人检测(Pedestrian Detection)资源
一.论文 综述类的文章 [1]P.Dollar, C. Wojek,B. Schiele, et al. Pedestrian detection: an evaluation of the stat ...
- C学习笔记-运算符
一些基本概念 数据对象:泛指数据在内存的存储区域 左值:表示可以被更改的数据对象 右值:能赋给左值的量 算数运算符 运算符 描述 实例 + 把两个操作数相加 a + b - 从第一个操作数中减去第二个 ...
- Kafka如何保证百万级写入速度以及保证不丢失不重复消费
一.如何保证百万级写入速度: 目录 1.页缓存技术 + 磁盘顺序写 2.零拷贝技术 3.最后的总结 “这篇文章来聊一下Kafka的一些架构设计原理,这也是互联网公司面试时非常高频的技术考点. Kafk ...
- Laravel从模型中图片的相对路径获取绝对路径
在模型product.php中增加以下方法.数据库图片字段为image.存储的图片相对路径 public function getImageUrlAttribute() { // 如果 image 字 ...
- #Java第三周总结
第三周实验题目+总结 第一题:打印输出所有的"水仙花数",所谓"水仙花数"是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个"水仙花数 ...
- 第十三章 字符串(一)之 String
这一节来学习String的特性和方法. 一.String对象的不变性 不变性:String对象是由一个final char[] value 数组实现的,因此String对象是不可变的.任何看起来改变S ...
- SpringBoot起飞系列-配置嵌入式Servlet容器(八)
一.前言 springboot中默认使用的是tomcat容器,也叫做嵌入式的servlet容器.因为它和我们平常使用的tomcat容器不一样,这个tomcat直接嵌入到的springboot,平常我们 ...
- js,bom,dom(相信我,你看不懂我写的)
js dom bom 2种结合方式: 1.在body中加入script标签,<script type="text/javascript" >alert(" 向 ...
- python设计购物车
设计购物车 一需求: 1.启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提 ...
- golang 客户端
package main import ( "fmt" "io/ioutil" "net/http" ) func main() { fmt ...