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

Windows编程

开发平台:

Visual C++

  1. //THE PROGRAM IS TO DISPLAY THE OPREATING SYSTEM'S
  2. //PROCESS PAGE DISTRIBUTE.
  3. //FILE PAGE.CPP
  4. #include    <stdio.h>
  5. #include    <conio.h>
  6. #include   <string.h>
  7. #include   <stdlib.h>
  8. #include <graphics.h>
  9. #define MAX 100
  10. #define Count 5
  11. int TableLength,Virtual[MAX];
  12. int Length[Count],Privilege[Count];
  13. int Normal[Count],IOTime[Count],Finish[Count];
  14. void Kernel(void);
  15. void Result(void);
  16. void Version(void);
  17. int IF_Finish(void);
  18. void InitGrid(void);
  19. void InitGraph(void);
  20. void InitRecord(void);
  21. void InitProcess(void);
  22. class Node
  23. {
  24. private :
  25. int ID;
  26. int Length;
  27. int Privilege;
  28. int Temp[MAX];
  29. public :
  30. Node()
  31. {
  32. for (int i=0;i<MAX;i++) Temp[i]=-1;
  33. }
  34. void SetID(int I)
  35. {
  36. ID=I;
  37. }
  38. void SetLength(int L)
  39. {
  40. Length=L;
  41. }
  42. void SetPrivilege(int P)
  43. {
  44. Privilege=P;
  45. }
  46. void SetPosition(int Order)
  47. {
  48. Virtual[Order]=ID;
  49. Temp[Order]=ID;
  50. }
  51. void Release(void)
  52. {
  53. for (int i=0;i<TableLength;i++)
  54. if (Virtual[i]==ID)
  55. {
  56. Virtual[i]=-1;
  57. Graph.GetRectangle(i)->Fill(0);
  58. }
  59. }
  60. int GetID(void){return ID;}
  61. int GetLength(void){return Length;}
  62. int GetPrivilege(void){return Privilege;}
  63. int GetPosition(void)
  64. {
  65. for (int i=0;i<TableLength;i++)
  66. {
  67. if (Temp[i]==ID) break;
  68. }
  69. if (Temp[i]==-1) return MAX;
  70. else
  71. {
  72. Temp[i]=-1;
  73. return i;
  74. }
  75. }
  76. };
  77. class Rectangle
  78. {
  79. friend class Grid;
  80. private :
  81. int left,top,right,bottom;
  82. char content[50];
  83. public :
  84. void Outtextxy(char text[50])
  85. {
  86. strcpy(content,text);
  87. outtextxy(left+9,top+7,content);
  88. }
  89. void Fill(int Number)
  90. {
  91. setfillstyle(SOLID_FILL,Number);
  92. bar3d(left,top,right,bottom,0,0);
  93. getch();
  94. }
  95. void Test(int Temp,int Interval)
  96. {
  97. if (Temp==0) outtextxy(left+45+Interval,top+7,"0");
  98. if (Temp==1) outtextxy(left+45+Interval,top+7,"1");
  99. if (Temp==2) outtextxy(left+45+Interval,top+7,"2");
  100. if (Temp==3) outtextxy(left+45+Interval,top+7,"3");
  101. if (Temp==4) outtextxy(left+45+Interval,top+7,"4");
  102. if (Temp==5) outtextxy(left+45+Interval,top+7,"5");
  103. if (Temp==6) outtextxy(left+45+Interval,top+7,"6");
  104. if (Temp==7) outtextxy(left+45+Interval,top+7,"7");
  105. if (Temp==8) outtextxy(left+45+Interval,top+7,"8");
  106. if (Temp==9) outtextxy(left+45+Interval,top+7,"9");
  107. }
  108. void Display(int number)
  109. {
  110. int Temp=number;
  111. if ((Temp>=0) && (Temp<=9))
  112. {
  113. Test(Temp,0);
  114. }
  115. if ((Temp>=10) && (Temp<=99))
  116. {
  117. Temp=int (Temp/10);
  118. Test(Temp,0);
  119. Temp=number-Temp*10;
  120. Test(Temp,5);
  121. }
  122. }
  123. };
  124. class Grid
  125. {
  126. private :
  127. Rectangle *Array[100];
  128. public :
  129. Grid(){};
  130. void NewRectangle(int number,int a,int b,int c,int d)
  131. {
  132. Rectangle *Newrect;
  133. Newrect=new Rectangle;
  134. Newrect->left=a;
  135. Newrect->top=b;
  136. Newrect->right=c;
  137. Newrect->bottom=d;
  138. rectangle(a,b,c,d);
  139. Array[number]=Newrect;
  140. }
  141. Rectangle *GetRectangle(int number)
  142. {
  143. return Array[number];
  144. }
  145. };
  146. Grid Record,Graph;
  147. Node Table[50];
  148. int main(void)
  149. {
  150. InitProcess();
  151. getch();
  152. InitGraph();
  153. InitRecord();
  154. InitGrid();
  155. Kernel();
  156. Result();
  157. Version();
  158. getch();
  159. closegraph();
  160. return 0;
  161. }
  162. void InitProcess(void)
  163. {
  164. int i;
  165. window(1,1,80,25);
  166. textbackground(1);
  167. textcolor(14);
  168. clrscr();
  169. for (i=0;i<MAX;i++) Virtual[i]=-1;
  170. printf("n       ------  The Process Of Page Distribute  ------n");
  171. printf("n***** Input The Page Table Length Of The Process : ");
  172. scanf("%d",&TableLength);
  173. for (i=0;i<Count;i++)
  174. {
  175. printf("n----- Input The Length Of The Process %d : ",i+1);
  176. scanf("%d",&Length[i]);
  177. printf("n***** Input The Prilvilege Of The Process %d : ",i+1);
  178. scanf("%d",&Privilege[i]);
  179. }
  180. }
  181. void InitGraph(void)
  182. {
  183. int Gdriver=DETECT,Gmode,Errorcode;
  184. initgraph(&Gdriver,&Gmode,"d:\TOOLS\TC3.0\BGI");
  185. Errorcode=graphresult();
  186. if (Errorcode!=grOk)
  187. {
  188. printf("Graphics Error: %sn",grapherrormsg(Errorcode));
  189. printf("Press any key to exit:");
  190. getch();
  191. exit(1);
  192. }
  193. }
  194. void InitRecord(void)
  195. {
  196. int number=0,circle,i;
  197. for (i=0;i<Count+1;i++)
  198. {
  199. for (circle=0;circle<Count+1;circle++)
  200. {
  201. Record.NewRectangle(number,15+circle*100,20+i*20,
  202. circle*100+115,20+((i+1)*20));
  203. number=number+1;
  204. }
  205. }
  206. setcolor(14);
  207. Record.GetRectangle(1)->Outtextxy("  Length  ");
  208. Record.GetRectangle(2)->Outtextxy("Privilege ");
  209. Record.GetRectangle(3)->Outtextxy("  Normal  ");
  210. Record.GetRectangle(4)->Outtextxy("  Colour  ");
  211. Record.GetRectangle(5)->Outtextxy("I/O  Times");
  212. Record.GetRectangle(6)->Outtextxy("    P1    ");
  213. Record.GetRectangle(12)->Outtextxy("    P2    ");
  214. Record.GetRectangle(18)->Outtextxy("    P3    ");
  215. Record.GetRectangle(24)->Outtextxy("    P4    ");
  216. Record.GetRectangle(30)->Outtextxy("    P5    ");
  217. setcolor(9);
  218. for (i=7,circle=0;i<=31,circle<Count;i=i+6,circle++)
  219. Record.GetRectangle(i)->Display(Length[circle]);
  220. for (i=8,circle=0;i<=32,circle<Count;i=i+6,circle++)
  221. Record.GetRectangle(i)->Display(Privilege[circle]);
  222. for (i=9,circle=0;i<=33,circle<Count;i=i+6,circle++)
  223. Record.GetRectangle(i)->Display(Normal[circle]);
  224. for (i=11,circle=0;i<=35,circle<Count;i=i+6,circle++)
  225. Record.GetRectangle(i)->Display(IOTime[circle]);
  226. setcolor(9);
  227. Record.GetRectangle(10)->Outtextxy("   BLUE   ");
  228. setcolor(10);
  229. Record.GetRectangle(16)->Outtextxy("  GREEN   ");
  230. setcolor(11);
  231. Record.GetRectangle(22)->Outtextxy("   CYAN   ");
  232. setcolor(12);
  233. Record.GetRectangle(28)->Outtextxy("   RED    ");
  234. setcolor(13);
  235. Record.GetRectangle(34)->Outtextxy("  MAGENTA ");
  236. }
  237. void InitGrid(void)
  238. {
  239. int number=0,circle=0;
  240. setcolor(11);
  241. outtextxy(155,180,"The Process Of Memory Page Distribute");
  242. setlinestyle(CENTER_LINE,1,1);
  243. line(15,200,610,200);
  244. setcolor(15);
  245. setlinestyle(DOTTED_LINE,1,0);
  246. for (circle=0;circle<TableLength;circle++)
  247. {
  248. Graph.NewRectangle(number,30+circle*20,250,circle*20+50,270);
  249. number=number+1;
  250. }
  251. }
  252. int IF_Finish(void)
  253. {
  254. if (Finish[0]+Finish[1]+Finish[2]+Finish[3]+Finish[4]==5)
  255. return 1;
  256. else return 0;
  257. }
  258. void Kernel(void)
  259. {
  260. int i=0,j=0,Free=0,Current=0,EndIn=0;
  261. int MinPrivilege=0,MinID=Count;
  262. Node TempNode;
  263. Free=TableLength;
  264. Table[0].SetID(0);
  265. Table[0].SetLength(Length[0]);
  266. Table[0].SetPrivilege(Privilege[0]);
  267. for (i=0;i<Table[0].GetLength();i++) Table[0].SetPosition(i);
  268. Current=0;
  269. while (IF_Finish()==0)
  270. {
  271. TempNode=Table[Current];
  272. if ((TempNode.GetLength()<Free) || (TempNode.GetLength()==Free))
  273. {
  274. Finish[TempNode.GetID()]=1;
  275. j=0;
  276. while (j!=MAX)
  277. {
  278. j=TempNode.GetPosition();
  279. if (j!=MAX)
  280. Graph.GetRectangle(j)->Fill(TempNode.GetID()+9);
  281. }
  282. if (TempNode.GetPrivilege()>MinPrivilege)
  283. {
  284. MinPrivilege=TempNode.GetPrivilege();
  285. MinID=TempNode.GetID();
  286. }
  287. Free=Free-TempNode.GetLength();
  288. if (Current==Count-1) EndIn=1;
  289. if (EndIn==0)
  290. {
  291. Table[Current+1].SetID(Current+1);
  292. Table[Current+1].SetLength(Length[Current+1]);
  293. Table[Current+1].SetPrivilege(Privilege[Current+1]);
  294. i=0;
  295. j=0;
  296. while ((j<Length[Current+1]) && (Length[Current+1]<=Free))
  297. {
  298. if (Virtual[i]==-1)
  299. {
  300. Table[Current+1].SetPosition(i);
  301. j=j+1;
  302. }
  303. i=i+1;
  304. }
  305. }
  306. }
  307. else
  308. {
  309. Table[MinID].Release();
  310. Free=Free+Table[MinID].GetLength();
  311. i=0;
  312. j=0;
  313. while ((j<Length[Current]) && (Length[Current]<=Free))
  314. {
  315. if (Virtual[i]==-1)
  316. {
  317. Table[Current].SetPosition(i);
  318. j=j+1;
  319. }
  320. i=i+1;
  321. }
  322. MinID=MinID-1;
  323. Current=Current-1;
  324. }
  325. Current=Current+1;
  326. }
  327. }
  328. void Result()
  329. {
  330. getch();
  331. setcolor(14);
  332. outtextxy(200,300,"Default : When there is no page for new process ,");
  333. outtextxy(250,320,"Clear the lowest privilege process in table !");
  334. setcolor(12);
  335. outtextxy(100,340,"***** Result *****");
  336. setcolor(11);
  337. outtextxy(120,360,"----- The Above Is The Page Distribute Graph -----");
  338. getch();
  339. }
  340. void Version()
  341. {
  342. setcolor(14);
  343. outtextxy(150,400,"    DESIGNED BY NEWTRUMP 2001.01.01  ");
  344. outtextxy(150,420,"             Version 1.0                ");
  345. }