Linux进程通信补充——System V通信

三、System V进程通信

​ System V是一个单独设计的内核模块;

​ 这套标准的设计不符合Linux下一切皆文件的思想,尽管隶属于文件部分,但是已经是一个独立的模块,并且shmid与文件描述符之间的兼容性做的并不好,网络通信使用的是文件的接口,所以System V标准慢慢地边缘化了,很难被整合进网络结构当中;

​ 不同进程看到同一份资源都是使用的key匹配的方式实现;

3.1共享内存

3.1.1原理

​ 由操作系统在内存中创建一段连续的空间,经过页表映射到共享区,给需要通信的用户层返回此空间的起始地址;这样就使得不同的进程看到同一份资源;

​ 通信准备工作,第一步申请空间;第二步将空间挂接到进程的共享区;

​ 通信结束工作,第一步去去关联;第二步释放共享内存;

​ 以上过程因为进程的独立性,必须交由操作系统来完成,需要使用系统调用接口;而且操作系统要对共享内存进行管理,有专门的结构体进行描述,憨厚用数据结构进行维护;

3.1.2系统调用接口
//1.创建一个共享内存
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);//创建共享内存的时候也要进行权限设计,即第三个参数设计IPC_CREAT|IPC_EXCL|0666
//第一个参数,操作系统要保证管理的每一个共享内存是唯一的;所以用key(具备唯一性的标识符)来创建共享内存并且使用key进行配对共享内存,来达到获取或者释放;key存放于操作系统创建的描述对象中;
//第二个参数是创建的空间大小。单位是字节,一般是4096的整数倍;
//第三个参数是共享内存的选项,IPC_CREAT and IPC_EXCL,IPC_EXCL不能单独使用;第三个选项一般有两个使用方式;方式一:IPC_CREAT,如果申请的共享内存不存在就创建,存在就获取;方式二:IPC_CREAT|IPC_EXCL,如果申请的共享内存不存在就创建,存在就出错返回;这种方式是为了保证刚创建的共享内存是新的;
//返回值是一个有效的共享内存标识符shmid,是在进程进行唯一性标识的;而key是操作系统使用的,进行唯一性标定的,返回给进程一个shmid;shmid其实就是一个数组,但是不符合文件的设计;
//2.释放共享内存,获取共享内存信息
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
struct shmid_ds {struct ipc_perm shm_perm;    /* Ownership and permissions */共享内存的权限size_t          shm_segsz;   /* Size of segment (bytes) */time_t          shm_atime;   /* Last attach time */time_t          shm_dtime;   /* Last detach time */time_t          shm_ctime;   /* Last change time */pid_t           shm_cpid;    /* PID of creator */pid_t           shm_lpid;    /* PID of last shmat(2)/shmdt(2) */shmatt_t        shm_nattch;  /* No. of current attaches */...
};//此结构是内核中管理共享内存的子集;
//如下是权限的结构,key被保存在了此结构中
struct ipc_perm {key_t          __key;    /* Key supplied to shmget(2) */uid_t          uid;      /* Effective UID of owner */gid_t          gid;      /* Effective GID of owner */uid_t          cuid;     /* Effective UID of creator */gid_t          cgid;     /* Effective GID of creator */unsigned short mode;     /* Permissions + SHM_DEST andSHM_LOCKED flags */unsigned short __seq;    /* Sequence number */
};
Valid values for cmd are:
IPC_STAT(将内核中的属性拷贝到输出型参数)、IPC_RMID(标记共享内存为删除)、IPC_SET(设置属性);
//第一个参数是shmid;第二个参数是具体的控制方式,查看、修改属性;第三个参数是输出型参数,用来获取共享内存的部分属性;
3.1.3创建key
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
//一套算法生成key并不会进内核进行查找;pathname和proj_id进行了数值计算,形成一个冲突概率率比较小的key;
//使用同一套算法,pathname,proj_id一定会生成同一个key;
//key是进程传递给操作系统,让操作系统生成唯一性的共享内存,或者操作系统用key进行判断是否允许使用共享内存通信;
3.1.4指令管理操作系统IPC资源
ipcs(ipc show) -m(memory)
#查看共享内存资源使用情况;
ipcrm -m shmid
#释放 shmid共享内存

在这里插入图片描述

