操作系统磁盘调度SCAN算法

  • 格式:docx
  • 大小:20.05 KB
  • 文档页数:9

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>typedefstruct_proc{char name[100]; /*定义进程名称*/int team; /*定义柱面号*/int ci; /*定义磁道面号*/int rec; /*定义记录号*/struct_proc *prior;struct_proc *next;}PRO;PRO *g_head = NULL, *g_curr = NULL, *local;int record = 0; //初始柱面号int yi = 1; //初始方向int rec0 = 0; //初始记录号void init(){PRO *p; /*初始化链表(初始I/O表)*/ g_head = (PRO*)malloc(sizeof(PRO));g_head->next = NULL;g_head->prior = NULL;p = (PRO*)malloc(sizeof(PRO));strcpy_s(p->name, "P1");p->team = 100;p->ci = 10;p->rec = 1;p->next = NULL;p->prior = g_head;g_head->next = p;g_curr = g_head->next;p = (PRO*)malloc(sizeof(PRO));strcpy_s(p->name, "P2");p->team = 50;p->ci = 10;p->rec = 5;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P3");p->team = 40;p->ci = 10;p->rec = 4;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P4");p->team = 60;p->ci = 20;p->rec = 6;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P5");p->team = 50;p->ci = 20;p->rec = 6;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P6");p->team = 60;p->ci = 20;p->rec = 6;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P7");p->team = 50;p->ci = 2;p->rec = 6;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P8");p->team = 50;p->ci = 5;p->rec = 6;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P9");p->team = 50;p->ci = 100;p->rec = 6;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P10");p->team = 60;p->ci = 10;p->rec = 10;p->next = NULL;p->prior = g_curr;g_curr->next = p;local = (PRO*)malloc(sizeof(PRO)); /*选中进程*/strcpy_s(local->name, "P0");local->team = 50;local->ci = 50;local->rec = 50;local->next = NULL;local->prior = NULL;}void PrintInit() /*打印I/O表*/{PRO *t = g_head->next;printf("-------------------------------------\n");printf(" 请求I/O表\n");printf(" 进程名柱面号磁道号记录号\n");while (t != NULL){printf("%4s %8d %8d %5d\n", t->name, t->team, t->ci, t->rec);t = t->next;}}void acceptreq() /*接受请求函数*/{PRO *p;p = (PRO*)malloc(sizeof(PRO));printf("please input the information of the new process\n");printf("进程名:");scanf_s("%s", p->name,20);printf("柱面号(0-199):");scanf_s("%d", &p->team); /*输入请求进程信息*/ printf("磁道号(0-20):");scanf_s("%d", &p->ci);printf("记录号(0-7):");scanf_s("%d", &p->rec);getchar();g_curr = g_head; /*将此节点链入I/O请求表*/ while (g_curr->next != NULL)g_curr = g_curr->next;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = g_head->next;PrintInit(); /*将新的I/O请求表输出*/}void SCAN() /*驱动调度函数*/{PRO *out = 0;int deng = 0;int deng1 = 0;int min = g_head->next->team;//大于里最小的int max = g_head->next->team;//小于里最大的for (g_curr = g_head->next; g_curr != NULL; g_curr = g_curr->next){if (g_curr->team == record)//找到是否有同一个柱面号的进程,deng=1{min = g_curr->rec;out = g_curr;deng = 1;break;}}switch (deng){case 1://找出同一个柱面号里最小的记录号for (g_curr = g_head->next; g_curr != NULL; g_curr = g_curr->next){if (g_curr->team == record&&abs(g_curr->rec - rec0) <= abs(min - rec0)){min = g_curr->rec;out = g_curr;}}break;case 0:switch (yi)//不属于同一个柱面号里。

分向里和向外方向{case 1://向外(大)方向for (g_curr = g_head->next; g_curr != NULL; g_curr = g_curr->next){if (g_curr->team > record)//找到第一个大于它的柱面号的进程{min = g_curr->team;deng1 = 1;//存在大于的柱面号break;}}switch (deng1){case 1://存在for (g_curr = g_head->next; g_curr != NULL; g_curr = g_curr->next){if (min >= g_curr->team&&g_curr->team>record)//找到大于它的柱面号的最小的柱面号{min = g_curr->team;out = g_curr;}}break;case 0://不存在yi = 0;//反方向,即向外(小)方向for (g_curr = g_head->next; g_curr != NULL; g_curr = g_curr->next){if (max <= g_curr->team)//找柱面号比它小的第一个进程{min = g_curr->team;out = g_curr;}}break;}break;case 0:for (g_curr = g_head->next; g_curr != NULL; g_curr = g_curr->next){if (g_curr->team < record)//找到第一个小于它的柱面号deng1=1{max = g_curr->team;deng1 = 1;break;}}switch (deng1){case 1:for (g_curr = g_head->next; g_curr != NULL; g_curr = g_curr->next){if (max <= g_curr->team&&g_curr->team<record)//找到小于它的柱面号的最大的柱面号{max = g_curr->team;out = g_curr;}}break;case 0:yi = 1;//向反方向,即向内(大)方向for (g_curr = g_head->next; g_curr != NULL; g_curr = g_curr->next){if (min >= g_curr->team){min = g_curr->team;out = g_curr;}}break;}break;}break;}strcpy_s(local->name, out->name);local->team = out->team;local->ci = out->ci;local->rec = out->rec;printf("被选中进程:\n");printf(" 进程名柱面号磁道号记录号\n");printf("%4s %8d %8d %5d\n", out->name, out->team, out->ci, out->rec);switch (yi){case 1:printf("current direction is UP\n");printf("-------------------------------------\n");break;case 0:printf("current direction is DOWN\n");printf("-------------------------------------\n");break;}record = local->team;rec0 = local->rec;if (out->next == NULL) /*将选中的进程从I/O请求表中删除*/{out->prior->next = NULL;free(out);}else{out->prior->next = out->next;out->next->prior = out->prior;free(out);}}void acceptnum() /*通过输入0~1选择‘驱动调度’或是‘接受请求’*/{float num;char c = 'y';do{printf("please input a number between 0 and 1\n");printf("num<=0.5:接受请求 num>0.5:驱动调度\n");printf("num:");scanf_s("%f", &num);getchar();while((num<0 || num>1)) /*过滤不合法数据注意:本程序其他输入数据可能未过滤*/{printf("ERROR!!!! Input again please!\nnum:\n");scanf_s("%f", &num);getchar();}if (num>0.5) /*驱动调度*/{if (g_head->next == NULL)printf("请求I/O表 is empty!!!\n"); /*请求表为空无需调度*/else{printf("-------------------------------\n");printf("驱动调度\n");PrintInit();SCAN(); /*调用函数进行调度*/ }}else/*接受请求*/{printf("-------------------------------\n");printf("接受请求\n");PrintInit();acceptreq();}printf("是否继续(y/n):"); /*输入n离开本程序*/c = getchar();} while (c == 'y' || c == 'Y');}int main() /*主程序*/{init();PrintInit();acceptnum();return 0;}。