154.OS补充(二)---内存储管理+文件管理
不同于PV同步问题 这篇内容并非必考的内容 但通常十之六七涉及 关于内存管理的虚拟一块高度和计组的虚拟存储相联系 整理的内容大致就是内存管理(页式存储)+文件系统有关 废话少讲依旧是分开知识点对应题目讲解
1.进程内存映像
内容和进程相关联系 搞懂一图即可

考察自然是给你一段代码 然后分析其中的什么位于内存上的什么位置
看题
(2025)


直接把代码段的东西全分析一下也就基本够解决问题了
char * ptr; // 【数据段】全局变量ptr本身在这里(而不是所指向的内容)
void main() { // 【代码段】main函数
int length; // 【栈】局部变量length本身在这里
ptr = (char*) malloc(100); // 【堆】malloc申请了100字节在堆上;ptr的值变成了这100字节的首地址
// 【代码段】malloc的指令;【栈】调用malloc时的参数100
scanf("%s", ptr); // 【代码段】scanf的指令;
// 【只读数据段】"%s" 格式字符串;
// 【栈】传递参数ptr的值(地址)时,这个地址副本在栈上;
// 【堆】scanf读入的键盘数据,写入了ptr指向的堆内存!
length = strlen(ptr); // 【代码段】strlen的指令;
// 【栈】传递参数ptr的值在栈上;
// 【堆】strlen去ptr指向的堆内存里数字符;
// 【栈】计算结果赋值给局部变量length
printf("length=%d\n", length); // 【代码段】printf指令;
// 【只读数据段】"length=%d\n";
// 【栈】length的值(以及格式串地址)作为参数压栈
free(ptr); // 【代码段】free指令;释放ptr指向的【堆】内存
// 【栈】传递参数ptr的值在栈上
}
总的来看就是 main()scanf()malloc()等函数本身就是位于只读代码段上的
全局变量和静态变量位本身于数据段上 指代的内容位于其他区域 而malloc()和new()等函数执行时会申请空间位于堆上本身也是代码段的
函数传递的参数 局部变量位于栈上
(1)PCB是进程控制块 是OS操作进程的方式 所以位于系统内核区
(2)main()函数位于只读代码段 驱动程序就是驱动硬件 问的就是那些操作会调用硬件 自然是输出输入scanf()键盘 printf()显示器
(3)ptr为全局变量位于可读写数据段 length局部变量分配到用户栈 ptr指向的内容位于堆上
2.页式(虚拟)存储管理
必须先搞懂其逻辑地址结构
跟之前总结的计组虚拟存储一样 页内偏移量位数就是取决于页大小 虚页号就是虚拟地址位数-业内偏移量位数
这里还要引入一个概念页表项
即进程每个页面对应一个页表项
大致就是进程通过页表(上的页表项)映射到真实物理地方
所以自然考察内容主要围绕 虚拟地址和物理地址的转换 对应页表项的虚拟地址和物理地址计算
核心公式
考察方式大致就是还是 给你地址 先分析虚拟地址结构得出虚页号和页内偏移量
然后该地址对应的页表项物理/虚拟地址的计算
(2024)

(1)这里考察不就是计算页表项新的物理地址和虚拟地址 直接套公式就行 前提是得先得到页号通过给的虚拟地址得出

注意48Hx4B相当于左移两位 48H的代码是0001001000在这个基础上左移 而不是去掉前面的0不对的
然后更新后的页框号这个指代的是物理地址的"页号" 也就是BAB45678H的前十位即2EAH
- 虚拟地址的前10位为虚页号
- 物理地址的前10为为页框号
(2)这个简单就是分析进程的页号和页框号 分别对应看虚拟地址和物理地址前10位即可 然后计算对应页表项虚拟地址套公式

其实到这里大致也就懂了类似的考题
就是给你地址 分析得出虚页号和页内偏移量 找到对应页表项的虚拟地址和装在哪里的具体真实的物理地址
知道对应的物理地址那么就能得出页框号即物理块号
3.二级页表-页式(虚拟)存储管理
没错跟2知识点基本一样 多的是这次页表采取的是二级页表
引入二级页表就是为了解决页表过大占用内存问题
核心大致可以理解成 在原基础页表上再建立一张页表 多了个页目录

一级二级页号都其实都是一个页表 两个页表每个页表含2的n(取决于页号或页目录号位数)次方页表项
考察肯定还是在地址结构的基础上分析对应页目录号为主
公式
我们应用到题目中来分析
(2020)

(1)没错就是给你虚拟地址 根据地址结构得出那三个量 然后计算对应页目录项的物理地址

前面就是计算页目录的物理地址 后面计算页表项物理地址 给你页框号也就是物理地址20位补上页内偏移量12位0 计算对应页表项的物理地址
(2)页式段式存储管理都是连续分配的方式 所以肯定虚拟地址空间需要连续 而对应的物理地址映射到哪里 不需要连续的
(3)正好是一行存放的元素个数 所以按行遍历局部性更好

通过这个也能得出a[0]到a[1]正好就是1024*4B 也能用这个方式得出第一问a[1][2]的地址
(2017)


(1)页号前20位 都是00401所以就在一页上
(2)这个就是对00401020地址结构进行划分得出页目录号和页表索引

