【Linux系统编程】浅谈进程地址空间与虚拟存储空间

早期的内存分配机制

在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说​程序中访问的内存地址都是实际的物理内存地址​。当计算机同时运行多个程序时,必须保证这些程序用到的内存总量要小于计算机实际物理内存的大小。

那当程序同时运行多个程序时,操作系统是如何为这些程序分配内存 的呢?下面通过实例来说明当时的内存分配方数据法:

某台linux是什么操作系统计算机总的内存大小是128M,现在同时运行两个程序A和B,A需占用内存10M,数据恢复B需占用内存110。计算机在给程序分配内存时会采取这样的方法:先将内存中的虚拟地址注册公司合法吗前10M分配给程序A,接着再从内存中剩余的118M中划分出110M分配给程序B。这种分配方物理地址和ip地址法可以保证程序A和物理地址程序B都能运行,但是这种简单的内存分配策略问题很多。

早期的内存分配方虚拟地址怎么弄

问题1​:进程地址空间不隔离。由于程序都是直接访问物理内存,所以恶意程序可以随意修改别的进程的内存数据,以达到破坏linux常用命令的目的。有些非恶意的,但虚拟地址转换为物理地址是有bug 的程序也可能系统/运维不小心修改了其它程序的内linux存数据,就会导致其它程序的运行出现异常。这种情况对用户来说是无法容忍的,因为用户希望使用计算机的时候,其中一个任务失败了数据分析师,至少不能影响其它的任务。

问题2​:内存使用效率低。在A和B都运行的情况下,如果用户又运行了程序C,而程序C需要20M大小的内存才能运行,而此时系统只剩下8M的空间可供使用,所以此时系统必须在已运行的程序中选择一个将该程序的数据暂时拷贝到硬盘上,释放出部分空间来供程序C使用,然后再将程序C的数据全部装入内存中运行。可以想象得到,在这个过程中,有大量的数据在装入装出,导致效率十分低下。

问题3​:程序运行的地址不确定。当内存中的剩余空间可以满足程序C的要求后,操作系统会在剩余空间中随机分配一段连续的20M大小的空间给程序C使用,因为是随机分配物理地址和ip地址的区别的,所以程序运行的地址是不确定的。

分段

为 了解决上述数据库问题,人们想到了一种变通的方法,就是增加一个中间层,利用一种间接的地址访问方法访问物理内存。按照这种数据恢复方法,程序中访问的内存地址不再是实际的物理内存地址,而是一个虚拟地址,然后由操作系统将这个虚拟地址映射到适当的物理内存地址上​。这样linux必学的60个命令,只要操作系统处理好虚拟地址到物理内存地址linux是什么操作系统的映射,就数据废土可以保证不同的程序虚拟地址软件最终访问的内存地址位于不同的区域,彼此没有重叠,就可以达到内存地址空间隔离linux系统安装的效果。

创建一个进程物理地址和逻辑地址时,操作系统会为该进程分配一个4GB大小的虚拟进虚拟地址被工商局查了地址空间。之所以是4GB,是因为在32位的操作linux必学的60个命令系统中,一个指linux操作系统基础知识针长度是4字节,而4字节指针的寻址能力是从0x00000000~0xFFFFFFFF,最大值0xFFFFFFFF表示的即为4GB大小的容量。与虚拟地址空间相对的,还有一个物理地址空间,这个地址空间对应的是真实的物理内存。如果你的计算机上安装数据漫游是什么意思了512M大小的内存数据分析,那么这个物理地址空间表示的范围是0x00000000~0x1FFFFFFF。当操作系统做虚拟地址到物理地址映射时,只能映射到这一范围,操作系统也只会映射到这一范围。当进程创建时,每个进程都物理地址和ip地址会有一个自己的4GB虚拟地址空间。要注意的是这个4GB的地址linux必学的60个命令空间是数据透视表“虚拟”的,并不是真实存在的,而且每个进程只能访问自己虚拟地址空间中的数据,无法访问别的进程中的数据,通过这种方法实现了进程间的地址隔离。那是不物理地址怎么算是这4GB的虚拟地址空间应用程序可以随意使用呢?很遗憾,在Windows系统下,这个虚拟地址空间被分成了4部分:NULL指针区、用户区、64KB禁入区、内核物理地址格式区。

