linux之信号量,PV操作

Linux常用命令之pvs命令详解 pvs 命令是 LVM(Logical Volume Manager,逻辑卷管理器)工具集中的一个命令行工具,用于显示系统中所有物理卷 (Physical Volumes, PV) 的信息。 阅读详情

一、信号量是啥?PV操作是啥?

信号量用一句话来总结就是带有等待队列的计数器。信号量也就是对我们的临界资源进行计数。
就像我们去车站买票一样:
当取票机有票的时候,也就是资源计数 >0,那我们就可以直接取票,并且取票机的票数-1;
当取票机没有票的时候,也就是资源计数 <= 0,那我们就得等待取票机补上票,我们才能取票
当票机补一张票,资源计数也就+1,就是多了一份资源。

当信号量S > 0, S表示可用的临界资源数
当信号量S == 0,S表示目前无临界资源数,等待队列中无等待进程
当信号量S < 0, |S| 表示等待队列中的等待资源的进程个数

那么我们的PV操作又是啥?
P操作表示申请一份资源,申请了一份资源代表临界资源数就减少一份,信号量-1;也就是我们取了一张票
V操作表示释放一份资源,释放了一份资源代表临界资源数就增加一份,信号量+1;也就是补票机补了一张票
要注意:P 操作和 V 操作是搭配使用的,有 P 必有 V,有 V 必有 P

二、PV操作为啥是安全的?

为啥我们的PV操作没有加锁也不用考虑线程安全问题呢?
因为PV操作是原子性的。
P原语:

P(s)
{
	s.value = s.value--;
	if (s.value < 0)
	{
		该进程状态置为等待状状态
		将该进程的PCB插⼊相应的等待队列s.queue末尾
	}
}

V原语:

V(s)
{
	s.value = s.value++;
	if (s.value < =0)
	{
		唤醒相应等待队列s.queue中等待的⼀个进程
		改变其状态为就绪态
		并将其插⼊就绪队列
	}
}

三、啥是临界资源?啥是临界区?

临界资源(互斥资源):一次只允许一个进程使用的资源就是临界资源
临界区:在进程中涉及到临界资源的程序代码部分就是临界区
像我们的PV操作都是临界区,因为是对临界资源进行控制。

使用信号量就可以协调多个进程访问一份临界资源。保护临界资源的使用。任意时刻只能有一个线程进入临界区。


信号量其实就是由一个计数器和一个等待队列组成
信号量结构体:

struct semaphore
{
	int num;			//计数器
	pointer_PCB queue;	//等待队列
};

信号量集函数:
1、创建/访问一个信号量集

int semget(key_t key, int nsems, int semflg);
参数:
key:集合的名字
nsems:信号集中信号量的个数
semflg:由九个权限标志构成
返回值:成功返回该信号集的标识码;失败返回-1

2、控制信号量集

int semctl(int semid, int semnum, int cmd, …);
参数:
semid:由semget返回的信号集标识码
semnum:信号集中信号量的序号
cmd:将要采取的动作(有三个可取值)
最后⼀个参数根据命令不同⽽不同
返回值:成功返回0;失败返回-1

3、创建和访问一个信号量集

int semop(int semid, struct sembuf *sops, unsigned nsops);
参数:
semid:是该信号量的标识码,也就是semget函数的返回值
sops:是个指向⼀个结构数值的指针
nsops:信号量的个数
返回值:成功返回0;失败返回-1

sops指向的结构体

struct sembuf {
	short sem_num;	//信号量的标识码,也就是semget返回值
	short sem_op;	//PV操作
	short sem_flg;	//两个取值IPC_NOWAIT或SEM_UNDO
};

sem_op:
① 如果其值为正数,该值会加到现有的信号内含值中。通常用于释放所控资源的使用权;
② 如果sem_op的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信号值大于或等于sem_op的绝对值。通常用于获取资源的使用权;
③ 如果sem_op的值为0,则操作将暂时阻塞,直到信号的值变为0。
sem_flg:
IPC_NOWAIT:对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信息。
SEM_UNDO:程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值。这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。


信号量的生命周期随内核。
我们来看看信号量的实际应用。子进程打印AA,父进程打印BB,正常情况打印出什么?如果没有PV操作打印出什么?

comm.h

#ifndef __COMM_H_
#define __COMM_H_

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>

#define PATHNAME "."
#define PROJ_ID 0x6666

union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short *array;
    struct seminfo *__buf;
};

