├── OS_UI ├── DisplayOption.cpp ├── 界面流行图.vsdx ├── main.cpp ├── MemTool.pro ├── DisplayOption.h ├── MemInitWindow.h ├── MemoryWindow.h ├── KWidgetUtils.h ├── define.h ├── KWidgetUtils.cpp ├── MemInitWindow.cpp ├── utilities.cpp ├── MemInitWindow.ui ├── ui_MemInitWindow.h ├── MemoryWindow.ui ├── MemoryWindow_1.ui ├── ui_MemoryWindow.h └── MemoryWindow.cpp ├── OS_CMD ├── problem.PNG ├── MemoryWindow_2.cpp ├── command.txt ├── define.h ├── segmented_Paging_virtual_memory_OS.cpp └── utilities.cpp ├── document_report ├── 类图.vsdx ├── 函数清单.xlsx ├── 数据结构.xlsx ├── LRU算法.vsdx ├── 段页式系统结构.xlsx ├── 请求分页系统.xlsx ├── 操作系统网站-使用说明.docx ├── 段页式系统地址变换机构.vsdx ├── 请求分页中的地址变换过程.vsdx ├── 请求分段系统的地址变换过程.vsdx ├── 系统软件综合设计报告-操作系统分册-标准格式.doc ├── 《系统软件综合设计指导书-操作系统分册》-2018.pdf ├── 系统软件综合设计报告-OS-物2-2017218007-文华.pdf ├── 系统软件综合设计报告-操作系统分册_2017218007文华.docx ├── 格式.txt ├── 参考文献.txt ├── 提交通知-宣城.txt └── 原来的README.md ├── picture ├── flowchart │ ├── 命令1.PNG │ ├── 命令2.PNG │ ├── LRU算法.png │ ├── 执行失败.PNG │ ├── 段页式系统结构.png │ ├── GUI程序界面转换.png │ ├── 段页式系统地址变换机构.png │ ├── 请求分段系统的地址变换过程.png │ └── 请求分页中的地址变换过程.png └── screenshot │ ├── jt_1.PNG │ ├── jt_10.PNG │ ├── jt_11.PNG │ ├── jt_12.PNG │ ├── jt_13.PNG │ ├── jt_14.PNG │ ├── jt_15.PNG │ ├── jt_16.PNG │ ├── jt_17.png │ ├── jt_2.PNG │ ├── jt_3.PNG │ ├── jt_4.PNG │ ├── jt_5.PNG │ ├── jt_6.PNG │ ├── jt_7.PNG │ ├── jt_8.PNG │ └── jt_9.PNG ├── .gitignore ├── LICENSE └── README.md /OS_UI/DisplayOption.cpp: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /OS_CMD/problem.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/OS_CMD/problem.PNG -------------------------------------------------------------------------------- /OS_UI/界面流行图.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/OS_UI/界面流行图.vsdx -------------------------------------------------------------------------------- /document_report/类图.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/类图.vsdx -------------------------------------------------------------------------------- /OS_CMD/MemoryWindow_2.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/OS_CMD/MemoryWindow_2.cpp -------------------------------------------------------------------------------- /document_report/函数清单.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/函数清单.xlsx -------------------------------------------------------------------------------- /document_report/数据结构.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/数据结构.xlsx -------------------------------------------------------------------------------- /picture/flowchart/命令1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/flowchart/命令1.PNG -------------------------------------------------------------------------------- /picture/flowchart/命令2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/flowchart/命令2.PNG -------------------------------------------------------------------------------- /document_report/LRU算法.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/LRU算法.vsdx -------------------------------------------------------------------------------- /document_report/段页式系统结构.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/段页式系统结构.xlsx -------------------------------------------------------------------------------- /document_report/请求分页系统.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/请求分页系统.xlsx -------------------------------------------------------------------------------- /picture/flowchart/LRU算法.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/flowchart/LRU算法.png -------------------------------------------------------------------------------- /picture/flowchart/执行失败.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/flowchart/执行失败.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_1.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_10.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_10.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_11.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_11.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_12.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_12.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_13.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_13.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_14.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_14.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_15.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_15.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_16.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_16.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_17.png -------------------------------------------------------------------------------- /picture/screenshot/jt_2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_2.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_3.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_4.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_4.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_5.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_5.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_6.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_6.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_7.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_7.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_8.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_8.PNG -------------------------------------------------------------------------------- /picture/screenshot/jt_9.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/screenshot/jt_9.PNG -------------------------------------------------------------------------------- /picture/flowchart/段页式系统结构.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/flowchart/段页式系统结构.png -------------------------------------------------------------------------------- /document_report/操作系统网站-使用说明.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/操作系统网站-使用说明.docx -------------------------------------------------------------------------------- /document_report/段页式系统地址变换机构.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/段页式系统地址变换机构.vsdx -------------------------------------------------------------------------------- /document_report/请求分页中的地址变换过程.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/请求分页中的地址变换过程.vsdx -------------------------------------------------------------------------------- /picture/flowchart/GUI程序界面转换.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/flowchart/GUI程序界面转换.png -------------------------------------------------------------------------------- /picture/flowchart/段页式系统地址变换机构.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/flowchart/段页式系统地址变换机构.png -------------------------------------------------------------------------------- /document_report/请求分段系统的地址变换过程.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/请求分段系统的地址变换过程.vsdx -------------------------------------------------------------------------------- /picture/flowchart/请求分段系统的地址变换过程.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/flowchart/请求分段系统的地址变换过程.png -------------------------------------------------------------------------------- /picture/flowchart/请求分页中的地址变换过程.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/picture/flowchart/请求分页中的地址变换过程.png -------------------------------------------------------------------------------- /document_report/系统软件综合设计报告-操作系统分册-标准格式.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/系统软件综合设计报告-操作系统分册-标准格式.doc -------------------------------------------------------------------------------- /document_report/《系统软件综合设计指导书-操作系统分册》-2018.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/《系统软件综合设计指导书-操作系统分册》-2018.pdf -------------------------------------------------------------------------------- /document_report/系统软件综合设计报告-OS-物2-2017218007-文华.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/系统软件综合设计报告-OS-物2-2017218007-文华.pdf -------------------------------------------------------------------------------- /document_report/系统软件综合设计报告-操作系统分册_2017218007文华.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/25th-engineer/HFUT_2020_OS_Design_WH/HEAD/document_report/系统软件综合设计报告-操作系统分册_2017218007文华.docx -------------------------------------------------------------------------------- /document_report/格式.txt: -------------------------------------------------------------------------------- 1 | 系统软件综合设计报告-OS-物2-2017218007-文华 2 | 3 | 系统软件综合设计源码-OS-物2-2017218007-文华 4 | 5 | 系统软件综合设计报告-Compiler-物2-2017218007-文华 6 | 7 | 系统软件综合设计源码-Compiler-物2-2017218007-文华 -------------------------------------------------------------------------------- /OS_UI/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "MemInitWindow.h" 3 | 4 | int main(int argc,char ** argv) 5 | { 6 | QApplication _a(argc,argv); 7 | MemInitWindow * p = new MemInitWindow(); 8 | p->Enter(); 9 | return _a.exec(); 10 | } 11 | 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | -------------------------------------------------------------------------------- /document_report/参考文献.txt: -------------------------------------------------------------------------------- 1 | [1]田卫东,李琳,刘晓平,孙晓,罗月童,周红鹃. 系统软件综合设计指导书——操作系统分册(第三版)[M]. 合肥:合肥工业大学, 2018. 2 | [2]汤小丹,梁红兵,哲凤屏,汤子瀛. 计算机操作系统(第四版)[M]. 西安:西安电子科技大学出版社,2014. 3 | [3]https://blog.csdn.net/Bob__yuan/article/details/102584606 4 | [4]https://www.cnblogs.com/xumaomao/p/12864406.html 5 | [5]https://zh.wikipedia.org/zh-hans/C%E8%AF%AD%E8%A8%80 6 | [6]TIOBE Programming Community Index [TIOBE编程社区指数]. 2012[2012-11-03](英语). 7 | [7]https://wuu.wikipedia.org/wiki/Qt -------------------------------------------------------------------------------- /OS_CMD/command.txt: -------------------------------------------------------------------------------- 1 | g++ utilities.cpp -shared -o utilities.dll -Wl,--out-implib,utilities.lib 2 | 其中 -shared 告诉g++ utilities.cpp 文件需要编译成动态链接库。-Wl 表示后面的内容是ld 的参数,需要传递给 ld。 3 | --out-implib,utilities.lib 表示让ld 生成一个名为 utilities.lib 的导入库。 4 | 5 | g++ segmented_Paging_virtual_memory_OS.cpp utilities.lib -o segmented_Paging_virtual_memory_OS2.exe 6 | 7 | g++ segmented_Paging_virtual_memory_OS.cpp -l utilities.dll utilities.lib -o segmented_Paging_virtual_memory_OS3.exe -------------------------------------------------------------------------------- /OS_UI/MemTool.pro: -------------------------------------------------------------------------------- 1 | #hand-generate-code 2 | QT += core gui 3 | TARGET = MemTool 4 | TEMPLATE = app 5 | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 6 | 7 | #LIBS += -L/usr/lib/mysql -lmysqlclient 8 | #INCLUDEPATH += /usr/include/mysql 9 | 10 | #auto-generate-code# 11 | 12 | HEADERS += \ 13 | define.h \ 14 | DisplayOption.h \ 15 | KWidgetUtils.h \ 16 | MemInitWindow.h \ 17 | MemoryWindow.h 18 | 19 | SOURCES += \ 20 | DisplayOption.cpp \ 21 | KWidgetUtils.cpp \ 22 | main.cpp \ 23 | MemInitWindow.cpp \ 24 | MemoryWindow.cpp \ 25 | utilities.cpp 26 | 27 | FORMS += \ 28 | MemInitWindow.ui \ 29 | MemoryWindow.ui -------------------------------------------------------------------------------- /OS_UI/DisplayOption.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | #include 5 | 6 | using namespace std; 7 | 8 | class ProcessUnit 9 | { 10 | public: 11 | QString name; 12 | int totalSeg; 13 | QStringList segSizeList; 14 | }; 15 | 16 | class MemUnit 17 | { 18 | public: 19 | QString name; 20 | int pid; 21 | int seg_id; 22 | int page_id; 23 | int block_id; 24 | }; 25 | 26 | class SegUnit 27 | { 28 | public: 29 | int ID; 30 | int size; 31 | QString in_out; 32 | }; 33 | 34 | class PageUnit 35 | { 36 | public: 37 | int ID; 38 | int pageOffset; 39 | int block_num; 40 | QString in_out; 41 | }; -------------------------------------------------------------------------------- /OS_UI/MemInitWindow.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include "ui_MemInitWindow.h" 6 | #include 7 | #include "DisplayOption.h" 8 | 9 | class QShowEvent; 10 | class MemInitWindow : public QDialog 11 | { 12 | Q_OBJECT 13 | public: 14 | MemInitWindow(QWidget *pParent = NULL); 15 | virtual ~MemInitWindow(); 16 | public: 17 | void Enter(); 18 | void Exit(); 19 | 20 | private: 21 | void Init(); 22 | void InitUI(); 23 | void InitConnections(); 24 | void LoadData(); 25 | void CreateProcessList(); 26 | void UpdateTable(); 27 | 28 | public slots: 29 | void OnCreatePS(); 30 | void OnMemMng(); 31 | void OnSegNum(); 32 | 33 | private: 34 | Ui::MemInitWindow m_ui; 35 | vector m_processList; 36 | }; 37 | -------------------------------------------------------------------------------- /document_report/提交通知-宣城.txt: -------------------------------------------------------------------------------- 1 | 各位同学,系统软件综合设计的电子存档文件提交方法如下: 2 | 3 | 1. 登陆系统 http://114.213.210.216:8080/DKTK/ ,密码已重置为学号 4 | 5 | 2. 在“报告-OS-2020-宣城”处,提交《系统软件综合设计报告-操作系统分册》 6 | 设计报告命名规范为: 7 | 系统软件综合设计报告-OS-计1-2017123456-张三.doc 8 | 9 | 3. 在“源码-OS-2020-宣城”处,提交系统软件综合设计报告-操作系统部分的完整源代码开发项目以及必要的说明文件 10 | 完整源代码开发环境打包文件的命名规范为: 11 | 系统软件综合设计源码-OS-计1-2017123456-张三.rar 12 | 13 | 4. 在“报告-Compiler-2020-宣城”处,提交《系统软件综合设计报告-编译原理分册》 14 | 设计报告命名规范为: 15 | 系统软件综合设计报告-Compiler-计1-2017123456-张三.doc 16 | 17 | 5. 在“源码-Compiler-2020-宣城”处,提交系统软件综合设计报告-编译原理部分的完整源代码 18 | 完整源代码文件的命名规范为: 19 | 系统软件综合设计源码-Compiler-计1-2017123456-张三.doc 20 | 21 | 提示: 22 | 1. 每个同学都需要提交; 23 | 24 | 2. 合作的两个同学,提交的项目代码打包文件,内容可以相同,但名称须是自己的名称,且报告也是自己的; 25 | 26 | 3. 注意提交时的文件尺寸小点好,开发项目一般比较大,可以通过删除中间文件(有些会隐藏)的方法缩小尺寸。 27 | 28 | 4.文件格式尽量为zip、rar、pdf,小于30M。 29 | 30 | 5.提交截止日期:2020-8-30 23:59 -------------------------------------------------------------------------------- /OS_UI/MemoryWindow.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include "ui_MemoryWindow.h" 6 | #include 7 | #include "DisplayOption.h" 8 | #include 9 | 10 | using namespace std; 11 | 12 | class QShowEvent; 13 | class MemoryWindow : public QDialog 14 | { 15 | Q_OBJECT 16 | public: 17 | MemoryWindow(QWidget *pParent = NULL); 18 | virtual ~MemoryWindow(); 19 | public: 20 | void Enter(); 21 | void Exit(); 22 | 23 | private: 24 | void Init(); 25 | void InitUI(); 26 | void InitConnections(); 27 | void LoadData(); 28 | void Apply(ProcessUnit ps); 29 | void Recycle(int ID); 30 | void PrintProcessSegment(int j); 31 | QString InterruptHanding(int id, int i, int j); 32 | 33 | public slots: 34 | void OnCreatePS(); 35 | void OnRecyle(); 36 | void OnQueryPSInfo(); 37 | void OnPrintMemory(); 38 | void AddressExchange(); 39 | void OnViewPageInfo(QTableWidgetItem *); 40 | void OnSegNum(); 41 | 42 | protected: 43 | void showEvent(QShowEvent *event); 44 | 45 | private: 46 | Ui::MemoryWindow m_ui; 47 | vector m_segList; 48 | map> m_blockMap; 49 | }; 50 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Utah Xef 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /OS_UI/KWidgetUtils.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | using namespace std; 9 | 10 | class QComboBox; 11 | class QLineEdit; 12 | class QPushButton; 13 | class QLabel; 14 | class QTextEdit; 15 | class QCheckBox; 16 | class QRadioButton; 17 | class QSpinBox; 18 | class QTableWidget; 19 | 20 | namespace UIQuery 21 | { 22 | void SetComboboxValue(QComboBox * pWidget,QString value,QStringList & range,int defaultValue); 23 | QString GetValue(QComboBox * pWidget); 24 | QString GetValue(QLineEdit * pWidget); 25 | QString GetValue(QPushButton * pWidget); 26 | QString GetValue(QLabel * pWidget); 27 | QString GetValue(QTextEdit * pWidget); 28 | int GetValue(QSpinBox * pWidget); 29 | bool GetValue(QCheckBox * pWidget); 30 | bool GetValue(QRadioButton * pWidget); 31 | 32 | void SetValue(QCheckBox * pWidget,bool state); 33 | void SetValue(QLineEdit * pWidget,QString value); 34 | void SetValue(QRadioButton * pWidget,bool state); 35 | void SetValue(QComboBox * pWidget,std::vector & valList); 36 | void SetValue(QComboBox * pWidget,QStringList & valList); 37 | void SetValue(QTextEdit * pWidget,QString value); 38 | void SetValue(QLabel * pWidget,QString value); 39 | void SetValue(QSpinBox * pWidget,int value); 40 | 41 | void InitTableOption(QTableWidget* pTable); 42 | 43 | void Alert(QString msg); 44 | bool VerifyEmpty(QString input,QString tip); 45 | 46 | void AppendText(QTextEdit* pTextEdit,const QString& qsrText, QColor c); 47 | } -------------------------------------------------------------------------------- /OS_UI/define.h: -------------------------------------------------------------------------------- 1 | /* 2 | 题目描述: 3 | 22. 段页式虚拟存储管理系统:建立一个段页虚拟存储管理系统的模型。(1-2 人,难度:4) 4 | 首先分配一片较大的内存空间和一段磁盘空间,作为程序运行的可用存储空间和外存兑换区; 5 | 建立应用程序的模型,包括分段结构在内; 6 | 建立进程的基本数据结构及相应算法; 7 | 建立管理存储空间的基本存储结构; 8 | 建立管理段页的基本数据结构与算法; 9 | 设计存储空间的分配与回收算法; 10 | 实现缺页中段支持的逻辑地址到物理地址转换,实现虚拟存储器; 11 | 提供信息转储功能,可将存储信息存入磁盘,也可从磁盘读入。 12 | */ 13 | 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | typedef struct Page //页结构 21 | { 22 | int ID; //页号 23 | char in_out; //是否在内存 24 | int pageOffset; //页内偏移 25 | int block_num; //对应块号 26 | int time; //在内存的时间 27 | int Process_ID; //所属进程ID 28 | char name[10]; //所属进程名 29 | int Segment_ID; //所属进程段号 30 | struct Page* next; 31 | }Pa, * PaNode; 32 | 33 | typedef struct Segment //段结构 34 | { 35 | int ID; //段号 36 | Page* page; //段中的页结构 37 | int size; //段大小 38 | char in_out; //是否在内存中 39 | struct Segment* next; 40 | }Seg, * SegNode; 41 | 42 | typedef struct PCB //进程信息 43 | { 44 | Segment* segm; //进程段信息 45 | int total_segmet;//段总数 46 | int ID; //进程ID 47 | char name[10]; //进程名 48 | struct PCB* next; 49 | }PCB, * pcb; 50 | 51 | typedef struct Memory//内存块信息 52 | { 53 | int ID;//页框号 54 | char allocated;//标记是否已分配 55 | int block_size;//页框大小 56 | int Process_ID; //占用进程ID 57 | char name[10]; //占用进程名 58 | int Segment_ID; //占用进程段号 59 | int Page_ID; //占用进程的页号 60 | int time_in_memory;//页在内存中的时间 61 | int recently;//最近访问的时间 62 | struct Memory* next; 63 | }*memory; 64 | 65 | //函数申明 66 | void CreateSegment(); 67 | void CreateMemory(int n1,int n2); 68 | void InitPage(PaNode* p); 69 | void InitSegment(SegNode* s); 70 | void InitProcess(pcb* pro); 71 | void ApplyMemory(); 72 | void AddressExchange(); 73 | void InterruptHanding(int id, int i, int j); 74 | void Apply(); 75 | void Recycle(); 76 | //函数声明 77 | void PrintMemory(); 78 | void PrintProcessSegment(); 79 | 80 | -------------------------------------------------------------------------------- /OS_CMD/define.h: -------------------------------------------------------------------------------- 1 | /* 2 | 题目描述: 3 | 22. 段页式虚拟存储管理系统:建立一个段页虚拟存储管理系统的模型。(1-2 人,难度:4) 4 | 首先分配一片较大的内存空间和一段磁盘空间,作为程序运行的可用存储空间和外存兑换区; 5 | 建立应用程序的模型,包括分段结构在内; 6 | 建立进程的基本数据结构及相应算法; 7 | 建立管理存储空间的基本存储结构; 8 | 建立管理段页的基本数据结构与算法; 9 | 设计存储空间的分配与回收算法; 10 | 实现缺页中段支持的逻辑地址到物理地址转换,实现虚拟存储器; 11 | 提供信息转储功能,可将存储信息存入磁盘,也可从磁盘读入。 12 | */ 13 | 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | typedef struct Page //页结构 21 | { 22 | int ID; //页号 23 | char in_out; //是否在内存 24 | int pageOffset; //页内偏移 25 | int block_num; //对应块号 26 | int time; //在内存的时间 27 | int Process_ID; //所属进程ID 28 | char name[10]; //所属进程名 29 | int Segment_ID; //所属进程段号 30 | struct Page* next; 31 | }Pa, * PaNode; 32 | 33 | typedef struct Segment //段结构 34 | { 35 | int ID; //段号 36 | Page* page; //段中的页结构 37 | int size; //段大小 38 | char in_out; //是否在内存中 39 | struct Segment* next; 40 | }Seg, * SegNode; 41 | 42 | typedef struct PCB //进程信息 43 | { 44 | Segment* segm; //进程段信息 45 | int total_segmet;//段总数 46 | int ID; //进程ID 47 | char name[10]; //进程名 48 | struct PCB* next; 49 | }PCB, * pcb; 50 | 51 | typedef struct Memory//内存块信息 52 | { 53 | int ID;//页框号 54 | char allocated;//标记是否已分配 55 | int block_size;//页框大小 56 | int Process_ID; //占用进程ID 57 | char name[10]; //占用进程名 58 | int Segment_ID; //占用进程段号 59 | int Page_ID; //占用进程的页号 60 | int time_in_memory;//页在内存中的时间 61 | int recently;//最近访问的时间 62 | struct Memory* next; 63 | }*memory; 64 | 65 | //函数申明 66 | void CreateSegment(); 67 | void CreateMemory(); 68 | void CreateProcess(); 69 | void InitPage(PaNode* p); 70 | void InitSegment(SegNode* s); 71 | void InitProcess(pcb* pro); 72 | void ApplyMemory(); 73 | void AddressExchange(); 74 | void InterruptHanding(int id, int i, int j); 75 | void Apply(); 76 | void Recycle(); 77 | 78 | int Register;//段表的起始地址 79 | int Flash; //内存大小 80 | int BLOCK;//页框大小 81 | int remained;//剩余的内存 82 | pcb process; //申明一个进程链表 83 | int total_process = 0;//进程总数 84 | memory memory_info;//申明一个记录内存信息的链表 85 | int InterruptType = -1;//中断类型,1表示缺段中断,0表示缺页中断 -------------------------------------------------------------------------------- /OS_CMD/segmented_Paging_virtual_memory_OS.cpp: -------------------------------------------------------------------------------- 1 | #include "define.h" 2 | //#include 3 | //#include "utilities.cpp" 4 | 5 | //函数声明 6 | void PrintMemory(); 7 | void PrintProcessSegment(); 8 | 9 | //打印进程段表信息 10 | void PrintProcessSegment() 11 | { 12 | int i, j; 13 | PCB* pro; 14 | Seg* p; 15 | Pa* s; 16 | pro = process->next; 17 | printf("\n请输入要显示的进程号信息:"); 18 | scanf("%d", &j); 19 | while (pro != NULL) 20 | { 21 | if (pro->ID == j) 22 | break; 23 | else 24 | pro = pro->next; 25 | } 26 | if (pro == NULL) 27 | printf("\nERROR\n"); 28 | else 29 | { 30 | p = pro->segm->next; 31 | printf("\n进程信息:\n"); 32 | printf("进程名:%s", pro->name); 33 | printf("\n进程号:%d\n\n", pro->ID); 34 | while (p != NULL) 35 | { 36 | s = p->page->next; 37 | printf("段号:%d\t段大小:%d\t是否在内存:%c\n", p->ID, p->size, p->in_out); 38 | printf("段内页表:\n"); 39 | for (i = 0; i < p->size / BLOCK; i++) 40 | { 41 | printf("页号:%d\t页内偏移:%d\t块号:%d\t是否存在内存:%c\n", s->ID, s->pageOffset, s->block_num, s->in_out); 42 | s = s->next; 43 | } 44 | printf("\n"); 45 | p = p->next; 46 | } 47 | } 48 | } 49 | 50 | //打印内存分配信息 51 | void PrintMemory() 52 | { 53 | int flag = 1; 54 | PCB* p; 55 | Seg* s; 56 | Memory* m; 57 | Pa* pag; 58 | p = process->next; 59 | m = memory_info->next; 60 | s = p->segm->next; 61 | pag = s->page->next; 62 | printf("\n内存大小为:%d", Flash); 63 | printf("\t总共分成了%d块,每块为:%d", Flash / BLOCK, BLOCK); 64 | printf("\n已分配的内存块情况为:"); 65 | while (m != NULL) 66 | { 67 | if (m->allocated == 'Y') 68 | { 69 | printf("\n进程名\t进程号\t进程段号\t页号\t块号\n"); 70 | printf("%s\t%d\t%d\t\t%d\t%d\n", m->name, m->Process_ID, m->Segment_ID, m->Page_ID, m->ID); 71 | m = m->next; 72 | } 73 | else 74 | m = m->next; 75 | } 76 | printf("\n共占用%d块内存块,剩余%d块.\n", (Flash - remained) / BLOCK, remained / BLOCK); 77 | } 78 | 79 | void test() 80 | { 81 | int flag = 1; 82 | int slect; 83 | CreateMemory(); 84 | InitProcess(&process); 85 | CreateProcess(); 86 | ApplyMemory(); 87 | system("cls"); 88 | while (flag) 89 | { 90 | printf("1.申请内存\n"); 91 | printf("2.回收内存\n"); 92 | printf("3.显示内存信息\n"); 93 | printf("4.显示进程页表信息\n"); 94 | printf("5.地址转换\n"); 95 | printf("6.退出\n"); 96 | printf("请选择:"); 97 | scanf("%d", &slect); 98 | switch (slect) 99 | { 100 | case 1: 101 | system("cls"); 102 | Apply(); 103 | break; 104 | case 2: 105 | system("cls"); 106 | Recycle(); 107 | break; 108 | case 3: 109 | system("cls"); 110 | PrintMemory(); 111 | break; 112 | case 4: 113 | system("cls"); 114 | PrintProcessSegment(); 115 | break; 116 | case 5: 117 | system("cls"); 118 | AddressExchange(); 119 | break; 120 | case 6: 121 | flag = 0; 122 | free(memory_info); 123 | free(process); 124 | break; 125 | default: 126 | printf("输入错误,请重新选择!\n"); 127 | break; 128 | } 129 | } 130 | 131 | } 132 | 133 | int main() 134 | { 135 | test(); 136 | return 0; 137 | } 138 | -------------------------------------------------------------------------------- /OS_UI/KWidgetUtils.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | namespace UIQuery 16 | { 17 | void SetComboboxValue(QComboBox * pWidget,QString value,QStringList & range,int defaultValue) 18 | { 19 | if ( range.contains(value) == true ) 20 | { 21 | pWidget->setCurrentText(value); 22 | } 23 | else 24 | { 25 | pWidget->setCurrentText(QString::number(defaultValue)); 26 | } 27 | } 28 | 29 | QString GetValue(QComboBox * pWidget) 30 | { 31 | if (pWidget != NULL) 32 | { 33 | return pWidget->currentText(); 34 | } 35 | return ""; 36 | } 37 | 38 | int GetValue(QSpinBox * pWidget) 39 | { 40 | if (pWidget != NULL) 41 | { 42 | return pWidget->value(); 43 | } 44 | return 0; 45 | } 46 | 47 | QString GetValue(QLineEdit * pWidget) 48 | { 49 | if (pWidget != NULL) 50 | { 51 | return pWidget->text(); 52 | } 53 | return ""; 54 | } 55 | 56 | QString GetValue(QPushButton * pWidget) 57 | { 58 | if (pWidget != NULL) 59 | { 60 | return pWidget->text(); 61 | } 62 | return ""; 63 | } 64 | 65 | QString GetValue(QLabel * pWidget) 66 | { 67 | if (pWidget != NULL) 68 | { 69 | return pWidget->text(); 70 | } 71 | return ""; 72 | } 73 | 74 | QString GetValue(QTextEdit * pWidget) 75 | { 76 | if (pWidget != NULL) 77 | { 78 | return pWidget->toPlainText(); 79 | } 80 | return ""; 81 | } 82 | 83 | bool GetValue(QCheckBox * pWidget) 84 | { 85 | if (pWidget != NULL) 86 | { 87 | return pWidget->isChecked(); 88 | } 89 | return false; 90 | } 91 | 92 | bool GetValue(QRadioButton * pWidget) 93 | { 94 | if (pWidget != NULL) 95 | { 96 | return pWidget->isChecked(); 97 | } 98 | return false; 99 | } 100 | 101 | void SetValue(QCheckBox * pWidget,bool state) 102 | { 103 | if (pWidget == NULL) 104 | { 105 | return; 106 | } 107 | pWidget->setCheckState( (state==true) ? (Qt::Checked) : (Qt::Unchecked) ); 108 | } 109 | 110 | void SetValue(QLineEdit * pWidget,QString value) 111 | { 112 | if (pWidget == NULL) 113 | { 114 | return; 115 | } 116 | pWidget->setText(value); 117 | } 118 | 119 | void SetValue(QLabel * pWidget,QString value) 120 | { 121 | if (pWidget == NULL) 122 | { 123 | return; 124 | } 125 | pWidget->setText(value); 126 | } 127 | 128 | void SetValue(QSpinBox * pWidget,int value) 129 | { 130 | if (pWidget == NULL) 131 | { 132 | return; 133 | } 134 | pWidget->setValue(value); 135 | } 136 | 137 | void SetValue(QRadioButton * pWidget,bool state) 138 | { 139 | if (pWidget == NULL) 140 | { 141 | return; 142 | } 143 | pWidget->setChecked(state); 144 | } 145 | 146 | void SetValue(QComboBox * pWidget,std::vector & valList) 147 | { 148 | if (pWidget == NULL) 149 | { 150 | return; 151 | } 152 | pWidget->clear(); 153 | for(auto val : valList) 154 | { 155 | pWidget->addItem(QString::fromStdString(val)); 156 | } 157 | } 158 | 159 | void SetValue(QComboBox * pWidget,QStringList & valList) 160 | { 161 | if (pWidget == NULL) 162 | { 163 | return; 164 | } 165 | pWidget->clear(); 166 | pWidget->addItems(valList); 167 | } 168 | 169 | void SetValue(QTextEdit * pWidget,QString value) 170 | { 171 | if (pWidget == NULL) 172 | { 173 | return; 174 | } 175 | pWidget->setPlainText(value); 176 | } 177 | 178 | void Alert(QString msg) 179 | { 180 | QMessageBox msgBox; 181 | msgBox.setText(msg); 182 | msgBox.exec(); 183 | } 184 | 185 | bool VerifyEmpty(QString input,QString tip) 186 | { 187 | if (input.trimmed().isEmpty()) 188 | { 189 | Alert(tip); 190 | return true; 191 | } 192 | return false; 193 | } 194 | 195 | void InitTableOption(QTableWidget* pTable) 196 | { 197 | pTable->setEditTriggers(QAbstractItemView::NoEditTriggers); 198 | pTable->horizontalHeader()->setSectionsMovable(false); 199 | pTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive); 200 | pTable->horizontalHeader()->setSectionsClickable(false); 201 | pTable->verticalScrollBar()->setContextMenuPolicy(Qt::NoContextMenu); 202 | pTable->horizontalScrollBar()->setContextMenuPolicy(Qt::NoContextMenu); 203 | pTable->setSelectionBehavior(QAbstractItemView::SelectRows); 204 | pTable->setSelectionMode(QAbstractItemView::SingleSelection); 205 | pTable->setDragDropMode(QAbstractItemView::NoDragDrop); 206 | } 207 | 208 | void AppendText(QTextEdit* pTextEdit,const QString& qsrText, QColor c) 209 | { 210 | if (pTextEdit == NULL) 211 | { 212 | return; 213 | } 214 | 215 | pTextEdit->setTextColor(c); 216 | pTextEdit->insertPlainText(qsrText.trimmed() + "\n"); 217 | pTextEdit->moveCursor(QTextCursor::End); 218 | QScrollBar* p_scrollbar = pTextEdit->verticalScrollBar(); 219 | p_scrollbar->setSliderPosition(p_scrollbar->maximum()); 220 | qApp->processEvents(QEventLoop::ExcludeUserInputEvents); 221 | } 222 | } 223 | 224 | -------------------------------------------------------------------------------- /OS_UI/MemInitWindow.cpp: -------------------------------------------------------------------------------- 1 | #include "MemInitWindow.h" 2 | #include 3 | #include 4 | #include 5 | #include "KWidgetUtils.h" 6 | #include "define.h" 7 | #include "MemoryWindow.h" 8 | using namespace std; 9 | 10 | extern pcb process; //申明一个进程链表 11 | extern int total_process;//进程总数 12 | extern int Flash; //内存大小 13 | extern int BLOCK;//页框大小 14 | 15 | MemInitWindow::MemInitWindow(QWidget *parent) 16 | : QDialog(parent) 17 | { 18 | m_ui.setupUi(this); 19 | Init(); 20 | } 21 | 22 | MemInitWindow::~MemInitWindow() 23 | { 24 | } 25 | 26 | void MemInitWindow::Init() 27 | { 28 | InitUI(); 29 | InitConnections(); 30 | } 31 | 32 | void MemInitWindow::InitUI() 33 | { 34 | } 35 | 36 | void MemInitWindow::InitConnections() 37 | { 38 | connect(m_ui.btnNewPS, SIGNAL(clicked()), this, SLOT(OnCreatePS())); 39 | connect(m_ui.btnMemMng, SIGNAL(clicked()), this, SLOT(OnMemMng())); 40 | connect(m_ui.btnInputSegNum, SIGNAL(clicked()), this, SLOT(OnSegNum())); 41 | } 42 | 43 | void MemInitWindow::LoadData() 44 | { 45 | UIQuery::SetValue(m_ui.lineEdit_memSize,"2048"); 46 | UIQuery::SetValue(m_ui.lineEdit_pageSize,"512"); 47 | 48 | UIQuery::SetValue(m_ui.lineEdit_ps_Name,"w"); 49 | UIQuery::SetValue(m_ui.lineEdit_ps_SegNum,"2"); 50 | } 51 | //OK 52 | void MemInitWindow::OnMemMng() 53 | { 54 | QString mem_size = UIQuery::GetValue(m_ui.lineEdit_memSize); 55 | QString block_size = UIQuery::GetValue(m_ui.lineEdit_pageSize); 56 | if (mem_size.trimmed() == "") 57 | { 58 | UIQuery::Alert("内存值不能为空!"); 59 | return; 60 | } 61 | if (mem_size.toInt()<0) 62 | { 63 | UIQuery::Alert("内存大小值必须大于0,请重新输入!"); 64 | return; 65 | } 66 | 67 | if (block_size.trimmed() == "") 68 | { 69 | UIQuery::Alert("请输入页框大小值!"); 70 | return; 71 | } 72 | if (block_size.toInt()<0) 73 | { 74 | UIQuery::Alert("页框大小值必须大于0,请重新输入"); 75 | return; 76 | } 77 | CreateMemory(mem_size.toInt(), block_size.toInt()); 78 | InitProcess(&process); 79 | CreateProcessList(); 80 | ApplyMemory(); 81 | 82 | MemoryWindow* p1 = new MemoryWindow(); 83 | p1->Enter(); 84 | close(); 85 | } 86 | 87 | void MemInitWindow::Enter() 88 | { 89 | show(); 90 | setFocus(); 91 | activateWindow(); 92 | LoadData(); 93 | } 94 | 95 | void MemInitWindow::Exit() 96 | { 97 | close(); 98 | } 99 | 100 | void MemInitWindow::OnSegNum() 101 | { 102 | int p_segNum = UIQuery::GetValue(m_ui.lineEdit_ps_SegNum).toInt(); 103 | m_ui.tableWidget_ps_Section->clearContents(); 104 | m_ui.tableWidget_ps_Section->setRowCount(p_segNum); 105 | for (int i=0;i setRowHeight(i, 32); 108 | m_ui.tableWidget_ps_Section->setItem(i, 0, new QTableWidgetItem("1")); 109 | } 110 | } 111 | 112 | void MemInitWindow::OnCreatePS() 113 | { 114 | ProcessUnit ps; 115 | ps.name = UIQuery::GetValue(m_ui.lineEdit_ps_Name); 116 | ps.totalSeg = UIQuery::GetValue(m_ui.lineEdit_ps_SegNum).toInt(); 117 | for (int i =0;iitem(i,0)->text().toInt(); 120 | ps.segSizeList << QString::number(sz); 121 | } 122 | m_processList.push_back(ps); 123 | 124 | UpdateTable(); 125 | //total_process = m_processList.size(); 126 | } 127 | 128 | void MemInitWindow::CreateProcessList()//建立进程信息 129 | { 130 | PCB* p, * s; 131 | Seg* m, * n; 132 | Pa* r, * t; 133 | p = process; 134 | int i, j, k; 135 | //printf("请输入进程总数:"); 136 | //scanf("%d", &total_process); 137 | total_process = m_processList.size(); 138 | for (i = 0; i < total_process; i++) 139 | { 140 | ProcessUnit ps = m_processList[i]; 141 | s = (PCB*)malloc(sizeof(PCB)); 142 | memcpy(s->name,ps.name.toStdString().c_str(),ps.name.size()); 143 | //printf("\n请输入第%d个进程名:", i + 1); 144 | //scanf("%s", s->name); 145 | s->ID = i; 146 | s->total_segmet = ps.totalSeg; 147 | //printf("\n请输入该进程的段总数:"); 148 | //scanf("%d", &s->total_segmet); 149 | InitSegment(&s->segm); 150 | n = s->segm; 151 | for (j = 0; j < s->total_segmet; j++) 152 | { 153 | m = (Seg*)malloc(sizeof(Seg)); 154 | m->size = ps.segSizeList[j].toInt(); 155 | //printf("\n请输入第%d个段的段大小: ", j + 1); 156 | //scanf("%d", &m->size); 157 | m->ID = j; 158 | m->in_out = 'N'; 159 | InitPage(&m->page); 160 | t = m->page; 161 | for (k = 0; k < m->size / BLOCK; k++) 162 | { 163 | r = (Pa*)malloc(sizeof(Pa)); 164 | r->block_num = -1; 165 | r->ID = k; 166 | r->in_out = 'N'; 167 | r->time = 0; 168 | r->pageOffset = 0; 169 | r->Process_ID = i; 170 | r->Segment_ID = j; 171 | strcpy(r->name, s->name); 172 | t->next = r; 173 | t = t->next; 174 | t->next = NULL; 175 | } 176 | n->next = m; 177 | n = n->next; 178 | n->next = NULL; 179 | } 180 | p->next = s; 181 | p = p->next; 182 | p->next = NULL; 183 | } 184 | 185 | } 186 | 187 | void MemInitWindow::UpdateTable() 188 | { 189 | int sz = m_processList.size(); 190 | m_ui.tableWidget_ps_list->clearContents(); 191 | m_ui.tableWidget_ps_list->setRowCount(sz); 192 | for (int i = 0;i < sz;++i) 193 | { 194 | m_ui.tableWidget_ps_list->setRowHeight(i, 32); 195 | m_ui.tableWidget_ps_list->setItem(i, 0, new QTableWidgetItem(m_processList[i].name)); 196 | m_ui.tableWidget_ps_list->setItem(i, 1, new QTableWidgetItem(QString::number(m_processList[i].totalSeg))); 197 | m_ui.tableWidget_ps_list->setItem(i, 2, new QTableWidgetItem(m_processList[i].segSizeList.join("-"))); 198 | } 199 | } 200 | -------------------------------------------------------------------------------- /OS_UI/utilities.cpp: -------------------------------------------------------------------------------- 1 | #include "define.h" 2 | 3 | /* 4 | extern int Register;//段表的起始地址 5 | extern int Flash; //内存大小 6 | extern int BLOCK;//页框大小 7 | extern int remained;//剩余的内存 8 | extern pcb process; //申明一个进程链表 9 | extern int total_process;//进程总数 10 | extern memory memory_info;//申明一个记录内存信息的链表 11 | extern int InterruptType;//中断类型,1表示缺段中断,0表示缺页中断 12 | */ 13 | 14 | int Register;//段表的起始地址 15 | int Flash; //内存大小 16 | int BLOCK;//页框大小 17 | int remained;//剩余的内存 18 | pcb process; //申明一个进程链表 19 | int total_process = 0;//进程总数 20 | memory memory_info;//申明一个记录内存信息的链表 21 | int InterruptType = -1;//中断类型,1表示缺段中断,0表示缺页中断 22 | 23 | 24 | //初始化 25 | void InitPage(PaNode* p) 26 | { 27 | *p = (PaNode)malloc(sizeof(Pa)); 28 | (*p)->next = NULL; 29 | } 30 | 31 | void InitSegment(SegNode* s) 32 | { 33 | *s = (SegNode)malloc(sizeof(Seg)); 34 | (*s)->next = NULL; 35 | } 36 | 37 | void InitProcess(pcb* pro) 38 | { 39 | *pro = (pcb)malloc(sizeof(PCB)); 40 | (*pro)->next = NULL; 41 | 42 | } 43 | 44 | void InitMemory(memory* m) 45 | { 46 | *m = (memory)malloc(sizeof(Memory)); 47 | (*m)->allocated = 'W'; 48 | (*m)->block_size = 0; 49 | (*m)->ID = -1; 50 | (*m)->next = NULL; 51 | } 52 | 53 | // 建立内存信息 54 | void CreateMemory(int nFlash, int nBlock) 55 | { 56 | InitMemory(&memory_info); 57 | Memory* m, * s; 58 | s = memory_info; 59 | int i; 60 | //printf("请输入内存大小:"); 61 | //scanf("%d", &); 62 | Flash = nFlash; 63 | remained = Flash; 64 | //printf("\n请输入页框大小:"); 65 | //scanf("%d", &BLOCK); 66 | BLOCK = nBlock; 67 | for (i = 0; i < Flash / BLOCK; i++) 68 | { 69 | m = (Memory*)malloc(sizeof(Memory)); 70 | m->ID = i; 71 | m->allocated = 'N'; 72 | m->block_size = BLOCK; 73 | m->time_in_memory = 0; 74 | m->recently = 0; 75 | s->next = m; 76 | s = s->next; 77 | s->next = NULL; 78 | } 79 | } 80 | 81 | //随机初始化分配进程到内存 82 | void ApplyMemory() 83 | { 84 | PCB* p; 85 | Seg* q; 86 | Pa* r; 87 | Memory* mer; 88 | mer = memory_info->next; 89 | p = process->next; 90 | srand((unsigned)time(NULL)); 91 | int tmp = 1; 92 | int flag; 93 | int m;//进程号 94 | int n;//段号 95 | int t;//页号 96 | int block_num;//内存块号 97 | for (int temp = 0; temp < Flash / BLOCK; temp++) 98 | { 99 | //随机产生一个进程号 100 | while (1) 101 | { 102 | flag = rand() % 100; 103 | if (total_process == 1)//只有一个进程 104 | { 105 | m = 0; 106 | break; 107 | } 108 | else if (flag >= 0 && flag <= total_process - 1) 109 | { 110 | m = flag; 111 | break; 112 | } 113 | else continue; 114 | } 115 | //找到那个进程 116 | while (p->ID != m) 117 | p = p->next; 118 | //随机产生一个段号 119 | while (1) 120 | { 121 | flag = rand() % 100; 122 | if (p->total_segmet == 1)//只有一个段 123 | { 124 | n = 0; 125 | break; 126 | } 127 | else if (flag >= 0 && flag <= p->total_segmet - 1) 128 | { 129 | n = flag; 130 | break; 131 | } 132 | else continue; 133 | } 134 | //找到那个段 135 | q = p->segm->next; 136 | while (q->ID != n) 137 | q = q->next; 138 | //随机产生一个页号 139 | while (1) 140 | { 141 | flag = rand(); 142 | if (flag >= 0 && flag <= q->size / BLOCK - 1) 143 | { 144 | t = flag; 145 | break; 146 | } 147 | else continue; 148 | } 149 | //找到那个页 150 | r = q->page->next; 151 | while (r->ID != t) 152 | r = r->next; 153 | while (1)//一直到产生一个没有分配的块 154 | { 155 | //随机产生一个内存块号 156 | while (1) 157 | { 158 | flag = rand() % 1000; 159 | if (flag >= 0 && flag <= Flash / BLOCK - 1) 160 | { 161 | block_num = flag; 162 | break; 163 | } 164 | else continue; 165 | } 166 | //找到那个内存块 167 | while (mer->ID != block_num) 168 | { 169 | if (mer == NULL) 170 | { 171 | tmp = 0; 172 | break; 173 | } 174 | else 175 | { 176 | tmp = 1; 177 | mer = mer->next; 178 | } 179 | } 180 | //判断内存块是否已经被占 181 | if (mer->allocated == 'Y') 182 | { 183 | mer = memory_info->next; 184 | continue; 185 | } 186 | else 187 | break; 188 | } 189 | if (tmp == 0) 190 | break; 191 | mer->allocated = 'Y'; 192 | q->in_out = 'Y'; 193 | r->block_num = block_num; 194 | r->pageOffset = r->ID + block_num; 195 | if (r->pageOffset >= Flash) 196 | r->pageOffset -= Flash; 197 | r->in_out = 'Y'; 198 | mer = memory_info->next; 199 | p = process->next; 200 | } 201 | //读取进程信息,修改内存信息,避免假分配 202 | p = process->next;//进程信息第一个节点 203 | mer = memory_info->next;//内存信息第一个节点 204 | q = p->segm->next;//段信息第一个节点 205 | while (mer != NULL) 206 | { 207 | mer->allocated = 'N'; 208 | mer = mer->next; 209 | } 210 | mer = memory_info->next; 211 | for (int j = 0; j < total_process; j++) 212 | { 213 | while (p != NULL) 214 | { 215 | if (p->ID == j) 216 | break; 217 | else 218 | p = p->next; 219 | } 220 | q = p->segm->next; 221 | while (q != NULL) 222 | { 223 | r = q->page->next; 224 | for (int i = 0; i < q->size / BLOCK; i++) 225 | { 226 | if (r->in_out == 'Y') 227 | { 228 | while (mer->ID != r->block_num) 229 | mer = mer->next; 230 | mer->allocated = 'Y'; 231 | mer->recently = 1; 232 | remained -= BLOCK; 233 | r->time += 1; 234 | mer->time_in_memory = r->time; 235 | mer->Process_ID = p->ID; 236 | mer->Segment_ID = q->ID; 237 | mer->Page_ID = r->ID; 238 | strcpy(mer->name, p->name); 239 | mer = memory_info->next; 240 | r = r->next; 241 | } 242 | else 243 | r = r->next; 244 | } 245 | q = q->next; 246 | } 247 | } 248 | } 249 | 250 | /* 251 | 对于某特定机器,其地址结构是一定的。若給定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址可按下式求得: 252 | P = INT[A/L] 253 | d = [A] MOD L 254 | */ 255 | -------------------------------------------------------------------------------- /document_report/原来的README.md: -------------------------------------------------------------------------------- 1 | # 合肥工业大学宣城校区2020年《操作系统》课程设计(《系统软件综合设计——操作系统》) 2 | ## 题目 3 |   段页式虚拟存储管理系统:建立一个段页虚拟存储管理系统的模型。(1-2 人,难度:4)
4 |   首先分配一片较大的内存空间和一段磁盘空间,作为程序运行的可用存储空间和外存兑换区;
5 |   •建立应用程序的模型,包括分段结构在内;
6 |   •建立进程的基本数据结构及相应算法;
7 |   •建立管理存储空间的基本存储结构;
8 |   •建立管理段页的基本数据结构与算法;
9 |   •设计存储空间的分配与回收算法;
10 |   •实现缺页中段支持的逻辑地址到物理地址转换,实现虚拟存储器;
11 |   •提供信息转储功能,可将存储信息存入磁盘,也可从磁盘读入。(这个功能没实现)
12 |
13 | 14 | ## 程序截图与流程图 15 | ### 程序截图 16 | #### 控制台程序的运行情况 17 |
18 | 21 |
22 |
图 1 控制台程序输入初始化参数
26 |
27 |
28 | 29 |
30 | 33 |
34 |
图 2 控制台程序菜单
38 |
39 |
40 | 41 |
42 | 45 |
46 |
图 3 控制台程序显示内存信息
50 |
51 |
52 | 53 |
54 | 57 |
58 |
图 4 控制台程序显示进程页表信息
62 |
63 |
64 | 65 |
66 | 69 |
70 |
图 5 控制台程序进行虚拟地址至物理地址的转换
74 |
75 |
76 | 77 |
78 | 81 |
82 |
图 6 控制台程序引发缺页中断
86 |
87 |
88 | 89 |
90 | 93 |
94 |
图 7 控制台程序引发缺段中断
98 |
99 |
100 | 101 | #### GUI程序的运行情况 102 |
103 | 106 |
107 |
图 8 GUI程序的开始界面
111 |
112 |
113 | 114 |
115 | 118 |
119 |
图 9 GUI程序输入有关参数建立段表与页表
123 |
124 |
125 | 126 |
127 | 130 |
131 |
图 10 GUI程序输入有关参数建立段表与页表
135 |
136 |
137 | 138 |
139 | 142 |
143 |
图 11 GUI程序查询段表信息
147 |
148 |
149 | 150 |
151 | 154 |
155 |
图 12 GUI程序查询段表与页表信息
159 |
160 |
161 | 162 |
163 | 166 |
167 |
图 13 GUI程序查询内存分配信息
171 |
172 |
173 | 174 |
175 | 178 |
179 |
图 14 GUI程序查询物理地址且成功
183 |
184 |
185 | 186 |
187 | 190 |
191 |
图 15 GUI程序查询物理地址发生缺页中断
195 |
196 |
197 | 198 |
199 | 202 |
203 |
图 16 GUI程序查询物理地址发生缺段中断
207 |
208 |
209 | 210 | ## 报告 211 |   [PDF版本](./document_report/系统软件综合设计报告-OS-物2-2017218007-文华.pdf) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 合肥工业大学宣城校区2020年《操作系统》课程设计(《系统软件综合设计——操作系统》) 4 | ## 题目 5 |   段页式虚拟存储管理系统:建立一个段页虚拟存储管理系统的模型。(1-2 人,难度:4)
6 |   首先分配一片较大的内存空间和一段磁盘空间,作为程序运行的可用存储空间和外存兑换区;
7 |   •建立应用程序的模型,包括分段结构在内;
8 |   •建立进程的基本数据结构及相应算法;
9 |   •建立管理存储空间的基本存储结构;
10 |   •建立管理段页的基本数据结构与算法;
11 |   •设计存储空间的分配与回收算法;
12 |   •实现缺页中段支持的逻辑地址到物理地址转换,实现虚拟存储器;
13 |   •提供信息转储功能,可将存储信息存入磁盘,也可从磁盘读入。(这个功能没实现)
14 |
15 | 16 | ## 程序截图与流程图 17 | ### 程序截图 18 | #### 控制台程序的运行情况 19 |
20 | 23 |
24 |
图 1 控制台程序输入初始化参数
28 |
29 |
30 | 31 |
32 | 35 |
36 |
图 2 控制台程序菜单
40 |
41 |
42 | 43 |
44 | 47 |
48 |
图 3 控制台程序显示内存信息
52 |
53 |
54 | 55 |
56 | 59 |
60 |
图 4 控制台程序显示进程页表信息
64 |
65 |
66 | 67 |
68 | 71 |
72 |
图 5 控制台程序进行虚拟地址至物理地址的转换
76 |
77 |
78 | 79 |
80 | 83 |
84 |
图 6 控制台程序引发缺页中断
88 |
89 |
90 | 91 |
92 | 95 |
96 |
图 7 控制台程序引发缺段中断
100 |
101 |
102 | 103 | #### GUI程序的运行情况 104 | 105 |
106 | 109 |
110 |
图 8 GUI程序的开始界面
114 |
115 |
116 | 117 |
118 | 121 |
122 |
图 9 GUI程序输入有关参数建立段表与页表
126 |
127 |
128 | 129 |
130 | 133 |
134 |
图 10 GUI程序输入有关参数建立段表与页表
138 |
139 |
140 | 141 |
142 | 145 |
146 |
图 11 GUI程序查询段表信息
150 |
151 |
152 | 153 |
154 | 157 |
158 |
图 12 GUI程序查询段表与页表信息
162 |
163 |
164 | 165 |
166 | 169 |
170 |
图 13 GUI程序查询内存分配信息
174 |
175 |
176 | 177 |
178 | 181 |
182 |
图 14 GUI程序查询物理地址且成功
186 |
187 |
188 | 189 |
190 | 193 |
194 |
图 15 GUI程序查询物理地址发生缺页中断
198 |
199 |
200 | 201 |
202 | 205 |
206 |
图 16 GUI程序查询物理地址发生缺段中断
210 |
211 |
212 | 213 | 214 | ### 流程图 215 |
216 | 219 |
220 |
图 17 段页式系统中的地址变换机构
224 |
225 |
226 | 227 |
228 | 231 |
232 |
图 18 请求分页中的地址变换过程
236 |
237 |
238 | 239 |
240 | 243 |
244 |
图 19 请求分段系统的地址变换过程
248 |
249 |
250 | 251 |
252 | 255 |
256 |
图 19 LRU算法流程
260 |
261 |
262 | 263 |
264 | 267 |
268 |
图 20 GUI程序界面转换
272 |
273 |
274 | 275 | ## 报告 276 |   [PDF版本](./document_report/系统软件综合设计报告-OS-物2-2017218007-文华.pdf) 277 | -------------------------------------------------------------------------------- /OS_UI/MemInitWindow.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MemInitWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 708 10 | 639 11 | 12 | 13 | 14 | 进程/内存创建 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 内存预设 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 请输入内存大小 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 100 39 | 16777215 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | Qt::Horizontal 48 | 49 | 50 | 51 | 258 52 | 20 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 请输入页框大小 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 100 69 | 16777215 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Qt::Horizontal 78 | 79 | 80 | 81 | 268 82 | 20 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 120 94 | 40 95 | 96 | 97 | 98 | 进入内存进程管理 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 进程预设 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 创建新进程 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 100 127 | 0 128 | 129 | 130 | 131 | 132 | 100 133 | 16777215 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 80 143 | 0 144 | 145 | 146 | 147 | 148 | 80 149 | 16777215 150 | 151 | 152 | 153 | 进程段总数 154 | 155 | 156 | Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 186 165 | 0 166 | 167 | 168 | 169 | 170 | 180 171 | 16777215 172 | 173 | 174 | 175 | 176 | 段大小 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 100 186 | 0 187 | 188 | 189 | 190 | 191 | 100 192 | 16777215 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 80 202 | 0 203 | 204 | 205 | 206 | 207 | 80 208 | 16777215 209 | 210 | 211 | 212 | 进程名 213 | 214 | 215 | Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 216 | 217 | 218 | 219 | 220 | 221 | 222 | 确认 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | Qt::Horizontal 232 | 233 | 234 | 235 | 40 236 | 20 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 450 246 | 0 247 | 248 | 249 | 250 | 251 | 进程名 252 | 253 | 254 | 255 | 256 | 进程段总数 257 | 258 | 259 | 260 | 261 | 进程段各大小 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | -------------------------------------------------------------------------------- /OS_UI/ui_MemInitWindow.h: -------------------------------------------------------------------------------- 1 | /******************************************************************************** 2 | ** Form generated from reading UI file 'MemInitWindow.ui' 3 | ** 4 | ** Created by: Qt User Interface Compiler version 5.4.0 5 | ** 6 | ** WARNING! All changes made in this file will be lost when recompiling UI file! 7 | ********************************************************************************/ 8 | 9 | #ifndef UI_MEMINITWINDOW_H 10 | #define UI_MEMINITWINDOW_H 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | 28 | QT_BEGIN_NAMESPACE 29 | 30 | class Ui_MemInitWindow 31 | { 32 | public: 33 | QGridLayout *gridLayout_5; 34 | QVBoxLayout *verticalLayout; 35 | QGroupBox *groupBox; 36 | QGridLayout *gridLayout_4; 37 | QGridLayout *gridLayout_3; 38 | QLabel *label; 39 | QLineEdit *lineEdit_memSize; 40 | QSpacerItem *horizontalSpacer_2; 41 | QLabel *label_2; 42 | QLineEdit *lineEdit_pageSize; 43 | QSpacerItem *horizontalSpacer_3; 44 | QPushButton *btnMemMng; 45 | QGroupBox *groupBox_2; 46 | QGridLayout *gridLayout_2; 47 | QHBoxLayout *horizontalLayout; 48 | QGridLayout *gridLayout; 49 | QPushButton *btnNewPS; 50 | QLineEdit *lineEdit_ps_SegNum; 51 | QLabel *label_4; 52 | QTableWidget *tableWidget_ps_Section; 53 | QLineEdit *lineEdit_ps_Name; 54 | QLabel *label_3; 55 | QPushButton *btnInputSegNum; 56 | QSpacerItem *horizontalSpacer; 57 | QTableWidget *tableWidget_ps_list; 58 | 59 | void setupUi(QWidget *MemInitWindow) 60 | { 61 | if (MemInitWindow->objectName().isEmpty()) 62 | MemInitWindow->setObjectName(QStringLiteral("MemInitWindow")); 63 | MemInitWindow->resize(708, 639); 64 | gridLayout_5 = new QGridLayout(MemInitWindow); 65 | gridLayout_5->setObjectName(QStringLiteral("gridLayout_5")); 66 | verticalLayout = new QVBoxLayout(); 67 | verticalLayout->setObjectName(QStringLiteral("verticalLayout")); 68 | groupBox = new QGroupBox(MemInitWindow); 69 | groupBox->setObjectName(QStringLiteral("groupBox")); 70 | gridLayout_4 = new QGridLayout(groupBox); 71 | gridLayout_4->setObjectName(QStringLiteral("gridLayout_4")); 72 | gridLayout_3 = new QGridLayout(); 73 | gridLayout_3->setObjectName(QStringLiteral("gridLayout_3")); 74 | label = new QLabel(groupBox); 75 | label->setObjectName(QStringLiteral("label")); 76 | 77 | gridLayout_3->addWidget(label, 0, 0, 1, 1); 78 | 79 | lineEdit_memSize = new QLineEdit(groupBox); 80 | lineEdit_memSize->setObjectName(QStringLiteral("lineEdit_memSize")); 81 | lineEdit_memSize->setMaximumSize(QSize(100, 16777215)); 82 | 83 | gridLayout_3->addWidget(lineEdit_memSize, 0, 1, 1, 1); 84 | 85 | horizontalSpacer_2 = new QSpacerItem(258, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); 86 | 87 | gridLayout_3->addItem(horizontalSpacer_2, 0, 2, 1, 1); 88 | 89 | label_2 = new QLabel(groupBox); 90 | label_2->setObjectName(QStringLiteral("label_2")); 91 | 92 | gridLayout_3->addWidget(label_2, 1, 0, 1, 1); 93 | 94 | lineEdit_pageSize = new QLineEdit(groupBox); 95 | lineEdit_pageSize->setObjectName(QStringLiteral("lineEdit_pageSize")); 96 | lineEdit_pageSize->setMaximumSize(QSize(100, 16777215)); 97 | 98 | gridLayout_3->addWidget(lineEdit_pageSize, 1, 1, 1, 1); 99 | 100 | horizontalSpacer_3 = new QSpacerItem(268, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); 101 | 102 | gridLayout_3->addItem(horizontalSpacer_3, 1, 2, 1, 1); 103 | 104 | 105 | gridLayout_4->addLayout(gridLayout_3, 0, 0, 1, 1); 106 | 107 | btnMemMng = new QPushButton(groupBox); 108 | btnMemMng->setObjectName(QStringLiteral("btnMemMng")); 109 | btnMemMng->setMinimumSize(QSize(120, 40)); 110 | 111 | gridLayout_4->addWidget(btnMemMng, 0, 1, 1, 1); 112 | 113 | 114 | verticalLayout->addWidget(groupBox); 115 | 116 | groupBox_2 = new QGroupBox(MemInitWindow); 117 | groupBox_2->setObjectName(QStringLiteral("groupBox_2")); 118 | gridLayout_2 = new QGridLayout(groupBox_2); 119 | gridLayout_2->setObjectName(QStringLiteral("gridLayout_2")); 120 | horizontalLayout = new QHBoxLayout(); 121 | horizontalLayout->setObjectName(QStringLiteral("horizontalLayout")); 122 | gridLayout = new QGridLayout(); 123 | gridLayout->setObjectName(QStringLiteral("gridLayout")); 124 | btnNewPS = new QPushButton(groupBox_2); 125 | btnNewPS->setObjectName(QStringLiteral("btnNewPS")); 126 | 127 | gridLayout->addWidget(btnNewPS, 4, 0, 1, 2); 128 | 129 | lineEdit_ps_SegNum = new QLineEdit(groupBox_2); 130 | lineEdit_ps_SegNum->setObjectName(QStringLiteral("lineEdit_ps_SegNum")); 131 | lineEdit_ps_SegNum->setMinimumSize(QSize(100, 0)); 132 | lineEdit_ps_SegNum->setMaximumSize(QSize(100, 16777215)); 133 | 134 | gridLayout->addWidget(lineEdit_ps_SegNum, 1, 1, 1, 1); 135 | 136 | label_4 = new QLabel(groupBox_2); 137 | label_4->setObjectName(QStringLiteral("label_4")); 138 | label_4->setMinimumSize(QSize(80, 0)); 139 | label_4->setMaximumSize(QSize(80, 16777215)); 140 | label_4->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); 141 | 142 | gridLayout->addWidget(label_4, 1, 0, 1, 1); 143 | 144 | tableWidget_ps_Section = new QTableWidget(groupBox_2); 145 | if (tableWidget_ps_Section->columnCount() < 1) 146 | tableWidget_ps_Section->setColumnCount(1); 147 | QTableWidgetItem *__qtablewidgetitem = new QTableWidgetItem(); 148 | tableWidget_ps_Section->setHorizontalHeaderItem(0, __qtablewidgetitem); 149 | tableWidget_ps_Section->setObjectName(QStringLiteral("tableWidget_ps_Section")); 150 | tableWidget_ps_Section->setMinimumSize(QSize(186, 0)); 151 | tableWidget_ps_Section->setMaximumSize(QSize(180, 16777215)); 152 | 153 | gridLayout->addWidget(tableWidget_ps_Section, 3, 0, 1, 2); 154 | 155 | lineEdit_ps_Name = new QLineEdit(groupBox_2); 156 | lineEdit_ps_Name->setObjectName(QStringLiteral("lineEdit_ps_Name")); 157 | lineEdit_ps_Name->setMinimumSize(QSize(100, 0)); 158 | lineEdit_ps_Name->setMaximumSize(QSize(100, 16777215)); 159 | 160 | gridLayout->addWidget(lineEdit_ps_Name, 0, 1, 1, 1); 161 | 162 | label_3 = new QLabel(groupBox_2); 163 | label_3->setObjectName(QStringLiteral("label_3")); 164 | label_3->setMinimumSize(QSize(80, 0)); 165 | label_3->setMaximumSize(QSize(80, 16777215)); 166 | label_3->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); 167 | 168 | gridLayout->addWidget(label_3, 0, 0, 1, 1); 169 | 170 | btnInputSegNum = new QPushButton(groupBox_2); 171 | btnInputSegNum->setObjectName(QStringLiteral("btnInputSegNum")); 172 | 173 | gridLayout->addWidget(btnInputSegNum, 2, 1, 1, 1); 174 | 175 | 176 | horizontalLayout->addLayout(gridLayout); 177 | 178 | horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); 179 | 180 | horizontalLayout->addItem(horizontalSpacer); 181 | 182 | tableWidget_ps_list = new QTableWidget(groupBox_2); 183 | if (tableWidget_ps_list->columnCount() < 3) 184 | tableWidget_ps_list->setColumnCount(3); 185 | QTableWidgetItem *__qtablewidgetitem1 = new QTableWidgetItem(); 186 | tableWidget_ps_list->setHorizontalHeaderItem(0, __qtablewidgetitem1); 187 | QTableWidgetItem *__qtablewidgetitem2 = new QTableWidgetItem(); 188 | tableWidget_ps_list->setHorizontalHeaderItem(1, __qtablewidgetitem2); 189 | QTableWidgetItem *__qtablewidgetitem3 = new QTableWidgetItem(); 190 | tableWidget_ps_list->setHorizontalHeaderItem(2, __qtablewidgetitem3); 191 | tableWidget_ps_list->setObjectName(QStringLiteral("tableWidget_ps_list")); 192 | tableWidget_ps_list->setMinimumSize(QSize(450, 0)); 193 | 194 | horizontalLayout->addWidget(tableWidget_ps_list); 195 | 196 | 197 | gridLayout_2->addLayout(horizontalLayout, 0, 0, 1, 1); 198 | 199 | 200 | verticalLayout->addWidget(groupBox_2); 201 | 202 | 203 | gridLayout_5->addLayout(verticalLayout, 0, 0, 1, 1); 204 | 205 | 206 | retranslateUi(MemInitWindow); 207 | 208 | QMetaObject::connectSlotsByName(MemInitWindow); 209 | } // setupUi 210 | 211 | void retranslateUi(QWidget *MemInitWindow) 212 | { 213 | MemInitWindow->setWindowTitle(QApplication::translate("MemInitWindow", "\350\277\233\347\250\213/\345\206\205\345\255\230\345\210\233\345\273\272", 0)); 214 | groupBox->setTitle(QApplication::translate("MemInitWindow", "\345\206\205\345\255\230\351\242\204\350\256\276", 0)); 215 | label->setText(QApplication::translate("MemInitWindow", "\350\257\267\350\276\223\345\205\245\345\206\205\345\255\230\345\244\247\345\260\217", 0)); 216 | label_2->setText(QApplication::translate("MemInitWindow", "\350\257\267\350\276\223\345\205\245\351\241\265\346\241\206\345\244\247\345\260\217", 0)); 217 | btnMemMng->setText(QApplication::translate("MemInitWindow", "\350\277\233\345\205\245\345\206\205\345\255\230\350\277\233\347\250\213\347\256\241\347\220\206", 0)); 218 | groupBox_2->setTitle(QApplication::translate("MemInitWindow", "\350\277\233\347\250\213\351\242\204\350\256\276", 0)); 219 | btnNewPS->setText(QApplication::translate("MemInitWindow", "\345\210\233\345\273\272\346\226\260\350\277\233\347\250\213", 0)); 220 | label_4->setText(QApplication::translate("MemInitWindow", "\350\277\233\347\250\213\346\256\265\346\200\273\346\225\260", 0)); 221 | QTableWidgetItem *___qtablewidgetitem = tableWidget_ps_Section->horizontalHeaderItem(0); 222 | ___qtablewidgetitem->setText(QApplication::translate("MemInitWindow", "\346\256\265\345\244\247\345\260\217", 0)); 223 | label_3->setText(QApplication::translate("MemInitWindow", "\350\277\233\347\250\213\345\220\215", 0)); 224 | btnInputSegNum->setText(QApplication::translate("MemInitWindow", "\347\241\256\350\256\244", 0)); 225 | QTableWidgetItem *___qtablewidgetitem1 = tableWidget_ps_list->horizontalHeaderItem(0); 226 | ___qtablewidgetitem1->setText(QApplication::translate("MemInitWindow", "\350\277\233\347\250\213\345\220\215", 0)); 227 | QTableWidgetItem *___qtablewidgetitem2 = tableWidget_ps_list->horizontalHeaderItem(1); 228 | ___qtablewidgetitem2->setText(QApplication::translate("MemInitWindow", "\350\277\233\347\250\213\346\256\265\346\200\273\346\225\260", 0)); 229 | QTableWidgetItem *___qtablewidgetitem3 = tableWidget_ps_list->horizontalHeaderItem(2); 230 | ___qtablewidgetitem3->setText(QApplication::translate("MemInitWindow", "\350\277\233\347\250\213\346\256\265\345\220\204\345\244\247\345\260\217", 0)); 231 | } // retranslateUi 232 | 233 | }; 234 | 235 | namespace Ui { 236 | class MemInitWindow: public Ui_MemInitWindow {}; 237 | } // namespace Ui 238 | 239 | QT_END_NAMESPACE 240 | 241 | #endif // UI_MEMINITWINDOW_H 242 | -------------------------------------------------------------------------------- /OS_UI/MemoryWindow.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MemoryWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 780 10 | 641 11 | 12 | 13 | 14 | 内存-进程管理 15 | 16 | 17 | 18 | 19 | 20 | 2 21 | 22 | 23 | 24 | 申请内存 25 | 26 | 27 | 28 | 29 | 10 30 | 30 31 | 191 32 | 551 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 80 43 | 0 44 | 45 | 46 | 47 | 48 | 80 49 | 16777215 50 | 51 | 52 | 53 | 进程名 54 | 55 | 56 | Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 100 65 | 0 66 | 67 | 68 | 69 | 70 | 100 71 | 16777215 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 80 81 | 0 82 | 83 | 84 | 85 | 86 | 80 87 | 16777215 88 | 89 | 90 | 91 | 进程段总数 92 | 93 | 94 | Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 100 103 | 0 104 | 105 | 106 | 107 | 108 | 100 109 | 16777215 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 186 119 | 0 120 | 121 | 122 | 123 | 124 | 180 125 | 16777215 126 | 127 | 128 | 129 | 130 | 段大小 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 创建新进程 139 | 140 | 141 | 142 | 143 | 144 | 145 | 确认 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 回收内存 157 | 158 | 159 | 160 | 161 | 10 162 | 31 163 | 216 164 | 43 165 | 166 | 167 | 168 | 169 | 170 | 171 | 请输入进程号 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 执行 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 内存显示 191 | 192 | 193 | 194 | 195 | 10 196 | 20 197 | 731 198 | 561 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 内存大小 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | Qt::Horizontal 218 | 219 | 220 | 221 | 258 222 | 38 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 总块数 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 每块大小 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 16 254 | 75 255 | true 256 | 257 | 258 | 259 | 已分配内存块详情 260 | 261 | 262 | Qt::AlignCenter 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 进程名 271 | 272 | 273 | 274 | 275 | 进程号 276 | 277 | 278 | 279 | 280 | 进程段号 281 | 282 | 283 | 284 | 285 | 页号 286 | 287 | 288 | 289 | 290 | 块号 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 信息查询 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 200 307 | 0 308 | 309 | 310 | 311 | QLabel{color:blue;} 312 | 313 | 314 | 共占用 315 | 316 | 317 | Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 进程页表显示 327 | 328 | 329 | 330 | 331 | 390 332 | 10 333 | 351 334 | 71 335 | 336 | 337 | 338 | 进程信息 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 进程名 347 | 348 | 349 | 350 | 351 | 352 | 353 | 进程号 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 10 365 | 90 366 | 311 367 | 491 368 | 369 | 370 | 371 | 372 | 段号 373 | 374 | 375 | 376 | 377 | 段大小 378 | 379 | 380 | 381 | 382 | 是否在内存 383 | 384 | 385 | 386 | 387 | 388 | 389 | 330 390 | 90 391 | 411 392 | 491 393 | 394 | 395 | 396 | 397 | 页号 398 | 399 | 400 | 401 | 402 | 页内偏移 403 | 404 | 405 | 406 | 407 | 块号 408 | 409 | 410 | 411 | 412 | 是否存在内存 413 | 414 | 415 | 416 | 417 | 418 | 419 | 10 420 | 12 421 | 341 422 | 61 423 | 424 | 425 | 426 | 427 | 428 | 429 | 请输入要显示得进程号 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 查询 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 地址转换 449 | 450 | 451 | 452 | 453 | 11 454 | 21 455 | 731 456 | 571 457 | 458 | 459 | 460 | 461 | 462 | 463 | 请输入要显示得进程号 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 500 472 | 0 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 请输入段表起始地址 481 | 482 | 483 | 484 | 485 | 486 | 487 | 请输入段号 488 | 489 | 490 | 491 | 492 | 493 | 494 | 请输入页号 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 0 506 | 0 507 | 508 | 509 | 510 | 查询 511 | 512 | 513 | 514 | 515 | 516 | 517 | Qt::Vertical 518 | 519 | 520 | 521 | 208 522 | 278 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | -------------------------------------------------------------------------------- /OS_UI/MemoryWindow_1.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MemoryWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 780 10 | 641 11 | 12 | 13 | 14 | 内存-进程管理 15 | 16 | 17 | 18 | 19 | 20 | 2 21 | 22 | 23 | 24 | 申请内存 25 | 26 | 27 | 28 | 29 | 10 30 | 30 31 | 191 32 | 551 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 80 43 | 0 44 | 45 | 46 | 47 | 48 | 80 49 | 16777215 50 | 51 | 52 | 53 | 进程名 54 | 55 | 56 | Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 100 65 | 0 66 | 67 | 68 | 69 | 70 | 100 71 | 16777215 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 80 81 | 0 82 | 83 | 84 | 85 | 86 | 80 87 | 16777215 88 | 89 | 90 | 91 | 进程段总数 92 | 93 | 94 | Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 100 103 | 0 104 | 105 | 106 | 107 | 108 | 100 109 | 16777215 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 186 119 | 0 120 | 121 | 122 | 123 | 124 | 180 125 | 16777215 126 | 127 | 128 | 129 | 130 | 段大小 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 创建新进程 139 | 140 | 141 | 142 | 143 | 144 | 145 | 确认 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 回收内存 157 | 158 | 159 | 160 | 161 | 10 162 | 31 163 | 216 164 | 52 165 | 166 | 167 | 168 | 169 | 170 | 171 | 请输入进程号 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 执行 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 内存显示 191 | 192 | 193 | 194 | 195 | 10 196 | 20 197 | 731 198 | 561 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 内存大小 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | Qt::Horizontal 218 | 219 | 220 | 221 | 258 222 | 38 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 总块数 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 每块大小 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 16 254 | 75 255 | true 256 | 257 | 258 | 259 | 已分配内存块详情 260 | 261 | 262 | Qt::AlignCenter 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 进程名 271 | 272 | 273 | 274 | 275 | 进程号 276 | 277 | 278 | 279 | 280 | 进程段号 281 | 282 | 283 | 284 | 285 | 页号 286 | 287 | 288 | 289 | 290 | 块号 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | Qt::Horizontal 299 | 300 | 301 | 302 | 498 303 | 20 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 200 313 | 0 314 | 315 | 316 | 317 | QLabel{color:blue;} 318 | 319 | 320 | 共占用 321 | 322 | 323 | Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 324 | 325 | 326 | 327 | 328 | 329 | 330 | 信息查询 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 进程页表显示 340 | 341 | 342 | 343 | 344 | 390 345 | 10 346 | 351 347 | 71 348 | 349 | 350 | 351 | 进程信息 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 进程名 360 | 361 | 362 | 363 | 364 | 365 | 366 | 进程号 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 10 378 | 90 379 | 311 380 | 491 381 | 382 | 383 | 384 | 385 | 段号 386 | 387 | 388 | 389 | 390 | 段大小 391 | 392 | 393 | 394 | 395 | 是否在内存 396 | 397 | 398 | 399 | 400 | 401 | 402 | 330 403 | 90 404 | 411 405 | 491 406 | 407 | 408 | 409 | 410 | 页号 411 | 412 | 413 | 414 | 415 | 页内偏移 416 | 417 | 418 | 419 | 420 | 块号 421 | 422 | 423 | 424 | 425 | 是否存在内存 426 | 427 | 428 | 429 | 430 | 431 | 432 | 10 433 | 12 434 | 341 435 | 61 436 | 437 | 438 | 439 | 440 | 441 | 442 | 请输入要显示得进程号 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 查询 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 地址转换 462 | 463 | 464 | 465 | 466 | 11 467 | 21 468 | 731 469 | 571 470 | 471 | 472 | 473 | 474 | 475 | 476 | 请输入要显示得进程号 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 500 485 | 0 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 请输入段表起始地址 494 | 495 | 496 | 497 | 498 | 499 | 500 | 请输入段号 501 | 502 | 503 | 504 | 505 | 506 | 507 | 请输入页号 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 0 519 | 0 520 | 521 | 522 | 523 | 查询 524 | 525 | 526 | 527 | 528 | 529 | 530 | Qt::Vertical 531 | 532 | 533 | 534 | 208 535 | 278 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | -------------------------------------------------------------------------------- /OS_CMD/utilities.cpp: -------------------------------------------------------------------------------- 1 | #include "define.h" 2 | 3 | void CreateProcess()//建立进程信息 4 | { 5 | PCB* p, * s; 6 | Seg* m, * n; 7 | Pa* r, * t; 8 | p = process; 9 | int i, j, k; 10 | printf("请输入进程总数:"); 11 | scanf("%d", &total_process); 12 | for (i = 0; i < total_process; i++) 13 | { 14 | s = (PCB*)malloc(sizeof(PCB)); 15 | printf("\n请输入第%d个进程名:", i + 1); 16 | scanf("%s", s->name); 17 | s->ID = i; 18 | printf("\n请输入该进程的段总数:"); 19 | scanf("%d", &s->total_segmet); 20 | InitSegment(&s->segm); 21 | n = s->segm; 22 | for (j = 0; j < s->total_segmet; j++) 23 | { 24 | m = (Seg*)malloc(sizeof(Seg)); 25 | printf("\n请输入第%d个段的段大小: ", j + 1); 26 | scanf("%d", &m->size); 27 | m->ID = j; 28 | m->in_out = 'N'; 29 | InitPage(&m->page); 30 | t = m->page; 31 | for (k = 0; k < m->size / BLOCK; k++) 32 | { 33 | r = (Pa*)malloc(sizeof(Pa)); 34 | r->block_num = -1; 35 | r->ID = k; 36 | r->in_out = 'N'; 37 | r->time = 0; 38 | r->pageOffset = 0; 39 | r->Process_ID = i; 40 | r->Segment_ID = j; 41 | strcpy(r->name, s->name); 42 | t->next = r; 43 | t = t->next; 44 | t->next = NULL; 45 | } 46 | n->next = m; 47 | n = n->next; 48 | n->next = NULL; 49 | } 50 | p->next = s; 51 | p = p->next; 52 | p->next = NULL; 53 | } 54 | 55 | } 56 | //初始化 57 | void InitPage(PaNode* p) 58 | { 59 | *p = (PaNode)malloc(sizeof(Pa)); 60 | (*p)->next = NULL; 61 | } 62 | 63 | void InitSegment(SegNode* s) 64 | { 65 | *s = (SegNode)malloc(sizeof(Seg)); 66 | (*s)->next = NULL; 67 | } 68 | 69 | void InitProcess(pcb* pro) 70 | { 71 | *pro = (pcb)malloc(sizeof(PCB)); 72 | (*pro)->next = NULL; 73 | 74 | } 75 | 76 | void InitMemory(memory* m) 77 | { 78 | *m = (memory)malloc(sizeof(Memory)); 79 | (*m)->allocated = 'W'; 80 | (*m)->block_size = 0; 81 | (*m)->ID = -1; 82 | (*m)->next = NULL; 83 | } 84 | 85 | // 建立内存信息 86 | void CreateMemory() 87 | { 88 | InitMemory(&memory_info); 89 | Memory* m, * s; 90 | s = memory_info; 91 | int i; 92 | printf("请输入内存大小:"); 93 | scanf("%d", &Flash); 94 | remained = Flash; 95 | printf("\n请输入页框大小:"); 96 | scanf("%d", &BLOCK); 97 | for (i = 0; i < Flash / BLOCK; i++) 98 | { 99 | m = (Memory*)malloc(sizeof(Memory)); 100 | m->ID = i; 101 | m->allocated = 'N'; 102 | m->block_size = BLOCK; 103 | m->time_in_memory = 0; 104 | m->recently = 0; 105 | s->next = m; 106 | s = s->next; 107 | s->next = NULL; 108 | } 109 | } 110 | 111 | //随机初始化分配进程到内存 112 | void ApplyMemory() 113 | { 114 | PCB* p; 115 | Seg* q; 116 | Pa* r; 117 | Memory* mer; 118 | mer = memory_info->next; 119 | p = process->next; 120 | srand((unsigned)time(NULL)); 121 | int tmp = 1; 122 | int flag; 123 | int m;//进程号 124 | int n;//段号 125 | int t;//页号 126 | int block_num;//内存块号 127 | for (int temp = 0; temp < Flash / BLOCK; temp++) 128 | { 129 | //随机产生一个进程号 130 | while (1) 131 | { 132 | flag = rand() % 100; 133 | if (total_process == 1)//只有一个进程 134 | { 135 | m = 0; 136 | break; 137 | } 138 | else if (flag >= 0 && flag <= total_process - 1) 139 | { 140 | m = flag; 141 | break; 142 | } 143 | else continue; 144 | } 145 | //找到那个进程 146 | while (p->ID != m) 147 | p = p->next; 148 | //随机产生一个段号 149 | while (1) 150 | { 151 | flag = rand() % 100; 152 | if (p->total_segmet == 1)//只有一个段 153 | { 154 | n = 0; 155 | break; 156 | } 157 | else if (flag >= 0 && flag <= p->total_segmet - 1) 158 | { 159 | n = flag; 160 | break; 161 | } 162 | else continue; 163 | } 164 | //找到那个段 165 | q = p->segm->next; 166 | while (q->ID != n) 167 | q = q->next; 168 | //随机产生一个页号 169 | while (1) 170 | { 171 | flag = rand(); 172 | if (flag >= 0 && flag <= q->size / BLOCK - 1) 173 | { 174 | t = flag; 175 | break; 176 | } 177 | else continue; 178 | } 179 | //找到那个页 180 | r = q->page->next; 181 | while (r->ID != t) 182 | r = r->next; 183 | while (1)//一直到产生一个没有分配的块 184 | { 185 | //随机产生一个内存块号 186 | while (1) 187 | { 188 | flag = rand() % 1000; 189 | if (flag >= 0 && flag <= Flash / BLOCK - 1) 190 | { 191 | block_num = flag; 192 | break; 193 | } 194 | else continue; 195 | } 196 | //找到那个内存块 197 | while (mer->ID != block_num) 198 | { 199 | if (mer == NULL) 200 | { 201 | tmp = 0; 202 | break; 203 | } 204 | else 205 | { 206 | tmp = 1; 207 | mer = mer->next; 208 | } 209 | } 210 | //判断内存块是否已经被占 211 | if (mer->allocated == 'Y') 212 | { 213 | mer = memory_info->next; 214 | continue; 215 | } 216 | else 217 | break; 218 | } 219 | if (tmp == 0) 220 | break; 221 | mer->allocated = 'Y'; 222 | q->in_out = 'Y'; 223 | r->block_num = block_num; 224 | r->pageOffset = r->ID + block_num; 225 | if (r->pageOffset >= Flash) 226 | r->pageOffset -= Flash; 227 | r->in_out = 'Y'; 228 | mer = memory_info->next; 229 | p = process->next; 230 | } 231 | //读取进程信息,修改内存信息,避免假分配 232 | p = process->next;//进程信息第一个节点 233 | mer = memory_info->next;//内存信息第一个节点 234 | q = p->segm->next;//段信息第一个节点 235 | while (mer != NULL) 236 | { 237 | mer->allocated = 'N'; 238 | mer = mer->next; 239 | } 240 | mer = memory_info->next; 241 | for (int j = 0; j < total_process; j++) 242 | { 243 | while (p != NULL) 244 | { 245 | if (p->ID == j) 246 | break; 247 | else 248 | p = p->next; 249 | } 250 | q = p->segm->next; 251 | while (q != NULL) 252 | { 253 | r = q->page->next; 254 | for (int i = 0; i < q->size / BLOCK; i++) 255 | { 256 | if (r->in_out == 'Y') 257 | { 258 | while (mer->ID != r->block_num) 259 | mer = mer->next; 260 | mer->allocated = 'Y'; 261 | mer->recently = 1; 262 | remained -= BLOCK; 263 | r->time += 1; 264 | mer->time_in_memory = r->time; 265 | mer->Process_ID = p->ID; 266 | mer->Segment_ID = q->ID; 267 | mer->Page_ID = r->ID; 268 | strcpy(mer->name, p->name); 269 | mer = memory_info->next; 270 | r = r->next; 271 | } 272 | else 273 | r = r->next; 274 | } 275 | q = q->next; 276 | } 277 | } 278 | } 279 | 280 | //手动申请内存 281 | void Apply() 282 | { 283 | PCB* p, * s; 284 | Seg* m = NULL, * n; 285 | Pa* r = NULL, * t; 286 | Memory* mer; 287 | mer = memory_info->next; 288 | int max; 289 | int j; 290 | int k; 291 | int sum = 0;//记录进程的大小 292 | printf("请输入进程名:"); 293 | s = (PCB*)malloc(sizeof(PCB)); 294 | scanf("%s", s->name); 295 | p = process; 296 | while (p->next != NULL) 297 | p = p->next; 298 | s->ID = p->ID + 1; 299 | printf("\n请输入该进程总段数:"); 300 | scanf("%d", &s->total_segmet); 301 | InitSegment(&s->segm); 302 | n = s->segm; 303 | for (j = 0; j < s->total_segmet; j++) 304 | { 305 | m = (Seg*)malloc(sizeof(Seg)); 306 | printf("\n请输入第%d个段的段大小: ", j + 1); 307 | scanf("%d", &m->size); 308 | sum += m->size; 309 | m->ID = j; 310 | m->in_out = 'N'; 311 | InitPage(&m->page); 312 | t = m->page; 313 | for (k = 0; k < m->size / BLOCK; k++) 314 | { 315 | r = (Pa*)malloc(sizeof(Pa)); 316 | r->block_num = -1; 317 | r->ID = k; 318 | r->in_out = 'N'; 319 | r->time = 0; 320 | r->pageOffset = 0; 321 | t->next = r; 322 | t = t->next; 323 | t->next = NULL; 324 | } 325 | n->next = m; 326 | n = n->next; 327 | n->next = NULL; 328 | } 329 | //判断是否合法 330 | if (sum > remained) 331 | { 332 | printf("申请空间过大,请重新申请!\n"); 333 | sum = 0; 334 | //释放空间 335 | free(r); 336 | free(m); 337 | free(s); 338 | } 339 | else//从内存中选择空闲块给该进程 340 | { 341 | p->next = s; 342 | p = p->next; 343 | p->next = NULL; 344 | n = p->segm->next; 345 | max = mer->recently; 346 | while (mer != NULL) 347 | { 348 | if (mer->recently > max) 349 | { 350 | max = mer->recently; 351 | mer = mer->next; 352 | } 353 | else mer = mer->next; 354 | } 355 | mer = memory_info->next; 356 | for (j = 0; j < p->total_segmet; j++) 357 | { 358 | n->in_out = 'Y'; 359 | t = n->page->next; 360 | for (k = 0; k < n->size / BLOCK; k++) 361 | { 362 | t->in_out = 'Y'; 363 | t->time += 1; 364 | //查找memory空间,找到未分配的空间 365 | while (mer->allocated != 'N') 366 | mer = mer->next; 367 | t->block_num = mer->ID; 368 | mer->allocated = 'Y'; 369 | mer->recently = max + 1; 370 | mer->Process_ID = p->ID; 371 | mer->Segment_ID = n->ID; 372 | mer->Page_ID = t->ID; 373 | mer->time_in_memory = t->time; 374 | strcpy(mer->name, p->name); 375 | t->pageOffset = t->ID + t->block_num; 376 | if (t->pageOffset >= Flash) 377 | t->pageOffset -= Flash; 378 | mer = memory_info->next; 379 | t = t->next; 380 | } 381 | n = n->next; 382 | } 383 | remained -= sum; 384 | total_process++; 385 | } 386 | } 387 | 388 | /* 389 | 对于某特定机器,其地址结构是一定的。若給定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址可按下式求得: 390 | P = INT[A/L] 391 | d = [A] MOD L 392 | */ 393 | //地址转换 394 | void AddressExchange() 395 | { 396 | int ID;//进程ID 397 | int i;//段号 398 | int j;//页号 399 | int address;//物理地址 400 | int flag = 1;//用来标记输入是否合法 401 | PCB* p; 402 | Seg* s; 403 | Pa* q; 404 | Memory* mer; 405 | p = process->next; 406 | mer = memory_info->next; 407 | while (flag)//判断进程ID是否合法 408 | { 409 | printf("请输入进程ID:"); 410 | scanf("%d", &ID); 411 | if (ID >= total_process) 412 | { 413 | printf("\n输入不合法!请重新输入!\n"); 414 | flag = 1; 415 | } 416 | else flag = 0; 417 | } 418 | printf("\n请输入段表起始地址:"); 419 | scanf("%d", &Register); 420 | flag = 1; 421 | while (flag)//判断段号是否合法 422 | { 423 | printf("\n请输入段号:"); 424 | scanf("%d", &i); 425 | //找到进程号为ID的进程 426 | p = process->next; 427 | while (p->ID != ID) 428 | p = p->next; 429 | if (p->total_segmet <= i) 430 | { 431 | printf("\n输入不合法!请重新输入!\n"); 432 | flag = 1; 433 | } 434 | else flag = 0; 435 | } 436 | flag = 1; 437 | while (flag)//判断页号是否合法 438 | { 439 | printf("\n请输入页号:"); 440 | scanf("%d", &j); 441 | //找到段 442 | s = p->segm->next; 443 | while (s->ID != i) 444 | s = s->next; 445 | if (j >= s->size / BLOCK) 446 | { 447 | printf("\n输入不合法!请重新输入!\n"); 448 | flag = 1; 449 | } 450 | else flag = 0; 451 | } 452 | //判断是否缺段 453 | //查找进程的段表 454 | while (p->ID != ID) 455 | p = p->next; 456 | s = p->segm->next; 457 | //找到段号为i的段 458 | while (s->ID != i) 459 | s = s->next; 460 | if (s->in_out == 'N') 461 | { 462 | InterruptType = 1; 463 | printf("\n缺段中断!"); 464 | Sleep(2000); 465 | InterruptHanding(ID, i, j); 466 | } 467 | //判断是否缺页中断 468 | else 469 | { 470 | //找到页号为j的页 471 | q = s->page->next; 472 | while (q->ID != j) 473 | q = q->next; 474 | if (q->in_out == 'N') 475 | { 476 | InterruptType = 0; 477 | printf("\n缺页中断!"); 478 | Sleep(2000); 479 | InterruptHanding(ID, i, j); 480 | } 481 | else 482 | { 483 | q->time += 1; 484 | //改变访问内存块的最近时间 485 | mer = memory_info->next; 486 | while (mer->Page_ID != j) 487 | { 488 | mer = mer->next; 489 | } 490 | mer->recently += 1; 491 | address = Register + q->block_num * BLOCK + q->pageOffset - 1; 492 | printf("\n物理地址为:%d", address); 493 | printf("\n"); 494 | } 495 | } 496 | 497 | } 498 | 499 | //中断处理 500 | void InterruptHanding(int id, int i, int j) 501 | { 502 | char name[10];//置换出来的进程名 503 | int ID;//置换出来的进程ID 504 | int segment_ID;//置换出来的段号ID 505 | int page_ID;//置换出来的页号 506 | int enough = 0;//标记内存空间是否足够 507 | int min; 508 | int address; 509 | PCB* p; 510 | Seg* s; 511 | Pa* q; 512 | Memory* mer, * temp; 513 | if (InterruptType == 1)//缺段中断 514 | { 515 | //找到该段和该段的页,若没有足够的空间,用LRU法置换 516 | p = process->next; 517 | //找到该进程 518 | while (p->ID != id) 519 | p = p->next; 520 | s = p->segm->next; 521 | //找到该段 522 | while (s->ID != i) 523 | s = s->next; 524 | //将该段放入内存 525 | s->in_out = 'Y'; 526 | //找到该页 527 | q = s->page->next; 528 | while (q->ID != j) 529 | q = q->next; 530 | //将该页放入内存,首先判断内存空间是否足够 531 | mer = memory_info->next; 532 | if (remained >= BLOCK)//空间够 533 | { 534 | //找到内存中空闲块分配给该页 535 | enough = 1; 536 | while (mer->allocated != 'N') 537 | mer = mer->next; 538 | mer->allocated = 'Y'; 539 | mer->Page_ID = j; 540 | mer->Process_ID = id; 541 | strcpy(mer->name, p->name); 542 | mer->Segment_ID = i; 543 | q->block_num = mer->ID; 544 | q->Process_ID = id; 545 | q->Segment_ID = i; 546 | q->time++; 547 | mer->time_in_memory = q->time; 548 | strcpy(q->name, p->name); 549 | q->in_out = 'Y'; 550 | q->pageOffset = q->ID + mer->ID; 551 | if (q->pageOffset >= Flash) 552 | q->pageOffset -= Flash; 553 | address = Register + q->block_num * BLOCK + q->pageOffset - 1; 554 | remained -= BLOCK; 555 | temp = mer; 556 | //修改recently 557 | mer = memory_info->next; 558 | int max = mer->recently; 559 | while (mer != NULL) 560 | { 561 | if (mer->recently > max) 562 | { 563 | max = mer->recently; 564 | mer = mer->next; 565 | } 566 | else mer = mer->next; 567 | } 568 | temp->recently = max + 1; 569 | //内存中的所有页时间加1 570 | mer = memory_info->next; 571 | while (mer != NULL) 572 | { 573 | if (mer->Process_ID == id && mer->Segment_ID == i && mer->Page_ID == j) 574 | mer = mer->next; 575 | else if (mer->allocated == 'Y') 576 | { 577 | //修改进程链表 578 | p = process->next; 579 | while (p->ID != mer->Process_ID) 580 | p = p->next; 581 | s = p->segm->next; 582 | while (s->ID != mer->Segment_ID) 583 | s = s->next; 584 | q = s->page->next; 585 | while (q->ID != mer->Page_ID) 586 | q = q->next; 587 | q->time++; 588 | mer->time_in_memory = q->time; 589 | mer = mer->next; 590 | } 591 | else mer = mer->next; 592 | } 593 | } 594 | else// 空间不够,内存已占满 595 | { 596 | //利用LRU淘汰内存中的页 597 | //遍历表,查找占用内存时间最长的块,即recently最小 598 | enough = 0; 599 | mer = memory_info->next; 600 | temp = memory_info->next; 601 | min = mer->recently; 602 | while (mer != NULL) 603 | { 604 | if (mer->allocated == 'Y') 605 | { 606 | if (mer->recently < min) 607 | { 608 | temp = mer; 609 | min = mer->time_in_memory; 610 | mer = mer->next; 611 | } 612 | else 613 | mer = mer->next; 614 | } 615 | else 616 | mer = mer->next; 617 | } 618 | strcpy(name, temp->name); 619 | ID = temp->Process_ID; 620 | segment_ID = temp->Segment_ID; 621 | page_ID = temp->Page_ID; 622 | //将temp指向的进程的信息置换出内存 623 | //找到该进程号 624 | p = process->next; 625 | while (p->ID != temp->Process_ID) 626 | p = p->next; 627 | //找到该进程的段号 628 | s = p->segm->next; 629 | while (s->ID != temp->Segment_ID) 630 | s = s->next; 631 | //找到该进程的页号 632 | q = s->page->next; 633 | while (q->ID != temp->Page_ID) 634 | q = q->next; 635 | //将该页换出 636 | q->block_num = -1; 637 | q->in_out = 'N'; 638 | q->Process_ID = -1; 639 | q->Segment_ID = -1; 640 | q->pageOffset = 0; 641 | q->time = 0; 642 | temp->allocated = 'N'; 643 | temp->time_in_memory = 0; 644 | temp->recently = 0; 645 | temp->Page_ID = -1; 646 | temp->Process_ID = -1; 647 | temp->Segment_ID = -1; 648 | p = process->next; 649 | //找到该进程 650 | while (p->ID != id) 651 | p = p->next; 652 | s = p->segm->next; 653 | //找到该段 654 | while (s->ID != i) 655 | s = s->next; 656 | //将该段放入内存 657 | s->in_out = 'Y'; 658 | //找到该页 659 | q = s->page->next; 660 | while (q->ID != j) 661 | q = q->next; 662 | //将该页放入内存 663 | mer = memory_info->next; 664 | while (mer->allocated != 'N') 665 | mer = mer->next; 666 | mer->allocated = 'Y'; 667 | mer->Page_ID = j; 668 | //mer->recently = 1; 669 | mer->Process_ID = id; 670 | strcpy(mer->name, p->name); 671 | mer->Segment_ID = i; 672 | mer->time_in_memory++; 673 | q->block_num = mer->ID; 674 | q->in_out = 'Y'; 675 | q->time++; 676 | strcpy(q->name, p->name); 677 | q->Process_ID = p->ID; 678 | q->Segment_ID = s->ID; 679 | q->pageOffset = q->ID + mer->ID; 680 | if (q->pageOffset >= Flash) 681 | q->pageOffset -= Flash; 682 | address = Register + q->block_num * BLOCK + q->pageOffset - 1; 683 | temp = mer; 684 | //修改recently 685 | mer = memory_info->next; 686 | int max = mer->recently; 687 | while (mer != NULL) 688 | { 689 | if (mer->recently > max) 690 | { 691 | max = mer->recently; 692 | mer = mer->next; 693 | } 694 | else mer = mer->next; 695 | } 696 | temp->recently = max + 1; 697 | //内存中的所有页时间加1 698 | mer = memory_info->next; 699 | while (mer != NULL) 700 | { 701 | if (mer->Process_ID == id && mer->Segment_ID == i && mer->Page_ID == j) 702 | mer = mer->next; 703 | else if (mer->allocated == 'Y') 704 | { 705 | //修改进程链表 706 | p = process->next; 707 | while (p->ID != mer->Process_ID) 708 | p = p->next; 709 | s = p->segm->next; 710 | while (s->ID != mer->Segment_ID) 711 | s = s->next; 712 | q = s->page->next; 713 | while (q->ID != mer->Page_ID) 714 | q = q->next; 715 | q->time++; 716 | mer->time_in_memory = q->time; 717 | mer = mer->next; 718 | } 719 | else mer = mer->next; 720 | } 721 | } 722 | printf("\n该段已经调入内存!"); 723 | printf("\n该页已经调入内存!"); 724 | } 725 | else//缺页中断 726 | { 727 | p = process->next; 728 | //找到该进程 729 | while (p->ID != id) 730 | p = p->next; 731 | s = p->segm->next; 732 | //找到该段 733 | while (s->ID != i) 734 | s = s->next; 735 | //将该段放入内存 736 | s->in_out = 'Y'; 737 | //找到该页 738 | q = s->page->next; 739 | while (q->ID != j) 740 | q = q->next; 741 | //查看内存情况 742 | mer = memory_info->next; 743 | if (remained >= BLOCK)//空间足够 744 | { 745 | enough = 1; 746 | //找到内存中空闲块分配给该页 747 | while (mer->allocated != 'N') 748 | mer = mer->next; 749 | mer->allocated = 'Y'; 750 | mer->Page_ID = j; 751 | mer->Process_ID = id; 752 | strcpy(mer->name, p->name); 753 | mer->Segment_ID = i; 754 | mer->time_in_memory++; 755 | q->block_num = mer->ID; 756 | q->Process_ID = id; 757 | q->Segment_ID = i; 758 | q->time++; 759 | strcpy(q->name, p->name); 760 | q->in_out = 'Y'; 761 | q->pageOffset = q->ID + mer->ID; 762 | if (q->pageOffset >= Flash) 763 | q->pageOffset -= Flash; 764 | address = Register + q->block_num * BLOCK + q->pageOffset - 1; 765 | remained -= BLOCK; 766 | temp = mer; 767 | //修改recently 768 | mer = memory_info->next; 769 | int max = mer->recently; 770 | while (mer != NULL) 771 | { 772 | if (mer->recently > max) 773 | { 774 | max = mer->recently; 775 | mer = mer->next; 776 | } 777 | else mer = mer->next; 778 | } 779 | temp->recently = max + 1; 780 | //内存中的所有页时间加1 781 | mer = memory_info->next; 782 | while (mer != NULL) 783 | { 784 | if (mer->Process_ID == id && mer->Segment_ID == i && mer->Page_ID == j) 785 | mer = mer->next; 786 | else if (mer->allocated == 'Y') 787 | { 788 | //修改进程链表 789 | p = process->next; 790 | while (p->ID != mer->Process_ID) 791 | p = p->next; 792 | s = p->segm->next; 793 | while (s->ID != mer->Segment_ID) 794 | s = s->next; 795 | q = s->page->next; 796 | while (q->ID != mer->Page_ID) 797 | q = q->next; 798 | q->time++; 799 | mer->time_in_memory = q->time; 800 | mer = mer->next; 801 | } 802 | else mer = mer->next; 803 | } 804 | } 805 | else//空间不够,采用LRU置换 806 | { 807 | enough = 0; 808 | //利用LRU淘汰内存中的页 809 | //遍历表,查找最近很少使用的块,即renctly最小的 810 | mer = memory_info->next; 811 | temp = memory_info->next; 812 | min = mer->recently; 813 | while (mer != NULL) 814 | { 815 | if (mer->allocated == 'Y') 816 | { 817 | if (mer->recently < min) 818 | { 819 | temp = mer; 820 | min = mer->time_in_memory; 821 | mer = mer->next; 822 | } 823 | else 824 | mer = mer->next; 825 | } 826 | else 827 | mer = mer->next; 828 | } 829 | strcpy(name, temp->name); 830 | ID = temp->Process_ID; 831 | segment_ID = temp->Segment_ID; 832 | page_ID = temp->Page_ID; 833 | //将temp指向的进程的信息置换出内存 834 | //找到该进程号 835 | p = process->next; 836 | while (p->ID != temp->Process_ID) 837 | p = p->next; 838 | //找到该进程的段号 839 | s = p->segm->next; 840 | while (s->ID != temp->Segment_ID) 841 | s = s->next; 842 | //找到该进程的页号 843 | q = s->page->next; 844 | while (q->ID != temp->Page_ID) 845 | q = q->next; 846 | //将该页换出 847 | q->block_num = -1; 848 | q->in_out = 'N'; 849 | q->Process_ID = -1; 850 | q->Segment_ID = -1; 851 | q->pageOffset = 0; 852 | q->time = 0; 853 | temp->allocated = 'N'; 854 | temp->recently = 0; 855 | temp->time_in_memory = 0; 856 | temp->Page_ID = -1; 857 | temp->Process_ID = -1; 858 | temp->Segment_ID = -1; 859 | p = process->next; 860 | //找到该进程 861 | while (p->ID != id) 862 | p = p->next; 863 | s = p->segm->next; 864 | //找到该段 865 | while (s->ID != i) 866 | s = s->next; 867 | //将该段放入内存 868 | s->in_out = 'Y'; 869 | //找到该页 870 | q = s->page->next; 871 | while (q->ID != j) 872 | q = q->next; 873 | //将该页放入内存 874 | mer = memory_info->next; 875 | while (mer->allocated != 'N') 876 | mer = mer->next; 877 | mer->allocated = 'Y'; 878 | mer->Page_ID = j; 879 | mer->Process_ID = id; 880 | strcpy(mer->name, p->name); 881 | mer->Segment_ID = i; 882 | mer->time_in_memory++; 883 | q->block_num = mer->ID; 884 | q->in_out = 'Y'; 885 | q->time++; 886 | strcpy(q->name, p->name); 887 | q->Process_ID = p->ID; 888 | q->Segment_ID = s->ID; 889 | q->pageOffset = q->ID + mer->ID; 890 | if (q->pageOffset >= Flash) 891 | q->pageOffset -= Flash; 892 | address = Register + q->block_num * BLOCK + q->pageOffset - 1; 893 | temp = mer; 894 | //修改recently 895 | mer = memory_info->next; 896 | int max = mer->recently; 897 | while (mer != NULL) 898 | { 899 | if (mer->recently > max) 900 | { 901 | max = mer->recently; 902 | mer = mer->next; 903 | } 904 | else mer = mer->next; 905 | } 906 | temp->recently = max + 1; 907 | //内存中的所有页时间加1 908 | mer = memory_info->next; 909 | while (mer != NULL) 910 | { 911 | if (mer->Process_ID == id && mer->Segment_ID == i && mer->Page_ID == j) 912 | mer = mer->next; 913 | else if (mer->allocated == 'Y') 914 | { 915 | //修改进程链表 916 | p = process->next; 917 | while (p->ID != mer->Process_ID) 918 | p = p->next; 919 | s = p->segm->next; 920 | while (s->ID != mer->Segment_ID) 921 | s = s->next; 922 | q = s->page->next; 923 | while (q->ID != mer->Page_ID) 924 | q = q->next; 925 | q->time++; 926 | mer->time_in_memory = q->time; 927 | mer = mer->next; 928 | } 929 | else mer = mer->next; 930 | } 931 | } 932 | printf("\n该页已经调入内存!"); 933 | } 934 | //计算地址 935 | Sleep(2000); 936 | printf("\n地址为:%d", address); 937 | printf("\n"); 938 | if (!enough) 939 | { 940 | printf("\n换出内存的信息:\n"); 941 | printf("进程名\t进程号\t段号\t页号\n"); 942 | printf("%s\t%d\t%d\t%d\n", name, ID, segment_ID, page_ID); 943 | } 944 | } 945 | //内存回收 946 | void Recycle() 947 | { 948 | Memory* mer; 949 | PCB* p; 950 | Seg* s; 951 | Pa* q; 952 | int ID;//要回收的进程号 953 | printf("请输入进程号:\n"); 954 | scanf("%d", &ID); 955 | //修改内存信息 956 | mer = memory_info->next; 957 | while (mer != NULL) 958 | { 959 | if (mer->Process_ID == ID) 960 | { 961 | mer->allocated = 'N'; 962 | mer->Page_ID = -1; 963 | mer->Process_ID = -1; 964 | mer->Segment_ID = -1; 965 | mer->recently = 0; 966 | mer->time_in_memory = 0; 967 | remained += BLOCK; 968 | mer = mer->next; 969 | } 970 | else 971 | mer = mer->next; 972 | } 973 | //修改进程信息 974 | p = process->next; 975 | while (p != NULL) 976 | { 977 | if (p->ID == ID) 978 | { 979 | s = p->segm->next; 980 | while (s != NULL) 981 | { 982 | q = s->page->next; 983 | while (q != NULL) 984 | { 985 | s->in_out = 'N'; 986 | q->in_out = 'N'; 987 | q->pageOffset = 0; 988 | q->block_num = -1; 989 | q->time = 0; 990 | q->Process_ID = -1; 991 | q->Segment_ID = -1; 992 | q = q->next; 993 | } 994 | s = s->next; 995 | } 996 | break; 997 | } 998 | else 999 | p = p->next; 1000 | } 1001 | } 1002 | /* 1003 | int main() 1004 | { 1005 | return 0; 1006 | } 1007 | */ -------------------------------------------------------------------------------- /OS_UI/ui_MemoryWindow.h: -------------------------------------------------------------------------------- 1 | /******************************************************************************** 2 | ** Form generated from reading UI file 'MemoryWindow.ui' 3 | ** 4 | ** Created by: Qt User Interface Compiler version 5.4.0 5 | ** 6 | ** WARNING! All changes made in this file will be lost when recompiling UI file! 7 | ********************************************************************************/ 8 | 9 | #ifndef UI_MEMORYWINDOW_H 10 | #define UI_MEMORYWINDOW_H 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | 29 | QT_BEGIN_NAMESPACE 30 | 31 | class Ui_MemoryWindow 32 | { 33 | public: 34 | QGridLayout *gridLayout; 35 | QTabWidget *tabWidget; 36 | QWidget *tab_1; 37 | QWidget *layoutWidget; 38 | QHBoxLayout *horizontalLayout; 39 | QGridLayout *gridLayout_2; 40 | QLabel *label_3; 41 | QLineEdit *lineEdit_ps_name; 42 | QLabel *label_4; 43 | QLineEdit *lineEdit_ps_SegNum; 44 | QTableWidget *tableWidget_ps_Section; 45 | QPushButton *btnNewPS; 46 | QPushButton *btnSegSize; 47 | QWidget *tab_2; 48 | QWidget *layoutWidget1; 49 | QGridLayout *gridLayout_7; 50 | QLabel *label; 51 | QLineEdit *lineEdit_pid_2; 52 | QPushButton *btnRecycle; 53 | QWidget *tab_3; 54 | QWidget *layoutWidget2; 55 | QGridLayout *gridLayout_4; 56 | QGridLayout *gridLayout_3; 57 | QLabel *label_2; 58 | QLineEdit *lineEdit_memSize; 59 | QSpacerItem *horizontalSpacer; 60 | QLabel *label_5; 61 | QLineEdit *lineEdit_tBlocks; 62 | QLabel *label_6; 63 | QLineEdit *lineEdit_bSize; 64 | QLabel *label_7; 65 | QTableWidget *tableWidget_memList; 66 | QSpacerItem *horizontalSpacer_2; 67 | QLabel *label_MemCount; 68 | QPushButton *btnViewMem; 69 | QWidget *tab_4; 70 | QGroupBox *groupBox; 71 | QGridLayout *gridLayout_5; 72 | QHBoxLayout *horizontalLayout_3; 73 | QLabel *label_ps_name; 74 | QLabel *label_ps_id; 75 | QTableWidget *tableWidget_sectionList; 76 | QTableWidget *tableWidget_pageList; 77 | QWidget *widget; 78 | QGridLayout *gridLayout_8; 79 | QLabel *label_9; 80 | QLineEdit *lineEdit_ps_pid; 81 | QPushButton *btnQueryPSInfo; 82 | QWidget *tab; 83 | QWidget *widget1; 84 | QGridLayout *gridLayout_6; 85 | QLabel *label_12; 86 | QTextEdit *textEdit_log; 87 | QLabel *label_13; 88 | QLabel *label_14; 89 | QLabel *label_15; 90 | QLineEdit *lineEdit_page_id; 91 | QPushButton *btnPageID; 92 | QSpacerItem *verticalSpacer; 93 | QLineEdit *lineEdit_ps_id; 94 | QLineEdit *lineEdit_seg_sAddress; 95 | QLineEdit *lineEdit_seg_id; 96 | 97 | void setupUi(QWidget *MemoryWindow) 98 | { 99 | if (MemoryWindow->objectName().isEmpty()) 100 | MemoryWindow->setObjectName(QStringLiteral("MemoryWindow")); 101 | MemoryWindow->resize(780, 641); 102 | gridLayout = new QGridLayout(MemoryWindow); 103 | gridLayout->setObjectName(QStringLiteral("gridLayout")); 104 | tabWidget = new QTabWidget(MemoryWindow); 105 | tabWidget->setObjectName(QStringLiteral("tabWidget")); 106 | tab_1 = new QWidget(); 107 | tab_1->setObjectName(QStringLiteral("tab_1")); 108 | layoutWidget = new QWidget(tab_1); 109 | layoutWidget->setObjectName(QStringLiteral("layoutWidget")); 110 | layoutWidget->setGeometry(QRect(10, 30, 191, 551)); 111 | horizontalLayout = new QHBoxLayout(layoutWidget); 112 | horizontalLayout->setObjectName(QStringLiteral("horizontalLayout")); 113 | horizontalLayout->setContentsMargins(0, 0, 0, 0); 114 | gridLayout_2 = new QGridLayout(); 115 | gridLayout_2->setObjectName(QStringLiteral("gridLayout_2")); 116 | label_3 = new QLabel(layoutWidget); 117 | label_3->setObjectName(QStringLiteral("label_3")); 118 | label_3->setMinimumSize(QSize(80, 0)); 119 | label_3->setMaximumSize(QSize(80, 16777215)); 120 | label_3->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); 121 | 122 | gridLayout_2->addWidget(label_3, 0, 0, 1, 1); 123 | 124 | lineEdit_ps_name = new QLineEdit(layoutWidget); 125 | lineEdit_ps_name->setObjectName(QStringLiteral("lineEdit_ps_name")); 126 | lineEdit_ps_name->setMinimumSize(QSize(100, 0)); 127 | lineEdit_ps_name->setMaximumSize(QSize(100, 16777215)); 128 | 129 | gridLayout_2->addWidget(lineEdit_ps_name, 0, 1, 1, 1); 130 | 131 | label_4 = new QLabel(layoutWidget); 132 | label_4->setObjectName(QStringLiteral("label_4")); 133 | label_4->setMinimumSize(QSize(80, 0)); 134 | label_4->setMaximumSize(QSize(80, 16777215)); 135 | label_4->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); 136 | 137 | gridLayout_2->addWidget(label_4, 1, 0, 1, 1); 138 | 139 | lineEdit_ps_SegNum = new QLineEdit(layoutWidget); 140 | lineEdit_ps_SegNum->setObjectName(QStringLiteral("lineEdit_ps_SegNum")); 141 | lineEdit_ps_SegNum->setMinimumSize(QSize(100, 0)); 142 | lineEdit_ps_SegNum->setMaximumSize(QSize(100, 16777215)); 143 | 144 | gridLayout_2->addWidget(lineEdit_ps_SegNum, 1, 1, 1, 1); 145 | 146 | tableWidget_ps_Section = new QTableWidget(layoutWidget); 147 | if (tableWidget_ps_Section->columnCount() < 1) 148 | tableWidget_ps_Section->setColumnCount(1); 149 | QTableWidgetItem *__qtablewidgetitem = new QTableWidgetItem(); 150 | tableWidget_ps_Section->setHorizontalHeaderItem(0, __qtablewidgetitem); 151 | tableWidget_ps_Section->setObjectName(QStringLiteral("tableWidget_ps_Section")); 152 | tableWidget_ps_Section->setMinimumSize(QSize(186, 0)); 153 | tableWidget_ps_Section->setMaximumSize(QSize(180, 16777215)); 154 | 155 | gridLayout_2->addWidget(tableWidget_ps_Section, 3, 0, 1, 2); 156 | 157 | btnNewPS = new QPushButton(layoutWidget); 158 | btnNewPS->setObjectName(QStringLiteral("btnNewPS")); 159 | 160 | gridLayout_2->addWidget(btnNewPS, 4, 0, 1, 2); 161 | 162 | btnSegSize = new QPushButton(layoutWidget); 163 | btnSegSize->setObjectName(QStringLiteral("btnSegSize")); 164 | 165 | gridLayout_2->addWidget(btnSegSize, 2, 1, 1, 1); 166 | 167 | 168 | horizontalLayout->addLayout(gridLayout_2); 169 | 170 | tabWidget->addTab(tab_1, QString()); 171 | tab_2 = new QWidget(); 172 | tab_2->setObjectName(QStringLiteral("tab_2")); 173 | layoutWidget1 = new QWidget(tab_2); 174 | layoutWidget1->setObjectName(QStringLiteral("layoutWidget1")); 175 | layoutWidget1->setGeometry(QRect(10, 31, 216, 43)); 176 | gridLayout_7 = new QGridLayout(layoutWidget1); 177 | gridLayout_7->setObjectName(QStringLiteral("gridLayout_7")); 178 | gridLayout_7->setContentsMargins(0, 0, 0, 0); 179 | label = new QLabel(layoutWidget1); 180 | label->setObjectName(QStringLiteral("label")); 181 | 182 | gridLayout_7->addWidget(label, 0, 0, 1, 2); 183 | 184 | lineEdit_pid_2 = new QLineEdit(layoutWidget1); 185 | lineEdit_pid_2->setObjectName(QStringLiteral("lineEdit_pid_2")); 186 | 187 | gridLayout_7->addWidget(lineEdit_pid_2, 1, 0, 1, 1); 188 | 189 | btnRecycle = new QPushButton(layoutWidget1); 190 | btnRecycle->setObjectName(QStringLiteral("btnRecycle")); 191 | 192 | gridLayout_7->addWidget(btnRecycle, 1, 1, 1, 1); 193 | 194 | tabWidget->addTab(tab_2, QString()); 195 | tab_3 = new QWidget(); 196 | tab_3->setObjectName(QStringLiteral("tab_3")); 197 | layoutWidget2 = new QWidget(tab_3); 198 | layoutWidget2->setObjectName(QStringLiteral("layoutWidget2")); 199 | layoutWidget2->setGeometry(QRect(10, 20, 731, 561)); 200 | gridLayout_4 = new QGridLayout(layoutWidget2); 201 | gridLayout_4->setObjectName(QStringLiteral("gridLayout_4")); 202 | gridLayout_4->setContentsMargins(0, 0, 0, 0); 203 | gridLayout_3 = new QGridLayout(); 204 | gridLayout_3->setObjectName(QStringLiteral("gridLayout_3")); 205 | label_2 = new QLabel(layoutWidget2); 206 | label_2->setObjectName(QStringLiteral("label_2")); 207 | 208 | gridLayout_3->addWidget(label_2, 0, 0, 2, 1); 209 | 210 | lineEdit_memSize = new QLineEdit(layoutWidget2); 211 | lineEdit_memSize->setObjectName(QStringLiteral("lineEdit_memSize")); 212 | 213 | gridLayout_3->addWidget(lineEdit_memSize, 0, 1, 2, 1); 214 | 215 | horizontalSpacer = new QSpacerItem(258, 38, QSizePolicy::Expanding, QSizePolicy::Minimum); 216 | 217 | gridLayout_3->addItem(horizontalSpacer, 0, 2, 2, 1); 218 | 219 | label_5 = new QLabel(layoutWidget2); 220 | label_5->setObjectName(QStringLiteral("label_5")); 221 | 222 | gridLayout_3->addWidget(label_5, 0, 3, 1, 1); 223 | 224 | lineEdit_tBlocks = new QLineEdit(layoutWidget2); 225 | lineEdit_tBlocks->setObjectName(QStringLiteral("lineEdit_tBlocks")); 226 | 227 | gridLayout_3->addWidget(lineEdit_tBlocks, 0, 4, 1, 1); 228 | 229 | label_6 = new QLabel(layoutWidget2); 230 | label_6->setObjectName(QStringLiteral("label_6")); 231 | 232 | gridLayout_3->addWidget(label_6, 1, 3, 1, 1); 233 | 234 | lineEdit_bSize = new QLineEdit(layoutWidget2); 235 | lineEdit_bSize->setObjectName(QStringLiteral("lineEdit_bSize")); 236 | 237 | gridLayout_3->addWidget(lineEdit_bSize, 1, 4, 1, 1); 238 | 239 | 240 | gridLayout_4->addLayout(gridLayout_3, 0, 0, 1, 2); 241 | 242 | label_7 = new QLabel(layoutWidget2); 243 | label_7->setObjectName(QStringLiteral("label_7")); 244 | QFont font; 245 | font.setPointSize(16); 246 | font.setBold(true); 247 | font.setWeight(75); 248 | label_7->setFont(font); 249 | label_7->setAlignment(Qt::AlignCenter); 250 | 251 | gridLayout_4->addWidget(label_7, 1, 0, 1, 2); 252 | 253 | tableWidget_memList = new QTableWidget(layoutWidget2); 254 | if (tableWidget_memList->columnCount() < 5) 255 | tableWidget_memList->setColumnCount(5); 256 | QTableWidgetItem *__qtablewidgetitem1 = new QTableWidgetItem(); 257 | tableWidget_memList->setHorizontalHeaderItem(0, __qtablewidgetitem1); 258 | QTableWidgetItem *__qtablewidgetitem2 = new QTableWidgetItem(); 259 | tableWidget_memList->setHorizontalHeaderItem(1, __qtablewidgetitem2); 260 | QTableWidgetItem *__qtablewidgetitem3 = new QTableWidgetItem(); 261 | tableWidget_memList->setHorizontalHeaderItem(2, __qtablewidgetitem3); 262 | QTableWidgetItem *__qtablewidgetitem4 = new QTableWidgetItem(); 263 | tableWidget_memList->setHorizontalHeaderItem(3, __qtablewidgetitem4); 264 | QTableWidgetItem *__qtablewidgetitem5 = new QTableWidgetItem(); 265 | tableWidget_memList->setHorizontalHeaderItem(4, __qtablewidgetitem5); 266 | tableWidget_memList->setObjectName(QStringLiteral("tableWidget_memList")); 267 | 268 | gridLayout_4->addWidget(tableWidget_memList, 2, 0, 1, 2); 269 | 270 | horizontalSpacer_2 = new QSpacerItem(498, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); 271 | 272 | gridLayout_4->addItem(horizontalSpacer_2, 4, 0, 1, 1); 273 | 274 | label_MemCount = new QLabel(layoutWidget2); 275 | label_MemCount->setObjectName(QStringLiteral("label_MemCount")); 276 | label_MemCount->setMinimumSize(QSize(200, 0)); 277 | label_MemCount->setStyleSheet(QStringLiteral("QLabel{color:blue;}")); 278 | label_MemCount->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); 279 | 280 | gridLayout_4->addWidget(label_MemCount, 4, 1, 1, 1); 281 | 282 | btnViewMem = new QPushButton(layoutWidget2); 283 | btnViewMem->setObjectName(QStringLiteral("btnViewMem")); 284 | 285 | gridLayout_4->addWidget(btnViewMem, 5, 0, 1, 2); 286 | 287 | tabWidget->addTab(tab_3, QString()); 288 | tab_4 = new QWidget(); 289 | tab_4->setObjectName(QStringLiteral("tab_4")); 290 | groupBox = new QGroupBox(tab_4); 291 | groupBox->setObjectName(QStringLiteral("groupBox")); 292 | groupBox->setGeometry(QRect(390, 10, 351, 71)); 293 | gridLayout_5 = new QGridLayout(groupBox); 294 | gridLayout_5->setObjectName(QStringLiteral("gridLayout_5")); 295 | horizontalLayout_3 = new QHBoxLayout(); 296 | horizontalLayout_3->setObjectName(QStringLiteral("horizontalLayout_3")); 297 | label_ps_name = new QLabel(groupBox); 298 | label_ps_name->setObjectName(QStringLiteral("label_ps_name")); 299 | 300 | horizontalLayout_3->addWidget(label_ps_name); 301 | 302 | label_ps_id = new QLabel(groupBox); 303 | label_ps_id->setObjectName(QStringLiteral("label_ps_id")); 304 | 305 | horizontalLayout_3->addWidget(label_ps_id); 306 | 307 | 308 | gridLayout_5->addLayout(horizontalLayout_3, 0, 0, 1, 1); 309 | 310 | tableWidget_sectionList = new QTableWidget(tab_4); 311 | if (tableWidget_sectionList->columnCount() < 3) 312 | tableWidget_sectionList->setColumnCount(3); 313 | QTableWidgetItem *__qtablewidgetitem6 = new QTableWidgetItem(); 314 | tableWidget_sectionList->setHorizontalHeaderItem(0, __qtablewidgetitem6); 315 | QTableWidgetItem *__qtablewidgetitem7 = new QTableWidgetItem(); 316 | tableWidget_sectionList->setHorizontalHeaderItem(1, __qtablewidgetitem7); 317 | QTableWidgetItem *__qtablewidgetitem8 = new QTableWidgetItem(); 318 | tableWidget_sectionList->setHorizontalHeaderItem(2, __qtablewidgetitem8); 319 | tableWidget_sectionList->setObjectName(QStringLiteral("tableWidget_sectionList")); 320 | tableWidget_sectionList->setGeometry(QRect(10, 90, 311, 491)); 321 | tableWidget_pageList = new QTableWidget(tab_4); 322 | if (tableWidget_pageList->columnCount() < 4) 323 | tableWidget_pageList->setColumnCount(4); 324 | QTableWidgetItem *__qtablewidgetitem9 = new QTableWidgetItem(); 325 | tableWidget_pageList->setHorizontalHeaderItem(0, __qtablewidgetitem9); 326 | QTableWidgetItem *__qtablewidgetitem10 = new QTableWidgetItem(); 327 | tableWidget_pageList->setHorizontalHeaderItem(1, __qtablewidgetitem10); 328 | QTableWidgetItem *__qtablewidgetitem11 = new QTableWidgetItem(); 329 | tableWidget_pageList->setHorizontalHeaderItem(2, __qtablewidgetitem11); 330 | QTableWidgetItem *__qtablewidgetitem12 = new QTableWidgetItem(); 331 | tableWidget_pageList->setHorizontalHeaderItem(3, __qtablewidgetitem12); 332 | tableWidget_pageList->setObjectName(QStringLiteral("tableWidget_pageList")); 333 | tableWidget_pageList->setGeometry(QRect(330, 90, 411, 491)); 334 | widget = new QWidget(tab_4); 335 | widget->setObjectName(QStringLiteral("widget")); 336 | widget->setGeometry(QRect(10, 12, 341, 61)); 337 | gridLayout_8 = new QGridLayout(widget); 338 | gridLayout_8->setObjectName(QStringLiteral("gridLayout_8")); 339 | gridLayout_8->setContentsMargins(0, 0, 0, 0); 340 | label_9 = new QLabel(widget); 341 | label_9->setObjectName(QStringLiteral("label_9")); 342 | 343 | gridLayout_8->addWidget(label_9, 0, 0, 1, 2); 344 | 345 | lineEdit_ps_pid = new QLineEdit(widget); 346 | lineEdit_ps_pid->setObjectName(QStringLiteral("lineEdit_ps_pid")); 347 | 348 | gridLayout_8->addWidget(lineEdit_ps_pid, 1, 0, 1, 1); 349 | 350 | btnQueryPSInfo = new QPushButton(widget); 351 | btnQueryPSInfo->setObjectName(QStringLiteral("btnQueryPSInfo")); 352 | 353 | gridLayout_8->addWidget(btnQueryPSInfo, 1, 1, 1, 1); 354 | 355 | tabWidget->addTab(tab_4, QString()); 356 | tab = new QWidget(); 357 | tab->setObjectName(QStringLiteral("tab")); 358 | widget1 = new QWidget(tab); 359 | widget1->setObjectName(QStringLiteral("widget1")); 360 | widget1->setGeometry(QRect(11, 21, 731, 571)); 361 | gridLayout_6 = new QGridLayout(widget1); 362 | gridLayout_6->setObjectName(QStringLiteral("gridLayout_6")); 363 | gridLayout_6->setContentsMargins(0, 0, 0, 0); 364 | label_12 = new QLabel(widget1); 365 | label_12->setObjectName(QStringLiteral("label_12")); 366 | 367 | gridLayout_6->addWidget(label_12, 0, 0, 1, 2); 368 | 369 | textEdit_log = new QTextEdit(widget1); 370 | textEdit_log->setObjectName(QStringLiteral("textEdit_log")); 371 | textEdit_log->setMinimumSize(QSize(500, 0)); 372 | 373 | gridLayout_6->addWidget(textEdit_log, 0, 2, 9, 1); 374 | 375 | label_13 = new QLabel(widget1); 376 | label_13->setObjectName(QStringLiteral("label_13")); 377 | 378 | gridLayout_6->addWidget(label_13, 2, 0, 1, 2); 379 | 380 | label_14 = new QLabel(widget1); 381 | label_14->setObjectName(QStringLiteral("label_14")); 382 | 383 | gridLayout_6->addWidget(label_14, 4, 0, 1, 2); 384 | 385 | label_15 = new QLabel(widget1); 386 | label_15->setObjectName(QStringLiteral("label_15")); 387 | 388 | gridLayout_6->addWidget(label_15, 6, 0, 1, 2); 389 | 390 | lineEdit_page_id = new QLineEdit(widget1); 391 | lineEdit_page_id->setObjectName(QStringLiteral("lineEdit_page_id")); 392 | 393 | gridLayout_6->addWidget(lineEdit_page_id, 7, 0, 1, 1); 394 | 395 | btnPageID = new QPushButton(widget1); 396 | btnPageID->setObjectName(QStringLiteral("btnPageID")); 397 | btnPageID->setMinimumSize(QSize(0, 0)); 398 | 399 | gridLayout_6->addWidget(btnPageID, 7, 1, 1, 1); 400 | 401 | verticalSpacer = new QSpacerItem(208, 278, QSizePolicy::Minimum, QSizePolicy::Expanding); 402 | 403 | gridLayout_6->addItem(verticalSpacer, 8, 0, 1, 2); 404 | 405 | lineEdit_ps_id = new QLineEdit(widget1); 406 | lineEdit_ps_id->setObjectName(QStringLiteral("lineEdit_ps_id")); 407 | 408 | gridLayout_6->addWidget(lineEdit_ps_id, 1, 0, 1, 2); 409 | 410 | lineEdit_seg_sAddress = new QLineEdit(widget1); 411 | lineEdit_seg_sAddress->setObjectName(QStringLiteral("lineEdit_seg_sAddress")); 412 | 413 | gridLayout_6->addWidget(lineEdit_seg_sAddress, 3, 0, 1, 2); 414 | 415 | lineEdit_seg_id = new QLineEdit(widget1); 416 | lineEdit_seg_id->setObjectName(QStringLiteral("lineEdit_seg_id")); 417 | 418 | gridLayout_6->addWidget(lineEdit_seg_id, 5, 0, 1, 2); 419 | 420 | tabWidget->addTab(tab, QString()); 421 | 422 | gridLayout->addWidget(tabWidget, 0, 0, 1, 1); 423 | 424 | 425 | retranslateUi(MemoryWindow); 426 | 427 | tabWidget->setCurrentIndex(4); 428 | 429 | 430 | QMetaObject::connectSlotsByName(MemoryWindow); 431 | } // setupUi 432 | 433 | void retranslateUi(QWidget *MemoryWindow) 434 | { 435 | MemoryWindow->setWindowTitle(QApplication::translate("MemoryWindow", "\345\206\205\345\255\230-\350\277\233\347\250\213\347\256\241\347\220\206", 0)); 436 | label_3->setText(QApplication::translate("MemoryWindow", "\350\277\233\347\250\213\345\220\215", 0)); 437 | label_4->setText(QApplication::translate("MemoryWindow", "\350\277\233\347\250\213\346\256\265\346\200\273\346\225\260", 0)); 438 | QTableWidgetItem *___qtablewidgetitem = tableWidget_ps_Section->horizontalHeaderItem(0); 439 | ___qtablewidgetitem->setText(QApplication::translate("MemoryWindow", "\346\256\265\345\244\247\345\260\217", 0)); 440 | btnNewPS->setText(QApplication::translate("MemoryWindow", "\345\210\233\345\273\272\346\226\260\350\277\233\347\250\213", 0)); 441 | btnSegSize->setText(QApplication::translate("MemoryWindow", "\347\241\256\350\256\244", 0)); 442 | tabWidget->setTabText(tabWidget->indexOf(tab_1), QApplication::translate("MemoryWindow", "\347\224\263\350\257\267\345\206\205\345\255\230", 0)); 443 | label->setText(QApplication::translate("MemoryWindow", "\350\257\267\350\276\223\345\205\245\350\277\233\347\250\213\345\217\267", 0)); 444 | btnRecycle->setText(QApplication::translate("MemoryWindow", "\346\211\247\350\241\214", 0)); 445 | tabWidget->setTabText(tabWidget->indexOf(tab_2), QApplication::translate("MemoryWindow", "\345\233\236\346\224\266\345\206\205\345\255\230", 0)); 446 | label_2->setText(QApplication::translate("MemoryWindow", "\345\206\205\345\255\230\345\244\247\345\260\217", 0)); 447 | label_5->setText(QApplication::translate("MemoryWindow", "\346\200\273\345\235\227\346\225\260", 0)); 448 | label_6->setText(QApplication::translate("MemoryWindow", "\346\257\217\345\235\227\345\244\247\345\260\217", 0)); 449 | label_7->setText(QApplication::translate("MemoryWindow", "\345\267\262\345\210\206\351\205\215\345\206\205\345\255\230\345\235\227\350\257\246\346\203\205", 0)); 450 | QTableWidgetItem *___qtablewidgetitem1 = tableWidget_memList->horizontalHeaderItem(0); 451 | ___qtablewidgetitem1->setText(QApplication::translate("MemoryWindow", "\350\277\233\347\250\213\345\220\215", 0)); 452 | QTableWidgetItem *___qtablewidgetitem2 = tableWidget_memList->horizontalHeaderItem(1); 453 | ___qtablewidgetitem2->setText(QApplication::translate("MemoryWindow", "\350\277\233\347\250\213\345\217\267", 0)); 454 | QTableWidgetItem *___qtablewidgetitem3 = tableWidget_memList->horizontalHeaderItem(2); 455 | ___qtablewidgetitem3->setText(QApplication::translate("MemoryWindow", "\350\277\233\347\250\213\346\256\265\345\217\267", 0)); 456 | QTableWidgetItem *___qtablewidgetitem4 = tableWidget_memList->horizontalHeaderItem(3); 457 | ___qtablewidgetitem4->setText(QApplication::translate("MemoryWindow", "\351\241\265\345\217\267", 0)); 458 | QTableWidgetItem *___qtablewidgetitem5 = tableWidget_memList->horizontalHeaderItem(4); 459 | ___qtablewidgetitem5->setText(QApplication::translate("MemoryWindow", "\345\235\227\345\217\267", 0)); 460 | label_MemCount->setText(QApplication::translate("MemoryWindow", "\345\205\261\345\215\240\347\224\250", 0)); 461 | btnViewMem->setText(QApplication::translate("MemoryWindow", "\344\277\241\346\201\257\346\237\245\350\257\242", 0)); 462 | tabWidget->setTabText(tabWidget->indexOf(tab_3), QApplication::translate("MemoryWindow", "\345\206\205\345\255\230\346\230\276\347\244\272", 0)); 463 | groupBox->setTitle(QApplication::translate("MemoryWindow", "\350\277\233\347\250\213\344\277\241\346\201\257", 0)); 464 | label_ps_name->setText(QApplication::translate("MemoryWindow", "\350\277\233\347\250\213\345\220\215", 0)); 465 | label_ps_id->setText(QApplication::translate("MemoryWindow", "\350\277\233\347\250\213\345\217\267", 0)); 466 | QTableWidgetItem *___qtablewidgetitem6 = tableWidget_sectionList->horizontalHeaderItem(0); 467 | ___qtablewidgetitem6->setText(QApplication::translate("MemoryWindow", "\346\256\265\345\217\267", 0)); 468 | QTableWidgetItem *___qtablewidgetitem7 = tableWidget_sectionList->horizontalHeaderItem(1); 469 | ___qtablewidgetitem7->setText(QApplication::translate("MemoryWindow", "\346\256\265\345\244\247\345\260\217", 0)); 470 | QTableWidgetItem *___qtablewidgetitem8 = tableWidget_sectionList->horizontalHeaderItem(2); 471 | ___qtablewidgetitem8->setText(QApplication::translate("MemoryWindow", "\346\230\257\345\220\246\345\234\250\345\206\205\345\255\230", 0)); 472 | QTableWidgetItem *___qtablewidgetitem9 = tableWidget_pageList->horizontalHeaderItem(0); 473 | ___qtablewidgetitem9->setText(QApplication::translate("MemoryWindow", "\351\241\265\345\217\267", 0)); 474 | QTableWidgetItem *___qtablewidgetitem10 = tableWidget_pageList->horizontalHeaderItem(1); 475 | ___qtablewidgetitem10->setText(QApplication::translate("MemoryWindow", "\351\241\265\345\206\205\345\201\217\347\247\273", 0)); 476 | QTableWidgetItem *___qtablewidgetitem11 = tableWidget_pageList->horizontalHeaderItem(2); 477 | ___qtablewidgetitem11->setText(QApplication::translate("MemoryWindow", "\345\235\227\345\217\267", 0)); 478 | QTableWidgetItem *___qtablewidgetitem12 = tableWidget_pageList->horizontalHeaderItem(3); 479 | ___qtablewidgetitem12->setText(QApplication::translate("MemoryWindow", "\346\230\257\345\220\246\345\255\230\345\234\250\345\206\205\345\255\230", 0)); 480 | label_9->setText(QApplication::translate("MemoryWindow", "\350\257\267\350\276\223\345\205\245\350\246\201\346\230\276\347\244\272\345\276\227\350\277\233\347\250\213\345\217\267", 0)); 481 | btnQueryPSInfo->setText(QApplication::translate("MemoryWindow", "\346\237\245\350\257\242", 0)); 482 | tabWidget->setTabText(tabWidget->indexOf(tab_4), QApplication::translate("MemoryWindow", "\350\277\233\347\250\213\351\241\265\350\241\250\346\230\276\347\244\272", 0)); 483 | label_12->setText(QApplication::translate("MemoryWindow", "\350\257\267\350\276\223\345\205\245\350\246\201\346\230\276\347\244\272\345\276\227\350\277\233\347\250\213\345\217\267", 0)); 484 | label_13->setText(QApplication::translate("MemoryWindow", "\350\257\267\350\276\223\345\205\245\346\256\265\350\241\250\350\265\267\345\247\213\345\234\260\345\235\200", 0)); 485 | label_14->setText(QApplication::translate("MemoryWindow", "\350\257\267\350\276\223\345\205\245\346\256\265\345\217\267", 0)); 486 | label_15->setText(QApplication::translate("MemoryWindow", "\350\257\267\350\276\223\345\205\245\351\241\265\345\217\267", 0)); 487 | btnPageID->setText(QApplication::translate("MemoryWindow", "\346\237\245\350\257\242", 0)); 488 | tabWidget->setTabText(tabWidget->indexOf(tab), QApplication::translate("MemoryWindow", "\345\234\260\345\235\200\350\275\254\346\215\242", 0)); 489 | } // retranslateUi 490 | 491 | }; 492 | 493 | namespace Ui { 494 | class MemoryWindow: public Ui_MemoryWindow {}; 495 | } // namespace Ui 496 | 497 | QT_END_NAMESPACE 498 | 499 | #endif // UI_MEMORYWINDOW_H 500 | -------------------------------------------------------------------------------- /OS_UI/MemoryWindow.cpp: -------------------------------------------------------------------------------- 1 | #include "MemoryWindow.h" 2 | #include 3 | #include 4 | #include 5 | #ifdef __linux__ 6 | #include 7 | #endif 8 | #include 9 | #include 10 | #include "KWidgetUtils.h" 11 | #include "define.h" 12 | 13 | extern memory memory_info; 14 | extern pcb process; 15 | extern int BLOCK;//页框大小 16 | extern int remained;//剩余的内存 17 | extern int Register;//段表的起始地址 18 | extern int Flash; //内存大小 19 | extern int total_process;//进程总数 20 | extern memory memory_info;//申明一个记录内存信息的链表 21 | extern int InterruptType;//中断类型,1表示缺段中断,0表示缺页中断 22 | 23 | using namespace std; 24 | 25 | MemoryWindow::MemoryWindow(QWidget *parent) 26 | : QDialog(parent) 27 | { 28 | m_ui.setupUi(this); 29 | Init(); 30 | } 31 | 32 | MemoryWindow::~MemoryWindow() 33 | { 34 | } 35 | 36 | void MemoryWindow::Init() 37 | { 38 | InitUI(); 39 | InitConnections(); 40 | } 41 | 42 | void MemoryWindow::InitUI() 43 | { 44 | } 45 | 46 | void MemoryWindow::InitConnections() 47 | { 48 | connect(m_ui.btnPageID, SIGNAL(clicked()), this, SLOT(AddressExchange())); 49 | //connect(m_ui.btnQueryPID, SIGNAL(clicked()), this, SLOT(OnQueryPID())); 50 | connect(m_ui.btnNewPS, SIGNAL(clicked()), this, SLOT(OnCreatePS())); 51 | connect(m_ui.btnSegSize, SIGNAL(clicked()), this, SLOT(OnSegNum())); 52 | connect(m_ui.btnRecycle, SIGNAL(clicked()), this, SLOT(OnRecyle())); 53 | //connect(m_ui.btnQuerySegStart, SIGNAL(clicked()), this, SLOT(OnQuerySegStart())); 54 | connect(m_ui.btnQueryPSInfo, SIGNAL(clicked()), this, SLOT(OnQueryPSInfo())); 55 | //connect(m_ui.btnSegNum, SIGNAL(clicked()), this, SLOT(OnQuerySegNum())); 56 | connect(m_ui.btnViewMem, SIGNAL(clicked()), this, SLOT(OnPrintMemory())); 57 | 58 | connect(m_ui.tableWidget_sectionList, SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(OnViewPageInfo(QTableWidgetItem *))); 59 | 60 | } 61 | 62 | 63 | void MemoryWindow::LoadData() 64 | { 65 | } 66 | 67 | void MemoryWindow::OnSegNum() 68 | { 69 | int p_segNum = UIQuery::GetValue(m_ui.lineEdit_ps_SegNum).toInt(); 70 | m_ui.tableWidget_ps_Section->clearContents(); 71 | m_ui.tableWidget_ps_Section->setRowCount(p_segNum); 72 | for (int i=0;i setRowHeight(i, 32); 75 | m_ui.tableWidget_ps_Section->setItem(i, 0, new QTableWidgetItem("809200")); 76 | } 77 | } 78 | 79 | void MemoryWindow::Enter() 80 | { 81 | show(); 82 | setFocus(); 83 | activateWindow(); 84 | exec(); 85 | } 86 | 87 | void MemoryWindow::Exit() 88 | { 89 | close(); 90 | } 91 | 92 | 93 | 94 | void MemoryWindow::OnCreatePS() 95 | { 96 | ProcessUnit ps; 97 | ps.name = UIQuery::GetValue(m_ui.lineEdit_ps_name); 98 | ps.totalSeg = UIQuery::GetValue(m_ui.lineEdit_ps_SegNum).toInt(); 99 | for (int i =0;iitem(i,0)->text().toInt(); 102 | ps.segSizeList << QString::number(sz); 103 | } 104 | Apply(ps); 105 | } 106 | 107 | //手动申请内存 108 | void MemoryWindow::Apply(ProcessUnit ps) 109 | { 110 | PCB* p, * s; 111 | Seg* m = NULL, * n; 112 | Pa* r = NULL, * t; 113 | Memory* mer; 114 | mer = memory_info->next; 115 | int max; 116 | int j; 117 | int k; 118 | int sum = 0;//记录进程的大小 119 | //printf("请输入进程名:"); 120 | s = (PCB*)malloc(sizeof(PCB)); 121 | //scanf("%s", s->name); 122 | memcpy(s->name,ps.name.toStdString().c_str(),ps.name.size()+1); 123 | p = process; 124 | while (p->next != NULL) 125 | p = p->next; 126 | s->ID = p->ID + 1; 127 | s->total_segmet = ps.totalSeg; 128 | //printf("\n请输入该进程总段数:"); 129 | //scanf("%d", &s->total_segmet); 130 | InitSegment(&s->segm); 131 | n = s->segm; 132 | for (j = 0; j < s->total_segmet; j++) 133 | { 134 | m = (Seg*)malloc(sizeof(Seg)); 135 | //printf("\n请输入第%d个段的段大小: ", j + 1); 136 | //scanf("%d", &m->size); 137 | m->size = ps.segSizeList[j].toInt(); 138 | sum += m->size; 139 | m->ID = j; 140 | m->in_out = 'N'; 141 | InitPage(&m->page); 142 | t = m->page; 143 | for (k = 0; k < m->size / BLOCK; k++) 144 | { 145 | r = (Pa*)malloc(sizeof(Pa)); 146 | r->block_num = -1; 147 | r->ID = k; 148 | r->in_out = 'N'; 149 | r->time = 0; 150 | r->pageOffset = 0; 151 | t->next = r; 152 | t = t->next; 153 | t->next = NULL; 154 | } 155 | n->next = m; 156 | n = n->next; 157 | n->next = NULL; 158 | } 159 | //判断是否合法 160 | if (sum > remained) 161 | { 162 | UIQuery::Alert("申请空间过大,请重新申请!"); 163 | sum = 0; 164 | //释放空间 165 | free(r); 166 | free(m); 167 | free(s); 168 | } 169 | else//从内存中选择空闲块给该进程 170 | { 171 | p->next = s; 172 | p = p->next; 173 | p->next = NULL; 174 | n = p->segm->next; 175 | max = mer->recently; 176 | while (mer != NULL) 177 | { 178 | if (mer->recently > max) 179 | { 180 | max = mer->recently; 181 | mer = mer->next; 182 | } 183 | else mer = mer->next; 184 | } 185 | mer = memory_info->next; 186 | for (j = 0; j < p->total_segmet; j++) 187 | { 188 | n->in_out = 'Y'; 189 | t = n->page->next; 190 | for (k = 0; k < n->size / BLOCK; k++) 191 | { 192 | t->in_out = 'Y'; 193 | t->time += 1; 194 | //查找memory空间,找到未分配的空间 195 | while (mer->allocated != 'N') 196 | mer = mer->next; 197 | t->block_num = mer->ID; 198 | mer->allocated = 'Y'; 199 | mer->recently = max + 1; 200 | mer->Process_ID = p->ID; 201 | mer->Segment_ID = n->ID; 202 | mer->Page_ID = t->ID; 203 | mer->time_in_memory = t->time; 204 | strcpy(mer->name, p->name); 205 | t->pageOffset = t->ID + t->block_num; 206 | if (t->pageOffset >= Flash) 207 | t->pageOffset -= Flash; 208 | mer = memory_info->next; 209 | t = t->next; 210 | } 211 | n = n->next; 212 | } 213 | remained -= sum; 214 | total_process++; 215 | } 216 | } 217 | 218 | //内存回收 219 | void MemoryWindow::Recycle(int ID) 220 | { 221 | Memory* mer; 222 | PCB* p; 223 | Seg* s; 224 | Pa* q; 225 | //int ID;//要回收的进程号 226 | //printf("请输入进程号:\n"); 227 | //scanf("%d", &ID); 228 | //修改内存信息 229 | mer = memory_info->next; 230 | while (mer != NULL) 231 | { 232 | if (mer->Process_ID == ID) 233 | { 234 | mer->allocated = 'N'; 235 | mer->Page_ID = -1; 236 | mer->Process_ID = -1; 237 | mer->Segment_ID = -1; 238 | mer->recently = 0; 239 | mer->time_in_memory = 0; 240 | remained += BLOCK; 241 | mer = mer->next; 242 | } 243 | else 244 | mer = mer->next; 245 | } 246 | //修改进程信息 247 | p = process->next; 248 | while (p != NULL) 249 | { 250 | if (p->ID == ID) 251 | { 252 | s = p->segm->next; 253 | while (s != NULL) 254 | { 255 | q = s->page->next; 256 | while (q != NULL) 257 | { 258 | s->in_out = 'N'; 259 | q->in_out = 'N'; 260 | q->pageOffset = 0; 261 | q->block_num = -1; 262 | q->time = 0; 263 | q->Process_ID = -1; 264 | q->Segment_ID = -1; 265 | q = q->next; 266 | } 267 | s = s->next; 268 | } 269 | break; 270 | } 271 | else 272 | p = p->next; 273 | } 274 | } 275 | 276 | void MemoryWindow::OnRecyle() 277 | { 278 | int ID = UIQuery::GetValue(m_ui.lineEdit_pid_2).toInt(); 279 | Recycle(ID); 280 | } 281 | 282 | 283 | 284 | void MemoryWindow::OnQueryPSInfo() 285 | { 286 | int pid = UIQuery::GetValue(m_ui.lineEdit_ps_pid).toInt(); 287 | PrintProcessSegment(pid); 288 | } 289 | 290 | //打印进程段表信息 291 | void MemoryWindow::PrintProcessSegment(int j) 292 | { 293 | int i; 294 | PCB* pro; 295 | Seg* p; 296 | Pa* s; 297 | pro = process->next; 298 | //printf("\n请输入要显示的进程号信息:"); 299 | //scanf("%d", &j); 300 | while (pro != NULL) 301 | { 302 | if (pro->ID == j) 303 | break; 304 | else 305 | pro = pro->next; 306 | } 307 | if (pro == NULL) 308 | { 309 | printf("\nERROR\n"); 310 | UIQuery::Alert("未找到目标进程号"); 311 | return; 312 | } 313 | 314 | p = pro->segm->next; 315 | printf("\n进程信息:\n"); 316 | //printf("进程名:%s", pro->name); 317 | UIQuery::SetValue(m_ui.label_ps_name,QString("Process Name:%1").arg( pro->name)); 318 | //printf("\n进程号:%d\n\n", pro->ID); 319 | UIQuery::SetValue(m_ui.label_ps_id,QString("Process ID:%1").arg( pro->ID)); 320 | 321 | m_segList.clear(); 322 | m_blockMap.clear(); 323 | while (p != NULL) 324 | { 325 | s = p->page->next; 326 | SegUnit unit; 327 | unit.ID = p->ID; 328 | unit.size = p->size; 329 | unit.in_out = p->in_out; 330 | 331 | m_segList.push_back(unit); 332 | 333 | //printf("段号:%d\t段大小:%d\t是否在内存:%c\n", p->ID, p->size, p->in_out); 334 | //printf("段内页表:\n"); 335 | 336 | vector pgList; 337 | pgList.clear(); 338 | for (i = 0; i < p->size / BLOCK; i++) 339 | { 340 | PageUnit pUnit; 341 | printf("页号:%d\t页内偏移:%d\t块号:%d\t是否存在内存:%c\n", s->ID, s->pageOffset, s->block_num, s->in_out); 342 | pUnit.ID = s->ID; 343 | pUnit.pageOffset = s->pageOffset; 344 | pUnit.block_num = s->block_num; 345 | pUnit.in_out = s->in_out; 346 | s = s->next; 347 | pgList.push_back(pUnit); 348 | } 349 | m_blockMap.insert(make_pair(p->ID,pgList)); 350 | printf("\n"); 351 | p = p->next; 352 | } 353 | 354 | m_ui.tableWidget_sectionList->clearContents(); 355 | int seg_sz = m_segList.size(); 356 | m_ui.tableWidget_sectionList->setRowCount(seg_sz); 357 | for (int i =0;isetRowHeight(i, 32); 360 | m_ui.tableWidget_sectionList->setItem(i, 0, new QTableWidgetItem(QString::number(m_segList[i].ID))); 361 | m_ui.tableWidget_sectionList->setItem(i, 1, new QTableWidgetItem(QString::number(m_segList[i].size))); 362 | m_ui.tableWidget_sectionList->setItem(i, 2, new QTableWidgetItem(m_segList[i].in_out)); 363 | } 364 | } 365 | 366 | void MemoryWindow::OnViewPageInfo(QTableWidgetItem *) 367 | { 368 | int row = m_ui.tableWidget_sectionList->currentRow(); 369 | if (row < 0 || row >= m_segList.size()) 370 | { 371 | return; 372 | } 373 | 374 | int seg_id = m_segList[row].ID; 375 | if (m_blockMap.find(seg_id) == m_blockMap.end()) 376 | { 377 | return; 378 | } 379 | 380 | auto blockList = m_blockMap[seg_id]; 381 | int sz = blockList.size(); 382 | 383 | m_ui.tableWidget_pageList->clearContents(); 384 | m_ui.tableWidget_pageList->setRowCount(sz); 385 | 386 | for (int i =0;isetRowHeight(i, 32); 389 | m_ui.tableWidget_pageList->setItem(i, 0, new QTableWidgetItem(QString::number(blockList[i].ID))); 390 | m_ui.tableWidget_pageList->setItem(i, 1, new QTableWidgetItem(QString::number(blockList[i].pageOffset))); 391 | m_ui.tableWidget_pageList->setItem(i, 2, new QTableWidgetItem(QString::number(blockList[i].block_num))); 392 | m_ui.tableWidget_pageList->setItem(i, 3, new QTableWidgetItem(blockList[i].in_out)); 393 | } 394 | } 395 | 396 | 397 | //打印内存分配信息 398 | void MemoryWindow::OnPrintMemory() 399 | { 400 | int flag = 1; 401 | PCB* p; 402 | Seg* s; 403 | Memory* m; 404 | Pa* pag; 405 | p = process->next; 406 | m = memory_info->next; 407 | s = p->segm->next; 408 | pag = s->page->next; 409 | //printf("\n内存大小为:%d", Flash); 410 | UIQuery::SetValue(m_ui.lineEdit_memSize,QString::number(Flash)); 411 | //printf("\t总共分成了%d块,每块为:%d", , BLOCK); 412 | UIQuery::SetValue(m_ui.lineEdit_tBlocks,QString::number(Flash / BLOCK)); 413 | UIQuery::SetValue(m_ui.lineEdit_bSize,QString::number(BLOCK)); 414 | printf("\n已分配的内存块情况为:"); 415 | vector memList; 416 | memList.clear(); 417 | while (m != NULL) 418 | { 419 | if (m->allocated == 'Y') 420 | { 421 | //printf("\n进程名\t进程号\t进程段号\t页号\t块号\n"); 422 | printf("%s\t%d\t%d\t\t%d\t%d\n", m->name, m->Process_ID, m->Segment_ID, m->Page_ID, m->ID); 423 | MemUnit unit; 424 | unit.name = m->name; 425 | unit.pid =m->Process_ID; 426 | unit.seg_id = m->Segment_ID; 427 | unit.page_id =m->Page_ID; 428 | unit.block_id =m->ID; 429 | memList.push_back(unit); 430 | m = m->next; 431 | } 432 | else 433 | m = m->next; 434 | } 435 | 436 | m_ui.tableWidget_memList->clearContents(); 437 | int sz = memList.size(); 438 | m_ui.tableWidget_memList->setRowCount(sz); 439 | for (int i =0;isetRowHeight(i, 32); 442 | // 443 | m_ui.tableWidget_memList->setItem(i, 0, new QTableWidgetItem(memList[i].name)); 444 | m_ui.tableWidget_memList->setItem(i, 1, new QTableWidgetItem(QString::number(memList[i].pid))); 445 | m_ui.tableWidget_memList->setItem(i, 2, new QTableWidgetItem(QString::number(memList[i].seg_id))); 446 | m_ui.tableWidget_memList->setItem(i, 3, new QTableWidgetItem(QString::number(memList[i].page_id))); 447 | m_ui.tableWidget_memList->setItem(i, 4, new QTableWidgetItem(QString::number(memList[i].block_id))); 448 | } 449 | //printf("\n共占用%d块内存块,剩余%d块.\n", (Flash - remained) / BLOCK, remained / BLOCK); 450 | UIQuery::SetValue(m_ui.label_MemCount,QString("totally used %1 memory block(s), %2 remains").arg((Flash - remained) / BLOCK).arg(remained / BLOCK)); 451 | } 452 | 453 | 454 | //地址转换 455 | void MemoryWindow::AddressExchange() 456 | { 457 | int ID = UIQuery::GetValue(m_ui.lineEdit_ps_id).toInt();//进程ID 458 | int i = UIQuery::GetValue(m_ui.lineEdit_seg_id).toInt(); //段号 459 | int j = UIQuery::GetValue(m_ui.lineEdit_page_id).toInt();//页号 460 | Register = UIQuery::GetValue(m_ui.lineEdit_seg_sAddress).toInt(); 461 | 462 | int address;//物理地址 463 | int flag = 1;//用来标记输入是否合法 464 | PCB* p; 465 | Seg* s; 466 | Pa* q; 467 | Memory* mer; 468 | p = process->next; 469 | mer = memory_info->next; 470 | if (ID >= total_process) 471 | { 472 | printf("\n输入不合法!请重新输入!\n"); 473 | UIQuery::Alert("Illegal input! Please enter again!"); 474 | return; 475 | } 476 | 477 | //printf("\n请输入段表起始地址:"); 478 | //scanf("%d", &Register); 479 | //flag = 1; 480 | // printf("\n请输入段号:"); 481 | // scanf("%d", &i); 482 | //找到进程号为ID的进程 483 | p = process->next; 484 | while (p->ID != ID) 485 | p = p->next; 486 | if (p->total_segmet <= i) 487 | { 488 | printf("\n输入不合法!请重新输入!\n"); 489 | UIQuery::Alert("Illegal input! Please enter again!"); 490 | return; 491 | } 492 | 493 | //找到段 494 | s = p->segm->next; 495 | while (s->ID != i) 496 | s = s->next; 497 | if (j >= s->size / BLOCK) 498 | { 499 | printf("\n输入不合法!请重新输入!\n"); 500 | UIQuery::Alert("Illegal input! Please enter again!"); 501 | return; 502 | } 503 | QStringList log; 504 | //判断是否缺段 505 | //查找进程的段表 506 | while (p->ID != ID) 507 | p = p->next; 508 | s = p->segm->next; 509 | //找到段号为i的段 510 | while (s->ID != i) 511 | s = s->next; 512 | if (s->in_out == 'N') 513 | { 514 | InterruptType = 1; 515 | printf("\n缺段中断!"); 516 | log << "Missing segment interrupt!"; 517 | Sleep(2000); 518 | log << InterruptHanding(ID, i, j); 519 | } 520 | //判断是否缺页中断 521 | else 522 | { 523 | //找到页号为j的页 524 | q = s->page->next; 525 | while (q->ID != j) 526 | q = q->next; 527 | if (q->in_out == 'N') 528 | { 529 | InterruptType = 0; 530 | printf("\n缺页中断!"); 531 | log << "Missing page interrupt!"; 532 | Sleep(2000); 533 | log << InterruptHanding(ID, i, j); 534 | } 535 | else 536 | { 537 | q->time += 1; 538 | //改变访问内存块的最近时间 539 | mer = memory_info->next; 540 | while (mer->Page_ID != j) 541 | { 542 | mer = mer->next; 543 | } 544 | mer->recently += 1; 545 | address = Register + q->block_num * BLOCK + q->pageOffset - 1; 546 | //printf("\n物理地址为:%d", address); 547 | log << QString("physical address: %1").arg(address); 548 | printf("\n"); 549 | } 550 | } 551 | 552 | UIQuery::SetValue(m_ui.textEdit_log,log.join("\n")); 553 | } 554 | 555 | //中断处理 556 | QString MemoryWindow::InterruptHanding(int id, int i, int j) 557 | { 558 | QStringList rList; 559 | char name[10];//置换出来的进程名 560 | int ID;//置换出来的进程ID 561 | int segment_ID;//置换出来的段号ID 562 | int page_ID;//置换出来的页号 563 | int enough = 0;//标记内存空间是否足够 564 | int min; 565 | int address; 566 | PCB* p; 567 | Seg* s; 568 | Pa* q; 569 | Memory* mer, * temp; 570 | if (InterruptType == 1)//缺段中断 571 | { 572 | //找到该段和该段的页,若没有足够的空间,用LRU法置换 573 | p = process->next; 574 | //找到该进程 575 | while (p->ID != id) 576 | p = p->next; 577 | s = p->segm->next; 578 | //找到该段 579 | while (s->ID != i) 580 | s = s->next; 581 | //将该段放入内存 582 | s->in_out = 'Y'; 583 | //找到该页 584 | q = s->page->next; 585 | while (q->ID != j) 586 | q = q->next; 587 | //将该页放入内存,首先判断内存空间是否足够 588 | mer = memory_info->next; 589 | if (remained >= BLOCK)//空间够 590 | { 591 | //找到内存中空闲块分配给该页 592 | enough = 1; 593 | while (mer->allocated != 'N') 594 | mer = mer->next; 595 | mer->allocated = 'Y'; 596 | mer->Page_ID = j; 597 | mer->Process_ID = id; 598 | strcpy(mer->name, p->name); 599 | mer->Segment_ID = i; 600 | q->block_num = mer->ID; 601 | q->Process_ID = id; 602 | q->Segment_ID = i; 603 | q->time++; 604 | mer->time_in_memory = q->time; 605 | strcpy(q->name, p->name); 606 | q->in_out = 'Y'; 607 | q->pageOffset = q->ID + mer->ID; 608 | if (q->pageOffset >= Flash) 609 | q->pageOffset -= Flash; 610 | address = Register + q->block_num * BLOCK + q->pageOffset - 1; 611 | remained -= BLOCK; 612 | temp = mer; 613 | //修改recently 614 | mer = memory_info->next; 615 | int max = mer->recently; 616 | while (mer != NULL) 617 | { 618 | if (mer->recently > max) 619 | { 620 | max = mer->recently; 621 | mer = mer->next; 622 | } 623 | else mer = mer->next; 624 | } 625 | temp->recently = max + 1; 626 | //内存中的所有页时间加1 627 | mer = memory_info->next; 628 | while (mer != NULL) 629 | { 630 | if (mer->Process_ID == id && mer->Segment_ID == i && mer->Page_ID == j) 631 | mer = mer->next; 632 | else if (mer->allocated == 'Y') 633 | { 634 | //修改进程链表 635 | p = process->next; 636 | while (p->ID != mer->Process_ID) 637 | p = p->next; 638 | s = p->segm->next; 639 | while (s->ID != mer->Segment_ID) 640 | s = s->next; 641 | q = s->page->next; 642 | while (q->ID != mer->Page_ID) 643 | q = q->next; 644 | q->time++; 645 | mer->time_in_memory = q->time; 646 | mer = mer->next; 647 | } 648 | else mer = mer->next; 649 | } 650 | } 651 | else// 空间不够,内存已占满 652 | { 653 | //利用LRU淘汰内存中的页 654 | //遍历表,查找占用内存时间最长的块,即recently最小 655 | enough = 0; 656 | mer = memory_info->next; 657 | temp = memory_info->next; 658 | min = mer->recently; 659 | while (mer != NULL) 660 | { 661 | if (mer->allocated == 'Y') 662 | { 663 | if (mer->recently < min) 664 | { 665 | temp = mer; 666 | min = mer->time_in_memory; 667 | mer = mer->next; 668 | } 669 | else 670 | mer = mer->next; 671 | } 672 | else 673 | mer = mer->next; 674 | } 675 | strcpy(name, temp->name); 676 | ID = temp->Process_ID; 677 | segment_ID = temp->Segment_ID; 678 | page_ID = temp->Page_ID; 679 | //将temp指向的进程的信息置换出内存 680 | //找到该进程号 681 | p = process->next; 682 | while (p->ID != temp->Process_ID) 683 | p = p->next; 684 | //找到该进程的段号 685 | s = p->segm->next; 686 | while (s->ID != temp->Segment_ID) 687 | s = s->next; 688 | //找到该进程的页号 689 | q = s->page->next; 690 | while (q->ID != temp->Page_ID) 691 | q = q->next; 692 | //将该页换出 693 | q->block_num = -1; 694 | q->in_out = 'N'; 695 | q->Process_ID = -1; 696 | q->Segment_ID = -1; 697 | q->pageOffset = 0; 698 | q->time = 0; 699 | temp->allocated = 'N'; 700 | temp->time_in_memory = 0; 701 | temp->recently = 0; 702 | temp->Page_ID = -1; 703 | temp->Process_ID = -1; 704 | temp->Segment_ID = -1; 705 | p = process->next; 706 | //找到该进程 707 | while (p->ID != id) 708 | p = p->next; 709 | s = p->segm->next; 710 | //找到该段 711 | while (s->ID != i) 712 | s = s->next; 713 | //将该段放入内存 714 | s->in_out = 'Y'; 715 | //找到该页 716 | q = s->page->next; 717 | while (q->ID != j) 718 | q = q->next; 719 | //将该页放入内存 720 | mer = memory_info->next; 721 | while (mer->allocated != 'N') 722 | mer = mer->next; 723 | mer->allocated = 'Y'; 724 | mer->Page_ID = j; 725 | //mer->recently = 1; 726 | mer->Process_ID = id; 727 | strcpy(mer->name, p->name); 728 | mer->Segment_ID = i; 729 | mer->time_in_memory++; 730 | q->block_num = mer->ID; 731 | q->in_out = 'Y'; 732 | q->time++; 733 | strcpy(q->name, p->name); 734 | q->Process_ID = p->ID; 735 | q->Segment_ID = s->ID; 736 | q->pageOffset = q->ID + mer->ID; 737 | if (q->pageOffset >= Flash) 738 | q->pageOffset -= Flash; 739 | address = Register + q->block_num * BLOCK + q->pageOffset - 1; 740 | temp = mer; 741 | //修改recently 742 | mer = memory_info->next; 743 | int max = mer->recently; 744 | while (mer != NULL) 745 | { 746 | if (mer->recently > max) 747 | { 748 | max = mer->recently; 749 | mer = mer->next; 750 | } 751 | else mer = mer->next; 752 | } 753 | temp->recently = max + 1; 754 | //内存中的所有页时间加1 755 | mer = memory_info->next; 756 | while (mer != NULL) 757 | { 758 | if (mer->Process_ID == id && mer->Segment_ID == i && mer->Page_ID == j) 759 | mer = mer->next; 760 | else if (mer->allocated == 'Y') 761 | { 762 | //修改进程链表 763 | p = process->next; 764 | while (p->ID != mer->Process_ID) 765 | p = p->next; 766 | s = p->segm->next; 767 | while (s->ID != mer->Segment_ID) 768 | s = s->next; 769 | q = s->page->next; 770 | while (q->ID != mer->Page_ID) 771 | q = q->next; 772 | q->time++; 773 | mer->time_in_memory = q->time; 774 | mer = mer->next; 775 | } 776 | else mer = mer->next; 777 | } 778 | } 779 | printf("\n该段已经调入内存!"); 780 | printf("\n该页已经调入内存!"); 781 | rList << "该页已经调入内存!"; 782 | } 783 | else//缺页中断 784 | { 785 | p = process->next; 786 | //找到该进程 787 | while (p->ID != id) 788 | p = p->next; 789 | s = p->segm->next; 790 | //找到该段 791 | while (s->ID != i) 792 | s = s->next; 793 | //将该段放入内存 794 | s->in_out = 'Y'; 795 | //找到该页 796 | q = s->page->next; 797 | while (q->ID != j) 798 | q = q->next; 799 | //查看内存情况 800 | mer = memory_info->next; 801 | if (remained >= BLOCK)//空间足够 802 | { 803 | enough = 1; 804 | //找到内存中空闲块分配给该页 805 | while (mer->allocated != 'N') 806 | mer = mer->next; 807 | mer->allocated = 'Y'; 808 | mer->Page_ID = j; 809 | mer->Process_ID = id; 810 | strcpy(mer->name, p->name); 811 | mer->Segment_ID = i; 812 | mer->time_in_memory++; 813 | q->block_num = mer->ID; 814 | q->Process_ID = id; 815 | q->Segment_ID = i; 816 | q->time++; 817 | strcpy(q->name, p->name); 818 | q->in_out = 'Y'; 819 | q->pageOffset = q->ID + mer->ID; 820 | if (q->pageOffset >= Flash) 821 | q->pageOffset -= Flash; 822 | address = Register + q->block_num * BLOCK + q->pageOffset - 1; 823 | remained -= BLOCK; 824 | temp = mer; 825 | //修改recently 826 | mer = memory_info->next; 827 | int max = mer->recently; 828 | while (mer != NULL) 829 | { 830 | if (mer->recently > max) 831 | { 832 | max = mer->recently; 833 | mer = mer->next; 834 | } 835 | else mer = mer->next; 836 | } 837 | temp->recently = max + 1; 838 | //内存中的所有页时间加1 839 | mer = memory_info->next; 840 | while (mer != NULL) 841 | { 842 | if (mer->Process_ID == id && mer->Segment_ID == i && mer->Page_ID == j) 843 | mer = mer->next; 844 | else if (mer->allocated == 'Y') 845 | { 846 | //修改进程链表 847 | p = process->next; 848 | while (p->ID != mer->Process_ID) 849 | p = p->next; 850 | s = p->segm->next; 851 | while (s->ID != mer->Segment_ID) 852 | s = s->next; 853 | q = s->page->next; 854 | while (q->ID != mer->Page_ID) 855 | q = q->next; 856 | q->time++; 857 | mer->time_in_memory = q->time; 858 | mer = mer->next; 859 | } 860 | else mer = mer->next; 861 | } 862 | } 863 | else//空间不够,采用LRU置换 864 | { 865 | enough = 0; 866 | //利用LRU淘汰内存中的页 867 | //遍历表,查找最近很少使用的块,即renctly最小的 868 | mer = memory_info->next; 869 | temp = memory_info->next; 870 | min = mer->recently; 871 | while (mer != NULL) 872 | { 873 | if (mer->allocated == 'Y') 874 | { 875 | if (mer->recently < min) 876 | { 877 | temp = mer; 878 | min = mer->time_in_memory; 879 | mer = mer->next; 880 | } 881 | else 882 | mer = mer->next; 883 | } 884 | else 885 | mer = mer->next; 886 | } 887 | strcpy(name, temp->name); 888 | ID = temp->Process_ID; 889 | segment_ID = temp->Segment_ID; 890 | page_ID = temp->Page_ID; 891 | //将temp指向的进程的信息置换出内存 892 | //找到该进程号 893 | p = process->next; 894 | while (p->ID != temp->Process_ID) 895 | p = p->next; 896 | //找到该进程的段号 897 | s = p->segm->next; 898 | while (s->ID != temp->Segment_ID) 899 | s = s->next; 900 | //找到该进程的页号 901 | q = s->page->next; 902 | while (q->ID != temp->Page_ID) 903 | q = q->next; 904 | //将该页换出 905 | q->block_num = -1; 906 | q->in_out = 'N'; 907 | q->Process_ID = -1; 908 | q->Segment_ID = -1; 909 | q->pageOffset = 0; 910 | q->time = 0; 911 | temp->allocated = 'N'; 912 | temp->recently = 0; 913 | temp->time_in_memory = 0; 914 | temp->Page_ID = -1; 915 | temp->Process_ID = -1; 916 | temp->Segment_ID = -1; 917 | p = process->next; 918 | //找到该进程 919 | while (p->ID != id) 920 | p = p->next; 921 | s = p->segm->next; 922 | //找到该段 923 | while (s->ID != i) 924 | s = s->next; 925 | //将该段放入内存 926 | s->in_out = 'Y'; 927 | //找到该页 928 | q = s->page->next; 929 | while (q->ID != j) 930 | q = q->next; 931 | //将该页放入内存 932 | mer = memory_info->next; 933 | while (mer->allocated != 'N') 934 | mer = mer->next; 935 | mer->allocated = 'Y'; 936 | mer->Page_ID = j; 937 | mer->Process_ID = id; 938 | strcpy(mer->name, p->name); 939 | mer->Segment_ID = i; 940 | mer->time_in_memory++; 941 | q->block_num = mer->ID; 942 | q->in_out = 'Y'; 943 | q->time++; 944 | strcpy(q->name, p->name); 945 | q->Process_ID = p->ID; 946 | q->Segment_ID = s->ID; 947 | q->pageOffset = q->ID + mer->ID; 948 | if (q->pageOffset >= Flash) 949 | q->pageOffset -= Flash; 950 | address = Register + q->block_num * BLOCK + q->pageOffset - 1; 951 | temp = mer; 952 | //修改recently 953 | mer = memory_info->next; 954 | int max = mer->recently; 955 | while (mer != NULL) 956 | { 957 | if (mer->recently > max) 958 | { 959 | max = mer->recently; 960 | mer = mer->next; 961 | } 962 | else mer = mer->next; 963 | } 964 | temp->recently = max + 1; 965 | //内存中的所有页时间加1 966 | mer = memory_info->next; 967 | while (mer != NULL) 968 | { 969 | if (mer->Process_ID == id && mer->Segment_ID == i && mer->Page_ID == j) 970 | mer = mer->next; 971 | else if (mer->allocated == 'Y') 972 | { 973 | //修改进程链表 974 | p = process->next; 975 | while (p->ID != mer->Process_ID) 976 | p = p->next; 977 | s = p->segm->next; 978 | while (s->ID != mer->Segment_ID) 979 | s = s->next; 980 | q = s->page->next; 981 | while (q->ID != mer->Page_ID) 982 | q = q->next; 983 | q->time++; 984 | mer->time_in_memory = q->time; 985 | mer = mer->next; 986 | } 987 | else mer = mer->next; 988 | } 989 | } 990 | printf("\n该页已经调入内存!"); 991 | rList << "该页已经调入内存!"; 992 | } 993 | //计算地址 994 | Sleep(2000); 995 | rList << QString("地址为:%1").arg(address); 996 | //printf("\n地址为:%d", address); 997 | //printf("\n"); 998 | if (!enough) 999 | { 1000 | rList << "换出内存的信息:"; 1001 | //printf("\n换出内存的信息:\n"); 1002 | printf("进程名\t进程号\t段号\t页号\n"); 1003 | rList << "进程名\t进程号\t段号\t页号"; 1004 | rList << QString("%1\t%2\t%3\t%4").arg(name).arg(ID).arg(segment_ID).arg(page_ID); 1005 | //printf("%s\t%d\t%d\t%d\n", , , , ); 1006 | } 1007 | return rList.join("\n"); 1008 | } 1009 | 1010 | 1011 | void MemoryWindow::showEvent(QShowEvent *event) 1012 | { 1013 | QDialog::showEvent(event); 1014 | } 1015 | --------------------------------------------------------------------------------