資源簡介
最近要寫計算機操作系統大作業,老師要求用代碼實現進程控制模塊的模擬,在網上看了許多資源,發現都不是很符合我的需求,于是自己動手寫了一個。但由于時間倉促,而且自己也懶得寫那么多,所以項目僅僅實現了進程創建、簡單的資源分配、進程阻塞(這個功能實現的很爛)、進程按優先級獲取cpu時間片。
壓縮包中包含了項目源代碼以及詳細的注釋,另外我使用exe4j生成了一個可執行的exe文件,可以直接在windows上運行。
項目內容并不算詳盡,作為大作業來講可能略顯簡陋(但如果只要求及格且老師要求不算很嚴格的話也勉強能用),具有一定的參考價值。請謹慎下載。

代碼片段和文件信息
package?bean;
import?java.util.ArrayList;
import?java.util.List;
//控制類(OS核心),創建進程,為進程分配系統資源等。
public?class?Control?{
private?static?List?cList?=?new?ArrayList(); //創建進程表
private?static?List?rList?=?new?ArrayList(); //就緒進程表
private?static?List?bList?=?new?ArrayList(); //阻塞進程表
private?static?List?pList?=?new?ArrayList(); //執行進程表
private?static?List?eList?=?new?ArrayList(); //終止進程表
public?static?void?init(){
createPCB(“p1“);
createPCB(“p2“);
createPCB(“p3“);
createPCB(“p4“);
createPCB(“p5“);
createPCB(“p6“);
while(cList.size()>0){
int?j?=?cList.get(0).getPid();
requestMem(j);
}
sortReadList(rList);
System.out.println(rList.size());
System.out.println(“進程按照優先級排列:“);
for(int?i?=?0;?i System.out.println(“進程:“+rList.get(i).getName()+“優先級為“+rList.get(i).getPriority());
}
}
//申請PCB
public?static?void?createPCB(String?name){
PCB?pcb?=?new?PCB(name); //設置進程名稱
pcb.setPid(cList.size()+rList.size()+bList.size()+pList.size()+eList.size());
//設置進程id
System.out.println(“進程“+pcb.getName()+“的pid為“+pcb.getPid());
pcb.setPriority((int)?((Math.random()*7)+1)); //隨機設置進程優先級
pcb.setTime((int)?((Math.random()*30)+1)); //隨機設置進程需要運行的時間
int?mem?=?(int)?((Math.random()*200)+1); //隨機設置進程所需要的內存空間
pcb.setMem(mem);
int?res?=?(int)?((Math.random()*50)+1); //隨機設置進程所需要的系統資源
pcb.setRes(res);
int?io?=?(int)?((Math.random()*2)); //進程是否需要申請io設備
pcb.setIo(io);
cList.add(pcb); //將創建好的進程加入創建進程表
System.out.println(“進程“+pcb.getName()+“創建完畢,已加入創建隊列,等待分配系統資源...“);
}
//分配內存資源
public?static?void?requestMem(int?pid){
PCB?pcb?=?null;
for(int?i?=?0;?i if(cList.get(i).getPid()==pid){
pcb?=?cList.get(i);
cList.remove(i);
break;
}
}
int?mem?=?Resource.getMemory();
//如果系統可用內存大于進程所需內存,則為其分配內存資源
if(pcb.getMem()<=?mem){
System.out.println(“進程“+pcb.getName()+“已分配內存空間:“+pcb.getMem());
Resource.setMemory(mem-pcb.getMem());
//將進程從創建隊列中移除,并將進程狀態改為就緒狀態,最后將進程加入到就緒隊列中。
pcb.setSt(“R“);
rList.add(pcb);
System.out.println(“系統剩余內存空間:“+Resource.getMemory());
System.out.println(“進程“+pcb.getName()+“所需內存已分配完畢,加入就緒隊列,等待運行...“);
}
//否則,不分配
else{
System.out.println(“系統可用內存不足,進程“+pcb.getName()+“暫時無法獲得內存...“);
}
}
//當進程獲取到cpu執行時間片時嗎,進程需要請求分配系統資源以便完成操作(前提是該進程確實需要系統資源)。
public?static?boolean?requestRes(int?pid){
PCB?pcb?=?pList.get(0);
//先判斷進程是否需要系統資源
if(pcb.getRes()!=0){
//若需要,判斷系統剩余資源是否足夠進程使用
if(pcb.getRes()<=Resource.getOsRes()){
System.out.println(“進程“+pcb.getName()+“已分配到系統資源:“+pcb.getRes());
Resource.setOsRes(Resource.getOsRes()-pcb.getRes());
System.out.println(“剩余系統資源為“+Resource.getOsRes());
return?true;
}
//若資源不夠,進程進入阻塞狀態
else{
System.out.println(“進程“+pcb.getName()+“未能獲得需要的系統資源,進
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????418816??2018-12-27?20:20??新建文件夾\PCB.exe
?????目錄???????????0??2018-12-27?21:34??新建文件夾\src\
?????目錄???????????0??2018-12-27?21:34??新建文件夾\src\bean\
?????文件????????7238??2018-12-27?19:54??新建文件夾\src\bean\Control.java
?????文件????????1511??2018-12-27?17:12??新建文件夾\src\bean\PCB.java
?????文件?????????801??2018-12-27?13:38??新建文件夾\src\bean\Resource.java
?????目錄???????????0??2018-12-27?21:35??新建文件夾\
評論
共有 條評論