操作系統(tǒng) 實(shí)驗(yàn)指導(dǎo)書_第1頁
操作系統(tǒng) 實(shí)驗(yàn)指導(dǎo)書_第2頁
操作系統(tǒng) 實(shí)驗(yàn)指導(dǎo)書_第3頁
操作系統(tǒng) 實(shí)驗(yàn)指導(dǎo)書_第4頁
操作系統(tǒng) 實(shí)驗(yàn)指導(dǎo)書_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、操作系統(tǒng)課程實(shí)驗(yàn)?zāi)?錄實(shí)驗(yàn)1 BACI環(huán)境下進(jìn)程的并發(fā)執(zhí)行3實(shí)驗(yàn)2 BACI環(huán)境下解決死鎖問題11實(shí)驗(yàn)3 µC/OS-II操作系統(tǒng)的進(jìn)程調(diào)度模塊源碼分析16實(shí)驗(yàn)4 µC/OS-II操作系統(tǒng)的動(dòng)態(tài)內(nèi)存管理18實(shí)驗(yàn)5 磁盤調(diào)度算法模擬實(shí)驗(yàn)21附1: 創(chuàng)建進(jìn)程(開設(shè)Linux基礎(chǔ)課程班級(jí)選作)26附2: 線程的創(chuàng)建及線程間互斥的實(shí)現(xiàn)(開設(shè)Linux基礎(chǔ)課程班級(jí)選作)34實(shí)驗(yàn)1 BACI環(huán)境下進(jìn)程的并發(fā)執(zhí)行【實(shí)驗(yàn)?zāi)康摹?)了解BACI并發(fā)運(yùn)行環(huán)境。2)使用BACI設(shè)計(jì)并發(fā)程序,深入理解并發(fā)概念?!緱l件要求】1)認(rèn)真閱讀和掌握預(yù)備知識(shí)。2)上機(jī)操作?!绢A(yù)備知識(shí)】一、BACI簡介并行和

2、同步是計(jì)算機(jī)科學(xué)中的重要課題。由于對(duì)并行和分布式計(jì)算的日益重視,理解并行和同步變得愈發(fā)重要。為了獲得對(duì)于這些概念的感性認(rèn)識(shí),編寫并行程序的實(shí)踐經(jīng)驗(yàn)將是必不可少的。BACI是幫助學(xué)生獲得需要的“第一手”并行程序設(shè)計(jì)經(jīng)驗(yàn)的選項(xiàng)之一。BACI是Ben-Ari Concurrent Interpreter(Ben-Ari并行解釋器)的縮寫。編譯器和解釋器最初由M. Ben-Ari設(shè)計(jì)完成,主要基于Niklaus Wirth的Pascal編譯器。最初版本的BACI編譯器和解釋器基于這些代碼,并運(yùn)行于一個(gè)PRIME大型機(jī)。經(jīng)過大量的修改和擴(kuò)充,目前版本已經(jīng)移植到了PC上,支持的語言包括Turbo Pasc

3、al, Sun Pascal以及C。此外,編譯器和解釋器被分成了兩個(gè)獨(dú)立的程序。后來,BACI中還加入了C-編譯器,這是一個(gè)有限的C+子集,它可以編譯C-程序?yàn)榻忉屍髂軌蚪忉尩闹虚g代碼(PCODE object code)。與其他并行語言相比,BACI在學(xué)生熟悉的語法框架內(nèi)提供了多種并行技術(shù),所有具有C或Pascal程序設(shè)計(jì)經(jīng)驗(yàn)的學(xué)生都可以在幾小時(shí)內(nèi)掌握BACI的使用,BACI已經(jīng)被成功地運(yùn)用于很多大學(xué)的課堂教學(xué)。二、C-編譯器語法BACI的C-是C+的一個(gè)子集。換言之,C-符合C+語法,此外,它包括一些限制和新的數(shù)據(jù)類型,例如:1)除了標(biāo)準(zhǔn)輸入輸出(cout,cin,endl)之外不支持其他

4、文件操作。2)C- BACI只支持簡單的C/C+類型:int和char。簡單類型的常量修飾符(const)也被支持,所有的變量必須在代碼塊的開頭定義。3)支持字符串類型(string)。BACI同時(shí)包括內(nèi)建的字符串處理函數(shù),例如stringCopy, stringCompare, stringConcat等等。 4)支持簡單類型和字符串?dāng)?shù)組,數(shù)組定義遵循常見的C語法。5)支持過程和函數(shù),采用標(biāo)準(zhǔn)的作用域規(guī)則,參數(shù)定義可以使用傳值和傳遞引用的方式,執(zhí)行開始于對(duì)“main()”的調(diào)用。6)過程控制語句包括if-else,switch/case,for,while,do-while,break和co

5、ntinue,這些語句的句法和標(biāo)準(zhǔn)的C/C+相同。三、并行結(jié)構(gòu)1.cobegincobegin塊包括一組并發(fā)執(zhí)行的進(jìn)程列表,這樣的塊不允許嵌套,而且只能出現(xiàn)在主程序中。列表中的PCODE語句將被解釋器以任意、隨機(jī)的順序執(zhí)行,于是多次執(zhí)行包括cobegin塊的相同程序的結(jié)果將呈現(xiàn)不可預(yù)測(cè)性。主程序?qū)炱?,直到cobegin塊終結(jié),此時(shí)主程序?qū)⒒謴?fù)執(zhí)行緊隨塊后的下一條語句。下面是一個(gè)例子:cobegin proc1( . ); proc2( . ); . ; procN( . );2.semaphoresemaphore是一個(gè)BACI預(yù)定義類型,它是一個(gè)非負(fù)的整數(shù)變量,并且只能通過受限的方式訪問。

