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

news2024/12/24 2:15:08

信号量
信号量(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;
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/570414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在华为OD机试中获得满分?Java实现【优秀学员统计】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

C++是如何从代码到游戏的

有一个Student类。C怎么创建一个学生类的对象&#xff1f; // 嗯我会&#xff01;有两种方式&#xff1a; Student s; Student *s2 new Student("张三");现在这学生的行为有&#xff1a;吃饭&#xff0c;睡觉&#xff0c;上网课。现在你执行个上网课的行为&#xf…

chatgpt赋能python:Python取数简介

Python取数简介 Python是一款强大的编程语言&#xff0c;可以轻松地处理各种数据类型并进行数据分析。Python的强大功能也使其成为数据科学和机器学习等领域非常受欢迎的编程语言。在这篇文章中&#xff0c;我们将探讨在Python中如何取数。 Python中的取数 Python中有多种方…

C#,码海拾贝(24)——线性方程组求解的复系数方程组的全选主元高斯-约当消去法之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> …

delphi11.3的WebBrower支持Edge

看到此消息后&#xff0c;立即下载了DelphiCE&#xff08;社区版&#xff09; 安装&#xff0c;创建项目&#xff0c;放TWebBrowers&#xff0c;TButton 配置参数为EdgeOnly F9运行&#xff0c;没反应 配置参数为EdgeIfAvailable F9运行&#xff0c;提示浏览器版本过低 全网搜索…

chatgpt赋能python:Python取两者之间的最大值

Python取两者之间的最大值 介绍 Python是一种高级编程语言&#xff0c;广泛应用于计算机科学、人工智能、数据科学、机器学习等不同领域。它的易用性和灵活性使它成为许多开发人员首选的工具。本篇文章将介绍如何使用Python来取两者之间的最大值。 如何取两者之间的最大值 …

URP自定义屏幕后处理

回到目录 大家好&#xff0c;我是阿赵。这次来说一下URP渲染管线里面怎样使用后处理效果&#xff0c;还有怎样去自定义后处理效果。 一、使用URP自带的后处理效果 要使用URP自带的后处理效果&#xff0c;方法很简单&#xff0c;和Unity内置渲染管线的PostProcessing后处理很…

如何在Linux中更改SSH端口?

SSH&#xff08;Secure Shell&#xff09;是一种安全的远程登录协议&#xff0c;它允许您通过网络远程连接到Linux系统并进行管理操作。默认情况下&#xff0c;SSH使用22端口进行通信。然而&#xff0c;为了增强系统的安全性&#xff0c;有时候我们需要更改SSH端口&#xff0c;…

chatgpt赋能python:Python分解——探究Python语言的精髓

Python分解——探究Python语言的精髓 Python作为一种动态解释性语言&#xff0c;逐渐成为数据科学和人工智能领域的“标配”。Python语言的优势不仅在于其简洁而直观的语法&#xff0c;更在于其开源庞大的生态系统。而Python分解&#xff0c;则是将Python语言的优势、拆分并深…

chatgpt赋能python:Python内连接的重要性

Python内连接的重要性 在数据分析和机器学习领域&#xff0c;内连接是一种非常重要的概念&#xff0c;用于筛选和分析不同数据集之间的共同项。Python语言的强大功能和广泛的库可以帮助我们轻松地实现内连接。在本文中&#xff0c;我们将介绍Python内连接的基础知识、实现方式…

chatgpt赋能python:Python分组:组织你的代码,提升可读性和可维护性

Python 分组: 组织你的代码&#xff0c;提升可读性和可维护性 在编写代码时&#xff0c;组织良好的代码结构和架构是非常重要的。对于大规模的项目&#xff0c;特别是多人合作开发的项目来说&#xff0c;代码管理和组织是至关重要的。Python 分组是一种常用的技术&#xff0c;…

css高级技巧

1. 精灵图 index.png 分析图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…

chatgpt赋能python:Python单行if语句

Python 单行 if 语句 在 Python 编程中&#xff0c;条件语句 if 是一个非常重要的控制流语句&#xff0c;它的主要作用是根据条件的真假来决定程序的走向。在编写 Python 代码时&#xff0c;经常会遇到需要在某些情况下只执行一行代码的情况。这时&#xff0c;就可以使用 Pyth…

chatgpt赋能python:Python取出列表数字

Python 取出列表数字 如果你是一名 Python 开发者&#xff0c;并且你需要从一个列表中取出数字&#xff0c;那么你来到了对的地方。 介绍 Python 是一门很流行的编程语言&#xff0c;它有很多内置函数和库&#xff0c;可以帮助你快速地完成各种任务。在 Python 中&#xff0…

使用yolov5实现图片分类

文章目录 开始之前下载依赖数据集下载新建配置文件执行训练模型选择训练完成测试模型进行预测自定义模型下载数据集下载地址分享问题 开始之前 你应当先克隆这个仓库 git clone https://github.com/ultralytics/yolov5 # clone下载完毕后&#xff0c;进入克隆的仓库目录 cd …

Linux系统静态IP配置(CentOS)

刚刚装好的Linux系统&#xff08;Ubuntu版本&#xff09;通过ifconfig&#xff08;如果是CentOS版本需要使用ipaddr&#xff09;之后没有发现IP地址 首先在Linux终端通过su root指令进入root用户下获得管理员权限&#xff0c;之后进入cd /etc/sysconfig/network-scripts目录中 …

Linux命令(23)之cat

Linux命令之cat 1.cat介绍 linux命令cat用于把文件内容显示在标准输出设备&#xff08;即&#xff1a;显示器&#xff09;上&#xff0c;也可以(单个/几个)文件内容追加别的文件当中去。 2.cat用法 cat [参数] [文件名称] cat命令常用参数 参数说明-b对所有非空输出进行编号…

大数据 | 实验四:并行化数据挖掘算法设计

文章目录 &#x1f4da;实验目的&#x1f4da;实验平台&#x1f4da;实验内容&#x1f4da;实验步骤&#x1f407;KNN介绍&#x1f407;并行化&#x1f955;在本地编写程序和调试&#x1f955;在集群上提交作业并执行 &#x1f407;非并行化 &#x1f4da;实验目的 机器学习和…

chatgpt赋能python:Python切换输入法:实现更高效的编程

Python 切换输入法&#xff1a;实现更高效的编程 对于有多国语言需求的程序员来说&#xff0c;切换输入法是日常编程的基本操作之一。Python是一门广泛使用的编程语言&#xff0c;对于那些使用中文输入法的开发者来说&#xff0c;如何高效地切换输入法是一个需要考虑的问题。 …

chatgpt赋能python:Python去噪——提高图像质量的神器

Python去噪——提高图像质量的神器 介绍 随着科技的发展&#xff0c;我们的生活被数字化&#xff0c;许多信息都被存储在数字化设备中。这些设备会允许我们拍摄照片、视频和录音等多媒体文件。然而&#xff0c;在实际应用中&#xff0c;多媒体数据通常存在一些问题&#xff0…