编号从0开始 那么就都是第1个表项
(3)考察进程状态/切换知识 首先是执行态然后scanf()输入 I/O中断 ->阻塞态
然后输入完事 ->等待态 给CPU运行 ->执行态 I/O为特权指令肯定用户态->内核态
(2018)


(1)通过图中可以得出这是二级页表的页式虚拟存储 可以看到页目录10位 页表号10位 总的虚页号20位 页内地址12位 把题目给的套进去即可

(2)最终得到的是实页号 所以是物理地址类似一个基址寄存器 进程切换地址就会变 对应页目录变化所以其内容会变 同一进程的线程是同一个进程地址不会变
(3)这里涉及到的知识点为页面置换算法 修改位和访问位
- OPT最佳置换算法:淘汰以后永久不使用的页面 理想无法实现
- FIFO先进先出页面置换算法:很简单 淘汰最早进入的页面 可能出现Belady异常
- LRU最近最久未使用置换算法:淘汰最近最长时间未使用的页面
- Clock时钟置换算法和改进型:设置访问位和修改位辅于判断 优先淘汰即未使用又未修改过的页面
更多参考之前的有关总结:https://www.cnblogs.com/gaodiyuanjin/p/19443142
4.文件相关概念(盘块 目录 目录项 索引结点 地址项)的理解
在题目总结之前 先搞懂这一堆概念 区别于内存储管理和计组存储区别

上述即一个读目录文件到内存的过程 用于后续分析
- 一个目录相当于一个文件 相当于一个盘块上有多少个索引结点即多少个文件
- 目录项由文件名和索引结点号组成
- 索引结点记录文件的全部属性
- 地址项含于索引结点 地址项=盘块号
- 盘块=簇
那应用于题目中 涉及什么知识点

核心就这两个公式 用题目来看真正的考察 顺带总结
(2026)

先把题中可分析的点都得出 其实也就是问题要问的考察方向了

这个就是核心 求出后应用 这里还需要介绍关于盘块号大小=地址项大小 求出1024代表什么 其实就是应用于索引结点的结构地址项中

下面的5个1个什么都就是多少个地址 求出的1024套上去就是地址项的个数 两者可得出占用的大小或盘块数 后续会有考察
(1)可以求出一个盘块含64个索引结点 file索引结点号1000 盘块从100开始 所以很简单就是
1000/32+100得出盘块号
给你逻辑地址了 也就是给你文件大小了 21460B/盘块大小 就求出几个盘块了
最多可以存放的文件 等同于总的盘块数x每个盘块所含索引节点(文件)的数量 4096*32个文件
(2)这一问考察文件的操作有关知识点 后续会总结 删除主要涉及:删子文件 删目录本身 删目录中目录项 所以删除dir1先删除file 然后释放PCB 索引节点清0 更多后续总结参考
(2022)


(1)目录项 所含的内容是文件名和索引节点号 即course 2和doc 10
(2)可以观察到doc文件和course1文件的索引结点号一致 这里涉及到硬链接的知识即多个目录项指向同一个节点 因此所在盘块号一致
(3)这个就是考察过程里 目录已经在内存中了 无须再读入内存 读course1就是 先目录项->索引节点->对应磁盘块号 目录项位于内存无须再读 2次 注意之前的图地址项那块是含义索引节点的
(4)可以按照求出现在需要多少个索引节点数 然后比较 或是求出需要多少个盘块数比较 或是直接比较占用大小

需要直接地址项 一级间接地址项 二级间接地址项
最后再看一个
(2018)

(1)考察文件大小了 先求出地址项个数 4KB/4B=1024 然后利用索引节点求解 (8+1024+10241204+102410241024)4KB
(2)首先文件系统可以容纳文件:1M4KB/64B=64M个
然后再算给的数据:512M4KB/5600B=256M个 取决于文件系统最大容纳64M个
(3)6KB<84KB 所以需要直接地址即可 84KB<40KB<(8+1)*4KB 需要直接地址 一级间接地址 时间不同
其实上面扯了一大堆也没有真正弄清楚到底干什么 没错现在分析的才是核心之重
过程
目录中有很多文件 目录项就是对应文件 目录项内容文件名和索引节点号
索引节点就是一个文件的全部属性 所以每一个文件都对应一个索引节点 通过目录项找到索引节点
文件真正是存在哪个盘块中的 就需要索引节点中的一个属性 地址项来指出对应盘块地址
地址项
直接地址直接指向盘块 文件太大就需要间接地址
之前计算的 盘块大小/地址项大小求出来的就是一个索引块所含的地址项个数
有关大小的计算 就需要这里比如一级间接地址大小:一级间接地址个数[盘块大小(一个索引块*一个索引块所含地址项个数)]
大致就这两个 也对应的就是那两个重要公式 搞懂这个基本上文件系统有关大小的问题就能解决了
5.文件的操作 保护 共享 存储管理
文件的操作涉及到的打开创建删除关闭等这些知识点
不过多阐述 主要再回忆 综合题中涉及到简单考察 所以参考之前的总结即可
https://www.cnblogs.com/gaodiyuanjin/p/19501430
后续对OS的冷考点作最后一篇总结完事






浙公网安备 33010602011771号