当前位置: 首页 > news >正文

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

信号量
信号量(semaphore) 与已经介绍过的 IPC 结构不同,它是一个计数器,信号量用于实现进程间的与斥与同步,而不是用于存储进程间通信数据。
1、特点
(1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存
(2)信号量基于操作系统的 PV 操作,程序对信号量的操作都是原了操作。
(3)每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数
(4)支持信号量组
2、原型
最简单的信号量是只能取 0和 1 的变量,这也是信号量最常见的一种形式,叫做二值信号量(Binary Semaphore) 。而可以取多个正整数的信号量被称为通用信号量。
Linux 下的信号量函数都是在通用的信号量数组上进行操作,而不是在一个单一的二值信号量上进行操作。

头文件:

1 #include <sys/sem.h>
2 // 创建或获取一个信号量组: 若成功返回信号量集ID,失败返回-1

3 int semget(key_t key, int nsems, int semflg);

4 // 对信号量组进行操作,改变信号量的值: 成功返回0,失败返回-1

5 int semop(int semid, struct sembuf *sops, unsigned nsops);
6 // 控制信号量的相关信息
7 int semctl(int semid, int semnum, int cmd, ...);

PV操作(P可看作拿锁,V看作放回锁)

PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:

    P(S):①将信号量S的值减1,即S=S-1;                                                             
           ②如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
    V(S):①将信号量S的值加1,即S=S+1;                                                           
           ②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
 利用信号量和PV操作实现进程互斥的一般模型是:


    进程P1              进程P2           ……          进程Pn
    ……                  ……                           ……
    P(S);              P(S);                         P(S);
    临界区;             临界区;                        临界区;
    V(S);              V(S);                        V(S);
    ……                  ……            ……           ……


使用PV操作实现进程互斥时应该注意的是:

    (1)每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
    (2)P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
    (3)互斥信号量的初值一般为1。


临界资源(临界区)

多道程序系统中存在许多进程,它们共享各和资源,然而有很多资源一次只能供一个进程使用。一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如输入机、打印机、磁带机等。

示例:fork一个进程不知道父进程还是子进程先运行(都有可能),那么我们可以通过信号量与PV操作来控制让子进程先运行

编译结果:

(代码可复制):

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
//int semget(key_t key, int nsems, int semflg);
//int semctl(int semid, int semnum, int cmd, ...);
//int semop(int semid, struct sembuf *sops, unsigned nsops);

union semun {
               int              val;    /* Value for SETVAL */
               struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
               unsigned short  *array;  /* Array for GETALL, SETALL */
               struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                           (Linux-specific) */
};

void pGetKey(int id)
{
    struct sembuf set;

    set.sem_num = 0;
    set.sem_op = -1;
    set.sem_flg=SEM_UNDO;

    semop(id,  &set ,1);
    printf("getkey\n");
}

void vPutBackKey(int id)
{
    struct sembuf set;

    set.sem_num = 0;
    set.sem_op = 1;
    set.sem_flg=SEM_UNDO;

    semop(id,  &set ,1);
    printf("put back the key\n");
}

int main(int argc, char const *argv[])
{
    key_t key;
    int semid;

    key = ftok(".",2);
                       //信号量集合中有一个信号量  
    semid = semget(key, 1, IPC_CREAT|0666);//获取/创建信号量

    union semun initsem;
    initsem.val = 0;
                  //操作第0个信号量   
    semctl(semid, 0, SETVAL, initsem);//初始化信号量
                  //SETVAL设置信号量的值,设置为inisem
                  
                  
    int pid = fork();
    if(pid > 0){
        //去拿锁
    pGetKey(semid);
        printf("this is father\n");
    vPutBackKey(semid);
        //锁放回去
    semctl(semid,0,IPC_RMID);
    }
    else if(pid == 0){
        printf("this is child\n");
    vPutBackKey(semid);
    }else{

        printf("fork error\n");
    }            


    return 0;
}
 

相关文章:

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

信号量 信号量(semaphore) 与已经介绍过的 IPC 结构不同&#xff0c;它是一个计数器&#xff0c;信号量用于实现进程间的与斥与同步&#xff0c;而不是用于存储进程间通信数据。 1、特点 &#xff08;1&#xff09;信号量用于进程间同步&#xff0c;若要在进程间传递数据需要结…...

6-python中的string类型

目录 内容提要字符串截取python的转义字符 \python的字符串格式化format()的参数format()的数字格式化 字符串常用函数count()函数endwith()函数 与 startwith()函数find()函数与index()函数find()函数 ⭐index()函数 判断字符串内的字符种类函数isalnum()函数isalpha()函数isd…...

Windows系统内核溢出漏洞提权

目录 Windows内核溢出漏洞原理 溢出漏洞简介 什么是缓冲区 缓冲区溢出 缓冲区溢出目的 Windows内核溢出漏洞利用流程 提权实战思路 手工提权测试 辅助提权 EXP如何寻找 使用MSF提权 关于提权时可能遇到的问题 如果提权的时候发现无法执行命令的话&#xff0c;可以上…...

BlackIce病毒分析

概述 blackice是一个古老的感染型病毒&#xff0c;可感染系统中exe、doc和xls文件&#xff0c;通过USB设备和网络驱动器来传播&#xff0c;会向C&C下载pe执行&#xff0c;会关闭常用的杀软进程。下面找了一个样本&#xff0c;这个样本的代码结构清晰&#xff0c;用IDA pro…...

软件测试基础知识整理(八)- 软件缺陷

目录 一、软件缺陷 1.1 缺陷定义 1.2 缺陷判定标准 1.3 软件缺陷产生的原因 1.4 软件缺陷产生的根源 1.5 软件缺陷信息 1.5.1 缺陷状态 1.5.2 缺陷严重程度 1.5.3 缺陷优先级 1.6 缺陷报告模板 1.7 缺陷报告注意事项 1.8 缺陷跟踪流程 1.9 缺陷数据分析关注的问题 …...

有没有想过一种可能,30岁之后,转行去做IT售前?

灵魂拷问 IT行业的变化是非常迅速的&#xff0c;各种新技术、新产品、新观念、新的业务模式层出不穷&#xff0c;不仅是我们&#xff0c;客户也在不断地学习进步&#xff0c;因此我们注定要终身学习。 IT售前这个岗位为许多IT职场人提供了一种新的选择: 你不需要成为某一方面…...

基于决策树的Ensemble方法在边缘计算中的应用

随着物联网的普及&#xff0c;边缘计算已成为一种重要的技术手段。在边缘计算中&#xff0c;数据的处理和分析都是在设备端进行的&#xff0c;而不是通过云端进行。这种技术可以大大降低网络带宽和响应时间&#xff0c;从而提高了用户体验。但是&#xff0c;边缘设备通常受到计…...

golang常见导致panic的场景

1、越界 常见有数组越界和字符串越界 2、空指针引用 直接引用空指针结构体的字段会引发panic&#xff0c;但调用成员方法里如果没引用结构体的字段不会引发panic 3、断言失败 4、map操作错误 map未初始化&#xff0c;可读不可写。 map的value如果是结构体指针&#xf…...

Python 修改文件权限+只读后几行 can‘t do nonzero end-relative seeks

读后几行使用File Handle : seek 文件处理 # -*- coding: UTF-8 -*-# 打开文件 fo open("runoob.txt", "rw") print "文件名为: ", fo.nameline fo.readline() print "读取的数据为: %s" % (line)# 重新设置文件读取指针到开头 fo.…...

每日学术速递5.25

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Chupa: Carving 3D Clothed Humans from Skinned Shape Priors using 2D Diffusion Probabilistic Models 标题&#xff1a;Chupa&#xff1a;使用 2D 扩散概率模型从蒙皮形状先验雕…...

GAMES202作业1

目录 Shadow MapCalcLightMVP函数useShadowMap函数Bias函数 最终效果 PCF两个采样函数PCF函数最终效果 PCSSfindBlocker函数PCSS函数最终效果 参考 先放上公式&#xff1a; 后面的积分项是我们在作业0中就做好的blinnphong项&#xff0c;我们要求的就是积分项前&#xff0c;等…...

Android 12.0状态栏居中显示时间和修改时间显示样式

1.概述 在12.0的系统rom定制化开发中,在systemui状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局文件了 效果图如下: 在这里插入图片描述 …...

湍流的数值模拟方法概述

湍流&#xff0c;又称紊流&#xff0c;是一种极其复杂、极不规则、极不稳定的三维流动。湍流场内充满着尺度大小不同的旋涡&#xff0c;大旋涡尺度可以与整个流畅区域相当&#xff0c;而小漩涡尺度往往只有流场尺度千分之一的数量级&#xff0c;最小尺度旋涡的尺度通过其耗散掉…...

openFast中的陆上风电机组5MW_Land_DLL_WTurb参数详解

文章目录 一、openFAST是什么&#xff1f;二、参数截图三、参数详解 一、openFAST是什么&#xff1f; openFAST是一种开放源代码的工具&#xff0c;为风能工程师提供了用于模拟和设计风力涡轮机的框架。它可以计算风力涡轮机在各种环境条件下的性能&#xff0c;并提供对风力涡…...

“卷”还是“躺平”?职场人如何在工作中找到价值感?

今天不谈技术&#xff0c;只谈进步。 曾经看过一个回答说“职场人最好的姿势是仰卧起坐”。 卷累的就躺&#xff0c;休息好了再继续卷&#xff0c;卷是常态&#xff0c;“仰卧起坐”也好&#xff0c;“卷的姿势”也好&#xff0c;都是在反复“卷起”的过程中寻找一些舒适和平衡…...

《Opencv3编程入门》学习笔记—第二章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第二章 OpenCV 官方例程引导与赏析 openv官方提供的示例程序&#xff1a;具体位于..\opencv\sources\samples\cpp ..\opencv\sources\samples\cpp\tutorial_code路径下存…...

ABP VNext种子数据按顺序插入

ABP VNext种子数据按顺序插入 1.Domain层1.1 新加Author和Book实体1.2 CustomDataSeedDbMigrationService新加方法1.3新加ISowSeed接口1.4 作者和图书种子数据逻辑1.5 新加CustomDataSeedDataSeederContributor 2.EntityFrameworkCore2.1 CustomDataSeedDbContext2.2 生成迁移脚…...

Verilog | FIFO简单实现

FIFO( First Input First Output)简单说就是指先进先出&#xff0c;也是缓存机制的一种&#xff0c;下面是我总结的 FIFO 的三大用途&#xff1a; 1)提高传输效率&#xff0c;增加 DDR 带宽的利用率。比如我们有 4 路视频数据缓存到 DDR 中去&#xff0c;比较笨的方法是&#x…...

设计模式应用场景

设计模式简介 工厂模式&#xff08;Factory Pattern&#xff09;&#xff1a;使用工厂方法创建对象&#xff0c;而不是使用new关键字直接实例化对象。 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;&#xff1a;提供一个创建一系列相关对象的接口&#xff0c;…...

还在老一套?STM32使用新KEIL5的IDE,全新开发模式RTE介绍及使用

Keil新版本出来了&#xff0c;推出了一种全新开发模式RTE框架( Run-Time Environment)&#xff0c;更好用了。然而网上的教程资料竟还都是把Keil5当成Keil4来用&#xff0c;直接不使用这个功能。当前正点原子或野火的教程提供的例程虽有提到Keil5&#xff0c;但也是基本上当Kei…...

五八同城登录接口逆向:RSA加密、动态salt与sign验签实战

1. 这不是“爬个登录”那么简单&#xff1a;五八同城登录接口逆向的真实战场你点开浏览器开发者工具&#xff0c;F12&#xff0c;Network 面板里筛选 XHR&#xff0c;找到那个/login请求&#xff0c;点开看 Headers 和 Payload —— 然后傻眼了&#xff1a;password字段是一串 …...

可解释机器学习工程化:在端到端ML平台中集成XAI的实践指南

1. 项目概述与核心价值在机器学习项目从实验室走向生产环境的过程中&#xff0c;我们常常面临一个核心矛盾&#xff1a;一方面&#xff0c;复杂的模型&#xff08;如深度神经网络、集成模型&#xff09;往往能提供更高的预测精度&#xff1b;另一方面&#xff0c;这些模型内部复…...

在CentOS 7.9上保姆级安装Keysight ADS 2024,并解决Virtuoso集成报错(附完整环境变量配置)

在CentOS 7.9上实现Keysight ADS 2024与Cadence Virtuoso无缝集成的全流程指南对于射频集成电路&#xff08;RFIC&#xff09;设计工程师而言&#xff0c;Keysight ADS&#xff08;Advanced Design System&#xff09;与Cadence Virtuoso的协同工作能力是提升设计效率的关键。本…...

在VirtualBox里跑Win10,远程桌面连不上?试试这个被忽略的虚拟机专用配置

VirtualBox虚拟机Win10远程桌面黑屏&#xff1f;这个隐藏配置项可能是关键在混合开发环境中&#xff0c;许多技术从业者习惯使用VirtualBox等虚拟化工具搭建多操作系统平台。一个常见场景是在Windows 7宿主机上运行Windows 10虚拟机&#xff0c;通过远程桌面进行跨系统操作。但…...

Evident方法论:用观察、假设、测试构建可复现的数据科学工作流

1. 项目概述&#xff1a;为什么我们需要一种新的数据科学方法论&#xff1f;干了十多年数据科学和机器学习项目&#xff0c;从初创公司到大型企业都待过&#xff0c;我越来越觉得&#xff0c;我们这行当的“工作方式”有点不对劲。项目周期总是难以预估&#xff0c;代码和数据像…...

别再只懂ls -l了!手把手教你用getfattr/setfattr玩转Linux文件隐藏属性

别再只懂ls -l了&#xff01;手把手教你用getfattr/setfattr玩转Linux文件隐藏属性 在Linux系统中&#xff0c;文件权限和属性管理是每个开发者和管理员的必修课。大多数人熟悉 ls -l 展示的基础权限&#xff0c;但很少有人深入探索文件系统中那些不为人知的"隐藏技能&q…...

【码上爬】 题十九:法外狂徒 相应数据加密还原,堆栈分析,扣代码

暗号&#xff1a;aHR0cHM6Ly9tYXNoYW5ncGEuY29tL3Byb2JsZW0tZGV0YWlsLzE5Lw 题目&#xff1a; 先对接口进行分析&#xff0c;参数中并没有任何加密&#xff0c;只是返回的数据是加密的&#xff0c;一个R 一个k 推测r是数据内容&#xff0c;k是解密密钥&#xff0c;进入堆栈以后…...

技术人的持续学习:保持竞争力的完整指南

技术人的持续学习&#xff1a;保持竞争力的完整指南 引言 在快速发展的技术领域&#xff0c;持续学习是保持竞争力的关键。技术更新的速度越来越快&#xff0c;新的编程语言、框架和工具不断涌现。作为一名技术人&#xff0c;只有不断学习&#xff0c;才能跟上技术发展的步伐&a…...

自动化业务通报系统实现

问题解构&#xff1a;需求核心是构建一个基于Python的自动化业务通报系统&#xff0c;用于从多个.xls报表中提取数据&#xff0c;按团队统计指标完成情况&#xff0c;生成手机适配的通报图片&#xff0c;并通过Web界面展示。系统需支持灵活的配置管理&#xff0c;包括团队信息、…...

Meta裁了8000人,员工拖着行李箱抢可乐

昨天凌晨4点&#xff0c;Meta很多员工的邮箱同时响了。是裁员邮件。这一次&#xff0c;Meta裁掉了全球约10%的员工&#xff0c;规模大约8000人。分手大礼包&#xff1a;16周基础薪资 每满1年工龄额外2周薪资 18个月全家医保。真正让硅谷炸锅的&#xff0c;反而是裁员前几天&a…...