3.1.5共享内存的权限问题
int shmget(key_t key, size_t size, int shmflg);
//创建共享内存的时候也要进行权限设计,即第三个参数设计IPC_CREAT|IPC_EXCL|0666
3.1.6注意事项

​ 1.共享内存一旦创建好就需要手动去释放,除非内核关闭;

​ 2.一个进程创建共享内存,一个获取使用共享内存;

​ 3.共享内存的大小建议是4096的整数倍;因为操作系统分配内存是按照page的倍数来的,即使申请4097大小,也还是会开辟2*4096的空间,只不过是第二个4096空间只允许使用1的大小;

​ 4.一个进程负责共享内存的申请和释放,另一个只是挂接和去关联就行;

​ 5.如果进程因为异常终止,就会导致共享内存没有释放,内存泄露;

3.1.7共享内存的挂接和去关联

​ 进程结束会–attach;

​ malloc是开辟的空间往往比申请的空间要大,是因为这部分额外的空间"cookie"记录了对开辟空间的管理信息

#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
//和malloc类似,都是返回一个虚拟地址空间,然后触发缺页中断,建立映射;
//将共享内存挂接到进程地址空间的共享区
//第一个参数共享内存标识符;第二个参数表示的是共享区的具体位置,一般是设为NULL;第三个参数可以自己设置权限,也可以设置0,使用共享内存的默认权限;
//返回值是挂接到共享区的具体位置,
int shmdt(const void *shmaddr);
//进程和共享内存去关联,由于操作系统对共享内存进行了管理,知道大小,随意只需要起始地址就可以释放,类似free;
3.1.8通信

​ 共享内存通信是不需要像管道一样刷新文件到页缓冲区的,因为直接挂接到了虚拟地址空间,所以用户层是直接可以使用的;直接将挂接的地址强转成char*,当成字符串使用,也不需要语言层缓冲区,不需要调用系统调用;每次从起始位置写入和读取;

char *fgets(char *s, int size, FILE *stream);
//读取之后会在最后加\0;
3.1.9特性

​ 1.没有同步互斥;

​ 2.共享内存是所有进程间通信方式最快的,因为拷贝少,系统调用少;

​ 3.共享内存的数据需要用户自己维护,是最原始的缓冲区;

3.1.10使用管道对共享内存进行同步和互斥

​ 两个进程1号读,2号写;2号写完后继续使用管道发送提示,而使用了管道的1号进程,就不会立刻读取,而是等先读到管道数据,才继续读取共享内存的数据;即双方使用共享内存通信中间加入管道通信,借助管道的同步和互斥进行通信;

​ 共享内存的通信速度非常快,对于大文件效率高;可以自己实现同步和互斥,也可以借助管道的同步互斥机制,发送提示符实现;

3.2信号量和消息队列

3.2.1消息队列
3.2.1.1原理

​ 操作系统在内核中管理消息队列,开辟了队列空间,使得通信双方看到同一份资源;而管道和共享内存使用的是文件页缓冲区和内存块;

​ 通信的要求是:1.必须让不同的进程看到同一份资源;2.允许不同的进程向内核发送带类型(区分发送给哪一个进程)的数据块,然后将数据块炼链入消息队列;即ab两个进程以发送数据块形式;

在这里插入图片描述

3.2.1.2创建和控制接口
//创建一个消息队列
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
//key和msg的选项和共享内存一样;
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
//msqid和cmd的选项和共享内存的一样
struct msqid_ds {struct ipc_perm msg_perm;     /* Ownership and permissions */使用了组合的方式,而不是继承time_t          msg_stime;    /* Time of last msgsnd(2) */time_t          msg_rtime;    /* Time of last msgrcv(2) */time_t          msg_ctime;    /* Time of last change */unsigned long   __msg_cbytes; /* Current number of bytes inqueue (nonstandard) */msgqnum_t       msg_qnum;     /* Current number of messagesin queue */msglen_t        msg_qbytes;   /* Maximum number of bytesallowed in queue */pid_t           msg_lspid;    /* PID of last msgsnd(2) */pid_t           msg_lrpid;    /* PID of last msgrcv(2) */
};
The ipc_perm structure is defined as follows (the highlighted fields are settable using IPC_SET):
struct ipc_perm {key_t          __key;       /* Key supplied to msgget(2) */uid_t          uid;         /* Effective UID of owner */gid_t          gid;         /* Effective GID of owner */uid_t          cuid;        /* Effective UID of creator */gid_t          cgid;        /* Effective GID of creator */unsigned short mode;        /* Permissions */unsigned short __seq;       /* Sequence number */
};
3.2.1.3发送和读取接口
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
//第一个参数是消息队列id,第二个参数是消息队列数据块起始地址,第三个数据是数据块大小,第四个参数默认设置为0,意思是阻塞方式,IPC_NOWAIT非阻塞的方式;
struct msgbuf {long mtype;       /* message type, must be > 0 */类型char mtext[1];    /* message data */内容,但是大小为1字节,所以需要自己定义一个数据块对象,保证第一个数据是类型,第二个数据是内容;
};
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
//第一个参数是从哪一个消息队列获取,第二和第三个参数是输出型参数作为缓冲区,第四个参数是根据类型读取数据块,第5个参数和发送的一样,阻塞和非阻塞;
3.2.1.4指令管理IPC资源
ipcs -q
//查看消息队列资源
ipcrm -q msqid
//释放消息队列