6、BACI也提供了一個(gè)它的子類型binarysem,這是一個(gè)二元信號(hào)量,它的值只能是0或1。信號(hào)量函數(shù)包括: initialsem ( semaphore s, integer_expression ):能夠初始化BACI中兩種信號(hào)量s的唯一的函數(shù)。 p(semaphore s)和wait(semaphore s ):如果semaphore > 0,則遞減1并返回,從而調(diào)用者能夠繼續(xù)運(yùn)行;如果semaphore = 0,則遞減1,p的調(diào)用者將休眠。 v(semaphore s)和signal(semaphore s):如果semaphore=0并且存在等待它的進(jìn)程,則將隨機(jī)地喚醒一個(gè),并且

7、semaphore遞增1。無論如何v的調(diào)用者將繼續(xù)。3.monitorsBACI也支持有限的Hoare monitor概念,monitor是包括附加屬性的C-塊,所有monitor變量中的函數(shù)都對(duì)外可見,但monitor變量不可以在塊外訪問,而只能由monitor函數(shù)訪問。在BACI中,monitor只能在全局域中定義,并且不能嵌套。任意時(shí)刻只能有一個(gè)monitor塊中的過程或函數(shù)被執(zhí)行。這一特性使得能夠使用monitor來實(shí)現(xiàn)互斥。有三個(gè)可以被過程或函數(shù)使用的monitor機(jī)制:condition變量,waitc(條件等待)以及signalc(條件信號(hào))。 condition變量:只能被mo

8、nitor的函數(shù)訪問。這種變量不能有實(shí)際的值,它是進(jìn)行P操作或V操作的標(biāo)志。 void waitc(condition cond, int prio):monitor進(jìn)程將被阻塞,并賦予指定的優(yōu)先級(jí)(prio)以備重新喚醒。這個(gè)阻塞動(dòng)作允許就緒的其他進(jìn)程繼續(xù)執(zhí)行。 void waitc(condition cond):與waitc調(diào)用語義相同,但這一P操作將被賦予優(yōu)先級(jí)10。 void signalc(condition cond):如果存在的話,喚醒等待cond的優(yōu)先級(jí)最高的進(jìn)程。 void empty(condition cond):當(dāng)沒有等待cond的進(jìn)程時(shí)返回“1”,反之返回“0”。4

9、.其他并行結(jié)構(gòu) atomic(原子的)關(guān)鍵字:如果某個(gè)函數(shù)被定義為“atomic”,則函數(shù)將是不可剝奪的。解釋器將不會(huì)在進(jìn)程切換時(shí)中斷atomic函數(shù)。 void suspend(void):將調(diào)用進(jìn)程置為休眠狀態(tài)。 void revive(int process_id):激活給定id的進(jìn)程。 int which_proc( void ):返回當(dāng)前進(jìn)程的線程數(shù)。 int random(int range):返回0到“range-1”之間,包括端點(diǎn)的偽隨機(jī)數(shù)。四、怎樣使用BACIBACI C-編譯器源文件的擴(kuò)展名必須是“.cm”,在BACI中運(yùn)行程序的步驟是:1)編譯“.cm”文件以獲得PCOD

10、E文件(.pco)。命令格式為:bacc 參數(shù) 源文件名常見的參數(shù)包括: h:顯示幫助信息。 c:產(chǎn)生“.pob”目標(biāo)文件,以便進(jìn)行后續(xù)的連接操作。2)使用解釋器解釋執(zhí)行PCODE(.pco)文件。命令格式為:bainterp 參數(shù) PCODE文件名常見的參數(shù)包括: d:調(diào)試模式,單步執(zhí)行,可以設(shè)置斷點(diǎn)。 e:在每一進(jìn)程項(xiàng)旁邊顯示活動(dòng)記錄(AR)。 x:每一進(jìn)程退出時(shí)顯示AR。 t:通知進(jìn)程結(jié)束。 h:顯示幫助信息。 p:執(zhí)行時(shí)顯示PCODE指令?!緦?shí)驗(yàn)內(nèi)容】1)設(shè)包含可執(zhí)行文件bacc,bainterp的目錄名為“balnxxe”,進(jìn)入該目錄。#cd balnxxe2)使用Vi編輯一個(gè)新文件

11、“exam8a.cm”。#vi exam8a.cm其內(nèi)容如下:void func1() cout<<"*"<<endl; cout<<"AAAAAAAAAAAAAA"<<endl; cout<<"BBBBBBBBBBBBBB"<<endl;void func2() cout<<"$"<<endl; cout<<"CCCCCCCCCCCCCC"<<endl; cout<&l

12、t;"DDDDDDDDDDDDDD"<<endl;main() cobeginfunc1();func2();3)保存退出“exam8a.cm”。4)在Linux下編譯“exam8a.cm”。#./bacc exam8a.cm 5)解釋執(zhí)行“exam8a.pco”。#./bainterp exam8a.pco記錄執(zhí)行結(jié)果。6)再次解釋執(zhí)行“exam8a.pco”。#./bainterp exam8a.pco比較這次結(jié)果與上次結(jié)果有何不同,試說明原因。7)使用Vi編輯一個(gè)新文件“exam8b.cm”。#vi exam8b.cm其內(nèi)容如下:int x=0;int y

13、=0;void func1() x=4; cout<<endl; y=y+x;void func2() y=3; cout<<endl; x=x+2;main() cobeginfunc1();func2(); cout<<"x="<<x<<" "<<"y="<<y<<endl;8)保存退出“exam8b.cm”。9)在Linux下編譯“exam8b.cm”。# ./bacc exam8b.cm 10)解釋執(zhí)行“exam8b.pco”。#.

