南京农业大学 操作系统课程设计
文章目錄
- 前言
- 一、課程設計要求簡述
- 1. 多線程方面
- 2. 時間方面
- 3. 輸入
- 4. 輸出
- 5. 基礎要求
- 二、大體思路講解
- 1.從零開始的操作系統思路
- 1.1 作業要求梳理
- 1.2 從文件中讀取數據
- 1.3 編寫時鐘類
- 1.4 將作業加載到CPU中
- CPU靜態類
- 編寫進程調度進程類TheardSchedule,
- 編寫IO管理進程類TheardIO
- 2.具體問題的解決
- 2.1 極簡作業調度算法
- 2.2 解決線程間唯一的沖突
- 2.3 五個線程一覽
- 2.4 MMU
- 總結
前言
本人剛剛經歷過南京農業大學的操作系統課程設計,深感無參考無代碼無思路之抓狂,現將本人代碼及思路記載如下,如果能幫助到有一些需要的人,那就是無上功德了。代碼可能有奇奇怪怪的錯誤,思路上可能走了許多彎路,僅供參考。
一、課程設計要求簡述
1. 多線程方面
至少用 5 個線程分別仿真作業請求、進程調度、輸入輸出處理、缺頁中斷處理、磁盤文件操作
2. 時間方面
時鐘中斷,并發使用,線程輪詢每1秒有沒有新的外部請求,調度時使用時間片輪轉,假設計算機每 5 秒查詢一次,判斷是否有新作業的執行請求,由作業并發請求中斷的線程單獨實現。
3. 輸入
輸入兩個文件,
1921812-jobs-input.txt 共有四項
作業序號(JobsID)
作業優先級(Priority)
作業請求時間(InTimes)
作業包含的程序指令數目(InstrucNum)
1.txt 2.txt… 也有四項
指令段編號(Instruc_ID)
用戶程序指令的類型(Instruc_State)
用戶程序指令訪問的邏輯地址(L_Address)
每條指令運行時間(InRunTimes)
4. 輸出
要求在窗口界面輸出每秒程序運行情況,要求可以隨時保存所有程序運行情況到txt文件中
5. 基礎要求
◆基礎硬件部件: CPU、內存、時鐘中斷、設備中斷、MMU;
◆擴展硬件部件:缺頁中斷、緩沖區、磁盤交換區、磁盤等;
◆內存與硬盤:共 32KB,每個物理塊大小 1024B,共 32 個物理塊。10 個柱面,1 個柱面有 32 個磁道,1 個磁道中有 64 個扇區。假設 1 個扇區為 1 個物理塊,每個物理塊大小 1024B。
◆本文及代碼完成的最基礎要求。多任務作業并發環境下,實現 MMU 地址變換、作業
調度算法、進程原語、優先級+時間片輪轉進程調度算法,位示圖法實現連續空間動態分配。
二、大體思路講解
1.從零開始的操作系統思路
1.1 作業要求梳理
從輸入輸出看起,接受的輸入簡單來說是兩個級別:作業級別與指令級別
程序需要接受的輸入是有幾個作業,他們什么時候進入,在同時進入的時候先運行哪個其中有什么規則,此為程序需要解決的大問題
重點:何時更改運行的作業:新進入作業排序時,某作業完全運行成功時。
具體到作業,則是該作業運行時,該執行哪個指令了,該指令是什么類型,根據類型明白該指令是對內存做什么修改,以及知道運行多長時間,
重點:何時更改運行的指令:指令運行結束時,指令的上司作業被拿下時,指令因為進入阻塞狀態而把CPU資源讓給其他指令時。
不重要的:eclipse寫界面應用程序,寫好之后,復制到idea里面直接使用,較為方便
1.2 從文件中讀取數據
總而言之,飯要一口一口吃,先解決從文件中讀取數據到程序的數據結構中,使用起來既方便速度又快捷。對了,如果追求更高要求,就要考慮到在程序運行過程中更改作業文件,這樣的情況下就要設置在程序運行過程中讀取文件了,你看作業管理類是不是很適合兼職。
1.3 編寫時鐘類
多線程的最簡單實現:使用Time與Schedule
不需要掌握所有用法,僅完成任務的話會使用即可。
在主函數的最初初始化:
主類初始化運行時(每間隔1000ms啟動ThreadTime線程,起始時間為0)
timer.schedule(new TheardTime(),0, 1000);具體類中具體實現(重寫run方法)
class TheardTime extends TimerTask{public void Schedule(){}public void run(){}讀取數據后中的任務,最重要最基礎的就是時鐘,所有類與進程與線程都依靠她進行,很簡單的把之前的Timer的應用熟練一遍(查看2.1)
class TheardTime extends TimerTask{static int time = 0;static boolean limit = false;public void run() {//System.out.println(time + "!");++time;limit=true;} }看我注釋掉的代碼,就是為了運行過程中方便查看,畢竟設斷點調試也很麻煩,對了,idea這款編譯器不錯,導入項目導出包方便,快捷鍵什么的很多,關鍵是漂亮,顏值高,那還要什么自行車。
之后就是之前說的作業加載到系統中,再運行作業。
1.4 將作業加載到CPU中
CPU靜態類
首先將CPU靜態類(含有CPU中必要的參數和CPU運行方法、以及低級調度方法,以及就緒隊列和阻塞隊列)編寫出來,思考在作業執行過程中需要用到哪些參數,舉例為:
PC程序計數器,
IR,
PSW程序CPU狀態,
現在運行的進程序號及現在運行的進程命令種類,
L_Address指令邏輯地址(與MMU存儲地址有關,先虛置),
timeslice時間片,
就緒隊列以及阻塞隊列,這里采用Queue,初始化采用LinkedList
CPU中方法還包括
模擬CPU中如何運行進程:cpurun():
模擬低級調度:LowScheduling():快速排序
編寫進程調度進程類TheardSchedule,
此類負責將作業裝進CPU,切換作業,當作業需要執行時,將一切參數送進cpurun中執行作業,根據指令進行程序運行
具體邏輯為:
if c then s或者
編寫IO管理進程類TheardIO
理論上管理程序輸入與輸出,實際上…
建議采用進程同步的讀者寫者修飾下,顯得高端
2.具體問題的解決
2.1 極簡作業調度算法
低級調度
核心采用折半排序,實際上是將優先級排序
稍微有點難度的反而是排序算法肯定是針對int的,但可以將隊列先poll出來,再offer回去,中間排序算法針對的是int數組。
每次調用該算法記得要開頭新建數組,結尾銷毀數組因為每次的數組長度都會變。
慎重,極不嚴謹。
2.2 解決線程間唯一的沖突
時間管理專門類(專門將系統時間+1)應在進程調度之前,
很明顯,其間有一個簡單的先后關系,借鑒操作系統中的讀者-寫者問題,解決辦法為加一個time類加上limit變量,此變量初始為false,TheardTime類運行結束后改為true,TheardSchedule運行開始前limit變量必須為true,運行完改為flase
2.3 五個線程一覽
timer.schedule(new TheardTime(),0, 1000);//時間管理進程類:管理時鐘與時鐘按時間增加 timer_job.schedule(new TheardWork(),0,5000);//作業管理進程類:每5s檢測是否有作業進入 timer_process.schedule(new TheardSchedule(),0,1000);//進程調度進程類,管理CPU的運行問題,并且和TheardTime通過變量實現先后關系 timer_io.schedule(new TheardIO(),0,1000);//IO管理進程類:管理程序輸入與輸出 timer_document.schedule(new ThreadDoc(),0,1000);//文件管理進程類:管理地址相關問題2.4 MMU
要求三 連續存儲空間:最簡單的連續動態內存管理,MMU 地址變換,實際只需要設計數組即可(注意:需要適配要求,好運不可能每次)
(要求回顧)硬盤:10個柱面,1個柱面有32個磁道,1個磁道中有64個扇區。假設1個扇區為1個物理塊,每個物理塊大小1024B。
物理地址為 16 位。
數據存儲的單位為雙字節. 設計地址編碼長度 需要符合要求。
假設1個扇 區為1個物理塊,每個物理塊大小1024B。 據視頻親口所說,是可以一個內存小塊為一個物理塊的,
所以全程序共分為20480個物理塊 103264 個物理塊 =20479 20480
5個進程的話,每個進程4096塊
0-4096 4097-8192 8193-12288 12289-16384 16385-20480
邏輯地址,物理地址的計算 5個進程
每個進程23264=60*60 30條指令
每個都跳轉, 不跳轉+2,跳轉的話加20(自己設定?)
所以最多利用每個進程4096中的600 ok
地址變化類
注意如果新增作業請求,此算法就會出現混亂,必須更改
以上是內存,先寫出時間片與CPU運行
總結
嘔心瀝血之后再看,只覺風輕云淡,甚至有心情分享出來寫博客。但當時我多么焦急多么無助,只有自己知道。諸位,莫避春陰上馬遲,春來未有不陰時。
總結
以上是生活随笔為你收集整理的南京农业大学 操作系统课程设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(1611):redux使用
- 下一篇: “睡服”面试官系列第十四篇之数组的扩展(