int createSemSet(int nums);
int initSem(int semid, int nums, int initVal);
int getSemSet(int nums);
int P(int semid, int who);
int V(int semid, int who);
int destroySemSet(int semid);

#endif

comm.c

#include "comm.h"
static int commSemSet(int nums, int flags)
{
    key_t _key = ftok(PATHNAME, PROJ_ID);
    if(_key < 0){
		perror("ftok error");
		return -1;
    }
    int semid = semget(_key, nums, flags);
    if(semid < 0){
		perror("semget error");
		return -2;
    }
    return semid;
}

int createSemSet(int nums)
{
    return commSemSet(nums, IPC_CREAT|IPC_EXCL|0666);
}
int getSemSet(int nums)
{
    return commSemSet(nums, IPC_CREAT);
}
int initSem(int semid, int nums, int initVal)
{
    union semun _un;
    _un.val = initVal;
    if(semctl(semid, nums, SETVAL, _un)<0){
		perror("semctl error");
		return -1;
    }
    return 0;
}
static int commPV(int semid, int who, int op)
{
    struct sembuf _sf;
    _sf.sem_num = who;
    _sf.sem_op = op;
    _sf.sem_flg = 0;
    if(semop(semid, &_sf, 1) < 0){
		perror("semop error");
		return -1;
    }
    return 0;
}
int P(int semid, int who)
{
    return commPV(semid, who, -1);
}
int V(int semid, int who)
{
    return commPV(semid, who, 1);
}
int destroySemSet(int semid)
{
    if(semctl(semid, 0, IPC_RMID) < 0){
		perror("semctl error");
		return -1;
    }
}

test_sem.c

#include "comm.h"

int main()
{
    int semid = createSemSet(1);
    initSem(semid, 0, 1);
    pid_t id = fork();
    if(id == 0){
	//child
	int _semid = getSemSet(0);
	while(1){
	    P(_semid, 0);
	    printf("A");
	    fflush(stdout);
	    usleep(123456);
	    printf("A ");
	    fflush(stdout);
	    usleep(321456);
	    V(_semid, 0);
	}
    }
    else{
	//father
	while(1){
	    P(semid, 0);
	    printf("B");
	    fflush(stdout);
	    usleep(223456);
	    printf("B ");
	    fflush(stdout);
	    usleep(121456);
	    V(semid, 0);
	}
	wait(NULL);
    }
    destroySemSet(semid);
    return 0;
}

此时,显示器只有一个,两个进程同时打印,显示器成为临界资源,使用二元信号量进行保护。
结果如下:
在这里插入图片描述
如果没有PV操作打印就会乱序
在这里插入图片描述

在我们重新运行的时候会出现如下问题:
在这里插入图片描述
这是因为我们的信号量已经被创建。我们可以使用 ipcs -s 查看,然后使用ipcrm -s 删除即可
在这里插入图片描述

Linux学习之PV操作及信号量 文章目录学习Linux信号量及P, V操作 实例代码一. 利用信号量实现进程互斥实例二. 利用信号量实现进程同步三. 生产者,消费者同步问题1. 问题分析 :2. 同步算法 :3. 主程序实现算法四. 一家四口吃水果的同步问题 学习Linux信号量及P, V操作 实例代码 一. 利用信号量实现进程互斥实例 设有父子两个进程共享一个临界资源, 每个进程循环进入该临界资源3次,父进程每次进入临界区... 阅读详情

相关推荐

在Kintex-7 FPGA上实现皮秒级时间测量:手把手教你搭建CARRY4进位链TDC(附源码与约束)

本文详细介绍了在Kintex-7 FPGA上利用CARRY4进位链实现皮秒级时间测量(TDC)的完整方案。从CARRY4的物理特性分析到硬件架构设计,再到校准方法与精度提升技巧,手把手教你构建测量精度达53ps的TDC系统,并附源码与约束文件,助力激光雷达、高能物理等精密计时应用开发。

weixin_42550052的博客 444

Linux磁盘分区中物理卷(PV)、卷组(VG)、逻辑卷(LV)创建和(LVM)管理

Linux磁盘分区中物理卷(PV)、卷组(VG)、逻辑卷(LV)创建和(LVM)管理

oldboy1999的博客 2万+

OpenWRT端口转发与NAT环回冲突的排查与解决

本文详细解析了OpenWRT路由器中端口转发与NAT环回功能冲突导致的内网访问故障。通过生活化类比阐明两者工作原理,提供从基础诊断到内核参数调整、LuCI选项配置及手动编写iptables规则的多套解决方案,并给出进阶排查思路,帮助用户彻底解决内网无法通过公网地址访问服务的常见问题。

