zoukankan      html  css  js  c++  java
  • 共享内存

    效率: 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建 立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回 文件的。因此,采用共享内存的通信方式效率是非常高的。

    共享内存没有任何的同步与互斥机制,所以要使用信号量来实现对共享内存的存取的同步

    shmget函数

    shmget函数创建一个新的共享内存区,或者访问一个已存在的共享内存区。

    #include <sys/shm.h>

    int  shmget (key_t key,  size_t size, int oflag) ;

    返回值是一个称为共享内存区标识符的整数,其他三个shmXXX函数就用它来指代这个内存区。

    参数key既可以是ftok的返回值,也可以是IPC_PRIVATE。系统建立IPC通讯 ( 消息队列、 信号量和 共享内存) 时必须指定一个ID值。通常情况下,该id值通过ftok函数得到,由内核变成标识符,要想让两个进程看到同一个信号集,只需设置key值不变就可以。

    参数size是指定内存区的大小。(若访问已存在的内存区,则size应为0),它的值一般为一页大小的整数倍(未到一页,操作系统向上对齐到一页,但是用户实际能使用只有自己所申请的大小)。

    参数oflag是读写权限值的组合。创建一个新的共享内存,将shmflg 设置了IPC_CREAT标志后,共享内存存在就打开。而IPC_CREAT | IPC_EXCL则可以创建一个新的,唯一的共享内存,如果共享内存已存在,返回一个错误。一般我们会还或(‘|’)上一个文件权限

    当实际操作为创建一个新的共享内存区时,该内存区被初始化为size字节的0。

    shmat函数

    由shmget函数创建或打开一个共享内存区后,通过调用shmat把它附接到调用进程的地址空间。

    #include <sys/shm.h>

    void* shmat (int shmid,  const void* shmaddr,  int flag) ;

    参数shmid是由shmget返回的标识符。

    shmat的返回值是所指定的共享内存区在调用进程内的起始地址。(一般把参数shmaddr置为NULL,让系统替调用者选择地址)

    参数flag可以指定SHM_RDONLY值,它限定只读访问。(默认可同时读写)通常为0.

    shmdt函数

    当一个进程完成某个共享内存区的使用时,它可以调用shmdt断接这个内存区。

    #include <sys/shm.h>

    int  shmdt (const void* shmaddr) ;

    参数addr是以前调用shmat时的返回值

    当一个进程终止时,它当前附接着的所有共享内存区都自动断接掉。

    注意,本函数只是断开关联,并不删除所指定的共享内存区。删除工作通过以IPC_RMID命令调用shmctl完成。(XSI IPC都是随内核持续的)

    shmctl函数

    shmctl提供了对一个共享内存区的多种操作。

    #include <sys/shm.h>

    int  shmctl (int shmid,  int cmd, struct shmid_ds* buff) ;

    参数cmd:

    IPC_RMID 从系统中删除该共享存储段。因为每个共享存储段有一个连接计数器,所以除非使用该段的最后一个进程终止或与该段脱接,否则不会实际上删除该存储段。但不管此段是否仍在使用,该段标识符立即被删除,所以不能再用shmat与该段连接

    (1)第一个参数,shm_id是shmget函数返回的共享内存标识符。
    (2)第二个参数,cmd是要采取的操作,它可以取下面的三个值 :    
    IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。    
     
    IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值    
     
    IPC_RMID:删除共享内存段
     
    (3)第三个参数,buf是一个结构指针,它指向共享内存模式和访问权限的结构。 shmid_ds结构至少包括以下成员 

    struct shmid_ds
    {
    uid_t shm_perm.uid;
    uid_t shm_perm.gid;
    mode_t shm_perm.mode;
    };

    转自:https://blog.csdn.net/ctthuangcheng/article/details/9271431

    实践经验:unix内核并不像格式化磁盘一样格式化共享内存,所以用户必须人为的把大共享内存划分为单个的小记录块。

    常见应用模型:

    1.  1-1模型

  • 相关阅读:
    计算机基础之硬件
    小白日记11:kali渗透测试之服务扫描-banner、dmitry、nmap特征库、操作系统识别、SNMP
    小白日记12:kali渗透测试之服务扫描(二)-SMB扫描
    小白日记10:kali渗透测试之端口扫描-UDP、TCP、僵尸扫描、隐蔽扫描
    小白日记9:kali渗透测试之主动信息收集(二)四层发现:TCP、UDP、nmap、hping、scapy
    小白日记7:kali渗透测试之主动信息收集-发现(一)--二层发现:arping/shell脚本,Netdiscover,scapy
    小白日记8:kali渗透测试之主动信息收集(二)三层发现:ping、traceroute、scapy、nmap、fping、Hping
    小白日记6:kali渗透测试之被动信息收集(五)-Recon-ng
    小白日记5:kali渗透测试之被动信息收集(四)--theHarvester,metagoofil,meltag,个人专属密码字典--CUPP
    小白日记3:kali渗透测试之被动信息收集(二)-dig、whios、dnsenum、fierce
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/9368905.html
Copyright © 2011-2022 走看看