Linux·进程控制(system V)

1. 共享内存        

        system V共享内存是最快的IPC形式,之前的管道是基于Linux内核开发的通讯方案,其读写接口都是现成的,因此内核设计者为了完成进程间通讯任务并不需要新增太多代码。而共享内存属于system V标准,是操作系统单独设计的一种通讯方案。

        简单来说,共享内存的实现形式和动态库很像,也是在物理内存中开辟一块空间,通过页表映射到两个不同的进程中,此时两个进程就能通过虚拟地址空间寻到同一块资源了。

        共享内存交给页表映射虚拟地址的操作叫做,将共享内存挂接到进程地址空间中。如果不用共享内存了,就把页表中的映射关系删除,这步操作叫去关联,当所有进程都与这块共享内存去关联之后,就可以把这块内存释放了。

        共享内存在任何时刻可以在OS中存在很多个,因此OS要先描述再组织,把共享内存们管理起来。

                        

        shmget()创建共享内存的函数。

        第一个参数key表示共享内存的唯一标识符,后面我们再说它

        第二个参数size表示创建共享内存块的大小。

        第三个参数shmflg有很多选项,我们就关注两个 IPC_CREAT IPC_EXCL

         IPC_CREAT:单独使用,如果共享内存块shm不存在就创建它,如果存在就获取它并返回

        IPC_EXCL:单独使用无意义,只有 IPC_CREAT | IPC_EXCL 如此将两个选项组合在一起如果shm不存在就创建它,如果存在就出错返回。

        这两个选项,第一个选项的作用是保证进程能拿到共享内存,第二个选项是标识不拿老的共享内存。

        返回值,成功返回shmid共享内存面向用户的标识符,如果创建失败返回-1

        key是函数参数,也就是要用户自己设定的,之所以不让系统设置因为如果系统能设置,岂不是系统自己就能有通讯方案了,再一个共享内存空间是A进程创建的,B进程与A进程之间是独立的,即使key可以由系统自己设置,B进程也无法得知A进程创建的共享内存空间的key。

        如果让用户来创建key值,那么在全局范围如果能把key值创建成功,说明就能同时让AB进程拿到key值的同时,保证这个key值对应的共享内存块是唯一的。

        在理论上key值可以由用户任意设置,但是有可能会出现该key值与现有key值冲突的情况,那共享内存就创建失败了,此时程序员就要手动修改key值,说白了这个key值就是一个一个碰出来的。因此虽然这个key值需要程序员去设置,但是不希望由程序员去生成,因此我们退出ftok()函数来生成这个唯一码。

        ftok()函数

                

        这个函数可以把字符串和数字通过特定算法整合,生成一个尽量的唯一值。第一个参数我们可以选择一个AB进程的公共路径,第二个参数选择项目id

        如果生成成功了,就会返回一个合法内存标识符

                

        此时我们让server进程创建共享内存空间

                        

        但是我们发现第一次运行server进程,成功创建了共享内存空间,但是后面就不能正确创建了。

        这是因为今天这个共享内存看起来是由进程创建的,但是实际上我们是用系统调用shmget()申请的内存空间,而这块空间会被认为成操作系统申请的,借了进程的手创建的,因此这块空间并不会随进程的结束而释放,而是随操作系统的退出而释放。

        共享内存的声明周期:随内核。要么用户要求OS释放,要么操作系统重启。

1.2 共享内存的管理指令

        查看共享内存 ipcs -m 指令

        

        如果只用ipcs指令会把消息队列,共享内存,信号量全打出来,选项-m可以筛选处共享内存。

        这里我们也可以看到我们刚刚创建的共享内存nattch表示当前多少进程相关,目前没有挂机就没有。

        

        删除共享内存 ipcrm -m (shmid) 命令

        shmid和key的区别,shmid是只给用户用的一个标识shm的标识符,key只作为内核中区分shm唯一性的标识符,不作为用户管理shm的id值。

        perms 表示共享内存的权限

        bytes 表示共享内存的大小,操作系统会以块为单元为用户申请空间,也就是单次最小申请4KB但如果用户代码中要求4097个字节,第二页中用户就只能使用1个字节,也就是操作系统虽然申请的第二个4KB但是只让用户用一个字节。

        

        代码删除共享内存 man shmctl 查看

                

        这个函数集成了对于共享内存的删改查等操作功能。

        第一个参数shmid不用说了,指定某个共享内存

        第二个参数 cmd 是选择操作方案,删除就选 IPC_RMID ,如果是删除就可以不要第三个参数。

        shmat()函数,把共享内存挂接到进程自己的地址空间上

                

        第一个参数shmid,共享内存面向用户的唯一标识符

        第二个参数shmaddr,可以由用户指定将共享内存挂接到虚拟地址的什么位置,不过我们不用管它,直接设置成nullptr就可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值