Linux基础内容(20)—— 共享内存_哈里沃克的博客-CSDN博客
目录
1.消息队列
1.定义
2.操作
2.信号量
1.定义
2.细节
3.延申
4.操作
3.IPC的特点共性
1.消息队列
1.定义
定义:是操作系统提供的内核级队列
2.操作
msgget:获取消息队列
key:操作系统层面创造消息队列
magflg:与共享内存一样,表示哪种方式创造
IPC_CREAT -- 指定的共享内存,不存在,创建;存在,共享内存标志返回
IPC_EXCL -- 无法单独使用;只有当 IPC_CREAT|IPC_EXCL 同时使用,如果不存在,创建,如果存在,出错返回
return:返回一个消息队列
msgctl:设置消息队列,可得到属性,或者退出。
msgsnd:发送消息
msqid:指定的消息队列名
msgp:发送的内容
msgsz:发送内容的大小
msgrcv:读取消息
查看当前存在的消息队列
2.信号量
查看信号量
1.定义
本质:是一个计数器,通常用来表示公共资源中资源数量的多少问题
公共资源:同时被多个进程访问的资源
公共资源被利用分为两类:1.整体使用 2.划分为一部分使用
在进程大部分都是独立的,那么其实只有少部分公共资源
2.细节
注意:之所以需要公共资源,其实是为了满足进程间通信的目的,由于每一个进程都是独立的,所以必须有一块公共资源能让两个需要互相通信的进程看到,这样就达到了通信的目的。不过此时的公共资源是有一定问题的。因为此时我们的公共资源是没有做任何保护的,那么也就意味着如果一个进程还没有完全把数据输入到公共资源里,另外一个就已经读了,那么另外一个读到的资源就是不完整的。那么由此能知道:没有被保护的公共资源存在着数据不一致的问题。
那么将公共资源进行保护,该公共资源被称为临界资源。
进程通过对应的代码访问临界资源被称为临界区。
如何保护?
互斥和同步都能实现保护公共资源。
原子性:事情要么不做要么做完,只有两态的情况。
3.延申
1.信号量是计数器表示当前进程公共资源数的多少的,其实它需要被多个进程能看到,使用信号量也是一种公共资源。
2.为什么需要信号量?共享空间中,需要分配不同的公共资源划分区域。进程访问资源的一部分,需要先申请信号量,随后得到一个与该区域对应的信号量。这样就保护了临界资源。不过信号量也是一种公共资源,那么为了保护公共资源,信号量本身也需要被保护起来。信号量内部的加减操作由于被保护,所以具有原子性。
3.PV操作:预定公共资源使得信号量--为P操作;预定公共资源使得信号量++为V操作
4.信号量值为1:那么只有两种状态,用于互斥功能
4.操作
1.semget:申请信号量
nsems:信号量的个数
2.semctl:信号量的查看信息和删除
3.semop: PV操作
sops:
3.IPC的特点共性
1.其实我们根据共享内存,消息队列和信号量能知道,这些进程通信手段除了使得进程看到同一份资源所以开辟一块空间,作为内核级的数据,当然需要进行先描述后组织。
2.不过当我们观察不同通信描述的属性时,发现他们的接口调用都是XXXctl。并且其中是结构体也十分相似,并且IPC属性的结构体的第一个属性都是key。其实现就相当于C++的“多态”,对于不同的通信方式传入的数据不同,会根据类型强转结构体,这样就能方便得到属性的操作了。