14、/bainterp exam8b.pco 記錄執(zhí)行結(jié)果。11)再次解釋執(zhí)行“exam8b.pco”。#./bainterp exam8b.pco比較這次結(jié)果與上次結(jié)果有何不同,試說明原因。并解釋每種結(jié)果的語句執(zhí)行次序。12)使用Vi編輯一個(gè)新文件“exam8c.cm”。#vi exam8c.cm其內(nèi)容如下:int x=0;void func1() int i=0; for(i=0;i<50;i=i+1) x=x+1;void func2()int i=0;for(i=0;i<50;i=i+1) x=x+1;main()cobeginfunc1();func2();cout<&

15、lt;"x="<<x <<endl;13)保存退出“exam8c.cm”。14)在Linux下編譯“exam8c.cm”。# ./bacc exam8c.cm 15)解釋執(zhí)行exam8c.pco ./bainterp exam8c.pco 記錄執(zhí)行結(jié)果??纯磝的結(jié)果是否等于100。試說明原因。16)使用Vi編輯一個(gè)新文件“exam8d.cm”。#vi exam8d.cm其內(nèi)容如下:int x=0;int turn=0;void func1() int i=0;for(i=0;i<50;i=i+1) while(turn!=0); x=x+1;

16、/*臨界區(qū)*/ turn=1; void func2()int i=0;for(i=0;i<50;i=i+1) while(turn!=1); x=x+1; /*臨界區(qū)*/ turn=0; main()cobeginfunc1();func2();cout<<"x="<<x <<endl;17)保存退出“exam8d.cm”。18)在Linux下編譯“exam8d.cm”。# ./bacc exam8d.cm 19)解釋執(zhí)行“exam8d.pco”。# ./bainterp exam8d.pco 記錄執(zhí)行結(jié)果。看看x的結(jié)果是否等于1

17、00。試說明原因。20)使用Vi編輯一個(gè)新文件“exam8e.cm”。#vi exam8e.cm其內(nèi)容如下:int x=0;semaphore s;void func1() int i=0;for(i=0;i<50;i=i+1)wait(s); x=x+1; /*臨界區(qū)*/ signal(s);void func2()int i=0;for(i=0;i<50;i=i+1) wait(s); x=x+1; /*臨界區(qū)*/ signal(s); main()initialsem(s,1);cobeginfunc1();func2();cout<<"x="

18、<<x <<endl;21)保存退出“exam8e.cm”。22)在Linux下編譯“exam8e.cm”。#./bacc exam8e.cm 23)解釋執(zhí)行“exam8e.pco”。# ./bainterp exam8e.pco 記錄執(zhí)行結(jié)果??纯磝的結(jié)果是否等于100。試說明原因。實(shí)驗(yàn)2 BACI環(huán)境下解決死鎖問題【實(shí)驗(yàn)?zāi)康摹?)理解死鎖產(chǎn)生的原因。2)使用BACI解決“生產(chǎn)者消費(fèi)者”問題中的死鎖問題?!緱l件要求】1)認(rèn)真閱讀和掌握預(yù)備知識(shí)。2)上機(jī)操作?!绢A(yù)備知識(shí)】一、什么是死鎖操作系統(tǒng)中并發(fā)執(zhí)行的進(jìn)程會(huì)不斷地申請(qǐng)、使用和釋放系統(tǒng)的資源,雖然系統(tǒng)會(huì)盡量合理地控制資

19、源的分配,但是由于系統(tǒng)資源的數(shù)量是有限的,總會(huì)發(fā)生若干進(jìn)程都相互等待對(duì)方釋放己占用的資源才能繼續(xù)運(yùn)行下去的情況,使系統(tǒng)中的一部分進(jìn)程和資源處于無限期停滯的狀態(tài)。這種可能發(fā)生在一組相互合作或競(jìng)爭的進(jìn)程之間的問題,稱為死鎖。所謂進(jìn)程死鎖是指各并發(fā)進(jìn)程彼此互相等待對(duì)方所擁有的資源,且這些并發(fā)進(jìn)程在得到對(duì)方的資源之前不會(huì)釋放自己所擁有的資源。即出現(xiàn)了各進(jìn)程間相互的“永久”阻塞的狀態(tài),這一組進(jìn)程就稱為死鎖進(jìn)程。如果沒有“外力”的推動(dòng),死鎖就是永久性的。二、產(chǎn)生死鎖的原因1)競(jìng)爭資源:當(dāng)系統(tǒng)中供多個(gè)進(jìn)程所共享的資源不足以同時(shí)滿足它們的需要時(shí),引起它們對(duì)資源的競(jìng)爭而產(chǎn)生死鎖。2)進(jìn)程推進(jìn)順序非法:進(jìn)程在運(yùn)行

20、過程中,請(qǐng)求和釋放資源的順序不當(dāng),導(dǎo)致了進(jìn)程死鎖。三、“生產(chǎn)者消費(fèi)者”問題“生產(chǎn)者消費(fèi)者”問題是一個(gè)典型的進(jìn)程協(xié)作的例子。問題描述如下:一個(gè)或者多個(gè)生產(chǎn)者producers不斷地產(chǎn)生數(shù)據(jù)并將數(shù)據(jù)data放入一個(gè)緩沖區(qū)buffer,一個(gè)或者多個(gè)消費(fèi)者consumer不斷地從緩沖區(qū)取出產(chǎn)品消費(fèi),每個(gè)消費(fèi)者每次只取一個(gè),只能有一個(gè)生產(chǎn)者producer(或者消費(fèi)者consumer)在某一時(shí)刻可以訪問緩沖區(qū)(對(duì)公共緩沖區(qū)的訪問要互斥)。具體情況分析如下:1)一個(gè)生產(chǎn)者,一個(gè)消費(fèi)者,一個(gè)緩沖區(qū)。要求P進(jìn)程(生產(chǎn)者)不能往“滿”的緩沖區(qū)中放產(chǎn)品,設(shè)置信號(hào)量為“S1”,表示空白緩沖區(qū)的數(shù)目,S1初值為1;要

