⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qqfy.cpp

📁 模拟操作系统管理内存方法
💻 CPP
字号:
// QQFY.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "iostream.h"
#include "windows.h"
#define size 64
//--------------------------------------------------------------------------------
/*全局定义   //      也可以通过传参数来实现*/

struct page_list
{
	int lump;
	int attitude;
}data[size];
int memory[8][8];
int stack[64];
int visit;
int absence;

//---------------------------------------------------------------------------------
/*    初始化函数   */
void init()
{
	
//------------------------------------------------------------------------------
	/*初始化位示图*/
	int i;
	
	for(i=0;i<8;i++)
		memory[0][i]=1;
	for(i=1;i<8;i++)
		for(int j=0;j<8;j++)
		{
			memory[i][j]=rand()%2;
		}
	cout<<"the memory is :"<<endl;
	void show_maritext(int a[][8],int m,int n);
	show_maritext(memory,8,8);
	
//-------------------------------------------------------------------------------
}
//-------------------------------------------------------------------------------
void show_maritext(int a[][8],int m,int n)
{
     for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
			cout<<a[i][j]<<"   ";
		cout<<endl;
	}
}
//-------------------------------------------------------------------------------
void show_page_list(page_list data[],int page_length)
{
	for(int i=0;i<page_length;i++)
	{
		printf("%d\t",i);
		printf("%d\t",data[i].lump);
		printf("%d\t",data[i].attitude);
		printf("\n");
	}
}
//-------------------------------------------------------------------------------
void show_stack(int stack[],int Give_memory)
{
    printf("stack:\n");
	for(int i=Give_memory-1;i>=0;i--)
	{
	    printf("%d\t",i);
		printf("%d\t",stack[i]);
		printf("\n");
	}   
}
//-------------------------------------------------------------------------------
/*  操作函数  */
void control(int page_table,int Give_memory,int lump_length,int D_logical,char flag)
{
	//
	int physical_address;
	/*if(D_logical<0)
		break;*/
	system("cls");                                       /* 清屏函数 */
	if(D_logical<(page_table*lump_length)&&D_logical>=0)
	{
		int sign_lower;
		sign_lower=D_logical/lump_length;
		if(data[sign_lower].attitude==1)
		{		                                       /*命中   先进先出算法*/
	       if(flag=='f'||flag=='F')
		     physical_address=lump_length*data[sign_lower].lump+D_logical%lump_length;
		   else                                        /*LRU 算法*/
		   {
			 for(int j=0;j<Give_memory;j++)
				   if(stack[j]==sign_lower)
                      for(int i=j;i<Give_memory-1;i++)
				         stack[i]=stack[i+1];
			 for(int i=Give_memory-1;i>=0;i--)
			 {
				 if(stack[i-1]!=-1)
				 {
					 stack[i]=sign_lower;
				     break;
				 }
			 }

			 physical_address=lump_length*data[sign_lower].lump+D_logical%lump_length;
		   }
		}
		else                                       /*未命中*/
			if(stack[Give_memory-1]!=-1)                /*给的内存已满时*/
			{
				absence++;
				data[sign_lower].lump=data[stack[0]].lump;
				data[sign_lower].attitude=1;
				data[stack[0]].attitude=0;
				for(int id_memory=0;id_memory<Give_memory-1;id_memory++)
					stack[id_memory]=stack[id_memory+1];
				stack[Give_memory-1]=sign_lower;
				physical_address=lump_length*data[sign_lower].lump+D_logical%lump_length;
			}
			else                                  /*给的内存不满时,不发生置换*/
			{
				absence++;
				data[sign_lower].attitude=1;
				for(int i=1;i<8;i++)
				{
					for(int j=0;j<8;j++)
						if(memory[i][j]==0)
						{
							data[sign_lower].lump=i*8+j+1;    /*从位示图中找到空内存的位置*/
							memory[i][j]=1;
						    break;
						}
						break;
				}
	            int t=0;
				while(t<Give_memory&&stack[t]!=-1)
					t++;
			    stack[t]=sign_lower;
				physical_address=lump_length*data[sign_lower].lump+D_logical%lump_length;
			}
	}	
	printf("page\tlump\tattitude\n");
	show_page_list(data,page_table);
	show_stack(stack,Give_memory);
	printf("----------------------------------------------------------------\n");
	cout<<"physical  address :"<<physical_address<<endl<<endl;
}
//-------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    visit=0;
    absence=0;
	system("color 6a");                                  /*控制颜色的函数*/
//-------------------------------------------------------------------------------
	printf("input lump's size(kb):");
	int n;
	scanf("%d",&n);                                 /*n  表示块的长度*/
	printf("the memory lump is %d kb\n",n);
	printf("input programm's length:");
	int job_length;
	scanf("%d",&job_length);                       /*lump_length表示作业的长度*/
	int i;
	i=job_length/(n*1024);
	if(job_length%(n*1024)==0)
	     ;
	else
		i=i+1;                                     /*i   表示页表的长度 */
	printf("the page_table is %d kb\n",i);
	int t;
	t=i;
	//data=(data *)malloc((i+1)*sizeof(data));
	for(int j=0;j<i;j++)
	{
		cout<<j<<"  "<<data[j].lump<<"  "<<data[j].attitude<<endl;
	}
//------------------------------------------------------------------------------
	/*     初始化栈表     */
    
	int M_lump;
	printf("input the memory give cout:");
	scanf("%d",&M_lump);                          /*M_lump表示分配内存的块数*/
	for(i=0;i<M_lump;i++)
	{
		stack[i]=-1;
		cout<<i<<"   "<<stack[i]<<endl;
	}
//----------------------------------------------------------------------------
    init();
	float rate;
	char flag;
	printf("please select FIFO(f) or LRU(l) algrithm:  ");
	getchar();
    flag=getchar();
	int D_logical=0;
	int lump_length;
	int flag_d;
	lump_length=n*1024;
	while(D_logical!=-1)
	{
		/*逻辑地址*/
		flag_d=0;
		printf("input the logical address: ");
		scanf("%d",&D_logical);
		visit++;
		control(t,M_lump,lump_length,D_logical,flag);
		printf("logical address:  %d\n\n",D_logical);
		if(D_logical>t*lump_length||D_logical<0)
		{	
			visit--;
			flag_d=1;
			//cout<<"error:the logical is overflow!"<<endl;
		}
		printf("visit:\t\t%d\n\n",visit);
		printf("absence:\t%d\n\n",absence);
		rate=((float)absence/visit)*100;
		printf("absence rate:  %f",rate);
		printf("%\n");
		printf("----------------------------------------------------------------\n");
		if(flag_d==1)
		{	
			cout<<"error:the logical is overflow!"<<endl;
		}
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -