# 虚拟存储器管理
# 什么是虚拟存储器?
虚拟存储器是一种计算机内存管理技术,它通过将计算机的硬盘空间作为辅助存储器,允许程序使用比物理内存更大的地址空间。虚拟存储器的目标是提供更大的可用内存空间,以便同时运行更多的程序,而不受物理内存的限制。
虚拟存储的实现是基于局部存储原理的,要理解虚拟存储我们就要去理解局部存储的是实现,即:分页存储、分段存储、段页式存储。
(这里我们重点掌握具有块表的分页存储)
# 课程设计核心目的?
将逻辑地址转为物理地址
# 页表?
页号 | 块号 |
---|---|
0 | 0 |
1 | 2 |
2 | 4 |
3 | 6 |
针对这个课程设计,我们简单的理解为应用页表就是通过页号,来去找到块号
由虚拟地址(逻辑地址)转换为物理地址,这就是页表最核心的作用!
# 为什么要用虚拟内存
但是,我们的内存很小,还想运行多个应用程序,这必然无法满足所有的有的应用程序一次性全部加载到内存之中。根据局部性理论基础,我们又引申出页面的对换算法(页面置换算法)。
本次课程设计采用的是 Clock 算法
将页表扩充,引入访问位、修改位、有效位(本次仅用于算法实现,它其实用其他
更有用的功能,在此不做介绍)
修改位 | 访问位 | 重要排名 |
---|---|---|
0 | 0 | 4 |
0 | 1 | 3 |
1 | 0 | 2 |
1 | 1 | 1 |
在置换时,优先考虑不那么重要的(排名越低越不重要),对于不重要的页优先换出
# 状态转换?
这里稍后同步,大家可以先看视频里的有关状态转换的图。
# 代码实现
/** | |
* @Author KarryLiu | |
* @Creed may all the beauty be blessed | |
* @Date 2023/12/4 上午 10:04 | |
* @Description TODO 诗岸梦行舟 | |
* @Version 1.0 | |
*/ | |
#include <limits> | |
#include "iostream" | |
#include "windows.h" | |
#include "unistd.h" | |
// 颜色枚举,为了好看 | |
enum ConsoleColor { | |
Black = 0, | |
Blue = 1, | |
Green = 2, | |
Cyan = 3, | |
Red = 4, | |
Magenta = 5, | |
Yellow = 6, | |
White = 7, | |
Gray = 8 | |
}; | |
// 设置文本颜色函数 | |
void setConsoleColor(ConsoleColor text, ConsoleColor background) { | |
int color = text + background * 16; | |
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color); | |
} | |
// 块大小 | |
#define blockSize 4 | |
// 页大小 | |
#define pageSize 2 | |
// 快表尺寸 | |
#define fastTableDimensions 4 | |
// 页表尺寸 | |
#define pageTableDimensions 6 | |
// 程序最大逻辑地址 | |
const int logicalMaxAddress = 100; | |
// 逻辑地址数据结构 -> 页 | |
struct logicalAddressDataStruct { | |
int pageNumber; | |
int inPageAddress; | |
}; | |
// 页逻辑地址实现机构 | |
logicalAddressDataStruct logicalAddress; | |
// 模拟外存中单条数据的数据结构 | |
struct externalMemoryDataStruct { | |
int externalPageNumber; | |
int externalBlockNumber; | |
// 访问位 | |
bool accessBit; | |
// 修改位 | |
bool modifyBit; | |
// 有效位 | |
bool validBit; | |
}; | |
// 外存所有存储结构,也就是最大逻辑地址 100 的一半,50 页 | |
externalMemoryDataStruct externalMemory[logicalMaxAddress / pageSize]; | |
// 模拟内存中单条数据的数据结构 (页表) | |
struct internalStorageDataStruct { | |
int internalPageNumber; | |
int internalBlockNumber; | |
// 访问位 | |
bool accessBit; | |
// 修改位 | |
bool modifyBit; | |
// 有效位 | |
bool validBit; | |
}; | |
// 页表实体 | |
internalStorageDataStruct pageTable[pageTableDimensions]; | |
// 快表数据结构 | |
struct fastTableDataStruct { | |
int fastTablePageNumber; | |
int fastTableBlockNumber; | |
// 访问位 | |
bool accessBit; | |
// 修改位 | |
bool modifyBit; | |
// 有效位 | |
bool validBit; | |
}; | |
// 快表实体 | |
fastTableDataStruct fastTable[fastTableDimensions]; | |
// 快表置换排行榜数据结构 | |
struct rankForFastTableDataStruct { | |
int pageNumber; | |
int fastTableIndex; | |
}; | |
// 页表置换排行榜数据结构 | |
struct rankForPageTableDataStruct { | |
int pageNumber; | |
int pageTableIndex; | |
}; | |
// 物理地址数据结构 | |
struct physicalAddressDataStruct { | |
int blockNumber; | |
int internalBlockAddress; | |
}; | |
// 转换后的物理地址实体 | |
physicalAddressDataStruct physicalAddress; | |
using namespace std; | |
/** | |
* @Describe 初始化外存数据 | |
*/ | |
void InitializeExternalData() { | |
for (int i = 0; i < logicalMaxAddress / pageSize; i++) { | |
// 计算页号与块号 | |
externalMemory[i].externalPageNumber = i; | |
externalMemory[i].externalBlockNumber = i / blockSize; | |
} | |
// for (int i = 0; i < logicalMaxAddress / pageSize; ++i) { | |
// cout<<externalMemory[i].externalPageNumber<<" "<<externalMemory[i].externalBlockNumber<<endl; | |
// } | |
} | |
/** | |
* @Describe 从外存中寻找所缺失的页 | |
* @return externalMemoryDataStruct 返回找到的外存数据页 | |
*/ | |
externalMemoryDataStruct LookMissingPageFromExternalMemory(int logicalAddressPageNumber) { | |
for (int i = 0; i < logicalMaxAddress / pageSize; i++) { | |
// 计算页号与块号 | |
if (externalMemory[i].externalPageNumber == logicalAddressPageNumber) { | |
return externalMemory[i]; | |
} | |
} | |
} | |
void PageTableVisualization() { | |
setConsoleColor(Magenta, Black); | |
cout << "-------------------页表(内存)-------------------+" << endl; | |
for (int i = 0; i < pageTableDimensions; i++) { | |
cout << "页号:" << pageTable[i].internalPageNumber << " 块号:" << pageTable[i].internalBlockNumber << " 访问位:" | |
<< pageTable[i].accessBit << " 修改位:" << pageTable[i].modifyBit << " 有效位:" << pageTable[i].validBit | |
<< endl; | |
} | |
cout << "--------------------------------------------------+" << endl; | |
} | |
void FastTableVisualization() { | |
setConsoleColor(Cyan, Black); | |
// sleep(1); | |
cout << "----------------------快表-----------------------+" << endl; | |
for (int i = 0; i < fastTableDimensions; i++) { | |
cout << "页号:" << fastTable[i].fastTablePageNumber << " 块号:" << fastTable[i].fastTableBlockNumber | |
<< " 访问位:" << fastTable[i].accessBit << " 修改位:" << fastTable[i].modifyBit << " 有效位:" | |
<< fastTable[i].validBit << endl; | |
} | |
cout << "-------------------------------------------------+" << endl; | |
} | |
/** | |
* @Describe 初始化页表 | |
*/ | |
void InitializePageTable() { | |
} | |
int main() { | |
setConsoleColor(Cyan, Black); | |
cout<<"诗岸梦行舟"<<endl; | |
cout<<"操作系统课程设计:虚拟存储器管理"<<endl; | |
sleep(2); | |
// 系统请求的逻辑地址 | |
int requestLogicalAddressByOS = 0; | |
// 初始化外存数据结构 | |
InitializeExternalData(); | |
// 快表发现位,真就是发现了,假就是没发现 | |
bool fastTableFind = false; | |
// 在快表的哪一位发现的? | |
int fastTableFindPoint; | |
// 页表发现位,真就是发现了,假就是没发现 | |
bool pageTableFind = false; | |
// 在页表的哪一位发现的? | |
int pageTableFindPoint; | |
// 当前内存容量(页表剩余容量) | |
int remainingCapacityOfPageTable = 6; | |
// 当前快表容量(快表剩余容量) | |
int remainingCapacityOfFastTable = 4; | |
while (true) { | |
// 初始化物理地址数据暂存 | |
physicalAddress.blockNumber = -1; | |
physicalAddress.internalBlockAddress = -1; | |
setConsoleColor(Blue, Black); | |
// sleep(2); | |
cout << "系统基本信息:" << endl; | |
cout << " +------------------------+" <<"----------------------+"<< endl; | |
cout << " | 块大小:" << blockSize << " |" <<" xx大学 |"<< endl; | |
cout << " | 页大小:" << pageSize << " |" <<" 专业 |"<< endl; | |
cout << " | 最大逻辑地址:" << logicalMaxAddress << " |" <<" OS 课程设计 |"<< endl; | |
cout << " | 快表尺寸:" << fastTableDimensions << " |" <<" 诗岸梦行舟 |"<< endl; | |
cout << " | 页表尺寸:" << pageTableDimensions << " |" <<" 虚 拟 存 储 器 管 理 |"<< endl; | |
cout << " +------------------------+" <<"----------------------+"<< endl; | |
FastTableVisualization(); | |
PageTableVisualization(); | |
setConsoleColor(White, Black); | |
cout << "请输入应用程序请求的逻辑地址:" << endl; | |
cin >> requestLogicalAddressByOS; | |
// 结束程序 | |
if (requestLogicalAddressByOS < 0) { break; } | |
// 逻辑地址越界 | |
if (requestLogicalAddressByOS > logicalMaxAddress) { | |
setConsoleColor(Red, Black); | |
cout << "您请求的地址超出最大逻辑地址!产生越界中断!" << endl; | |
setConsoleColor(White, Black); | |
sleep(2); | |
continue; | |
} | |
setConsoleColor(Cyan, Black); | |
cout << "您请求的十进制地址:" << requestLogicalAddressByOS << endl; | |
setConsoleColor(White, Black); | |
/** | |
* 计算逻辑地址数据 | |
* P = [A / L] | |
* d = A % L | |
*/ | |
logicalAddress.pageNumber = requestLogicalAddressByOS / pageSize; | |
logicalAddress.inPageAddress = requestLogicalAddressByOS % pageSize; | |
cout << "计算后形成逻辑地址:" << endl; | |
setConsoleColor(Magenta, Black); | |
cout << "+---页号---+---页内地址----+" << endl; | |
cout << "| " << logicalAddress.pageNumber << " | " << logicalAddress.inPageAddress << " |" | |
<< endl; | |
cout << "+----------+---------------+" << endl; | |
// cout<<"按回车继续执行..."; | |
// cin.get();cin.get(); | |
setConsoleColor(White, Black); | |
// CPU 检索块表 | |
cout << "操作系统检索快表..." << endl; | |
for (int i = 0; i < fastTableDimensions; i++) { | |
if (fastTable[i].fastTablePageNumber == logicalAddress.pageNumber && fastTable[i].validBit) { | |
// 在快表中发现了与之对应的页号的数据页 | |
setConsoleColor(Green, Black); | |
cout << "操作系统在快表中发现了相应的数据页!" << endl; | |
fastTableFindPoint = i; | |
// 将发现检查位置真 | |
fastTableFind = true; | |
setConsoleColor(White, Black); | |
break; | |
} | |
} | |
if (!fastTableFind) { | |
// 快表中没有,访问页表 | |
setConsoleColor(Yellow, Black); | |
cout << "快表中没有发现相应的数据页!" << endl; | |
setConsoleColor(White, Black); | |
cout << "操作系统检索页表..." << endl; | |
// 从内存中(页表)寻找所缺失的页 | |
for (int i = 0; i < pageTableDimensions; i++) { | |
if (pageTable[i].internalPageNumber == logicalAddress.pageNumber && pageTable[i].validBit) { | |
// 在内存中(页表)找到了数据页 | |
setConsoleColor(Green, Black); | |
cout << "操作系统在页表中发现了相应的数据页!" << endl; | |
pageTableFind = true; | |
pageTableFindPoint = i; | |
setConsoleColor(White, Black); | |
break; | |
} | |
} | |
if (!pageTableFind) { | |
// 页表(内存)中没有 | |
setConsoleColor(Yellow, Black); | |
cout << "页中没有发现相应的数据页!" << endl; | |
setConsoleColor(White, Black); | |
cout << "操作系统会正在从外存中抽取页..." << endl; | |
// 从外存中抽取页 | |
externalMemoryDataStruct externalMemoryFindPage = LookMissingPageFromExternalMemory( | |
logicalAddress.pageNumber); | |
/*cout<<externalMemoryFindPage.externalPageNumber<<" "<<externalMemoryFindPage.externalBlockNumber;*/ | |
cout << "成功抽取到了,现在正在检查内存是否已满..." << endl; | |
sleep(1); | |
if (!(remainingCapacityOfPageTable > 0)) { | |
// 内存(页表)已满 | |
// 这里得选择一个最没用的一页对换出去 | |
setConsoleColor(Red, Black); | |
cout << "内存已满,操作系统需要进行页面置换,正在选择一个最没用的一页进行换出..." << endl;; | |
setConsoleColor(White, Black); | |
// 开始选择一个最没用的一页 | |
// 页表置换排行榜 | |
rankForPageTableDataStruct rankForPageTable[pageTableDimensions]; | |
// 初始化排行榜 | |
for (int i = 0; i < pageTableDimensions; i++) { | |
rankForPageTable[i].pageNumber - 1; | |
rankForPageTable[i].pageTableIndex = -1; | |
} | |
// 模拟态桶排序 | |
for (int i = 0; i < pageTableDimensions; i++) { | |
if (pageTable[i].validBit | |
&& !pageTable[i].accessBit | |
&& !pageTable[i].modifyBit) { | |
rankForPageTable[0].pageTableIndex = i; | |
rankForPageTable[0].pageNumber = pageTable[i].internalPageNumber; | |
} else if (pageTable[i].validBit | |
&& pageTable[i].accessBit | |
&& !pageTable[i].modifyBit) { | |
rankForPageTable[1].pageTableIndex = i; | |
rankForPageTable[1].pageNumber = pageTable[i].internalPageNumber; | |
} else if (pageTable[i].validBit | |
&& !pageTable[i].accessBit | |
&& pageTable[i].modifyBit) { | |
rankForPageTable[2].pageTableIndex = i; | |
rankForPageTable[2].pageNumber = pageTable[i].internalPageNumber; | |
} else { | |
rankForPageTable[3].pageTableIndex = i; | |
rankForPageTable[3].pageNumber = pageTable[i].internalPageNumber; | |
} | |
} | |
for (int i = 0; i < pageTableDimensions; i++) { | |
if (rankForPageTable[i].pageNumber != -1) { | |
// 找到一个没用的页 | |
setConsoleColor(Green, Black); | |
cout << "操作系统页表表选择了一个页号为" | |
<< pageTable[rankForPageTable[i].pageTableIndex].internalPageNumber | |
<< "的页进行换出..." | |
<< endl;; | |
setConsoleColor(White, Black); | |
sleep(1); | |
// 把页表中对应的页号置为无效 | |
pageTable[rankForPageTable[i].pageTableIndex].validBit = false; | |
// 页表页面置换 | |
pageTable[rankForPageTable[i].pageTableIndex].internalPageNumber = externalMemoryFindPage.externalPageNumber; | |
pageTable[rankForPageTable[i].pageTableIndex].internalBlockNumber = externalMemoryFindPage.externalBlockNumber; | |
pageTable[rankForPageTable[i].pageTableIndex].accessBit = false; | |
pageTable[rankForPageTable[i].pageTableIndex].modifyBit = false; | |
pageTable[rankForPageTable[i].pageTableIndex].validBit = true; | |
break; | |
} | |
} | |
} else { | |
// 内存(页表)仍有空间 | |
// 有空间就可以塞进去 | |
setConsoleColor(Blue, Black); | |
cout << "内存还有空间,操作系统正在读取缺页并回写内存中..." << endl;; | |
setConsoleColor(White, Black); | |
for (int i = 0; i < pageTableDimensions; i++) { | |
if (pageTable[i].validBit == false) { | |
pageTable[i].validBit = true; | |
pageTable[i].internalPageNumber = externalMemoryFindPage.externalPageNumber; | |
pageTable[i].internalBlockNumber = externalMemoryFindPage.externalBlockNumber; | |
break; | |
} | |
} | |
setConsoleColor(Green, Black); | |
cout << "页表回写成功!" << endl;; | |
setConsoleColor(White, Black); | |
// 塞完就减减 | |
remainingCapacityOfPageTable--; | |
} | |
if (!(remainingCapacityOfFastTable > 0)) { | |
// 快表没有空间了 | |
setConsoleColor(Red, Black); | |
cout << "快表已满,操作系统需要进行页面置换,正在选择一个最没用的一页进行换出..." << endl;; | |
setConsoleColor(White, Black); | |
// 选择一个最没用的一页进行换出!!!!!!!!!! | |
bool fastTableFindCheckIsTrue = false; | |
int fastTableFindCheckIndex; | |
// 快表置换排行榜 | |
rankForFastTableDataStruct rankForFastTable[fastTableDimensions]; | |
// 初始化排行榜 | |
for (int i = 0; i < fastTableDimensions; i++) { | |
rankForFastTable[i].pageNumber = -1; | |
rankForFastTable[i].fastTableIndex = -1; | |
} | |
// 模拟态桶排序 | |
for (int i = 0; i < fastTableDimensions; i++) { | |
if (fastTable[i].validBit | |
&& !fastTable[i].accessBit | |
&& !fastTable[i].modifyBit) { | |
rankForFastTable[0].fastTableIndex = i; | |
rankForFastTable[0].pageNumber = fastTable[i].fastTablePageNumber; | |
} else if (fastTable[i].validBit | |
&& fastTable[i].accessBit | |
&& !fastTable[i].modifyBit) { | |
rankForFastTable[1].fastTableIndex = i; | |
rankForFastTable[1].pageNumber = fastTable[i].fastTablePageNumber; | |
} else if (fastTable[i].validBit | |
&& !fastTable[i].accessBit | |
&& fastTable[i].modifyBit) { | |
rankForFastTable[2].fastTableIndex = i; | |
rankForFastTable[2].pageNumber = fastTable[i].fastTablePageNumber; | |
} else { | |
rankForFastTable[3].fastTableIndex = i; | |
rankForFastTable[3].pageNumber = fastTable[i].fastTablePageNumber; | |
} | |
} | |
for (int i = 0; i < fastTableDimensions; i++) { | |
if (rankForFastTable[i].pageNumber != -1) { | |
// 找到一个没用的页 | |
setConsoleColor(Green, Black); | |
cout << "操作系统在快表选择了一个页号为" | |
<< fastTable[rankForFastTable[i].fastTableIndex].fastTablePageNumber | |
<< "的页进行换出..." | |
<< endl; | |
setConsoleColor(White, Black); | |
sleep(1); | |
// 把快表中对应的页号置为无效 | |
fastTable[rankForFastTable[i].fastTableIndex].validBit = false; | |
// 快表页面置换 | |
fastTable[rankForFastTable[i].fastTableIndex].fastTablePageNumber = externalMemoryFindPage.externalPageNumber; | |
fastTable[rankForFastTable[i].fastTableIndex].fastTableBlockNumber = externalMemoryFindPage.externalBlockNumber; | |
fastTable[rankForFastTable[i].fastTableIndex].accessBit = false; | |
fastTable[rankForFastTable[i].fastTableIndex].modifyBit = false; | |
fastTable[rankForFastTable[i].fastTableIndex].validBit = true; | |
// 把页表中对应的页号置为无效? | |
fastTableFindCheckIsTrue = true; | |
break; | |
} | |
} | |
if (fastTableFindCheckIsTrue) { | |
} else { | |
setConsoleColor(Red, Black); | |
cout << "一般不存在这种情况,以防万一留着DeBug用" << endl; | |
setConsoleColor(White, Black); | |
} | |
} else { | |
// 快表仍然有空间 | |
// 有空间就塞 | |
setConsoleColor(Blue, Black); | |
cout << "快表还有空间,操作系统正在读取缺页并回写内存中..." << endl;; | |
setConsoleColor(White, Black); | |
for (int i = 0; i < fastTableDimensions; i++) { | |
if (fastTable[i].validBit == false) { | |
fastTable[i].validBit = true; | |
fastTable[i].fastTablePageNumber = externalMemoryFindPage.externalPageNumber; | |
fastTable[i].fastTableBlockNumber = externalMemoryFindPage.externalBlockNumber; | |
break; | |
} | |
} | |
setConsoleColor(Green, Black); | |
cout << "快表回写成功!" << endl;; | |
setConsoleColor(White, Black); | |
// 塞完就减减 | |
remainingCapacityOfFastTable--; | |
} | |
//!!!!!!!!!!!!!! | |
physicalAddress.blockNumber = externalMemoryFindPage.externalBlockNumber; | |
physicalAddress.internalBlockAddress = logicalAddress.inPageAddress; | |
cout << "计算后得到物理地址:" << endl; | |
setConsoleColor(Magenta, Black); | |
cout << "+---块号---+---块内地址----+" << endl; | |
cout << "| " << physicalAddress.blockNumber << " | " << physicalAddress.internalBlockAddress | |
<< " |" | |
<< endl; | |
cout << "+----------+---------------+" << endl; | |
sleep(2); | |
} else { | |
// 页表中有 | |
// 页表中的话,修改页表后还需要进行快表置换 | |
/** | |
* 如果页表里面有,那就更改他的访问位和修改位, | |
* 为了编写简单,在这里我做出一个规定: | |
* 当应用程序第一次访问时将访问位置真, | |
* 当应用程序第二次访问时将修改为置真。 | |
* 这么做也是相对合理的,原因如下: | |
* 访问位与修改位联合置换逻辑(修改,访问)即对换优先级: | |
* * * 1.(0,0) | |
* * * 2.(0,1) | |
* * * 3.(1,0) | |
* * * 4.(1,1) | |
* 排名越高,置换优先级越高, | |
* 相对来讲,访问位与修改位置真后,访问位优先级高于修改位 | |
* 其实我懒了 但我不说(qwq) | |
*/ | |
// 快表置换,基于页表 | |
// 快表置换排行榜 | |
rankForFastTableDataStruct rankForFastTable[fastTableDimensions]; | |
// 初始化排行榜 | |
for (int i = 0; i < fastTableDimensions; i++) { | |
rankForFastTable[i].pageNumber = -1; | |
rankForFastTable[i].fastTableIndex = -1; | |
} | |
// 模拟态桶排序 | |
for (int i = 0; i < fastTableDimensions; i++) { | |
if (fastTable[i].validBit | |
&& !fastTable[i].accessBit | |
&& !fastTable[i].modifyBit) { | |
rankForFastTable[0].fastTableIndex = i; | |
rankForFastTable[0].pageNumber = fastTable[i].fastTablePageNumber; | |
} else if (fastTable[i].validBit | |
&& fastTable[i].accessBit | |
&& !fastTable[i].modifyBit) { | |
rankForFastTable[1].fastTableIndex = i; | |
rankForFastTable[1].pageNumber = fastTable[i].fastTablePageNumber; | |
} else if (fastTable[i].validBit | |
&& !fastTable[i].accessBit | |
&& fastTable[i].modifyBit) { | |
rankForFastTable[2].fastTableIndex = i; | |
rankForFastTable[2].pageNumber = fastTable[i].fastTablePageNumber; | |
} else { | |
rankForFastTable[3].fastTableIndex = i; | |
rankForFastTable[3].pageNumber = fastTable[i].fastTablePageNumber; | |
} | |
} | |
for (int i = 0; i < fastTableDimensions; i++) { | |
if (rankForFastTable[i].pageNumber != -1) { | |
// 找到一个没用的页 | |
setConsoleColor(Green, Black); | |
cout << "操作系统在快表选择了一个页号为" | |
<< fastTable[rankForFastTable[i].fastTableIndex].fastTablePageNumber | |
<< "的页进行换出..." | |
<< endl;; | |
setConsoleColor(White, Black); | |
sleep(1); | |
// 把快表中对应的页号置为无效 | |
fastTable[rankForFastTable[i].fastTableIndex].validBit = false; | |
// 快表页面置换 | |
fastTable[rankForFastTable[i].fastTableIndex].fastTablePageNumber = pageTable[pageTableFindPoint].internalPageNumber; | |
fastTable[rankForFastTable[i].fastTableIndex].fastTableBlockNumber = pageTable[pageTableFindPoint].internalBlockNumber; | |
fastTable[rankForFastTable[i].fastTableIndex].accessBit = false; | |
fastTable[rankForFastTable[i].fastTableIndex].modifyBit = false; | |
fastTable[rankForFastTable[i].fastTableIndex].validBit = true; | |
// 物理地址存储 | |
physicalAddress.blockNumber = pageTable[pageTableFindPoint].internalBlockNumber; | |
physicalAddress.internalBlockAddress = logicalAddress.inPageAddress; | |
break; | |
} | |
} | |
cout << "计算后得到物理地址:" << endl; | |
setConsoleColor(Magenta, Black); | |
cout << "+---块号---+---块内地址----+" << endl; | |
cout << "| " << physicalAddress.blockNumber << " | " << physicalAddress.internalBlockAddress | |
<< " |" | |
<< endl; | |
cout << "+----------+---------------+" << endl; | |
// 修改页表 | |
if (pageTable[pageTableFindPoint].validBit | |
&& !pageTable[pageTableFindPoint].accessBit | |
&& !pageTable[pageTableFindPoint].modifyBit) { | |
pageTable[pageTableFindPoint].accessBit = true; | |
} else if (pageTable[pageTableFindPoint].validBit | |
&& pageTable[pageTableFindPoint].accessBit | |
&& !pageTable[pageTableFindPoint].modifyBit) { | |
pageTable[pageTableFindPoint].accessBit = false; | |
pageTable[pageTableFindPoint].modifyBit = true; | |
} else if (pageTable[pageTableFindPoint].validBit | |
&& !pageTable[pageTableFindPoint].accessBit | |
&& pageTable[pageTableFindPoint].modifyBit) { | |
pageTable[pageTableFindPoint].accessBit = true; | |
pageTable[pageTableFindPoint].modifyBit = true; | |
} | |
// 同步快表 | |
for (int i = 0; i < fastTableDimensions; i++) { | |
if (fastTable[i].fastTablePageNumber == pageTable[pageTableFindPoint].internalPageNumber) { | |
if (fastTable[i].validBit | |
&& !fastTable[i].accessBit | |
&& !fastTable[i].modifyBit) { | |
fastTable[i].accessBit = true; | |
} else if (fastTable[i].validBit | |
&& fastTable[i].accessBit | |
&& !fastTable[i].modifyBit) { | |
fastTable[i].accessBit = false; | |
fastTable[i].modifyBit = true; | |
} else if (fastTable[i].validBit | |
&& !fastTable[i].accessBit | |
&& fastTable[i].modifyBit) { | |
fastTable[i].accessBit = true; | |
fastTable[i].modifyBit = true; | |
} | |
break; | |
} | |
} | |
} | |
} else { | |
// 快表中有 | |
// 修改快表 | |
fastTable[fastTableFindPoint]; | |
if (fastTable[fastTableFindPoint].validBit | |
&& !fastTable[fastTableFindPoint].accessBit | |
&& !fastTable[fastTableFindPoint].modifyBit) { | |
fastTable[fastTableFindPoint].accessBit = true; | |
} else if (fastTable[fastTableFindPoint].validBit | |
&& fastTable[fastTableFindPoint].accessBit | |
&& !fastTable[fastTableFindPoint].modifyBit) { | |
fastTable[fastTableFindPoint].accessBit = false; | |
fastTable[fastTableFindPoint].modifyBit = true; | |
} else if (fastTable[fastTableFindPoint].validBit | |
&& !fastTable[fastTableFindPoint].accessBit | |
&& fastTable[fastTableFindPoint].modifyBit) { | |
fastTable[fastTableFindPoint].accessBit = true; | |
fastTable[fastTableFindPoint].modifyBit = true; | |
} | |
// 同步页表 | |
for (int i = 0; i < pageTableDimensions; i++) { | |
if (pageTable[i].internalPageNumber == fastTable[fastTableFindPoint].fastTablePageNumber) { | |
if (pageTable[i].validBit | |
&& !pageTable[i].accessBit | |
&& !pageTable[i].modifyBit) { | |
pageTable[i].accessBit = true; | |
} else if (pageTable[i].validBit | |
&& pageTable[i].accessBit | |
&& !pageTable[i].modifyBit) { | |
pageTable[i].accessBit = false; | |
pageTable[i].modifyBit = true; | |
} else if (pageTable[i].validBit | |
&& !pageTable[i].accessBit | |
&& pageTable[i].modifyBit) { | |
pageTable[i].accessBit = true; | |
pageTable[i].modifyBit = true; | |
} | |
break; | |
} | |
} | |
// 直接从快表中提取 | |
physicalAddress.blockNumber = fastTable[fastTableFindPoint].fastTableBlockNumber; | |
physicalAddress.internalBlockAddress = logicalAddress.inPageAddress; | |
cout << "计算后得到物理地址:" << endl; | |
setConsoleColor(Magenta, Black); | |
cout << "+---块号---+---块内地址----+" << endl; | |
cout << "| " << physicalAddress.blockNumber << " | " << physicalAddress.internalBlockAddress | |
<< " |" | |
<< endl; | |
cout << "+----------+---------------+" << endl; | |
sleep(2); | |
} | |
// 恢复初始状态 | |
fastTableFind = false; | |
pageTableFind = false; | |
setConsoleColor(Green, Black); | |
sleep(1); | |
cout << "---------------地址变换结束---------------"; | |
sleep(1); | |
cout << endl; | |
setConsoleColor(White, Black); | |
} | |
cout << "下次再见!"; | |
} |