21、求C進(jìn)程(消費(fèi)者)不能從“空的緩沖區(qū)中取產(chǎn)品,設(shè)置信號(hào)量“S2”,表示緩沖區(qū)中產(chǎn)品的數(shù)目,S2初值為0。算法描述如下:P: C:while (true) while (true) 生產(chǎn)一個(gè)產(chǎn)品; wait(s2); wait(s1) ; 從緩沖區(qū)取產(chǎn)品; 送產(chǎn)品到緩沖區(qū); signal(s1); signal(s2); 消費(fèi)產(chǎn)品; ;2)m個(gè)生產(chǎn)者,k個(gè)消費(fèi)者,n個(gè)緩沖區(qū)。要求:只能有一個(gè)生產(chǎn)者(或者消費(fèi)者)在某一時(shí)刻可以訪問緩沖區(qū)(對(duì)公共緩沖區(qū)的訪問要互斥);假定公用緩沖池中具有n個(gè)緩沖區(qū),這時(shí)可利用互斥信號(hào)量mutex實(shí)現(xiàn)諸進(jìn)程對(duì)緩沖池的互斥使用;利用信號(hào)量empty和full分別表示緩沖

22、池中空緩沖區(qū)和滿緩沖區(qū)的數(shù)量。對(duì)“生產(chǎn)者消費(fèi)者“問題可描述如下: P: C:while (true) while (true) 生產(chǎn)一個(gè)產(chǎn)品; wait(full); wait(mutex); wait(empty) ; 從緩沖區(qū)取產(chǎn)品; wait(mutex); signal(mutex); 送產(chǎn)品到緩沖區(qū); signal(empty); signal(mutex); signal(full); 消費(fèi)產(chǎn)品; ;細(xì)讀上述同步流程可以發(fā)現(xiàn):1)在每個(gè)程序中用于實(shí)現(xiàn)互斥的wait(mutex)和signal(mutex)必須成對(duì)地出現(xiàn)。2)對(duì)資源信號(hào)量empty和full的wait和signal操

23、作,同樣需要成對(duì)地出現(xiàn),但它們分別處于不同的程序中。3)在每個(gè)程序中的多個(gè)wait操作順序不能顛倒。應(yīng)先執(zhí)行對(duì)資源信號(hào)量的wait操作,然后再執(zhí)行對(duì)互斥信號(hào)量的wait操作,否則可能引起進(jìn)程死鎖。而兩個(gè)signal操作的順序無關(guān)緊要?!緦?shí)驗(yàn)內(nèi)容】1)設(shè)包含可執(zhí)行文件bacc,bainterp的目錄名為“balnxxe”,進(jìn)入該目錄。#cd balnxxe2)使用Vi編輯一個(gè)新文件“exam14a.cm”。# vi exam14a.cm其內(nèi)容如下:/* hint在這里起到測(cè)試生產(chǎn)者消費(fèi)者是否能互斥訪問緩沖區(qū),先加1后減1,如果互斥了,結(jié)果仍然為0,不變*/const int size=10;se

24、maphore s;semaphore n;semaphore e;int hint=0;int pcsize;int v=0;int w=0;int in=0;int out=0;void produce()v=v+1;void consume()int b=0;b=w;void append()int a=0;hint=hint+1;pcin=v;a= pcin ;in=in+1;in=in%size;cout<<"put the data "<< a<<endl ;void take()hint=hint-1;w=pcout;out

25、=out+1;out=out%size;cout<<"take the data "<< w <<endl;void p()int i=0; while(i<1000) produce(); wait(e);wait(s); append();signal(s);signal(n);i=i+1;void c() int i=0;while(i<1000)wait(n); wait(s); take();signal(s);signal(e);consume();i=i+1;void main()initialsem(s,1);

26、initialsem(n,0);initialsem(e,10);cobeginp(); c();cout<<"hint ="<<hint<<endl;3)保存退出“exam14a.cm”。4)使用BACI的bacc編譯器編譯“exam14a.cm”。#./bacc exam14a.cm 5)解釋執(zhí)行“exam14a.pco”。#./bainterp exam14a.pco記錄執(zhí)行結(jié)果。看看hint的結(jié)果是不是等于0。并觀察生產(chǎn)者和消費(fèi)者交替執(zhí)行的過程。6)執(zhí)行命令:#cp exam14a.cm exam14b.cm 7)使用Vi編輯“e

27、xam14b.cm”。交換p()函數(shù)中wait(e)與wait(s)的順序。8)保存退出“exam14b.cm”。9)使用BACI的bacc編譯器編譯“exam14b.cm”。#./bacc exam14b.cm 10)解釋執(zhí)行“exam14b.pco”。#./bainterp exam14b.pco >pc.txt11)用Vi查看“pc.txt”的內(nèi)容。查看hint的結(jié)果是否為0,并觀察生產(chǎn)者和消費(fèi)者交替執(zhí)行的過程。如果發(fā)生死鎖,試解釋原因。12)執(zhí)行命令:#cp exam14a.cm exam14c.cm13)使用Vi編輯“exam14c.cm”。交換c()函數(shù)中wait(n)與wa

28、it(s)的順序。14)保存退出“exam14c.cm”。15)使用BACI的bacc編譯器編譯“exam14c.cm”。#./bacc exam14c.cm16)解釋執(zhí)行“exam14c.pco”#./bainterp exam14c.pco >pc.txt17)用Vi查看“pc.txt”的內(nèi)容。查看hint的結(jié)果是否為0,并觀察生產(chǎn)者和消費(fèi)者交替執(zhí)行的過程。如果發(fā)生死鎖,試解釋原因。實(shí)驗(yàn)3 µC/OS-II操作系統(tǒng)的進(jìn)程調(diào)度模塊源碼分析【實(shí)驗(yàn)?zāi)康摹空莆?#181;C/OS-II操作系統(tǒng)的進(jìn)程調(diào)度模塊源碼的實(shí)現(xiàn)思路【條件要求】1)認(rèn)真查閱µC/OS-II操作系統(tǒng)的相

