同步和互斥

进程同步,进程互斥

①进程同步:解决进程的异步问题,协调工作顺序。

②进程互斥对于临界资源,必须互斥地进行访问。

临界资源(临界区):一个时间段内只允许一个进程使用的资源。

image-20260407120649222

实现互斥的四个逻辑部分:

进入区。临界区。退出区。剩余区。

image-20260407115928870

实现互斥遵循的四个原则:

空闲让进。忙则等待。有限等待。让权等待。

image-20260407120115888

回顾

image-20260407120223745


进程互斥的软件实现方法

image-20260407120546922

①单标志法

image-20260407121033219

缺点:允许进入临界区的进程P0不访问临界区,此时临界区空闲,但是别的进程如P1使用不了临界区。

image-20260407121219452

②双标志先检查法

先“检查”后“上锁”

先检查对方想不想使用(检查)

对方不想使用的话,自己要用(表达意愿,上锁)

image-20260407121408670

缺点:

如果两个进程是,并发的运行(时间片切换),【1-5-6-7,后切换2-3】会造成两个进程P1P2同时使用临界区。

image-20260407123227427

③双标志后检查法

先“上锁”后“检查”。

自己想用临界资源(表达意愿,上锁)

自己不想再问对方。(检查)

image-20260407122058835

缺点:

并发运行,两个进程都访问不了临界区。【1-5-2-6-wait…】

image-20260407123511019

④peterson 算法

1.主动争取

2.主动谦让

3.如果对方也想使用。且是最后一次是自己说了客气话,则让对方进入临界区。

image-20260407130332695

优点:遵循了空闲让进,忙则等待,有限等待三个原则。

缺点:没有遵循让权等待的原则。

回顾

image-20260407130605883

进程互斥的硬件实现方法

image-20260407130917923

①中断屏蔽方法

优点:简单,高效

缺点:不适合多处理机。只适用于OS内核进程。(开/关中断指令只能运行在内核态,给用户随意使用很危险)

image-20260407133335255

②TestAndSet指令

TSL指令,硬件实现的,执行间不能被打断。

检查与上锁是一体的。

image-20260407131845334

③swap指令

类似于TSL指令。

image-20260407132030461

回顾

image-20260407132113604

进程互斥的高级方法

互斥锁

【还有信号量,管程,条件变量等】

上锁:acquire()

解锁:release()

互斥锁主要缺点是:忙等。

image-20260407132532334

自旋锁:需要连续循环忙等的互斥锁。

自旋锁的底层实现:可以是TSL指令,swap指令,单标志法。

自旋锁的特点:

​ 自旋锁适用于临界区极短且多处理器的场景;

​ 如果临界区较长或单处理器,应使用阻塞型互斥锁。

image-20260407133846426

信号量机制

image-20260407185832865

image-20260407190247339

整型信号量

原理:和双标志先检查后上锁相同。但是实现了 检查和上锁 一气呵成。(避免进程同时在临界区的问题)

缺点:不满足“让权等待”,会发生忙等。

image-20260407191021773

记录型信号量⭐

原理:S. value表示剩余资源数,S.L指向等待资源的队列。

优点:遵循了“让权等待”原则(解决了“忙等”的问题)

image-20260407191510154

image-20260407192540826

EG

image-20260407192154533

image-20260407192300498

回顾

image-20260407192710692

用信号量机制实现进程互斥、同步、前驱关系

P(s) – 申请一个进程S,如果资源不够就阻塞等待

V(s) – 释放一个资源S,如果有进程在等待该资源,则唤醒一个进程。

image-20260407193006251

实现进程互斥

信号量初始值为1。

临界区之前对信号量执行P操作

临界区之后对信号量执行V操作

image-20260407193439280

实现进程同步

同步:保证顺序执行。

信号量初始值为0。

临界区之前对信号量执行V操作。

临界区之后对信号量执行P操作。

image-20260407194247598

实现前驱关系

有多少个资源,信号量初始值就为多少。

前V后P。

image-20260407194634672

回顾

进程同步互斥问题

生产者消费问题

image-20260407200124695

image-20260407200559910

不能改变相邻P操作的顺序:会造成死锁(生产者和消费者都在等待对方释放资源,出现“死锁”)

  • 因此实现互斥的P操作一定要在实现同步P操作之后。

可以改变相邻V操作的顺序,不会造成进程阻塞。

不建议把处理内容都放入临界区,会造成临界区上锁时间长。

image-20260407201147190

回顾

image-20260407201312529

多生产者-多消费者