#include "dialog.h"
#include "ui_dialog.h"
#include<iterator>
#include <QTableWidget>
#include<QString>
#include <QProcess>
#include<vector>
#include<stdlib.h>
#include<time.h>
#include<iostream>
#include <conio.h>
#include<algorithm>
#include <iomanip>
#include<fstream>
#include <windows.h> //win头文件
#define ProNumber 3
#define runnable 2
#define runningg 1
#define block 3
#define dead 3//进程运行结束
#define error -1
using namespace std;
//中断处理程序运行时不能发生进程切换,
//因为中断处理程序使用当前进程的内核栈......??代表进程运行
//QT自带的代码,声明一个类,将设计出来的ui界面作为该类的一个子对象,在其构造函数中,先完成对子对象的构造,再使用子对象ui调用其setupUi(this)函数实现ui的现实。
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
//假设一条指令运行时间为一个时间单位
//假设从磁盘调页装入内存总时间为一个时间单位
//在cin或cout中指明数制后,该数制将一直有效,直到重新指明使用其他数制。hex oct dec
/*****************************************************全局区*****************************************************/
//进程页表项
class pagetableentry//进程页表页表项(请求式的页表项)
{
public:
int pagenumber;//页号 5位
int framenumber;//页框号 4位
int flag;//驻留标志位 1位
int diskaddress;//外存地址 4位 //不弄一个内页表外页表了个
int changeflag;//修改位 1位 等于1为修改了
int r;//引用位 SCR算法中用到
pagetableentry()
{
r=1;
}
};//一个页表项共16位,一个页表最多32个页表项,页表最多占64B
//快表表项
class tlbentry//快表表项
{
public:
int pagenumber;//页号
int framenumber;//页框号
};
//物理页框
class pageframe
{
public:
pageframe()//初始化
{
counter=0;
flag0=0;
}
int flag0;//该页框是否有页装入的标志
int page;//装入的页面
int counter;//LRU算法中用到的计数器
};
//磁盘块
class diskentry
{
public:
diskentry()
{
dflag=0;
}
int diskaddress;
int dpage;//装入的页面即装入的内容
int dflag;//外存是否页面装入标志位=1为占用
};
vector<int> externstorage(int instructcount, int id);//外存分配函数
vector<vector<pagetableentry> > pgtlist(10);//将各个进程页表放在一起,把他们看做在一个容器里,他们的地址其实是没有联系的 假设页表基址就是在这个容器里的下标
vector<tlbentry> tlb(0);//快表 假设快表中有3个表项
vector<diskentry> disk(500);// 磁盘 假设外存大小500块
vector<pageframe> memorytable(16);//内存分块表 假设主64KB 一页4KB 则内存可分为16块 假设把内存的最后一块分出来专门存放各个进程的页表
ofstream ofile;//文件
vector<pageframe>::iterator it;//定义遍历循环队列的指针
//pcb 模拟
class pcb
{
public:
int i,j;
int state;//进程状态
int pid;//进程标识符
int priority;//进程优先级 数值越小优先级越高
int pagetableaddress;//页表起始地址
int pagetablelength;//页表长度 (页表项个数)
int pagetableentrylen;//页表项长度 16位
int framecount;//已占用的物理块数
int intime;//进程到达时间
int pf[3];//记录占用了哪些物理页框的数组
int instructcount;//指令的数目
//假设一条指令占1页
int instructaddress;//第一条指令的首地址(逻辑地址)
int instructnum;//当前执行到哪条指令
int inss;//当前执行到哪条指令(这里的位置指的是在指令序列容器里的下标)
vector<int> instructorder;//如果这里写vector<int> instructorder(0);报错syntax error:'constant' 因为这样等于初始化了大小 得在构造函数里初始化 或者不初始化
void pcb0()//初始化 如果把初始化写在构造函数里 则在main函数之前会先执行全局变量对象的构造函数 产生错误。。。
{
ofile.open("d:\\lane.txt",ios::app);//打开记录文件,以追加的方式写入 入口调用了Writedown()函数,该文件一定存在了
instructorder.resize(0);
state=runnable;
priority=(rand()%10)+1;
pid=(rand()%100)+1;//rand()%(b-a+1)+a 产生[a,b]之间的随机数 为了让pid最好不相同。。设置的范围稍微大一点
cout<<endl<<"进程id:"<<dec<<pid<<" ";
cout<<endl<<"进程优先级(优先级数值越小优先级越高):"<<dec<<priority<<" ";
ofile<<endl<<"进程id:"<<dec<<pid<<" ";
ofile<<endl<<"进程优先级(优先级数值越小优先级越高):"<<dec<<priority<<" ";
//如果页表放在内存,页表放置的位置是随机的吗 此地址是虚拟地址?页表存放的地址是怎么确定的 而且页表大小现在应该不是确定的 如何挑选出一个合适的位置呢
//先对内存空闲的地方进行检测?--固定把内存最后一块放所有进程的页表了。。进程不能超过2^7
pagetableaddress=(rand()%10);//这里的页表基址是在装有页表基址中的相对位置 0-9
//因为进程的指令数是随机生成的,即页表项大小也是不确定的,页表长度不确定,这里按最大的算,每个进程最大逻辑地址空间为32页,最多32个页表项,每个页表项长度16位,最长64B
cout<<"页表基址为"<<dec<<15000+pagetableaddress*64<<"h"<<" ";//这个值已经是16进制的,不用hex格式输出
ofile<<"页表基址为"<<dec<<15000+pagetableaddress*64<<"h"<<" ";
pagetablelength=32;//其实应该是页表项个数,这样判断越界时候可以通过页号判断。。但是初始化为instructcount会出错。。。
pagetableentrylen=16;//单位是位
framecount=0;//占用的页框刚开始为0
intime=(rand()%10)+1;
cout<<"到达时间:"<<intime<<" ";
ofile<<"到达时间:"<<intime<<" ";
this->pf[0]=-1;//初始化为-1,值为-1就是没有占用物理页框,大于等于0的话,值就代表占用的物理块号
this->pf[1]=-1;
this->pf[2]=-1;
instructcount=(rand()%10)+1;//产生[1,10]条指令
cout<<"指令数:"<<instructcount<<" ";
ofile<<"指令数:"<<instructcount<<" ";
instructaddress=0;//假设一条指令占0800h,第一条指令首地址是虚拟地址 逻辑空间地址连续从0地址开始
/*指令的存放地址是顺序的,如果指令顺序执行,而且按设置的一条指令占1页,就会一直发生缺页中断。。。转换后的页面序列是依次增大的,逻辑地址空间是连续的*/ //假设指令都是零地址指令
instructorder.push_back(0);
for(i=0;i<instructcount-1;i++)//产生指令的随机执行序列 但是序列第一个一定是0号指令
{
j=rand()%instructcount;
instructorder.push_back(j);
}
pgtlist[pagetableaddress].resize(instructcount);
cout<<"页表长度:"<<dec<<pgtlist[pagetableaddress].size()*2<<"B"<<" ";
cout<<endl<<"磁盘分配情况:"<<endl;
ofile<<"页表长度:"<<dec<<pgtlist[pagetableaddress].size()*2<<"B"<<" ";
ofile<<endl<<"磁盘分配情况:"<<endl;
ofile.close();
vector<int> exs=externstorage(instructcount,pid);
instructnum=0;
ofile.open("d:\\lane.txt",ios::app);
for(i=0;i<instructcount;i++)//页表项的页号
{
pgtlist[pagetableaddress][i].pagenumber=i;
pgtlist[pagetableaddress][i].flag=0;//刚开始都不在内存中
pgtlist[pagetableaddress][i].changeflag=0;
}
for( j=0;j<instructcount;j++)
{
pgtlist[pagetableaddress][j].diskaddress=exs[j];
}
for( i=0;i<instructcount;i++)
{
cout<<dec<<"进程页表第"<<i<<"项的外存地址(块号):"<<pgtlist[pagetableaddress][i].diskaddress<<endl;
ofile<<dec<<"进程页表第"<<i<<"项的外存地址(块号):"<<pgtlist[pagetableaddress][i].diskaddress<<endl;
}
cout<<endl<<endl<<endl;
ofile<<endl<<endl<<endl;
ofile.close();
}
};
//全局区
int n;//进程个数
int ptr;//页表基址寄存器(值代表当前活动页表的基址)
int system_time=0;//系统时间,初始化为0
int DISKFLAG;
pcb runningprocess;//在CPU中正在运行的进程
vector<pcb> ReadyQueue(0);//就绪队列,,注意要设为0,因为插入都是从队尾插
vector<pcb> EndQueue(0);//结束队列
vector<pcb> WaitQueue(0);//等待队列
vector<pcb> pcblist(0);//进程 队列
void Writedown()
{
ofile.open("d:\\lane.txt",ios::app);//打开记录文件,以追加的方式写入
if(!ofile)//如果文件不存在,则创建该文件
{
ofstream nfile( "d:\\lane.txt" );
}
cout<<"当前一共有"<<n<<"个进程"<<endl;
ofile<<"当前一共有"<<n<<"个进程"<<endl;
cout<<"生成的进程信息如下:"<<endl;
ofile<<"生成的进程信息如下:"<<endl;
ofile.close();
}
void Writedown2()//写下内存信息
{
ofile.open("d:\\stlane.txt",ios::app);//打开记录文件,以追加的方式写�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
管理系统是一种通过计算机技术实现的用于组织、监控和控制各种活动的软件系统。这些系统通常被设计用来提高效率、减少错误、加强安全性,同时提供数据和信息支持。以下是一些常见类型的管理系统: 学校管理系统: 用于学校或教育机构的学生信息、教职员工信息、课程管理、成绩记录、考勤管理等。学校管理系统帮助提高学校的组织效率和信息管理水平。 人力资源管理系统(HRM): 用于处理组织内的人事信息,包括员工招聘、培训记录、薪资管理、绩效评估等。HRM系统有助于企业更有效地管理人力资源,提高员工的工作效率和满意度。 库存管理系统: 用于追踪和管理商品或原材料的库存。这种系统可以帮助企业避免库存过剩或不足的问题,提高供应链的效率。 客户关系管理系统(CRM): 用于管理与客户之间的关系,包括客户信息、沟通记录、销售机会跟踪等。CRM系统有助于企业更好地理解客户需求,提高客户满意度和保留率。 医院管理系统: 用于管理医院或医疗机构的患者信息、医生排班、药品库存等。这种系统可以提高医疗服务的质量和效率。 财务管理系统: 用于记录和管理组织的财务信息,包括会计凭证、财务报表、预算管理等。财务管理系统
资源推荐
资源详情
资源评论
收起资源包目录
计算机虚拟页式存储管理系统的仿真实现 .zip (6个子文件)
SJT-code
.gitattributes 66B
code
dialog.ui 10KB
dialog.cpp 45KB
main.cpp 313B
dialog.h 449B
lanelane.pro 980B
共 6 条
- 1
资源评论
JJJ69
- 粉丝: 6010
- 资源: 5613
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功