背景:
1.对共享数据的并发访问可能导致数据的不一致性。
2.要保持数据的一致性,就需要一种保证并发进程正确执行顺序机制。
3.解决有界缓冲区问题的共享内存方法在count上存在竞争条件。
4.进程间的制约关系:
——间接制约:有些资源需要互斥使用。
——直接制约:一个进程运行到某一点是需要另一伙伴进程为它提供消息。

对于临界资源,多个进程必须互斥对它们的访问。
临界区:进程中访问临界资源的一段代码。
——实现进程对临界资源的互斥访问:各进程互斥的进入自己的临界区。
——当一个进程在临界区执行的时候,其他进程都不能进入临界区。
——临界区的访问过程:
1.进入区
2.退出区
3.剩余区

entry section
critical section
exit section

解决临界区问题的方案:
1.互斥
2.有空让进
3.有限等待

同步机制应该遵循的准则:
1.空闲则入
2.忙则等待
3.有限等待
4.让权等待

[硬件方法]
许多系统对临界区代码提供硬件支持:
——单处理器能够禁止中断,当前执行的指令不被抢占,但对于多处理器不适用。
——特殊的硬件指令:原子执行,因而保证读写操作不被中断。
Test-and-Set(Ts)指令 和 SWAP指令

利用TS指令:
boolean TS(boolean *lock){
boolean old;
old = *lock;
*lock = True;
return old;
}
应用:为每个临界资源设置一个公共布尔变量lock,初值为FALSE;
while( TS(&lock) );
critical section
lock = FALSE;
remainder section

利用SWAP指令:
应用:为每个临界资源设置一个公共布尔变量lock,初值为FALSE,每个进程设置一个私有布尔变量key。
key = TRUE;
do{SWAP(&lock,&key);}
while(key);
critical section
lock = FALSE;
remainder section

硬件方法优点:
1.适用于任意数目的进程,在单处理器或多处理器上

2.简单,容易验证其正确性。
3.可以支持进程内存在多个临界区,只需为每个临界区设立一个布尔变量

硬件方法缺点:
1.等待要耗费CPU时间,不能实现"让权等待"。
2.可能"饥饿":从等待进程中随机选择一个进入临界区,有的进程可能一直选不上。
3.可能死锁

信号量(Semaphore)
——信号量代表可用资源实体的数量。
——除了初始化之外,仅能通过两个不可分割的[原子]操作访问
P(S):while S<=0 do no-op;
S--;
V(S):S++;

存在忙等——自旋锁:进程在等待时自旋。

一种不需要忙等的实现方式:
P(S):
S--;
if(S < 0) do block;

V(S):
S++;
if(S <= 0) do wake-up;

信号量只能通过初始化和两个标准的原语来访问--作为OS核心代码执行,不受进程调度的打断

初始化指定一个非负整数值,表示空闲资源总数。
使用信号量描述互斥关系(初值为1)和前驱关系(初值为0)。

死锁 – 两个或多个进程无限期地等待一个事件的发生,而该事件正是由其中的一个等待进程引起的。
饥饿 – 无限期地阻塞。进程可能永远无法从它等待的信号量队列中移去。

生产者消费者问题:若干进程通过有限的共享缓冲区交换数据。其中,"生产者"进程不断写入,而"消费者"进程不断读出;共享缓冲区共有N个;任何时刻只能有一个进程可对共享缓冲区进行操作。

——每个进程中各个P操作的次序是重要的,先检查资源数目,再检查是否互斥――否则可能死锁。

生产者:
P(empty)
P(mutex)
one unit -> buffer
V(mutex)
V(full)

消费者
P(full)
P(mutex)
one unit <- buffer
V(mutex)
V(empty)

读者-写者问题
信号量机制:
信号量:Wmutex[允许写],初值为1
公共变量:Rcount[正在读的进程数],初值为0
信号量:Rmutex[表示对Rcount的互斥操作],初值为1

Writer:
P(Wmutex);
write;
V(Wmutex);

Reader:
P(Rcount);
if(Rcount == 0) P(Wmutex);
++Rcount;
V(Rmutex);
read;
R(Rmutex);
--Rcount;
if(Rcount == 0) V(Wmutex);
V(Rmutex);

