虚位以待(AD)
虚位以待(AD)
首页 > 操作系统 > LINUX > IPC----共享内存

IPC----共享内存
类别:LINUX   作者:码皇   来源:<a href="http://blog.csdn.net/dancer_0405" target="_blank" rel="nofollow   点击:

什么是共享内存:共享内存允许两个或多个进程访问给定的同一块存储区域。已知当一个进程被启动时,系统会为其创建一个 0~4G 的虚拟内存空间, 根据虚拟地址与物理地址之间的映射关系,进程可以通过操作虚拟地址,实现对物理页面的操作。

1.什么是共享内存:共享内存允许两个或多个进程访问给定的同一块存储区域。已知当一个进程被启动时,系统会为其创建一个 0~4G 的虚拟内存空间, 根据虚拟地址与物理地址之间的映射关系,进程可以通过操作虚拟地址,实现对物理页面的操作。
一般情况下,每个进程的虚拟地址空间会与不同的物理地址进行映射,但是当使用共享内存进行通信时,系统会将同一段物理内存映射给不同的进程。
两个进程的虚拟地址空间与共享内存之间的映射关系如下图
这里写图片描述
系统中的物理内存和虚拟内存都通过页面来管理,为多个进程分配共享内存,实际是为进程分配一个或多个物理页面,因此,共享内存的大小必须是系统中页面大小的整数倍<喎"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjxiciAvPg0KMi65ss/txNq05r2owaK1xLn9s8w8YnIgLz4NCiZsdDsxJmd0O8rXz8i9q9DpxOLE2rTmv9W85NPrubLP7TxiciAvPg0KxNq05r340NDTs8nko6w8YnIgLz4NCiZsdDsyJmd0O9OzyeTN6rPJuvOjrL34s8y21NDpxOK12Na3tcS2wdC0o6y+zc/gtbHT2taxvdO21M7vwO3E2rTmPGJyIC8+DQq1xLbB0LShozxiciAvPg0KJmx0OzMmZ3Q7we3N4qOs0+vJ6sfrttG/1bzkwODLxqOstbHNqNDFzeqzydauuvOjrNKy06bKzbfFzu/A7cTatOajrL3is/29+LPM0+u5ss/txNq05rXE07PJ5LnYz7WhozxiciAvPg0KMy65ss/txNq05tPQudi1xLqvyv08L3A+DQo8cHJlIGNsYXNzPQ=="brush:sql;">1.int shmget(key_t key, size_t size, int shmflg);//功能是创建一块新的共享内存,或打开一块已经存在的共享内存//第一个参数key,代表共享内存的键值//第二个参数size用于设置共享内存的大小//第三个参数 shmflg 用于设置 shmget()函数的创建条件(一般设置为 IPC_CREAT 或 IPC_EXCL)及进程对共享内存的读写权限。2.void *shmat(int shmid, const void *shmaddr, int shmflg);//功能是进行地址映射,将共享内存映射到进程虚拟地址空间中//第一个参数 shmid 为共享内存标识符,该标识符一般由shmget()函数返回;//参数 shmaddr 为一个指针类型的传入参数,用于指定共享内存映射到虚拟内存时的虚拟地址,当设置为 NULL 时,映射地址由系统决定;//参数 shmflg 用于设置共享内存的使用方式,若 shmflg 设置为 SHM_RDONLY,则共享内存将以只读的方式进行映射,当前进程只能从共享内存中读取数据。3.int shmdt(const void *shmaddr);//功能是解除物理内存与进程虚拟地址空间的映射关系4.int shmctl(int shmid, int cmd, struct shmid_ds *buf);//功能是对已存在的共享内存进行操作,具体的操作由参数决定//参数 shmid 表示共享内存标识符;//参数 cmd 表示要执行的操作,常用的设置为IPC_RMID,功能为删除共享内存;//参数 buf 用于对共享内存的管理信息进行设置,该参数是一个结构体指针,5.struct shmid_ds *buf结构体如下struct shmid_ds {struct ipc_perm shm_perm; //所有者和权限标识size_t shm_segsz; //共享内存大小time_t shm_atime; //最后映射时间time_t shm_dtime; //最后解除映射时间time_t shm_ctime; //最后修改时间pid_t shm_cpid; //创建共享内存进程的 idpid_t shm_lpid; //最近操作共享内存进程的 idshmatt_t shm_nattch; //与共享内存发生映射的进程数量...};

共享内存代码

    //com.h#include#include#include#include#include#define PATH "."#define SIZE 256int GetShm();
    char* At_Shm(int shm_id);
    int Delete_Shm(char* addr);
    int Rm_Shm(int shm_id);
    int GetShm(){
    key_t key=ftok(PATH,0);
    if(key==-1){
    perror("ftok");
    exit(1);
    }
    int flag=IPC_CREAT|0666;
    int shm_id=shmget(key,SIZE,flag);
    if(shm_id==-1){
    perror("shmget");
    exit(1);
    }
    return shm_id;
    }
    char* At_Shm(int shm_id){
    return (char*)shmat(shm_id,NULL,0);
    }
    int Delete_Shm(char* addr){
    return shmdt(addr);
    }
    int Rm_Shm(int shm_id){
    return shmctl(shm_id,IPC_RMID,NULL);
    }
    //myshm.c#include#include#include"com.h"int main(){
    int shm_id=GetShm();
    pid_t pid=fork();
    if(pid<0){
    perror("fork");
    exit(1);
    }
    else if(pid==0){
    //child char* buf=At_Shm(shm_id);
    int i=0;
    while(i<60){
    buf[i]='
    A'
    +i;
    i++;
    }
    buf[59]='
    '
    ;
    Delete_Shm(buf);
    //删除映射 }
    else{
    //father char* buf=At_Shm(shm_id);
    sleep(2);
    printf("%sn",buf);
    waitpid(pid,NULL,0);
    Rm_Shm(shm_id);
    }
    return 0;
    }

运行结果
这里写图片描述浏览器使用进程间通信来共享web文件(网页等)和多媒体;
2. 加速:维基百科使用通过进程间通信进行交流的多服务器来满足用户的请求;
3. 模块化;
4. 私有权分离;
缺点
1.采用了某种形式的内核开销,降低了性能;
2.几乎大部分IPC都不是程序设计的自然扩展,往往会大大地增加程序的复杂度。

相关热词搜索: