目录
共享内存
共享内存原理
1.在物理内存中开辟一段空间
2.不同的进程通过页表将物理内存空间映射到自己的进程虚拟地址空间中
3.不同的进程通过操作自己进程虚拟地址空间中的虚拟地址,来操作共享内存
如下图所示:
共享内存接口
1.shmget
功能:创建或获取共享内存,具体用法如下:
2.shmat
功能:将共享内存添加到进程虚拟地址空间,用法如下:
3.shmdt
功能:分离共享内存
4.shmid
功能:获取或者修改共享内存属性信息,以及删除共享内存。
代码验证
给出两端代码,左侧代码的功能是创建共享内存,并往共享内存中写。右侧代码的功能是获取共享内存,并从共享内存中将内容读出来。如下图所示:
打印出来结果,说明使用共享内存进行进程间通信成功。
共享内存特性
1.共享内存生命周期跟随操作系统。在以上的代码中,我们创建了标识符为:"0x34343434"的共享内存,通过命令:"ipcs",可以查看共享内存,如下,此时附加共享内存的进程数量为0,但是共享内存依然存在。
2.共享内存是覆盖写的,读的时候,访问的是地址。
3.共享内存的删除特性
共享内存可以使用函数或者命令来删除,如下代码中使用函数删除共享内存:
1 #include <stdio.h>
2 #include <sys/shm.h>
3 #include <unistd.h>
4 int main(){
5 int shm_id=shmget(0x56565656,1024,IPC_CREAT|0664);
6 if(shm_id<0){
7 perror("shmget");
8 return 0;
9 }
10 int count=20;
11 while(count){//睡眠20秒
12 sleep(1);
13 count--;
14 }
15 shmctl(shm_id,IPC_RMID,NULL);
16 return 0;
17 }
编译运行后:
根据以上现象,成功使用函数删除了共享内存。
使用命令"ipcrm -m [共享内存操作句柄]"也可以删除共享内存:
删除特性:
消息队列
消息队列原理
1、消息队列采用链表来实现,该链表由系统内核来维护
2、系统中可能会有很多的消息队列,每个消息队列用消息队列描述符(消息队列id - qid)来区分,qid是唯一的,用来区分不同的消息队列。
3、在进行进程间通信的时候,一个进程将消息追加到消息队列的尾端,另一个进程从消息队列里取数据(不一定按照先进先出的原则取数据,也可以按照消息类型字段来取)。
消息队列接口
1.msgget
功能:创建消息队列
2.msgsnd
功能:发送消息
3.msgrcv
功能:接收消息
4.msgctl
功能:操作消息队列
代码验证
以下代码中,左边代码创建消息队列,并且往消息队列中发送消息,右边代码获取消息队列,并且从消息队列读出消息。观察运行结果,进程间通信成功。
另外,删除消息队列可用命令"ipcrm -q [msqid]"进行删除。
信号量
4.信号量本质是资源计数器,能够保证多个进程访问临界资源,执行临界区代码的时候,互斥访问,同时也可以用于同步。
如何保证?
通过信号量的值来保证,每个进程需要先获取信号量,只有获取到信号量才可以访问临界资源,如果获取失败,则阻塞等待,同步是指临界资源空闲之后,通知等待的进程进行访问。