信号量的物理含义: 
 S>0表示有S个资源可用
      
 S=0表示无资源可用
      
 S<0则| S |表示S等待队列中的进程个数
      
 P(S):表示申请一个资源 
      
 V(S):表示释放一个资源
      
 信号量的初值应该大于等于0

PV操作需要注意的地方:
PV操作必须成对出现
有一个P操作就一定有一个V操作

当为互斥操作时,它们处于同一进程

当为同步操作时,则不在同一进程中出现

对于前后相连的两个P(S1)和P(S2) ,顺序是至关重要的:同步P操作应该放在互斥P操作前,而两个V操作顺序则无关紧要

AND型信号量集:AND型信号量集用于同时需要多种资源且每种占用一个时的信号量操作。
基本思想:在一个原语中,将一段代码同时需要的多个临界资源,要么全部分配给它,要么一个都不分配。
——P原语变成了Swait(S1,S2,...,Sn)
——当某些资源不够时:进程进入第一个小于1的信号量的等待队列Sj.queue;阻塞调用进程。

——V原语变成了Signal(S1,S2,...,Sn)
——判断等待队列中的进程是否重新通过了检查,若通过了检查则把他们放回就绪队列。
——哲学家就餐解法
Swait (chopstick[(I+1) mod 5],chopstick[I]);
Eat;
Ssignal (chopstick[(I+1) mod 5],chopstick[I]);

——生产者消费者采用AND信号量集
Swait(empty,mutex);
Ssignal(full,mutex);

一般信号量集:一般信号量集用于同时需要多种资源、每种占用的数目不同、且可分配的资源还存在一个临界值时的处理;
基本思想:在AND型信号量集的基础上进行扩充:进程对信号量Si的测试值为ti(用于信号量的判断,即Si >= ti,表示资源数量低于ti时,便不予分配),占用值为di(用于信号量的增减,即Si = Si - di和Si = Si + di)

Swait(S1, t1, d1; ...; Sn, tn, dn);

Ssignal(S1, d1; ...; Sn, dn);

一般“信号量集”的几种特殊情况:

Swait(S, d, d)表示每次申请d个资源,当少于d个时,便不分配;

Swait(S, 1, 1)表示互斥信号量;
Swait(S, 1, 0)作为一个可控开关

一般信号量集未必成对使用Swait和Ssignal:如:一起申请,但不一起释放;

信号量机制的缺点:
1.同步操作分散
2.易读性差
3.不利于修改和维护
4.正确性难以保证

管程(Monitors):管程是关于共享资源的数据结构及一组针对该资源的操作过程所构成的软件模块。
——基本思想:把信号量及其操作原语封装在一个对象内部。即:将共享变量以及对共享变量能够进行的所有操作集中在一个模块中。
——优点:引入管程可提高代码的可读性,便于修改和维护,正确性易于保证。
——任一时刻在管程中只有一个线程是能运行的。

管程的互斥:
——当进程需要访问管程中的临界资源的时候,可调用管程中的有关入口过程。
——但当几个进程都需调用某一管程的同一个或不同的入口过程时,仅允许一个进程调用进入管程,而其他调用者必须等待。 
入口等待队列:当一个进程试图进入一个已被占用的管程时它应当在管程的入口处等待,因而在管程的入口处应当有一个进程等待队列,称作入口等待队列。

条件变量:在管程机制中引起等待的原因很多,为了区别它们,引入了条件变量.
——每个条件变量表示一种等待原因,对应一个等待队列。

——例如:调用x.wait的线程将一直等待到有另一个线程调用x.signal。