29、關(guān)資料。2)小組為單位提交報(bào)告?!救蝿?wù)解析】1)uC/OS的任務(wù)控制塊-0.8 ( 25頁2.3 ) 2)任務(wù)就緒表的結(jié)構(gòu)-0.9 (29頁2.4.1)3)對(duì)任務(wù)就緒表的操作(將就緒任務(wù)狀態(tài)填入就緒表)-0.9 (31頁2.4.2)4)根據(jù)就緒表確定最高優(yōu)先級(jí)(采用查表法確定高優(yōu)先級(jí)任務(wù))-1 ( 31頁2.4.2)5)任務(wù)調(diào)度器實(shí)現(xiàn)流程圖表述-1 (43頁2.4.3)6)任務(wù)調(diào)度器實(shí)現(xiàn)及源代碼分析-1 (43頁2.4.3 )7)任務(wù)切換的過程描述-0.8(可選) (43頁2.4.3 )8)用戶任務(wù)的實(shí)現(xiàn)(編寫一個(gè)示例程序驗(yàn)證調(diào)度算法)-1 (43頁例2-7)9)任務(wù)狀態(tài)切換(掛起和恢復(fù)任務(wù))

30、示例程序演示-0.9(可選)(48頁例2-8)10)用信號(hào)量實(shí)現(xiàn)任務(wù)間同步和互斥示例程序演示-0.9(可選)(119頁例4-4,122頁例4-5)11)用消息郵箱實(shí)現(xiàn)任務(wù)間通信示例程序演示-0.9(可選)(136頁例4-8)【任務(wù)說明】本次項(xiàng)目答辯擬定安排在課程的第三章結(jié)束后進(jìn)行,老師課堂上講解該項(xiàng)目(2-4學(xué)時(shí)),學(xué)生課下完成(10學(xué)時(shí))。項(xiàng)目的整個(gè)過程是以小組為單位組織實(shí)施的(8人左右),小組長負(fù)責(zé)分配任務(wù)、監(jiān)控實(shí)施過程并反饋實(shí)施情況,老師協(xié)助指導(dǎo)。該項(xiàng)目的考核:以小組為單位提交報(bào)告并參加答辯。采用該答辯成績?nèi)〈谥锌荚?。小組成績優(yōu)秀的報(bào)告作品將收錄到操作系統(tǒng)課程網(wǎng)站,供其他同學(xué)學(xué)習(xí)和參考

31、。小組成員可以從11個(gè)問題中選擇1個(gè)或2個(gè)(選擇2個(gè)的問題,權(quán)重按1記)完成相關(guān)任務(wù)。組內(nèi)成員一定要協(xié)作把自己負(fù)責(zé)的那部分給其他成員講解清楚,以助于推進(jìn)任務(wù)的進(jìn)行,最后選出1名同學(xué)闡述小組完成情況(可制作PPT)。答辯過程中至少講清楚2個(gè)權(quán)重為1的問題。問題由老師指定,答辯過程中組內(nèi)成員可以輔助回答。每組的答辯時(shí)間為自述5分鐘+提問5分鐘。答辯過程中完成自評(píng)(滿分4分),指導(dǎo)老師評(píng)分(滿分6分)。學(xué)生的期中考試成績=(自評(píng)成績+指導(dǎo)老師評(píng)分)*權(quán)重。指導(dǎo)老師有權(quán)利根據(jù)大家答辯準(zhǔn)備情況,報(bào)告完成情況以及答辯回答問題情況調(diào)整大家的考試成績(報(bào)告空白、抄襲、文不對(duì)題:0分記)。老師會(huì)根據(jù)大家的自評(píng)分

32、高低來決定問什么級(jí)別的問題。實(shí)驗(yàn)4 µC/OS-II操作系統(tǒng)的動(dòng)態(tài)內(nèi)存管理【實(shí)驗(yàn)?zāi)康摹空莆?#181;C/OS-II操作系統(tǒng)內(nèi)存管理的實(shí)現(xiàn)思路以及如何對(duì)內(nèi)存進(jìn)行操作【條件要求】1)認(rèn)真查閱µC/OS-II操作系統(tǒng)的相關(guān)資料。2)上機(jī)操作?!救蝿?wù)解析】1)描述內(nèi)存塊的數(shù)據(jù)結(jié)構(gòu):內(nèi)存控制塊定義 2)內(nèi)存控制塊與內(nèi)存分區(qū)之間的關(guān)系 3)動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)【任務(wù)說明】本次實(shí)驗(yàn)擬定安排在課程的第四章結(jié)束后進(jìn)行,需要了解µC/OS-II操作系統(tǒng)如何對(duì)內(nèi)存分區(qū)進(jìn)行管理以及如何使用系統(tǒng)提供的相關(guān)函數(shù)完成使用和釋放動(dòng)態(tài)內(nèi)存。實(shí)驗(yàn)要求:設(shè)計(jì)一個(gè)含有3個(gè)任務(wù)的應(yīng)用程序,這3個(gè)任務(wù)分別是

33、MyTask、YouTask和HerTask。在應(yīng)用程序中創(chuàng)建一個(gè)動(dòng)態(tài)內(nèi)存分區(qū),該分區(qū)有8個(gè)內(nèi)存塊,每個(gè)內(nèi)存塊的長度為6個(gè)字節(jié)。應(yīng)用程序的任務(wù)YouTask和HerTask都在任務(wù)運(yùn)行后請(qǐng)求一個(gè)內(nèi)存塊,隨后就釋放它。任務(wù)MyTask也在任務(wù)運(yùn)行后請(qǐng)求一個(gè)內(nèi)存塊,但是要在任務(wù)MyTask運(yùn)行6次后,才釋放它所申請(qǐng)的內(nèi)存塊。為了了解內(nèi)存分區(qū)變化的情況,編寫代碼來觀察分區(qū)內(nèi)內(nèi)存塊鏈表的頭指針和已被使用內(nèi)存塊的個(gè)數(shù)。實(shí)現(xiàn)一個(gè)任務(wù)的參考程序#include "includes.h"#define TASK_STK_SIZE 512 /任務(wù)堆棧長度OS_STK MyTaskStkTAS

