Linux信号量

📟作者主页:慢热的陕西人

🌴专栏链接:Linux

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

本博客主要内容感性认识了信号量,并且认识了IPC资源在操作系统内部是如何组织的

文章目录

  • Linux信号量
    • 1.互斥等四个概念
    • 2.认识信号量
    • 3.相关接口的认识
      • 3.1semget
      • 3.2ipcs -s
      • 3.3semctl
      • 3.4semop
    • 4.理解IPC
      • 4.1IPC资源是在内核中如何被组织和管理

Linux信号量

1.互斥等四个概念

首先我们进程通信的基础就是,让进程看到一个共同的资源:公共资源。

a.互斥

任何一个时刻,只允许一个执行流进行在共享资源的访问 – 加锁

b.临界资源

我们把任何时刻,只允许一个执行流访问的共享资源称为临界资源。

c.临界区

临界资源是要通过代码访问的,那么访问临界资源的代码就被称为临界区

d.原子性

要么不做,要么做完,只有两种确定状态的属性,原子性

2.认识信号量

任何技术都是有自己的应用场景的,首先我们通过一个买电影票的场景来感性的认识信号量。

首先我们看电影之前,我们都会先买票。

那么买票的本质功能:

  • 对座位资源的预定机制
  • 不会因为多方出去特定的座位资源,而导致冲突

那么放映厅是顶级的VIP放映厅,只有一个座位,那么同一时刻只有一个人能进行观看,并且他在观看的时候,其他人是不能去观看的,所以这就相当于我们之前所提到的互斥。

其实信号量本质就是一个计数器:用于描述资源数量的计数器count

在操作系统内部,任何一个执行流,向访问临界资源中的一个子资源的时候,不能直接访问。要先申请信号量资源,那么我们对应的信号量(count–),只要我们信号量成功,我就一定在未来能拿到一个子资源,叫做我们的申请临界资源成功(也有对应的申请失败,这时候进程就会阻塞挂起)。P操作

当我们的执行流进入自己的临界区,访问对应的临界资源

释放信号量资源 — 对应的信号量(count++) ---- 只要将计数器增加,就代表我们将对应的资源进行了归还。V操作

我们所有使用信号量的进程都是需要保证先看到信号量,那么信号量本质是一种共享资源,所以我们必须保证我们的count++count--是原子的!

总结下来,就是如下一幅图:进程通过执行代码来申请信号量

image-20231208081031212

  • 如何让两个进程看到同一个计数器(count)?

    这个需求是不是非常类似于我们进程通信的前提要求,让不同的进程看到同一份资源。

    所以信号量被归类到了进程间通信。

  • 假如信号量被设置为1呢?

    相当于这一份资源被独立使用了,也就是信号量的互斥功能。

3.相关接口的认识

3.1semget

用于获取信号量

参数:

  • key:和我们当时共享内存哪里的含义是一样的,用于操作系统区分对应的信号量;
  • nsems:用于表明申请信号量的个数;
  • semflg:和共享内存哪里的含义相同,可以输入对应的IPC_CREAT, IPC_EXCL等;

image-20231208085637121

3.2ipcs -s

用于查看当前系统中存在的信号量:我们这时候是没有的所以它没有任何显示

image-20231208090103368

3.3semctl

用于删除信号量的操作

  • semid:用户层面用于区分对应的信号量的的标识符;
  • semnum:要删除的信号量的个数;
  • cmd:要进行的操作;
  • …:可变参数

image-20231208090700269

对应的一些相关的结构体:

image-20231208091440341

3.4semop

对对应的信号量做操作

参数:

  • semid:表示我们要对哪一个信号量做操作
  • *sop:是一个结构体,需要我们去显式的定义具体包含如下的成员:
    image-20231208092026677
  • nsops:相当于是我们对应信号量数组的下标

image-20231208091823524

4.理解IPC

4.1IPC资源是在内核中如何被组织和管理

