《Linux性能优化实战》学习笔记 Day04

简介: 《Linux性能优化实战》学习笔记 Day04

06 | 锁:如何根据业务场景选择合适的锁?

原文摘抄

当你无法判断锁住的代码会执行多久时,应该首选互斥锁,互斥锁是一种独占锁。

如果你能确定被锁住的代码执行时间很短,就应该用自旋锁取代互斥锁。

对于 99% 的线程级互斥锁而言,阻塞都是由操作系统内核实现的(比如 Linux 下它通常由内核提供的信号量实现)

自旋锁比互斥锁快得多,因为它通过 CPU 提供的 CAS 函数(全称 Compare And Swap),在用户态代码中完成加锁与解锁操作。

CAS 忙等待

while (true) {
  //因为判断lock变量的值比CAS操作更快,所以先判断lock再调用CAS效率更高
  if (lock == 0 &&  CAS(lock, 0, pid) == 1) return;
  if (CPU_count > 1 ) { //如果是多核CPU,“忙等待”才有意义
      for (n = 1; n < 2048; n <<= 1) {//pause的时间,应当越来越长
        for (i = 0; i < n; i++) pause();//CPU专为自旋锁设计了pause指令
        if (lock == 0 && CAS(lock, 0, pid)) return;//pause后再尝试获取锁
      }
  }
  sched_yield();//单核CPU,或者长时间不能获取到锁,应主动休眠,让出CPU
}

这是两种最基本的处理方式,更高级别的锁都会选择其中一种来实现,比如读写锁就既可以基于互斥锁实现,也可以基于自旋锁实现。

如果你能够明确区分出读和写两种场景,可以选择读写锁。

因此,读写锁真正发挥优势的场景,必然是读多写少的场景,否则读锁将很难并发持有。

用队列把请求锁的线程排队,按照先来后到的顺序加锁即可,当然读线程仍然可以并发,只不过不能插队到写线程之前。

乐观锁全程并没有加锁,所以它也叫无锁编程。

乐观锁虽然去除了锁操作,但是一旦发生冲突,重试的成本非常高。所以,只有在冲突概率非常低,且加锁成本较高时,才考虑使用乐观锁。

读写锁是有倾向性的,读优先锁很高效,但容易让写线程饿死,而写优先锁会优先服务写线程,但对读线程亲和性差一些。

协程自旋锁

Go里的自旋锁需要自己实现,方便协程调度。协程使用自旋锁的时候,这是spinLock 的Lock方法

for !atomic.CompareAndSwapUint32(sl, 0, 1) {
    runtime.Gosched()
}
其中runtime.Gosched,是把阻塞的协程调度出去,这样调度器可以执行其他协程。

心得体会

锁用操作系统封装好的接口调用,会好方便。但是很多场景都是要封装高级锁的。

工作体验

CAS相对用的较少,没啥特别高的并发量,锁还是方便的。23333。

可能在分布式集群里,分布式锁比单机的锁用的要多一点。

就怕锁都不知道要锁的。

目录
相关文章
|
2月前
|
监控 Java 大数据
bigdata-05-Linux实战
bigdata-05-Linux实战
21 0
|
2月前
|
运维 Linux Apache
Linux Apache服务详解——Apache虚拟目录与禁止显示目录列表实战
Linux Apache服务详解——Apache虚拟目录与禁止显示目录列表实战
24 2
|
2月前
|
域名解析 Linux Apache
Linux Apache服务详解——虚拟网站主机功能实战
Linux Apache服务详解——虚拟网站主机功能实战
45 5
|
2月前
|
Linux 数据安全/隐私保护 Windows
Linux vsFTPd服务详解——本地用户登录实战
Linux vsFTPd服务详解——本地用户登录实战
53 2
|
2月前
|
运维 监控 Linux
Linux Rsync服务详解(二)——Rsync服务实战
Linux Rsync服务详解(二)——Rsync服务实战
20 1
|
2月前
|
存储 缓存 网络协议
Linux 基本组件与性能优化与根目录
内核:操作系统的核心,管理硬件资源和提供基本服务。 Shell: 用户与系统交互的命令行界面,例如 Bash 或 Zsh。 文件系统: 组织和存储数据的方式,例如 ext4、XFS。 进程: 正在运行的程序的实例,由内核管理。 用户界面: 提供图形用户界面(GUI)和命令行界面(CLI)两种方式。 系统工具: 用于系统管理的工具,例如 systemd、ps、top。 软件包管理器: 安装、更新和删除软件包的工具,如 apt、yum/dnf 网络协议和服务: 支持多种网络协议和提供网络服务的功能。
29 1
|
3月前
|
Ubuntu Linux Shell
【Linux操作系统】探秘Linux奥秘:shell 编程的解密与实战
【Linux操作系统】探秘Linux奥秘:shell 编程的解密与实战
73 0
|
1月前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
64 7
|
3天前
|
存储 Shell Linux
操作系统实战(一)(linux+C语言)
本篇文章重点在于利用linux系统的完成操作系统的实验,巩固课堂知识
|
5天前
|
数据挖掘 Linux vr&ar
Linux命令实战:解决日常问题的利器
Linux命令实战:解决日常问题的利器