34、K_STK_SIZE;INT16S key; /用于退出uCOS_II的鍵 char *s;char *s1="MyTask"INT8U err;INT8U x=0,y=0; /字符顯示位置OS_MEM *IntBuffer;INT8U IntPart56; INT8U *IntBlkPtr;OS_MEM_DATA MemInfo;void MyTask(void *pdata); void Quitkey(void);/*主函數(shù)*/void main (void) OSInit(); /初始化uCOS_II PC_DOSSaveReturn(); /保存Dos環(huán)境 PC_

35、VectSet(uCOS, OSCtxSw); /安裝uCOS_II中斷 IntBuffer=OSMemCreate(IntPart,5,6,&err); OSTaskCreate(MyTask,0,&MyTaskStkTASK_STK_SIZE - 1,0);/ 創(chuàng)建動(dòng)態(tài)內(nèi)存分區(qū) OSStart(); /*MyTask*/void MyTask (void *pdata) pdata=pdata; OS_ENTER_CRITICAL(); PC_VectSet(0x08, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXI

36、T_CRITICAL(); for (;) PC_DispStr(10,+y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE); IntBlkPtr=OSMemGet(IntBuffer,&err);/ 請(qǐng)求獲得一個(gè)內(nèi)存塊 OSMemQuery(IntBuffer,&MemInfo);/ 查詢一個(gè)內(nèi)存分區(qū)目前的狀態(tài)信息 sprintf(s,"%0x",MemInfo.OSFreeList);/ 輸出內(nèi)存塊鏈表的頭指針 PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE); sprintf(

37、s,"%d",MemInfo.OSNUsed);/輸出已分配內(nèi)存塊數(shù)目 PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE); OSMemPut(IntBuffer,IntBlkPtr);/ 釋放一個(gè)內(nèi)存塊 Quitkey(); OSTimeDlyHMSM(0,0,1,0); /*Quitkey()*/void Quitkey(void) if(PC_GetKey(&key)=TRUE) if(key=0x1B) PC_DOSReturn(); 小結(jié):l Ucos通過定義一個(gè)二維數(shù)組在內(nèi)存中劃分一個(gè)內(nèi)存分區(qū),其中所有的

38、內(nèi)存塊應(yīng)大小相等。l 系統(tǒng)通過與內(nèi)存分區(qū)相關(guān)聯(lián)的內(nèi)存控制塊來對(duì)內(nèi)存分區(qū)進(jìn)行管理。l 劃分及創(chuàng)建內(nèi)存分區(qū)根據(jù)需要有應(yīng)用程序負(fù)責(zé),而系統(tǒng)只提供了可供調(diào)用的相關(guān)函數(shù)。l 在Ucos中,使用和釋放內(nèi)存的安全性方面,要由應(yīng)用程序全權(quán)負(fù)責(zé)。實(shí)驗(yàn)5 磁盤調(diào)度算法模擬實(shí)驗(yàn)【實(shí)驗(yàn)?zāi)康摹?)掌握幾種常用的磁盤調(diào)度算法。2)學(xué)會(huì)編寫實(shí)現(xiàn)算法的C語言程序?!緱l件要求】1)認(rèn)真閱讀和掌握預(yù)備知識(shí)。2)上機(jī)操作。【預(yù)備知識(shí)】一、磁盤簡介磁盤通常由若干個(gè)盤片(每片分兩面)組成,每個(gè)盤片又劃分若干個(gè)磁道(典型值為5002000),每個(gè)磁道可以存放相同容量的數(shù)據(jù)。每個(gè)磁道上又分出若干個(gè)扇區(qū)(典型值為10100),每個(gè)扇區(qū)通常都

39、存儲(chǔ)512個(gè)字節(jié)數(shù)據(jù)。在磁盤上存儲(chǔ)數(shù)據(jù),必須將磁盤格式化。1.磁盤的類型1)固定頭磁盤。這種磁盤在每條磁道上都有一個(gè)讀/寫磁頭,所有的磁頭都被裝在一個(gè)剛性磁臂中。通過這些磁頭可訪問所有磁道,并進(jìn)行并行讀/寫,從而有效地提高了磁盤的I/O速度。 這種結(jié)構(gòu)主要用于大容量磁盤上。2)移動(dòng)頭磁盤。每一個(gè)盤面僅配有一個(gè)磁頭,也被裝入磁臂中。為了能訪問該盤面上的所有磁道,該磁頭必須能移動(dòng)以進(jìn)行尋道??梢?,移動(dòng)磁頭僅能以串行方式讀/寫,致使其I/O速度較慢;但由于其結(jié)構(gòu)簡單, 故仍廣泛應(yīng)用于中小型磁盤設(shè)備中。 2.磁盤訪問時(shí)間磁盤訪問時(shí)間尋道時(shí)間+旋轉(zhuǎn)延遲時(shí)間+數(shù)據(jù)傳輸時(shí)間。1)尋道時(shí)間:將磁頭定位于相應(yīng)磁

