日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

南京农业大学 操作系统课程设计

發(fā)布時間:2023/12/10 windows 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 南京农业大学 操作系统课程设计 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、課程設(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ù)的最初初始化:

static Timer timer= new Timer();

主類初始化運行時(每間隔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

static Queue<PCB> BqTimes = new LinkedList<PCB>(); //就緒隊列: 進程進入鍵盤輸入阻塞隊列時間

CPU中方法還包括
模擬CPU中如何運行進程:cpurun():
模擬低級調(diào)度:LowScheduling():快速排序

編寫進程調(diào)度進程類TheardSchedule,

此類負責將作業(yè)裝進CPU,切換作業(yè),當作業(yè)需要執(zhí)行時,將一切參數(shù)送進cpurun中執(zhí)行作業(yè),根據(jù)指令進行程序運行
具體邏輯為:
if c then s或者

if a[j]>a[j+1] thenbeginchange:=true;temp:=a[j]; a[j]:=a[j+1]; a[j+1]:=temp;end;if CPU空閑(PSW)thenbeginif 就緒隊列不為空 then就緒隊列隊首出隊列else顯示空閑end elsebeginif 時間片未用完 then執(zhí)行進程,使用函數(shù)cpurun()elseCPU中進程進入就緒隊列進行低級調(diào)度時間片重置執(zhí)行進程,使用函數(shù)cpurun()end

編寫IO管理進程類TheardIO

理論上管理程序輸入與輸出,實際上…
建議采用進程同步的讀者寫者修飾下,顯得高端

if 阻塞隊列1不為空 thenbeginif 阻塞隊列首時間到 then阻塞隊列隊首出隊列更新阻塞隊列時間塞進就緒隊列(根據(jù)進入的調(diào)度算法排序就緒隊列)elseend else if 阻塞隊列2...不為空

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)混亂,必須更改

/*** 邏輯地址增加,順序* @param add 原有邏輯地址* @return 現(xiàn)邏輯地址*/static int enheng(int add){}/*** 邏輯地址增加,跳躍* @param add 原有邏輯地址* @return 現(xiàn)邏輯地址*/static int enheng2(int add){}/*** 邏輯地址與物理地址轉(zhuǎn)換* @param I 進程編號* @param add 邏輯地址* @return 物理地址*/static int enheng3(int i,int add){} }

以上是內(nèi)存,先寫出時間片與CPU運行

總結(jié)

嘔心瀝血之后再看,只覺風輕云淡,甚至有心情分享出來寫博客。但當時我多么焦急多么無助,只有自己知道。諸位,莫避春陰上馬遲,春來未有不陰時。

總結(jié)

以上是生活随笔為你收集整理的南京农业大学 操作系统课程设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。