进程使用内从内存的界定
- 一个进程使用的地址范围 基地址寄存器 和 界限地址寄存器 决定
- 基地址是开始位置 界限地址寄存器是偏移量
内存空间划定意义
- 避免系统区域被用户程序修改
- 确保用户进程不被其他进程访问
地址绑定
-
地址绑定
是进程内内存到物理实际内存的映射 - 物理地址可以直接寻址
-
地址绑定是逻辑地址到物理地址的映射
源程序中的地址 -> 可重定位地址-> 绝对地址 -
3种情况
编译时就知道进程在内存中的地址
加载时进行 编译器生成可重定位代码后
运行时进行 进程可以从一个内存段移到另一个内存段,犹如动态链接库
LINUX内存文件
- 6列 地址范围 权限 偏移量 设备 节点 路径
动态加载
-
优点
不使用的程序不会加载到内存
适合操作大量不常发生的事件
不需要操作系统特别支持,由程序员设计 - 本质是,进程运行时载入了一段别的代码,用于使用
交换 本质是主存进程的交换
- 交换到快速磁盘
-
换出再换入时调入哪个内存的算法
编译时决定 加载时决定 运行时决定
内存分配 实际上是进程放在内存的哪里比较好
连续分配
- 多分区方法 多个固定大小分区 分区大小相同 分区大小不同
- 可变分区方法 内存记录已用未用内存,就是实验4内容
不连续分配
- 分页 进程块为页 内存块为帧
- 一个进程分的内存块可以不是连续的
- 一个进程持有一个页表
页表
-
页表的地址变换
页号:页表基地址 与 页偏移:与页表基地址形成帧号 - 页表的实现 可用专用寄存器 或 载入内存 来实现
-
页表载入内存的问题
为了访问数据需要两次访问内存
第一次为了获取页表信息
第二次为了使用页表信息访问数据 -
地址转换旁观缓冲
使用高速缓冲区存放页表
访问数据只需要访问一次 -
在分页环境下实现内存保护 使用保护位
页表的长度是固定的,如果有程序不需要用到所有的页表的话,必定有尾部几块的页表是无效的,所以要避免进程访问不属于它自己的数据 -
分页优点
使用共享页表实现代码共享 -
页表结构
层次页表:
避免进程同一时间持有的页表过于庞大,层次页表的本质是 按需读区某一小段的页表,使其他页表强制失效
哈希结构:
逻辑地址的定义为:虚拟页码 + 偏移量
哈希页表每一条目是链表,链着 虚拟页码,此页对应的帧号,下一个元素指针
通过进程页号转移到哈希表中 -> 找到对应的帧号 -> 用帧号与页偏移形成物理地址
反向页表:
不是重点,不做赘述