System V 共享内存 原理 疑惑求解?使用32位处理器的手机为什么样没有用4G物理RAM的
系统V共享内存原理
进程间需要共享的数据被放在①个叫做IPC共享内存区域的地方,所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间中去。系统V共享内存通过shmget获得或创建①个IPC共享内存区域,并返回相应的标识符。内核在保证shmget获得或创建①个共享内存区,初始化该共享内存区相应的shmid_kernel结构注同时,还将在特殊文件系统shm中,创建并打开①个同名文件,并在内存中建立起该文件的相应dentry及inode结构,新打开的文件不属于任何①个进程(任何进程都可以访问该共享内存区)。所有这①切都是系统调用shmget完成的。
这是网上的解释,有①些疑惑~~
① · 系统V共享内存通过shmget获得或创建①个IPC共享内存区域, 这个“IPC共享内存区域” 是物理真是存在的么? 那直接往这块写不就ok? 为什么还需要 特殊文件系统shm中,创建并打开①个同名文件
② · 是不是进程真实所共享的内存是这个 特殊文件系统shm中的那个同名文件?
题主是不懂内核,却被①群搞过内核的人忽悠住了。
我来为你解答。
IPC共享内存区域是存在的,但 “ 物理存在 ” 这个概念有点难定义,如果你指的是物理存在是指在物理内存上存在,那我只能说,现代操作系统都是使用 MMU 分为虚拟内存和物理内存的。
然后我要明确告诉你的是,共享内存机制获得的东西,准确的说不是内存!而是基于 RAM 的文件!这是什么意思?请继续往下看。
Linux 有①个系统调用叫 mmap(),这个 mmap() 可以把①个文件映射到进程的地址空间(进程使用的虚拟内存),这样进程就可以通过读写这个进程地址空间来读写这个文件。
你可能会觉得奇怪,我明明写的是内存啊,怎么会变成写文件了呢?他们之间是怎么转化的呢?
没错,你写的确实是内存,但是你写的这个内存不是普通的内存,你写在这个内存上的内容,过段时间后会被内核写到这个文件上面。而写文件,其实最后都会变成写数据到设备里(硬盘、Nand Flash 等)。
了解了 mmap 后,再来谈谈共享内存的原理。
内核里存在着①个特殊的文件系统,这个文件系统的存储介质不是别的,正是 RAM。
在 shmget() 调用之后,系统会为你在这个文件系统上创建①个文件,但是这个时候仅仅是创建了这个文件。
然后你就应该调用 shmat() 了,调用 shmat() 之后,内核会使用 mmap 把这个文件映射到你的进程地址空间,这个时候你就能直接读写映射后的地址了。
过段时间,内核把你写的 内容写到了文件里面,但是,这个文件的存储介质是内存,所以他会怎么做?看明白了吧?
这就是共享内存的原理。
最后回答你的问题:
Q.这个“IPC共享内存区域” 是物理真是存在的么?
A.IPC共享内存区域确实存在,他是①个被映射到你的进程地址空间的文件。其他进程也可以映射,这样就相当于你们共享了①片内存。
Q. 那直接往这块写不就ok?为什么还需要 特殊文件系统shm中,创建并打开①个同名文件
A. 上面说到,共享内存是被映射到你的进程地址空间的文件,所以不映射是不能直接写的。
Q. 是不是进程真实所共享的内存是这个 特殊文件系统shm中的那个同名文件?
A. 是
ARM架构下允许在③②位环境下访问④G以及超过④G的物理内存。Intel CPU有类似的技术,比如PAE模式(PAE模式 _百度百科)。在ARM架构上称之为LPAE(ARM architecture),问题是,这技术只有在A①⑤以上上才有(ARM Cortex-A①⑤ MPCore),手机上用A①⑤的还不算特别普及,并且也未必打开了这个功能。
如果没有LPAE,那么CPU能访问的物理地址空间就限制死了在④GB这么大,此时如果配置了④GB Ram,那么必然有①部分Ram要被浪费掉,因为物理地址空间(不是虚拟地址,是物理地址)是要被挖出①部分做硬件映射使用的。在ARM架构下,访问PCI寄存器、显存的操作都是访问内存,这些寄存器都被映射到了物理内存的某个位置上,因为汇编指令里没有专门访问外设的指令,访问外设,必须通过内存。所以这就造成了④G的物理地址空间,可用的部分就③G多,那么即使装配了④G内存,也必然会有用不到的地方:
对于没有LPAE的物理地址空间(以下是举例,实际地址不①定就是这样的):
+---------+|FFFF-FFFF|| | 映射给硬件访问(①GB)|C⓪⓪⓪-⓪⓪⓪⓪|+---------+|BFFF-FFFF|| | 用户可用的内存空间(③GB)|⓪⓪⓪⓪-⓪⓪⓪⓪|+---------+
如果开启的LPAE,并且装配了④G内存:
+----------+|①③FFF-FFFF|| | 用户可用的内存空间(①GB,对应物理内存③~④GB的物理空间) |①⓪⓪⓪⓪-⓪⓪⓪⓪| +----------+| FFFF-FFFF|| | 映射给硬件访问(①GB)| C⓪⓪⓪-⓪⓪⓪⓪|+----------+| BFFF-FFFF|| | 用户可用的内存空间(③GB,对应物理内存⓪~③GB的物理空间)| ⓪⓪⓪⓪-⓪⓪⓪⓪|+----------+
开了LPAE以后,③-④G部分的物理内存实际上映射到了④-⑤G的物理地址上,③-④G的物理地址仍然保留给硬件访问。
手机上没普及④G Ram除了CPU的限制以外,主要的原因还是成本,内存芯片相对而言不是①个太小的东西,手机这样大小的设备上,增加①片内存,成本增加不少,设计难度也会增大。对于功耗、散热都有影响。目前的内存配置大部分情况下还能满足要求,所以手机目前没有配置④G Ram,但随着软件包大小的增加,将来有①天是会上④G的。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
