一 临界区和竞争条件

临界区:访问和操作共享数据的代码段。

竞争条件:多个执行线程处于同一个临界区中。

    

  处于竞争条件:造成访问的数据或者资源不一致状态:

对资源i的访问:ProcessA和B访问后得到正确的结果应该是9:

进程是并发执行,有可能得到的结果是:8

    

防止这种情况的发生:保证对资源的访问原子操作。

二 加锁

锁:采用原子操作实现,原子操作不存在竞争。

    

造成并发原因:

  l  中断:随时可以打断当前执行的进程代码;

  l  软中断和tasklet:任何时刻能唤醒调度软中断和tasklet,打断当前正在执行的代码;

  l  内核抢占:当前任务被抢占;

  l  进程睡眠:唤醒调度程序,执行新的进程;

  l  多处理器:同时执行代码。

  针对资源并发竞争条件的存在,需要对资源进行保护,保证资源的访问操作是原子的。

需要弄清楚哪些数据需要被保护,要试图弄清楚资源会不会被并发的访问操作。

三 死锁

多个执行线程互相等待被对方占用的资源,但永远不会释放各自拥有的资源,导致众线程永远无法得到执行。

    

出现死锁是件很危险的事情,预防死锁:

  l  加锁顺序保持一致;

  l  防止发生饥饿措施;

  l  不要重复请求同一个锁;

  l  复杂加锁方案造成死锁概率较大——设计锁力求简单;

四 锁的粒度

加锁粒度:描述加锁保护的数据规模;

过粗的锁:保护大块数据,如子系统所有数据结构;

精细的锁:保护小块数据,一个大数据结构中的一个元素;

在粗糙与精细之间需要平衡:精细的锁复杂开销大,良好扩展性:从单核到多核,为提高性能,锁得机制变得更细。

  保护数据不被并发的访问,加锁你的代码。恰当的加锁:满足不死锁、可扩展、清晰简洁。

最新文章

  1. sar命令的使用
  2. python学习道路(day5note)(列表生成式,生成器,装饰器,常用模块)
  3. DWR实现扫一扫登录功能
  4. Java 名词
  5. 怎么实时查看mysql当前连接数
  6. php 无限循环
  7. python中super关键字的用法
  8. AfxMessageBox和MessageBox差别
  9. 【Windows 8 Store App】学习一:获取设备信息
  10. lucene 索引创建步骤
  11. 2.Add Two Numbers-两个单链表相加
  12. Java开发笔记(二)Java工程的帝国区划
  13. Emote木马分析
  14. mysql 设置初始密码
  15. 实用矩阵类(Matrix)(带测试)
  16. 唯美PS转手绘之SAI篇_百度经验
  17. 每天CSS学习之text-align
  18. Zookeeper与Paxos
  19. TZOJ 2018 SPF(连通图割点和分成的连通块)
  20. CSS布局模型学习(Float、Position、Flexbox)

热门文章

  1. 《Linux内核设计与实现》读书笔记(十三)- 虚拟文件系统
  2. Dynamic CRM 2013学习笔记(三十三)自定义审批流4 - 规则节点 -有分支的流程处理
  3. [ucgui] 彩色条函数
  4. ava如何实现系统监控、系统信息收集、sigar开源API的学习(转)
  5. HTTP协议之chunk编码(分块传输编码
  6. 基于.NET的Excel开发:单元格区域的操作(读取、赋值、边框和格式)
  7. zookeeper 安装与配置
  8. iOS应用性能调优的25个建议和技巧
  9. Leetcode 225 Implement Stack using Queues STL
  10. python中argparse模块的使用