資源簡介
課程要求:
用高級語言編寫程序,模擬實現一個簡單功能的操作系統。
(1) 提交一批作業(>=10),按先來先服選擇一部分作業(最多5個)進入內存
(2) 為每個作業創建一個進程,并分配內存(用戶內存:0—1024K,采用可變連續分配方式)
(3) 進程調度功能(時間片輪轉)
(4) 隨機阻塞進程,并在一段時間后喚醒進程(選做)
(5) 顯示相關信息:后備作業隊列、內存分配情況、進程信息、完成作業情況
(6) 這些功能要有機地連接起來

代碼片段和文件信息
import?java.util.linkedList;
import?java.util.Random;
public?class?ProcessMemoryController?{
????int?NUM?=?10;//進程數
????int?ACCURACY?=?1;//控制格式化后小數點后面的位數
????int?THRESHOLD?=?5;//允許并發的進程數量,小于時從后備隊列調入進程
????int?MINSIZE?=?30;//控制內存碎片的產生
????PCB[]?pcb?=?new?PCB[NUM];
????linkedList?memoList?=?new?linkedList<>();
????double?pTime;?????//時間片定義
????int?run;???????//當前運行的進程,沒有則為-1
????long?lastTime;??//每次調度程序都記錄當前時間
????long?beginTime;//程序開始時間
????//進程PCB塊類
????private?class?PCB?{
????????String?name;???????//進程名
????????double?arrtime;????//到達時間
????????double?needtime;???//需要運行時間
????????double?usedtime;???//已用時間
????????int?needmemo;??????//所需內存
????????int?address;???????//主存起始位置
????????char?state;????????//進程狀態
????}
????//內存條目類
????private?class?MemoItem?{
????????//內存表條目
????????int?address?=?0;
????????int?length?=?0;
????????char?state?=?‘F‘;//B代表busy繁忙或F代表free空閑
????????public?MemoItem(int?address?int?length)?{
????????????this.address?=?address;
????????????this.length?=?length;
????????}
????}
????//定義bool類型的所有進程調度結束函數
????boolean?isAllFinished()?{
????????for?(int?i?=?0;?i?????????????if?(pcb[i].state?!=?‘F‘)?return?false;
????????}
????????return?true;
????}
????//初始化各個參數
????void?init()?{
????????run?=?-1;
????????Random?r?=?new?Random();
????????for?(int?n?=?0;?n?????????????pcb[n]?=?new?PCB();
????????????pcb[n].name?=?Character.toChars(65?+?n)[0]?+?““;
????????????pcb[n].needtime?=?r.nextDouble()?*?2?+?3;//2到5秒
????????????pcb[n].needmemo?=?r.nextInt(200)?+?250;//需要的內存為200到450
????????????if?(n?==?0)?{
????????????????pcb[n].arrtime?=?0;
????????????????pcb[0].needmemo?=?50;
????????????}?else?{
????????????????pcb[n].arrtime?=?r.nextDouble()?*?5?+?1;
????????????????pcb[n].needmemo?=?r.nextInt(300)?+?150;//需要的內存為300到450
????????????}
????????}
????????for?(int?n?=?0;?n?????????????pcb[n].usedtime?=?0;
????????????pcb[n].address?=?0;
????????????pcb[n].state?=?‘U‘;
????????}
????????//設置起始地址為30,初始化的長度在100到150之間
????????MemoItem?first?=?new?MemoItem(30?r.nextInt(100)?+?50);
????????memoList.add(first);
????????MemoItem?prev?=?first;
????????for?(;?;?)?{
????????????int?address?=?prev.address?+?prev.length;
????????????if?(address?>=?1024)?break;
????????????int?length?=?r.nextInt(50)?+?50;
????????????MemoItem?ano?=?new?MemoItem(address?length);
????????????memoList.add(ano);
????????????prev?=?ano;
????????}
????}
????//格式化輸出展示數據
????String?d2s(double?d)?{
????????String?tmp?=?d?+?““;
????????int?index?=?tmp.indexOf(“.“);
????????return?tmp.substring(0?index?+?ACCURACY?+?1);
????}
????//先來先服務時間排序
????void?sortByArrtime()?{
????????int?i?j;
????????PCB?temp;
????????for?(i?=?0;?i?????????{
????????????for?(j?=?0;?j?????????????????if?(pcb[j?+?1].arrtime?????????????????????temp?=?pcb[j];
??????????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????276??2020-07-09?20:53??source\代碼\.idea\misc.xm
?????文件????????259??2020-07-09?20:53??source\代碼\.idea\modules.xm
?????文件???????5320??2020-08-19?11:58??source\代碼\.idea\workspace.xm
?????文件????????433??2020-07-09?20:53??source\代碼\source.iml
?????文件??????10970??2020-08-19?11:58??source\代碼\src\ProcessMemoryController.java
?????文件?????972021??2020-08-19?11:55??source\文檔.docx
?????目錄??????????0??2020-08-19?11:58??source\代碼\.idea
?????目錄??????????0??2020-08-19?11:58??source\代碼\src
?????目錄??????????0??2020-08-19?11:58??source\代碼
?????目錄??????????0??2020-08-19?11:58??source
-----------?---------??----------?-----??----
???????????????989279????????????????????10
評論
共有 條評論