weixin_29243279的博客 506

【操作系统原理】—— 信号量与PV操作实现

信号量是一个计数器,表示可用资源的数量。信号量的值可以是任意非负整数。在多线程或多进程环境中,信号量用于控制对共享资源的访问。 PV 操作: P(Produce)操作: 也称为 Wait 操作。执行 P 操作时,信号量的值减一,表示占用了一个资源。如果信号量的值为负数,表示资源不足,执行 P 操作的线程或进程将被阻塞,直到有足够的资源。 V(Vaporize)操作: 也称为 Signal 操作。执行 V 操作时,信号量的值加一,表示释放了一个资源。如果有其他线程或进程正在等待资源,

ZShiJ的博客 1252

GEE聚类分析:基于sentinel-2 影像进行 K-Means 聚类分析

这篇博客介绍了如何使用 Google Earth Engine (GEE) 进行 K-Means 聚类分析,以识别感兴趣区域(ROI)内的不同地表覆盖类型。文章详细说明了从定义用户参数、准备参考区域、加载和预处理 Sentinel-2 图像,到训练 K-Means 聚类器并对图像进行聚类的完整流程。代码示例展示了如何设置参数、采样像素数据、训练聚类器,并将结果可视化。最后,还提供了将聚类结果导出到 Google Drive 的选项。通过该教程,用户可以掌握在 GEE 平台上进行地理数据聚类分析的基本方法。

此星光明博客 263

[Unity开发] [PICO]避坑指南:PICO商店上传APP时PXR Platform APPID设定详解

PICO开发者上传Unity应用时常见的"APPID不符"问题,主要源于混淆了开发者后台两个不同位置的APPID。

每日出拳老爷子的博客 555

物理卷操作命令:pvcreate,pvscan,pvdisplay.卷组操作命令:vgcreate,vgdisplay. (转)

新硬盘创建LVM系统过程。 物理卷操作命令:pvcreate,pvscan,pvdisplay. 卷组操作命令:vgcreate,vgdisplay. 逻辑卷操作命令:lvcreate,lvdisplay.   Linx卷管理详解 VG LV PV 作者:吴伟龙   一、 前言 每个Linux使用者在安装Linux时 都会遇到这样的困境:在为系统分区时,如何精确评估和分配各...

weixin_33737774的博客 2234

无线通信基础:调制与解调技术_(42).7.3.2多进制频移键控解调(MFSK解调)

MFSK解调是一种通过频谱分析和频率检测来恢复数字信号的技术。本文介绍了MFSK解调的基本原理,包括信号接收、频谱分析、频率检测和符号判决。在实际应用中,噪声会对解调性能产生影响,因此引入了信噪比优化和多步判决方法来提高解调的准确性。通过性能评估,可以更好地理解MFSK解调在不同噪声环境下的表现。这些方法和技术为MFSK在实际通信系统中的应用提供了理论和实践基础。

2401_87715305的博客 1316

【Linux】信号量

信号量本质是一个计数器,如果将信号量的初始值设置为1,那么此时该信号量叫做二元信号量,信号量的初始值为1,说明信号量所描述的临界资源只有一份,此时信号量的作用基本等价于互斥锁。1)多个执行流为了访问临界资源会竞争式的申请信号量,因此信号量是会被多个执行流同时访问的,也就是说信号量本质也是临界资源。当执行流在申请信号量时,可能此时信号量的值为0,也就是说信号量描述的临界资源已经全部被申请了,此时该执行流就应该。信号量的本质是计数器,但不意味着只有计数器,信号量还包括一个等待队列。

chuxinchangcun的博客 1478

pytorch搭建SSAE实现预测分类代码模板完整代码

pytorch搭建SSAE实现预测分类代码模板完整代码

323

诊断测试工具CANoe.DiVa从入门到精通系列——开门见山

### 工具主要用于测试ECU的诊断功能。关于自动化诊断测试可以分为如下内容: ### -> 1、根据诊断需求规范进行cdd文件的编辑(现阶段主要是诊断问卷调查表); ### -> 2、新建Diva工程,导入对应的诊断数据库文件生成测试用例; ### -> 3、新建CANoe工程,导入CANoe.DiVa生成的Diva工程; ### -> 4、根据测试报告进行错误处理。

Soly_kun的博客 3546

Linux 信号量PV操作

进程、信号量、PV操作

