操作系统(5) 并发控制(1)线程的互斥

关键并发术语:

  • **临界区(critical section)**是访问共享资源的一段代码,资源通常是一个变量或者数据结构
  • **竞态条件(race condition)**出现在多个执行线程大致同时进入临界区时,它们都试图更新共享的数据结构,导致了令人惊讶的(也许是不希望的)结果
  • **不确定性(indeterminate)**程序由一个或多个竞态条件组成,程序的输出因运行而异,具体取决于哪些线程在何时运行。这导致结果不是确定的(deterministic),而我们通常期望计算机系统给出确定的结果
  • 为了避免这些问题,线程应该使用某种**互斥(mutual exclusion)**原语。这样做可以保证只有一个线程进入1临界区,从而避免进入竞态,并产生确定的程序输出。

互斥问题

直观理解:

经典的厕所包间例子

共享内存上的互斥

问题定义:

互斥:组织并发的发生:保证了原子性、有序性、可见性

共享内存的困境:

线程的三个基本操作:

  • load,读共享内存
  • store,写共享内存
  • 线程本地计算(其它线程不可见)

**黑人问号问题:**load和store顺序不能保证

**Peterson算法在多处理器编程的问题:**load和store顺序不能保证

示意图:即load可能发生在store之前;若发生,则两个load交替进行时,对方都没有举起棋子,再执行时两个人同时进了厕所,程序错误。

**x86处理器的共享内存模型:**即读取变量时,会先从store buffer中看看有没有该变量,没有的话再通过缓存再从内存读取;写入变量时,不会直接写到内存,而是先按顺序写到store buffer中,最后strore buffer再写到共享内存中。

示意图:

实现互斥的真正困难

原子指令与互斥

共享内存实现互斥的困难

**如果可以有原子操作?**test-and-set指令!

原子指令(操作):

x86的xchg指令:

xchg指令实现很形象的例子:

另一种原子操作:

LR/SC;LL/SC:

LR/SC的道理:

CAS的LR/SC实现:

数据竞争

概念:简单的理解,就是谁先执行操作。先stroe还是先load(前面的例子)

避免数据竞争

数据竞争

概念:简单的理解,就是谁先执行操作。先stroe还是先load(前面的例子)

避免数据竞争

操作系统(5) 并发控制(1)线程的互斥相关推荐

  1. 操作系统 实验三:线程的互斥

    实验三:线程的互斥 2.3.1实验⽬的 (1)熟练掌握Windows系统环境下线程的创建与撤销. (2)熟悉Windows系统提供的线程互斥API. (3)使⽤Windows系统提供的线程互斥API解 ...

  2. 南京邮电大学操作系统实验二:线程的互斥与同步

    实验原理及内容 基于互斥锁的临界区管理 使用编辑器gedit 2_1.c,新建一个2_1.c源文件,创建双线程并发完成订票操作,输入后面的范例代码: #include <stdio.h> ...

  3. 如何避免操作系统中多线程资源竞争的互斥与同步?

    作者 | 小林coding 来源 | 小林coding(ID:CodingLin) 前言 先来看看虚构的小故事 已经晚上 11 点了,程序员小明的双手还在键盘上飞舞着,眼神依然注视着的电脑屏幕. 没办 ...

  4. Linux 操作系统原理 — 进程与线程管理

    目录 文章目录 目录 前言 进程与线程 内核线程,用户线程与轻量级进程 内核线程 轻量级进程 用户线程 轻量级进程与用户线程的区别 用户线程与轻量级进程的混合模式 用户线程和内核线程的区别 线程的实现 ...

  5. linux线程(互斥锁、条件)

    线程概念: 典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情.有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务. ...

  6. 操作系统(二): 进程与线程

    操作系统(二): 进程与线程 本章解读 进程管理是操作系统重点中的重点,涵盖了操作系统中大部分的知识和考点.其主要包括四部分:进程与线程,处理器调度,同步与互斥,死锁.所以我准备分四个部分来解释这四个 ...

  7. 线程的互斥与同步机制

    同个人博客:http://tsundere-x.top/ 一.互斥 为何需要引入互斥机制? 当多个线程对同一数据并发读写(至少有一个线程执行写操作)时,这种情形被称为竞争.竞争会导致数据读或写的不确定 ...

  8. 操作系统课设之Windows 的互斥与同步

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  9. 在c#中用mutex类实现线程的互斥_C# 多线程系列(4)进程同步Mutex类

    Mutex 类 Mutex 中文为互斥,Mutex 类叫做互斥锁.它还可用于进程间同步的同步基元. Mutex 跟 lock 相似,但是 Mutex 支持多个进程.Mutex 大约比 lock 慢 2 ...

最新文章

  1. 开源项目OpenGene发起人:用“互联网+基因技术”改变肿瘤的诊断与治疗
  2. MIDlet 移动开发
  3. java中构造方法和方法全面解析
  4. boost::push_back相关的测试程序
  5. oracle ctl file constantnull,Oracle 的一些导入和导出方法
  6. 编写干净的测试–用特定领域的语言替换断言
  7. 透明的WinForm窗体
  8. Text2SQL 语义解析数据集、解决方案、paper资源整合项目
  9. [Java] 蓝桥杯ALGO-13 算法训练 拦截导弹
  10. python tkinter获取屏幕大小_用 Python 制作关不掉的端午安康弹窗
  11. 1概率论与数理统计_浙江大学B站
  12. JNI_OnLoad
  13. java之split用法注意
  14. dns服务期搭建使用_DNS服务器搭建
  15. HDU_1198 Farm Irrigation(并查集)
  16. The program ‘roscore‘ is currently not installed 解决办法
  17. lopatkin俄大神精简中文系统Windows 8.1 Pro 18655 x86-x64 ZH-CN PIP
  18. 使用Adobe Fireworks CS6压图
  19. 软件测试基本流程与方案(以电商大促为例)
  20. 高手需要具备的思维模型

热门文章

  1. Android学习之布局管理器嵌套
  2. 线程池ThreadPoolExcutor的使用
  3. 织梦php版本图片不能上传,织梦Dedecms会员中心无法上传图片的解决方法
  4. Linux kms 模式设置,linux – 使用KMS设置控制台视频分辨率
  5. python函数参数的作用是_python函数参数的不同
  6. npm ERR! command failednpm ERR! command C:\WINDOWS\system32\cmd.exe /d /s /c node-gyp rebuild
  7. init 0-6 这几个启动级别都代表什么意思
  8. wxpython 调用子窗口_wxpython简介
  9. KVM 管理与使用说明
  10. 【scala初学】scala IDE eclipse