4、内存共享

进程之间是相互独立的,那么如何实现进程之间的通信呢?这里可以使用共享内存的方式来实现。
共享内存ShareMemory是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
共享内存是最快的IPC方式,是针对其他进程之间通信效率低下而专门设计的,它往往与其它通信机制,如信号量配置使用以实现进程之间的同步和通信。
共享内存是操作系统中比较特殊的内存,它并不依赖于任何进程,也不属于任何进程。通过调用系统函数创建共享内存,并指定它的索引,也就是它的IDshmid,通过索引任何进程都可以在共享内存中申请内存空间并存储对应的值。
image.png
共享内存:

  1. 共享内存并不属于任何一个进程
  2. 在共享内存中分配的内存空间可以被任何进程访问
  3. 即使进程关闭,共享内存仍然可以继续保存在操作系统中。

Linux查看操作系统中共享内存的分片:ipcs -m

  1. ------------ 共享内存段 --------------
  2. shmid 拥有者 权限 字节 连接数 状态
  3. 0x00000000 131072 jc 777 16384 1 目标
  4. 0x00000000 327681 jc 600 67108864 2 目标
  5. 0x00000000 262146 jc 777 8077312 2 目标

Swoole没有采用多线程模型而是使用的多进程模型,在一定程度上减少了访问数据时加锁解锁的开销,但同时也引入了新的需求共享内存。
Swoole中为了更好的进行内存管理,减少频繁分配释放内存空间造成的损耗和内存碎片,Rango(韩天峰)实际并实现了三种不同功能的内存池分别时FixedPool、RingBuffer、MemoryGlobal。