1)NULL指针区(0x00000000~0x0000FFFF): 如果进程中的一个线程试图操作这个分区linux常用命令中的数据,CPU就会引发非法访问。他的作用是,调用 malloc 等内存分配函虚拟地址转换为物理地址数时,如果无法找到足够的内存空间,它将返回 NULL。而不进行安全性检数据查。它只是假设地址分配成功,物理地址和逻辑地址并开始访问内存地址 0x00000000(NULL)。由于禁止访问内存的linux这个分区,因此会发生非法访问现象,并终止这个进程的运行。系统运维工资一般多少

2)用户模式分区( 0x00010000~0xBFFEFFFF):这linux操作系统基础知识个分区中存放进程的私有地址空间。一个进程无法以任何方式访问另外一个进程驻留在这个分区中的数据(相同 exlinux常用命令e,通过 copy-on-write 来完成地址隔离)。(在windows中系统运维工资一般多少,所linux操作系统基础知识有 .exe 和动态链接库都载入到这一区域。系统同时物理地址会把该进程可以访问的所有linux系统安装内存映射linux删除文件命令文件映射到这一分区)。

2)隔离区数据漫游(0xBFFF0000~0xBFFFFFFF):这个分区禁止进入。任何试图访问这个内存物理地址怎么修改分区的操作linux命令都是违规的。微软保留这块分区的目的是为了简化操作系统的现实。

3)内核区(0xC0000000~0xFFFFFFFF):这物理地址和ip地址个分区存放操作系统驻留的代码。线程调度、内存管理、文件系统支持、网络支持和所有设备驱动程序代码都在这个分区加linux是什么操作系统载。这个分区被所有进程共享。

应用程序能使用的只是用户区而已,大约2GB左右(最大可以调整到3GB)。内核区为2GB,内核区保存的是系统线程调度、内存管理、设备驱动等数据,这部分数据供所有的进程共享,但应用程序是不能直接访问的。

人们之所以要创建一个虚拟地址空间,目的是为了解决进程地址空间隔离的数据透视表问题​。但程序要想执行,必须运行在真实的内存上,所以,必须在虚拟地址与物理地址间建立一种映射关系。这样,通过映射机制,当程序访问虚拟地址空间上的某个地址值时虚拟地址注册营业执照,就相当于访问了物理地址空间中的另一个值。人们想到了一种分段(Sa数据漫游gmentation)虚拟地址注册营业执照的方法,它的思想是在虚拟地址空间和物理地址空间之间做一一映射虚拟地址怎么弄。比如说虚拟地址空间中某个10M大小的空间映射到物理地址空间中某个10M大小的空间。这种思想理解起来并不难,操作系统保证不同进程的地址空间被映射到物理地址空间中不同的区域上,这样每个进程最终访问到的。

物理地址空间都是彼此分开的。通过这种方式,就实现了进程间的地址隔linux常用命令离。还是以实例说明,假设有两个进程A和B,进程A所需内存大linux删除文件命令小为10M,其虚拟地址空间分布在0xlinux系统00000000到0x00A00000,进程物理地址怎么算B所需内存为100M,其虚拟地址空间分布为0x00000000到0x06400000。那么按照分段的映射方法,进程A在物linux命令linux必学的60个命令内存上映linux必学的60个命令射区域为0x00100000到0x00B00000,,进程B在物理内存上映射区域为0x00C00000到0x07000000。于是进程linuxA和进程B分别被映射到数据恢复了不同的内存区间,彼此互不重叠,实现了地址隔离。从应用程序的角度看来,进程A的地址空间就是分布在0x00000000到0x00A00000,在做开发数据时,开发人员只需访问这段区间上的地址即可。应用程序并不关心进程A究竟被映射到物理内存的那块区域上了,所以程序的运行地址也就是相当于说是确定的了。 下图显示的是分段方式的内存映射方法:


                                            【Linux系统编程】浅谈进程地址空间与虚拟存储空间

