【星海出品】操作系统C语言小例子

LRU算法
demo

int N1 =20;
scanf("%d",&N1); //为N1赋新值
int list[20] = {0}; //用0填充20个单位
for(int i=0;i<Nl;i++)
    scanf("%d", &list[i]);
int tem[10] = {0}; 
printf("%d\n",tem[0]); //C打印不支持执行使用变量,需要引用
/*
 ============================================================================
 Name        : lruSub.c
 Author      : 
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

//#include 
//#include 

//int main(void) {
//	puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
//	return EXIT_SUCCESS;
//}

#include
#define N 3 //物理块的个数
int Nl = 20;//页面访问序列的长度
void LRU(int block[],int blockN,int list[],int listN)
//LRU替换算法
//列表、物理块数,将要到来的序列列表,要进入算法的数目
{
    int  i, j;//定义替换次数
	int rep1 = 0;//缺页次数
	int rep2 = 0;//置换页面次数
	int DisplacedPages[20] = {0};
    int time[N];//各个物理块最近一次访问至现在的时间

    for(i = 0;i < blockN;i++)//初始化
        time[i] = 0;//用作各个块的驻留计数

    for(i = 0;i < listN; i++)
	{
		for(j = 0; j < blockN; j++) //更新时间记录
			if(block[j] != -1)
                time[j]++;
        for(j = 0; j < blockN; j++)
            if(block[j] == list[i]) //命中
			{
                time[j] = 0;
                break;
            }
            else if(block[j] == -1) //未命中但块中为空
            	break;
		if(j < blockN && block[j] == -1)//未命中且物理块未满,直接存入
		{
            block[j] = list[i];
            time[j] = 0;
			rep1++;
        }
        else if(j == blockN)//需要替换
		{
            int max = 0;
            for(int k = 0;k < blockN;k++)//寻找最久未访问的地址所在的物理块的位置
			{
                if(time[max] < time[k])
                    max = k;
            }
			DisplacedPages[rep2] = block[max];
			rep2++;
			rep1++;
            block[max] = list[i];
            time[max] = 0;
        }

        printf("current access page is:%d\n",list[i]);
		printf("after access of The page physics block are:");//访问后物理块内的页面为
    	for(int m = 0;m < blockN;m++)//显示当前物理块的状态
		{
        	if(block[m] == -1)
            	break;
        	printf("|%d|  ",block[m]);
    	}
		if (j == blockN)
			printf("Replaced %d\n", DisplacedPages[rep2-1]);
    	printf("\n");
    }

    printf("Lake Page num are:%d  Lake rate of page:%d/%d=%.2f\n", rep1, rep1, listN, (float)(rep1)/(float)listN);
	printf("Replaced page are:");//置换的页面是
	for (i=0; i<rep2; i++)
		printf("%d,", DisplacedPages[i]);
}

int main()
{
    int block[N], list[20] = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//默认序列
    int df = 1;
    for(int i = 0;i < N;i++)//初始化
    {
        block[i] = -1;
    }
//    printf("是否使用默认序列?(1:否  其他数字:是)");
    printf("Are you prepare use default sequence?(1 no . 2 either)");
    printf("\n");
    scanf("%d", &df);
    if (df == 1)
    {
    	printf("please Input of page Num:\n");
    	scanf("%d", &Nl);
    	printf("please Input page access sequence:\n");
    	for(int i=0;i<Nl;i++)
    		scanf("%d", &list[i]);
    }
    printf("Start Sequence");
    LRU(block, N, list, Nl);//调用LRU页面置换算法
    //列表、物理块,将要到来的序列列表,要进入算法的数目

    printf("\n");
    return 0;

}

你可能感兴趣的:(c语言,开发语言)