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

歡迎訪問 生活随笔!

生活随笔

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

windows

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

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

文章目錄

  • 前言
  • 一、課程設計要求簡述
    • 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
不需要掌握所有用法,僅完成任務的話會使用即可。
在主函數的最初初始化:

static Timer timer= new Timer();

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

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

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

編寫進程調度進程類TheardSchedule,

此類負責將作業裝進CPU,切換作業,當作業需要執行時,將一切參數送進cpurun中執行作業,根據指令進行程序運行
具體邏輯為:
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執行進程,使用函數cpurun()elseCPU中進程進入就緒隊列進行低級調度時間片重置執行進程,使用函數cpurun()end

編寫IO管理進程類TheardIO

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

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

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
地址變化類
注意如果新增作業請求,此算法就會出現混亂,必須更改

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

以上是內存,先寫出時間片與CPU運行

總結

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。