FIFO页面调度算法

这篇文章展示了三个C++程序,分别用于实现FIFO(先进先出)页面替换算法的不同方面。第一个程序模拟了页面调度过程,计算中断次数和缺页率;第二个程序使用循环队列处理数据,展示页面淘汰;第三个程序通过链表操作模拟FIFO算法,计算命中率和缺页数。这些程序探讨了操作系统中内存管理和页面调度的关键概念。
摘要由CSDN通过智能技术生成

参考代码:

#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;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值