那么首先我们操作系统内部都是进行,先描述再组织;

先描述:讲共享内存,信号量,消息队列都用结构体描述起来。

再组织:操作系统用数组将这些对象组织起来

所以在操作系统内核所有的IPC资源都是以数组的方式进行管理的。

image-20231208101909899

  • 那么我们是如何进行访问的:

    首先我们进入ipc_id_arr[]数组内部,这个数组中全部存储的是struct ipc_perm*,假设这里我们要访问的是shmid_ds:那么我们就先将这个指针强转成对应的类型:((struct shmid_ds*)ipc_id_arr[n])->other...

以上的过程其实就是我们的多态,我们对应的stuct ipc_perm perm就是基类,

那么对应的struct shmid_ds,struct semid_dsstruct msqid_ds就是子类。

所以操作系统内部用不同的指针指向不同的对象,指向谁就访问谁。

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么要数据库优化?

为什么数据库需要进行优化? 数据库性能瓶颈 数据库服务器的性能受许多因素影响,包括硬件能力、系统规模、业务模型及架构、代码设计、数据库表设计、系统环境等。 因此,可以从几个方面进行数据库优化, 喜欢点赞收藏转发&#xff…

小红书AI文章写作工具,免费的小红书AI写作工具有哪些

社交媒体已经成为人们交流、分享生活和获取信息的主要平台之一。而在这众多社交媒体中,小红书以其独特的社区氛围和内容特色而备受瞩目。如何更高效地进行小红书文章创作,本文将深入研究小红书文章AI写作工具。 小红书文章AI写作工具背后的技术 随着人工…

JS基础面试题之手写bind

JS基础面试题之手写bind 手写bind返回函数的模拟实现传参的模拟实现构造函数效果的模拟实现构造函数效果的优化实现最终版 手写bind bind()方法会创建一个新的函数。当这个函数被调用时,bind()的第一个参数将作为它的运行时的this,之后的一序列参数将会在…

VSCode SSH登录服务器 提示XHR failed

设置->搜索“代理” 把图中的√去掉 重启 即可

【Linux】diff命令使用

diff命令 是一个用于比较两个文件或目录之间差异的命令。它可以显示两个文件之间的行级别差异,并以易于阅读的格式输出结果。 著者 由保罗艾格特、迈克海特尔、大卫海耶斯、理查德史泰尔曼和Len Tower撰写。 diff命令 -Linux手册页 语法 diff [选项] [文件1]…

Python-滑雪大冒险【附源码】

滑雪大冒险 《滑雪大冒险》是一款充满趣味性和挑战性的休闲竞技游戏,在游戏中,玩家将扮演一位勇敢的滑雪者,在雪山上展示他们的滑雪技巧,游戏采用2D图形界面,以第三人称视角呈现 运行效果:用方向键及方向键…

高端的露营装备网站搭建的作用是什么

近些年发展促进了露营热潮,周边游也多了起来,城市中高频工作带来的烦恼使得很多人想要放松,露营无疑是接触大自然很好的方式,而选择好的露营装备同样重要,还包括门店经营者,选择好的品牌合作也能带来很多生…

解决谷粒学苑新建父工程,pom 依赖大量飘红

解决谷粒学苑新建父工程&#xff0c;pom 依赖大量飘红 找到dependencyManagement标签&#xff0c;注释掉该标签&#xff08;同时注释掉对应的</dependencyManagement>标签&#xff09;。 重新加载 maven 项目 经过上面两个步骤&#xff0c;应该大部分依赖都已经引入。&a…

第21章总结 网络通信

21.1 网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java已经将网络程序所需要的元素封装成不同的类&#xff0c;用户只要创建这些类的对象&#xff0c;使用相应的方法&#xff0c;即使不具备有关的网络知识&#xff0c;也可以编写出高质量的网络通信程序…

二氧化碳注气开采石油中的无线传输解决方案

