参考代码:
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
const int MAXSIZE=20; //作业的个数
int label = 0; //标记此页是否已经装入内存
int input = 0; //用于输入作业号
int storesize = 0; //系统分配的存储块数
int interrupt = 0; //中断次数
int quence[MAXSIZE]; //队列,FIFO算法的主要数据结构
int workstep[MAXSIZE]; //用于记录作业走向
/*初始化*/
for (int i = 0; i < MAXSIZE; i++)
{
quence[i] = -1;
workstep[i] =-1;
}
cout << "请输入存储区块数:";
cin >> storesize;
srand(int(time(0)));
cout << "页面序号"<<":";
for (int j = 0; j < MAXSIZE; j++)
{
input=rand()%10;
workstep[j] = input;
cout<<input<<" ";
}
cout<<endl;
cout << "置换情况如下:\n";
for (int k = 0; k < MAXSIZE; k++)
{
label = 0;
/*看队列中是否有相等的页号或空位置*/
for (int i = 0; i < storesize; i++)
{
/*是否有相等的页号*/
if (quence[i] == workstep[k])
{
cout << "内存中有" << workstep[k] << "号页面,无须中断!\n";
label = 1; //标记此页面已装入内存
break;
}
/*是否有空位置*/
if (quence[i] == -1)
{
quence[i] = workstep[k];
cout << "发生中断,但内存中有空闲区," << workstep[k] << "号页面直接调入!\n";
interrupt++;
label = 1;
break;
}
}
/*上述情况都不成立则调出对首,将调入页面插入对尾*/
if (label == 0)
{
cout << "发生中断,将" << quence[0] << "号页面调出," << workstep[k] << "号装入!\n";
interrupt++;
for (int m = 0; m < storesize; m++)
{
quence[m] = quence[m + 1];
}
quence[storesize - 1] = workstep[k];
}
}
cout << "作业" << MAXSIZE << "个," << "中断" << interrupt << "次," << "缺页率:" << float(interrupt) / float(MAXSIZE) * 100 << "%\n";
}
程序二:
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
#define SIZE 3
struct queue{
int head,rear,len;
int data[SIZE];
};
inline void init(queue *v){
v->len = v->head = v->rear = 0;
}
inline bool empty(queue *v) {
return v->len ? 0 : 1;
}
inline bool full(struct queue *v){
return v->len == SIZE ? 1 : 0;
}
bool pop(queue *v){
if(empty(v))
return 0;
cout<<v->data[v->head];
v->head = (v->head + 1)%SIZE;
v->len--;
return 1;
}
bool push(queue *v,int data){
if(full(v))
return 0;
v->data[v->rear] = data;
v->rear = (v->rear + 1) % SIZE;
v->len++;
return 1;
}
bool seach(queue *v,int data){
if(empty(v))
return 0;
for(int i = 0; i < v->len;i++)
if(v->data[(v->head+i)%SIZE] == data)
return 1;
return 0;
}
void display(queue *v){
if(empty(v))
return;
for(int i = 0; i < v->len;i++)
cout<<v->data[(v->head+i)%SIZE];
cout<<endl;
}
int main(int argc, char** argv) {
queue page_list;
int ok,data[] = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1};
ok = 0;
/*srand(time(0));
for(int i = 0; i < 10 ; i++)
data[i] = rand()%7;*/
init(&page_list);
cout<<"通过模拟程序输出淘汰的页号分别为:";
for(int i = 0; i < sizeof(data)/sizeof(int); i++){
if(seach(&page_list,data[i])){
ok++;
continue;
}
if(full(&page_list))
pop(&page_list);
push(&page_list,data[i]);
}
cout<<"\n命中率为"<<ok<<"/"<<sizeof(data)/sizeof(int)<<endl;
return 0;
}
程序三:
#include <iostream>
#include <string>
using namespace std;
//定义驻留集队列
typedef struct QNode{ //定义结点
string data; //数据域
struct QNode *next; //指针域
}QNode,*QueueNode;
typedef struct{ //定义队列的头
QueueNode front; //队列头指针
QueueNode rear; //队列尾指针
}LinkQueue;
void InitQueue(LinkQueue &Q){ //初始化队列
Q.front = Q.rear = new QNode;
if(!Q.front){
return ;
}
Q.front->next = NULL;
}
void EnQueue(LinkQueue & Q,string e){ //将e插入队列队尾
QueueNode p1 = new QNode;
if(!p1){
return ;
}
p1->data = e;
p1->next = NULL;
Q.rear->next = p1;
Q.rear = p1;
}
string DeQueue(LinkQueue & Q){ //删除队头元素
if(Q.front == Q.rear) //队列为空,直接返回
return NULL;
QueueNode p2 = new QNode;
p2 = Q.front->next;
Q.front->next = p2->next;
if(Q.rear == p2) Q.rear = Q.front;
string temp = p2->data;
delete p2;
return temp; //返回删除的队头元素
}
int QueueLength(LinkQueue &Q){ //计算对列长度函数,返回队列长度
QueueNode p3 = Q.front;
int Qlength = -1; //初始长度为-1
while(p3 != NULL){
p3 = p3->next;
Qlength++;
}
return Qlength;
}
bool FindQueue(LinkQueue &Q,string e){ //遍历队列,看e是否在驻留集队列中,在则返回true
QueueNode q = Q.front;
int flag = 0; //标志变量,1在驻留集队列中,0不在驻留集队列
if(Q.front == Q.rear)
return false;
else{
while(q != NULL){
if(e == q->data)
flag = 1;
q=q->next;
}
if(flag == 1)
return true;
else
return false;
}
}
void FIFO(string pageFrame[], int pageCount, int waitSpace) //利用队列模拟FIFO算法
{
static int hitCount = 0; //记录命中次数
static int missPageCount = 0; //记录缺页次数
string fallPage = ""; //记录淘汰页号
LinkQueue L;
InitQueue(L);
for(int j = 0; j < pageCount; j++){
if(FindQueue(L,pageFrame[j])){
++hitCount;
continue;
}
else if(QueueLength(L) < waitSpace){
EnQueue(L,pageFrame[j]);
++missPageCount;
}
else{
string chars = DeQueue(L);
EnQueue(L,pageFrame[j]);
++missPageCount;
fallPage += chars + " "; //保存淘汰页号hitCount
}
}
cout<<"产生的缺页数为:"<<missPageCount<<endl;
cout<<"淘汰的页号为:"<<fallPage<<endl;
cout<<"命中率为:"<<hitCount<<"/"<<pageCount;
}
int main()
{
int pageCount; //页面数
int waitSpace; //驻留集
cout<<"请输入访问页面总数:"<<endl;
cin>>pageCount;
string *pageFrame = new string [pageCount]; //访问序列串
cout<<"请输入所访问的页面号顺序:"<<endl;
for(int i = 0;i < pageCount; i++)
{
cin>>pageFrame[i];
}
cout<<"请输入驻留集大小:"<<endl;
cin>>waitSpace;
FIFO(pageFrame,pageCount,waitSpace); //调用FIFO()
delete[] pageFrame;
return 0;