移动免费网站建设,宁波鄞州区商用高端网站设计,天津网站制作费用,网站建设中颜色的感染力一 虚拟内存
在这种情况下#xff0c;要想在内存中同时运行两个程序是不可能的。如果第一个程序在 2000 的位置写入一个新的值#xff0c;将会擦掉第二个程序存放在相同位置上的所有内容#xff0c;所以同时运行两个程序是根本行不通的#xff0c;这两个程序会立刻崩溃。 …一 虚拟内存
在这种情况下要想在内存中同时运行两个程序是不可能的。如果第一个程序在 2000 的位置写入一个新的值将会擦掉第二个程序存放在相同位置上的所有内容所以同时运行两个程序是根本行不通的这两个程序会立刻崩溃。
操作系统是如何解决这个问题呢
这里关键的问题是这两个程序都引用了绝对物理地址而这正是我们最需要避免的。 我们可以把进程所使用的地址「隔离」开来即让操作系统为每个进程分配独立的一套「虚拟地址」人人都有大家自己玩自己的地址就行互不干涉。但是有个前提每个进程都不能访问物理地址至于虚拟地址最终怎么落到物理内存里对进程来说是透明的操作系统已经把这些都安排的明明白白了。 操作系统会提供一种机制将不同进程的虚拟地址和不同内存的物理地址映射起来。 如果程序要访问虚拟地址的时候由操作系统转换成不同的物理地址这样不同的进程运行的时候写入的是不同的物理地址这样就不会冲突了。
于是这里就引出了两种地址的概念 ●我们程序所使用的内存地址叫做虚拟内存地址 ●实际存在硬件里面的空间地址叫物理内存地址
●操作系统引入了虚拟内存进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元MMU的 映射关系来转换变成物理地址然后再通过物理地址访问内存。
二 内存分段
虚拟内存分为若干个分段其中包括代码段、数据段、栈段和堆段。这些部分通常是在程序执行过程中被动态分配和管理的如果想再多分几个分段可以通过操作系统提供的内存管理接口或者其他一些方法。
2.1内存分段原理 分段机制下的虚拟内存由两部分组成段选择因子和段内偏移量。
●段选择因子通常由索引和特权级别组成索引部分指定了要访问的段在段描述符表中的索引位置。CPU使用段选择因子来定位段描述符表中对应的段描述符。
●段描述符表分为全局描述符表和局部描述符表。每个进程都有自己的局部描述符表局部描述符表存储在进程的PCB中。局部描述符表存储了进程的段描述符信息比如段描述符的地址等。全局描述符表存在内存的特定位置他管理所有进程的局部描述符表。
●段描述符段描述符包含了关于一个段的重要信息如段的基地址(起始地址)段的长度段的访问权限(包括对该段的访问权限读、写、执行、段的类型数据段、代码段、特权级别等信息)等。
●段内偏移量段内偏移量是相对于所选段起始地址的偏移量通常是一个32位的值用于确定所选段内的具体地址。实际偏移量和程序中引用的偏移量相加得到段内偏移量将段选择子中的偏移量字段左移 4 位乘以 16得到实际偏移量。段内偏移量应该处于8和段边界区间段边界区间保存在各个段的段描述符中。 最终的物理地址是段基地址加上段内偏移量。
2.2 内存分段的问题
内存分段机制的问题 1)内存碎片问题 2)内存交换的效率低下问题 为什么会出现这样的问题 我们来看看这样一个例子。假设有 1G 的物理内存用户执行了多个程序其中 游戏占用了 512MB 内存浏览器占用了 128MB 内存音乐占用了 256 MB 内存。 这个时候如果我们关闭了浏览器则空闲内存还有 1024 - 512 - 256 256MB。 如果这个 256MB 不是连续的被分成了两段 128 MB 内存这就会导致没有空间再打开一个 200MB 的程序。
这里的内存碎片的问题共有两处地方
1)外部内存碎片也就是产生了多个不连续的小物理内存导致新的程序无法被载。 2)内部内存碎片程序所有的内存都被装载到了物理内存但是这个程序有部分的内存可能并不是很常使用这也会导致内存的浪费。 针对上面两种内存碎片的问题解决的方式会有所不同
●解决外部内存碎片的问题就是内存交换。可以把音乐程序占用的那 256MB 内存写到硬盘上然后再从硬盘上读回来到内存里。不过再读回的时候我们不能装载回原来的位置而是紧紧跟着那已经被占用了的 512MB 内存后面。这样就能空缺出连续的 256MB 空间于是新的 200MB 程序就可以装载进来。这个内存交换空间在 Linux 系统里也就是我们常看到的 Swap 空间这块空间是从硬盘划分出来的用于内存与硬盘的空间交换。
●再来看看分段为什么会导致内存交换效率低的问题 对于多进程的系统来说用分段的方式内存碎片是很容易产生的产生了内存碎片那不得不重新 Swap 内存区域这个过程会产生性能瓶颈。 因为硬盘的访问速度要比内存慢太多了每一次内存交换我们都需要把一大段连续的内存数据写到硬盘上。
所以如果内存交换的时候交换的是一个占内存空间很大的程序这样整个机器都会显得卡顿。 为了解决内存分段的内存碎片和内存交换效率低的问题就出现了内存分页。 三 内存分页
3.1 内存分页背景
解决内存分段的缺陷分段的好处就是能产生连续的内存空间但是会出现内存碎片和内存交换的空间太大的问题。 要解决这些问题那么就要想出能少出现一些内存碎片的办法。另外当需要进行内存交换的时候让需要交换写入或者从磁盘装载的数据更少一点这样就可以解决问题了。这个办法也就是内存分页。
3.2 内存分页机制 分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间我们叫页。在 Linux 下每一页的大小为 4KB。
●虚拟地址与物理地址之间通过页表来映射。
●页表是存储在内存里的内存管理单元 MMU就做将虚拟内存地址转换成物理地址的工作。
分页是怎么解决分段的内存碎片、内存交换效率低的问题 由于内存空间都是预先划分好的也就不会像分段会产生间隙非常小的内存这正是分段会产生内存碎片的原因。而采用了分页那么释放的内存都是以页为单位释放的也就不会产生无法给进程使用的小内存。 如果内存空间不够操作系统会把其他正在运行的进程中的「最近没被使用」的内存页面给释放掉也就是暂时写在硬盘上称为换出。一旦需要的时候再加载进来称为换入。所以一次性写入磁盘的也只有少数的一个页或者几个页不会花太多时间内存交换的效率就相对比较高。更进一步地分页的方式使得我们在加载程序的时候不再需要一次性都把程序加载到物理内存中。我们完全可以在进行虚拟内存和物理内存的页之间的映射之后并不真的把页加载到物理内存里而是只有在程序运行中需要用到对应虚拟内存页里面的指令和数据时再加载到物理内存里面去。
分页机制下虚拟地址和物理地址是如何映射的 在分页机制下虚拟地址分为两部分页号和页内偏移。页号作为页表的索引页表包含物理页每页所在物理内存的基地址这个基地址与页内偏移的组合就形成了物理内存地址 总结一下对于一个内存地址转换其实就是这样三个步骤
●把虚拟内存地址切分成页号和偏移量
●根据页号从页表里面查询对应的物理页号
●直接拿物理页号加上前面的偏移量就得到了物理内存地址。 四 段页式内存管理
内存分段和内存分页并不是对立的它们是可以组合起来在同一个系统中使用的那么组合起来后通常称为段页式内存管理。 段页式内存管理实现的方式
●先将程序划分为多个有逻辑意义的段也就是前面提到的分段机制
●接着再把每个段划分为多个页也就是对分段划分出来的连续空间再划分固定大小的页这样地址结构就由段号、段内页号和页内位移三部分组成。
●用于段页式地址变换的数据结构是每一个程序一张段表每个段又建立一张页表段表中的地址是页表的起始地址而页表中的地址则为某页的物理页号。
●段页式地址变换中要得到物理地址须经过三次内存访问 第一次访问段表得到页表起始地址 第二次访问页表得到物理页号 第三次将物理页号与页内位移组合得到物理地址。 可用软、硬件相结合的方法实现段页式地址变换这样虽然增加了硬件成本和系统开销但提高了内存的利用率。 四 Linux内存管理
在 Linux 操作系统中虚拟地址空间的内部又被分为内核空间和用户空间两部分不同位数的系统地址空间的范围也不同。比如最常见的 32 位和 64 位系统。
●32 位系统的内核空间占用 1G位于最高处剩下的 3G 是用户空间。
●64 位系统的内核空间和用户空间都是 128T。
内核空间与用户空间的区别
●进程在用户态时只能访问用户空间内存。
●只有进入内核态后才可以访问内核空间的内存。
●虽然每个进程都各自有独立的虚拟内存但是每个虚拟内存中的内核地址其实关联的都是相同的物理内存。这样进程切换到内核态后就可以很方便地访问内核空间内存。虽然每个进程都有自己的虚拟内存但是在内核空间中关联的确实是相同的物理内存。也就是说在物理内存中操作系统内核的代码和数据结构通常有固定的位置或范围。这意味着无论哪个进程切换到内核态都可以访问相同的内核地址空间。内核空间的内容有操作系统内核的各种功能和服务的实现代码如进程调度、内存管理。内核空间中还存储了许多数据结构用于管理系统资源和状态这些数据结构包括PCB等还有一些内容