Linux-0.11操作系统实验6理论-地址映射与共享

L20 内存使用与分段

运行时重定位:基地址 + 逻辑偏移地址

基地址以表的形式保存在PCB中。

一个程序分成多个段,每个段都要记录其基地址,存在一个表中,称为段表,保存在PCB中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SWlhhTnM-1580887021888)(C:\Users\85956\AppData\Roaming\Typora\typora-user-images\image-20200204141039892.png)]

GDT : 操作系统的段表
LDT : 各个用户进程的段表(其实就是之前讲到的映射表)

  • 如何使用内存:

    程序编译时分为多个段,每个段在内存中找到一段空闲分区,将每个空闲区的基地址存入LDT表中,此时一个程序已经载入了内存,一个LDT也初始化好了,然后将LDT表赋给PCB,将PC指针设成初值,根据PC指针取址,执行,取址,执行,取址时查询LDT表即可找到程序对应的代码存放的物理内存,即可对内存进行使用。

    总结:程序分段----->内存分区-----> 做好映射表,初始化LDT

L21 内存分区与分页

直接按段来分,程序员很喜欢,可以将数据段和 代码段分开加载,可以设置只读,可读写属性。
但是会有一个很大的问题 : 内存碎片,导致后面没有符合要求大小的空闲内存。

解决办法: 不要对内存进行连续的分配,将内存划分成1页1页,按页分配,1页4kB大小,最多浪费的也就4KB。这样不会有内存碎片,也不会出现没有符合要求大小的内存可以申请的情况,因为可以打散了分散到一页一页中。
连续的变成离散的,需要记录这种映射关系,所以就有了页表

用户程序希望支持分段,因为程序是分段的,物理内存希望支持分页,因为内存可最大化使用,浪费少。

在这里插入图片描述
这里其实是对整个32条地址线的4G空间做了划分,建立了一个页表,页表与PCB关联;
相当于说对可能用到的地址做一个虚拟页到物理页的映射转换(MMU完成)
4G空间,每4KB一页,一共有1M页,那么映射表就是这1M页的相互连线映射关系

L22 多级页表与快表

按上一节的页表处理方式,页表的储存空间太大,1M页的映射关系,每条映射关系需要4字节来存储,那么就需要4M空间来存储页表;
每个进程4M,10个进程就要40M,十分的浪费!!!
在这里插入图片描述

有很多逻辑地址都是没有用到的,一个程序不可能占满了4G内存空间!!!
所以要想办法减低存储。

法一.
删除那些没有用到的表项,只存放用到的页。
虽然存储减低了,但是会造成无法页号编码不连续,查找映射关系的时候非常麻烦,需要从上往下遍历,看是否是该页号,时间效率很低。所以需要页号即连续又要让页表占用内存少的方法。

法二.
用多级页表(相当于书目录的作用,章,节)
既减轻了存储压力,每个还都连续,时间效率比较高

32位逻辑地址,前10位表示页目录号(章),接着10位表示页号(页),最后的12位表示偏移地址

一共有210个页目录号,一个页目录号指向210个页号,每个页号指向4K字节物理地址,每个页目录项指向4M空间(图中物理页号下面的整个长方形表示4M,offset下面的一个小长方形也表示4M)。

这里16K是这么来的:
用到三个页目录号,每个页目录号下一级的页表存储空间为 3 * 4KB = 12KB,
加上本身页目录表需要的4KB一共为16KB。
关键在于,有些没有用到的页目录号后面根本就没有再存下一级的映射表,节省了大量空间!!!

带来的问题:多加一级目录就多访问一次内存,增加了访问时间。

法三.
多级页表 + 快表

TLB是一组相联快速存储,是寄存器。寄存器访问很快,保证时间效率高。

快表相当于一个cache,把频繁使用的地址映射记录下来。TLB越大命中率越大,效果越好,但是越大越贵 。由于程序多为循环、顺序结构,对地址的访问多体现局部性, 用的可能是固定的几个逻辑页号,就存入块表。

L23 段页结合的实际内存管理

程序员喜欢段,物理内存要用到页,为了满足这两个要求,操作系统在当中用虚拟内存做了一层中转

程序员使用内存要经过两层地址翻译:首先要基于段的地址翻译,将程序段放入对应的虚拟地址中,然后基于页的地址翻译,将虚拟地址放入页表内,找物理地址和偏移地址,进而找到真正的物理地址。所以从用户来看是支持分段的,从物理内存来看是支持分页的。

第一步:在虚拟内存申请用户数据段,分配虚存