在这里插入图片描述

​ used-bytes是总字节数,messages是数据块数;

3.2.2信号量
3.2.2.1原理和概念

1.数据不一致问题,需要解决

​ a进程未写入完,b进程直接读取,导致双方收发数据不完整;管道不存在这样的问题,因为有原子性保证和同步互斥;但是共享内存是最原始的缓冲区,没有任何的保护机制;

2.共享资源

​ 两个进程看到的同一份资源是共享资源,如果不加保护就会导致数据不一致问题;解决这种问题需要使用加锁的方式实现;加锁是为了实现互斥访问;默认打开的3个文件流就是共享资源,不搬家任何保护;

3.互斥

​ 互斥访问,任何时刻只允许一个执行流访问共享资源;实现互斥就是将共享资源变成临界资源;如ATM取款场景;

4.临界资源

​ 共享的任何时刻只允许一个执行流访问的资源叫做临界资源;管道就是临界资源;一般是内存空间;而共享内存,消息队列等都是不加保护的共享资源;语言层使用的主要是内存资源,而CPU的视角下,操作系统管理的进程是运行在CPU上的,是CPU的资源;

5.临界区

​ 即真正访问临界资源的代码;

3.2.2.2创建和控制接口
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ...);
struct semid_ds {struct ipc_perm sem_perm;  /* Ownership and permissions */time_t          sem_otime; /* Last semop time */time_t          sem_ctime; /* Last change time */unsigned long   sem_nsems; /* No. of semaphores in set */
};The ipc_perm structure is defined as follows (the highlighted fields are settable using IPC_SET):struct ipc_perm {key_t          __key; /* Key supplied to semget(2) */uid_t          uid;   /* Effective UID of owner */gid_t          gid;   /* Effective GID of owner */uid_t          cuid;  /* Effective UID of creator */gid_t          cgid;  /* Effective GID of creator */unsigned short mode;  /* Permissions */unsigned short __seq; /* Sequence number */
};

3.3System V在内核中的数据结构设计

​ 在操作系统内所有的进程间通信IPC资源被i整合在IPC模块当中;

在这里插入图片描述

​ 上述结构里的entries指针指向了一个数组

在这里插入图片描述

​ 数组的第一个元素表示元素的个数,第二个元素是kernel_ipc_perm对应的指针数组,是一个柔性数组,可以动态扩展数组的大小;

在这里插入图片描述

​ 在操作系统中System V的三种通信方式,都创建了内核结构,这些内核结构的第一个属性都是struct ipc_perm的结构对象,然后使用数组的方式进行组织,而这个数组是struct ipc_perm *array[],存放了这三种内核结构的第一个属性的地址,这样就间接地将三类结构的首地址组织起来了,形成了类似二维数组的结构;

​ 即不同通信方式的描述不同,组织方式转化成了对数组的增删查改;

​ 当每一个进程传入key在操作系统内部进行比对时,进行创建或者获取,不存在创建一个结构,返回数组下标即xxxid;即本质上除去不一样的部分,三种通信方式的结构是一样的,统一成了对ipc资源的管理;为了区分三种通信方式的不同,为每一个通信方式增加了自己的属性;

​ 访问不同的通信结构时,使用强制类型转换即可实现访问;

​ kernel_ipc_perm结构里可以添加一种类型标志位,使用枚举常量的方式区分不同的类型;

