本篇博客依据王道、与我的笔记而写,讲解了内存的基础知识、内存管理的概念、进程的映像、连续分配管理方式、动态分区分配算法、基本分页存储管理、基本地址变换机构、TLB快表、两级页表、基本分段存储管理方式、段页式存储管理方式、虚拟内存、请求分页管理方式、页面置换算法、页面分配策略、内存映射文件
在博客末尾,附有学习日记
知识大纲(内存的基础知识)
简单的介绍了内存相关的基本知识(作用、指令、逻辑/物理地址、程序咋运行-链接+装入...
什么是内存,有啥用?
外存与cpu的中介,加快交换数据的速度
从而引出。逻辑地址,如何转化为内存里的物理地址
补充知识:常用数量单位
换算单位:1GB=10^10MB=10^20KB=10^30B
指令的工作原理
可以把指令看成任务说明书!这样也挺棒
因为指令存在外存中
从而引出。外存视为逻辑地址,如何在装入时,转换为内存中的物理地址
抽象版:
解释版
装入的三种方式
绝对装入
最简单暴力的装入方式,在装入前强改逻辑地址,方便装入。
可重定位装入
在装入的过程中,动态的更改。
动态重定位
物理地址=逻辑地址,额外设计重定位寄存器。
只用在用到时,才会用逻辑地址+寄存器内的值
从写程序到程序运行
编译、链接、装入
链接的三种方式
1、静态链接(直接封装好)
2、动态链接(装入时,在封装)
3、运行时动态链接(运行到那块,装入那块)
知识回顾与重要考点
知识大纲(内存管理的概念)
都是基础
内存空间的分配与回收
内存空间的拓展
地址转换
内存保护
通过 重地位寄存器 与 界地址寄存器 进行保护。
知识回顾与重要考点
知识大纲(进程的内存映像)
可能考法
知识大纲(连续分配管理方式)
单一连续分配
固定分区分配
动态分区分配
1、第一个问题:空闲分区表与空闲分区链
2、四种分配算法
3、分配与回收,就需要改动表了
数据结构
四种情况
知识回顾
知识大纲(动态分区分配算法)
首次适应算法
算法思想: 每次都从低地址开始查找,找到第一个能满足大小的空闲分区。
如何实现: 空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
最佳适应算法
算法思想: 由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区即,优先使用更小的空闲区。
如何实现: 空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
缺点: 每次都选最小的分区进行分配,会留下越来越多的、很小的、难以利用的内存块。因此这种方法会产生很多的外部碎片。
最坏适应算法
又称 最大适应算法(Largest Fit)算法思想:为了解决最佳适应算法的问题--即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。
如何实现:空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
缺点:每次都选最大的分区进行分配,虽然可以让分配后留下的空闲区更大,更可用,但是这种方式会导致较大的连续空闲区被迅速用完。如果之后有“大进程”到达,就没有内存分区可用了。
邻近适应算法
算法思想: 首次适应算法每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。
如何实现: 空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
知识回顾
综合来看首次适应算法挺不错
知识大纲(基本分页存储管理的概念)
什么是分页储存
(逻辑地址)页、页面 vs (物理地址)页框、页帧、物理页页号、页面号vs 页框号、页帧号、物理页号
重要的数据结构
页表(页号、块号)
每个页表项占多少字节?
页表项(块号)占多少字节?
页号呢?
如何实现地址的转换
要知道页号+偏移量
逻辑图:
实现图:
如何确定一个逻辑地址对应的页号与页内偏移量
页号:逻辑地址/页面长度
页内偏移量:逻辑地址%页面长度
物理地址 = 页号在物理地址中的起始位置+页内偏移量
衍生问题:
可以看下方的那个 逻辑地址结构
逻辑地址结构
就是底层分析:
通过位数,可以确定页号与页内偏移量
知识回顾与重要考点
知识大纲(基本地址变换机构)
基本地址变换机构:
其实也就差不多,就这4步。
详细步骤,示意图:
逻辑地址到物理地址的转换。
具体计算
对页表项的考虑
知识回顾
知识大纲(具有快表的地址变换机构)
什么是快表(TLB)
快表就是高速缓存TLB,不是内存。里面储存的是最近访问内存的副本。
应用快表查找方式
1、是否越界
2、查快表 / 失败后在查内存
3、得到并访问物理地址
引入快表后的耗时
查询快表有两种方式
1、先查快表,再查慢表(111us
2、同时查询(1+100)*0.9+(100+100)*0.1 = 110.9us
详细图解
局部性原理
主要是讲解:为啥需要TLB
知识回顾与重要考点
知识大纲(两级页表)
单级页表存在的问题
1、占用连续内存过大
2、不是所有页面都需要常驻内存
如何解决单级页表的问题(连续存放问题)?
开启多级页表
两级页表的原理、地址结构
(逻辑:页目录表+2级页表+偏移量)
具体:
如何实现地址变换
如何解决单级页表问题(虚拟存储)
通过添加缺页中断(添加了一个标志位)
计算:
知识回顾:
1、单级页表的问题
2、两级页表
3、如何实现地址变换
4、访问次数+各个多级页表大小
知识大纲(基本分段存储管理方式)
分段
1、
2、
段表
地址转换
分段、分页管理的对比
分页(物理)、分段(逻辑)
其中,分页是,直接将内存切成小方格。你只要各个页面就能直接查(一维)
分段是,根据需求,得出段号与段内地址(二维)
优点
解释:
对比总结:
知识总结:
知识大纲(段页式管理方式)
本章就学俩东西:
1、分页、分段的优缺点:是否会产生外部碎片,逻辑分块与内存保护做的怎么样
2、段页式计算物理地址的方法
分页、分段的优缺点分析
分段+分页 = 段页式管理
段页式管理的逻辑地址结构
段表、页表
逻辑:
知识回顾与重要考点
通过添加缺页中断(添加了一个标志位)
计算:
知识回顾:
1、单级页表的问题
2、两级页表
3、如何实现地址变换
4、访问次数+各个多级页表大小
知识大纲(基本分段存储管理方式)
分段
1、
2、
段表
地址转换
分段、分页管理的对比
分页(物理)、分段(逻辑)
其中,分页是,直接将内存切成小方格。你只要各个页面就能直接查(一维)
分段是,根据需求,得出段号与段内地址(二维)
优点
解释:
对比总结:
知识总结:
知识大纲(段页式管理方式)
本章就学俩东西:
1、分页、分段的优缺点:是否会产生外部碎片,逻辑分块与内存保护做的怎么样
2、段页式计算物理地址的方法
分页、分段的优缺点分析
分段+分页 = 段页式管理
段页式管理的逻辑地址结构
段表、页表
逻辑:
知识回顾与重要考点
借鉴:
1、王道
学习日记:
6.17(周二) | 上午 | 杂事,已经处理完毕 死锁的检测 和 解除, 运用了资源分配图与死锁检测算法 解除共有三种方式:强行剥夺、回退、撤销 |
下午 | 学习内存基础、了解了指令。学习装入(静态装入、动态装入、重定位装入) 与链接(与装入类似)的三种方法。 并在内存管理中学习了内存分配(下方三种)、地址转换、内存保护 并且还了解,地址分配是由第一地址分配、固定地址分配、动态分配)三种分配 其中动态分配可由四个算法实现: 首次适应算法(综合性最好)、最佳适应算法(从小到大、需排序)、最坏适应算法(从大到小、需排序)、邻近适用算法(链表) 其中在学习,分页式储存管理时,学习到了: 页、页框、页框号.... |
|
晚上 | .... | |
6.18(周三) | 上午 | 学习了基本分页式储存管理,从而引出基本地址变换机构(简而言之,将逻辑地址转换成页号与页面偏移量,从而在内存中查找页表,最终计算出物理地址)。 为了加快速度,又引出了高速缓存(TLB)。 基本分页储存太浪费大块内存。所以又发明了两级页表。即可增加内存利用率,也增加了灵活性。 多级页表页也就此被发明。 |
下午 | 学习了段式存储(是按照逻辑设计分段、提供内存保护)结合页式储存又演进成了段页式存储(=段表+页表)。而虚拟内存技术拓充了内存。通过请求分页管理与页面置换算法实现。 期中,请求分页管理包含:页表机制(段号、状态号、访问字段、修改位、外存地址),缺页中断、地址转换-计算题 而页面置换算法又分为(OPT-最佳、FIFO-最次但简单、LRU-最接近最优但实现代价大、CLOCK+改良版-这俩挺不错) 之后又讲了,页面分配策略(像什么工作集、驻留集、抖动现象....)其中最精彩的,还是局部分配与全局分配。一个是用自己进程的内存块,一个是全局进程调用。 |
|
晚上 | ... ... | |
6.19(周四) | 上午 | 操作系统共主打四大管理(处理机、存储、文件、设备..管理)而,今天初识文件管理(认识了FCB、操作系统向上提供的功能、磁盘块、文件的各个属性...)粗广学习后,(细入)又引入了文件结构(无结构-流式、有结构-又称记录型文件)。其中结构文件分为,顺序文件、索引文件、索引顺序文件(拓展)--多级索引顺序文件。跳出框架后,又学得将各个文件组织起来的方式-TCB。也就是,单级目录、两级目录、多级目录。无环图目录--方便共享文件、并方便查询、不同目录可重命名。 |
下午 | 学习了连续分配,链接分配,索引分配。其中索引分配又细化为链接索引,多层索引,混合索引。而这些是为了解决文件存储在硬件问题 | |
晚上 | ...... | |
6.20(周五) | 上午 | 这个回顾一下,这几天学习了逻辑结构与物理结构。其中逻辑机构(由用户决定--与内存息息相关,且操作系统并不关心)-专门用来管理内存中的文件。其次就是物理结构(由操作系统决定,将文件采用什么样的方式存储在外存上。并负责逻辑块与物理块的转化) 其中,他们都包含顺序、链式、索引分配。 |
下午 | 学习了文件存储管理(空闲表法、空闲链表法、位视图法、 成组链表法) 学习完储存,然后学习了文件的基础操作(从创建删除,到打开关闭,又组合出读写功能)有了存储、操作,之后又学习了软硬链接的操作--为共享文件而生,软连接为Link法。口令/加密/访问保护,其中我认为访问保护的发放权限功能最绝。 |
|
晚上 | ..... |