操作系统复习笔记 07 Process Synchronization 进程同步相关推荐

  1. 操作系统复习笔记 04 Process 进程

    []进程的概念 1.进程是操作系统执行的各种程序. 2.现在的操作系统多为并发执行,具有许多新的特征.引入并发执行的目的是提高资源利用率. 3.OS的基本特征是[并发与共享]. 4.顺序环境计算机系统 ...

  2. 操作系统——Process Synchronization 进程同步

    目录​​​​​​​ 1. Background 背景 1.1 What is Process Synchronization? 什么是进程同步 1.2 Race condition 竞争条件 1.3 ...

  3. 操作系统复习笔记 02-03 OS Structure 操作系统结构

    02-03操作系统结构(OS_Structure) []陈述: 1.IO设备与CPU可并行运行. 2.每一个设备控制器负责一个设备类型. 3.每一个设备控制器有一个局部缓存. 4.CPU通过局部缓存与 ...

  4. 单处理机系统的进程调度动态优先_操作系统复习笔记(王道)C2.1

    进程与线程 一.进程特征和概念 前提:允许多个程序并发执行. 1.概念 PCB(process control block)进程控制块,系统利用 PCB 来描述进程的基本情况和运行状 态,进而控制和管 ...

  5. [个人笔记]操作系统复习笔记

    一 绪论 OS的作用 用户与硬件之间的接口 管理计算机资源 抽象计算机资源 OS的发展 单道批处理系统 用户程序交给监控程序,由监控程序控制作业一个接一个交给IO处理 CPU等待IO.内存浪费.资源浪 ...

  6. 操作系统复习笔记(四)

    10.司机和售票员之间要协同工作:一方面只有售票员把车门关好了司机才能开车,因此售票员关好车门应通知司机开车;另一方面只有当汽车已经停下时,售票员才能开门让乘客上下客,司机停车后应该通知售票员,假定某 ...

  7. 操作系统复习笔记 05 Thread 线程

    进程的两个基本属性 1.拥有资源的独立单位 2.可独立调度和分派的基本单位 进程的数目不宜过多,进程切换频率不宜过高,限制了并发程度. 操作系统的设计目标是:提高并发度.减小系统开销. 引入线程的目的 ...

  8. 操作系统复习笔记(二)

    1.问答题:有一个文件F,有A,B两组进程共享这个文件,同组的进程可以同时读文件F,但当有A组(或B组)的进程在读文件F时就不允许B组(或A组)的进程读, 解:定义两个计数器C1,C2,分别记录A组和 ...

  9. 操作系统复习笔记(五)

    14.从"互斥","空闲让进","有限等待"3个方面讨论它的正确性.若正确,则证明之.若不正确,说明理由. program sample; ...

最新文章

  1. 解决Android 加载大图片OOM
  2. mybatis oracle批量修改
  3. CSS基本选择器(元素选择器、类选择器、id选择器)
  4. Android adt 初步理解和分析(三)
  5. pythonsubprocess执行多条shell命令_python中subprocess批量执行linux命令
  6. 处理时间_1_对时间列进行加减
  7. python基础===PEP网站,代码规范指南
  8. 适合手机端的ckeditor样式_抖音运营干货(三):9款手机视频剪辑APP,让你轻松玩转后期!...
  9. ActiveX控件打包成Cab置于网页中自动下载安装
  10. CCF 201312-3 最大的矩形[比较简单]
  11. Cygwin的进程管理
  12. 华为harmonyos官方微博账号,华为 EMUI 官方微信和微博更名为 HarmonyOS
  13. python ssim代码
  14. 关掉magiskhide_[讨论] Magisk隐藏root的实现
  15. 坐标系统和glMatrix(GLM)
  16. 方便的视频播放器-饺子播放器
  17. 部署无鱼工时系统,超详细教程,并成功部署
  18. Android Studio 卡在Download fastutil-8.4.0-sources jar以及New Module为灰色的问题及解决方法
  19. linux 每日学一点《用tar来备份ubuntu系统》
  20. BZOJ 3864: Hero meet devil (从dp性质实现dp套dp)

热门文章

  1. python 里什么时候缩进_python什么时候缩进
  2. java中file_详细介绍Java中的File类
  3. [Redis6]新数据类型_Geospatial
  4. 使用对偶表示重新实现Stack(lua程序设计21.7练习21.3题)
  5. Sumsets POJ - 2229(计数dp)
  6. c语言中如何使用面向对象编程,如何使用C语言的面向对象
  7. 机器学习理论引导 电子版_机器学习理论篇1:机器学习的数学基础(2)
  8. 堆初始化-二叉堆一般用数组来表示。例如,根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2-icoding-void init_min_heap(PMinHeap pq, int
  9. 深入理解 JVM Class文件格式(三)
  10. HDU - 6982 J - Road Discount wqs二分 + 模型转换 + 优化