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

📄 acm.cpp

📁 操作系统课程中的存储器管理的代码
💻 CPP
字号:
#include <stdio.h>

void Fifo()
{
	int p = 0;                                  //物理块的数量
    int physical[7] = {-1,-1,-1,-1,-1,-1,-1};   //存入物理块中的页号
    int num = 0;                                //页面数
    int page[20] = {0};                         //要运行的进程的页号
    int i,j,k;                                  //循环变量
    int countt = 0;                             //缺页次数
	int a = 0;                                  //最近访问标志
	int c = 0;                                  //缺页标志
	printf ("您选择了先进先出(FIFO)算法!\n");
	printf ("请输入物理块的数目:");
	scanf ("%d",&p);
	printf ("请输入页面数:");
	scanf ("%d",&num);
	printf ("请输入页号(以空格隔开):");
	for (i = 0 ; i < num ; i++)
		scanf("%d",&page[i]);
	for (k = 0 ; k < num ; k++)
	{///
	    for (i = 0 ; i < p ; i++)
		{//
		    if (physical[i] == page[k])
			{
				break;
			}
			else if (physical[i] == -1)       //物理块有空位
			{
				physical[i] = page[k];
				countt ++;
				c += 1;
				break;
			}
			else if (physical[i] != -1 && i == p - 1)  //物理块已满
			{
                for (j = 0 ; j < p ; j++)
				{
                     if (page[k] != physical[j] && j == p - 1)   //该页面不在当前物理块中
					{
						physical[a] = page[k];
				        a ++;
				        if (a == p)  a = 0 ;       //将最先进的置换后 初始化其标志
				        countt ++;
						c += 1;
					}
				}
			}
		}//
		printf ("置换过程第%d步:",k + 1);
		for (i = 0 ; i < p ; i++)
		{
			if (physical[i] == -1)
				printf ("  ");
			else
				printf ("%d ",physical[i]);
		}
		if (c == 1)
		{
			printf ("发生缺页");
			c = 0;
		}
		printf ("\n");
	}///
	printf ("缺页次数为:%d\n",countt);
	printf ("缺页率为:%d%%\n\n",countt*100/num);
	//printf("Fifo\n");
}

void Lru()
{
	int p = 0;                                  //物理块的数量
    int physical[7] = {-1,-1,-1,-1,-1,-1,-1};   //存入物理块中的页号
    int num = 0;                                //页面数
    int page[20] = {0};                         //要运行的进程的页号
    int i,j,k,t;                                //循环变量
    int countt = 0;                             //缺页次数
	int c = 0;                                  //缺页标志
	int once[7] = {0};                          //最近访问标志数组
	printf ("您选择了最近最久未使用(LRU)算法!\n");
	printf ("请输入物理块的数目:");
	scanf ("%d",&p);
	printf ("请输入页面数:");
	scanf ("%d",&num);
	printf ("请输入页号(以空格隔开):");
	for (i = 0 ; i < num ; i++)
		scanf("%d",&page[i]);
	for (k = 0 ; k < num ; k++)
	{
	    for (i = 0 ; i < p ; i++)
		{
		    if (physical[i] == page[k])
			{
				for (j = 0 ; j <= p ; j++)
				{
					if (once[j] != 0 && j != i && once[j] < once[i]) //??????     //不缺页的 但相同页号 算进行了一次访问  其他未访问的+1		
					    once[j] += 1;
				}
				once[i] = 1;
				break;
			}
			else if (physical[i] == -1)       //物理块有空位
			{
				physical[i] = page[k];
				countt ++;
				c += 1;
				once[i] = 1;
				for(j = 0 ; j < i ; j++)
				{
					if (once[j] != 0)
						once[j] += 1;
				}
				break;
			}
			else if(physical[i] != -1 && i == p - 1)    //物理块已满
			{
				for (j = 0 ; j < p ; j++)
				{
					if (once[j] == p)
					{
						physical[j] = page[k];
						once[j] = 1;                   //置换掉
						for (t = 0 ; t < p ; t++)
						{
							if(t != j)
								once[t] += 1;     //将其他未被访问的+1,达到三的就替掉
						
						}
						countt++;
						c += 1;
						break;
					}
				}
			}
		}
		printf ("置换过程第%d步:",k+1);
		for (i = 0 ; i < p ; i++)
		{
			if (physical[i] == -1)
				printf ("  ");
			else
				printf ("%d ",physical[i]);
		}
		if (c == 1)
		{
			printf ("发生缺页");
			c = 0;
		}
		printf ("\n");
	}
	printf ("缺页次数为:%d\n",countt);
	printf ("缺页率为:%d%%\n\n",countt*100/num);
}

void Optimal()
{
	int p = 0;                                  //物理块的数量
    int physical[7] = {-1,-1,-1,-1,-1,-1,-1};   //存入物理块中的页号
    int num = 0;                                //页面数
    int page[20] = {0};                         //要运行的进程的页号
    int i,j,k,t;                                //循环变量
    int countt = 0;                             //缺页次数
	int a[7] = {0};                             //各物理块中的页面下一次的访问时间
	int b = 0;                                  //排序算法的中间变量
	int c = 0;                                  //缺页标志
	printf("您选择了最佳(OPTIMAL)置换算法!\n");
    printf ("请输入物理块的数目:");
	scanf ("%d",&p);
	printf ("请输入页面数:");
	scanf ("%d",&num);
	printf ("请输入页号(以空格隔开):");
	for (i = 0 ; i < num ; i++)
		scanf("%d",&page[i]);
	for (k = 0 ; k < num ; k++)
	{
	    for (i = 0 ; i < p ; i++)
		{
		    if (physical[i] == page[k])
			{
				break;
			}
			else if (physical[i] == -1)       //物理块有空位
			{
                physical[i] = page[k];
				countt ++;
				c += 1;
				break;
			}
			else if(physical[i] != -1 && i == p - 1)    //物理块已满
			{
				//获得各物理快中内容下一次的访问时间
				for (j = 0 ; j < p ; j++)
				{
					for (t = k ; t < num ; t++)
					{
						if(physical[j] == page[t])      
						{
							a[j] = t - k;           //时间间隔
							break;
						}
						else if(physical[j] != page[t] && t == num - 1)
							a[j] = num;    //如果以后此页面永远用不到,则设定为最大值
					}
				}
				//比较各时间的大小
				for (j = 1 ; j < p ; j++)
				{
                    if (a[j] > a[b])
					{
						b = j;
					}
				}
				physical[b] = page[k];
				b = 0;
				countt++;
				c += 1;
			}
		}
		printf ("置换过程第%d步:",k+1);
		for (i = 0 ; i < p ; i++)
		{
			if (physical[i] == -1)
				printf ("  ");
			else
				printf ("%d ",physical[i]);
		}
		if (c == 1)
		{
			printf ("发生缺页");
			c = 0;
		}
		printf ("\n");
	}
	printf ("缺页次数为:%d\n",countt);
	printf ("缺页率为:%d%%\n\n",countt*100/num);
	//printf("Optimal\n");
}

int main()
{
	int n;
	do
	{
		printf ("请选择要使用的置换算法:\n1.FIFO算法\n2.LRU算法\n3.OPTIMAL算法\n0.退出系统\n");
	    scanf ("%d",&n);
	    switch(n)
		{
	    case 1:
		    Fifo();
		    break;
	    case 2:
		    Lru();
		    break;
        case 3:
	    	Optimal();
		    break;
	    case 0:
		    return 0;
		default:
			printf ("输入有误,请重试!\n");
		}
	}
	while(n != 0);
	return 0;
}

⌨️ 快捷键说明

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