第二步:将程序假装放在虚拟内存的用户数据段,建立段表

第三步:在物理内存找一段空闲页,分配内存

第四步:建立页表,磁盘读写,最终加载入真正的内存

第五步:重定位使用内存

fork()会做到以上的五步:

fork()----->sys_fork----->copy_process
copy_mem 这个函数可以好好读一下,配合linux0.11注解

  1. 子进程的数据段和代码段映射到不同的虚拟内存地址,每个进程分配 64M 虚拟内存地址,互不重叠
  2. 父进程和子进程共用一套页目录表,因为虚拟地址不同,页目录号不同,不打架
  3. 在页目录表中增加对应页框号表,即父进程和子进程中对应的虚拟地址不同,但是不同地址映射到了同一块页框,也即映射到同一块物理内存。
  4. 然后对子进程设置共享内存段属性为只读,这样在子进程往里写的时候,会发现只读,会修改映射,映射到其他空间!!!

最终达到对于用户来讲虽然是操作的同一个地址,但其实对应的是物理内存的两块区域,即子进程和父进程的内存区域是分隔的!!!

使用内存:

由逻辑地址p=0x300根据*p找到虚拟地址0x00400300,再找到物理地址0x0007300,只要初始化LDT,建立了页表,硬件MMU会自动完成地址的转换映射,然后将物理地址0x0007300写入地址总线,再将7写入地址总线,最终完成了指针赋值操作*p=7。fork后,子进程会建立新的映射,导致虚拟内存和物理内存都改变,最终将子进程的*p=8完成,从而都能正常使用。

L24 内存换入

在这里插入图片描述
虚拟内存永远是4G空间, 但是物理内存可能只有1G或者2G
操作系统做了一层封装,对于用户来讲,使用的空间一直都是4G虚拟空间
操作系统配合MMU,把虚拟地址映射到物理内存页上,并且只有缺页请求时候才进行映射 通过内存换入使用户感觉在使用完整的4G内存,内存换入就是为了实现虚拟内存 请求调页粒度更细,更能提高效率。

缺页中断 14号中断 linux/mm/memory.c 虚拟地址又称线性地址

L25 内存换出

并不总是获得新的页,内存总是有限的。

换出哪一页的算法:

  1. FIFO:先入先出

  2. MIN算法:选最远将使用的页淘汰,是最优方案,但是需要知道将来请求的页号,不现实

  3. LRU 页面置换:用历史预测未来。

    最近一段时间内,最久不使用的页换出去,即最近最少使用的换出去

    时间戳: 每页维护一个时间戳,但是时间代价太大,不可行

    页码栈: 维护一个页码栈,但是修改指针次数太多,代价还是太大

    近似算法:每页加一个引用位,每次访问一页时,硬件自动设置该位
    是和否来表示,有访问到这块内存,MMU自动把R置1
    指针去找R为0的地方替换,碰到R=1的地方先做R=0

    但是这个方法有缺点:缺页比较少的时候,所有的R都为1,每次都要转一圈才能找到换出去的页,退化成FIFO,效率不高

  4. Clock算法:LRU 页面置换改进, 双指针,一个快,一个慢,像时钟一样

    快时钟做R的清0定时清0,等到慢指针转到这里的时候R=0,说明在定时时间片内没有备访问,该页可以被替换了

给进程分配多少页框:

  • 分配的多,请求调页导致的内存高效利用就没用了
  • 分配的少,缺页率增大到一定程度,进程总等待调页完成,CPU利用率降低,进程进一步增多,缺页率更大,系统出现颠簸。
  • 工作集算法

内存换入换出总结:

  • 内存换入时,发现缺页,进行缺页中断,从磁盘读一页放入物理内存,可能会出现页框不足,用clock算法将物理内存中一个页框进行淘汰(swap out),有空闲页后,再将那一页换入(swap in)。就是swap分区的功能。实现内存换入换出就是为了实现虚拟内存,进而实现段页,再进而实现内存管理,最终能够执行程序,实现进程。

    总结: 逻辑地址、线性地址和物理地址之间的变换
    在这里插入图片描述
    分页与分段最大的不同之处在于分页使用了固定长度的页面。段的长度通常与存放在其中的代码或数据结构具有相同的长度。与段不同,页面有固定的长度。如果仅使用分段地址转换,那么存储在物理内存中的一个数据结构将包含其所有的部分。但如果使用了分页,那么一个数据结构就可以一部分存储于物理内存中,而另一部分保存在磁盘中。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值