基于C++实现(控制台+GUI)段页式虚拟存储管理系统

张开发
2026/4/13 7:03:46 15 分钟阅读

分享文章

基于C++实现(控制台+GUI)段页式虚拟存储管理系统
系统软件综合设计报告1、课程设计概览1.1 课程设计目的和要求目的在掌握程序的设计技能、专业基础课程和《操作系统》课程的理论知识的基础上设计和实现操作系统的基本算法、模块与相关的资源管理功能旨在加深对计算机硬件结构和系统软件的认识初步掌握操作系统组成模块和应用接口的使用方法提高进行工程设计和系统分析的能力为毕业设计和以后的工程实践打下良好的基础[1]。要求按照《系统软件综合设计指导书——操作系统分册》的有关要求完成算法设计、代码编写与调试以及课设报告的撰写[1]。1.2 课程设计任务段页式虚拟存储管理系统建立一个段页虚拟存储管理系统的模型[1]。1-2 人难度4首先分配一片较大的内存空间和一段磁盘空间作为程序运行的可用存储空间和外存兑换区建立应用程序的模型包括分段结构在内建立进程的基本数据结构及相应算法建立管理存储空间的基本存储结构建立管理段页的基本数据结构与算法设计存储空间的分配与回收算法实现缺页中段支持的逻辑地址到物理地址转换实现虚拟存储器提供信息转储功能可将存储信息存入磁盘也可从磁盘读入。2、开发环境硬件Dell G3579 笔记本电脑软件Visual Studio 2019 Enterprise、gcc、Notepad、Qt Creator 4.11.1(Community)。3、相关原理及算法段页式系统既具有分段系统的便于实现、分段可共享、易于保护、可动态链接等一系列优点又能像分页系统那样很好地解决内存的外部碎片问题。3.1 基本原理段页式系统的基本原理是分段和分页原理的结合即先将用户程序分成若干个段再把每个段分成若干个页并为每一个段赋予一个段名。在段页式系统中其结构由段号、段内页号和段内地址三部分组成如图 3.1.1 所示[2]。在段页式系统中为了实现从逻辑地址到物理地址的变换系统中需要同时配置段表和页表。段表的内容与分段系统略有不同它不再是内存始址和段长而是页表始址和页表长度。图 3.1.2 示出了利用段表和页表进行从用户地址空间到物理内存空间的映射。3.2 地址变换过程在段页式系统中为了便于实现地址变换须配置一个段表寄存器其中存放段表始址和段长 TL[2]。进行地址变换时首先利用段号 S将它与段长 TL 进行比较。若 STL表示未越界于是利用段表始址和段号来求出该段所对应的段表项在段表中的位置从中得到该段的页表始址并利用逻辑地址中的段内页号 Р 来获得对应页的页表项位置从中读出该页所在的物理块号 b再利用块号 b 和页内地址来构成物理地址。图 3.2.1 示出了段页式系统中的地址变换机构。在段页式系统中为了获得一条指令或数据须三次访问内存。第一次访问是访问内存中的段表从中取得页表始址﹔第二次访问是访问内存中的页表从中取出该页所在的物理块号并将该块号与页内地址一起形成指令或数据的物理地址第三次访问才是真正从第二次访问所得的地址中取出指令或数据。显然这使访问内存的次数增加了近两倍。为了提高执行速度在地址变换机构中增设一个高速缓冲寄存器。每次访问它时都须同时利用段号和页号去检索高速缓存若找到匹配的表项便可从中得到相应页的物理块号用来与页内地址一起形成物理地址;若未找到匹配表项则仍需第三次访问内存。3.3 有关算法1 分页系统中逻辑地址到物理地址的转换本设计需要根据内存中的逻辑地址计算对应的物理地址段页式系统的逻辑地址由页地址与段地址共同表示[2]。而在分页管理中对某特定机器其地址结构是一定的。若給定一个逻辑地址空间的地址为 A页面的大小为 L则页号 P 和页内地址 d 可按下式求得其中INT 是整除函数MOD 是取余函数。2 最近最久未使用Least Recently UsedLRU置换算法本设计的目标是构建一个允许内存与外存进行数据置换的调度系统因此合适的虚拟地址到物理地址的算法即虚拟存储地址变换是应当被考虑的。值得一提的是虚拟存储器地址变换基本上有 3 种形虚拟存储器工作过程式全联想变换、直接变换、组联想变换[3]。其中任何逻辑空间页面能够变换到物理空间任何页面位置的方式称为全联想变换每个逻辑空间页面只能变换到物理空间一个特定页面的方式称为直接变换组联想变换是指各组之间是直接变换而组内各页间则是全联想变换。替换规则用来确定替换主存中哪一部分以便腾空部分主存存放来自辅存要调入的那部分内容。当前流行的替换算法有 4 种随机算法用软件或硬件随机数产生器确定替换的页面先进先出先调入主存的页面先替换近期最少使用算法LRULeast Recently Used替换最长时间不用的页面最优算法替换最长时间以后才使用的页面。这是理想化的算法只能作为衡量其他各种算法优劣的标准。综合算法性能、鲁棒性与编程复杂度等因素考量本设计采用 LRU 算法作为内存与外存的内容置换算法。4、系统结构和主要的算法设计思路本设计所构建的虚拟段页式系统主要分为 3 个模块内存管理模块、请求调度模块与异常处理模块其中内存管理模块又细分为请求分页的页表机制、请求分段的段表机制以及内存分配/回收模块异常处理模块分为缺页中断机构、缺段中断机构。系统的 UML 类图如图 4.1 所示。本设计在完成虚拟段页式系统的构建的基础上使用 Qt 创建了用户良好、操作简洁的可视化操作界面。要构建虚拟段页式系统本设计必须提供内存置换的数据结构与算法支持为了保证内存的有效分配及高效管理应当考虑采用链式结构进行存储。内存置换会带来缺页中断与缺段中断的问题这是本设计重点探究的症结。接下来详细介绍本设计所构建的系统以及使用的有关算法。4.1 系统结构4.1.1 内存管理模块本模块主要负责系统的内存申请、初始化、分配与回收根据其操作对象的不同有请求分页的页表机制、请求分段的段表机制以及内存分配/回收模块。下面逐一介绍。1 请求页表机制为了实现请求分页系统必须提供一定的硬件支持。本设计构建的虚拟段页式系统可以完全模拟标准 OS 中相关模块的工作机制因此本系统不仅具备一定容量的内存和外村还配置了请求页表机制[2]。在请求分页系统中需要的主要数据结构是请求页表其基本作用仍然是将用户地址空间中的逻辑地址映射为内存空间中的物理地址。为了满足页面换进换出的需要在请求页表中又增加了四个字段。这样在请求分页系统中的每个页表应含以下诸项页号物理块号状态位 P访问字段 A修改位 M外村地址现对其中各字段说明如下状态位(存在位)P由于在请求分页系统中只将应用程序的一部分调入内存还有一部分仍在外存磁盘上故须在页表中增加一个存在位字段。由于该字段仅有一位故又称位字。它用于指示该页是否已调入内存供程序访问时参考。访问字段 A用于记录本页在一段时间内被访问的次数或记录本页最近己有多长时间未被访问提供给置换算法(程序)在选择换出页面时参考。修改位 M标识该页在调入内存后是否被修改过。由于内存中的每一页都在外存上保留一份副本因此在置换该页时若未被修改就不需再将该页写回到外存上以减少系统的开销和启动磁盘的次数若已被修改则必须将该页重写到外存上以保证外存中所保留的副本始终是最新的。简而言之M 位供置换页面时参考。外存地址用于指出该页在外存上的地址通常是物理块号供调入该页时参考。2 请求段表机制为了实现请求分段式存储管理应在系统中配置多种硬件机构以支持快速地完成请求分段功能。与请求分页系统相似本设计所构建的虚拟段页式系统也配备了请求段表机制[2]。在请求分段式管理中所需的主要数据结构是请求段表。在该表中除了具有请求分页机制中有的访问字段 A、修改位 M、存在位 Р 和外存始址四个字段外还增加了存取方式字段和增补位。这些字段供程序在调进、调出时参考。下面给出请求分段的段表项。段名段长段基址存取方式访问字段 A修改位 A存在位 P增补位外村地址在段表项中除了段名(号)、段长、段在内存中的起始地址(段基址)外还增加了以下字段存取方式。由于应用程序中的段是信息的逻辑单位可根据该信息的属性对它实施保护故在段表中增加存取方式字段如果该字段为两位则存取属性是只执行、只读和允许读/写。访问字段 A。其含义与请求分页的相应字段相同用于记录该段被访问的频繁程度。提供給置换算法选择换出页面时参考。修改位 M。该字段用于表示该页在进入内存后是否已被修改过供置换页面时参考。存在位 P。该字段用于指示本段是否己调入内存供程序访问时参考。增补位。这是请求分段式管理中所特有的字段用于表示本段在运行过程中是否做过动态增长。外存始址。指示本段在外存中的起始地址即起始盘块号。3 内存分配/回收模块存储管理是 OS 管理主存储器的软件部分而在段页式存储管理中段式二维逻辑地址空间的程序占用多个主存页架区[4]。本设计所构建虚拟段页式系统的内存是以内存块留驻页面为主要存储方式页表嵌套在段表中而若干个段表分属不同的进程。本设计针对页表、段表、进程、内存块分别使用了合适的数据结构进行内存分配为了提高存储效率重点关注了内存的管理与回收。譬如当内存申请不合理时向用户发出警告信息当在内存一定的情况下申请过大的段表空间时允许用户扩充内存每个内存空间在被使用后均会被重新回收至主存中。下面介绍本设计所使用的有关算法。4.2 算法设计思路本设计所构建的虚拟段页式系统主要需以下 4 个算法的支持页表虚拟地址变换机构、段表虚拟地址变换机构、LRU 页面置换算法和进程随机初始化分配内存算法。4.2.1 页表虚拟地址变换机构请求分页系统中的地址变换机构是在分页系统地址变换机构的基础上为实现虚拟存储器再增加了某些功能所形成的如产生和处理缺页中断以及从内存中换出一页的功能等等[2]。图 4.2.1.1 示出了请求分页系统中的地址变换过程。在进行地址变换时首先检索快表试图从中找出所要访问的页。若找到便修改页表项中的访问位供置换算法选换出页面时参考。对于写指令还须将修改位置成“1”表示该页在调入内存后己被修改。然后利用页表项中给出的物理块号和页内地址形成物理地址。地址变换过程到此结束。如果在快表中未找到该页的页表项则应到内存中去查找页表再从找到的页表项中的状态位 Р 来了解该页是否已调入内存。若该页已调入内存这时应将该页的页表项写入快表。当快表已满时则应先调出按某种算法所确定的页的页表项然后再写入该页的页表项;若该页尚未调入内存这时应产生缺页中断请求 OS 从外存把该页调入内存。4.2.2 段表虚拟地址变换机构在请求分段系统中采用的是请求调段策略[2]。每当发现运行进程所要访问的段尚未调入内存时便由缺段中断机构产生一缺段中断信号进入 OS 后由缺段中断处理程序将所需的段调入内存。与缺页中断机构类似缺段中断机构同样需要在一条指令的执行期间产生和处理中断以及在一条指令执行期间可能产生多次缺段中断。但由于分段是信息的逻辑单位因而不可能出现一条指令被分割在两个分段中和一组信息被分割在两个分段中的情况。缺段中断的处理过程如图 4.2.2.1 所示。由于段不是定长的这使对缺段中断的处理要比对缺页中断的处理复杂。4.2.3 LRU 页面置换算法本设计采用 LRU 作为页面置换算法。最近最久未使用(LRU)的页面置换算法是根据页面调入内存后的使用情况做出决策的[2]。由于无法预测各页面将来的使用情况只能利用“最近的过去”作为“最近的将来”的近似故 LRU 置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段用来记录一个页面自上次被访问以来所经历的时间 t。当需淘汰一个页面时选择现有页面中其 t 值最大的即最近最久未使用的页面予以淘汰。LRU 算法的流程图如图 4.2.3.1 所示。本设计的程序实现是接下来的介绍重点。5、程序实现C 是一种通用的程式语言广泛用于系统软件与应用软件的开发。于 1969 年至 1973 年间为了移植与开发 UNIX 作业系统由丹尼斯·里奇与肯·汤普逊以 B 语言为基础在贝尔实验室设计、开发出来[5]。C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点在程式设计中备受青睐成为最近25年使用最为广泛的编程语言[6]。目前C语言编译器普遍存在于各种不同的操作系统中例如Microsoft Windows、macOS、Linux、Unix等。C语言的设计影响了众多后来的程式语言例如C、Objective-C、Java、C#等。为了使程序更符合现代的 OS 代码标准本设计选择 C 语言作为虚拟段页式系统的编写语言。5.1 主要数据结构如 4.1.1 节所述本设计根据不同内存留驻模型与状态信息创建相应的数据结构进行存储管理涉及的主要模型有页表结构、段表结构、进程信息与内存块信息依据 3.1、4.1、4.2 节所述的基本原理使用 C 语言设计实现的数据结构如下typedef struct Page //页结构 { int ID; //页号 char in_out; //是否在内存 int pageOffset; //页内偏移 int block_num; //对应块号 int time; //在内存的时间 int Process_ID; //所属进程ID char name[10]; //所属进程名 int Segment_ID; //所属进程段号 struct Page* next; } Pa, * PaNode; typedef struct Segment //段结构 { int ID; //段号 Page* page; //段中的页结构 int size; //段大小 char in_out; //是否在内存中 struct Segment* next; } Seg, * SegNode; typedef struct PCB //进程信息 { Segment* segm; //进程段信息 int total_segmet;//段总数 int ID; //进程ID char name[10]; //进程名 struct PCB* next; } PCB, * pcb; typedef struct Memory//内存块信息 { int ID;//页框号 char allocated;//标记是否已分配 int block_size;//页框大小 int Process_ID; //占用进程ID char name[10]; //占用进程名 int Segment_ID; //占用进程段号 int Page_ID; //占用进程的页号 int time_in_memory;//页在内存中的时间 int recently;//最近访问的时间 struct Memory* next; }*memory;可以看出页表、段表、进程信息与内存块信息数据结构的设置在符合上文所述基本原理的同时兼顾了编程实现的便捷与效率。本设计使用单链表作为信息存储的基本单元极大地方便了对内存空间的频繁开辟与回收。值得一提的是本设计借助 Qt 开发了虚拟式段页系统的可视化 UI 界面。Qt 是一个跨平台个 C 应用程序开发框架[7]。广泛用于开发 GUI 程序某种情况下又被称为部件工具箱。也可用于开发非 GUI 程序比如控制台工具搭服务器[8]。信号与槽Signal Slot是 Qt 编程的基础也是 Qt 的一大创新。因为有了信号与槽的编程机制在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。信号Signal就是在特定情况下被发射的事件例如 PushButton 最常见的信号就是鼠标单击时发射的 clicked()信号一个 ComboBox 最常见的信号是选择的列表项变化时发射的 CurrentIndexChanged()信号。GUI 程序设计的主要内容就是对界面上各组件的信号的响应只需要知道什么情况下发射哪些信号合理地去响应和处理这些信号就可以了。槽Slot就是对信号响应的函数。槽就是一个函数与一般的 C 函数是一样的可以定义在类的任何部分public、private 或 protected可以具有任何参数也可以被直接调用。槽函数与一般的函数不同的是槽函数可以与一个信号关联当信号被发射时关联的槽函数被自动执行。本设计构建 GUI 程序所使用的类如下所示内存管理的各个模块不再罗列class ProcessUnit { public: QString name; int totalSeg; QStringList segSizeList; }; class MemUnit { public: QString name; int pid; int seg_id; int page_id; int block_id; }; class SegUnit { public: int ID; int size; QString in_out; }; class PageUnit { public: int ID; int pageOffset; int block_num; QString in_out; }; class QShowEvent; class MemInitWindow : public QDialog { Q_OBJECT public: MemInitWindow(QWidget *pParent NULL); virtual ~MemInitWindow(); public: void Enter(); void Exit(); private: void Init(); void InitUI(); void InitConnections(); void LoadData(); void CreateProcessList(); void UpdateTable(); public slots: void OnCreatePS(); void OnMemMng(); void OnSegNum(); private: Ui::MemInitWindow m_ui; vectorProcessUnit m_processList; };本设计构建 GUI 程序所使用的名称空间如下所示class QComboBox; class QLineEdit; class QPushButton; class QLabel; class QTextEdit; class QCheckBox; class QRadioButton; class QSpinBox; class QTableWidget; namespace UIQuery { void SetComboboxValue(QComboBox * pWidget,QString value,QStringList range,int defaultValue); QString GetValue(QComboBox * pWidget); QString GetValue(QLineEdit * pWidget); QString GetValue(QPushButton * pWidget); QString GetValue(QLabel * pWidget); QString GetValue(QTextEdit * pWidget); int GetValue(QSpinBox * pWidget); bool GetValue(QCheckBox * pWidget); bool GetValue(QRadioButton * pWidget); void SetValue(QCheckBox * pWidget,bool state); void SetValue(QLineEdit * pWidget,QString value); void SetValue(QRadioButton * pWidget,bool state); void SetValue(QComboBox * pWidget,std::vectorstd::string valList); void SetValue(QComboBox * pWidget,QStringList valList); void SetValue(QTextEdit * pWidget,QString value); void SetValue(QLabel * pWidget,QString value); void SetValue(QSpinBox * pWidget,int value); void InitTableOption(QTableWidget* pTable); void Alert(QString msg); bool VerifyEmpty(QString input,QString tip); void AppendText(QTextEdit* pTextEdit,const QString qsrText, QColor c); }本设计构建 GUI 程序所使用的信号槽如下所示class QShowEvent; class MemoryWindow : public QDialog { Q_OBJECT public: MemoryWindow(QWidget *pParent NULL); virtual ~MemoryWindow(); public: void Enter(); void Exit(); private: void Init(); void InitUI(); void InitConnections(); void LoadData(); void Apply(ProcessUnit ps); void Recycle(int ID); void PrintProcessSegment(int j); QString InterruptHanding(int id, int i, int j); public slots: void OnCreatePS(); void OnRecyle(); void OnQueryPSInfo(); void OnPrintMemory(); void AddressExchange(); void OnViewPageInfo(QTableWidgetItem *); void OnSegNum(); protected: void showEvent(QShowEvent *event); private: Ui::MemoryWindow m_ui; vectorSegUnit m_segList; mapint,vectorPageUnit m_blockMap; };上述 GUI 程序中的方法与变量名大都见名知意再次便不作过多赘述。5.2 主要程序清单5.2.1 核心程序下面描述本设计所构建的虚拟段页式系统的核心程序。本设计的编码工作并不复杂代码量较小故为了方便各个函数间的参数传递本设计在代码中使用了 8 个全局变量以此作为系统状态的监控标志与信息共享接口。这些全局变量如下所示int Register;//段表的起始地址 int Flash; //内存大小 int BLOCK;//页框大小 int remained;//剩余的内存 pcb process; //申明一个进程链表 int total_process 0;//进程总数 memory memory_info;//申明一个记录内存信息的链表 int InterruptType -1;//中断类型,1表示缺段中断0表示缺页中断这 8 个全局变量在内存替换中起到了重要作用接下来做概要介绍。虚拟页表与虚拟段表它们的核心都在于内存申请与置换当用户所需要的内存不在内存中时程序应当根据预置的算法自动进行页/段表置换。本设计用于实现内存申请和置换的模块是异常处理模块该模块涉及的主要局部变量如下所示char name[10];//置换出来的进程名 int ID;//置换出来的进程ID int segment_ID;//置换出来的段号ID int page_ID;//置换出来的页号 int enough 0;//标记内存空间是否足够 int min; int address; PCB* p; Seg* s; Pa* q; Memory* mer, * temp;程序首先根据全局变量 InterruptType 判断是否发生中断以及中断类型默认值为-11 表示缺段中断0 表示缺页中断。而后将下一个进程的地址赋值給局部变量 p通过 while 循环找到发生中断的进程将下一个段表的地址赋值給局部变量 s通过 while 循环找到发生中断的段表将该段置于内存中的标志设置为真将下一个页表的地址赋值給局部变量 q通过 while 循环找到发生中断的页表。若发生了缺段中断在将发生中断的页表调入内存前预先判断剩余的内存是否足够若没有足够的内存空间用 LRU 法进行段表置换。在实现 LRU 算法时必须修改当前进程、段表和页表的相关属性以及修改最近最久未使用页面保证时空一致性内存中所有页的时间均加 1修改进程链表。处理缺页中断的方法类似。介绍核心函数后接下来給出本设计所构建虚拟段页式系统的控制台程序与 GUI 程序的界面转换图。5.2.2 函数清单与类图如表 5.2.2.1 所示为控制台程序的函数清单。函数名参数返回值作用CreateSegment无void创建段表空间CreateMemory无void创建页表空间CreateProcess无void建立进程信息InitPage页表结构地址 PaNode* pvoid初始化页表空间InitSegment段表结构地址 SegNode* svoid初始化段表空间InitProcess进程地址 pcb* provoid初始化进程ApplyMemory无void随机初始化分配内存AddressExchange无void虚拟地址向物理地址转换InterruptHanding进程号 id页表号 i段表号 jvoid缺段/页中断异常处理Apply无void手动申请内存Recycle无void回收内存如图 5.2.2.1 所示为 GUI 程序的界面转换图。6、程序运行的主要界面和结果截图本节主要展示本设计所构建虚拟段页式系统的运行情况。6.1 控制台程序的运行情况如图 5.2.2.1 所示为使用控制台程序输入初始化参数。如图 5.2.2.2 所示为控制台程序菜单。如图 5.2.2.3 所示为控制台程序显示内存信息。如图 5.2.2.4 所示为控制台程序显示进程页表信息。如图 5.2.2.5 所示为使用控制台程序进行虚拟地址至物理地址的转换。如图 5.2.2.6 所示为使用控制台程序引发缺页中断。如图 5.2.2.7 所示为使用控制台程序引发缺段中断。6.2 GUI 程序的运行情况如图 6.2.1 所示为 GUI 程序的开始界面出于用户友好考虑输入框内置了 4 个输入参数。如图 6.2.2 所示为使用 GUI 程序输入有关参数建立段表与页表。如图 6.2.3 所示为使用 GUI 程序输入有关参数建立段表与页表。如图 6.2.4 所示为使用 GUI 程序查询段表信息。如图 6.2.5 所示为使用 GUI 程序查询段表与页表信息。如图 6.2.6 所示为使用 GUI 程序查询内存分配信息。如图 6.2.7 所示为使用 GUI 程序查询物理地址且成功。如图 6.2.8 所示为使用 GUI 程序查询物理地址但发生了缺页中断。如图 6.2.9 所示为使用 GUI 程序查询物理地址但发生了缺段中断。7、总结和感想体会本次设计让我加深了对虚拟段页式系统以及 OS 内存管理方式的理解虚拟存储器作为现代操作系统中存储器管理的一项重要技术实现了内存扩充功能。但该功能并非是从物理上实际地扩大内存的容量而是从逻辑上实现对内存容量的扩充让用户所感觉到的内存容量比实际内存容量大得多。于是便可以让比内存空间更大的程序运行或者让更多的用户程序并发运行。这样既满足了用户的需要又改善了系统的性能。在完成设计的过程中我也锻炼了自己的逻辑思考与运用所学知识解决实际问题的能力当然我的编程能力也得到了提高。电子计算机从 1945 年诞生发展到今天经历了 75 个春秋期间出现了无数的名家大师提出了很多划时代的思想与方法极大地推动了计算机的发展使其与人们的生产生活交织互印、深度融合影响了人类文明的历史进程。没有哪一门现代学科像计算机这样发展迅猛至今仍保持着旺盛的生命力虚拟存储可谓是计算机历史上浓墨重彩的一笔正所谓“万物皆可虚拟”虚拟存储器的作用简单罗列如下简化链接。独立的地址空间允许每个进程的存储器映像使用相同的基本格式而不管代码和数据实际存放在物理存储器的何处。简化加载。虚拟存储器使得容易向存储器中加载可执行文件和共享文件对象。加载器从不实际从磁盘拷贝任何数据到存储器虚拟存储器系统会按照需要自动地调入数据页。简化共享。一般而言每个进程都拥有自己的独立地址空间这是操作系统通过创建页表将相应的虚拟页映射到不同的物理页来实现的。但需要进程共享代码和数据时如操作系统内核代码标准库函数等只需将不同进程中适当的虚拟页面映射到相同的物理页面再安排多个进程共享这部分代码的一个拷贝而不是在每个进程中都包括单独的内核和标准库的拷贝。简化存储器分配。虚拟存储器为用户进程提供了一个简单的分配额外存储器的机制。参考文献田卫东李琳刘晓平孙晓罗月童周红鹃. 系统软件综合设计指导书——操作系统分册第三版[M]. 合肥合肥工业大学 2018.汤小丹梁红兵哲凤屏汤子瀛. 计算机操作系统第四版[M]. 西安西安电子科技大学出版社2014.https://blog.csdn.net/Bob__yuan/article/details/102584606https://www.cnblogs.com/xumaomao/p/12864406.htmlhttps://zh.wikipedia.org/zh-hans/C语言TIOBE Programming Community Index [TIOBE 编程社区指数]. 2012[2012-11-03]英语.https://wuu.wikipedia.org/wiki/Qt附录1 Windows 10 使用 g 生成静态库文件与动态库文件如图 1 所示在 Windows 控制台 cmd 使用如下命令生成静态库文件与动态库文件g utilities.cpp -shared -o utilities.dll -Wl,--out-implib,utilities.lib图 1如图 2 所示在 Windows 控制台 cmd 使用如下命令将测试程序与图 1 所生成的静态库文件与动态库文件链接得到完整的可执行文件g segmented_Paging_virtual_memory_OS.cpp utilities.lib -o segmented_Paging_virtual_memory_OS.exe图 2如图 3 所示在 Windows 控制台 cmd 执行图 2 所得可执行程序。图 3♻️ 资源大小6.38MB➡️资源下载https://download.csdn.net/download/s1t16/87415925注更多内容可关注微信公众号【神仙别闹】如当前文章或代码侵犯了您的权益请私信作者删除

更多文章