RRS.CPP
上传用户:wszmarenbt
上传日期:2013-04-26
资源大小:2552k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //THE PROGRAM IS TO TEST THE OPERATING SYSTEM'S "ROUND-ROBIN SCHEDULING".
  2. //FILE RRS.CPP
  3. #include    <stdio.h>
  4. #include    <conio.h>
  5. #include   <string.h>
  6. #include   <stdlib.h>
  7. #include <graphics.h>
  8. #include       "Rr.h"
  9. #define Count 5
  10. float TqTs[Count];
  11. int Quantum=0,Finish[Count];
  12. int Ts[Count],ArriveTime[Count],EndTime[Count],Tq[Count];
  13. void Kernel(void);
  14. void Result(void);
  15. void Version(void);
  16. void InitGrid(void);
  17. int IF_Finish(void);
  18. void InitGraph(void);
  19. void InitRecord(void);
  20. void InitProcess(void);
  21. Node Table[50];
  22. Grid Record,Graph;
  23. int main(void)
  24. {
  25. InitProcess();
  26. getch();
  27. InitGraph();
  28. InitRecord();
  29. InitGrid();
  30. Kernel();
  31. Result();
  32. Version();
  33. getch();
  34. closegraph();
  35. return 0;
  36. }
  37. void InitGraph(void)
  38. {
  39. int Gdriver=DETECT,Gmode,Errorcode;
  40. initgraph(&Gdriver,&Gmode,"D:\Tools\Tc3.0\Bgi");
  41. Errorcode=graphresult();
  42. if (Errorcode!=grOk)
  43. {
  44. printf("Graphics Error: %sn",grapherrormsg(Errorcode));
  45. printf("Press any key to exit:");
  46. getch();
  47. exit(1);
  48. }
  49. }
  50. void InitProcess(void)
  51. {
  52. int i;
  53. window(1,1,80,25);
  54. textbackground(1);
  55. textcolor(14);
  56. clrscr();
  57. printf("n ---------- The Round Robin Scheduling ---------n");
  58. printf("n***** Input The Quantum Time Of The Process : ");
  59. scanf("%d",&Quantum);
  60. for (i=0;i<Count;i++)
  61. {
  62. printf("n----- Input The Arrive  Time Of The Process %d : ",i+1);
  63. scanf("%d",&ArriveTime[i]);
  64. printf("n***** Input The Service Time Of The Process %d : ",i+1);
  65. scanf("%d",&Ts[i]);
  66. }
  67. }
  68. void InitRecord(void)
  69. {
  70. int number=0,circle,i;
  71. for (i=0;i<Count+1;i++)
  72. {
  73. for (circle=0;circle<Count+1;circle++)
  74. {
  75. Record.NewRectangle(number,15+circle*100,20+i*20,
  76. circle*100+115,20+((i+1)*20));
  77. number=number+1;
  78. }
  79. }
  80. setcolor(14);
  81. Record.GetRectangle(1)->Outtextxy("ArriveTime");
  82. Record.GetRectangle(2)->Outtextxy("    Ts    ");
  83. Record.GetRectangle(3)->Outtextxy("FinishTime");
  84. Record.GetRectangle(4)->Outtextxy("    Tq    ");
  85. Record.GetRectangle(5)->Outtextxy("  Tq/Ts   ");
  86. Record.GetRectangle(6)->Outtextxy("    P1    ");
  87. Record.GetRectangle(12)->Outtextxy("    P2    ");
  88. Record.GetRectangle(18)->Outtextxy("    P3    ");
  89. Record.GetRectangle(24)->Outtextxy("    P4    ");
  90. Record.GetRectangle(30)->Outtextxy("    P5    ");
  91. setcolor(9);
  92. for (i=7,circle=0;i<=31,circle<Count;i=i+6,circle++)
  93. Record.GetRectangle(i)->Display(ArriveTime[circle]);
  94. for (i=8,circle=0;i<=32,circle<Count;i=i+6,circle++)
  95. Record.GetRectangle(i)->Display(Ts[circle]);
  96. }
  97. void InitGrid(void)
  98. {
  99. int number1=0,circle1,i;
  100. setcolor(11);
  101. outtextxy(155,155,"The Process Round Robin Scheduling");
  102. setlinestyle(CENTER_LINE,1,1);
  103. line(15,175,610,175);
  104. setcolor(15);
  105. setlinestyle(DOTTED_LINE,1,0);
  106. for (i=0;i<5;i++)
  107. {
  108. for (circle1=0;circle1<40;circle1++)
  109. {
  110. Graph.NewRectangle(number1,15+circle1*15,200+i*20,
  111.     circle1*15+30,200+(i+1)*20);
  112. number1=number1+1;
  113. }
  114. }
  115. }
  116. int IF_Finish(void)
  117. {
  118. if (Finish[0]+Finish[1]+Finish[2]+Finish[3]+Finish[4]==5) return 1;
  119. else return 0;
  120. }
  121. int LineTest(int a)
  122. {
  123. return (a*40);
  124. }
  125. void Kernel(void)
  126. {
  127. int i=0,j=0,IN=0,FillNumber=0,Order=0,StartNumber=0;
  128. int Clock=0,EndIn=0,Temp=0,Current=0;
  129. Node TempNode;
  130. Table[Order].SetID(0);
  131. Table[Order].SetCurrentLength(Ts[0]);
  132. while (IF_Finish()==0)
  133. {
  134. IN=0;
  135. TempNode=Table[Current];
  136. StartNumber=LineTest(TempNode.GetID());
  137. FillNumber=TempNode.GetCurrentLength()-Quantum;
  138. Temp=Clock;
  139. if (FillNumber<=0)
  140. {
  141. FillNumber=TempNode.GetCurrentLength();
  142. Finish[TempNode.GetID()]=1;
  143. for (i=StartNumber+Temp;i<StartNumber+FillNumber+Temp;i++)
  144. {
  145. Graph.GetRectangle(i)->Fill();
  146. Clock=Clock+1;
  147. for (j=0;j<Count;j++)
  148. if (Clock==ArriveTime[j])
  149. {
  150. Table[Order+1].SetID(j);
  151. Table[Order+1].SetCurrentLength(Ts[j]);
  152. Order=Order+1;
  153. IN=1;
  154. if (j==Count-1) EndIn=1;
  155. }
  156. }
  157. EndTime[TempNode.GetID()]=Clock;
  158. while ((IN==0) && (IF_Finish()==0) && (EndIn==0))
  159. {
  160. Clock=Clock+1;
  161. for (j=0;j<Count;j++)
  162. {
  163. if ((Clock==ArriveTime[j]) && (Finish[j]==0))
  164. {
  165. Table[Order+1].SetID(j);
  166. Table[Order+1].SetCurrentLength(Ts[j]);
  167. Order=Order+1;
  168. IN=1;
  169. }
  170. }
  171. }
  172. }
  173. else
  174. {
  175. for (i=StartNumber+Temp;i<StartNumber+Quantum+Temp;i++)
  176. {
  177. Graph.GetRectangle(i)->Fill();
  178. Clock=Clock+1;
  179. for (j=0;j<5;j++)
  180. if ((Clock==ArriveTime[j]) && (Finish[j]==0))
  181. {
  182. Table[Order+1].SetID(j);
  183. Table[Order+1].SetCurrentLength(Ts[j]);
  184. Order=Order+1;
  185. if (j==Count-1) EndIn=1;
  186. }
  187. }
  188. if (Finish[TempNode.GetID()]==0)
  189. {
  190. Table[Order+1].SetID(TempNode.GetID());
  191. Table[Order+1].SetCurrentLength(FillNumber);
  192. Order=Order+1;
  193. }
  194. }
  195. Current=Current+1;
  196. }
  197. }
  198. void Result()
  199. {
  200. int i=0,circle=0;
  201. float Sum=0.0,Everage=0.0;
  202. for (i=0;i<Count;i++)
  203. {
  204. Tq[i]=EndTime[i]-ArriveTime[i];
  205. TqTs[i]=(float (Tq[i]))/(float (Ts[i]));
  206. Sum=Sum+TqTs[i];
  207. }
  208. Everage=Sum/Count;
  209. for (i=9,circle=0;i<=33,circle<Count;i=i+6,circle++)
  210. Record.GetRectangle(i)->Display(EndTime[circle]);
  211. for (i=10,circle=0;i<=34,circle<Count;i=i+6,circle++)
  212. Record.GetRectangle(i)->Display(Tq[circle]);
  213. setcolor(12);
  214. for (i=11;i<=35;i=i+6)
  215. Record.GetRectangle(i)->Outtextxy("Thinking...");
  216. getch();
  217. outtextxy(100,330,"----- Result -----");
  218. gotoxy(19,23);
  219. printf("The Everage Time Of (Tq/Ts) IS : %f",Everage);
  220. getch();
  221. }
  222. void Version()
  223. {
  224. setcolor(14);
  225. outtextxy(150,400,"    DESIGNED BY NEWTRUMP 2001.01.01     ");
  226. outtextxy(150,420,"            Version 1.0                 ");
  227. }