分段方式的内存linux重启命令映射方法

这种分段的映射方法虽然解决了上述中的问题一和问题三,但并没能解决问题二,即内存的使用效率问题。在分段的映射方法中,每次换入换出内存的都是整个程序, 这样会造成大量的磁盘访问操作,导致效率低下。所以这种映射方法还是稍显粗糙,粒linux是什么操作系统度比较大。实际上,程序的运行有局部性特点,在某个时间段内,程序只是访问程序的一小部分数据,也就是说,程序的大部分数据在一个时间段内都不会被用到。基于这种情况,人们想到了粒度更小的内存分割和映射方法,这种方法就是分页(Paging物理地址和mac地址)。

分页

分页的基本方法是,将地址空间分成许多的页。每页的大小由CPU决定,然后由linux删除文件命令虚拟地址转换为物理地址作系统选择页的大小。目前Inter系列的CPU支持4KB或4M数据分析B的页大小,而PC上目前都选择使用4KB。按这种选择,4物理地址怎么算GB虚拟地址空间共可以分虚拟地址怎么弄成1048576 页,512M的物理内存可以分为131072个页。显然虚拟空间的页数要比物理空间的页数多linux必学的60个命令得多虚拟地址空间怎么算

在分段的方法中,每次程序运行时总是把程序全部装入内存,而分页的方法则有所不同。分页的思想是程序运行时用到哪页就为哪页分配内存,没用到的页暂时保留在硬盘上。当物理地址和mac地址用到这些页时再在物理地址空间中为这些页分配内存,然后建立物理地址格式虚拟地址空间中的页和刚分配的物linux删除文件命令理内存页间的映射。

下面通过介绍一个可执行文件的虚拟地址怎么弄装载过程来说明分页机制的实现方法。一个可执行文件(PE文件)其实就物理地址和逻辑地址的关系是一些编译链接好的数据和指令的集合,它也会被分成很多页,在PE文件执行的过程物理地址查询中,它往内存中装载的单位就是页。当一个PE文件被执行时,linux删除文件命令操作系统会先为该程序创建一个4GB的进程虚拟地址空间。前面介绍过,虚拟地址空间只是一个中间层而已虚拟地址被工商局查了,它的功能是利用一种映射机制将虚拟地址空间映射到物理地址空间,所以,创linux删除文件命令系统运维工资一般多少4GB虚拟地址空间其实并不是要真的创建空间,只是要创物理地址格式建那种映射机制所需要的数据结构而已,这种数虚拟地址软件据结构就是页目和页表。

当创建完虚拟地址空间所需要的数据结构后,进程开始读取PE文件的第一页。在PE文件的第一页包含了PE文件头和段表等信息,进程根据文件头和段表等信息,将PE文件中所有的段一一映射到虚拟地址空间中linux常用命令相应的页(PE文件中的段的长度都是页长的整数倍)。这时PE文件的真虚拟地址怎么弄正指令和数据还没物理地址怎么修改有被装入内存虚拟地址软件中,操作系统只是据PE文件的头部等信息建立了PE文件和进程虚拟地址数据废土空间中页的映射关系而已。当CPU要访问程序中用到物理地址怎么算的某个虚拟地址时,当C系统/运维PU发现该地址并没有相相关联的物理地址时,CPU认为该虚拟地址所在的页面是个空页面,CPU会认为这是个页错误(Page Fault),CPU也就知道了操作系统还未给该PE页面分配内存,CPU会将控制权交还给操数据漫游是什么意思作系统。操作系统于是为该PE页面在物理空间中分配一个页面,然后再将这个物理页面与虚拟空间中的虚拟页面映射起数据透视表来,然后将控制权再还给进程,进程从刚才发生页错误的物理地址格式位置重新开始执行。由于此时已为PE文件的那个页面分配了内存,所以就不会发生页错误了。随着程序的执行,页错误会物理地址和逻辑地址不断地产生,操作系统也会为进程分配相应的物理页面来满足物理地址格式虚拟地址转换为物理地址程执行的需求。

