个人网站备案涉及支付宝,电子商务的就业方向,seo公司怎样找客户,win2008r做网站1.共享内存原理及优缺点
共享内存的原理便是将相同的一片物理内存映射到进程A和进程B不同的逻辑地址空间#xff0c;两个进程同时访问这块物理内存#xff08;共享内存#xff09;。
1#xff09;优点 共享内存是进程间通信访问速度最快。 例如消息队列#xff0c;FIFO两个进程同时访问这块物理内存共享内存。
1优点 共享内存是进程间通信访问速度最快。 例如消息队列FIFO管道的消息传递方式一般为 1服务器得到输入 2通过管道消息队列写入数据通常需要从进程拷贝到内核。 3客户从内核拷贝到进程 4然后再从进程中拷贝到输出文件 上述过程通常要经过4次拷贝才能完成文件的传递。 而共享内存只需要两次拷贝 1:从输入文件到共享内存区 2:从共享内存区输出到文件 上述过程减少了数据不必要的拷贝以及用户态和内核态之间的切换所以花的时间较少和访问进程独有的内存区域一样快。
2缺点 共享内存是进程间不安全的需要使用额外的同步进制来控制对共享内存的访问常用的是信号量。
2.查看系统共享内存
ipcs -m //查看系统的共享内存
ipcrm -m [shmid] //删除指定共享内存段3.函数API
1获取共享内存
int shmget(key_t key, size_t size, int shmflg);keyftok生成的key标识在系统中是唯一的 size共享内存大小系统申请内存的最小单位是页一页是4K字节为了避免大量的碎片申请内存大小一般是页的整数倍为0代表只是获取已经创建好的共享内存 shmflag和信号量等相同IPC_CREAT | IPC_EXCL则代表不存在则创建存在则返回失败0代表获取共享内存标识符若不存在则函数会报错。
2映射共享内存 void *shmat(int shmid, const void *shmaddr, int shmflg);shmid 共享内存ID shmaddr 起始虚拟地址空间NULL则是由系统自动分配 shmflag一般为0可以给SHM_RDONLY为只读模式其他的为读写 返回值成功返回虚拟地址出错返回-1 fork后子进程继承已连接的共享内存地址。exec后该子进程与已连接的共享内存地址自动断开映射。进程结束后连接的共享内存也会断开映射。
必须所有映射到共享内存的进程都断开映射才会删除这片共享内存
3断开共享内存映射
int shmdt(const void *shmaddr);shmdt 断开共享内存映射断开不代表删除共享内存只是断开映射的线路 shmaddr共享内存地址
4控制共享内存
int shmctl(int shmid, int cmd, struct shmid_ds *buf);shmid 共享内存ID cmd执行的具体操作 IPC_RMID表示可以删除共享内存 IPC_STAT得到共享内存的状态把共享内存的shmid_ds结构复制到buf中 IPC_SET改变共享内存的状态把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内 buf共享内存管理的结构体 必须所有映射到共享内存的进程都断开映射才会删除这片共享内存
4.例程
1write端代码
#include apue.h
#include sys/ipc.h
#include sys/shm.h
//write hello world
//another program read this msgint main(int argc, char **argv)
{//1.根据文件和id获取keykey_t key;key ftok(., 2);//2.根据key创建共享存储区int shmid 0;shmid shmget(key, 1024, IPC_CREAT|IPC_EXCL|0666);if (shmid -1) {perror(shmget error);return -1;}//3.连接共享存储区和进程地址空间char *shmaddr NULL;shmaddr shmat(shmid, 0, 0);if (shmaddr (char *)-1) {perror(shmat error);return -1;}//4.写入数据strcpy(shmaddr, hello world);sleep(5);//5. 断开共享存储连接shmdt(shmaddr);//6. 删除共享存储区shmctl(shmid, IPC_RMID, NULL);printf(success write!!\n);return 0;
}2read端代码
#include stdio.h
#include string.h
#include sys/ipc.h
#include sys/shm.h
//write hello world
//another program read this msgint main(int argc, char **argv)
{//1.根据文件和id获取keykey_t key;key ftok(., 2);//2.根据key创建共享存储区int shmid 0;shmid shmget(key, 0, 0);if (shmid -1) {perror(shmget error);return -1;}//3.连接共享存储区和进程地址空间char *shmaddr NULL;shmaddr shmat(shmid, 0, 0);if (shmaddr (char *)-1) {perror(shmat error);return -1;}printf(read data is %s \n, shmaddr);//5. 断开共享存储连接shmdt(shmaddr);printf(success read!!\n);return 0;
}gcc编译后测试效果如下~当然这只是一个简单的demo正常我们使用的话一定要用信号量等手段进行共享内存的保护