40、道上的時(shí)間。當(dāng)代磁盤平均為5ms10ms。2)轉(zhuǎn)延遲時(shí)間:相應(yīng)扇區(qū)旋轉(zhuǎn)到磁頭處的時(shí)間。與磁盤轉(zhuǎn)速有關(guān),硬盤轉(zhuǎn)速為5400 r/m 10000r/m,軟盤轉(zhuǎn)速為300 r/m 600r/m。3)傳輸時(shí)間:把數(shù)據(jù)從磁盤讀出或向磁盤寫入數(shù)據(jù)所經(jīng)歷的時(shí)間,速度較快。對(duì)于一個(gè)典型磁盤,平均尋道時(shí)間為10ms,旋轉(zhuǎn)延遲時(shí)間為3ms,讀一個(gè)扇區(qū)所花時(shí)間為0.01875ms。可見尋道時(shí)間對(duì)磁盤性能影響較大。二、幾種常用的磁盤調(diào)度算法磁盤是可供多個(gè)進(jìn)程共享的設(shè)備,當(dāng)有多個(gè)進(jìn)程要求訪問磁盤時(shí),應(yīng)采用一種調(diào)度算法,以使各進(jìn)程對(duì)磁盤的平均訪問時(shí)間盡可能少。而磁盤調(diào)度的最終目標(biāo)是減少磁盤的平均尋道時(shí)間。常用的調(diào)度算法有

41、:先來先服務(wù)FCFS,最短尋道時(shí)間優(yōu)先SSTF,掃描算法SCAN和循環(huán)掃描算法CSCAN。例如:某磁盤共200個(gè)磁道,編號(hào)為0199。某時(shí)刻磁頭剛從第96磁道移動(dòng)到第100磁道,目前正停在第100磁道上。之后該磁盤依次接收到的磁道請(qǐng)求分別為:55,58,39,18,90,160,150,38,184。請(qǐng)采用各種磁盤調(diào)度算法進(jìn)行調(diào)度。1.先來先服務(wù)FCFS(First-Come, First Served)1)按照進(jìn)程請(qǐng)求的先后順序;2)對(duì)所有進(jìn)程而言是公平的;3)當(dāng)有許多進(jìn)程時(shí),性能上接近隨機(jī)調(diào)度。磁頭訪問次序?yàn)椋?5,58,39,18,90,160,150,38,184磁頭移動(dòng)距離為:45,

42、 3,19, 21,72,70,10,112,146平均尋道長度為:55.32.最短尋道時(shí)間優(yōu)先SSTF(Shortest Seek Time First)1)選擇磁頭臂的移動(dòng)距當(dāng)前位置最近的磁盤I/O請(qǐng)求;2)經(jīng)常可以獲得最小的尋道時(shí)間。磁頭訪問次序?yàn)椋?0,58,55,39,38,18,150,160,184磁頭移動(dòng)距離為:10,32,3,16,1,20,132,10,24平均尋道長度為:27.53.掃描(SCAN)算法1)進(jìn)程“饑餓”現(xiàn)象。SSTF算法雖然能獲得較好的尋道性能, 但卻可能導(dǎo)致某個(gè)進(jìn)程發(fā)生“饑餓”(Starvation)現(xiàn)象。因?yàn)橹灰粩嘤行逻M(jìn)程的請(qǐng)求到達(dá), 且其所要訪問的

43、磁道與磁頭當(dāng)前所在磁道的距離較近,這種新進(jìn)程的I/O請(qǐng)求就必須優(yōu)先滿足。對(duì)SSTF算法略加修改后所形成的SCAN算法, 可防止老進(jìn)程出現(xiàn)“饑餓”現(xiàn)象。2)SCAN算法。(1)磁頭臂只沿著一個(gè)方向移動(dòng),并在途中滿足所有未完成的請(qǐng)求,直到到 達(dá)這個(gè)方向上的最后一個(gè)磁道;(2)然后改變方向繼續(xù)掃描。磁頭訪問次序?yàn)椋?50,160,184,90,58,55,39,38,18磁頭移動(dòng)距離為:50, 10, 24, 94,32, 3, 16, 1, 20平均尋道長度為:27.84.循環(huán)掃描(CSCAN)算法1)限制只在一個(gè)方向上掃描;2)當(dāng)在一個(gè)方向上的最后一個(gè)磁道被訪問之后,磁頭臂返回磁盤的另一端再次開

44、始掃描。磁頭訪問次序?yàn)椋?50,160,184,18,38,39,55,58,90磁頭移動(dòng)距離為:50,10,24,166,20,1, 16, 3, 32平均尋道長度為:35.8【實(shí)驗(yàn)內(nèi)容】1)某磁盤共200個(gè)磁道,編號(hào)為0199。某時(shí)刻磁頭剛從第96磁道移動(dòng)到第100磁道,目前正停在第100磁道上。之后該磁盤依次接收到的磁道請(qǐng)求分別為:55,58,39,18,90,160,150,38,184。編寫磁盤調(diào)度算法,顯示磁道的服務(wù)順序、移動(dòng)的總道數(shù)以及平均尋道長度。2)創(chuàng)建目錄“ex17”,然后進(jìn)入該目錄。# mkdir ex17# cd ex173)使用Vi編輯一個(gè)新文件“exam17a.c”

45、。# vi exam17a.c實(shí)現(xiàn)最短尋道時(shí)間優(yōu)先(SSTF)調(diào)度算法,其內(nèi)容如下:#include "stdio.h"#include "math.h"void sstf(int current,int* queue,int len) int i=0,j=0,count=0,sum=0,min=0; while(1) if(count=len) break; i=0; while(queuei=-1) i+; min=abs(current-queuei); for(j=i+1;j<len;j+) if(queuej=-1) continue;

46、if(abs(current-queuej)<min) min=abs(current-queuej); i=j; printf("%dn",queuei); sum=sum+abs(current-queuei); current=queuei; queuei=-1; count+; printf("sum=%dn",sum); printf("average=%fn",sum*1.0/len);main() int current=100; int queue9=55,58,39,18,90,160,150,38,184;

