【Linux】详解进程通信中信号量的本质同步和互斥的概念临界资源和临界区的概念

本文主要是介绍【Linux】详解进程通信中信号量的本质同步和互斥的概念临界资源和临界区的概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、同步和互斥的概念

1.1、同步

        访问资源在安全的前提下,具有一定的顺序性,就叫做同步。在多道程序系统中,由于资源有限,进程或线程之间可能产生冲突。同步机制就是为了解决这些冲突,保证进程或线程之间能够按照既定的顺序访问共享资源。同步机制有助于避免竞态条件和死锁(deadlock)等问题,确保系统的稳定性和可靠性。

1.2、互斥

        在访问一部分共享资源的时候,任何时刻只有我一个人访问,就叫做互斥。当某一进程或线程正在访问某临界区(即共享资源)时,就不允许其他进程或线程进入,这样可以避免数据冲突和不一致。互斥机制有助于保证同一时间只有一个线程或进程能够访问被保护的临界区,从而确保数据的一致性和完整性。

二、临界资源和临界区的概念

2.1、临界资源

        被保护起来的,任何时刻只允许一个执行访问的公共资源就叫做临界资源。这类资源在某一时刻只能有一个进程或线程占用,如果多个进程或线程试图同时访问临界资源,可能会引发数据冲突或不一致。物理设备如打印机、输入机等都属于临界资源。

2.2、临界区

访问临界资源的代码,我们叫做临界区。临界区的访问需要遵循一定的调度原则,如空闲让进、忙则等待等,以确保资源的正确和高效利用。所谓的保护公共资源(临界资源)的本质就是程序员保护临界区

三、认识信号量

3.1、信号量的本质

        信号量本质是一个计数器,是一个描述临界资源数量的计数器。进程要访问临界资源的时候,必须先申请信号量,申请信号量成功了才能继续往下走,否则就要进行阻塞或挂起等待。信号量的值表示了可用资源的数量或等待访问该资源的进程/线程数。当进程或线程需要访问共享资源时,会先检查信号量的值。如果信号量的值大于0,表示还有可用的资源,进程或线程可以继续执行并访问资源,同时信号量的值会减1。如果信号量的值为0,表示所有资源都已被占用,进程或线程需要等待,直到有其他进程或线程释放资源并将信号量的值增加。访问完临界资源进程要释放信号量,即信号量加1。当信号量的初始值为1时,就实现了互斥的功能

3.2、普通的整形变量无法实现信号量的效果

原因有两个:

  1. 信号量本身就是共享资源,本身就是要被多个进程或线程共同可以看到的,但是一个普通整形变量无法同时被多个进程看到,就算是父子进程,当要改变进程数据时都要发生写时拷贝,因此无法让多个进程看到同一个变量。
  2. 对整形变量做++和--操作,这个操作不是原子的。

这里又设计一个概念叫原子性。

3.3、原子性的概念

        在操作系统中,原子性是指一个操作或一系列操作是不可中断的,要么全部执行成功,要么全部不执行,中间不能被其他进程或线程干扰。换句话说,原子操作是不可分割的,具有“同生共死”的特性,即要么完全执行,要么完全不执行,没有中间状态。上面的对一个整形做++或--操作实际上是先将内存中的一个整形变量的值先拷贝到CPU的寄存器中,在寄存器中对该变量做++操作然后再将该变量拷贝会内存当中,我们也可以看到,这中间其实经历了三个过程,换句话说,++或--操作不具备原子性。原子性在并发编程中尤为重要,特别是在共享资源的读写操作中。当多个线程或进程同时访问和修改共享资源时,如果操作不是原子的,就可能导致数据不一致的问题。原子性确保了即使在多线程环境下,一个操作一旦开始就不会被其他线程干扰,从而保证了数据的一致性

3.4、信号量操作的接口

3.4.1、获取信号量

        key就类似于共享内存中使用ftok函数产生的key,nsems表示要产生几个信号量,semflg表示如何创建,与共享内存的第三个参数同理,可参考本人上一篇博客,返回值为该信号量集标识符,这是通过semget函数创建或获取信号量集时返回的IPC标识符。

3.4.2、控制/删除信号量

 

        semid表示该信号量集标识符。semnum表示信号量的编号,用于指定信号量集中的某个特定的信号量,第一个信号量的编号是0。cmd表示需要执行的命令,IPC_RMID为删除命令。

3.4.3、对信号量进行PV操作

        sops指向存储信号操作结构的数组指针。在这个数组中的每个sembuf结构体对应一个特定信号的操作。 这是sops数组中sembuf结构的数量。

这篇关于【Linux】详解进程通信中信号量的本质同步和互斥的概念临界资源和临界区的概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/921662

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识