​ 这个技术就类似于c++当中的多态,基类ipc_perm,其他三种通信结构是派生类,其是这就是c语言的多态;

​ id_ary数组不隶属于任何进程,不像files_struct里面的fd_array是属于task_struct的,是一个独立的模块里的结构,所以与文件描述符的关系不大,不兼容,此模块逐渐地被边缘化了,因为此模块无法和进程相关联,自己能和内存相关联,而文件是既可以和进程关联也可以和内存关联;

​ xxxid数组下标是线性递增的,当变成最大值时,会回绕到0;实际上并不会开辟很大的数组,而且每次数组都是从下标0开始,类似与起始计数器的机制,将数字转化成对应的数组下标;

在这里插入图片描述

消息类型和消息大小就是从如下结构拷贝的;然后使用了双链表的形式维护了消息队列

struct msgbuf {long mtype;       /* message type, must be > 0 */类型char mtext[1];    /* message data */内容,但是大小为1字节,所以需要自己定义一个数据块对象,保证第一个数据是类型,第二个数据是内容;
};

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

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

相关文章

【K8S】docker和K8S(kubernetes)理解?docker是什么?K8S架构、Master节点 Node节点 K8S架构图

docker和K8S理解 一、docker的问世虚拟机是什么&#xff1f;Docker的问世&#xff1f;docker优点及理解 二、Kubernetes-K8SK8S是什么&#xff1f;简单了解K8S架构Master节点Node节点K8S架构图 一、docker的问世 在LXC(Linux container)Linux容器虚拟技术出现之前&#xff0c;业…

云手机的数据安全有保障吗?

随着移动互联网的迅速发展&#xff0c;云手机作为一种新兴的移动终端技术&#xff0c;正在逐渐受到人们的关注和应用。然而&#xff0c;对于云手机而言&#xff0c;数据安全问题一直是人们关注的焦点之一。本文将探讨云手机的数据安全性&#xff0c;并分析其是否具备足够的保障…

打造坚不可摧的防线:容灾策略的实践与探索

在当今这个信息化时代&#xff0c;数据已成为企业最宝贵的财富之一。因此&#xff0c;保护数据免受意外损坏或灾难性事件的影响变得至关重要。这就需要企业建立一个有效的容灾体系&#xff0c;来确保业务连续性和数据安全。 容灾&#xff0c;即灾难恢复&#xff08;Disaster Re…

huawei 华为交换机 配置手工模式链路聚合示例

组网需求 如 图 3-21 所示&#xff0c; SwitchA 和 SwitchB 通过以太链路分别都连接 VLAN10 和 VLAN20 的网络&#xff0c;SwitchA 和 SwitchB 之间有较大的数据流量。 用户希望SwitchA 和 SwitchB 之间能够提供较大的链路带宽来使相同 VLAN 间互相通信。 同时用户也希望能够提…

基于Java+SpringBoot+Vue前后端分离婚纱影楼管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作✌ 主要内容&#xff1a;SpringBoot、Vue、SSM、HLM…

MacBook远程桌面Windows使用Microsoft Remote Desktop for Mac_亲测使用

MacBook远程桌面Windows使用Microsoft Remote Desktop for Mac_亲测使用 像Windows上有自带的远程桌面连接软件.MacBook没有自带的远程连接Windows桌面的工具,需要安装软件来实现. 像远程桌面控制软件一般有 TeamViewer、向日葵远程控制, ToDesk, Microsoft Remote Desktop f…

vue实现element-UI中table表格背景颜色设置

目前在style中设置不了&#xff0c;那么就在前面组件给设置上 :header-cell-style"{ color: #ffffff, fontSize: 14px, backgroundColor: #0E2152 }" :cell-style"{ color: #ffffff, fontSize: 14px, backgroundColor: #0E2152 }"

Javaweb的学习19_CSS概念+css与html的结合方式

CSS CSS&#xff1a;页面美化和布局控制 1. 概念&#xff1a;Cascading Style Sheets 层叠样式表 层叠&#xff1a;多个样式可以作用在同一个html的元素(标签)上&#xff0c;同时生效 2. 好处&#xff1a; 1.功能强大 2.将内容展示(HTML)和样式控制(CSS)分离 *降低耦合度。解耦…

电话机器人语音识别用哪家更好精准度更高。

