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

📄 diaodu.c

📁 这是一个驱动调度的设计,用电梯算法实现对磁盘的存取.
💻 C
字号:
#include <stdio.h>
#include <string.h>
typedef struct table//定义一个结构类型table
{
	char pro[10];//定义进程名称
	int team;//定义柱面号
	int ci;//定义磁道号
	int rec;//定义物理记录号
}job;
job io[20]; // 请求I/O表
job out[20]; // 选中的进程表
int count=0;//请求I/O表的进程数目
main()
{  
	int k=1;        // 已选中的进程个数
	int i;
	int record=0;   // 记录选中的柱号,初始当前移臂方向为里移,用0代表里移UP-向柱号199方向,1代表外移DOWN-向柱号0方向
	int yi=0;       //初始当前移臂方向为里移
	int flag=0;     //标志符
	int d[20];      // 记录调用的进程方向
	d[0]=0;
    strcpy(io[0].pro,"p1");  // 预先设置一个请求I/O表内容
    io[0].team=100;
    io[0].ci=10;
    io[0].rec=1;
	count++;
	strcpy(out[0].pro,"p0");//预先设置一个选中的进程表的内容
	out[0].team=0;
	out[0].ci=0;
	out[0].rec=0;
    printf("** 初始化: **\n");
	printf("-----------------------------------------\n");
	printf("     ---------- 请求I/O表 ----------     \n");
	printf("进程\t\t柱面号\t\t磁道号\t\t记录号\n");
	for(i=0;i<count;i++)
	printf("%s\t\t%d\t\t%d\t\t%d\n",io[i].pro,io[i].team,io[i].ci,io[i].rec);
    printf("     -------- 当前进程信息 ---------     \n");
	printf("进程\t\t柱面号\t\t磁道号\t\t记录号\n");
	printf("%s\t\t%d\t\t%d\t\t%d\n",out[0].pro,out[0].team,out[0].ci,out[0].rec);
	printf("当前磁臂移动方向是: up\n");
	printf("-----------------------------------------\n");
    while(1)
	{
		char R='y';         
        int min,si;
    	int m=1;        // 已选中的进程方向个数
		while(R=='y'){
			            float t; 
						printf("****************驱动调度演示********************\n");
		                printf("**********请随机输入一个介于0~1的数*************\n");
		                printf("***********如输入2则显示当前请求I/O表***********\n");
		                scanf("%f",&t);
	                	if(t==2) //显示当前请求I/O表
						{
		     	            printf("-----------------------------------------\n");
			                printf("     -------- 当前请求I/O表 --------     \n");
		                	printf("进程\t\t柱面号\t\t磁道号\t\t记录号\n");	
			                for(i=0;i<count;i++)
			                printf("%s\t\t%d\t\t%d\t\t%d\n",io[i].pro,io[i].team,io[i].ci,io[i].rec);
			                printf("-----------------------------------------\n");
						}	
	                    if(t<=0.5)  //接收请求
						{	
							char name[10];
	                        int a,b,c;
		                	printf("** 接收请求: **\n");			
	                    	printf("请输入进程名: ");
							getchar();
		                	scanf("%s",name);
	                    	printf("该进程柱面号(0-199):");
		                	scanf("%d",&a);
		                 	printf("该进程磁道号(0-19):");
		                	scanf("%d",&b);
		                	printf("该进程物理记录号(0-7):");
		                    scanf("%d",&c);
		                    strcpy(io[count].pro,name);
                            io[count].team=a;
                            io[count].ci=b;
                            io[count].rec=c;
                        	count++;
		                 	printf("-----------------------------------------\n");
		                	printf("      ------ 新的请求I/O表 --------     \n");
		                	printf("进程\t\t柱面号\t\t磁道号\t\t记录号\n");
		                	for(i=0;i<count;i++)
                            printf("%s\t\t%d\t\t%d\t\t%d\n",io[i].pro,io[i].team,io[i].ci,io[i].rec);
		                	printf("-----------------------------------------\n");
		                	printf("是否继续?y:继续,n:退出\n");
		                	scanf("%c",&R);	
						}
	                	if(t>0.5&&t<=1)  //驱动调度
						{
			                printf("** 驱动调度: **\n");
		                	if(count==0)
			            	printf("*** I/O请求表为空。***\n");
		                 	else
							{
				                for(i=0;i<count;i++)                   //找到相同的柱号 
								{
					                if(io[i].team==out[k-1].team)
									{
					            	    flag=-1;                        //标志符置-1 
					            	    record=i;                      //记录选中的柱号
					            	    if(i==count-1)                 
						         	    count=i+2;
					            	    break;
									}
								}

			               if(i==count)                           //柱号不相同
						   {
				              io[count]=out[k-1];
				              count++;
			                  min=io[0].team;
                              for(si=0;si<count-1;si++)      //进行排序,柱面号从小到大排列
			 	              for(i=0;i<count-1;i++)             
							  {	
					             if(io[i].team>io[i+1].team)	
								 {
						            job temp;
						            temp=io[i];
						            io[i]=io[i+1];
						            io[i+1]=temp;
								 }
							  }
					        printf("-----------------------------------------\n");
				            for(i=0;i<count;i++)               //在请求I/O表中查找当前调度的进程
							{				
					            if(io[i].team==out[k-1].team)
								{
							       if(i==0&&yi==0)  // 初始当前移臂方向为里移时         
								   {flag=i;record=i+1;break;}
							       else if(i==0&&yi==1)// 初始当前移臂方向为外移时
								   {flag=i;record=i+1;yi=0;break;}
							       else if(i==(count-1)&&yi==0) // 初始当前移臂方向为里移时 
								   {flag=i;record=i-1;yi=1;break;}
						           else if(i==(count-1)&&yi==1)// 初始当前移臂方向为外移时
								   {flag=i;record=i-1;break;}
						           else if(i>0&&i<(count-1)&&yi==0)//初始当前移臂方向为里移时
								   {flag=i;record=i+1;break;}
							       else if(i>0&&i<(count-1)&&yi==1)//初始当前移臂方向为外移时
								   {flag=i;record=i-1;break;}
						            else
						            ;	   
								}
							}	    	
						   }
			       	       printf("当前移臂方向是:");
                           if(yi==0)
				             printf("up\n");
				           else
					         printf("down\n");
				          d[m]=yi;
				          m++;
				          printf("调度的进程是:\n");   //显示调度的进程
				          printf("进程\t\t柱面号\t\t磁道号\t\t记录号\n");				
                          printf("%s\t\t%d\t\t%d\t\t%d\n",io[record].pro,io[record].team,io[record].ci,io[record].rec);
				          out[k]=io[record];
				          k++;
				          io[record]=io[count-1];    //进程被调度,从I/O表删除
				          count--;              
				          if(flag!=-1)
						  {
				             io[flag]=io[count-1];  //无相同柱面时,将已接受驱动调动的进程删除
				             count--;
						  }		
				          printf("-----------------------------------------\n");
			              printf("是否继续?y:继续,n:退出\n");
				          scanf("%c",&R);
						}
						}   
                   }       
     }
	                   printf("** 程序结束: **\n");
                       printf("----------------------------------------------\n");
	                   printf("      ---------- 驱动调度过程 ----------     \n");
	                   printf("进程\t\t柱面号\t\t磁道号\t\t记录号\t\t方向\n");
	                   for(i=0;i<k;i++)
					   {
		                  if(d[i]==0)
						  {
		                      printf("%s\t\t%d\t\t%d\t\t%d",out[i].pro,out[i].team,out[i].ci,out[i].rec);
		                      printf("      up\n");
						  }
		                  else
						  {
		                     printf("%s\t\t%d\t\t%d\t\t%d",out[i].pro,out[i].team,out[i].ci,out[i].rec);
		                     printf("      down\n");
						  }	
					  }	
	                  printf("----------------------------------------------\n");
                      return 0;  
}


⌨️ 快捷键说明

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