2301_80754203的博客 1294

Android P车机添加屏幕多指全局自定义手势操作

参照原生状态栏全局下拉手势拦截,实现屏幕全局多指手势响应操作,并对手势进行转换为KeyEvent,以便项目自定义手势行为或应用拦截手势行为。

shusuanly的博客 1251

Linux下使用信号量实现PV操作

信号量不仅是一种进程之间的通信机制,与此同时,信号量的使用,可以有效的解决进程间的同步与互斥问题。信号量的PV操作是实现进程间的同步和互斥的核心工作部分。

zhongcaogen的专栏 1380

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

学习笔记——操作系统_PV操作与Linux内核信号量

这篇文章参考了如下内容: http://wenku.baidu.com/view/42a5704ccf84b9d528ea7ac0.html http://wenku.baidu.com/view/71d778fafab069dc502201bc.html http://zhwen.org/xlog/?p=165 http://blog.chinaunix.net/uid-21

wahaha_nescafe的专栏 1948

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Linux信号量PV操作

Linux信号量PV操作 semop操作中:sembuf结构的sem_flg成员可以为0、IPC_NOWAIT、SEM_UNDO 。为SEM_UNDO时,它将使操作系统跟踪当前进程对这个信号量的修改情况,如果这个进程在没有释放该信号量的情况下终止,操作系统将自动释放该进程持有的 semop操作中:sembuf结构的sem_flg成员可以为0、IPC_NOWAIT、SEM...

weixin_34278190的博客 126

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

linux pv 信号量,Linux信号量PV操作

1://假设两个进程(父子进程)对一个文件进行写操作,但是这个文件同一时间只能有一个进程进行写操作。2://利用信号量实现pv操作3:#include 4:#include 5:#include 6:#include 7:#include 8:#include 9:struct sembuf sops;10:static int sid;11://创建一个新的信号量集12:int createSe...

weixin_42499899的博客 1092

linux信号量与PV操作知识点总结

linux信号量与PV操作知识点总结

wei_Embedded_z的博客 1383

Linux用信号量实现PV操作,生产者消费者实验

具体来说,生产者在生产物品时,需要先等待`empty`信号量,然后获取`mutex`信号量对缓冲区进行访问,生产完成后更新缓冲区状态,并通过V操作释放`mutex`和`full`信号量;消费者在消费物品时,需要先等待`full`信号量,然后获取`mutex`信号量对缓冲区进行访问,消费完成后释放`mutex`和`empty`信号量。`empty`信号量用于表示缓冲区中的空槽数量,`full`信号量用于表示缓冲区中的满槽数量,`mutex`信号量用于实现互斥访问缓冲区。

weixin_45168542的博客 872

linux信号量原理,linux 信号量机制,共享内存实现PV操作.doc

linux 信号量机制,共享内存实现PV操作#include #include #include #include #include #include #include #include #include static int semaphore_p(void); //p 操作函数static int semaphore_v(void); //v 操作函数static int set_...

weixin_30976201的博客 225

Linux IPC 信号量:PV原语,PV操作,函数semget,函数semop、函数semctl、生产者和消费者模型

Linux IPC 信号量什么是信号量信号量的分类原语信号量PV操作的原语描述P原语(申请资源)操作V原语(释放资源)操作PV原语的执行顺序PV原语如何实现互斥访问System V IPC:信号量函数 semget()函数semop()函数semctl()生产者和消费者模型 什么是信号量 信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。信号量是进程/线程同步的一种方式。 有...

CLZHIT的博客 1959

Linux基础(四)——信号量与PV操作

在计算机操作系统中,PV操作是进程管理中的难点。1、基本含义      什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。      PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程)...

lixiangsheng2012的博客 5868

linux pv 信号量,pv操作与信号量

例如,P1和P2是分别将数据送入缓冲B和从缓冲B读出数据的两个进程,为了防止这两个进程并发时产生错误,狄克斯特拉设计了一种同步机制叫“PV操作”,P操作和V操作是执行时不被打断的两个操作系统原语。执行P操作P(S)时信号量S的值减1,若结果不为负则P(S)执行完毕,否则执行P操作的进程暂停以等待释放。执行V操作V(S)时,S的值加1,若结果不大于0则释放一个因执行P(S)而等待的进程。对P1和P2...

weixin_39889792的博客 320
上一篇: ipcs 和 ipcrm 了解
下一篇: [Linux] IPC共享内存
coolnut12138
博客等级 码龄9年 51粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值