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内核 同步的更多相关文章

  1. [内核同步]浅析Linux内核同步机制

    转自:http://blog.csdn.net/fzubbsc/article/details/37736683?utm_source=tuicool&utm_medium=referral ...

  2. Linux内核同步机制--转发自蜗窝科技

    Linux内核同步机制之(一):原子操作 http://www.wowotech.net/linux_kenrel/atomic.html 一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个 ...

  3. Linux内核同步机制

    http://blog.csdn.net/bullbat/article/details/7376424 Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环 ...

  4. Linux内核同步机制之(五):Read Write spin lock【转】

    一.为何会有rw spin lock? 在有了强大的spin lock之后,为何还会有rw spin lock呢?无他,仅仅是为了增加内核的并发,从而增加性能而已.spin lock严格的限制只有一个 ...

  5. Linux内核同步

    Linux内核剖析 之 内核同步 主要内容 1.内核请求何时以交错(interleave)的方式执行以及交错程度如何. 2.内核所实现的基本同步机制. 3.通常情况下如何使用内核提供的同步机制. 内核 ...

  6. Linux内核同步机制之completion【转】

    Linux内核同步机制之completion 内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束.这个活动可能是,创建一个新的内核线程或者新的用户空间进程.对一个已有进程的 ...

  7. Linux内核同步 - Read/Write spin lock

    一.为何会有rw spin lock? 在有了强大的spin lock之后,为何还会有rw spin lock呢?无他,仅仅是为了增加内核的并发,从而增加性能而已.spin lock严格的限制只有一个 ...

  8. Linux内核同步 - spin_lock

    一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享数据被中断上下文和进程上下文访问,该如何保护呢?如果只有进程上下文的访问,那么可以考虑使用semaphore或者mutex的锁机 ...

  9. 浅析Linux内核同步机制

    非常早之前就接触过同步这个概念了,可是一直都非常模糊.没有深入地学习了解过,最近有时间了,就花时间研习了一下<linux内核标准教程>和<深入linux设备驱动程序内核机制>这 ...

  10. Linux内核同步机制之(四):spin lock【转】

    转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...

随机推荐

  1. 酷Q插件_SDK———入门与使用

    1.这里使用的是易语言的SDK,所以请看不惯的人自行离开.{wymbf.} 1.2 这里不会直接给你工程,请用动手打代码,动脑思考. 1.3 不知道.不了解酷Q是干嘛的,请访问:https://cqp ...

  2. 修改umask后apache报错:because search permissions are missing on a component of the path,

    0.修改umask后apache报错:because search permissions are missing on a component of the path, 1.ls -lrth ./h ...

  3. tar:归档中找不到 tar: 由于前次错误,将以上次的错误状态退出

    今天解压ZendStudio-10.0.0-x86.tar.gz,使用命令tar -zxvf ZendStudio-10.0.0-x86.tar.gz ./然后报下面错误tar: /tm: 归档中找不 ...

  4. Oracle-DQL 7- 集合操作

    集合操作: --将查询结果看作是一个集合,可以将多个查询结果之间用集合操作找出特点的数据--很多的集合操作可以使用条件的组合进行代替,集合操作的效率高于条件组合--某些复杂的查询结果只能通过集合操作得 ...

  5. Luogu P2495 [SDOI2011]消耗战

    题目 我们可以很快的想到一个单次\(O(n)\)的dp. 然后我们注意到这个dp有很多无用的操作,比如一条没有关键点的链可以直接去掉. 所以我们可以尝试一次dp中只管那些有用的点. 题目给的关键点显然 ...

  6. linux 查找大文件

    查看磁盘使用情况:df -h [root@iZwz9gs2zseivevv1k5vnkZ /]# df -h Filesystem Size Used Avail Use% Mounted on /d ...

  7. 使用 ASP.NET Core 的 gRPC 服务

    将 gRPC 服务添加到 ASP.NET Core 应用 gRPC 需要gRPC包. 配置 gRPC 在 Startup.cs 中: gRPC 是通过AddGrpc方法启用的. 每个 gRPC 服务通 ...

  8. Winform自定义键盘控件开发及使用

    最近有学员提出项目中要使用键盘控件,系统自带的osk.exe不好用,于是就有了下面的内容: 首先是进行自定义键盘控件的开发,其实核心大家都知道,就是利用SendKeys.Send发送相应 的字符,但是 ...

  9. js 动态添加Table tr,选中与不选中checkbox行数NO的变化

    首次加载进入页面,如图: 注:Table是在js中拼接字符串循环动态添加的(拼接字符串,详见之前随笔) 点击Line2 checkbox后,效果如图: 实现的效果就是: 点击checkbox — 显示 ...

  10. gridview单元格编辑添加数据

    行号 private void gridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIn ...