

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課 程 設(shè) 計(jì)</b></p><p><b> (操作系統(tǒng))</b></p><p> 題 目: CSCAN磁盤調(diào)度算法</p><p> 班 級(jí): 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 計(jì)算機(jī)系 10-8班</p><p> 姓 名: <
2、;/p><p> 指導(dǎo)教師: </p><p> 系主任: </p><p> 2013年03月01日</p><p><b> 目 錄</b></p><p> 1CSCAN磁盤調(diào)度算法問(wèn)題課程設(shè)計(jì)1</p><p> 1
3、.1 題目分析1</p><p> 1.2 數(shù)據(jù)結(jié)構(gòu)1</p><p><b> 1.3 流程圖1</b></p><p> 1.4 實(shí)現(xiàn)技術(shù)2</p><p> 1.5 設(shè)計(jì)結(jié)論和心得2</p><p> 2 Linux代碼分析4</p><p>
4、 2.1 功能說(shuō)明4</p><p> 2.2 接口說(shuō)明4</p><p> 2.3 局部數(shù)據(jù)結(jié)構(gòu)4</p><p><b> 2.4 流程圖4</b></p><p> 2.5 以實(shí)例說(shuō)明運(yùn)行過(guò)程5</p><p> 1CSCAN磁盤調(diào)度算法問(wèn)題課程設(shè)計(jì)</p>
5、<p><b> 分析題目 </b></p><p> 將queue[n]進(jìn)行由小到大的排序,首先定位當(dāng)前調(diào)度磁headstarts在queue[n]的位置,然后在此位置按給定的方向遍歷queue[n],當(dāng)?shù)蓝它c(diǎn)(queue[0]或queue[n-1])時(shí),反向到另一端點(diǎn)再以此方向進(jìn)行遍歷,直到queue[n]中所有都調(diào)度完。當(dāng)調(diào)度磁道不在queue端點(diǎn)時(shí),總的尋道長(zhǎng)度為為前
6、一個(gè)磁道與后一個(gè)磁道差值的累加,當(dāng)?shù)竭_(dá)端點(diǎn)且queue[n]未全調(diào)度時(shí),總尋道長(zhǎng)度加上端點(diǎn)值再加上磁盤磁道總長(zhǎng)度,再加上下一個(gè)調(diào)度磁道的值,再按前面的算法進(jìn)行,直到磁道全部都調(diào)度完畢,得到總的尋道長(zhǎng)度,除以n得到平均尋道長(zhǎng)度。</p><p><b> 數(shù)據(jù)結(jié)構(gòu)</b></p><p> Hand:當(dāng)前磁道號(hào); DiscLine[10]:隨機(jī)生成的磁道號(hào); &
7、lt;/p><p> void SetDI(int DiscL[])生成隨機(jī)磁道號(hào)算法; </p><p> void CopyL(int Sour[],int Dist[] ,int x) 數(shù)組Sour復(fù)制到數(shù)組Dist復(fù)制到x個(gè)數(shù)四詳細(xì)設(shè)計(jì); </p><p> void DelInq(int Sour[],int x,int y) 數(shù)組Sour
8、把x位置的數(shù)刪除,x后的數(shù)組元素向前挪一位. </p><p> void PaiXu()尋道長(zhǎng)度由低到高排序</p><p> void CSCAN(int Han,int DiscL[])循環(huán)掃描算法(CSCAN)</p><p><b> 1.3流程圖</b></p><p><b> 實(shí)現(xiàn)技術(shù)&
9、lt;/b></p><p> 為實(shí)現(xiàn)上述設(shè)計(jì),采用C++語(yǔ)言,VS2008開發(fā)環(huán)境。具體采用的技術(shù)如下:</p><p><b> 循環(huán)掃描算法</b></p><p><b> 實(shí)現(xiàn)步驟如下:</b></p><p> 輸入起始磁道(你可以輸入100),點(diǎn)確定,進(jìn)入第二個(gè)界面,再輸
10、入你要輸入的最大磁道(你可以輸入50),然后點(diǎn)確定。選擇磁盤調(diào)度算法1 2 3 4中的任意一個(gè),若選擇4后確認(rèn),則隨機(jī)輸出10個(gè)小于50的磁道數(shù) :(47 26 21 38 19 12 17 49 35 44),則循環(huán)掃描算法(CSCAN):(12 17 19 21 26 35 38 44 47 49)。</p><p><b> 運(yùn)行結(jié)果如下:</b></p>
11、<p><b> 設(shè)計(jì)結(jié)論和心得</b></p><p> 通過(guò)課程設(shè)計(jì)得到如下結(jié)論:</p><p> 本次實(shí)驗(yàn)首先要了解磁盤調(diào)度的工作原理及四種調(diào)度方法的工作原理。在課程設(shè)計(jì)前的準(zhǔn)備工作時(shí),先把這部分工作做完了。在設(shè)計(jì)總的程序框架的時(shí)候,要注意各功能模塊的位置,盡量做到簡(jiǎn)潔、有序;各功能模塊與主程序要正確銜接。 </p><p&
12、gt; 有如下幾點(diǎn)心得體會(huì):</p><p> 至此,計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)算法已經(jīng)完成。此次設(shè)計(jì)基本完成了所規(guī)定的功能,但由于這次設(shè)計(jì)的時(shí)間比較倉(cāng)促,其中不免會(huì)有些紕漏,比如在程序的實(shí)現(xiàn)上還不夠嚴(yán)謹(jǐn),出錯(cuò)處理不夠完善等多方面問(wèn)題,這些都有進(jìn)一步改善。由于平時(shí)上課不是很認(rèn)真許多概念沒有理解清楚,導(dǎo)致在做設(shè)計(jì)時(shí)有點(diǎn)無(wú)從下手的感覺,只好邊實(shí)驗(yàn)邊看書直到弄懂概念后才開始做設(shè)計(jì)導(dǎo)致時(shí)間有點(diǎn)緊張,最終在同學(xué)和老師的指
13、導(dǎo)下我完成了設(shè)計(jì),此設(shè)計(jì)基本能夠?qū)崿F(xiàn)規(guī)定的要求但是還是不夠完善,很多東西做的不夠好,程序不夠完善和嚴(yán)謹(jǐn)。此次課程設(shè)計(jì)中我學(xué)到了很多東西,無(wú)論在理論上還是實(shí)踐中,都得到不少的提高,這對(duì)于我以后的工作和學(xué)習(xí)都有一種巨大的幫助。</p><p> #include<iostream.h></p><p> #include<stdio.h></p>&l
14、t;p> #include<stdlib.h></p><p> void menu(){ </p><p> cout<<"*********************菜單*********************"<<endl;</p><p> cout<<
15、"******1、先來(lái)先服務(wù)算法(FCFS) **********"<<endl; </p><p> cout<<"******2、最短尋道時(shí)間優(yōu)先算法(SSTF) **********"<<endl; </p>
16、<p> cout<<"******3、掃描算法 (SCAN) **********"<<endl; </p><p> cout<<"******4、循環(huán)掃描算法 (CSC
17、AN) **********"<<endl; </p><p> cout<<"******5、退出
18、160; **********"<<endl; </p><p> cout<<"**********************************************"<<endl;</p><p><
19、b> }</b></p><p> /*======================初始化序列=======================*/</p><p> void init(int queue[],int queue_copy[],int n){ </p><p><b> int i;
20、; </b></p><p> for(i=0;i<n;++i) </p><p> queue[i]=queue_copy[i];</p><p><b> }</b></p><p> //對(duì)當(dāng)前正在執(zhí)行的磁道號(hào)進(jìn)行定位,返回磁道號(hào)小于當(dāng)前磁道中最大的一個(gè)
21、</p><p> int fix ( int queue[], int n, int headstarts){ </p><p> int i =0; while ( i<n && headstarts>queue[i] ) </p><p><b> { </b
22、></p><p><b> i++; </b></p><p><b> } </b></p><p> if ( i>n-1 ) </p><p> return n-1; &
23、#160; </p><p> //當(dāng)前磁道號(hào)大于磁盤請(qǐng)求序列中的所有磁道 </p><p> if ( i==0 ) </p><p> return -1; </p><p> //當(dāng)前磁道號(hào)
24、小于磁盤請(qǐng)求序列中的所有磁道 </p><p><b> else </b></p><p> return i-1; </p><p> //返回小于當(dāng)前磁道號(hào)中最大的一個(gè)</p><p><
25、;b> }</b></p><p> /*=================使用冒泡算法從小到大排序==============*/</p><p> int *bubble(int queue[],int m)</p><p><b> { </b></p><p><b>
26、; int i,j;</b></p><p><b> int temp;</b></p><p> for( i=0; i<m;i++)</p><p> for(j=i+1;j<m;j++) </p><p><b> {
27、60;</b></p><p> if( queue[i] > queue[j]) </p><p><b> { </b></p><p> temp=queue[i]; </p>
28、<p> queue[i]=queue[j]; </p><p> queue[j]=temp; </p><p><b> } </b></p><p><b> } </b></p&
29、gt;<p> cout<<"排序后的磁盤序列為:"; </p><p> for( i=0;i<m;i++) //輸出排序結(jié)果 </p><p><b> { </b></p><p>
30、; cout<<queue[i]<<" "; </p><p><b> } </b></p><p> cout<<endl; </p><p> return queue;</p><p><b
31、> }</b></p><p> /* ====================以下是FCFS算法==================*/</p><p> void FCFS(int queue[],int n,int diskrode,int headstarts) </p><p> //queue是請(qǐng)求調(diào)度序列,n為其個(gè)
32、數(shù),diskroad為磁盤磁道數(shù),headstarts為正在調(diào)度的磁道</p><p><b> { </b></p><p> cout<<"************以下為FCFS調(diào)度算法***********"<<endl;</p><p><b> int
33、 i; </b></p><p> int count=0; </p><p> if ( headstarts>queue[0]) </p><p> count +=headstarts-queue[0]; </p>
34、<p><b> else </b></p><p> count+=queue[0]-headstarts;</p><p> cout<<"調(diào)度序列為: "; </p><p> co
35、ut<<headstarts<<" "; </p><p> for(i=0;i<n-1;++i) </p><p><b> { </b></p><p>
36、 cout<<queue[i]<<" "; </p><p> if ( queue[i]>queue[i+1])
37、; </p><p> count +=queue[i]-queue[i+1]; </p><p> else </p><p> count +=queue[i+1]-queue[i];
38、60; </p><p><b> } </b></p><p> cout<<queue[i]; </p><p> cout<<endl; </p><p> cout<&
39、lt;"總的尋道長(zhǎng)度為: "<<count<<endl; </p><p> cout<<"平均尋道長(zhǎng)度為: "<<float(count)/float(n)<<endl;</p><p><b> }&l
40、t;/b></p><p> /*=====================SSTF算法====================*/</p><p> void SSTF( int queue[], int n, int diskrode, int headstarts) </p><p><b> { </b>
41、;</p><p><b> int k=1; </b></p><p><b> int l,r; </b></p><p> int i,j,count=0; </p><p> queue =bubble(queue,n);
42、0; </p><p> cout<<"************以下為SSTF調(diào)度算法***********"<<endl; </p><p> if ( queue[n-1] <=headstarts) </p><p> //若當(dāng)前磁道號(hào)大于請(qǐng)求序列中最大者,則
43、直接由外向內(nèi)依次給予各請(qǐng)求服務(wù) </p><p><b> { </b></p><p> cout<<"磁盤掃描序列為: "; </p><p> cout<<headstarts<<&quo
44、t; "; </p><p> for(i=n-1;i>=0;i--) </p><p> cout<<queue[i]<<" "; </p><p> count =headstar
45、ts-queue[0]; </p><p><b> } </b></p><p> if ( queue[0] >=headstarts) </p><p> //若當(dāng)前磁道號(hào)小于請(qǐng)求序列中最小者,則直接由內(nèi)向外依次給予各請(qǐng)求服務(wù) </
46、p><p><b> { </b></p><p> cout<<"磁盤掃描序列為: "; </p><p> cout<<headstarts<<" "; <
47、/p><p> for(i=0;i<n;i++) </p><p> cout<<queue[i]<<" "<<endl; </p><p> count =queue[n-1]-headstarts;
48、;</p><p><b> } </b></p><p> if( headstarts >queue[0] && headstarts <queue[n-1]) </p><p> //若當(dāng)前磁道號(hào)大于請(qǐng)求序列中最小者且小于最大者 <
49、/p><p><b> { </b></p><p> cout<<"磁盤掃描序列為:"; </p><p> cout<<headstarts<<" "; &
50、lt;/p><p> while ( queue[k] <headstarts) </p><p> //確定當(dāng)前磁道在已排的序列中的位置 </p><p><b> { </b></p><p>
51、 k++; </p><p><b> } </b></p><p> l =k-1; </p><p> r =k; </p>
52、<p> while ( ( l >=0) && ( r<n)) </p><p> //當(dāng)前磁道在請(qǐng)求序列范圍內(nèi) </p><p><b> { </b></p>&
53、lt;p> if ( (headstarts-queue[l]) <(queue-headstarts))</p><p><b> { </b></p><p> cout<<queue[l]<<" ";
54、60; </p><p> count +=headstarts-queue[l]; </p><p> headstarts =queue[l];
55、 </p><p> l=l-1; </p><p><b> } </b></p><p> else if ( (headstarts-queue[l]) ==(queue-hea
56、dstarts)) </p><p><b> { </b></p><p> cout<<queue[l]<<" ";
57、; </p><p> count +=headstarts-queue[l]; </p><p> headstarts =queue[l]; </p><p&g
58、t; l =l-1; </p><p> } else { </p><p> cout<<queue<<" ";
59、160; </p><p> count+=queue-headstarts; </p><p> headstarts =queue; </p>&
60、lt;p> r =r+1; </p><p><b> } </b></p><p><b> }</b></p><p> if( l==-1)</p><p>&
61、lt;b> {</b></p><p> //磁頭移動(dòng)到序列的最小號(hào),返回外側(cè)掃描仍未掃描的磁道 </p><p> for ( j=r;j<n;j++) </p><p> { &
62、#160; </p><p> cout<<queue[j]<<" "; </p><p><b> } </b>&l
63、t;/p><p> count +=queue[n-1]-queue[0]; </p><p> } else { </p><p> //磁頭移動(dòng)到序列的最大號(hào),返回內(nèi)側(cè)掃描仍未掃描的磁道 </p><p> for(j
64、=l;j>=0;j--) </p><p><b> { </b></p><p> cout<<queue[j]<<" ";
65、; </p><p><b> } </b></p><p> count +=queue[n-1]-queue[0]; </p><p><b> } </b></p
66、><p><b> } </b></p><p> cout<<endl; </p><p> cout<<"總的尋道長(zhǎng)度為: "<<count<<endl;
67、; </p><p> cout<<"平均尋道長(zhǎng)度為: "<<(float)(count)/(float)(n)<<endl; </p><p><b> }</b></p><p> /*======================以下是SCAN算法=====
68、===============*/</p><p> void SCAN( int queue[], int n, int diskrode, int headstarts )</p><p><b> { </b></p><p> int direction, i, fixi; </p><p&
69、gt; cout<<"***********以下是SCAN調(diào)度算法*************"<<endl; </p><p> cout<<"請(qǐng)輸入磁頭的走向:1.由內(nèi)向外 2.由外向內(nèi)"<<endl; </p><p> cout<<"請(qǐng)輸入磁頭的走向
70、: ";</p><p> cin>>direction; double count=0; </p><p> *bubble(queue,n); fixi = fix(queue,n,headstarts); </p><p> cout<<fixi<<endl;
71、;cout<<"調(diào)度序列為: "<<headstarts<<" "; </p><p> if ( fixi ==-1) </p><p> // headstarts比請(qǐng)求調(diào)度序列都小 </p>
72、<p><b> { </b></p><p> if ( direction ==1) </p><p><b> //從大到小 </b></p><p><b> { </b></
73、p><p> for ( i=0;i<n;i++) </p><p><b> { </b></p><p> cout<<queue[i]<<" "; </p&
74、gt;<p> count +=queue[i]-headstarts; </p><p> headstarts =queue[i]; </p><p><b> } </b></p><p><b> }
75、160; </b></p><p> if ( direction ==2) </p><p><b> //從小到大 </b></p><p><b> { </b></p><p> for (i=
76、0; i<n; i++) </p><p><b> { </b></p><p> cout<<queue[i]<<" "; </p><p> count +=
77、queue[i]-headstarts; </p><p> headstarts =queue[i]; </p><p><b> } </b></p><p><b> } </b></p>
78、<p> } else if ( fixi ==n-1) </p><p> //headstarts比請(qǐng)求調(diào)度序列的都大 </p><p><b> { </b></p><p> if ( direction ==1)
79、; </p><p><b> { </b></p><p> for ( i=n-1; i>=0;i--) </p><p><b> { </
80、b></p><p> cout<<queue[i]<<" "; </p><p> count +=headstarts-queue[i]; </p><p> headstarts =queu
81、e[i]; </p><p><b> } </b></p><p><b> } </b></p><p> if ( direction ==2) </p&g
82、t;<p><b> //從小到大 </b></p><p><b> { </b></p><p> for ( i=n-1;i>=0;i--) </p><p> //從大到小
83、 </p><p><b> { </b></p><p> cout<<queue[i]<<" "; </p><p> count +=headstart
84、s-queue[i]; </p><p> headstarts =queue[i]; </p><p><b> } </b></p><p><b> } </
85、b></p><p> } else { </p><p> if (direction ==1) </p><p><b> //從大到小 </b></p><p><b> {
86、160; </b></p><p> for ( i=fixi;i>-1;i--) </p><p><b> { </b></p><p> cout<<queue[i]
87、<<" "; </p><p> count +=headstarts-queue[i]; </p><p> headstarts =queue[i]; </p
88、><p><b> } </b></p><p> count +=queue[fixi+1]-queue[0]; </p><p> //磁頭走到0再反向走 </p><p>
89、headstarts =queue[fixi+1]; </p><p> cout<<headstarts<<" "; </p><p> for ( i =fixi+2;i<n;i++) </
90、p><p><b> { </b></p><p> cout<<queue[i]<<" "; </p><p> count +=queue[i]-headstarts;
91、 </p><p> headstarts =queue[i]; </p><p><b> } </b></p><p><b> } </b></p
92、><p> if (direction ==2) </p><p><b> //從小到大 </b></p><p><b> { </b></p><p> for ( i=fixi+1;i<n;i++)
93、160; </p><p><b> { </b></p><p> cout<<queue[i]<<" "; </p><p> count +
94、=queue[i]-headstarts; </p><p> headstarts =queue[i]; </p><p><b> } </b></p><
95、p> headstarts =queue[fixi]; </p><p> count +=queue[n-1]-queue[fixi]; </p><p> //磁頭走到n-1再反向走 </p><p> cou
96、t<<headstarts<<" "; </p><p> for ( i=fixi-1;i>-1;i--) </p><p> //從大到小 </p><p><b
97、> { </b></p><p> cout<<queue[i]<<" "; </p><p> count +=headstarts-queue[i];
98、60;</p><p> headstarts =queue[i]; </p><p><b> } </b></p><p><b> } </b></p><p><b> }
99、 </b></p><p> cout<<endl; </p><p> cout<<"總的尋道長(zhǎng)度為: "<<count<<endl; </p><p> cout<<"平均尋道長(zhǎng)度為: &q
100、uot;<<float(count)/n<<endl;</p><p><b> } </b></p><p> /*======================以下是CSCAN算法====================*/</p><p> void CSCAN(int queue[],
101、int n,int diskrode,int headstarts)</p><p><b> { </b></p><p> int direction,i,fixi; cout<<"***********以下是CSCAN調(diào)度算法*************"<<endl; </p&g
102、t;<p> cout<<"請(qǐng)輸入磁頭的走向:1.由內(nèi)向外 2.由外向內(nèi)"<<endl; </p><p> cout<<"請(qǐng)輸入磁頭的走向: "; </p><p> cin>>direction; int count=0;
103、160; </p><p> //count表示磁道移動(dòng)的長(zhǎng)度 </p><p> *bubble(queue,n); </p><p> fixi=fix(queue,n,headstarts); </p><p> cout<<"調(diào)度序列為:
104、"<<headstarts<<" "; </p><p> if(fixi==-1) </p><p> //headstarts比請(qǐng)求調(diào)度序列都小 </p><p><b> { &
105、lt;/b></p><p> if(direction==1) </p><p><b> //從大到小 </b></p><p><b> { </b></p><p> co
106、unt +=queue[fixi+1]-queue[0]; </p><p> //反向再反向 </p><p> headstarts =queue[n-1]; </p><p> cout<<headstarts<<"
107、 "; </p><p> for ( i=n-2;i>-1;--i) </p><p><b> { </b></p><p> cout<<queue[i]<<" &quo
108、t;; </p><p> count +=headstarts-queue[i]; </p><p> headstarts=queue[i]; </p><p><b> } </b>&l
109、t;/p><p><b> } </b></p><p> if(direction==2) </p><p><b> //從小到大 </b></p><p><b> {
110、0;</b></p><p> for(i=0;i<n;++i) </p><p><b> { </b></p><p> cout<<queue[i]<<" ";
111、0; </p><p> count +=queue[i]-headstarts; </p><p> headstarts=queue[i]; </p><p><b> } </b></p><p>
112、<b> } </b></p><p> } else if(fixi==n-1) </p><p> //headstarts比請(qǐng)求調(diào)度序列都大 </p><p><b> { </b></p><p>
113、; if(direction==1) </p><p><b> //從大到小 </b></p><p><b> { </b></p><p> for(i=n-1;i>-1;--i)
114、0;</p><p><b> { </b></p><p> cout<<queue[i]<<" "; </p><p> count +=headstarts-queue[i];
115、; </p><p> headstarts=queue[i]; </p><p><b> } </b></p><p><b> } </b></p><p> if( direction
116、==2) </p><p><b> //從小到大 </b></p><p><b> { </b></p><p> cout<<queue[0]<<" ";
117、; </p><p> for(i=1;i<n;++i) </p><p><b> { </b></p><p> cout<<queue[i]<<" ";
118、60; </p><p> count +=queue[i]-queue[i-1]; </p><p><b> } </b></p><p> count +=headstarts-queue[0];
119、 </p><p><b> } </b></p><p> } else { </p><p> if ( direction==1) </p><p><b> //從大到小
120、160;</b></p><p><b> { </b></p><p> for ( i=fixi;i>-1;i--) </p><p><b> { </b></p>
121、<p> cout<<queue[i]<<" "; </p><p> count +=headstarts-queue[i]; </p><p> headstarts=queue[i]; </p&
122、gt;<p><b> } </b></p><p> count +=queue[n-1]-queue[0]; </p><p> //磁頭走到0時(shí)再反向... </p><p
123、> headstarts=queue[n-1]; </p><p> cout<<headstarts<<" "; for ( i=n-2;i>fixi;i--) </p><p><b> {
124、 </b></p><p> cout<<queue[i]<<" "; </p><p> count +=headstarts-queue[i]; </p><p> headstarts
125、=queue[i]; </p><p><b> } </b></p><p><b> } </b></p><p> if(direction==2) </p>
126、<p><b> //從小到大 </b></p><p><b> { </b></p><p> for( i=fixi+1;i<n;i++) </p><p><b> {
127、 </b></p><p> if (direction==2) </p><p> //從小到大 </p><p> { &
128、#160; </p><p> cout<<queue[i]<<" "; </p><p> count +=queue[i]-headstarts;
129、</p><p> headstarts =queue[i]; </p><p><b> } </b></p><p> } </p><p&
130、gt; count +=queue[n-1]-queue[0]; </p><p> //磁頭走到n-1再反向走... </p><p> headstarts =queue[0]; </p><p> cout<<headstarts<<&q
131、uot; "; </p><p> for(i=1;i<fixi+1;i++) </p><p><b> { </b></p><p> cout<<queue[i]<<"
132、"; </p><p> count +=queue[i]-headstarts; </p><p> headstarts=queue[i]; </p><p><b> } </b><
133、/p><p><b> } </b></p><p><b> } </b></p><p> cout<<endl; </p><p> cout<<"總的尋道長(zhǎng)度為: "<<count<<end
134、l; </p><p> cout<<"平均尋道長(zhǎng)度為: "<<float(count)/n<<endl;</p><p><b> }</b></p><p> void main(){ </p><p> int n, i, disk
135、rode, headstarts; </p><p> //n表示調(diào)度磁盤請(qǐng)求序列queue的長(zhǎng)度,diskrode表示磁盤磁道的個(gè)數(shù),headstarts表示目前正在調(diào)度的磁道; </p><p> cout<<"請(qǐng)輸入磁盤的總磁道數(shù):"<<end
136、l; cin>> diskrode; cout<<"請(qǐng)輸入磁盤調(diào)度請(qǐng)求序列個(gè)數(shù):"<<endl; </p><p> cin>>n; int *queue; queue =(int*)malloc(n*sizeof(int));
137、0; </p><p> //給quneue數(shù)組分配空間... </p><p> int *queue_copy; queue_copy =(int*)malloc(n*sizeof(int)); </p><p> cout<<"請(qǐng)依次輸入該序列的值:"<
138、;<endl; </p><p> for ( i=0;i<n;i++) </p><p> cin>>queue[i]; </p><p> for ( i=0;i<n;i++) </p><p> queue_copy[i] =queue
139、[i]; </p><p> cout<<"請(qǐng)輸入正在調(diào)度的磁道: "; </p><p> cin>>headstarts; int menux; menu(); </p><p> cout<<"請(qǐng)按菜單選擇,輸入相應(yīng)的數(shù)字: &
140、quot;; </p><p> cin>>menux; while (menux !=0) </p><p><b> { </b></p><p> if (menux ==1) </p><p>
141、FCFS(queue,n,diskrode,headstarts); </p><p> if (menux ==2) </p><p> SSTF(queue,n,diskrode,headstarts); </p><p>
142、; if (menux ==3) </p><p> SCAN(queue,n,diskrode,headstarts);</p><p> if (menux ==4) </p><p> CSCAN(queue,n,diskrode,headstarts);</p><
143、;p> if (menux ==5) </p><p> cout<<"程序結(jié)束,謝謝使用!"<<endl;</p><p> cout<<endl; </p><p> init(queue,queue_copy,n); <
144、/p><p><b> menu(); </b></p><p> cout<<"請(qǐng)按菜單選擇,輸入相應(yīng)的數(shù)字: "; </p><p> cin>>menux; cout<<endl; </p>
145、<p><b> }</b></p><p><b> }</b></p><p> 2 Linux代碼分析</p><p> 為了進(jìn)一步了解操作系統(tǒng)內(nèi)核,學(xué)習(xí)了Linux操作系統(tǒng)的段頁(yè)式存儲(chǔ)管理程序虛擬內(nèi)存映射管理部分,部分源代碼如下:</p><p> struct vm_s
146、truct</p><p><b> {</b></p><p> unsigned long flags; </p><p> void *addr; /*虛擬內(nèi)存塊的其始地址 */</p><p> unsigned long size; /*
147、虛擬內(nèi)存塊的長(zhǎng)度*/</p><p> struct vm_struct *next; /*下一個(gè)虛擬內(nèi)存塊*/</p><p><b> }</b></p><p> struct vm_area_struct </p><p><b> {</b></p><
148、;p> struct mm_struct * vm_mm; /*指向該虛存段所屬進(jìn)程的mm_struct */</p><p> unsigned long vm_start; /*虛擬內(nèi)存開始地址 */</p><p> unsigned long vm_end; /*虛擬內(nèi)存結(jié)束地址*/</p><p> struct vm_
149、area_struct vm_next;</p><p> unsigned short vm_flags; /*本vma塊的屬性標(biāo)志位*/</p><p> short vm_avl_height;</p><p> struct vm_area_struct * vm_avl_left;</p><p> struct vm
150、_area_struct * vm_avl_right; /*上述三項(xiàng)用于對(duì)AVL樹操作*/</p><p> struct vm_operations_struct * vm_ops; /*指向?qū)ma塊操作的結(jié)構(gòu)體指針*/</p><p> unsigned long vm_offset;</p><p> struct file * vm_file;
151、/*指向文件的inode結(jié)構(gòu)體或NULL */</p><p> unsigned long vm_pte;</p><p><b> }; </b></p><p> static inline unsigned long do_mmap (struct file *file, unsigned long addr,unsign
152、ed long len, unsigned long prot,unsigned long flag, unsigned long offset)</p><p><b> {</b></p><p> unsigned long ret = -EINVAL;</p><p> if ((offset + PAGE_ALIGN(len)
153、) < offset)</p><p><b> goto out;</b></p><p> if (! (offset & ~PAGE_MASK))</p><p> ret = do_mmap_pgoff (file, addr, len, prot, flaoffset>>PAGE_SHIFT);<
154、;/p><p><b> out:</b></p><p> return ret; </p><p><b> } </b></p><p><b> 功能說(shuō)明</b></p><p> 這一段程序的主要功能為:</p><p
155、> ?。?)進(jìn)程對(duì)內(nèi)存區(qū)域的分配最終多會(huì)歸結(jié)到do_mmap()函數(shù)上來(lái),同樣釋放一個(gè)內(nèi)存區(qū)域使用函數(shù)do_ummap(),它會(huì)銷毀對(duì)應(yīng)的內(nèi)存區(qū)域。(這里do_ummap暫不做說(shuō)明)</p><p> ?。?)Linux使用內(nèi)核函數(shù)do_mmap()完成可執(zhí)行映像等向虛擬區(qū)域的映射,由它建立有關(guān)的虛存區(qū)域,并指定虛存區(qū)域的開始地址、虛存大小以及屬性等。</p><p><b&g
156、t; 接口說(shuō)明</b></p><p> 本程序的輸入?yún)?shù)為:</p><p> file:表示要映射的文件。</p><p> offset:文件內(nèi)的偏移量,因?yàn)槲覀儾⒉皇恰伦尤坑成湟粋€(gè)文件,可能只是映射文件的一部分,offset就表示那部分的起始位置。</p><p> len:要映射的文件部分的長(zhǎng)度。&
157、lt;/p><p> addr:虛擬空間的一個(gè)地址,表示從這個(gè)地址開始查找一個(gè)空閑的虛擬區(qū)。</p><p> prot:指定對(duì)這個(gè)虛擬區(qū)的存取權(quán)限。</p><p><b> 輸出結(jié)果為:</b></p><p> 該段程序返回的應(yīng)為long類型的數(shù)據(jù),為經(jīng)過(guò)do_mmap()映射處理后的虛存區(qū)域的起始地址。否則則
158、返回MAP_FAILED(-1)。</p><p><b> 局部數(shù)據(jù)結(jié)構(gòu)</b></p><p> 本程序共有4個(gè)局部變量及數(shù)據(jù)結(jié)構(gòu),其類型定義及語(yǔ)義如下:</p><p> struct mm_struct</p><p><b> {</b></p><p>
159、 //mm_struct結(jié)構(gòu)包含了用戶進(jìn)程與存儲(chǔ)有關(guān)的信息</p><p> struct vm_area_struct mmap; /*指向虛擬內(nèi)存段雙向鏈表指針 */ </p><p> struct vm_area_struct *mmap_avl; /*指向虛擬內(nèi)存段AVL樹指針 */</p><p> pgd_t *pgd
160、; /*進(jìn)程頁(yè)目錄起始地址 */</p><p> int map_count; /*此進(jìn)程所用虛擬內(nèi)存的塊數(shù) */</p><p> unsigned long start_code,end_code; /*進(jìn)程代碼段起始地址和結(jié)束地址*/</p><p> unsigned long start_data,end_data;
161、/*進(jìn)程數(shù)據(jù)段起始地址和結(jié)束地址*/</p><p> unsigned long start_stack; /*進(jìn)程堆棧段起始地址 */</p><p> unsigned long rss; /*進(jìn)程駐留在物理內(nèi)存的頁(yè)面總數(shù)*/</p><p><b> ……</b></p><p>
162、<b> }</b></p><p> struct vm_struct</p><p><b> {</b></p><p> //為虛擬內(nèi)存結(jié)構(gòu)體</p><p> unsigned long flags; </p><p> void *ad
163、dr; /*虛擬內(nèi)存塊的其始地址 */</p><p> unsigned long size; /*虛擬內(nèi)存塊的長(zhǎng)度*/</p><p> struct vm_struct *next; /*下一個(gè)虛擬內(nèi)存塊*/</p><p><b> }</b></p><
164、;p> struct vm_area_struct </p><p><b> {</b></p><p> //虛擬內(nèi)存塊存儲(chǔ)結(jié)構(gòu)體</p><p> struct mm_struct * vm_mm; /*指向該虛存段所屬進(jìn)程的mm_struct */</p><p> unsigned long
165、 vm_start; /*虛擬內(nèi)存開始地址*/</p><p> unsigned long vm_end; /*虛擬內(nèi)存結(jié)束地址*/</p><p> struct vm_area_struct vm_next;</p><p> unsigned short vm_flags; /*本vma塊的屬性標(biāo)志位*/</p><
166、p> short vm_avl_height;</p><p> struct vm_area_struct * vm_avl_left;</p><p> struct vm_area_struct * vm_avl_right; /*上述三項(xiàng)用于對(duì)AVL樹操作 */</p><p> struct vm_operations_stru
167、ct * vm_ops; /*指向?qū)ma塊操作的結(jié)構(gòu)體指針 */</p><p> unsigned long vm_offset;</p><p> struct file * vm_file; /*指向文件的inode結(jié)構(gòu)體或NULL */</p><p> unsigned long vm_pte;</p><p&g
168、t;<b> }; </b></p><p> typedef struct page</p><p><b> {</b></p><p><b> //頁(yè)存儲(chǔ)結(jié)構(gòu)</b></p><p> struct list_head list; /*該頁(yè)根據(jù)不同用
169、途掛到不同鏈表中 */</p><p> struct page *next, *prev; /*前一個(gè)和下一個(gè)頁(yè) */</p><p> unsigned long index; /*頁(yè)存放代碼或數(shù)據(jù)所屬文件的位移 */ </p><p> struct inode *inode; /*該頁(yè)所屬文件的位移
170、 */ </p><p> atomic count; /*使用該頁(yè)的進(jìn)程數(shù),0表示空閑 */ </p><p> unsigned long age; /*頁(yè)年齡 */ </p><p><b> ……</b></p><p
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)---磁盤調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)--磁盤調(diào)度算法實(shí)踐
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--磁盤調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--磁盤調(diào)度算法
- 操作系統(tǒng)磁盤調(diào)度算法課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--磁盤調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--磁盤調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)---磁盤調(diào)度報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)-磁盤調(diào)度模擬法
- n-step-scan_磁盤調(diào)度_操作系統(tǒng)課程設(shè)計(jì)
- 進(jìn)程調(diào)度算法 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---磁盤文件操作
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度算法
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度算法
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計(jì) (2)
- 操作系統(tǒng)課程設(shè)計(jì)——進(jìn)程調(diào)度模擬算法
- 磁盤調(diào)度算法課程設(shè)計(jì)--模擬磁盤調(diào)度算法系統(tǒng)的設(shè)計(jì)
- 操作系統(tǒng)_進(jìn)程調(diào)度算法課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論