美文网首页
41|共享内存(中)

41|共享内存(中)

作者: AndyWei123 | 来源:发表于2020-05-18 01:00 被阅读0次
image.png

使用共享内存流程如下:

  • 调用 shmget 创建共享内存。
  • 先通过 ipc_findkey 在基数树中查找 key 对应的共享内存对象 shmid_kernel 是否已经被创建过,如果已经被创建,就会被查询出来。
  • 如果共享内存没有被创建过,则调用 shm_ops 的 newseg 方法,创建一个共享内存对象 shmid_kernel。
  • 在 shmem 文件系统里面创建一个文件,共享内存对象 shmid_kernel 指向这个文件,这个文件用 struct file 表示,我们姑且称它为 file1。

shm 代表共享内存,而 shmem 代表shmem 文件系统

  • 调用 shmat,将共享内存映射到虚拟地址空间。
  • shm_obtain_object_check 先从基数树里面找到 shmid_kernel 对象。
  • 创建用于内存映射到文件的 file 和 shm_file_data,这里的 struct file 我们姑且称为 file2。
  • 关联内存区域 vm_area_struct 和用于内存映射到文件的 file,也即 file2,调用 file2 的 mmap 函数。
  • file2 的 mmap 函数 shm_mmap,会调用 file1 的 mmap 函数 shmem_mmap,设置 shm_file_data 和 vm_area_struct 的 vm_ops。
  • 内存映射完毕之后,其实并没有真的分配物理内存,当访问内存的时候,会触发缺页异常 do_page_fault。
  • vm_area_struct 的 vm_ops 的 shm_fault 会调用 shm_file_data 的 vm_ops 的 shmem_fault。
  • 在 page cache 中找一个空闲页,或者创建一个空闲页。

相关文章

  • 41|共享内存(中)

    image.png使用共享内存流程如下: 调用 shmget 创建共享内存。 先通过 ipc_findkey 在基...

  • 进程通信:共享内存,套接字

    进程通信方式:共享内存 共享内存本质上就是每个进程将虚拟地址空间指向共享内存块中,当一个进程往一个共享内存快中写入...

  • linux c/c++面试知识点整理(五)

    41、linux系统进程间有哪些通信方式 管道、有名管道、消息队列、信号、共享内存、socket、文件 ...

  • 共享内存数据库--设计及实现

    共享内存: 共享内存是三种IPC机制中的一种.共享享内存允许两个或多个进程进程共享同一块内存(这块内存会映射到各个...

  • 深信服一面C++

    首先自我介绍 Linux中创建共享内存的方式?共享内存中起始地址是不是按照页的大小对齐?创建共享内存的时候物理页一...

  • 深信服一面C++

    首先自我介绍 Linux中创建共享内存的方式?共享内存中起始地址是不是按照页的大小对齐?创建共享内存的时候物理页一...

  • boost 内存共享跨线程

    写一个模块用于跨进程内存共享,boost 很好的提供了在共享内存上的内存分配器,可以在共享内存中创建容器,然后跨进...

  • 共享内存的学习以及使用笔记

    什么是共享内存 在软件中,术语共享内存指可被多个进程存取的内存,一个进程是一段程序的单个运行实例。 共享内存有什么...

  • JVM

    JVM 内存模型 共享 实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用“共享变量”这个术语...

  • Java的并发

    Java的内存模型-JMM 线程A先将变量从共享内存保存到本地内存(可以是寄存器),修改后,再写入到共享内存中。这...

网友评论

      本文标题:41|共享内存(中)

      本文链接:https://www.haomeiwen.com/subject/kwkyohtx.html