154.OS补充(二)---内存储管理+文件管理

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

1.进程内存映像

内容和进程相关联系 搞懂一图即可
image
考察自然是给你一段代码 然后分析其中的什么位于内存上的什么位置

看题
(2025)
image
image
直接把代码段的东西全分析一下也就基本够解决问题了

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.页式(虚拟)存储管理

必须先搞懂其逻辑地址结构

image
跟之前总结的计组虚拟存储一样 页内偏移量位数就是取决于页大小 虚页号就是虚拟地址位数-业内偏移量位数

这里还要引入一个概念页表项
即进程每个页面对应一个页表项
大致就是进程通过页表(上的页表项)映射到真实物理地方
所以自然考察内容主要围绕 虚拟地址和物理地址的转换 对应页表项的虚拟地址和物理地址计算

核心公式
image

考察方式大致就是还是 给你地址 先分析虚拟地址结构得出虚页号和页内偏移量
然后该地址对应的页表项物理/虚拟地址的计算

(2024)
image
(1)这里考察不就是计算页表项新的物理地址和虚拟地址 直接套公式就行 前提是得先得到页号通过给的虚拟地址得出
image
注意48Hx4B相当于左移两位 48H的代码是0001001000在这个基础上左移 而不是去掉前面的0不对的
然后更新后的页框号这个指代的是物理地址的"页号" 也就是BAB45678H的前十位即2EAH

  • 虚拟地址的前10位为虚页号
  • 物理地址的前10为为页框号
    (2)这个简单就是分析进程的页号和页框号 分别对应看虚拟地址和物理地址前10位即可 然后计算对应页表项虚拟地址套公式
    image

其实到这里大致也就懂了类似的考题
就是给你地址 分析得出虚页号和页内偏移量 找到对应页表项的虚拟地址和装在哪里的具体真实的物理地址
知道对应的物理地址那么就能得出页框号即物理块号

3.二级页表-页式(虚拟)存储管理

没错跟2知识点基本一样 多的是这次页表采取的是二级页表
引入二级页表就是为了解决页表过大占用内存问题
核心大致可以理解成 在原基础页表上再建立一张页表 多了个页目录
image
一级二级页号都其实都是一个页表 两个页表每个页表含2的n(取决于页号或页目录号位数)次方页表项

考察肯定还是在地址结构的基础上分析对应页目录号为主

公式
image

我们应用到题目中来分析
(2020)
image
(1)没错就是给你虚拟地址 根据地址结构得出那三个量 然后计算对应页目录项的物理地址
image
前面就是计算页目录的物理地址 后面计算页表项物理地址 给你页框号也就是物理地址20位补上页内偏移量12位0 计算对应页表项的物理地址
(2)页式段式存储管理都是连续分配的方式 所以肯定虚拟地址空间需要连续 而对应的物理地址映射到哪里 不需要连续的
(3)正好是一行存放的元素个数 所以按行遍历局部性更好
image
通过这个也能得出a[0]到a[1]正好就是1024*4B 也能用这个方式得出第一问a[1][2]的地址

(2017)
image
image
(1)页号前20位 都是00401所以就在一页上
(2)这个就是对00401020地址结构进行划分得出页目录号和页表索引
image
编号从0开始 那么就都是第1个表项
(3)考察进程状态/切换知识 首先是执行态然后scanf()输入 I/O中断 ->阻塞态
然后输入完事 ->等待态 给CPU运行 ->执行态 I/O为特权指令肯定用户态->内核态

(2018)
image
image
(1)通过图中可以得出这是二级页表的页式虚拟存储 可以看到页目录10位 页表号10位 总的虚页号20位 页内地址12位 把题目给的套进去即可
image
(2)最终得到的是实页号 所以是物理地址类似一个基址寄存器 进程切换地址就会变 对应页目录变化所以其内容会变 同一进程的线程是同一个进程地址不会变
(3)这里涉及到的知识点为页面置换算法 修改位和访问位

  • OPT最佳置换算法:淘汰以后永久不使用的页面 理想无法实现
  • FIFO先进先出页面置换算法:很简单 淘汰最早进入的页面 可能出现Belady异常
  • LRU最近最久未使用置换算法:淘汰最近最长时间未使用的页面
  • Clock时钟置换算法和改进型:设置访问位和修改位辅于判断 优先淘汰即未使用又未修改过的页面