语音识别系统的选择取决于你的具体需求&#xff0c;包括但不限于识别精度、速度、易用性、价格等因素。以下是一些在语音识别领域表现较好的公司和产品&#xff1a; 科大讯飞&#xff1a;科大讯飞是中国最大的语音识别技术提供商之一&#xff0c;其语音识别技术被广泛应用于各…

基于spring boot的汽车4s店管理系统

摘 要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;汽车4s店管理系统当然不能排除在外。汽车4s店管理系统是在实际应用和软件工程的开发原理之上&#xff0c;运用java语言以及SpringBoot框架…

[HackMyVM]靶场 Zon

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

CSDN 停更通知

CSDN 不再更新&#xff0c;欢迎关注我的微信公众号&#xff0c;分享更多有趣的技术内容。 如果大家有任何疑问&#xff0c;或者感兴趣的话题&#xff0c;都可以通过微信公众号与我交流&#xff0c;相互学习&#xff0c;相互成长。

Css提高——Css3的新增选择器

目录 1、Css3新增选择器列举 2、属性选择器 2.1、语法 2.2、代码&#xff1a; 2.3、效果图 3、结构伪类选择器 3.1、语法 3.2、代码 3.3、效果图 3.4、nth&#xff1a;child&#xff08;n&#xff09;的用法拓展 nth-child&#xff08;n&#xff09;与nth-of-type&#x…

21年电赛-送药小车—基于OpenMV的寻迹+检测路口+数字识别(多模版匹配)(附代码)

我们花费了四天时间打了一场21年的电赛改编题——智能送药小车。虽然结果不尽人意&#xff0c;但这是我学习32以来第一次正式的打比赛&#xff0c;对我来说要学习的东西&#xff0c;所增长的经验真的特别多&#xff08;虽然基本上都是学长在出力~&#xff09;下来我就把关于这次…

3.18数据结构

一、数据结构----->用来组织存储数据 一组用来保存一种或多种特定关系的数据的集合&#xff08;组织和存储数据&#xff09; 程序 数据结构 算法 MVC&#xff1a;软件设计架构 M&#xff1a;数据的管理&#xff08;数据结构&#xff09; V&#xff1a;视图&#xff0c…

B003-springcloud alibaba 服务治理 nacos discovery ribbon feign

目录 服务治理服务治理介绍什么是服务治理相关方案 nacos实战入门搭建nacos环境安装nacos启动nacos访问nacos 将商品微服务注册进nacos将订单微服务注册进nacos订单服务通过nacos调用商品服务 实现服务调用的负载均衡什么是负载均衡代码实现负载均衡增加一个服务提供者自定义实…

离线数仓、实时数仓与数据湖

1 什么是数据仓库 数据仓库是一个为数据分析而设计的企业级数据管理系统。数据仓库可集中、整合多个信息源的大量数据&#xff0c;借助数据仓库的分析能力&#xff0c;企业可从数据中获得宝贵的信息进而改进决策。同时&#xff0c;随着时间的推移&#xff0c;数据仓库中积累的大…

《深入理解Maven:构建工具、常用命令与项目包技巧解析》

文章目录 何为构建工具 | ToolsMaven插件的常用命令 | Commondclean总结 | Summary compile总结 | Summary package总结 | Summary install总结 | Summary build和compile的区别 | Knowledge项目包技巧 | Method 在后端领域开发中&#xff0c;我们构建项目常用到了Maven和Gradl…

Science Robotics 封面论文:美国宇航局喷气推进实验室开发了自主蛇形机器人,用于冰雪世界探索

人们对探索冰冷的卫星&#xff08;如土卫二&#xff09;的兴趣越来越大&#xff0c;这可能具有天体生物学意义。然而&#xff0c;由于地表或冰口内的环境极端&#xff0c;获取样本具有挑战性。美国宇航局的喷气推进实验室正在开发一种名为Exobiology Extant Life Surveyor&…

【论文阅读笔记】Split frequency attention network for single image deraining

1.论文介绍 Split frequency attention network for single image deraining 用于单幅图像去噪的分频注意力网络 Paper Code 2023年 SIVP 2.摘要 雨纹对图像质量的影响极大&#xff0c;基于数据驱动的单图像去噪方法不断发展并取得了巨大的成功。然而&#xff0c;传统的卷积…