欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      操作系統(tǒng)進(jìn)程管理系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)報(bào)告

      時(shí)間:2019-05-11 23:56:10下載本文作者:會(huì)員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《操作系統(tǒng)進(jìn)程管理系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)報(bào)告》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《操作系統(tǒng)進(jìn)程管理系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)報(bào)告》。

      第一篇:操作系統(tǒng)進(jìn)程管理系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)報(bào)告

      實(shí)驗(yàn)報(bào)告說明書

      設(shè)計(jì)名稱: 操作系統(tǒng)課程設(shè)計(jì)

      實(shí) 驗(yàn) : 進(jìn)程調(diào)度設(shè)計(jì)

      學(xué)生姓名:

      專 業(yè): 網(wǎng)絡(luò)工程 班 級(jí): 08級(jí)一班 學(xué) 號(hào):

      指導(dǎo)教師:雷曉平王東 黃營 楊躍武 日 期: 2011年 6月 19日

      課程設(shè)計(jì)任務(wù)書

      網(wǎng)絡(luò)工程 專業(yè) 08 年級(jí) 1 班

      一、具體要求

      本課程設(shè)計(jì)共2周,采取集中方式。㈠主要設(shè)計(jì)內(nèi)容

      1、進(jìn)程調(diào)度

      2、存儲(chǔ)管理

      3、文件管理

      ㈡操作系統(tǒng)分項(xiàng)設(shè)計(jì)

      1、設(shè)計(jì)一 :進(jìn)程管理系統(tǒng)設(shè)計(jì)

      目的與要求:本設(shè)計(jì)的目的是加深對(duì)進(jìn)程概念及進(jìn)程管理各部分內(nèi)容的理解;熟悉進(jìn)程管理中主要數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)及進(jìn)程調(diào)度算法、進(jìn)程控制機(jī)構(gòu)、同步機(jī)構(gòu)及通訊機(jī)構(gòu)的實(shí)施。

      要求設(shè)計(jì)一個(gè)允許n個(gè)進(jìn)程并發(fā)運(yùn)行的進(jìn)程管理模擬系統(tǒng)。該系統(tǒng)包括有簡單的進(jìn)程控制、同步與通訊機(jī)構(gòu),其進(jìn)程調(diào)度算法可任意選擇。每個(gè)進(jìn)程用一個(gè)PCB表示,其內(nèi)容根據(jù)具體情況設(shè)置。各進(jìn)程之間有一定的同步關(guān)系(可選)。系統(tǒng)在運(yùn)行過程中應(yīng)能顯示或打印各進(jìn)程的狀態(tài)及有關(guān)參數(shù)的變化情況,以便觀察諸進(jìn)程的運(yùn)行過程及系統(tǒng)的管理過程。

      具體詳見:設(shè)計(jì)任務(wù)書1--進(jìn)程調(diào)度算法.doc

      2、設(shè)計(jì)二:存貯器管理系統(tǒng)設(shè)計(jì)

      目的與要求:本設(shè)計(jì)的目的是使學(xué)生熟悉存貯器管理系統(tǒng)的設(shè)計(jì)方法;加深對(duì)所學(xué)各種存貯器管理方案的了解;要求采用一些常用的存貯器分配算法,設(shè)計(jì)一個(gè)存貯器管理模擬系統(tǒng)并調(diào)試運(yùn)行。模擬環(huán)境應(yīng)盡量接近真實(shí)。

      具體詳見:設(shè)計(jì)任務(wù)書2--內(nèi)存分區(qū)管理模擬.doc

      3、設(shè)計(jì)三:虛擬存儲(chǔ)器管理系統(tǒng)設(shè)計(jì)

      本設(shè)計(jì)的目的是通過設(shè)計(jì)一個(gè)簡單的虛擬存儲(chǔ)器管理系統(tǒng)來模擬實(shí)際的頁面調(diào)度算法與過程,以掌握這種有用的技術(shù)。要求將其輸入/輸出處理程序編成一個(gè)獨(dú)立的進(jìn)程模塊并與其它請(qǐng)求輸入/輸出的進(jìn)程并發(fā)運(yùn)行。并要求加入設(shè)備管理子模塊。

      具體分析為:頁面調(diào)度算法主要有FIFO、最近最少使用調(diào)度算法(LRU)、最近最不常用調(diào)度算法(LFU)、最佳算法(OPT)等。題目要求:

      ① 實(shí)現(xiàn)三種算法:

      1、先進(jìn)先出;

      2、OPT;

      3、LRU ② 頁面序列從指定的文本文件(TXT文件)中取出

      ③ 輸出:第一行:每次淘汰的頁面號(hào),第二行:顯示缺頁的總次數(shù)

      4、設(shè)計(jì)四:文件管理系統(tǒng)設(shè)計(jì)

      目的與要求:本設(shè)計(jì)的目的是通過設(shè)計(jì)和調(diào)試一個(gè)簡單的外部文件系統(tǒng),主要是模擬文件操作,使學(xué)生對(duì)主要文件操作命令的實(shí)質(zhì)和執(zhí)行過程有比較深入的了解,掌握它們的基本實(shí)施方法。

      基本要求如下:

      實(shí)現(xiàn)三種算法: 先來先服務(wù)、最短尋道優(yōu)先、電梯算法 磁道服務(wù)順序從指定的文本文件(TXT文件)中取出

      輸出:第一行:磁道的服務(wù)順序;第二行:顯示移動(dòng)總道數(shù)

      5、設(shè)計(jì)五:多道程序的轉(zhuǎn)換調(diào)度系統(tǒng) 題目要求:(作業(yè)調(diào)度和進(jìn)程調(diào)度結(jié)合在一起)作業(yè)流信息是從指定文本文件(TXT文件)中讀取 作業(yè)信息:

      作業(yè)號(hào) 進(jìn)入系統(tǒng)時(shí)間 估計(jì)運(yùn)行時(shí)間 優(yōu)先級(jí) 內(nèi)存需求量 磁帶機(jī)需求量 都為整型 作業(yè)調(diào)度算法:先來先服務(wù)、最短作業(yè)優(yōu)先(二者選一)

      進(jìn)程調(diào)度算法:先來先服務(wù)、基于優(yōu)先級(jí)的算法(靜態(tài)優(yōu)先級(jí))(二者選一)輸出格式:作業(yè)號(hào) 時(shí)間間隔 800-810(/* 8:00-8:10 */)2 810-900 1 900-930平均周轉(zhuǎn)時(shí)間:總的周轉(zhuǎn)時(shí)間/作業(yè)總數(shù)

      周轉(zhuǎn)時(shí)間就是作業(yè)結(jié)束時(shí)間減去作業(yè)進(jìn)入系統(tǒng)時(shí)間 具體詳見:多道程序轉(zhuǎn)換.doc

      以上設(shè)計(jì)以20-25人為組,選擇一個(gè)設(shè)計(jì)進(jìn)行。㈢操作系統(tǒng)整體設(shè)計(jì)

      將第㈡部分中的全部或部分有機(jī)地組合起來,構(gòu)成一個(gè)小型的操作系統(tǒng)。

      二、進(jìn)度安排

      1、教師下達(dá)設(shè)計(jì)任務(wù)書(半天)任務(wù)書內(nèi)容包括題目、主要技術(shù)指標(biāo)和要求、給定條件及原始數(shù)據(jù)、所用儀器設(shè)備和參考資料及文獻(xiàn)等。教師講授必要的設(shè)計(jì)思路和設(shè)計(jì)方法。

      2、學(xué)生完成預(yù)設(shè)計(jì)(1天半)本階段學(xué)生通過查閱資料及文獻(xiàn)(主要自學(xué)),明確任務(wù),掌握工程設(shè)計(jì)基本方法,確定設(shè)計(jì)方案,進(jìn)行設(shè)計(jì)分析,完成預(yù)設(shè)計(jì)。

      3、實(shí)驗(yàn)階段(7天)經(jīng)教師審查通過預(yù)設(shè)計(jì)方案后,即可進(jìn)行編程調(diào)試。實(shí)驗(yàn)由學(xué)生獨(dú)立完成,教師定時(shí)指導(dǎo)。

      4、設(shè)計(jì)總結(jié)階段(1天)本階段學(xué)生要認(rèn)真完成課程設(shè)計(jì)報(bào)告書,整理技術(shù)資料,并盡可能寫出課程設(shè)計(jì)的心得體會(huì)和改進(jìn)意見。

      三、完成后應(yīng)上交的材料

      課程設(shè)計(jì)報(bào)告書包括:設(shè)計(jì)任務(wù)及主要技術(shù)指標(biāo)、設(shè)計(jì)方案及論證結(jié)果、系統(tǒng)的原理框圖、設(shè)計(jì)程序、實(shí)驗(yàn)結(jié)果、實(shí)驗(yàn)中主要問題及故障現(xiàn)象的分析及設(shè)計(jì)結(jié)論等。

      附實(shí)驗(yàn)數(shù)據(jù)、系統(tǒng)軟硬件環(huán)境、使用說明及參考資料。

      四、總評(píng)成績

      指導(dǎo)教師 簽名日期 年 月 日 系 主 任 審核日期 年 月 日

      目 錄

      一、實(shí)驗(yàn)?zāi)康摹?

      二、實(shí)驗(yàn)要求………………………………………5

      三、具體內(nèi)容………………………………………5 3.1先來先服務(wù)(FCFS)???????5 3.2作業(yè)優(yōu)先SJF 算法????????5 3.3多級(jí)隊(duì)列調(diào)度算法????????.5 3.4時(shí)間片輪轉(zhuǎn)調(diào)度法?????????5 3.5優(yōu)先級(jí)法?????????????6 3.6多隊(duì)列反饋法???????????6 3.7輪轉(zhuǎn)法??????????????.6 3.8最短周期優(yōu)先???????????6 3.9先來先服務(wù)?????????????7

      四、實(shí)驗(yàn)程序………………………………………7

      五、實(shí)驗(yàn)總結(jié)………………………………………13

      設(shè)計(jì)題目:進(jìn)程管理系統(tǒng)設(shè)計(jì)

      一、實(shí)驗(yàn)?zāi)康模?/p>

      本設(shè)計(jì)的目的是加深對(duì)進(jìn)程概念及進(jìn)程管理各部分內(nèi)容的理解;熟悉進(jìn)程管理中主要數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)及進(jìn)程調(diào)度算法、進(jìn)程控制機(jī)構(gòu)、同步機(jī)構(gòu)及通訊機(jī)構(gòu)的實(shí)施。

      二、實(shí)驗(yàn)要求:

      設(shè)計(jì)一個(gè)允許n個(gè)進(jìn)程并發(fā)運(yùn)行的進(jìn)程管理模擬系統(tǒng)。該系統(tǒng)包括有簡單的進(jìn)程控制、同步與通訊機(jī)構(gòu),其進(jìn)程調(diào)度算法可任意選擇。每個(gè)進(jìn)程用一個(gè)PCB表示,其內(nèi)容根據(jù)具體情況設(shè)置。各進(jìn)程之間有一定的同步關(guān)系(可選)。系統(tǒng)在運(yùn)行過程中應(yīng)能顯示或打印各進(jìn)程的狀態(tài)及有關(guān)參數(shù)的變化情況,以便觀察諸進(jìn)程的運(yùn)行過程及系統(tǒng)的管理過程。

      三、具體內(nèi)容:

      調(diào)度也稱dispatcher,這是內(nèi)核的主要職責(zé)之一。一個(gè)良好的任務(wù)調(diào)度算法應(yīng)該主要體現(xiàn)在以下幾個(gè)方面:

      公平:保證每個(gè)進(jìn)程得到合理的CPU 時(shí)間

      高效:使CPU 保持忙碌狀態(tài),即總是有進(jìn)程在CPU 上運(yùn)行 響應(yīng)時(shí)間:使交互用戶的響應(yīng)時(shí)間盡可能短

      周轉(zhuǎn)時(shí)間:使批處理用戶等待輸出的時(shí)間盡可能短 吞吐量:使單位時(shí)間內(nèi)處理的進(jìn)程盡可能多

      很顯然在任何操作系統(tǒng)中這幾個(gè)目標(biāo)不可能同時(shí)達(dá)到所以不同的。

      操作系統(tǒng)會(huì)在這幾個(gè)方面中做出相應(yīng)的取舍從而確定自己的調(diào)度算法,常用的處理機(jī)調(diào)度算法有:先來先服務(wù)FCFS、短作業(yè)優(yōu)先SJF、優(yōu)先級(jí)、時(shí)間片輪轉(zhuǎn)法、多級(jí)隊(duì)列法、多級(jí)反饋隊(duì)列法。

      (1)先來先服務(wù)(FCFS)

      FCFS 是最簡單的CPU 調(diào)度算法,即按進(jìn)程到來的先后次序進(jìn)行調(diào)度,這樣在系統(tǒng)中等待時(shí)間最長的進(jìn)程被優(yōu)先調(diào)度,而不管其所需運(yùn)行時(shí)間的長短。

      (2)作業(yè)優(yōu)先SJF 算法

      是指當(dāng)CPU 可供使用時(shí)SJF 算法把CPU 分給需要運(yùn)行時(shí)間最短的進(jìn)程。(3)多級(jí)隊(duì)列調(diào)度算法

      把就緒隊(duì)列劃分成幾個(gè)單獨(dú)的隊(duì)列一般根據(jù)進(jìn)程的某些特性如內(nèi)存大小和進(jìn)程類型永久性地把各個(gè)進(jìn)程分別鏈入其中某一個(gè)隊(duì)列中,每個(gè)隊(duì)列都有自己的調(diào)度算法,此外在各個(gè)隊(duì)列之間也要進(jìn)行調(diào)度。通常采用固定優(yōu)先級(jí)的搶占式調(diào)度,例如某系統(tǒng)中有5 個(gè)隊(duì)列,各個(gè)隊(duì)列的優(yōu)先級(jí)自上而下降低,只有當(dāng)前3 個(gè)隊(duì)列中都為空的時(shí)候隊(duì)列4 中的進(jìn)程才可以運(yùn)行,而當(dāng)隊(duì)列4 中的進(jìn)程在運(yùn)行時(shí),如果隊(duì)列1 中進(jìn)入了一個(gè)就緒進(jìn)程,則隊(duì)列4 中的進(jìn)程要立刻讓出CPU 使用權(quán)。多級(jí)反饋隊(duì)列法允許進(jìn)程在各隊(duì)列間移動(dòng),其基本思想是把具有不同CPU工作時(shí)間這一特性的進(jìn)程區(qū)分開來,如果一個(gè)進(jìn)程要使用很長的CPU 時(shí)間,則應(yīng)把它移至較低級(jí)的隊(duì)列中,這種方式把I/O 繁忙型和交互式進(jìn)程放在較高優(yōu)先級(jí)的隊(duì)列中同樣在低優(yōu)先級(jí)隊(duì)列中長時(shí)間等待的進(jìn)程可以移到較高優(yōu)先級(jí)隊(duì)列中UNIX 系統(tǒng)采用的是多級(jí)反饋隊(duì)列輪轉(zhuǎn)法。

      (4)時(shí)間片輪轉(zhuǎn)調(diào)度法

      當(dāng)兩個(gè)或兩個(gè)以上任務(wù)有同樣優(yōu)先級(jí),內(nèi)核允許一個(gè)任務(wù)運(yùn)行事先確定的一段時(shí)間叫做時(shí)間額度quantum,然后切換給另一個(gè)任務(wù)也叫做時(shí)間片調(diào)度time slicing,內(nèi)核在滿足以下條件時(shí)把CPU 控制權(quán)交給下一個(gè)任務(wù)就緒態(tài)的任務(wù),當(dāng)前任務(wù)已無事可做,當(dāng)前任務(wù)在時(shí)間片還沒結(jié)束時(shí)已經(jīng)完成了。輪轉(zhuǎn)法主要是為分時(shí)系統(tǒng)設(shè)計(jì)的,其中時(shí)間片是一個(gè)重要的參數(shù)不能取的過大或過小,通常為10 至100ms 數(shù)量級(jí),就緒隊(duì)列可以看成是一個(gè)環(huán)形隊(duì)列,CPU 調(diào)度程序輪流

      地把CPU 分給就緒隊(duì)列中地每個(gè)進(jìn)程,時(shí)間長度為一個(gè)時(shí)間片Linux 操作系統(tǒng)就是采用時(shí)間片輪轉(zhuǎn)的調(diào)度算法。

      (5)優(yōu)先級(jí)法

      優(yōu)先級(jí)調(diào)度的基本思想是,把當(dāng)前處于就緒隊(duì)列中優(yōu)先級(jí)最高的進(jìn)程投入運(yùn)行,而不管各進(jìn)程的下一個(gè)CPU周期的長短和其他因素。

      優(yōu)先級(jí)通常用0~4095的整數(shù)(稱為優(yōu)先數(shù))表示,是數(shù)大優(yōu)先級(jí)高還是數(shù)小優(yōu)先級(jí)高取決于規(guī)定。例如UNIX系統(tǒng)規(guī)定優(yōu)先數(shù)越大優(yōu)先級(jí)越低,優(yōu)先數(shù)越小優(yōu)先級(jí)越高。

      優(yōu)先數(shù)有靜態(tài)和動(dòng)態(tài)之分。靜態(tài)優(yōu)先數(shù)是指在進(jìn)程開始運(yùn)行之前便根據(jù)某種或某些因素(如估計(jì)運(yùn)行時(shí)間、主存需求量、打開文件個(gè)數(shù)、所付經(jīng)費(fèi)多少等)算定,而且該優(yōu)先數(shù)在進(jìn)程的整個(gè)生命周期內(nèi)一直不變。靜態(tài)優(yōu)先數(shù)方法雖然簡單,但有可能導(dǎo)致某些低優(yōu)先級(jí)的進(jìn)程無限期地等待。尤其在高優(yōu)先級(jí)的進(jìn)程不斷進(jìn)入就緒隊(duì)列的情況下,使等待CPU的低優(yōu)先級(jí)進(jìn)程更多,等待時(shí)間更長。動(dòng)態(tài)優(yōu)先數(shù)方法是按照某種原則使各進(jìn)程的優(yōu)先級(jí)隨著時(shí)間而改變。例如隨等待時(shí)間增大優(yōu)先級(jí)也跟著提高、隨著使用CPU時(shí)間的增長優(yōu)先級(jí)跟著下降,就是一種較好的策略。等待了較長時(shí)間的進(jìn)程,總會(huì)因其優(yōu)先級(jí)不斷地提高而被調(diào)度運(yùn)行。

      如果把進(jìn)入就緒隊(duì)列的次序作為計(jì)算進(jìn)程動(dòng)態(tài)優(yōu)先數(shù)的主要指標(biāo),那么優(yōu)先級(jí)法就變成FCFS。如果把下一個(gè)CPU周期最短作為計(jì)算進(jìn)程動(dòng)態(tài)優(yōu)先數(shù)的主要指標(biāo),那么優(yōu)先級(jí)法變成SBF,此時(shí)各進(jìn)程的優(yōu)先數(shù)p_pri = 1/ ti,其中ti是估算的下一個(gè)CPU周期的長度。

      優(yōu)先級(jí)調(diào)度也允許剝奪方式?,F(xiàn)在的許多操作系統(tǒng),例如UNIX系統(tǒng)V,Windows NT,OS/2等都采用優(yōu)先級(jí)剝奪調(diào)度。

      (6)多隊(duì)列反饋法

      其基本思想是,把就緒進(jìn)程按優(yōu)先級(jí)排成多個(gè)隊(duì)列,同隊(duì)列的進(jìn)程具有相同的時(shí)間片。高優(yōu)先級(jí)隊(duì)列的時(shí)間片比低優(yōu)先級(jí)隊(duì)列的小。調(diào)度時(shí)先從高優(yōu)先級(jí)隊(duì)列中選出某一進(jìn)程投入運(yùn)行,當(dāng)該進(jìn)程的時(shí)間片到期后則轉(zhuǎn)至低一級(jí)的就緒隊(duì)列中。只有高優(yōu)先級(jí)隊(duì)列為空時(shí)才從低一級(jí)隊(duì)列中調(diào)度進(jìn)程。

      例如考慮由3個(gè)隊(duì)列組成的多級(jí)隊(duì)列調(diào)度。3個(gè)隊(duì)列的編號(hào)分別為0, 1, 2,如圖所示。調(diào)度算法首先調(diào)度0號(hào)隊(duì)列中的進(jìn)程。當(dāng)0號(hào)隊(duì)列為空時(shí)才調(diào)度1號(hào)隊(duì)列中的進(jìn)程;當(dāng)0號(hào)與1號(hào)隊(duì)列都為空時(shí)才調(diào)度2號(hào)隊(duì)列中的進(jìn)程。在剝奪方式下,新進(jìn)入0號(hào)隊(duì)列的進(jìn)程將剝奪1號(hào)或2號(hào)隊(duì)列中正在執(zhí)行的進(jìn)程的CPU,而新進(jìn)入1號(hào)隊(duì)列的進(jìn)程將剝奪2號(hào)隊(duì)列中正在執(zhí)行的進(jìn)程的CPU。

      其實(shí),每個(gè)隊(duì)列都可擁有各自的調(diào)度算法,也可制定不同的“轉(zhuǎn)隊(duì)”規(guī)則。這樣看來,多隊(duì)列反饋調(diào)度算法能有多種變化。

      (7)輪轉(zhuǎn)法

      輪轉(zhuǎn)法就是按一定時(shí)間片(記為q)輪番運(yùn)行各個(gè)進(jìn)程。如果q是一個(gè)定值,則輪轉(zhuǎn)法是一種對(duì)各進(jìn)程機(jī)會(huì)均等的調(diào)度方法。

      輪轉(zhuǎn)法本質(zhì)上是剝奪的,因?yàn)橐惠唭?nèi),每個(gè)進(jìn)程不能獲得比一個(gè)時(shí)間片q更長的運(yùn)行時(shí)間。正是由于這一特點(diǎn),輪轉(zhuǎn)法特別適用于分時(shí)操作系統(tǒng)。

      輪轉(zhuǎn)法的關(guān)鍵問題是如何確定q的大小。如果時(shí)間片太大以致每個(gè)進(jìn)程的CPU周期都能在一個(gè)時(shí)間片內(nèi)完成,則輪轉(zhuǎn)法實(shí)際上脫化為FCFS。如果q太小以致CPU切換過于頻繁,則會(huì)增加CPU的額外開銷,降低了CPU的有效利用率。這是因?yàn)?,每次CPU切換涉及到保存原運(yùn)行進(jìn)程的現(xiàn)場和恢復(fù)新運(yùn)行進(jìn)程的現(xiàn)場,這些操作一般需要10ms~100ms的時(shí)間。例如,設(shè)有一個(gè)CPU周期為10單位的進(jìn)程,在q取12,6,1時(shí)的調(diào)度次數(shù)分別為0,1,9。令時(shí)間單位為1ms(1ms=1000ms),1次調(diào)度的開銷為100ms,則在q=1時(shí)CPU的額外開銷和有效開銷之比為1:10,這是不容忽視的。

      (8)最短周期優(yōu)先

      最短周期優(yōu)先(SBF: shortest burst first)把當(dāng)前就緒隊(duì)列中的下一個(gè)CPU周期最短的那個(gè)進(jìn)程調(diào)度運(yùn)行。

      (9)先來先服務(wù)

      如果早就緒的進(jìn)程排在就緒隊(duì)列的前面,遲就緒的進(jìn)程排在就緒隊(duì)列的后面,那么先來先服務(wù)(FCFS: first come first service)總是把當(dāng)前處于就緒隊(duì)列之首的那個(gè)進(jìn)程調(diào)度到運(yùn)行狀態(tài)。也就說,它只考慮進(jìn)程進(jìn)入就緒隊(duì)列的先后,而不考慮它的下一個(gè)CPU周期的長短及其他因素。FCFS算法簡單易行,但性能卻不大好。

      四、實(shí)驗(yàn)程序

      #include “iostream.h”

      //define pcb typedef struct pcb { char name[10];//進(jìn)程名

      char state;//狀態(tài)w(就緒)r(運(yùn)行)f(結(jié)束)int id;//id號(hào)

      int super;//優(yōu)先級(jí)

      int ntime;//需運(yùn)行的時(shí)間 int rtime;//已運(yùn)行的時(shí)間 struct pcb *next;}*pcb1;

      pcb1 s,w;//define two publiced linknode ,one is s(ready queue),one is w(blocked queue)

      //initialize two queues void init(pcb1 &r){ r=NULL;//both queues is the kind of head index }

      //print the information of the ready queue void print(){pcb1 p;cout<<“您現(xiàn)在查看的是就緒隊(duì)列的信息:”;cout<<“進(jìn)程號(hào) ”<<“進(jìn)程名 ”<<“優(yōu)先級(jí) ”<<“狀態(tài)”<<“已運(yùn)行時(shí)間 ”<<“需運(yùn)行時(shí)間”<next){

      cout<

      id<<“ ”<

      name<<“ ”<

      super<<“ ”<

      state<<“ ”<

      rtime<<“ ”<

      ntime<

      //print the information of the blocked queue void print1(){pcb1 p;cout<<“您現(xiàn)在查看的是阻塞隊(duì)列的信息”;cout<<“進(jìn)程號(hào) ”<<“進(jìn)程名 ”<<“優(yōu)先級(jí) ”<<“狀態(tài) ”<<“已運(yùn)行時(shí)間 ”<<“需運(yùn)行時(shí)間”<next){ cout<

      id<<“ ”<

      name<<“ ”<

      super<<“ ”<

      state<<“ ”<

      rtime<<“ ”<

      ntime<

      //check the queue if empty int empty(pcb1 &r){ if(r==NULL)return 0;else return 1;}

      //check the first process of the ready queue if finshed int check(){ pcb1 p;p=s;if(p->rtime==p->ntime){ p->state='F';//if one process finshed then change ti's state cout<<“進(jìn)程”<

      id<<“ 已經(jīng)結(jié)束”<

      //sort process according to the super of the process and insert to the ready(blocked)queue void sort(pcb1 &r,pcb1 p){ pcb1 p1,p2;int in=0;if(r==NULL)//the queue is empty { r=p;} else { if(p->super>=r->super)//the super of the process which wait insert to the queue is highter than the super of the first process of the queue { p->next=r;r=p;} else { p1=r;p2=r->next;if(p2==NULL)//only one process in the queue { r->next=p;} else { while(in==0&&p2!=NULL)//insert to the middle of the queue { if(p->super>=p2->super){ p->next=p2;p1->next=p;in=1;} else { p1=p1->next;p2=p2->next;} } } if(in==0)//link to the last of ready queue

      p1->next=p;} } }

      //block one process and insert to block queue void block(){ if(empty(s)){ if(s->next==NULL){ sort(w,s);s=s->next;} else {

      pcb1 p1;p1=s;s=s->next;p1->next=NULL;sort(w,p1);} } else { cout<<“現(xiàn)在就緒隊(duì)列已經(jīng)為空,再?zèng)]有進(jìn)程需要阻塞”<

      //wake one process of block queue and insert to ready queue void wake(){ if(empty(w)){ pcb1 p1;p1=w;w=w->next;p1->next=NULL;sort(s,p1);}

      else { cout<<“阻塞隊(duì)列已經(jīng)為空,沒有進(jìn)程再需要喚醒”<

      //runing void runing(){ if(empty(s)){ pcb1 p;p=s;if(check())//check the first process of the queue if finished {//no s=s->next;p->rtime++;p->super--;p->next=NULL;sort(s,p);} else {//yes s=s->next;} } else { cout<<“就緒隊(duì)列已經(jīng)為空”<

      //creat process void input(){ pcb1 p2;p2=new pcb;cout<<“請(qǐng)輸入 進(jìn)程號(hào)、進(jìn)程名、進(jìn)程優(yōu)先級(jí)、需要運(yùn)行時(shí)間”;cin>>p2->id>>p2->name>>p2->super>>p2->ntime;p2->rtime=0;p2->state='W';p2->rtime=0;p2->next=NULL;

      sort(s,p2);}

      //main function void main(){ char ch;init(s);init(w);cout<<“*****************************進(jìn)程調(diào)度模擬程序開始*******************************”<>ch;switch(ch){ case 'c':input();break;case 'r':runing();break;case 's':print();break;case 'w':wake();break;case 'l':print1();break;case 'z':block();break;} } }

      程序運(yùn)行界面如下:

      五、實(shí)驗(yàn)總結(jié)

      本次實(shí)驗(yàn),我的任務(wù)是設(shè)計(jì)一個(gè)允許n個(gè)進(jìn)程并發(fā)運(yùn)行的進(jìn)程管理模擬系統(tǒng)。該系統(tǒng)包括有簡單的進(jìn)程控制、同步與通訊機(jī)構(gòu),系統(tǒng)在運(yùn)行過程中能顯示各進(jìn)程的狀態(tài)及有關(guān)參數(shù)的變化情況,從而觀察諸進(jìn)程的運(yùn)行過程及系統(tǒng)的管理過程,我是用C++寫的,在我的電腦能夠運(yùn)行通過,雖不能盡善盡美,但也基本能實(shí)現(xiàn)老師的要求。

      兩個(gè)星期程序設(shè)計(jì)課程,雖然時(shí)間有點(diǎn)短,但我也收獲不少,這次試驗(yàn),加深了我對(duì)進(jìn)程概念及進(jìn)程管理的理解;比較熟悉進(jìn)程管理中主要數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)及進(jìn)程調(diào)度算法、進(jìn)程控制機(jī)構(gòu)、同步機(jī)構(gòu)及通訊機(jī)構(gòu)的實(shí)施。也讓我認(rèn)識(shí)到自己的不足,操作系統(tǒng)的有些知識(shí),我知道的還不多,沒有掌握好,還需要多多學(xué)學(xué),不斷提升自己的能力。

      第二篇:操作系統(tǒng)進(jìn)程調(diào)度算法模擬實(shí)驗(yàn)報(bào)告

      進(jìn)程調(diào)度算法模擬

      專業(yè):XXXXX 學(xué)號(hào):XXXXX 姓名:XXX 實(shí)驗(yàn)日期:20XX年XX月XX日

      一、實(shí)驗(yàn)?zāi)康?/p>

      通過對(duì)進(jìn)程調(diào)度算法的模擬加深對(duì)進(jìn)程概念和進(jìn)程調(diào)度算法的理解。

      二、實(shí)驗(yàn)要求

      編寫程序?qū)崿F(xiàn)對(duì)5個(gè)進(jìn)程的調(diào)度模擬,要求至少采用兩種不同的調(diào)度算法分別進(jìn)行模擬調(diào)度。

      三、實(shí)驗(yàn)方法內(nèi)容

      1.算法設(shè)計(jì)思路

      將每個(gè)進(jìn)程抽象成一個(gè)控制塊PCB,PCB用一個(gè)結(jié)構(gòu)體描述。

      構(gòu)建一個(gè)進(jìn)程調(diào)度類。將進(jìn)程調(diào)度的各種算法分裝在一個(gè)類中。類中存在三個(gè)容器,一個(gè)保存正在或未進(jìn)入就緒隊(duì)列的進(jìn)程,一個(gè)保存就緒的進(jìn)程,另一個(gè)保存已完成的進(jìn)程。還有一個(gè)PCB實(shí)例。主要保存正在運(yùn)行的進(jìn)程。類中其他方法都是圍繞這三個(gè)容器可以這個(gè)運(yùn)行中的PCB展開。

      主要用到的技術(shù)是STL中的vector以維護(hù)和保存進(jìn)程容器、就緒容器、完成容器。

      當(dāng)程序啟動(dòng)時(shí),用戶可以選擇不同的調(diào)度算法。然后用戶從控制臺(tái)輸入各個(gè)進(jìn)程的信息,這些信息保存到進(jìn)程容器中。進(jìn)程信息輸入完畢后,就開始了進(jìn)程調(diào)度,每調(diào)度一次判斷就緒隊(duì)列是否為空,若為空則系統(tǒng)時(shí)間加一個(gè)時(shí)間片。判斷進(jìn)程容器中是否有新的進(jìn)程可以加入就緒隊(duì)列。2.算法流程圖 主程序的框架:

      開始void FCFS();//先來先服務(wù)void SJF();//最短進(jìn)程優(yōu)先調(diào)度void RR();//簡單時(shí)間片輪轉(zhuǎn)void PD();//最高優(yōu)先數(shù)優(yōu)先void PCBInput();//輸入進(jìn)程信息選擇調(diào)度算法輸入進(jìn)程信息將輸入容器中以滿足進(jìn)入條件的進(jìn)程調(diào)入就緒隊(duì)列void ProcessQueueProcess();//查看當(dāng)前時(shí)間下,有無進(jìn)程加入。若有則把該進(jìn)程調(diào)入就緒隊(duì)列按照選擇的算法開始選擇就緒隊(duì)列的進(jìn)程開始執(zhí)行void ProcessSelect();//若當(dāng)前就緒隊(duì)列不為空則根據(jù)選擇的調(diào)度算法開始調(diào)度,否則,系統(tǒng)時(shí)間加一個(gè)時(shí)間片.以等待新的進(jìn)程到判斷就緒容器和輸入容器是否為空!processScheduler.m_WaitQueue.empty()||!processScheduler.m_ProcessQueue.empt()Y打印各進(jìn)程信息進(jìn)行統(tǒng)計(jì)計(jì)算周轉(zhuǎn)時(shí)間等結(jié)束void PCBDisplay();//打印當(dāng)前狀況下。就緒隊(duì)列、完成隊(duì)列、運(yùn)行中的進(jìn)程信息void SchedulerStatistics();//調(diào)度統(tǒng)計(jì),計(jì)算周轉(zhuǎn)時(shí)間等進(jìn)程調(diào)度過程:

      開始為空判斷就緒隊(duì)列是否為空if(m_WaitQueue.empty())非空讓系統(tǒng)等待一個(gè)時(shí)間片TimePast()根據(jù)設(shè)定的調(diào)度算法從就緒隊(duì)列中調(diào)入一個(gè)進(jìn)程并執(zhí)行(此時(shí)進(jìn)程從就緒隊(duì)列中刪除,賦值到表示運(yùn)行中的成員變量中)void FCFS();//先來先服務(wù)void SJF();//最短進(jìn)程優(yōu)先調(diào)度void RR();//簡單時(shí)間片輪轉(zhuǎn)void PD();//最高優(yōu)先數(shù)優(yōu)先進(jìn)程運(yùn)行一個(gè)時(shí)間片N是否達(dá)到該進(jìn)程停止運(yùn)行的條件Y選入的進(jìn)程狀態(tài)是否為“完成”如進(jìn)程已完成,或者分得的時(shí)間片個(gè)數(shù)已到ProcessRun()Yvector

      m_WaitQueue;//進(jìn)程就緒隊(duì)列進(jìn)程未完成,將進(jìn)程優(yōu)先數(shù)減一,并放回到就緒隊(duì)列中設(shè)置進(jìn)程完成時(shí)間,將該進(jìn)程放入完成隊(duì)列vector

      m_FinishQueue;//完成隊(duì)列結(jié)束

      3.算法中用到的數(shù)據(jù)結(jié)構(gòu)

      struct fcfs{

      //先來先服務(wù)算法從這里開始

      char name[10];

      float arrivetime;

      float servicetime;

      float starttime;

      float finishtime;

      float zztime;

      float dqzztime;

      };

      //定義一個(gè)結(jié)構(gòu)體,里面包含的有一個(gè)進(jìn)程相關(guān)的信息

      4.主要的常量變量

      vector

      m_ProcessQueue;//進(jìn)程輸入隊(duì)列

      vector

      m_WaitQueue;//進(jìn)程就緒隊(duì)列 vector

      m_FinishQueue;//完成隊(duì)列 vector

      ::iterator m_iter;//迭代器 PCB m_runProcess;//運(yùn)行中的進(jìn)程

      int m_ProcessCount;//進(jìn)程數(shù) float m_RunTime;//運(yùn)行時(shí)間

      int m_tagIsRun;//是否在運(yùn)行標(biāo)志。表示正在運(yùn)行,表示沒有 float m_TimeSlice;//時(shí)間片大小

      int m_TimeSliceCount;//指時(shí)間片輪轉(zhuǎn)中一次分到的時(shí)間片個(gè)數(shù) char m_SchedulerAlgorithm;//調(diào)度算法

      5.主要模塊

      void PCBInput();//輸入進(jìn)程信息

      void PCBSort();//對(duì)進(jìn)程控制塊按照優(yōu)先級(jí)排序(采用冒泡排序)void ProcessSelect();//若當(dāng)前就緒隊(duì)列不為空則根據(jù)選擇的調(diào)度算法開始調(diào)度。否則,系統(tǒng)時(shí)間void PCBDisplay();//打印當(dāng)前狀況下。就緒隊(duì)列、完成隊(duì)列、運(yùn)行中的進(jìn)程信息

      void ProcessRun();//進(jìn)程運(yùn)行一次。運(yùn)行時(shí)間加個(gè)時(shí)間片。并判斷進(jìn)程是否達(dá)到完成條件。若是則void ProcessQueueProcess();//查看當(dāng)前時(shí)間下,有無進(jìn)程加入。若有則把該進(jìn)程調(diào)入就緒隊(duì)列 void ProcessDispatch();//進(jìn)程分派,進(jìn)程執(zhí)行完成后決定進(jìn)程該進(jìn)入哪個(gè)隊(duì)列(就緒、完成)void TimePast(){ m_RunTime +=m_TimeSlice;ProcessQueueProcess();}//當(dāng)前系統(tǒng)時(shí)間加個(gè)時(shí)間void SchedulerStatistics();//調(diào)度統(tǒng)計(jì),計(jì)算周轉(zhuǎn)時(shí)間等 void FCFS();//先來先服務(wù) void SJF();//最短進(jìn)程優(yōu)先調(diào)度 void RR();//簡單時(shí)間片輪轉(zhuǎn) void PD();//最高優(yōu)先數(shù)優(yōu)先 加.以等待新的進(jìn)程到來

      ProcessStatus='f'.否則為'w';片,并檢查是否有新的進(jìn)程加入

      四、實(shí)驗(yàn)代碼

      #include #include #include

      using namespace std;

      struct fcfs{

      //先來先服務(wù)算法從這里開始

      char name[10];

      float arrivetime;

      float servicetime;

      float starttime;

      float finishtime;

      float zztime;

      float dqzztime;

      };

      //定義一個(gè)結(jié)構(gòu)體,里面包含的有一個(gè)進(jìn)程相關(guān)的信息

      fcfs a[100];

      void input(fcfs *p,int N)

      {

      int i;

      cout<

      printf(“

      請(qǐng)您輸入進(jìn)程的名字

      到達(dá)時(shí)間

      服務(wù)時(shí)間:(例如: a 0 100)nn”);

      for(i=0;i<=N-1;i++)

      {

      printf(“

      請(qǐng)您輸入進(jìn)程%d的信息:t”,i+1);

      scanf(“ttt%s%f%f”,&p[i].name,&p[i].arrivetime,&p[i].servicetime);

      }

      }

      void Print(fcfs *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N)

      { int k;

      printf(“nn調(diào)用先來先服務(wù)算法以后進(jìn)程運(yùn)行的順序是: ”);

      printf(“%s”,p[0].name);

      for(k=1;k

      {

      printf(“-->%s”,p[k].name);

      }

      cout<

      printf(“n

      具體進(jìn)程調(diào)度信息:n”);

      printf(“t進(jìn)程名

      到達(dá)時(shí)間

      服務(wù)時(shí)間

      開始時(shí)間

      結(jié)束時(shí)間

      周轉(zhuǎn)時(shí)間

      帶權(quán)周轉(zhuǎn)時(shí)間n”);

      for(k=0;k<=N-1;k++)

      {

      printf(“t%st%-.2ft %-.2ft

      %-.2ft

      %-.2ft %-.2ft %-.2fn”,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);

      }

      getchar();

      //此處必須要有這個(gè)函數(shù),否則就看不到顯示器上面的輸出,可以看到的結(jié)果只是一閃而過的一個(gè)框剪

      }

      void sort(fcfs *p,int N)//排序

      {

      for(int i=0;i<=N-1;i++)

      for(int j=0;j<=i;j++)

      if(p[i].arrivetime

      {

      fcfs temp;

      temp=p[i];

      p[i]=p[j];

      p[j]=temp;

      }

      }

      void deal(fcfs *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N)

      //運(yùn)行階段

      { int k;

      for(k=0;k<=N-1;k++)

      {

      if(k==0)

      {

      p[k].starttime=p[k].arrivetime;

      p[k].finishtime=p[k].arrivetime+p[k].servicetime;}

      else

      {

      p[k].starttime=p[k-1].finishtime;

      p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}

      }

      for(k=0;k<=N-1;k++)

      {

      p[k].zztime=p[k].finishtime-p[k].arrivetime;

      p[k].dqzztime=p[k].zztime/p[k].servicetime;

      }

      }

      void FCFS(fcfs *p,int N)

      {

      float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;

      sort(p,N);

      deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);

      Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);

      getchar();

      } //先來先服務(wù)算法到此結(jié)束 struct sjf{//最短進(jìn)程優(yōu)先調(diào)度算法從這里開始

      char name[10];float arrivetime;//到達(dá)時(shí)間

      float servicetime;//運(yùn)行時(shí)間

      float starttime;

      //開始時(shí)間

      float finishtime;

      //完成時(shí)間

      };sjf a1[100];

      void input(sjf *p,int N1)//進(jìn)程信息輸入 {

      int i;cout<

      printf(“

      請(qǐng)您輸入進(jìn)程的名字

      到達(dá)時(shí)間

      服務(wù)時(shí)間:(例如: a 0 100)n”);

      for(i=0;i<=N1-1;i++){

      printf(“

      請(qǐng)您輸入進(jìn)程%d的信息:t”,i+1);

      scanf(“ttt%s%f%f”,&p[i].name,&p[i].arrivetime,&p[i].servicetime);} }

      void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,int N1)//最終結(jié)果輸出

      {

      int k;

      printf(“nt調(diào)用最短進(jìn)程優(yōu)先調(diào)度算法以后進(jìn)程的調(diào)度順序?yàn)?”);

      printf(“%s”,p[0].name);

      for(k=1;k

      {printf(“-->%s”,p[k].name);}

      cout<

      printf(“n給個(gè)進(jìn)程具體調(diào)度信息如下:n”);

      printf(“nt進(jìn)程名t到達(dá)時(shí)間t運(yùn)行時(shí)間t開始時(shí)間t完成時(shí)間n”);

      for(k=0;k<=N1-1;k++)

      {

      printf(“ t%st %-.2ftt %-.2ftt %-.2ftt %-.2ftn”,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime);

      }

      getchar();

      } void sort(sjf *p,int N1)//排序 {

      for(int i=0;i<=N1-1;i++)

      for(int j=0;j<=i;j++)

      if(p[i].arrivetime

      {

      sjf temp;

      temp=p[i];

      p[i]=p[j];

      p[j]=temp;

      } } void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,int N1)//運(yùn)行階段

      { int k;

      for(k=0;k<=N1-1;k++)

      {

      if(k==0)

      {

      p[k].starttime=p[k].arrivetime;

      p[k].finishtime=p[k].arrivetime+float(p[k].servicetime)/60;}

      else

      {

      p[k].starttime=p[k-1].finishtime;

      p[k].finishtime=p[k-1].finishtime+float(p[k].servicetime)/60;}

      }

      }

      void sjff(sjf *p,int N1){

      float arrivetime=0,servicetime=0,starttime=0,finishtime=0;

      sort(p,N1);

      for(int m=0;m

      {if(m==0)

      p[m].finishtime=p[m].arrivetime+float(p[m].servicetime)/60;

      else

      p[m].finishtime=p[m-1].finishtime+float(p[m].servicetime)/60;

      int i=0;

      for(int n=m+1;n<=N1-1;n++)

      {

      if(p[n].arrivetime<=p[m].finishtime)

      i++;

      }

      float min=p[m+1].servicetime;

      int next=m+1;

      for(int k=m+1;k

      {

      if(p[k+1].servicetime

      {min=p[k+1].servicetime;

      next=k+1;}

      }

      sjf temp;

      temp=p[m+1];

      p[m+1]=p[next];

      p[next]=temp;

      }

      deal(p,arrivetime,servicetime,starttime,finishtime,N1);

      Print(p,arrivetime,servicetime,starttime,finishtime,N1);

      getchar();}//最短進(jìn)程優(yōu)先調(diào)度算法到這里結(jié)束

      char menu()//用來輸出相關(guān)信息的函數(shù)

      {

      char cse1;

      while(1)

      {

      system(“cls”);

      fflush(stdin);

      cout<

      cout<

      cout<<“t”<<“|| <<<<<<<<<<<<歡<<<<<<<<<<< >>>>>>>>>>>>迎>>>>>>>>>>> ||”<

      cout<<“t”<<“||

      ||”<

      cout<<“t”<<“||”<<“t 進(jìn)程調(diào)度算法模擬”<<“tt”<<“||”<

      cout<<“t”<<“||

      ||”<

      cout<<“t”<<“||”<<“tt 1.先來先服務(wù)調(diào)度算法 ”<<“tt”<<“||”<

      cout<<“t”<<“||

      ||”<

      cout<<“t”<<“||”<<“tt 2.最短進(jìn)程優(yōu)先調(diào)度算法”<<“tt”<<“||”<

      cout<<“t”<<“||

      ||”<

      cout<<“t”<<“|| <<<<<<<<<<<<<<<<<<<<<<<<<您>>>>>>>>>>>>>>>>>>>>>>>>> ||”<

      cout<

      cout<

      cout<<“tt

      請(qǐng)輸入您的選擇(1/2):”;

      cse1=getchar();

      if(cse1<'1'||cse1>'2')

      cout<<“你的輸入有錯(cuò)!”<

      else

      break;

      }

      return cse1;} int main(int argc, char *argv[]){

      while(1)

      {

      switch(menu())

      {

      case '1':

      int N;

      cout<

      cout<

      printf(“tt<<---!!@@@先來先服務(wù)調(diào)度算法@@@!!--->>n”);

      cout<

      printf(“輸入進(jìn)程數(shù)目:”);

      scanf(“%d”,&N);

      input(a,N);

      FCFS(a,N);

      case '2':

      int N1;

      cout<

      cout<

      printf(“tt<<---!!@@@最短進(jìn)程優(yōu)先調(diào)度算法@@@!!--->>n”);

      cout<

      printf(“輸入進(jìn)程數(shù)目: ”);

      scanf(“%d”,&N1);

      input(a1,N1);

      sjf *b=a1;

      sjf *c=a1;

      sjff(b,N1);

      getchar();

      }

      }

      system(“PAUSE”);

      return EXIT_SUCCESS;}

      五、實(shí)驗(yàn)結(jié)果

      1.執(zhí)行結(jié)果

      2.結(jié)果分析

      先來先服務(wù)調(diào)度算法就是根據(jù)進(jìn)程達(dá)到的時(shí)間為依據(jù),哪一個(gè)進(jìn)程先來那么該進(jìn)程就會(huì)先執(zhí)行;最短進(jìn)程優(yōu)先調(diào)度算法則是以每個(gè)進(jìn)程執(zhí)行所需時(shí)間長短為依據(jù),某一個(gè)進(jìn)程執(zhí)行所需花的時(shí)間要短些那么該進(jìn)程就先執(zhí)行。以上就是本次進(jìn)程調(diào)度實(shí)驗(yàn)的依據(jù)。

      六、實(shí)驗(yàn)總結(jié)

      通過本次實(shí)驗(yàn)了解到算法很重要,又更加明白算法本身可以節(jié)約時(shí)間,而且不同的函數(shù)之間在調(diào)用的時(shí)候要注意很多的問題。

      第三篇:操作系統(tǒng)實(shí)驗(yàn)報(bào)告

      實(shí)驗(yàn)二

      進(jìn)程調(diào)度

      1.目的和要求

      通過這次實(shí)驗(yàn),理解進(jìn)程調(diào)度的過程,進(jìn)一步掌握進(jìn)程狀態(tài)的轉(zhuǎn)變、進(jìn)程調(diào)度的策略,進(jìn)一步體會(huì)多道程序并發(fā)執(zhí)行的特點(diǎn),并分析具體的調(diào)度算法的特點(diǎn),掌握對(duì)系統(tǒng)性能的評(píng)價(jià)方法。

      2.實(shí)驗(yàn)內(nèi)容

      閱讀教材《計(jì)算機(jī)操作系統(tǒng)》第二章和第三章,掌握進(jìn)程管理及調(diào)度相關(guān)概念和原理。

      編寫程序模擬實(shí)現(xiàn)進(jìn)程的輪轉(zhuǎn)法調(diào)度過程,模擬程序只對(duì)PCB進(jìn)行相應(yīng)的調(diào)度模擬操作,不需要實(shí)際程序。假設(shè)初始狀態(tài)為:有n個(gè)進(jìn)程處于就緒狀態(tài),有m個(gè)進(jìn)程處于阻塞狀態(tài)。采用輪轉(zhuǎn)法進(jìn)程調(diào)度算法進(jìn)行調(diào)度(調(diào)度過程中,假設(shè)處于執(zhí)行狀態(tài)的進(jìn)程不會(huì)阻塞),且每過t個(gè)時(shí)間片系統(tǒng)釋放資源,喚醒處于阻塞隊(duì)列隊(duì)首的進(jìn)程。

      程序要求如下:

      1)輸出系統(tǒng)中進(jìn)程的調(diào)度次序; 2)計(jì)算CPU利用率。

      3.實(shí)驗(yàn)環(huán)境

      Windows操作系統(tǒng)、VC++6.0 C語言

      4設(shè)計(jì)思想:

      (1)

      程序中進(jìn)程可用PCB表示,其類型描述如下:

      struct PCB_type

      {

      int pid;

      //進(jìn)程名 int

      state;

      //進(jìn)程狀態(tài)

      2——表示“執(zhí)行”狀態(tài)

      1——表示“就緒”狀態(tài)

      0——表示“阻塞”狀態(tài)

      int cpu_time;//運(yùn)行需要的CPU時(shí)間(需運(yùn)行的時(shí)間片個(gè)數(shù))

      } 用PCB來模擬進(jìn)程;

      (2)設(shè)置兩個(gè)隊(duì)列,將處于“就緒”狀態(tài)的進(jìn)程PCB掛在隊(duì)列ready中;將處于“阻塞”狀態(tài)的進(jìn)程PCB掛在隊(duì)列blocked中。隊(duì)列類型描述如下:

      struct QueueNode{

      struct PCB_type

      PCB;

      Struct QueueNode *next;} 并設(shè)全程量:

      struct QueueNode *ready_head=NULL,//ready隊(duì)列隊(duì)首指針

      *ready_tail=NULL , //ready隊(duì)列隊(duì)尾指針

      *blocked_head=NULL,//blocked隊(duì)列隊(duì)首指針 *blocked_tail=NULL;//blocked隊(duì)列隊(duì)尾指針(3)設(shè)計(jì)子程序:

      start_state();

      讀入假設(shè)的數(shù)據(jù),設(shè)置系統(tǒng)初始狀態(tài),即初始化就緒隊(duì)列和阻塞隊(duì)列。

      dispath();

      模擬調(diào)度,當(dāng)就緒隊(duì)列的隊(duì)首進(jìn)程運(yùn)行一個(gè)時(shí)間片后,放到就緒隊(duì)列末尾,每次都是隊(duì)首進(jìn)程進(jìn)行調(diào)度,一個(gè)進(jìn)程運(yùn)行結(jié)束就從就緒隊(duì)列中刪除,當(dāng)?shù)絫個(gè)時(shí)間片后,喚醒阻塞隊(duì)列隊(duì)首進(jìn)程。

      calculate();

      就緒進(jìn)程運(yùn)行一次,usecpu加1,當(dāng)就緒隊(duì)列為空時(shí)unusecpu加1,CPU利用率為use_cpu/(use_cpu+unuse_cpu)。

      5源代碼:

      #include #include

      struct PCB_type {

      int pid;

      //進(jìn)程名

      int

      state;

      //進(jìn)程狀態(tài)

      //2--表示“執(zhí)行”狀態(tài)

      //1--表示“就緒”狀態(tài)

      //0--表示“阻塞”狀態(tài)

      int cpu_time;//運(yùn)行需要的CPU時(shí)間(需運(yùn)行的時(shí)間片個(gè)數(shù))};struct QueueNode{

      struct PCB_type

      PCB;

      struct QueueNode *next;};struct QueueNode *ready_head=NULL,//ready隊(duì)列隊(duì)首指針

      *ready_tail=NULL,//ready隊(duì)列隊(duì)尾指針

      *block_head=NULL,//blocked隊(duì)列隊(duì)首指針

      *block_tail=NULL;

      //blocked隊(duì)列隊(duì)尾指針

      int use_cpu,unuse_cpu;

      void start_state()//讀入假設(shè)的數(shù)據(jù),設(shè)置系統(tǒng)初始狀態(tài) {

      int n,m;

      int i;

      struct QueueNode *p,*q;

      printf(“輸入就緒節(jié)點(diǎn)個(gè)數(shù)n:”);

      scanf(“%d”,&n);

      printf(“輸入阻塞節(jié)點(diǎn)個(gè)數(shù)m:”);

      scanf(“%d”,&m);

      p=(struct QueueNode *)malloc(sizeof(struct QueueNode));

      p->next =NULL;

      ready_head=ready_tail=p;

      for(i=0;i

      {

      p=(struct QueueNode *)malloc(sizeof(struct QueueNode));

      p->next =NULL;

      p->PCB.state=1;

      printf(“輸入就緒進(jìn)程%d的pid和cpu_time:”,i+1);

      scanf(“%d%d”,&p->PCB.pid,&p->PCB.cpu_time);

      ready_tail->next=p;

      ready_tail=p;

      }

      q=(struct QueueNode *)malloc(sizeof(struct QueueNode));

      q->next =NULL;

      block_head=block_tail=q;

      for(i=0;i

      {

      q=(struct QueueNode *)malloc(sizeof(struct QueueNode));

      q->next=NULL;

      q->PCB.state=0;

      printf(“輸入阻塞進(jìn)程%d的pid和cpu_time:”,i+1);

      scanf(“%d%d”,&q->PCB.pid,&q->PCB.cpu_time);

      block_tail->next=q;

      block_tail=q;

      }

      printf(“n處于就緒狀態(tài)的進(jìn)程有:n”);

      p=ready_head->next;

      i=1;

      while(p)

      {printf(“進(jìn)程%d的pid和cpu_time:%5d%5d%5dn“,i,p->PCB.pid,p->PCB.state,p->PCB.cpu_time);

      p=p->next;

      i++;

      } } void dispath()

      //模擬調(diào)度 {

      int x=0,t;

      use_cpu=0;

      unuse_cpu=0;

      printf(”輸入t:“);

      scanf(”%d“,&t);

      printf(”開始調(diào)度n“);

      while(ready_head!=ready_tail||block_head!=block_tail)

      {

      struct QueueNode *p,*q;

      if(ready_head!=ready_tail)

      {

      p=ready_head->next;

      ready_head->next=p->next;

      p->next=NULL;

      if(ready_head->next==NULL)

      {

      ready_tail=ready_head;

      }

      p->PCB.state=2;

      printf(”進(jìn)程%d調(diào)度t“,p->PCB.pid);

      state和

      use_cpu++;

      x++;

      p->PCB.cpu_time--;

      if(p->PCB.cpu_time)

      {

      ready_tail->next=p;

      ready_tail=p;

      }

      else

      {

      printf(”進(jìn)程%d完成t“,p->PCB.pid);

      free(p);

      }

      }

      else

      {

      unuse_cpu++;

      x++;

      printf(”空閑一個(gè)時(shí)間片t“);

      }

      if(x==t&&block_head!=block_tail)

      {

      q=block_head->next;

      block_head->next=q->next;

      q->next=NULL;

      if(block_head->next==NULL)

      {

      block_tail=block_head;

      }

      ready_tail->next=q;

      ready_tail=q;

      x=0;

      }

      } } void calculate()

      //計(jì)算CPU利用率 { printf(”ncpu的利用率%.2fn“,(float)use_cpu/(use_cpu+unuse_cpu));

      } void main(){start_state();

      dispath();

      calculate();} 6運(yùn)行結(jié)果:

      7實(shí)驗(yàn)總結(jié):

      實(shí)驗(yàn)幫我復(fù)習(xí)了數(shù)據(jù)結(jié)構(gòu)和C語言,且鞏固課本知識(shí),知道了如何定義結(jié)構(gòu)體,如何在鏈接隊(duì)列中增刪節(jié)點(diǎn)。模擬進(jìn)程調(diào)度幫我們鞏固了進(jìn)程三狀態(tài)之間的變遷。懂得調(diào)式的重要性??傊?,我們明白了理論聯(lián)系實(shí)際。多看書,多上機(jī)。

      實(shí)驗(yàn)三

      可變分區(qū)存儲(chǔ)管理

      1.目的和要求

      通過這次實(shí)驗(yàn),加深對(duì)內(nèi)存管理的認(rèn)識(shí),進(jìn)一步掌握內(nèi)存的分配、回收算法的思想。

      2.實(shí)驗(yàn)內(nèi)容

      閱讀教材《計(jì)算機(jī)操作系統(tǒng)》第四章,掌握存儲(chǔ)器管理相關(guān)概念和原理。編寫程序模擬實(shí)現(xiàn)內(nèi)存的動(dòng)態(tài)分區(qū)法存儲(chǔ)管理。內(nèi)存空閑區(qū)使用自由鏈管理,采用最壞適應(yīng)算法從自由鏈中尋找空閑區(qū)進(jìn)行分配,內(nèi)存回收時(shí)假定不做與相鄰空閑區(qū)的合并。

      假定系統(tǒng)的內(nèi)存共640K,初始狀態(tài)為操作系統(tǒng)本身占用64K。在t1時(shí)間之后,有作業(yè)A、B、C、D分別請(qǐng)求8K、16K、64K、124K的內(nèi)存空間;在t2時(shí)間之后,作業(yè)C完成;在t3時(shí)間之后,作業(yè)E請(qǐng)求50K的內(nèi)存空間;在t4時(shí)間之后,作業(yè)D完成。要求編程序分別輸出t1、t2、t3、t4時(shí)刻內(nèi)存的空閑區(qū)的狀態(tài)。

      3.實(shí)驗(yàn)環(huán)境

      Windows操作系統(tǒng)、VC++6.0 C語言

      4.設(shè)計(jì)思想

      模擬內(nèi)存分配和回收,要設(shè)置兩個(gè)鏈隊(duì)列,一個(gè)空閑區(qū)鏈和一個(gè)占用區(qū)鏈,空閑區(qū)鏈節(jié)點(diǎn)有起始地址,大小和指向下一節(jié)點(diǎn)的指針等數(shù)據(jù)域,占用區(qū)鏈節(jié)點(diǎn)有起始地址,大小,作業(yè)名和指向下一節(jié)點(diǎn)的指針等數(shù)據(jù)域,本實(shí)驗(yàn)用最壞適應(yīng)算法,每次作業(yè)申請(qǐng)內(nèi)存都是從空閑鏈隊(duì)頭節(jié)點(diǎn)分配,如果相等,就刪除空閑頭結(jié)點(diǎn),如果小于申請(qǐng)的,就不分配,否則就劃分內(nèi)存給作業(yè),剩下的內(nèi)存大小,重新插入空閑鏈隊(duì),按從大到小,接著把作業(yè)占用的內(nèi)存放到占用區(qū)鏈節(jié)點(diǎn)的末尾。每次作業(yè)運(yùn)行完,就要回收其占用的內(nèi)存大小,把作業(yè)節(jié)點(diǎn)按從大到小插入到空閑鏈隊(duì)中。5.源代碼:

      #include #include struct freelinkNode{ int len;int address;

      struct freelinkNode *next;};struct busylinkNode{ char name;

      int len;int address;struct busylinkNode *next;};struct freelinkNode *free_head=NULL;

      //自由鏈隊(duì)列(帶頭結(jié)點(diǎn))隊(duì)首指針

      struct busylinkNode *busy_head=NULL;

      //占用區(qū)隊(duì)列隊(duì)(帶頭結(jié)點(diǎn))首指針

      struct busylinkNode *busy_tail=NULL;

      //占用區(qū)隊(duì)列隊(duì)尾指針 void start(void)/* 設(shè)置系統(tǒng)初始狀態(tài)*/ { struct freelinkNode *p;

      struct busylinkNode *q;

      free_head=(struct freelinkNode*)malloc(sizeof(struct freelinkNode));

      free_head->next=NULL;// 創(chuàng)建自由鏈頭結(jié)點(diǎn)

      busy_head=busy_tail=(struct busylinkNode*)malloc(sizeof(struct busylinkNode));

      busy_head->next=NULL;// 創(chuàng)建占用鏈頭結(jié)點(diǎn)

      p=(struct freelinkNode *)malloc(sizeof(struct freelinkNode));

      p->address=64;

      p->len=640-64;//OS占用了64K

      p->next=NULL;

      free_head->next=p;

      q=(struct busylinkNode *)malloc(sizeof(struct busylinkNode));

      q->name='S';/* S表示操作系統(tǒng)占用

      */

      q->len=64;q->address=0;q->next=NULL;

      busy_head->next=q;busy_tail=q;} void requireMemo(char name, int require)/*模擬內(nèi)存分配*/ { freelinkNode *w,*u,*v;busylinkNode *p;if(free_head->next->len>=require){

      p=(struct busylinkNode*)malloc(sizeof(struct busylinkNode));

      p->name=name;

      p->address=free_head->next->address;

      p->len=require;

      p->next=NULL;

      busy_tail->next=p;

      busy_tail=p;} else

      printf(”Can't allocate“);

      w=free_head->next;

      free_head->next=w->next;

      if(w->len==require)

      {

      free(w);} else {

      w->address=w->address+require;

      w->len=w->len-require;}

      u=free_head;

      v=free_head->next;

      while((v!=NULL)&&(v->len>w->len)){

      u=v;

      v=v->next;}

      u->next=w;

      w->next=v;} void freeMemo(char name)/* 模擬內(nèi)存回收*/ { int len;

      int address;busylinkNode *q,*p;freelinkNode *w,*u,*v;q=busy_head;

      p=busy_head->next;

      while((p!=NULL)&&(p->name!=name))

      {

      q=p;

      p=p->next;}

      if(p==NULL){

      printf(”%c is not exist“,name);} else

      {

      if(p==busy_tail)

      {

      busy_tail=q;

      }

      else

      {

      q->next=p->next;

      len=p->len;

      address=p->address;

      free(p);

      w=(struct freelinkNode*)malloc(sizeof(struct freelinkNode));

      w->len=len;

      w->address=address;

      u=free_head;

      v=free_head->next;

      while((v!=NULL)&&(v->len>len))

      { u=v;v=v->next;

      }

      u->next=w;

      w->next=v;

      } } } void past(int time)/* 模擬系統(tǒng)過了time 時(shí)間*/ { printf(”過了時(shí)間%d后:n“,time);} void printlink()/* 輸出內(nèi)存空閑情況(自由鏈的結(jié)點(diǎn))*/ {

      freelinkNode *p;

      printf(”內(nèi)存的空閑情況為:n“);

      p=(struct freelinkNode *)malloc(sizeof(struct freelinkNode));

      p=free_head->next;

      while(p!=NULL)

      {

      printf(”內(nèi)存的起始地址和內(nèi)存的大小%5dt%5d:n",p->address,p->len);

      p=p->next;

      } }

      void main(){

      int t1=1,t2=2,t3=3,t4=4;

      start();

      past(t1);

      requireMemo('A',8);

      requireMemo('B',16);

      requireMemo('C',64);

      requireMemo('D',124);

      printlink();

      past(t2);

      freeMemo('C');

      printlink();

      past(t3);

      requireMemo('E',50);

      printlink();

      past(t4);

      freeMemo('D');

      printlink();} 6.運(yùn)行結(jié)果:

      7.實(shí)驗(yàn)總結(jié):

      鞏固編程能力,和調(diào)式能力,復(fù)習(xí)課本知識(shí),明白理論聯(lián)系實(shí)際的重要性,動(dòng)手能力非常重要,多看書,多獨(dú)立思考,品味痛苦的過程,享受成功的喜悅。

      操作系統(tǒng)實(shí)驗(yàn)報(bào)告

      院系:數(shù)計(jì)學(xué)院

      班級(jí):大類6班 學(xué)號(hào):100511624 姓名:明章輝

      指導(dǎo)教師:徐軍利

      第四篇:操作系統(tǒng)實(shí)驗(yàn)報(bào)告

      許昌學(xué)院

      《操作系統(tǒng)》實(shí)驗(yàn)報(bào)告書

      學(xué)號(hào):姓名:閆金科班級(jí):成績:

      5006140057

      14物聯(lián)網(wǎng)工程 2016年02月實(shí)驗(yàn)一 Linux的安裝與配置

      一、實(shí)驗(yàn)?zāi)康?/p>

      1.熟悉Linux系統(tǒng)的基本概念,比如Linux發(fā)行版、宏內(nèi)核、微內(nèi)核等。2.掌握Linux系統(tǒng)的安裝和配置過程,初步掌握Linux系統(tǒng)的啟動(dòng)和退出方法。3.熟悉Linux系統(tǒng)的文件系統(tǒng)結(jié)構(gòu),了解Linux常用文件夾的作用。

      二、實(shí)驗(yàn)內(nèi)容

      1.從網(wǎng)絡(luò)上下載VMware軟件和兩個(gè)不同Linux發(fā)行版鏡像文件。2.安裝VMware虛擬機(jī)軟件。

      3.在VMware中利用第一個(gè)鏡像文件完成第一個(gè)Linux的安裝,期間完成網(wǎng)絡(luò)信息、用戶信息、文件系統(tǒng)和硬盤分區(qū)等配置。

      4.在VMware中利用第二個(gè)鏡像文件完成第二個(gè)Linux的安裝,并通過LILO或者GRUB解決兩個(gè)操作系統(tǒng)選擇啟動(dòng)的問題。

      5.啟動(dòng)Linux系統(tǒng),打開文件瀏覽器查看Linux系統(tǒng)的文件結(jié)構(gòu),并列舉出Linux常用目錄的作用。

      三、實(shí)驗(yàn)過程及結(jié)果

      1、啟動(dòng)VMware,點(diǎn)擊新建Linux虛擬機(jī),如圖所示:

      2、點(diǎn)擊下一步,選擇經(jīng)典型,點(diǎn)擊下一步在選擇客戶機(jī)頁面選擇Linux,版本選擇Red Hat Enterprise Linux 5,如圖所示:

      3、點(diǎn)擊下一步創(chuàng)建虛擬機(jī)名稱以及所要安裝的位置,如圖所示:

      4、點(diǎn)擊下一步,磁盤容量填一個(gè)合適大小,此處選擇默認(rèn)值大小10GB,如圖所示:

      5、點(diǎn)擊完成,點(diǎn)擊編輯虛擬機(jī)設(shè)置,選擇硬件選項(xiàng)中的CD-ROM(IDE...)選項(xiàng),在右側(cè)連接中選擇“使用ISO鏡像(I)”選項(xiàng),點(diǎn)擊“瀏覽”,找到Linux的鏡像文件,如圖所示:

      6點(diǎn)擊確定按鈕后,點(diǎn)擊啟動(dòng)虛擬機(jī)按鈕,來到Linux的安裝界面,如圖所示:

      7、到此頁面之后,等待自動(dòng)檢測安裝,如圖所示:

      8、等到出現(xiàn)如圖所示頁面后點(diǎn)擊“skip”按鈕,跳過檢測,直接進(jìn)入安裝設(shè)置界面,如圖所示:

      9、安裝設(shè)計(jì)界面如圖所示:

      10、點(diǎn)擊Next按鈕進(jìn)入設(shè)置語言界面,設(shè)置語言為“簡體中文”,如圖所示:

      11、點(diǎn)擊Nest按鈕進(jìn)入系統(tǒng)鍵盤設(shè)置按鈕,設(shè)置系統(tǒng)鍵盤為“美國英語式”,如圖所示:

      12、點(diǎn)擊下一步按鈕,彈出“安裝號(hào)碼”對(duì)話框,選擇跳過輸入安裝號(hào)碼,如圖所示:

      13、按照提示,一直點(diǎn)擊下一步按鈕,如圖所示:

      14、到設(shè)置最后一步,點(diǎn)擊下一步按鈕進(jìn)入開始安裝Red Hat Enterprise Linux Sever界面,如圖所示:

      15、安裝完成后,進(jìn)入歡迎界面,按照提示點(diǎn)擊前進(jìn)按鈕知道進(jìn)入Linux桌面,如圖所示:

      16、安裝成功的Linux系統(tǒng)桌面如圖所示,桌面包含五個(gè)圖標(biāo),分別為:計(jì)算機(jī)、jk’s Home、回收站、RHEL/5.3 i386DVD。

      四、實(shí)驗(yàn)總結(jié)

      通過安裝虛擬機(jī)等操作讓我認(rèn)識(shí)到Linux這系統(tǒng)一些基本特點(diǎn),本次試驗(yàn)學(xué)會(huì)了安裝虛擬機(jī)并且使用虛擬機(jī)安裝操作系統(tǒng),掌握了紅帽Linux系統(tǒng)的安裝和配置過程,以及對(duì)鏡像ISO文件的使用,有別于我們機(jī)器上使用的系統(tǒng),通過虛擬機(jī)這個(gè)軟件還可以在已有系統(tǒng)的基礎(chǔ)上使用其他操作系統(tǒng)。安裝過程中一定要注意選擇版本的時(shí)候要選擇Red Hat Enterprise Linux 5版本,否則安裝不能成功。自己動(dòng)手成功的安裝了Linux系統(tǒng),自己對(duì)Linux的學(xué)習(xí)產(chǎn)生更大的興趣。

      實(shí)驗(yàn)二 Linux操作系統(tǒng)的運(yùn)行模式

      一、實(shí)驗(yàn)?zāi)康?/p>

      1.熟悉Linux系統(tǒng)終端工作環(huán)境的使用,了解Linux命令的格式,使用學(xué)會(huì)利用常用的Linux命令來完成系統(tǒng)的管理和維護(hù)。

      2.了解X-Windows的特點(diǎn),熟悉Linux圖形用戶接口的使用,掌握GNOME桌面環(huán)境的基本操作。

      3.了解和掌握在Linux環(huán)境下安裝軟件包的方法,如QQ for Linux等用軟件的安裝方法。

      二、實(shí)驗(yàn)內(nèi)容

      1.啟動(dòng)Linux系統(tǒng)打開虛擬終端界面,使用Linux的在線幫助指令man或help獲得ls、uname、date、cal、mkdir、cp等Linux命令的幫助手冊,了解這些命令的具體使用方法。同時(shí),也可以通過執(zhí)行“命令名 –help”來顯示該命令的幫助信息,如“l(fā)s –help”,試用這些命令。

      2.通過uname命令的執(zhí)行,查看并給出相關(guān)系統(tǒng)信息:操作系統(tǒng)的名稱、系統(tǒng)域名、系統(tǒng)CPU名稱等。

      3.在主目錄下創(chuàng)建一個(gè)名為myetc的子目錄,將/etc目錄下與網(wǎng)絡(luò)相關(guān)的文件和子目錄拷貝到該目錄,并將這些文件的執(zhí)行權(quán)限設(shè)置為可執(zhí)行。

      4.在主目錄/home下創(chuàng)建目錄program、music 和temp,然后在program下建立目錄java和C,列出完成該過程的所有命令。

      5.在圖形界面環(huán)境中,查看GNOME桌面的面板和桌面,設(shè)置GNOME,包括屏幕保護(hù)程序、更改背景和指定關(guān)聯(lián)程序等。6.實(shí)現(xiàn)對(duì)光盤的加載和訪問,然后卸載。

      三、實(shí)驗(yàn)過程及結(jié)果

      1、打開終端,輸入 【ls –help】來查看【ls】指令的使用方法,同理查看uname、date、cal、mkdir、cp的使用方法。

      2、在終端中輸入【uname –a】顯示操作系統(tǒng)名系統(tǒng)cpu名和系統(tǒng)域名

      3、重啟系統(tǒng),用【root】用戶名進(jìn)入系統(tǒng),以獲得權(quán)限。在終端中輸入【mkdir myetc】,在主目錄下創(chuàng)建【myrtc】的目錄,【ls】查看是否創(chuàng)建。輸入【cd..】返回至【/】文件,輸入【cp –r etc root/myetc】講etc中內(nèi)容復(fù)制到myetc中,進(jìn)入myetc文件【ls】查看。輸入

      【chmod u+x etc】賦予文件可執(zhí)行的權(quán)限,輸入【ll】查看。

      4、在home下,輸入【mkdir {program,music,temp}】,可在home下創(chuàng)立這三個(gè)目錄,輸入【ls】查看。在program下輸入【mkdir{java,C}】,可創(chuàng)立java和C兩個(gè)目錄,【ls】查看。

      5、在桌面上方選擇【系統(tǒng)】-【首選項(xiàng)】,即可設(shè)置屏幕保護(hù)程序和更改背景和指定關(guān)聯(lián)程序

      5、在桌面上可見看到有CD光盤,雙擊瀏覽,右鍵【彈出】即卸載。

      四、實(shí)驗(yàn)總結(jié)和體會(huì)

      Linux的指令系統(tǒng)是學(xué)習(xí)Linux操作系統(tǒng)很重要的一部分,指令系統(tǒng)相當(dāng)于在Windows操作系統(tǒng)下的doc,可以省去圖形化界面。通過這次的實(shí)驗(yàn)讓我了解了Linux的強(qiáng)大功能,了解到Linux有許多方便快捷的設(shè)置基本配置的方法,這使我更喜歡上Linux的使用。在使用指令的過程中,有時(shí)候?qū)ξ募牟僮餍枰欢ǖ臋?quán)限,這時(shí)需要在登陸時(shí)用戶名使用【root】,而不是我們在安裝時(shí)使用的用戶名,這樣就獲得了管理員權(quán)限,可以對(duì)一些系統(tǒng)文件進(jìn)行操作。

      實(shí)驗(yàn)三 Linux應(yīng)用軟件與系統(tǒng)管理

      一、實(shí)驗(yàn)?zāi)康?/p>

      1.了解OpenOffice.Org集成辦公軟件,掌握利用OpenOffice.Org的套件來完成文檔和圖片的處理。

      2.了解Linux網(wǎng)絡(luò)管理的知識(shí),熟悉Linux網(wǎng)絡(luò)配置的方法,掌握在Linux環(huán)境下配置Web服務(wù)器和ftp服務(wù)的方法。

      二、實(shí)驗(yàn)內(nèi)容

      1.配置Linux系統(tǒng)的網(wǎng)絡(luò)環(huán)境,安裝FTP和Web服務(wù)器,并配置相關(guān)的屬性,利用FTP實(shí)現(xiàn)WINDOWS和Linux之間的數(shù)據(jù)交換。

      2.利用FTP程序上傳自己的照片到FTP服務(wù)器,利用OpenOffice的文字處理工具OpenOffice Writer制作一份表格形式的個(gè)人簡歷。個(gè)人簡歷中至少包含學(xué)號(hào)、姓名、性別、專業(yè)、照片和學(xué)習(xí)經(jīng)歷等內(nèi)容,并保存為網(wǎng)頁格式(html格式)。3.將個(gè)人簡歷網(wǎng)頁設(shè)置為WEB服務(wù)器的首頁,然后在客戶端利用瀏覽器訪問WEB服務(wù)器,查看效果。

      4.通過讀取proc文件系統(tǒng),獲取系統(tǒng)各種信息(如主機(jī)名、系統(tǒng)啟動(dòng)時(shí)間、運(yùn)行時(shí)間、版本號(hào)、所有進(jìn)程信息、CPU使用率等),并以比較容易的方式顯示。

      三、實(shí)驗(yàn)過程及結(jié)果

      1.配置網(wǎng)絡(luò)環(huán)境:在(服務(wù).cmd).里面進(jìn)行以下操作:在服務(wù)里選擇3按回車

      完成后,可在本地連接看到VMware已連接上網(wǎng)絡(luò)

      在虛擬機(jī)設(shè)置中設(shè)置以太網(wǎng)網(wǎng)絡(luò)連接方式為

      網(wǎng)關(guān)地址填虛擬機(jī)的網(wǎng)管,IP地址設(shè)為虛擬機(jī)的一個(gè)子網(wǎng):

      四、總結(jié):

      在linux系統(tǒng)下,make是我們經(jīng)常用到的編譯命令,所以關(guān)于make代碼和他的操作指令一定要記清楚。所以,熟練掌握了make和makefile工具之后,源碼安裝軟件就變的像windows下安裝軟件一樣簡單。

      實(shí)驗(yàn)四 進(jìn)程控制與管理

      一、實(shí)驗(yàn)?zāi)康?/p>

      1.掌握GCC編譯器的用法,學(xué)會(huì)利用GCC編輯器來編輯C語言程序,學(xué)會(huì)利用GDB調(diào)試器來調(diào)試C語言程序。

      2.理解進(jìn)程和程序的區(qū)別和聯(lián)系,3.掌握在Linux環(huán)境下觀察進(jìn)程運(yùn)行情況和CPU工作情況的命令。4.了解fork()系統(tǒng)調(diào)用,掌握利用fork()創(chuàng)建進(jìn)程的方法。

      5.了解Linux系統(tǒng)其他與進(jìn)程相關(guān)的系統(tǒng)調(diào)用,如exec、wait和exit等。6.了解Linux常用的進(jìn)程通信機(jī)制。

      二、實(shí)驗(yàn)內(nèi)容

      1.利用Linux的進(jìn)程管理命令ps、top來監(jiān)視和跟蹤進(jìn)程,體會(huì)進(jìn)程和程序的關(guān)系。2.利用Linux的文字編輯器編寫文件復(fù)制的C語言程序,并用gcc編譯該程序,然后運(yùn)行該程序。

      3.編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)子進(jìn)程。當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動(dòng)。讓每一個(gè)進(jìn)程在屏幕上顯示一個(gè)字符:父進(jìn)程顯示'a',子進(jìn)程分別顯示字符'b'和字符'c'。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。

      4.修改上述程序,每一個(gè)進(jìn)程循環(huán)顯示一句話。子進(jìn)程顯示'daughter ?'及'son ??',父進(jìn)程顯示 'parent ??',觀察結(jié)果,分析原因。5.用fork()創(chuàng)建一個(gè)進(jìn)程,再調(diào)用exec()用新的程序替換該子進(jìn)程的內(nèi)容。

      三、實(shí)驗(yàn)過程及結(jié)果

      1、利用Linux的進(jìn)程管理命令ps、top來監(jiān)視和跟蹤進(jìn)程,體會(huì)進(jìn)程和程序的關(guān)系。<1>從用戶身份切換到ROOT身份

      <2>輸入命令 ps 查看進(jìn)程

      <2>輸入命令 top 跟蹤進(jìn)程

      2、利用Linux的文字編輯器編寫一個(gè)計(jì)算機(jī)100個(gè)自然數(shù)和的C語言程序,并用gcc編譯該程序,然后運(yùn)行該程序。

      <1>創(chuàng)建一個(gè).C文件 并進(jìn)入進(jìn)行編輯

      <2>用GCC 進(jìn)行編譯,再查看文件,發(fā)現(xiàn)產(chǎn)生執(zhí)行文件 a.out

      <3>執(zhí)行這個(gè)可執(zhí)行文件得到結(jié)果5050

      1、編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)子進(jìn)程。當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動(dòng)。讓每一個(gè)進(jìn)程在屏幕上顯示一個(gè)字符:父進(jìn)程顯示'a',子進(jìn)程分別顯示字符'b'和字符'c'。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。

      <1>穿件一個(gè).C文件 并進(jìn)行編寫程序代碼

      <2>反復(fù)執(zhí)行2次該程序

      <3>可以看出兩次執(zhí)行的結(jié)果 a b c 出現(xiàn)的順序不同,原因是,3個(gè)進(jìn)程的輸出次序是隨機(jī)的,并不會(huì)按規(guī)定的順序出現(xiàn),所以會(huì)出現(xiàn)上述結(jié)果。

      4、修改上述程序,每一個(gè)進(jìn)程循環(huán)顯示一句話。子進(jìn)程顯示'daughter ?'及'son ??',父進(jìn)程顯示 'parent ??',觀察結(jié)果,分析原因。<1>重新修改代碼

      <3>執(zhí)行這段程序

      <4>原分析:

      因和之前一樣,可以看出執(zhí)行的結(jié)果 3個(gè)單詞出現(xiàn)的順序不同,原因是,3個(gè)進(jìn)程的輸出次序是隨機(jī)的,并不會(huì)按規(guī)定的順序出現(xiàn),所以會(huì)出現(xiàn)上述結(jié)果。

      5、用fork()創(chuàng)建一個(gè)進(jìn)程,再調(diào)用exec()用新的程序替換該子進(jìn)程的內(nèi)容。<1>

      編寫代碼

      <2> 執(zhí)行的結(jié)果

      結(jié)果表明 execl 替代了son的內(nèi)容

      四、實(shí)驗(yàn)總結(jié)和體會(huì)

      這個(gè)實(shí)驗(yàn)考察的是進(jìn)程之間存在很多可能性以及對(duì)編輯器的使用。本次實(shí)驗(yàn)學(xué)習(xí)了在linux環(huán)境下用gcc編譯器運(yùn)行c語言程序,在linux環(huán)境下編寫程序用到了vi編輯器,知道了該編輯器也需要各種命令來操作。編寫C語言程序時(shí)用到了fork()函數(shù),再調(diào)用execl()用新的程序替換該子進(jìn)程的內(nèi)容。

      實(shí)驗(yàn)五 進(jìn)程調(diào)度模擬程序的設(shè)計(jì)與實(shí)現(xiàn)

      一、實(shí)驗(yàn)?zāi)康?/p>

      1.了解進(jìn)程調(diào)度的概念,掌握常用進(jìn)程調(diào)度算法的原理。2.掌握Linux程序設(shè)計(jì)編輯、編譯和調(diào)試的技巧。

      二、實(shí)驗(yàn)內(nèi)容

      1.編寫程序?qū)崿F(xiàn)進(jìn)程調(diào)度調(diào)度算法先來先服務(wù)、優(yōu)先級(jí)高優(yōu)先和時(shí)間片輪轉(zhuǎn)調(diào)度算法。(編程語言不限)

      2.輸入數(shù)據(jù),輸出運(yùn)行結(jié)果。

      三、實(shí)驗(yàn)過程及結(jié)果

      1先來先服務(wù)

      #i nclude float t,d;

      struct { int id;

      float ArriveTime;float RequestTime;float StartTime;float EndTime;float RunTime;float DQRunTime;int Status;}arrayTask[4];GetTask(){ int i;float a;

      for(i=0;i<4;i++){arrayTask[i].id=i+1;printf(“input the number”);

      printf(“input the the ArriveTime of arrayTask[%d]:”,i);scanf(“%f”,&a);

      arrayTask[i].ArriveTime=a;

      printf(“input the RequestTime of arrayTask[%d]:”,i);scanf(“%f”,&a);

      arrayTask[i].RequestTime=a;arrayTask[i].StartTime=0;arrayTask[i].EndTime=0;arrayTask[i].RunTime=0;arrayTask[i].Status=0;

      } }

      int fcfs()

      {

      int i,j,w=0;

      for(i=0;i<4;i++)

      {

      if(arrayTask[i].Status==0)

      {

      t=arrayTask[i].ArriveTime;

      w=1;

      }

      if(w==1)

      break;

      }

      for(i=0;i<4;i++)

      {

      if(arrayTask[i].ArriveTime

      t=arrayTask[i].ArriveTime;

      }

      for(i=0;i<4;i++)

      {

      if(arrayTask[i].ArriveTime==t)

      return i;

      }

      }

      int sjf(){

      int i,x=0,a=0,b=0;float g;

      for(i=0;i<4;i++){

      if(arrayTask[i].Status==1){g=arrayTask[i].EndTime;x=1;} }

      if(x==0){

      t=arrayTask[0].ArriveTime;

      for(i=0;i<4;i++){

      if(arrayTask[i].ArriveTime

      t=arrayTask[i].ArriveTime;a=i;} }

      return a;} else {

      for(i=0;i<4;i++){ if(arrayTask[i].EndTime>g)g=arrayTask[i].EndTime;}

      for(i=0;i<4;i++){ if(arrayTask[i].Status==0&& arrayTask[i].ArriveTime<=g){ t=arrayTask[i].RequestTime;a=i;b=1;} /*判斷有沒有進(jìn)程在前個(gè)進(jìn)程完成前到達(dá)*/ }

      if(b!=0)/*有進(jìn)程到達(dá)則按SJF*/ { for(i=0;i<4;i++){

      if(arrayTask[i].Status==0&&arrayTask[i].ArriveTime<=g&&arrayTask[i].RequestTime

      return a;} else{ /*否則按FCFS*/ for(i=0;i<4;i++)

      {if(arrayTask[i].Status==0)t=arrayTask[i].ArriveTime;}

      for(i=0;i<4;i++){

      if(arrayTask[i].Status==0&&arrayTask[i].ArriveTime

      return a;} } }

      new(int s)/*定義執(zhí)行進(jìn)程后相關(guān)數(shù)據(jù)的修改*/ { int i,g=0;for(i=0;i<4;i++){

      if(arrayTask[i].Status==0)continue;else { g=1;break;} }

      if(g==0)/*當(dāng)處理的是第一個(gè)未執(zhí)行的進(jìn)程時(shí)執(zhí)行*/ {

      arrayTask[s].StartTime=arrayTask[s].ArriveTime;

      arrayTask[s].EndTime=arrayTask[s].RequestTime+arrayTask[s].ArriveTime;arrayTask[s].RunTime=arrayTask[s].RequestTime;arrayTask[s].Status=1;g=2;}

      if(g==1)/*當(dāng)處理的不是第一個(gè)未執(zhí)行的進(jìn)程時(shí)執(zhí)行*/ {

      arrayTask[s].Status=1;for(i=0;i<4;i++){

      if(arrayTask[i].Status==1)d=arrayTask[i].EndTime;}

      for(i=0;i<4;i++)/*查找最后執(zhí)行的進(jìn)程的完成時(shí)間*/ {

      if(arrayTask[i].EndTime>d&&arrayTask[i].Status==1)d=arrayTask[i].EndTime;}

      if(arrayTask[s].ArriveTime

      arrayTask[s].StartTime=arrayTask[s].ArriveTime;

      arrayTask[s].EndTime=arrayTask[s].StartTime+arrayTask[s].RequestTime;arrayTask[s].RunTime=arrayTask[s].EndTime-arrayTask[s].ArriveTime;}

      arrayTask[s].DQRunTime=arrayTask[s].RunTime/arrayTask[s].RequestTime;}

      Printresult(int j)/*定義打印函數(shù)*/ {

      printf(“%dt”,arrayTask[j].id);

      printf(“%5.2ft”,arrayTask[j].ArriveTime);printf(“%5.2ft”,arrayTask[j].RequestTime);printf(“%5.2ft”,arrayTask[j].StartTime);printf(“%5.2ft”,arrayTask[j].EndTime);printf(“%5.2ft”,arrayTask[j].RunTime);printf(“%5.2fn”,arrayTask[j].DQRunTime);} main(){

      int i,b,k,a,c=0;int d[4];clrscr();

      printf(“t F.FCFS n”);printf(“t S.SFJ n”);printf(“t Q.EXIT n”);for(i=0;;i++){ if(c)break;

      printf(“please input the number a:n”);scanf(“%d”,&a);switch(a){

      case Q: c=1;break;

      case F:printf(“please input the different-ArriveTime of arrayTasksn”);GetTask();

      printf(“*****************************the result of fcfsn”);printf(“NumbertArrivetServertStarttFinishtTurnovetTake power turnover timen”);

      for(b=0;b<4;b++)/*調(diào)用兩個(gè)函數(shù)改變結(jié)構(gòu)體數(shù)的值*/ {

      k=fcfs();d[b]=k;new(k);}

      for(b=0;b<4;b++)

      Printresult(d[b]);/*調(diào)用打印函數(shù)打出結(jié)果*/ continue;

      case S: printf(“please input the different-RequestTime of array

      Tasksn”);GetTask();

      printf(“******************************the result of sjfn”);printf(“NumbertArrivetRequesttStarttEndtRuntDQRun timen”);for(b=0;b<4;b++){ k=sjf();d[b]=k;new(k);}

      for(b=0;b<4;b++)Printresult(d[b]);continue;

      default:printf(“the number Error.please input another number!n”);} } }

      四、實(shí)驗(yàn)總結(jié)和體會(huì)

      通過做本實(shí)驗(yàn),讓我對(duì)進(jìn)程或作業(yè)先來先服務(wù)、高優(yōu)先權(quán)、按時(shí)間片輪轉(zhuǎn)調(diào)度算法以及進(jìn)程調(diào)度的概念和算法,有了更深入的認(rèn)識(shí)!理解進(jìn)程的狀態(tài)及變化,動(dòng)態(tài)顯示每個(gè)進(jìn)程的當(dāng)前狀態(tài)及進(jìn)程的調(diào)度情況。進(jìn)程調(diào)度是處理機(jī)管理的核心內(nèi)容。優(yōu)先級(jí)高優(yōu)先是根據(jù)作業(yè)的優(yōu)先級(jí),總是選擇優(yōu)先級(jí)最高者進(jìn)入隊(duì)列。輪轉(zhuǎn)調(diào)度算法是調(diào)度程序每次把CPU分配給就緒隊(duì)列首進(jìn)程/線程使用規(guī)定的時(shí)間間隔,就緒隊(duì)列中都路保留巡行一個(gè)時(shí)間片。

      第五篇:操作系統(tǒng) 單處理機(jī)系統(tǒng)的進(jìn)程調(diào)度

      一.實(shí)驗(yàn)內(nèi)容描述

      1.目的

      (1)了解Windows內(nèi)存管理器(2)理解Windows的地址過程 2.內(nèi)容

      任意給出一個(gè)虛擬地址,通過WinDbg觀察相關(guān)數(shù)據(jù)并找到其物理地址

      二.理論分析

      Windows采用頁式虛擬存儲(chǔ)管理技術(shù)管理內(nèi)存,頁面是硬件級(jí)別上的最小保護(hù)單位 1.Windows內(nèi)存管理器

      Windows的內(nèi)存管理主要由Windows執(zhí)行體中的虛存管理程序負(fù)責(zé),并由環(huán)境子系統(tǒng)負(fù)責(zé),并由環(huán)境子系統(tǒng)負(fù)責(zé)與具體API相關(guān)的一些用戶態(tài)特性的實(shí)現(xiàn)。虛存管理程序是Windows中負(fù)責(zé)內(nèi)存管理的那些子程序和數(shù)據(jù)結(jié)構(gòu)的集合 內(nèi)存管理器的主要任務(wù)是:

      地址變換:將一個(gè)進(jìn)程的虛擬地址空間轉(zhuǎn)譯為物理內(nèi)存地址

      交換:當(dāng)內(nèi)存不足時(shí),將內(nèi)存中的有些內(nèi)容轉(zhuǎn)移到磁盤上,并且以后還要再次將這些內(nèi)容讀回

      2.Windows內(nèi)存管理策略

      Windows采用頁式虛擬存儲(chǔ)管理技術(shù)管理內(nèi)存,頁面是硬件級(jí)別上最小的保護(hù)單位。根據(jù)硬件的體系結(jié)構(gòu)不同,頁面尺寸被分為兩種,大頁面和小頁面。X86系統(tǒng)下小頁面為4KB,大頁面為4MB。大頁面的優(yōu)點(diǎn)是:當(dāng)引用同一頁面內(nèi)其他數(shù)據(jù)時(shí),地址轉(zhuǎn)移的速度會(huì)很快。不過使用大頁面通常要較大的內(nèi)存空間,而且必須用一個(gè)單獨(dú)的保護(hù)項(xiàng)來映射,因此可能會(huì)造成出現(xiàn)錯(cuò)誤而不引發(fā)內(nèi)存訪問違例的情況。通常PC機(jī)都為小頁面 3.Windows虛擬地址空間布局 x86結(jié)構(gòu)下的布局方式:

      默認(rèn)情況下,32位Windows系統(tǒng)中每個(gè)用戶進(jìn)程可以占有2GB的私有地址空間。操作系統(tǒng)占有另外的2GB 2GB用戶的進(jìn)程地址空間布局如表:

      2GB的系統(tǒng)地址空間布局如同:

      3.虛擬地址轉(zhuǎn)譯

      地址轉(zhuǎn)譯是指將進(jìn)程的虛擬地址空間映射到實(shí)際物理頁面的過程。x86系統(tǒng)中地址轉(zhuǎn)譯過程如圖:

      關(guān)鍵數(shù)據(jù)結(jié)構(gòu)如下: 頁目錄:每個(gè)進(jìn)程都有一個(gè)頁目錄,它是內(nèi)存管理器為了映射進(jìn)程中所有的頁表位置而創(chuàng)建的一個(gè)頁面。進(jìn)程也目錄的地址被保存在內(nèi)核進(jìn)程快KPROCESS中,在x86系統(tǒng)上,它被映射到虛擬地址0xC0300000,當(dāng)一個(gè)進(jìn)程正在執(zhí)行時(shí),CPU可以通過寄存器CR3知道該進(jìn)程頁目錄的位置。頁目錄由目錄項(xiàng)(PDE)構(gòu)成,每個(gè)PDE長4字節(jié),描述了該進(jìn)程中所有可能的頁表的狀態(tài)和位置。其格式和PTE類似。x86系統(tǒng)上,要描述完整的4GB虛擬地址空間,需要1024個(gè)頁表。因此映射這些頁表的進(jìn)程頁目錄需包含1024個(gè)PDE,恰好占用一個(gè)頁面。

      頁表:進(jìn)程的頁目錄項(xiàng)指向頁表。每個(gè)頁表占用一個(gè)頁面,由1024項(xiàng)PTE組成。一個(gè)有效的PTE大小為4字節(jié),包含兩個(gè)主域:數(shù)據(jù)所在的物理頁面的頁面幀編號(hào)(PNF)或者內(nèi)存中一個(gè)頁面的物理地址的PFN;一些描述該頁面狀態(tài)和保護(hù)屬性的標(biāo)志。

      虛擬地質(zhì)結(jié)構(gòu):x86系統(tǒng)上,一個(gè)32位虛擬地址被解釋為三個(gè)單獨(dú)的部分,頁目錄索引、頁表索引和字節(jié)索引。由于頁目錄項(xiàng)有1024個(gè),因此頁目錄索引為10位;一個(gè)也表中含有1024個(gè)PTE。因此頁表索引也為10位,字節(jié)索引為12位,正好表示一頁(4KB)內(nèi)容

      三.實(shí)驗(yàn)步驟及結(jié)果

      1.查找頁目錄首地址

      以程序WG.exe作為觀測對(duì)象。

      啟動(dòng)WinDbg到內(nèi)核調(diào)試模式,運(yùn)行程序WG.exe。終斷目標(biāo)機(jī)運(yùn)行,輸入命令:kd>!process

      發(fā)現(xiàn)WG.exe進(jìn)程正處于運(yùn)行狀態(tài) 輸入命令:

      在KPROCESS中名為DirectoryTableBase的域,對(duì)應(yīng)值為0x9fa6000,即WG.exe進(jìn)程頁目錄的物理地址 查看CR3寄存其中的內(nèi)容,輸入命令:

      CR3寄存其中的值和KPROCESS中記錄的頁目錄基址相同。這是因?yàn)樵贑PU切換執(zhí)行任務(wù)時(shí),其內(nèi)容要更新為當(dāng)前進(jìn)程的頁目錄基址。2.地址轉(zhuǎn)譯過程

      假設(shè)給定的虛擬地址為0x401001 輸入命令:

      可以看到:

      PDE的虛擬地址為C0300004.PTE的虛擬地址為C0001004 最后一行信息“pfn 9e4a---DA--UWEV”表示PDE中的具體內(nèi)容,9e4a是給定虛擬地址所在頁表在內(nèi)存中對(duì)應(yīng)的物理頁號(hào),“---DA—UWEV”是標(biāo)志信息,“pfn a173----A--UREV”表示PTE中的具體內(nèi)容,a173是數(shù)據(jù)頁裝入內(nèi)存的物理頁號(hào)。

      將數(shù)據(jù)頁對(duì)應(yīng)的物理頁號(hào)a173加上業(yè)內(nèi)索引(0x1)即可得到虛擬地址0x401001的物理地址

      3.觀察系統(tǒng)頁表

      給定觀測虛擬地址為0x80001001 輸入命令:

      當(dāng)前正在執(zhí)行的進(jìn)程是:WG.exe 輸入命令:

      得到PDE為C0300800,其對(duì)應(yīng)的物理頁號(hào)為3b 繼續(xù)讓目標(biāo)機(jī)運(yùn)行,啟動(dòng)A.exe,然后中斷目標(biāo)機(jī)運(yùn)行。輸入命令:

      當(dāng)前正在執(zhí)行的進(jìn)程為A.exe 輸入命令:

      PDE信息和對(duì)應(yīng)的物理頁號(hào)與前面觀測到的相同

      四.結(jié)論

      1.數(shù)據(jù)頁對(duì)應(yīng)的物理頁號(hào)加上相應(yīng)業(yè)內(nèi)索引即可得到虛擬地址的物理地址 2.不同的進(jìn)程頁目錄都指向了相同的系統(tǒng)表頁

      五.心得體會(huì)

      在這次上機(jī)實(shí)驗(yàn),通過對(duì)WinDbg和VPc的調(diào)試運(yùn)用,我熟悉了Windows內(nèi)存管理器的結(jié)構(gòu),也認(rèn)知到Windows如何進(jìn)行地址轉(zhuǎn)譯和轉(zhuǎn)換。對(duì)相關(guān)的知識(shí)也進(jìn)行了溫習(xí),更牢的掌握了相關(guān)知識(shí)。當(dāng)然這些還遠(yuǎn)遠(yuǎn)不夠,我以后還要繼續(xù)不斷努力,去學(xué)習(xí)了解掌握操作系統(tǒng)的各方面知識(shí)。

      附錄:

      1.A.exe代碼

      #include #include

      #define N 1

      HANDLE mutexSemaphore;HANDLE synchSemaphore_1;HANDLE synchSemaphore_2;

      HANDLE mutexDisplay;

      void Display(char*str,int delayTime){ if(WaitForSingleObject(mutexDisplay,INFINITE)==WAIT_OBJECT_0){ printf(“%snn”,str);ReleaseMutex(mutexDisplay);Sleep(delayTime);} }

      void useTime(double limit){ for(double i=0;i<=limit;i+=0.001);}

      void CreateProduct(){ Display(“Creating a production...”,0);useTime(200000);Display(“Creating finished.”,100);}

      void PutProduct(){ Display(“Putting a production...”,0);useTime(150000);Display(“Putting finished”,100);}

      void GetProduct(){ Display(“Getting a production...”,0);useTime(100000);Display(“Getting finished.”,100);}

      void ConsumeProduct(){ Display(“Cosuming a production...”,0);useTime(100000);Display(“Cosuming finished.”,100);}

      void Producer(){ while(true){ CreateProduct();

      if(WaitForSingleObject(synchSemaphore_1,INFINITE)==WAIT_OBJECT_0){

      if(WaitForSingleObject(mutexSemaphore,INFINITE)==WAIT_OBJECT_0){ PutProduct();ReleaseSemaphore(mutexSemaphore,1,NULL);} ReleaseSemaphore(synchSemaphore_2,1,NULL);} } }

      void Consumer(){ while(true){

      if(WaitForSingleObject(synchSemaphore_2,INFINITE)==WAIT_OBJECT_0){

      if(WaitForSingleObject(mutexSemaphore,INFINITE)==WAIT_OBJECT_0){ GetProduct();ReleaseSemaphore(mutexSemaphore,1,NULL);} ReleaseSemaphore(synchSemaphore_1,1,NULL);} ConsumeProduct();} }

      int main(){ HANDLE thread[2];DWORD threadID[2];

      synchSemaphore_1=CreateSemaphore(NULL,N,N,NULL);synchSemaphore_2=CreateSemaphore(NULL,0,N,NULL);mutexSemaphore=CreateSemaphore(NULL,1,1,NULL);

      mutexDisplay=CreateMutex(NULL,FALSE,NULL);

      printf(“Program start.Please use WinDbg to observe main thread.nPress any key to continue...n”);getchar();

      thread[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Producer),NULL,CREATE_SUSPENDED,&threadID[0]);printf(“A producer was created.Please use WinDbg to observe producer thread.nPress any key to continue...n”);getchar();

      thread[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consumer),NULL,CREATE_SUSPENDED,&threadID[1]);printf(“A Consumer was created.Please use WinDbg to observe Consumer thread.nPress any key to continue...n”);getchar();

      printf(“Please select:n[1]Make producer thread runn[2]Make Consumer thread runn”);bool flag=true;bool flag_1=true,flag_2=true;int count=0;while(flag){ if(getchar()=='1'&&flag_1){ ResumeThread(thread[0]);count++;flag_1=false;} else if(getchar()=='2'&&flag_2){ ResumeThread(thread[1]);count++;flag_2=false;} if(count==2)flag=false;} WaitForMultipleObjects(1,thread,TRUE,INFINITE);

      return 0;}

      2.WG.exe代碼: #include

      int main(){ int a=0;printf(“I'm Wangn”);while(true){a++;} }

      下載操作系統(tǒng)進(jìn)程管理系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)報(bào)告word格式文檔
      下載操作系統(tǒng)進(jìn)程管理系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)報(bào)告.doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        操作系統(tǒng)第一次實(shí)驗(yàn)報(bào)告(大全)

        操作 系統(tǒng) 實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)名稱:線程 控制實(shí)驗(yàn) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 目錄 一、實(shí)驗(yàn)?zāi)康暮鸵?2 二、實(shí)驗(yàn)內(nèi)容 2 三、實(shí)驗(yàn)步驟 2 四、實(shí)驗(yàn)結(jié)果與分析 3 1.單線程 3 2.單線程(睡......

        嵌入式操作系統(tǒng)實(shí)驗(yàn)報(bào)告

        實(shí)驗(yàn)一 嵌入式開發(fā)環(huán)境的建立 一、實(shí)驗(yàn)?zāi)康?通過此實(shí)驗(yàn)系統(tǒng),讀者可以了解嵌入式實(shí)時(shí)操作系統(tǒng) uC/OS-II 的內(nèi)核機(jī)制和運(yùn)行原理。本實(shí)驗(yàn)系統(tǒng)展示了 uC/OS-II 各方面的管理功能,......

        操作系統(tǒng)實(shí)驗(yàn)報(bào)告[五篇材料]

        計(jì)算機(jī)學(xué)院實(shí)驗(yàn)報(bào)告 課 程實(shí)驗(yàn)名稱 專 業(yè)班 級(jí)學(xué) 號(hào)學(xué)生姓名 操作系統(tǒng) 進(jìn)程的控制 計(jì)算機(jī)操作系統(tǒng) 131110196 鄒明鎮(zhèn) 嘉應(yīng)學(xué)院計(jì)算機(jī)學(xué)院 1305 一、實(shí)驗(yàn)?zāi)康?熟悉......

        linux操作系統(tǒng)實(shí)驗(yàn)報(bào)告

        Linux實(shí)驗(yàn)報(bào)告一 一、實(shí)驗(yàn)步驟及內(nèi)容 1.虛擬機(jī)軟件的安裝 (1)先準(zhǔn)備虛擬機(jī)安裝包。 (2)更改安裝路徑: "D: VMwareVMware Workstationvmware.exe" (3)輸入序列號(hào):ctrl+v, 在安裝過......

        操作系統(tǒng)專題實(shí)驗(yàn)報(bào)告樣式

        操作系統(tǒng)專題實(shí)驗(yàn)報(bào)告班級(jí): 學(xué)號(hào): 姓名:2014 年月日目錄 1內(nèi)核編譯與系統(tǒng)調(diào)用...................... 3 1.1實(shí)驗(yàn)?zāi)康?.............................. 3 1.2實(shí)驗(yàn)內(nèi)容 ...............

        操作系統(tǒng)實(shí)驗(yàn)報(bào)告一

        實(shí)驗(yàn)報(bào)告一 一、實(shí)驗(yàn)?zāi)康?通過本實(shí)驗(yàn),掌握Linux的基本操作以及Linux的文本編輯,對(duì)Linux有一個(gè)基本的了解。 二、實(shí)驗(yàn)任務(wù) 1、 Linux的基本操作 1) 在圖形交互方式下實(shí)現(xiàn)對(duì)用戶......

        電大操作系統(tǒng)(本科)安裝Linux系統(tǒng)實(shí)驗(yàn)報(bào)告

        中央廣播電視大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)操作系統(tǒng)(本科)實(shí)驗(yàn)報(bào)告院 系:______ _________班 級(jí):___ _____學(xué)生姓名: 王鼎文 學(xué) 號(hào): _ _____指導(dǎo)教師......

        計(jì)算機(jī)操作系統(tǒng)-司機(jī)與售票員的進(jìn)程問題-實(shí)驗(yàn)報(bào)告

        計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告 -------售票員和汽車司機(jī)的進(jìn)程同步問題 一、設(shè)計(jì)分析 司機(jī)與售票員要協(xié)同工作:一方面只有售票員把門關(guān)好之后司機(jī)才能開車,因此售票員關(guān)好門之后要......