营口网站建设单位,西安的网站设计公司名称,php自己写框架做网站6,想学ui设计目录一、程序地址空间二、虚拟地址空间1.虚拟内存的原理2.使用虚拟内存的原因#xff1f;3.如何实现虚拟空间#xff1f;4.使用虚拟内存的好处本文主要介绍程序地址空间和虚拟地址空间的概念#xff0c;理解了虚拟地址空间#xff0c;才可以更好的理解物理内存和进程pcb之间…
目录一、程序地址空间二、虚拟地址空间1.虚拟内存的原理2.使用虚拟内存的原因3.如何实现虚拟空间4.使用虚拟内存的好处本文主要介绍程序地址空间和虚拟地址空间的概念理解了虚拟地址空间才可以更好的理解物理内存和进程pcb之间的关系。
一、程序地址空间 程序是存储在硬盘上的一堆代码指令如果要运行程序CPU就会从硬盘中把程序指令拿出来加载到我们的内存中。所以当运行的程序太多的时候内存空间就会不足但是程序本身是不占用内存空间的因为不使用程序的时候代码都存储在硬盘中要运行程序的时候才会将程序加载到内存。 相应的为了更好的运行程序内存空间被划分成了多个区域每个区域都有其对应的作用这里我们就需要简单的了解一下内存空间的布局。 如图这就是内存空间也可以叫地址空间的布局。 用32位系统来说32位系统对应的内存大小是4G。内存空间被分成两部分用户空间和内核空间。其中内核空间是不可以直接访问的必须通过系统提供的系统调用接口去访问内核的功能。内存空间的高地址处是内核空间低地址处才是用户空间。 用户空间从低地址到高地址处依次被划分成这几部分代码区、初始化数据区、未初始化数据区、堆区、共享区、栈区、运行参数和环境变量。 来简单看一下这些部分的作用。
代码区存储程序代码。初始化数据区存储已经初始化的数据。未初始化数据区存储未初始化的数据。堆区我们在C语言中常使用的malloc函数就是从堆区申请的空间。共享区空间可以供多个进程一起访问。栈区运行函数时需要对函数进行压栈函数退出后需要将函数出栈。 蓝色箭头就是栈的增长方向栈从高地址向低地址增长。红色箭头是堆的增长方向堆从低地址向高地址增长。
二、虚拟地址空间 简单了解了程序地址空间后接下来就可以认识虚拟地址空间了虚拟地址空间也叫虚拟内存。 Linux中pcb是task_struck结构体虚拟内存是mm_struct结构体。 进程就是运行中的程序进程需要通过访问内存空间来得到它想要的数据可是每个进程访问的内存空间其实是假的或者说是虚拟的。 比如进程A中有一个变量 int a这个程序的作用是打印出a变量的地址打印出的结果是0x11。如果是刚开始学习的话我会毫不犹豫地认为这就是这个变量在内存中的地址但其实并不是。这其实是一个虚假的地址并不一定是该变量在内存空间中的真实地址。 也就是说进程每次访问的空间其实都访问的是虚假的地址空间或者叫虚拟内存更合适。示意图如下 1.虚拟内存的原理 进程在运行时需要访问物理内存中的数据但进程和物理内存并没有直接进行数据交互而是通过虚拟内存和页表进行交互。 虚拟内存是对物理内存的映射物理内存中的地址会映射到虚拟内存中但是物理内存映射到虚拟内存后并不一定还是原来的位置。如图物理空间地址为0x24的空间映射到虚拟内存后映射到地址为0x11的空间中。 而页表的作用就是保存物理内存和虚拟内存的映射关系比如物理内存中地址为0x24的空间映射到虚拟内存中是地址为0x11的空间那么页表就会保存这个映射关系。保存了这个映射关系后当进程访问地址为0x11的空间的数据时系统就可以通过页表的映射关系去物理内存中找到对应的数据。 系统中每个进程都会有一个对应的虚拟内存进程直接访问的都是虚拟内存的空间。
2.使用虚拟内存的原因 如果不使用虚拟内存进程直接与物理内存进行交互。那么一个进程就可能访问了其他进程的空间就有可能去修改其他进程的数据这样就会造成程序运行混乱。 比如如果进程直接和物理内存交互进程A申请并使用了地址为0x11的空间进程B此时也访问了0x11的空间并修改了其中的数据那么进程A下次访问这块空间的时候访问到的数据就不是之前的了。
3.如何实现虚拟空间 虚拟空间其实就是一个描述。假如电脑的物理内存是4G那么操作系统会欺骗进程系统会告诉每个进程这4个G的天下都是你的你想怎么用就怎么用爱用哪个地址就用哪个地址。注意是每个进程都有自己的虚拟空间。 系统给每个进程都描述了一个虚拟的美景看到你面前的江山了吗这4个G都是你的。在Linux中这个描述就是mm_struct结构体。做戏要做全套欺骗也是如此。为了让自己的谎言更逼真这个描述是十分细致的。上文中简单介绍了物理内存的划分在虚拟内存的描述中系统也详细的描述了一下虚拟内存的划分。比如栈在虚拟内存的哪里堆在虚拟内存的哪里 如果进程此时要申请地址为0x33大小是4字节的空间那么虚拟内存中这块空间就会分配给进程。但实际上是在物理内存中申请了一块大小符合的空间然后这块空间的地址就与虚拟内存的0x33这块空间建立了映射关系这个关系被存储在页表中。如果进程要访问地址为0x33空间中的数据系统就会查找页表在页表中查找这个虚拟地址对应的真实的物理内存的空间是什么进而进行数据的访问。 系统欺骗进程告诉每个进程它们都拥有全部的4G空间但实际上是所有进程共用这4G空间。那么就可能会有多个进程同时申请地址为0x11的空间因为进程觉得自己拥有全部的空间那么自己想申请哪个就申请哪个。但此时不用慌因为进程申请的是虚拟空间的0x11可是映射到物理内存上就是不同的空间因此进程有很大的自由度。解决了上文中直接使用物理内存而存在的问题。 4.使用虚拟内存的好处 1更好的利用了物理内存的碎片空间进程申请了虚拟内存空间后系统会在物理内存中找到合适的空间交给它这样可以避免对大块空间的浪费。提高了物理内存的利用率。 2可以离散的存储数据。 3每个进程都有独自的虚拟内存这样就不担心和其他的进程地址发生冲突。