【操作系统原理】信号量及PV操作详解
信号量
- 一个特殊变量
- 用于进程间传递信息的一个整数值
定义如下:
struct semaphore
{
int count;
quenue Type quenue;
}
- 信号量说明:semaphore s;
- 对信号量可以实施的操作:初始化、P和V(P、V分别是荷兰语的test(proberen)和increment(verhogen))
P、V操作定义
P(s)
{
s.count --; //信号量值减一
if(s.count<0)
{
该进程状态置为阻塞态;
将该进程插入相应的等待队列s.quenue末尾;
重新调度
}
}
down
,semwait
:也代表P操作
V(s)
{
s.ount++;
if(s.count<=0)
{
唤醒相应等待队列s.queue中等待的一个进程;
改变其状态为就绪态,并将其插入就绪队列;
}
}
up
,semsignal
:也代表V操作
相关说明
- P,V操作为原语操作
- 在信号量上定义了三个操作
初始化(非负数)、P操作、V操作- 最初提出的是二元信号量(解决互斥)
之后,推广到一般信号量(多值)或技术信号量(解决同步)
用PV操作解决进程间互斥问题
- 分析并发进程的关键活动,划定临界区
- 设置信号量mutux,初值为1
- 在临界区前实施P(mutux)
- 在临界区之后实施V(mutux)
相关解释:
-
临界区
: 我们把并发进程中与共享变量有关的程序段称为临界区。 -
信号量
: 信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。 -
进程的互斥
:是指当有若干个进程都要使用某一共享资源时,任何时刻最多只允许一个进程去使用该资源,其他要使用它的进程必须等待,直到该资源的占用着释放了该资源。 -
进程的同步
:是指在并发进程之间存在这一种制约关系,一个进程依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒。 -
pv操作又称wait,signal原语。
主要是操作进程中对进程控制的信息量的加减控制。
注意:
在霍尔管程中,wait操作
和signal操作
用于被设计为两个可以中断的过程,而非原语。
在管程中,引入一种数据结构—条件变量(仅在管程中可以被访问)。
条件变量的两种操作:
- wait()操作[阻塞调用进程]
- signal()操作[释放/唤醒在条件变量上阻塞的进程]
- wait用法:
wait(num),num是目标参数,wait的作用是使其(信息量)减一。
如果信息量>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
signal用法:
signal(num),num是目标参数,signal的作用是使其(信息量)加一。
如果信息量>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
本文资源来自 Operating Systems
参考: 操作系统P,V(wait,signal原语)操作讲解
Laity0312: 你好,我搭建matter环境git clone的时候总会出现很多类似这样的报错: “fatal: 无法访问 'https://jihulab.com/esp-mirror/nayuki/QR-Code-generator.git/':gnutls_handshake() failed: The TLS connection was non-properly terminated. fatal: 无法克隆 'https://github.com/nayuki/QR-Code-generator.git' 到子模组路径 '/home/wzh/esp/esp-matter/connectedhomeip/connectedhomeip/examples/common/QRCode/repo' 克隆 'examples/common/QRCode/repo' 失败。按计划重试” 请问是为什么呢?
m0_65881385: mac安装子模块老是出问题
ei南方男孩: 博主你好, 请问你使用chip-tool为设备配网时有遇到过这种错误吗? Device 5A:9E:08:66:3A:26 does not look like a CHIP device. [1723017113.422404][112890:112891] CHIP:BLE: Device 71:C7:AF:24:94:D9 does not look like a CHIP device. [1723017113.429852][112890:112891] CHIP:BLE: Device 45:ED:13:41:04:BE does not look like a CHIP device. [1723017113.436376][112890:112891] CHIP:BLE: New device scanned: DD:CD:80:D3:DF:64 [1723017113.436407][112890:112891] CHIP:BLE: Device discriminator match. Attempting to connect. [1723017113.484313][112890:112891] CHIP:BLE: ChipDeviceScanner has stopped scanning! [1723017115.698218][112890:112891] CHIP:DL: FAIL: ConnectDevice: GDBus.Error:org.bluez.Error.Failed: Software caused connection abort (36) [1723017115.698249][112890:112891] CHIP:DL: ConnectDevice retry: 1 out of 4 [1723017117.228383][112890:112891] CHIP:DL: FAIL: ConnectDevice: GDBus.Error:org.bluez.Error.Failed: Software caused connection abort (36) [1723017117.228422][112890:112891 [code=plain] [/code][code=plain] [/code]
以放_: 这套组件我还在更新呢,可以把你的疑问后台留言给我
背月台后的影子: 佬4.4不是很懂,找到了配置的地方但是和你的完全不一样,想和你请教一下