# 虚拟存储器管理

# 什么是虚拟存储器?

​ 虚拟存储器是一种计算机内存管理技术,它通过将计算机的硬盘空间作为辅助存储器,允许程序使用比物理内存更大的地址空间。虚拟存储器的目标是提供更大的可用内存空间,以便同时运行更多的程序,而不受物理内存的限制。

​ 虚拟存储的实现是基于局部存储原理的,要理解虚拟存储我们就要去理解局部存储的是实现,即:分页存储、分段存储、段页式存储。

(这里我们重点掌握具有块表的分页存储)

# 课程设计核心目的?

将逻辑地址转为物理地址

# 页表?

页号 块号
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 << "下次再见!";
}
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

KarryLiu 微信支付

微信支付

KarryLiu 支付宝

支付宝