一、应用背景 在传统的石油开采过程中&#xff0c;只能采收到地下原油储层中约30%至40%的石油。二氧化碳强化石油开采技术是一种利用二氧化碳来提高石油采收率的技术。将工业尾气中的二氧化碳被捕集起来&#xff0c;注入油田地下油层&#xff0c;把原油"驱赶”出来&#…

经验分享|MySQL分区实战(RANGE)

概述 分区概述 在 MySQL 中&#xff0c; InnoDB存储引擎长期以来一直支持表空间的概念。在 MySQL 8.0 中&#xff0c;同一个分区表的所有分区必须使用相同的存储引擎。但是&#xff0c;也可以为同一 MySQL 服务器甚至同一数据库中的不同分区表使用不同的存储引擎。 通俗地讲…

洞察 丨 中国智能电动车发展趋势分析

中国弯道超车的愿景&#xff1a;多年的用市场换技术的方针&#xff0c;并没有在传统汽油车里完美实现&#xff0c;然而电动车的三电技术&#xff08;电池&#xff0c;电控&#xff0c;电驱&#xff09;完美避开了传统汽车有的发动机&#xff0c;变速箱&#xff0c;发动机控制器…

java集合之HashMap详解

HashMap详解 介绍 HashMap是在项目中使用的最多的Map&#xff0c;实现了Map接口&#xff0c;继承AbstractMap。基于哈希表的Map接口实现&#xff0c;不包含重复的键&#xff0c;一个键对应一个值&#xff0c;在HashMap存储的时候会将key、value作为一个整体Entry进行存储。 Has…

Codeforces Round 911 (Div. 2)补题

Cover in Water 题目大意&#xff1a;我们有一排房间&#xff0c;一些房间是空的&#xff0c;一些房间是阻塞的&#xff0c;现在需要将所有的空房间都填满水&#xff0c;我们能做的只有两个操作&#xff1a;1.往一个空房间内放入水&#xff1b;2.将一个房间中的水取出放入另一…

UEM 在企业 IT 管理数字化转型有什么帮助

近年大多数公司都在努力实现数字化转型&#xff0c;业务应用程序正在迁移到云端&#xff0c;日常 IT 运营正变得更加面向移动化&#xff0c;高管们使用各种设备。员工不仅使用公司提供的台式机&#xff0c;还经常使用公司拥有的、个人启用的&#xff08;COPE&#xff09;笔记本…

基于springboot实现的宠物医院管理系统

一、系统架构 前端&#xff1a;html | jquery | echarts | css 后端&#xff1a;springboot | thymeleaf | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 系统设置-用户管理 03. 系统设置-页面管理 04. 系统设置-角…

接口测试方向

一、Http接口测试 前面我们已经有了接口文档&#xff0c;那么我们就要根据接口文档来拼接参数调用接口&#xff0c;那么怎么调用呢&#xff1f; 1、接口请求报文拼接---传参方式 1&#xff09;key-value形式 这种是最简单的一种&#xff0c;问号前面是请求url&#xff0c;后…

Liunx系统使用超详细(四)~文件/文本相关命令2

承接文章Liunx系统使用超详细(四)~文件/文本相关命令1http://t.csdnimg.cn/f7G6S 目录 一、awk命令(三剑客之一) 1.1工作原理 1.2工作流程 1.3语法格式 1.3.1格式注释&#xff1a; 1.3.2模式&#xff08;pattern&#xff09;的类型&#xff1a; 1.3.3动作&#xff08;ac…

【动态规划系列】环形子数组的和-918

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Java面试题(每天10题)-------连载(45)

Dubbo篇 1、Dubbo的服务调用流程 2、Dubbo支持那种协议&#xff0c;每种协议的应用场景&#xff0c;优缺点&#xff1f; dubbo&#xff1a; 单一长连接和 NIO 异步通讯&#xff0c;适合大并发小数据量的服务调用&#xff0c;以及消费者远大于提供者。传输协议 TCP&#xff0c;…