更多参考之前的有关总结:https://www.cnblogs.com/gaodiyuanjin/p/19443142

4.文件相关概念(盘块 目录 目录项 索引结点 地址项)的理解

在题目总结之前 先搞懂这一堆概念 区别于内存储管理和计组存储区别
image
上述即一个读目录文件到内存的过程 用于后续分析

  • 一个目录相当于一个文件 相当于一个盘块上有多少个索引结点即多少个文件
  • 目录项由文件名和索引结点号组成
  • 索引结点记录文件的全部属性
  • 地址项含于索引结点 地址项=盘块号
  • 盘块=簇

那应用于题目中 涉及什么知识点
image
核心就这两个公式 用题目来看真正的考察 顺带总结
(2026)
image
先把题中可分析的点都得出 其实也就是问题要问的考察方向了
image
这个就是核心 求出后应用 这里还需要介绍关于盘块号大小=地址项大小 求出1024代表什么 其实就是应用于索引结点的结构地址项中
image
下面的5个1个什么都就是多少个地址 求出的1024套上去就是地址项的个数 两者可得出占用的大小或盘块数 后续会有考察
(1)可以求出一个盘块含64个索引结点 file索引结点号1000 盘块从100开始 所以很简单就是
1000/32+100得出盘块号
给你逻辑地址了 也就是给你文件大小了 21460B/盘块大小 就求出几个盘块了
最多可以存放的文件 等同于总的盘块数x每个盘块所含索引节点(文件)的数量 4096*32个文件
(2)这一问考察文件的操作有关知识点 后续会总结 删除主要涉及:删子文件 删目录本身 删目录中目录项 所以删除dir1先删除file 然后释放PCB 索引节点清0 更多后续总结参考

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

最后再看一个
(2018)
image
(1)考察文件大小了 先求出地址项个数 4KB/4B=1024 然后利用索引节点求解 (8+1024+10241204+102410241024)4KB
(2)首先文件系统可以容纳文件:1M4KB/64B=64M个
然后再算给的数据:512M
4KB/5600B=256M个 取决于文件系统最大容纳64M个
(3)6KB<84KB 所以需要直接地址即可 84KB<40KB<(8+1)*4KB 需要直接地址 一级间接地址 时间不同

其实上面扯了一大堆也没有真正弄清楚到底干什么 没错现在分析的才是核心之重

过程
image
目录中有很多文件 目录项就是对应文件 目录项内容文件名和索引节点号
索引节点就是一个文件的全部属性 所以每一个文件都对应一个索引节点 通过目录项找到索引节点
文件真正是存在哪个盘块中的 就需要索引节点中的一个属性 地址项来指出对应盘块地址

地址项
image
直接地址直接指向盘块 文件太大就需要间接地址
之前计算的 盘块大小/地址项大小求出来的就是一个索引块所含的地址项个数
有关大小的计算 就需要这里比如一级间接地址大小:一级间接地址个数[盘块大小(一个索引块*一个索引块所含地址项个数)]

大致就这两个 也对应的就是那两个重要公式 搞懂这个基本上文件系统有关大小的问题就能解决了

5.文件的操作 保护 共享 存储管理

文件的操作涉及到的打开创建删除关闭等这些知识点
不过多阐述 主要再回忆 综合题中涉及到简单考察 所以参考之前的总结即可
https://www.cnblogs.com/gaodiyuanjin/p/19501430

后续对OS的冷考点作最后一篇总结完事

posted @ 2026-09-15 10:05  蒸饺  阅读(9)  评论(0)    收藏  举报