47、sstf(current,queue,9);4)使用GCC編譯器編譯“exam17a.c”。#gcc exam17a.c o exam17a5)執(zhí)行exam17a。#./exam17a顯示結(jié)果為:905855393818150160184sum248average27.5555566)使用Vi編輯一個(gè)新文件“exam17b.c”。# vi exam17b.c實(shí)現(xiàn)先來先服務(wù)(fcfs)磁盤調(diào)度算法,編譯并執(zhí)行顯示調(diào)度后的順序,要求顯示結(jié)果如下:555839189016015038184sum498average55.333333附1: 創(chuàng)建進(jìn)程(開設(shè)Linux基礎(chǔ)課程班級(jí)選作)【實(shí)驗(yàn)?zāi)康摹?1)

48、通過運(yùn)行程序,理解進(jìn)程的創(chuàng)建,掌握程序與進(jìn)程的區(qū)別和聯(lián)系。2)理解并掌握fork系統(tǒng)調(diào)用的用法。3)理解并掌握exec系統(tǒng)調(diào)用的用法。【條件要求】1)認(rèn)真閱讀和掌握本實(shí)踐的指導(dǎo)材料。2)上機(jī)操作?!绢A(yù)備知識(shí)】一、程序與進(jìn)程的定義程序是為了完成某項(xiàng)任務(wù)而編排的語句序列,它告訴計(jì)算機(jī)如何執(zhí)行,因此程序是需要運(yùn)行的。程序運(yùn)行過程中,需要占有計(jì)算機(jī)的各種資源。進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。它是操作系統(tǒng)動(dòng)態(tài)執(zhí)行的基本單元,在傳統(tǒng)的操作系統(tǒng)中,進(jìn)程既是基本的分配單元,也是基本的執(zhí)行單元。進(jìn)程實(shí)體由PCB、用戶程序段、用戶數(shù)據(jù)段和棧組成。這里的PCB和棧是由操作系統(tǒng)為用戶程序添

49、加的信息。見圖6-1。圖6-1 進(jìn)程示意圖二、進(jìn)程和程序的區(qū)別與聯(lián)系程序是靜態(tài)概念,本身可以作為一種軟件資源保存;而進(jìn)程是程序的一次執(zhí)行過程,是動(dòng)態(tài)概念,它有一定的生命期,是動(dòng)態(tài)地產(chǎn)生和消亡的。進(jìn)程是一個(gè)能獨(dú)立運(yùn)行的單位,能與其他進(jìn)程并發(fā)執(zhí)行,進(jìn)程是作為自愿申請(qǐng)和調(diào)度單位存在的;而通常的程序不能作為一個(gè)獨(dú)立運(yùn)行的單位。程序與進(jìn)程并無一一對(duì)應(yīng)關(guān)系,一方面一個(gè)程序可由多個(gè)進(jìn)程共用;另一方面一個(gè)進(jìn)程只能對(duì)應(yīng)一個(gè)程序。進(jìn)程和程序的關(guān)系猶如演出和劇本的關(guān)系。三、fork系統(tǒng)調(diào)用一個(gè)進(jìn)程調(diào)用了fork以后,系統(tǒng)會(huì)創(chuàng)建一個(gè)子進(jìn)程。這個(gè)子進(jìn)程和父進(jìn)程的不同之處在于進(jìn)程ID和父進(jìn)程ID,其他都一樣。當(dāng)一個(gè)程序中

50、調(diào)用fork函數(shù)后,內(nèi)核會(huì)完成如下工作: 內(nèi)核系統(tǒng)分配新的內(nèi)存塊和內(nèi)核數(shù)據(jù)結(jié)構(gòu); 復(fù)制原來的進(jìn)程到新的進(jìn)程; 向運(yùn)行進(jìn)程集添加新的進(jìn)程; 將進(jìn)程返回給兩個(gè)進(jìn)程。設(shè)原來的進(jìn)程為父進(jìn)程,調(diào)用fork生成的新進(jìn)程為子進(jìn)程,則子進(jìn)程會(huì)執(zhí)行父進(jìn)程中fork函數(shù)后的代碼。 fork系統(tǒng)調(diào)用使用格式: 頭文件:#include <sys/types.h> /* 提供類型pid_t的定義 */#include <unistd.h> 函數(shù)原形為:pid_t fork(void); 返回值為“pid_t”。對(duì)于父進(jìn)程,fork函數(shù)返回了子程序的進(jìn)程號(hào),而對(duì)于子程序,fork函數(shù)則返回零。這

51、樣,對(duì)于程序,只要判斷fork函數(shù)的返回值,就知道自己是處于父進(jìn)程還是子進(jìn)程中。如果調(diào)用不成功,則返回“-1”。四、exec族函數(shù)exec函數(shù)族的作用是根據(jù)指定的文件名找到可執(zhí)行文件,并用它來取代調(diào)用進(jìn)程的內(nèi)容。換言之,就是在調(diào)用進(jìn)程內(nèi)部執(zhí)行一個(gè)可執(zhí)行文件。這里的可執(zhí)行文件既可以是二進(jìn)制文件,也可以是任何Linux下可執(zhí)行的腳本文件。exec系統(tǒng)調(diào)用有6種不同的使用格式,但在核心中只對(duì)應(yīng)一個(gè)調(diào)用入口。它們有不同的調(diào)用格式和調(diào)用參數(shù)。這六種調(diào)用格式分別為:#include <unistd.h>1)int execl (const char *path, const char *arg

52、0, ., const char*argn, (char *)0);2)int execv (const char *path, char *const *argv);3)int execle (const char *path, const char *arg0, ., const char*argn,(char *0), const char *envp);4)int execve (const char *path, char *const *argv, char *const *envp);5)int execlp (const char *file, const char *arg0, ., const char*argn, (char *)0);6)int execvp (const char *file, char *const *argv);參數(shù)“path”指出一個(gè)可執(zhí)行目標(biāo)文件的路徑名,參數(shù)“f

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論