当前位置:   article > 正文

进程管理系统的设计与实现 SDUT 操作系统实训 项目 Java_进程管理系统的实现

进程管理系统的实现

进程管理系统的设计与实现

要求:
(1)设计一个完整的进程调度系统,至少包含三种常用的算法(FCFS、SPF、静态优先权、响应比、时间片轮转),系统中至少包含5个进程,并且能够体现进程的动态申请;

(2)定义PCB;

(3)结果要能够显示出进程的调度序列及进入系统的时间、运行时间、完成时间、周转时间、带权周转时间、优先权等必要信息;

(4〉设计的输入数据要能体现算法的思想

 

本人使用Java语言编写,编写过程中在网络中查找大量资料。

本人是本篇代码的唯一作者。

本代码仅限参考学习,禁止抄袭!
 

 

各算法介绍:

先来先服务算法First Come First Service(FCFS):

FCFS的意思是先来先服务(First Come First Service)。
顾名思义就是按照进程被添加到等待队列的先后顺序来进行调用的。


短进程优先算法Short Process First(SPF):

SPF的意思是短进程优先(Short Process First),服务时间短的进程在就绪队列前面。


静态优先级调度算法Static Priority-scheduling algorithm(SPSA):

系统在调度进程时按优先级从高到低进行调度,在进程运行过程中优先级不再动态地改变。


高响应比优先调度算法Highest Response Ratio Next(HRRN):

响应比 =(等待时间+要求服务时间)/ 要求服务时间
为每一个作业引入一个动态优先级,即优先级是可以改变的。
它随等待时间延长而增加,这将使长作业的优先级在等待期间不断地增加,
等到足够的时间后,必然有机会获得处理机。


时间片轮转算法Round Robin(RR):

系统把所有就绪进程按先来先服务规则排成一个队列,就绪队列中的所有进程,
可以依次轮流获得一个时间片的处理时间,然后系统又回到队列的开始部分,如此不断循环。

 

代码部分:

Main:

  1. package osProject.sjs;
  2. import java.io.*;
  3. import java.util.*;
  4. public class Main
  5. {
  6. static int num;//进程数目
  7. static PCB[] arr = new PCB[100];
  8. static PCB[] arrUse = new PCB[100];
  9. static Scanner sc = new Scanner(System.in);
  10. public static void main(String[] args)
  11. {
  12. System.out.println("欢迎进入进程管理系统,请按照提示输入进程信息。");
  13. Main M = new Main();
  14. M.inputProcessInf(M);//输入进程,选择输入进程的方式
  15. M.displayProcessInf();//展示进程初始信息
  16. //进入菜单选择功能,可以使用多个算法调度进程
  17. while(true)
  18. {//此while为了多次选择功能i,在选择退出功能时置flag=1,然后退出
  19. //本程序使用arrUse而保留arr原数据,为了每次进入不同算法时不存在其他算法的遗留结果数据
  20. M.copyArray();//将arr中的数据内容拷贝到arrUse中,令算法使用arrUse中未被赋值过的干净数据
  21. int flag = 0;//用来标记是否需要退出选择算法,置1则退出算法
  22. M.displayMenu();//展示系统菜单,每执行完一次功能i,再次选择功能时展示一次
  23. while(true)
  24. {//为了防止输入i的错误导致无法选择功能,此while直到正确选择功能i时退出,每个if的最后都要有break
  25. try
  26. {//在try语句块中书写可能发生异常的代码(选择功能),增强程序健壮性
  27. int i = sc.nextInt();
  28. if(i == 1)
  29. {//选择先来先服务算法FCFS
  30. executeFCFS();//执行FCFS算法
  31. break;
  32. }
  33. else if(i == 2)
  34. {//选择短进程优先算法SPF
  35. executeSPF();//执行SPF算法
  36. break;
  37. }
  38. else if(i == 3)
  39. {//选择静态优先级调度算法SPSA
  40. executeSPSA();//执行SPSA算法
  41. break;
  42. }
  43. else if(i == 4)
  44. {//选择高响应比优先调度算法HRRN
  45. executeHRRN();//执行HRRN算法
  46. break;
  47. }
  48. else if(i == 5)
  49. {//时间片轮转算法RR
  50. executeRR();//执行RR算法
  51. break;
  52. }
  53. else if(i == 6)
  54. {//选择退出系统
  55. flag = 1;//flag置1,表示需要退出系统
  56. break;
  57. }
  58. else
  59. {//输入i不是要求的选项,提示重新选择
  60. System.out.println("输入有误,请重新输入:");//提示功能i选择的错误
  61. //输入错误时不需要break,需要重新输入
  62. }
  63. }
  64. catch(Exception e)
  65. {
  66. System.out.println("您输入的不是数字,请重新输入!");
  67. sc = new Scanner(System.in);//这一句要加,否则会进入死循环
  68. }
  69. }
  70. if(flag == 1)
  71. {//当flag置1时,退出系统
  72. break;
  73. }
  74. }
  75. sc.close();
  76. }
  77. private static void executeRR()
  78. {//执行RR算法
  79. RR rr = new RR(num, arrUse, sc);//RR算法需要输入时间片大小,所以需要传入Scanner对象
  80. rr.run();
  81. System.out.println("请选择是否将本次算法执行结果存入文件?");
  82. System.out.println("1.是\t 2.否");
  83. while(true)
  84. {//while死循环是为了防止输入错误时令用户再次输入,否则输入错误后就跳出了,没法选择存文件
  85. int x = sc.nextInt();
  86. if(x == 1 || x == 2)
  87. {
  88. if(x == 1) rr.writeFile();//将类数组写入文件
  89. break;//当选择完文件操作后应该退出本层while
  90. }
  91. else
  92. {
  93. System.out.println("输入有误,请重新输入:");//提示文件操作的选择错误
  94. sc = new Scanner(System.in);
  95. //未选择完文件操纵,不需要退出本层while
  96. }
  97. }
  98. }
  99. private static void executeHRRN()
  100. {//执行HRRN算法
  101. HRRN hrrn = new HRRN(num, arrUse);
  102. hrrn.run();
  103. System.out.println("请选择是否将本次算法执行结果存入文件?");
  104. System.out.println("1.是\t 2.否");
  105. while(true)
  106. {//while死循环是为了防止输入错误时令用户再次输入,否则输入错误后就跳出了,没法选择存文件
  107. int x = sc.nextInt();
  108. if(x == 1 || x == 2)
  109. {
  110. if(x == 1) hrrn.writeFile();//将类数组写入文件
  111. break;//当选择完文件操作后应该退出本层while
  112. }
  113. else
  114. {
  115. System.out.println("输入有误,请重新输入:");//提示文件操作的选择错误
  116. sc = new Scanner(System.in);
  117. //未选择完文件操纵,不需要退出本层while
  118. }
  119. }
  120. }
  121. private static void executeSPSA()
  122. {//执行SPSA算法
  123. SPSA spsa = new SPSA(num, arrUse, sc);//SPSA算法要另外输入优先级,需要Scanner变量(也有其他方法)
  124. spsa.run();
  125. System.out.println("请选择是否将本次算法执行结果存入文件?");
  126. System.out.println("1.是\t 2.否");
  127. while(true)
  128. {//while死循环是为了防止输入错误时令用户再次输入,否则输入错误后就跳出了,没法选择存文件
  129. int x = sc.nextInt();
  130. if(x == 1 || x == 2)
  131. {
  132. if(x == 1) spsa.writeFile();//将类数组写入文件
  133. break;//当选择完文件操作后应该退出本层while
  134. }
  135. else
  136. {
  137. System.out.println("输入有误,请重新输入:");//提示文件操作的选择错误
  138. sc = new Scanner(System.in);
  139. //未选择完文件操纵,不需要退出本层while
  140. }
  141. }
  142. }
  143. private static void executeSPF()
  144. {//执行SPF算法
  145. SPF spf = new SPF(num, arrUse);
  146. spf.run();
  147. System.out.println("请选择是否将本次算法执行结果存入文件?");
  148. System.out.println("1.是\t 2.否");
  149. while(true)
  150. {//while死循环是为了防止输入错误时令用户再次输入,否则输入错误后就跳出了,没法选择存文件
  151. int x = sc.nextInt();
  152. if(x == 1 || x == 2)
  153. {
  154. if(x == 1) spf.writeFile();//将类数组写入文件
  155. break;//当选择完文件操作后应该退出本层while
  156. }
  157. else
  158. {
  159. System.out.println("输入有误,请重新输入:");//提示文件操作的选择错误
  160. sc = new Scanner(System.in);
  161. //未选择完文件操纵,不需要退出本层while
  162. }
  163. }
  164. }
  165. private static void executeFCFS()
  166. {//执行FCFS算法
  167. FCFS fcfs = new FCFS(num, arrUse);
  168. fcfs.run();
  169. System.out.println("请选择是否将本次算法执行结果存入文件?");
  170. System.out.println("1.是\t 2.否");
  171. while(true)
  172. {//此while为了防止输入错误时令用户再次输入,否则输入错误后就跳出了,
  173. //没法选择存文件,此while在选择文件操作完成后退出
  174. int x = sc.nextInt();
  175. if(x == 1 || x == 2)
  176. {
  177. if(x == 1) fcfs.writeFile();//将类数组写入文件
  178. break;//当选择完文件操作后应该退出本层while
  179. }
  180. else
  181. {
  182. System.out.println("输入有误,请重新输入:");
  183. sc = new Scanner(System.in);
  184. //未选择完文件操纵,不需要退出本层while
  185. }
  186. }
  187. }
  188. private void displayMenu()
  189. {
  190. System.out.println("功能菜单:");
  191. System.out.println("***********************************");
  192. System.out.println("* 1.先来先服务算法 *");
  193. System.out.println("* 2.短进程优先算法 *");
  194. System.out.println("* 3.静态优先级算法 *");
  195. System.out.println("* 4.高响应比优先调度算法 *");
  196. System.out.println("* 5.时间片轮转算法 *");
  197. System.out.println("* 6.退出系统 *");
  198. System.out.println("***********************************");
  199. System.out.println("请选择要执行的操作:");
  200. }
  201. private void copyArray()
  202. {//将arr中的数据内容拷贝到arrUse中,使用arrUse而保留arr中的原始数据
  203. //不能使用对象直接赋值,那样它们会引用同一块内容,两者会不独立
  204. for(int i = 0; i < num; i++)
  205. {
  206. arrUse[i] = new PCB();
  207. arrUse[i].setId(arr[i].getId());
  208. arrUse[i].setName(arr[i].getName());
  209. arrUse[i].setArriveTime(arr[i].getArriveTime());
  210. arrUse[i].setServiceTime(arr[i].getServiceTime());
  211. arrUse[i].setVisited(0);
  212. }
  213. }
  214. private void displayProcessInf()
  215. {//展示进程未执行算法时的初始信息
  216. System.out.println("进程初始信息如下:");
  217. for(int i = 0; i < num; i++)
  218. {
  219. //使用式样化输出函数printf()输出信息,使信息便于观看
  220. //左对齐加"-","8"指域宽为8,占8个字符字符串用"s",整型用"d",浮点类型用"f"
  221. System.out.printf("%-8s \t%-8s \t%-8s \t%-8s\n",
  222. "进程id", "进程名", "到达时间", "服务时间");
  223. System.out.printf("%-8d \t%-8s \t%-8d \t%-8d\n",
  224. arr[i].getId(), arr[i].getName(), arr[i].getArriveTime(), arr[i].getServiceTime());
  225. }
  226. System.out.println();
  227. }
  228. private void fileReadProcess()
  229. {//从文件中读入进程信息
  230. File file = new File("processInf.dat");
  231. try
  232. {
  233. FileInputStream fin = new FileInputStream(file);
  234. ObjectInputStream in = new ObjectInputStream(fin);
  235. num = fin.read();
  236. for(int i = 0; i < num; i++)
  237. {
  238. arr[i] = (PCB)in.readObject();
  239. }
  240. in.close();
  241. fin.close();
  242. }
  243. catch(Exception e)
  244. {
  245. System.out.println("文件\"processInf.dat\"不存在!请重新选择:");
  246. return;//若文件不存在需要直接return,否则会输出下方“已读入完成”的语句
  247. }
  248. System.out.println("文件\"processInf.dat\"中的算法数据已读入完成。");
  249. System.out.println();
  250. }
  251. private void fileWriteProcess()
  252. {//将进程块信息写入文件中
  253. File file = new File("processInf.dat");
  254. try
  255. {
  256. FileOutputStream fout = new FileOutputStream(file);
  257. ObjectOutputStream out = new ObjectOutputStream(fout);
  258. fout.write(num);
  259. for(int i = 0; i < num; i++)
  260. {
  261. out.writeObject(arr[i]);
  262. }
  263. out.close();
  264. fout.close();
  265. }
  266. catch(Exception e)
  267. {
  268. e.printStackTrace();
  269. }
  270. System.out.println("本次算法执行结果已存入文件\"processInf.dat\"中。");
  271. System.out.println();
  272. }
  273. private void readProcess()
  274. {//从控制台手动输入进程信息
  275. while(true)
  276. {
  277. try
  278. {//在try语句块中书写可能发生异常的代码,增强程序健壮性
  279. System.out.println("请输入进程数目(2-99):");
  280. num = sc.nextInt();
  281. if(num < 2 || num > 99)
  282. {
  283. System.out.println("您输入的数字不在要求范围内,请重新输入!");
  284. }
  285. else
  286. {
  287. System.out.println("进程数目为:" + num);
  288. System.out.println("请按照提示输入进程相关信息。");
  289. for(int i = 0; i < num; i++)
  290. {
  291. arr[i] = new PCB();
  292. arr[i].setId(i+1);
  293. System.out.println("第" + (i+1) + "个进程名:");
  294. arr[i].setName(sc.next());
  295. System.out.println("进程到达时间:");
  296. arr[i].setArriveTime(sc.nextInt());
  297. System.out.println("进程服务时间:");
  298. arr[i].setServiceTime(sc.nextInt());
  299. arr[i].setVisited(0);//置进程i未被执行过
  300. }
  301. break;//输入完毕,此处记得要break,否则会死循环
  302. }
  303. }
  304. catch(Exception e)
  305. {
  306. System.out.println("您输入的不是数字,请重新输入!");
  307. sc = new Scanner(System.in);//这一句要加,否则会进入死循环
  308. }
  309. }
  310. System.out.println("进程信息输入完成!");
  311. }
  312. private void inputProcessInf(Main M)
  313. {//输入进程,选择输入进程的方式
  314. System.out.println("请选择输入进程方式:");
  315. System.out.println("1.手动输入\t 2.文件读入");
  316. while(true)
  317. {//为了防止输入x的错误导致无法选择功能,此while直到正确选择功能x时退出,每个if的最后都要有break
  318. int x = sc.nextInt();
  319. if(x == 1)
  320. {
  321. M.readProcess();//从控制台读入用户输入的进程块信息,读入一次进程信息,可以使用多个算法计算
  322. System.out.println("是否需要将进程信息保存到文件中?");
  323. System.out.println("1.是\t 2.否");
  324. while(true)
  325. {//此while为了防止输入错误时令用户再次输入
  326. int y = sc.nextInt();
  327. if(y == 1 || y == 2)
  328. {
  329. if(y == 1) M.fileWriteProcess();//将程序中的进程块信息写入文件中
  330. break;//当写入操作完成后,退出while循环
  331. }
  332. else
  333. {
  334. System.out.println("输入有误,请重新输入:");
  335. sc = new Scanner(System.in);
  336. //未正确选择操作,不需要退出本层while
  337. }
  338. }
  339. break;
  340. }
  341. else if(x == 2)
  342. {
  343. M.fileReadProcess();//从文件读入进程块信息
  344. break;
  345. }
  346. else
  347. {
  348. System.out.println("输入有误,请重新输入:");
  349. sc = new Scanner(System.in);
  350. //else中不用break,因为没有正确选择功能,需要在while中再次输入
  351. }
  352. }
  353. }
  354. }

 

PCB(进程控制块):

  1. package osProject.sjs;
  2. import java.io.*;
  3. public class PCB implements Serializable
  4. {
  5. /**
  6. *
  7. */
  8. private static final long serialVersionUID = 1L;
  9. private int id;//进程id
  10. private String name;//进程名称
  11. private int arriveTime;//进程进入系统的时间(未开始服务),进程到达时间
  12. private int serviceTime;//进程服务时间,进程服务时间,需提前给出
  13. private int alreadyServiceTime;//已经服务的时间,进程执行时记录
  14. private int startTime;//进程服务开始时间
  15. private int endTime;//进程服务完成时间
  16. private int turnaroundTime;//周转时间,作业完成时间 - 作业到达时间
  17. private double turnaroundTimeWithRight;//带权周转时间,周转时间 /服务时间
  18. private int priority;//优先级
  19. private double responseRatio;//HRRN中的响应比
  20. private int visited;//是否被执行过,置0为未被执行过,置1为被执行过
  21. PCB(){}//构造函数
  22. public int getId() {
  23. return id;
  24. }
  25. public void setId(int id) {
  26. this.id = id;
  27. }
  28. public String getName() {
  29. return name;
  30. }
  31. public void setName(String name) {
  32. this.name = name;
  33. }
  34. public int getArriveTime() {
  35. return arriveTime;
  36. }
  37. public void setArriveTime(int arriveTime) {
  38. this.arriveTime = arriveTime;
  39. }
  40. public int getServiceTime() {
  41. return serviceTime;
  42. }
  43. public void setServiceTime(int serviceTime) {
  44. this.serviceTime = serviceTime;
  45. }
  46. public int getAlreadyServiceTime() {
  47. return alreadyServiceTime;
  48. }
  49. public void setAlreadyServiceTime(int alreadyServiceTime) {
  50. this.alreadyServiceTime = alreadyServiceTime;
  51. }
  52. public int getStartTime() {
  53. return startTime;
  54. }
  55. public void setStartTime(int startTime) {
  56. this.startTime = startTime;
  57. }
  58. public int getEndTime() {
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/151180
推荐阅读
相关标签
  

闽ICP备14008679号