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