分页方法的核心思想就是当可执行文件执行到第x页时,就为第x页分配一个内存页y,然后再将这个内存页添加到进程虚拟地址空间的映射表中,这个映射表就相当linux常用命令于一个y=f(x)函数。应用程序通过这个映射表就可以访问到x页关联的y页了。

逻辑地址、线性地址、物理地址和虚拟地址的区别

逻辑地址(Logical Address)​是指由程式产生的和段相关的偏移地址部分。例如,你在进行 C 语言指针编程中,能读取指针变量本身值( &操作 ),实际上这个值就是逻辑地址,他是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在 Intel 实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,cpu不进行自动地址换);逻辑也就是在Intel保护模式下程式执行代码段限长内的偏移地址(假定美国虚拟地址代码段、数据段如果完全相同)。应用程式员仅需和逻辑地址打交道,而分段和分页机制对你来说是完全透明的物理地址查询,仅由系统编程人员涉及。应用程式员虽然自己能直接操作内linux存,那也只能在操作系统给你分配的内存段操作。

线性地址(Linear Address)​是逻辑地址到物理地址变换之间的中间层。程式代码会产生逻辑地址,或说是段中linux系统安装的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址能再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386 的线性地址空间容量为 4G(2的32次方即32根地址总线寻址数据库)。

物理地址(Physical Address)​是指出目前 CPU 外部地址总线上的寻址物理内存的地虚拟地址注册公司合法吗址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目数据分析录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物系统运维工资一般多少理地数据废土址了。

虚拟内存(Vir物理地址和逻辑地址tual Memory)​是指计算机呈现出要比实际拥有的内存大得多的内存量。因此他允许虚拟地址空间怎么算程式员编制并运行比实际系统拥有的内存大得多的程式。这使得许多大linux系统安装型项目也能够在具有有限内存资源的系统上实现。一个非常恰当的比喻是:你不必非常长的轨道就能让一列火车从上海开到北京。你只需要足够长的铁轨(比如说3公里)就能完成这个任务。采取的方法是把后面的铁轨即时铺到火车物理地址怎么算的前面,只要你的操作足够快并linux系统能满足物理地址和逻辑地址需求,列车就能象在一条完整的轨道上运行。这也就是虚拟内存管理需要完成的数据分析师任务。在 Linux0.11 内核中,给每个程式(进程)都划分了总容物理地址格式量为 64MB 的虚拟内存空间。因此程式的逻辑地址范围是 0x0000000 到 0x4000000。​有时我们物理地址查询也把逻辑地址称为 虚拟地址​。因为和虚linux常用命令拟内linux存空间的概念类似,逻辑地址也是和实际物理内存容量无关linux操作系统基础知识的。逻辑地址和物理地址的“差距”是 0xC0000000,是由物理地址和逻辑地址的关系于虚拟地址->linux操作系统基础知识;线性地址->物理地址映射正好差这个值。这个值是由操作系统数据分析指定的。机理逻辑地址(或称为虚拟地址)虚拟地址被工商局查了到线性地址是由CPU的段机制自动换的。如果没有开启分页管理,则线性地址就是物理地址。如果开启了分页管理,那么系统程式需要参和线性地址到物理地址的转换过程。具体是通过设置页目录表和页表项进行的。美国虚拟地址