第一篇:操作系統課程設計++模擬磁盤文件管理的程序[精選]
中南林業科技大學
操作系統課程設計
課程題目:模擬磁盤文件管理的程序
姓名: 學號:
專業: 計算機科學與技術 年級:
2006
計算機科學學院
2008年11月 模擬磁盤文件管理的程序
一、課程設計內容
⑴ 自定義磁盤文件管理的數據結構; ⑵ 能夠自由創建、修改、刪除文件; ⑶ 文件具有一定自定義的屬性; ⑷ 能夠顯示當前系統文件的狀態。
二、課程設計的數據結構說明
程序中定義了兩個類: class file//文件類 {private: char name[10];//文件名 public: int tag;//刪除標記 1:已刪 0:未刪 file(){ } char *getname(){return name;} //獲取文件名
int gettag(){return tag;} //獲取刪除標記
int getlength(){return length;} //獲取文件大小
int getblocknum(){return blocknum;} // 磁盤塊數
int getblocksum1(){return blocksum1;} //磁盤塊號的始點 int getblocksum2(){return blocksum2;} //磁盤塊號的終點 int length,blocknum,blocksum1,blocksum2;
void setname(char na[ ]){strcpy(name,na);} //設置文件名 void delwenjian(){ tag=1;}//設置刪除標記 1:已刪 0:未刪
void creatfile(char *na,int L,int num,int s1,int s2)//創建文件 void deltefile(char *na){tag=1;strcpy(name,na);} //刪除文件 void disp()//輸出文件信息 class fdatabase //文件庫類 { private: int top;//文件記錄指針 file f[50];public: fdatabase(){top=-1;} //構造函數 int search(char *fname)//按文件名查找
int creatfile(char *na,int L,int num,int s1,int s2)//創建文件時先查找是否存在
int deltefile(char *na)//刪除文件時先查找是否存在 void disp()//輸出所有文件信息 };
三、課程設計的模板說明
1、初始化,建立文件系統
輸入磁盤大小(G),每個盤塊大?。∕),自動建立位示圖,位示圖字長定為32位
輸出位示圖的行數,以及行號、列號與磁盤塊號的轉換公式(都從0開始編號)。
2、循環選擇執行以下功能
1、存儲文件
輸入建立的文件名和文件大小,如果該文件名已經存在,則輸出不能建立的信息否則計算所需的磁盤塊數
為其分配足夠多的磁盤塊,并記錄下來 輸出所占用的磁盤塊號
2、刪除文件
輸入要刪除的文件名,如果該文件名不存在,則輸出刪除錯誤信息,否則收回該文件所占用的磁盤塊 刪除該文件名
3、顯示位示圖情況
顯示位示圖的情況 顯示剩余磁盤塊的數目
4、顯示文件列表
顯示文件名,文件大小,占用的磁盤塊數目和磁盤塊號
四、課程設計的源代碼
#include
char name[10];//文件名 public: int tag;//刪除標記 1:已刪 0:未刪 file(){ } char *getname(){return name;} //獲取姓名
int gettag(){return tag;} //獲取刪除標記
int getno(){return no;} //獲取文件編號
int getlength(){return length;} //獲取文件大小
int getblocknum(){return blocknum;} // 磁盤塊數 int getblocksum1()//磁盤塊號的始點 { return blocksum1;} int getblocksum2()//磁盤塊號的終點 { return blocksum2;} int length;//文件大小
int blocknum;//盤塊數
int blocksum1;//所占盤塊號的始點
int blocksum2;//所占盤塊號的終點
void setname(char na[ ])//設置文件名
{strcpy(name,na);} void delwenjian(){ tag=1;}//設置刪除標記 1:已刪 0:未刪
void creatfile(char *na,int L,int num,int s1,int s2)//創建文件 { tag=0;length=L;blocknum=num;blocksum1=s1;blocksum2=s2;strcpy(name,na);blocknum=length/m;//盤塊數=文件大小/盤塊大小 if(length%m!=0)//盤塊數取上整 blocknum=blocknum+1;cout<<“ 所需磁盤塊數:”< for(;j<32;j++) a[i][j]=1;i=i+1;for(j=0;j<(sum+blocknum)-32;j++)//再進行剩余項賦值 { a[i][j]=1;} sum=sum+blocknum-32;} tt=tt+blocknum;//輸出文件所占用的盤塊號 cout<<“ 所占磁盤塊號:”< { for(ii=0;ii<=top;ii++) { if(strcmp(f[ii].getname(),fname)==0 && f[ii].tag==0) return 0; } return 1;} int creatfile(char *na,int L,int num,int s1,int s2)//創建文件時先查找是否存在 { int p;p=search(na); if(p==1) { top++; f[top].creatfile(na,L,num,s1,s2); return 1;} else {cout<<“!!該文件已存在,不能創建!!nn”; return 0;} } int deltefile(char *na)//刪除文件時先查找是否存在{int b,p,x=0,n1,n2,q1,q2,t;p=search(na);if(p==0)//若文件存在 { //進行刪除文件賦值 f[ii].tag=1;b=f[ii].length/m;//盤塊數=當前文件大小/盤塊大小 if(ii==0)// 對第一個刪除文件進行賦值 for(k=0;k a[x][k]=0; else{ n1=(f[ii-1].blocksum2+1)/32;//被查找的文件之前文件所占用的盤塊數 /32,//大于0表示跨行 n2=(f[ii].blocksum2+1)/32;//所有文件所占用的盤塊數/32,大于0表示跨行 q1=(f[ii-1].blocksum2+1)-n1*32;// 當前文件的開始盤塊號 q2=(f[ii].blocksum2+1)-n2*32;// 用于跨行后計算盤塊號 t=n2-n1;if(t==0)//若n2與n1相等,表明當前所有被占用盤塊在同一行 for(k=q1;k<1+b;k++) a[n2][k]=0; else { if((f[ii-1].blocksum2+1)%32==0)//前面所占用的盤塊數是32倍數 { x=x+n1;//當前文件賦值 for(;t-1>=0;t--,x++)//循環進行整行賦值 for(k=0;k<32;k++) a[x][k]=0; x=n2;//對剩余項賦值 for(k=0;k a[x][k]=0; } else //對當前文件前幾項賦值 { x=n1; for(k=q1;k<32;k++) a[x][k]=0;x=x+1;int t1=t; for(;t-1>0;t--,x++)//中間整行賦值 for(k=0;k<32;k++) a[x][k]=0; x=n2;//最后剩余項賦值 for(k=0;k<(f[ii].blocksum2+1)-t1*32;k++) a[x][k]=0; } } return 1;} } else {cout<<“該文件不存在”; return 0;} } void disp()//輸出所有文件信息 { for(int i=0;i<=top;i++) if(f[i].tag==0) f[i].disp();} };void bit_map(int I){ int s=0;cout<<“-”< cout< out<<“--”< a[i][j]=0; cout<<“ 建立的位示圖為:”< cout<<“ 行數:”< cout <<“ttt1 存 儲 文 件nnttt2 刪 除 文 件 nnttt3 顯示位示圖情況 nnttt4 顯示文件列表”< case '1': cout <<“ 請輸入文件名: ”; cin>>fname; cout< if(q==0) { cout<<“!!該文件已存在,不能創建!!nn”; break;} cout <<“ 請輸入文件大小MB: ”; cin>>l; cout< if(l>g*1024) {cout<<“!!文件大小超過磁盤最大容量,無法進行分配!!”< break;} p.creatfile(fname,l,b,ss1,ss2); break; case '2': cout <<“ 請輸入文件名: ”; cin>>fname; cout< q=p.search(fname); if(!q==0) { cout<<“!!該文件不存在,無法刪除!!nn ”; break; } p.deltefile(fname); break;case '3': cout <<“tt**************顯示位示圖如下*********************n”; bit_map(I); cout< break; case '4': cout <<“tt*************文件列表如下************************n”;cout<<“-”< p.disp(); cout< break;default: cout<<“輸入錯誤,請從新輸入: nn”; break;} } } 五、課程設計程序運行結果 1、初始化,建立文件系統 (1)用戶根據提示輸入磁盤大?。℅B)與每個盤塊大?。∕B); (2)程序首先根據用戶輸入的磁盤大小(GB)與每個盤塊大?。∕B),自動建立位示圖,即初始化位示圖,位示圖每一行長度固定為32位(即列固定為32);位示圖中每一位表示一個盤塊,取值0和1分別表示空閑和占用。初始化的位示圖應全為0; (3)程序再輸出位示圖的剩余盤塊數,行數,以及行號、列號與磁盤塊號的轉換公式(行列皆從0開始編號); 這樣,初始化,建立文件系統完成。運行結果: 2、選擇執行:存儲文件,刪除文件,顯示位示圖情況,顯示文件列表 【顯示文件管理系統列表】顯示文件系統管理列表,并提示輸入信息1——4。用戶輸入文件操作命令1(存儲文件),2(刪除文件)、3(顯示位示圖情況)、4(顯示文件列表); 格式如下:鍵入1,創建文件名為fname,大小為L(MB)的文件; 鍵入2,刪除文件名為fname的文件; 鍵入3,顯示位示圖情況; 鍵入4,顯示所有文件信息。 運行結果: 【存儲文件】 用戶輸入文件操作命令是1(存儲文件)。系統提示你輸入你要建立的文件名和文件大小,如果該文件名已經存在,則系統提示輸出不能建立此文件的信息,否則計算所需的磁盤塊數和所占用的磁盤塊號,并輸出結果。相應的在位示圖上,因為位示圖是矩陣,可以用數組存儲,根據所占用的磁盤塊號和公式: 磁盤塊號=行號*32+列號 行號=磁盤塊號/32 列號=磁盤塊號%32 計算出文件占用的磁盤塊在位示圖上的位置,現在是創建文件,所以將位示圖該位置上的二進制數置1,表示已分配出去。 分別創建名為ll,zz和mm三個文件,文件大小分別為224MB,320MB和56MB。 此時對應的位示圖如下: 文件列表如下: 若再創建一個已經創建過的文件,則顯示如下信息: 若創建的文件大小超過磁盤的最大容量,則顯示如下信息: 【刪除文件】 用戶輸入文件操作命令是2(刪除文件)。系統提示你輸入要刪除的文件名,如果該文件名不存在,則輸出刪除出錯信息。在位示圖上,根據所占用的磁盤塊號和公式: 磁盤塊號=行號*32+列號 行號=磁盤塊號/32 列號=磁盤塊號%32 計算出文件占用的磁盤塊在位示圖上的位置,現在是刪除文件,所以將位示圖該位置上的二進制數置0,表示收回該文件所占用的磁盤塊。刪除第二個文件zz,結果如下: 則相應的位示圖和文件列表變為: 若刪除一個不存在的文件,則顯示如下信息: 【顯示位示圖情況】 如果用戶輸入文件操作命令是我wst()(顯示位示圖情況),系統輸出此時位示圖的情況,狀態位為'0'表示對應盤塊空閑,狀態位為'1'表示該盤塊已被分配出去。系統再顯示剩余磁盤塊的數目。 以下是刪除zz文件,創建xx后和創建xx后,刪除ll的位示圖: 【顯示文件列表】 如果用戶輸入文件操作命令是disp()(顯示所有文件情況),系統會顯示所有文件的文件名,文件大小,占用的盤塊數和盤塊號。 以下是刪除zz文件,創建xx后和創建xx后,刪除ll顯示的文件列表: 1.實驗題目: 磁盤調度算法。 建立相應的數據結構; 在屏幕上顯示磁盤請求的服務狀況; 將一批磁盤請求的情況存磁盤文件,以后可以讀出并重放; 計算磁頭移動的總距離及平均移動距離; 支持算法:FIFO、SSTF、SCAN、CSCAN; 2.設計目的: 調度磁盤I/O請求服務,采用好的方式能提高訪問時間和帶寬。本實驗通過編程對磁盤調度算法的實現,加深對算法的理解,同時通過用C++語言編寫程序實現這些算法,并在windos平臺上實現,更好的掌握操作系統的原理以及實現方法,提高綜合運用專業課知識的能力。 3.任務及要求 3.1 設計任務 編程實現下述磁盤調度算法,并求出每種算法的平均尋道長度: 1、先來先服務算法(FCFS) 2、最短尋道時間算法(SSTF) 3、掃描算法(SCAN) 4、循環掃描算法(CSCAN) 3.2 設計要求 對用戶指定的磁盤調度請求序列,基于以上四種算法,實現各自的調度順序并輸出,同時計算出各種算法下的平均尋道長度。 4.算法及數據結構 4.1算法的總體思想 queue[n] 為請求調度序列,diskrode為磁盤磁道數,headstarts為正在調度的磁道 ①先來先服務算法(FCFS)按queue[n]數組的順序進行磁盤調度,將前一個調度磁道與下一個調度磁道的差值累加起來,得到總的尋道長度,再除以n得到平均尋道長度。 ②最短尋道時間優先算法(SSTF)將queue[n]進行由小到大的排序,首先定位當前調度磁headstarts在queue[n]的位置,通過循環語句找出離起始磁頭最短的位置。 ③掃描算法(SCAN) 將queue[n]進行由小到大的排序,首先定位當前調度磁headstarts在queue[n]的位置,然后在此位置按給定的方向遍歷queue[n],當道端點(queue[0]或queue[n-1])時,再在定位處反向遍歷到另一端。當調度磁道不在queue端點時,總的尋道長度為為前一個磁道與后一個磁 道差值的累加,當到達端點且queue[n]未全調度時,總尋道長度加上端點值再加上下一個調度磁道的值,再按前面的算法進行,直到磁道全部都調度完畢,得到總的尋道長度,除以n得到平均尋道長度。 ④循環掃描算法(CSCAN)將queue[n]進行由小到大的排序,首先定位當前調度磁headstarts在queue[n]的位置,然后在此位置按給定的方向遍歷queue[n],當道端點(queue[0]或queue[n-1])時,反向到另一端點再以此方向進行遍歷,直到queue[n]中所有都調度完。當調度磁道不在queue端點時,總的尋道長度為為前一個磁道與后一個磁道差值的累加,當到達端點且queue[n]未全調度時,總尋道長度加上端點值再加上磁盤磁道總長度,再加上下一個調度磁道的值,再按前面的算法進行,直到磁道全部都調度完畢,得到總的尋道長度,除以n得到平均尋道長度。 5、源代碼: #include 1、先來先服務算法(FCFS)**********”< cout<<“****** 2、最短尋道時間優先算法(SSTF)**********”< cout<<“****** 3、掃描算法(SCAN)**********”< cout<<“****** 4、循環掃描算法(CSCAN)**********”< cout<<“****** 5、退出 **********”< /*======================初始化序列=======================*/ void init(int queue[],int queue_copy[],int n){ int i;for(i=0;i //對當前正在執行的磁道號進行定位,返回磁道號小于當前磁道中最大的一個 int fix(int queue[], int n, int headstarts){ int i =0;while(i /* ====================以下是FCFS算法==================*/ void FCFS(int queue[],int n,int diskrode,int headstarts)//queue是請求調度序列,n為其個數,diskroad為磁盤磁道數,headstarts為正在調度的磁道 { cout<<“************以下為FCFS調度算法***********”< /*=====================SSTF算法====================*/ void SSTF(int queue[], int n, int diskrode, int headstarts){ int k=1;int l,r;int i,j,count=0;queue =bubble(queue,n);cout<<“************以下為SSTF調度算法***********”< -headstarts)){ cout< /*======================以下是SCAN算法====================*/ void SCAN(int queue[], int n, int diskrode, int headstarts){ int direction, i, fixi;cout<<“***********以下是SCAN調度算法*************”< /*======================以下是CSCAN算法====================*/ void CSCAN(int queue[],int n,int diskrode,int headstarts){ int direction,i,fixi;cout<<“***********以下是CSCAN調度算法*************”< void main(){ int n, i, diskrode, headstarts;//n表示調度磁盤請求序列queue的長度,diskrode表示磁盤磁道的個數,headstarts表示目前正在調度的磁道; cout<<“請輸入磁盤的總磁道數:”< if(menux ==2)SSTF(queue,n,diskrode,headstarts); if(menux ==3)SCAN(queue,n,diskrode,headstarts);if(menux ==4)CSCAN(queue,n,diskrode,headstarts);if(menux ==5)cout<<“程序結束,謝謝使用!”< 沈陽理工大學課程設計專用紙 Noi 目 錄 1 課程設計目的及要求……………………………………………………錯誤!未定義書簽。2 相關知識…………………………………………………………………錯誤!未定義書簽。3 題目分析…………………………………………………………………2 4 概要設計…………………………………………………………………2 4.1 先來先服務(FCFS)的設計思想……………………………….2 4.2 最短尋道時間優先調度(SSTF)的設計思想…………………..2 4.3 掃描算法(SCAN)的設計思想…………………………………2 4.4 循環掃描(CSCAN)的設計思想………………………………..2 5 代碼及流程………………………………………………………………3 5.1 流程圖……………………………………………………………...3 5.2 源代碼……………………………………………………………...8 6 運行結果…………………………………………………………………16 7 設計心得…………………………………………………………………19 參考文獻…………………………………………………………………………19 沈陽理工大學 沈陽理工大學課程設計專用紙 No1 1 課程設計目的及要求 設計目的:加深對操作系統原理的進一步認識,加強實踐動手能力和程序開發能力的培養,提高分析問題解決問題的能力,培養合作精神,以鞏固和加深磁盤調度的概念。操作系統是一門工程性很強的課程,它不僅要求學生掌握操作系統的工作原理和理論知識,也要求學生的實際動手能力,以加深對所學習內容的理解,使學生熟練地掌握計算機的操作方法,使用各種軟件工具,加強對課程內容的理解。這次課程設計,就是通過模擬磁臂調度來加深對操作系統中磁臂調度概念的理解。使學生熟悉磁盤管理系統的設計方法;加深對所學各種磁盤調度算法的了解及其算法的特點。 設計要求:編程序實現下述磁盤調度算法,并求出每種算法的平均尋道長度;要求設計主界面可以靈活選擇某算法,且以下算法都要實現 1、先來先服務算法(FCFS) 2、最短尋道時間優先算法(SSTF) 3、掃描算法(SCAN) 4、循環掃描算法(CSCAN)相關知識 數據結構:數組 now:當前磁道號; array[]:放置磁道號的數組; void FCFS(int array[],int m)先來先服務算法(FCFS)void SSTF(int array[],int m)最短尋道時間優先算法(SSTF)void SCAN(int array[],int m)掃描算法(SCAN)void CSCAN(int array[],int m)循環掃描算法(CSCAN)磁盤調度:當有多個進程都請求訪問磁盤時,采用一種適當的驅動調度算法,使各進程對磁盤的平均訪問(主要是尋道)時間最小。目前常用的磁盤調度算法有:1)閑來先服務2)最短尋道時間優先3)掃描算法4)循環掃描算法等 沈陽理工大學 沈陽理工大學課程設計專用紙 No2 3 題目分析 選擇一個自己熟悉的計算機系統和程序設計語言模擬操作系統基本功能的設計方法及其實現過程 完成各分項功能。在算法的實現過程中,要求可決定變量應是動態可變的;同時模塊應該有一個合理的輸出結果。具體可參照實驗的程序模擬.各功能程序要求自行編寫程序實現,不得調用現有操作系統提供的模塊或功能函數。磁盤調度程序模擬。先來先服務調度算法.最短尋道時間優先調度,循環(SCAN)調度算法。程序設計語言自選,最終以軟件(含源代碼以及執行程序)和設計報告的形式提交課程設計結果.。磁盤調度讓有限的資源發揮更大的作用。在多道程序設計的計算機系統中,各個進程可能會不斷提出不同的對磁盤進行讀/寫操作的請求。由于有時候這些進程的發送請求的速度比磁盤響應的還要快,因此我們有必要為每個磁盤設備建立一個等待隊列。概要設計 1.先來先服務(FCFS)的設計思想 即先來的請求先被響應。FCFS策略看起來似乎是相當“公平”的,但是當請求的頻率過高的時候FCFS策略的響應時間就會大大延長。FCFS策略為我們建立起一個隨機訪問機制的模型,但是假如用這個策略反復響應從里到外的請求,那么將會消耗大量的時間。為了盡量降低尋道時間,看來我們需要對等待著的請求進行適當的排序,而不是簡單的使用FCFS策略。這個過程就叫做磁盤調度管理。有時候fcfs也被看作是最簡單的磁盤調度算法。 2.最短尋道時間優先調度(SSTF)的設計思想 最短時間優先算法選擇這樣的進程。要求訪問的磁道,與當前磁頭所在的磁道距離最近,以使每次的尋道時間最短。 3.掃描算法(SCAN)的設計思想 掃描(SCAN)調度算法:該算法不僅考慮到欲訪問 的磁道與當前磁道間的距離,更優先考慮的是磁頭當前的移動方向。例如,當磁頭正在自里向外移動時,SCAN算法所考慮的下一個訪問對象,應是其欲訪問的磁道,既在當前磁道之外,又是距離最近的。這樣自里向外的訪問,直至再無更外的磁道需要訪問時,才將磁道換向自外向里移動。這時,同樣也是每次選擇這樣的進程來調度,也就是要訪問的當前位置內距離最近者,這樣,磁頭又逐步地從外向里移動,直至再無更里面的磁道要訪問,從而避免了出現“饑餓”現像。 4.循環掃描(CSACN)的設計思想 循環掃描(CSCAN)算法:當磁頭剛從里向外移動而越過了某一磁道時,恰好又有一進程請求訪問此磁道,這時,該里程就必須等待,為了減少這種延遲,CSCAN算法規定磁頭單向移動,而本實驗過程中我們所設計的是磁頭從里向外移動,而從外向里移動時只須改方向而已,本實驗未實現。但本實驗已完全能演示循環掃描的全過程。 沈陽理工大學 沈陽理工大學課程設計專用紙 No3 5 代碼及流程 1.先來先服務(FCFS) 圖 1—1 FCFS的流程圖 沈陽理工大學 沈陽理工大學課程設計專用紙 No4 2.最短尋道時間優先調度(SSTF) 圖1—2 SSTF的流程圖 沈陽理工大學 沈陽理工大學課程設計專用紙 No5 3.掃描算法(SCAN) 圖1—3 SCAN的流程圖 沈陽理工大學 沈陽理工大學課程設計專用紙 No6 4.循環掃描(CSCAN) 圖1—4 CSCAN的流程圖 沈陽理工大學 沈陽理工大學課程設計專用紙 No7 圖1—5 主函數的流程圖 沈陽理工大學 沈陽理工大學課程設計專用紙 No8 源代碼: #include“stdio.h” #include“stdlib.h” //#include“iostream.h” #define maxsize 100 //定義最大數組域 //先來先服務調度算法 void FCFS(int array[],int m){ int sum=0,j,i;int avg;printf(“n FCFS調度結果: ”);for(i=0;i } avg=sum/(m-1);//計算平均尋道長度 printf(“n 移動的總道數: %d n”,sum);printf(“平均尋道長度: %d n”,avg);} //最短尋道時間優先調度算法 void SSTF(int array[],int m){ int temp;int k=1;int now,l,r;int i,j,sum=0;int avg;for(i=0;i 沈陽理工大學 沈陽理工大學課程設計專用紙 No9 array[i]=array[j];array[j]=temp;} } } for(i=0;i for(i=m-1;i>=0;i--)//將數組磁道號從大到小輸出 printf(“%d ”,array[i]);sum=now-array[0];//計算移動距離 } else if(array[0]>=now)//判斷整個數組里的數是否都大于當前磁道號 { for(i=0;i printf(“%d ”,array[l]);sum+=now-array[l];//計算移動距離 now=array[l];l=l-1;} else 沈陽理工大學 沈陽理工大學課程設計專用紙 No10 { printf(“%d ”,array[r]);sum+=array[r]-now;//計算移動距離 now=array[r];r=r+1;} } if(l=-1){ for(j=r;j printf(“%d ”,array[j]);} sum+=array[m-1]-array[0];//計算移動距離 } else { for(j=l;j>=0;j--){ printf(“%d ”,array[j]);} sum+=array[m-1]-array[0];//計算移動距離 } } avg=sum/m;printf(“n 移動的總道數: %d n”,sum);printf(“平均尋道長度: %d n”,avg);} //掃描算法 void SCAN(int array[],int m)//先要給出當前磁道號和移動臂的移動方向 { int temp;int k=1;int now,l,r,d;int i,j,sum=0;int avg;for(i=0;i 沈陽理工大學 沈陽理工大學課程設計專用紙 No11 { temp=array[i];array[i]=array[j];array[j]=temp;} } } for(i=0;i printf(“n SCAN調度結果: ”);for(i=m-1;i>=0;i--){ printf(“%d ”,array[i]);//將數組磁道號從大到小輸出 } sum=now-array[0];//計算移動距離 } else if(array[0]>=now)//判斷整個數組里的數是否都大于當前磁道號 { printf(“n SCAN調度結果: ”);for(i=0;i 沈陽理工大學 沈陽理工大學課程設計專用紙 No12 { for(j=l;j>=0;j--){ printf(“%d ”,array[j]);} for(j=r;j //循環掃描算法 void CSCAN(int array[],int m){ int temp;int k=1;int now,l,r,d;int i,j,sum=0;int avg;for(i=0;i 沈陽理工大學 沈陽理工大學課程設計專用紙 No13 { temp=array[i];array[i]=array[j];array[j]=temp;} } } for(i=0;i printf(“n CSCAN調度結果: ”);for(i=0;i printf(“%d ”,array[i]);//將磁道號從小到大輸出 } sum=now-array[0]+array[m-1];//計算移動距離 } else if(array[0]>=now)//判斷整個數組里的數是否都大于當前磁道號 { printf(“n CSCAN調度結果: ”);for(i=0;i printf(“%d ”,array[i]);//將磁道號從小到大輸出 } sum=array[m-1]-now;//計算移動距離 } else { while(array[k] 沈陽理工大學 沈陽理工大學課程設計專用紙 No14 { for(j=l;j>=0;j--){ printf(“%d ”,array[j]);} for(j=m-1;j>=r;j--){ printf(“%d ”,array[j]);} sum=2*(array[m-1]-array[0])-array[r]+now;//計算移動距離 }//磁道號減小方向 else { for(j=r;j // 操作界面 int main(){ int c;FILE *fp;//定義指針文件 int cidao[maxsize];//定義磁道號數組 int i=0,count;fp=fopen(“cidao.txt”,“r+”);//讀取cidao.txt文件 if(fp==NULL)//判斷文件是否存在 { printf(“n 請 先 設 置 磁 道!n”);exit(0);} while(!feof(fp))//如果磁道文件存在 沈陽理工大學 沈陽理工大學課程設計專用紙 No15 { fscanf(fp,“%d”,&cidao[i]);//調入磁道號 i++;} count=i-1;printf(“n-------------------n”);printf(“ 10-11OS課程設計--磁盤調度算法系統n”);printf(“ 計算機科學與技術二班n”);printf(“ 姓名:宋思揚n”);printf(“ 學號:0803050203n”);printf(“ 電話:************n”);printf(“ 2010年12月29日n”);printf(“n-------------------n”);printf(“n 磁道讀取結果:n”);for(i=0;i 1、先來先服務算法(FCFS)n”);printf(“ 2、最短尋道時間優先算法(SSTF)n”);printf(“ 3、掃描算法(SCAN)n”);printf(“ 4、循環掃描算法(CSCAN)n”);printf(“ 5.退出n”);printf(“n”);printf(“請選擇:”);scanf(“%d”,&c);if(c>5)break;switch(c)//算法選擇 { case 1: FCFS(cidao,count);//先來先服務算法 printf(“n”);break;case 2: SSTF(cidao,count);//最短尋道時間優先算法 printf(“n”);break;case 3: 沈陽理工大學 沈陽理工大學課程設計專用紙 No16 SCAN(cidao,count);//掃描算法 printf(“n”);break;case 4: CSCAN(cidao,count);//循環掃描算法 printf(“n”);break;case 5: exit(0);} } return 0;} 6 運行結果 圖2—1 運行界面 沈陽理工大學 沈陽理工大學課程設計專用紙 No17 圖2—2 運行FCFS的界面 圖2—3 運行SSTF的界面 圖2—4 運行SCAN的界面 沈陽理工大學 沈陽理工大學課程設計專用紙 No18 圖2—5 運行SCAN的界面 圖2—6 運行CSCAN的界面 圖2—7 運行CSCAN的界面 沈陽理工大學 沈陽理工大學課程設計專用紙 No19 運行結果: 四種磁盤調度運行結果正確,與預期的相符。設計心得 此次操作系統的課程設計,從理論到實踐,在兩個星期的日子里,可以說是苦多于甜,但是可以學到很多很多的的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。 本次實驗首先要了解磁盤調度的工作原理及四種調度方法的工作原理。在課程設計前的準備工作時,先把這部分工作做完了。在設計總的程序框架的時候,要注意各功能模塊的位置,盡量做到簡潔、有序;各功能模塊與主程序要正確銜接。 在設計的過程中遇到許多問題,我設計的是四種調度算法中的后兩種。例如:在最初程序設計時主要有兩種構思:1)選用數據結構是鏈表的。2)選用數組。我最初嘗試了用鏈表,覺得方便易懂,但是在循環掃描處出現了些問題,后來又轉變了設計思路,選用了數組,直接進行排序,然后再聯系到各功能模塊。 同時在設計的過程中發現了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固,自身知識的很多漏洞,看到了自己的實踐經驗還是比較缺乏,理論聯系實際的能力還急需提高。比如說編語言掌握得不好,應用程序編寫不太會……通過這次課程設計之后,一定把以前所學過的知識重新溫故。在此,也感謝在課程設計過程中幫我解惑的老師和同學。參考文獻 [1] 《操作系統》 人民郵電出版社 宗大華 宗濤 陳吉人 編著 [2] 《C語言程序設計》 清華大學出版社 馬秀麗 劉志嫵 李筠 編著 [3] 《操作系統實驗指導書》 沈陽理工大學 唐巍 菀勛 編著 沈陽理工大學 大學 操作系統課程綜合實踐 題目: 磁盤文件操作 班級: 姓名: 學號: 指導教師: 2011年 12 月 23日 磁盤文件操作 摘要: 為了正確地實現文件的存取,文件系統設計了一組與存取文件有關的功能模塊,用戶可以用“訪問指令”調用這些功能模塊,以實現文件的存取要求。我們把文件系統設計的這一組功能模塊稱為“文件操作“,實驗就是要模擬實現一些文件操作。文件操作不是獨立的,它和文件系統的其他部分密切相關,若要實現文件操作就離不開文件的目錄結構、文件的組織結構和磁盤空間的管理。因此,這個實習雖然是文件操作的模擬實現,但還是必須模擬一部分文件的組織結構、目錄結構和磁盤空間管理的實現。 關鍵字:磁盤、文件、目錄、分配表。 一、實驗內容: 設計一個簡單的文件系統,用文件模擬磁盤,用數組模擬緩沖區,要求實現; 1. 2. 3. 4. 支持多級目錄結構,支持文件的絕對路徑; 文件的邏輯結構采用流式結構,物理結構采用鏈接結構中的顯示鏈接方式; 采用文件分配表; 實現的命令包括建立目錄、列目錄、刪除空目錄、建立文件、刪除文件、顯示文件內容、打開文件、讀文件、寫文件(追加方式)、關閉文件、改變文件屬性。 最后編寫主函數對所做工作進行測試。 二、實驗目的:1、2、3、4、文件的操作。 文件的邏輯結構和物理結構 磁盤空間的管理 磁盤目錄結構 三、實驗環境: Windows XP、VC++ 四、程序運行結果(詳圖): 程序運行的主界面:用戶運行命令7-建立目錄 用戶運行命令1-建立文件: 顯示目錄內容: 打開文件: 寫文件: 關閉文件: 再次顯示目錄內容: 以上為程序的運行的部分截圖。 五、程序清單: #define false 0 #define true 1 #include “stdio.h” //#include char name[3];/*文件或目錄名*/ char type[2];/*文件類型名*/ char attribute;/*屬性*/ char address;/*文件或目錄的起始盤塊號*/ char length;/*文件長度,以盤塊為單位*/ }content;/*目錄結構*/ #define n 5 /*模擬實驗中系統允許打開文件的最大數量*/ typedef struct { int dnum;/*磁盤盤塊號*/ int bnum;/*盤塊內第幾項*/ }pointer;/*已打開文件表中讀寫指針的結構*/ typedef struct { char name[20];/*文件絕對路徑名*/ char attribute;/*文件的屬性,用1個字節表示,所以用了char類型*/ int number;/*文件起始盤塊號*/ int length;/*文件長度,文件占用的字節數*/ int flag;/*操作類型,用“0”表示以讀操作方式開文件,用“1”表示寫操作pointer read;/*讀文件的位置,文件剛打開時dnum為文件起始盤塊號,bnumpointer write;/*寫文件的位置,文件建立時dnum為文件起始盤塊號,bnum方式打開文件*/ 為“0”*/ 為“0”,打開時為文件末尾*/ }OFILE;/*已打開文件表項類型定義*/ struct { char buffer1[64];/*模擬緩沖1*/ content buffer2[8];/*模擬緩沖2*/ FILE *fc;/*模擬磁盤的文件指針*/ void copen(OFILE *x1,OFILE *x2)//OFILE *x1,*x2;{ } strcpy(x1->name,x2->name);x1->attribute=x2->attribute;x1->number=x2->number;x1->length=x2->length;x1->flag=x2->flag;x1->read.dnum=x2->read.dnum;x1->read.bnum=x2->read.bnum;x1->write.dnum=x2->write.dnum;x1->write.bnum=x2->write.bnum;OFILE file[n];/*已打開文件表*/ int length;/*已打開文件表中登記的文件數量*/ }openfile;/*已打開文件表定義*/ int sopen(char *name)/*在已打 開 文 件 表 中 查 找 文 件//P172 //char *name;{ void dopen(char *name)/*在已打開文件表中刪除文件name*/ //char *name;{ int iopen(content *x)/*在已打開文件表中插入文件name*/ //content *x;{ int i;i=sopen(name);if(i==-1){ } copen(&openfile.file[i],&openfile.file[openfile.length-1]);openfile.length--;printf(“文件未打開n”);else int i;i=0;while(i name*/ 依次查找已打開文件表*/ if(i>=openfile.length)return(i);}/*查找sopen函數結束*/ }/*刪除函數結束*/ int i;i=sopen(x->name);if(i!=-1){ } else if(openfile.length==n){ } else { } //copen(&openfile.file[openfile.length],x);openfile.length++;return(true);printf(“已打開文件表已滿n”);return(false);printf(“文件已經打開n”);return(false);}/*填寫已打開文件表函數結束*/ int allocate()/*分配一個磁盤塊,返回塊號*/ { */ //P173 int i;fseek(fc,0,SEEK_SET);/*將模擬磁盤的文件指針移至模擬磁盤FAT表*/ fread(buffer1,64L,1,fc);/*將FAT表中第一個磁盤塊讀入模擬緩沖for(i=3;i<63;i++)if(buffer1[i]==0){ /*FAT中的第i項為0,分配第i塊磁盤塊,修改FAT表,并且寫回磁盤buffer1中*/ buffer1[i]=255; } fseek(fc,0,SEEK_SET);fwrite(buffer1,64L,1,fc);return(i);/*返回磁盤號*/ fread(buffer1,64L,1,fc);/*將FAT表中第二個磁盤塊讀入模擬緩沖for(i=0;i<63;i++) if(buffer1[i]==0){/*FAT中的第i項為0,分配第i+64塊磁盤塊,修改FAT表,并且寫 } printf(“已經沒有磁盤空間n”);return(false);buffer1[i]=255;fseek(fc,-64L,SEEK_CUR);fwrite(buffer1,64L,1,fc);return(i+64);/*返回磁盤號*/ buffer1中*/ 回磁盤*/ }/*分配磁盤塊函數結束*/ int read_file(char *name,int length)/*讀文件函數,文件路徑名name,讀取長度length*/ //char *name;//int length;{ int i,t;//char ch;if((i=sopen(name))==-1){ } if(openfile.file[i].flag==1){ printf(“文件以寫方式打開,不能讀n”);printf(“文件沒有打開或不存在n”);return(false); } return 0;t=0;fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);fread(buffer1,64,1,fc);while(t openfile.file[i].read.dnum=buffer1[openfile.file[i].read.dnum%64] } } t++;openfile.file[i].read.bnum=0;fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);fread(buffer1,64,1,fc);/*讀取下一個*/ putchar(buffer1[openfile.file[i].read.bnum]);/*讀出一個字符(這if((t+1)%64==0)putchar('n');/*修改讀指針*/ openfile.file[i].read.bnum++;if(openfile.file[i].read.bnum>=64)/*一塊讀完,讀取下一個盤塊*/ { fseek(fc,openfile.file[i].read.dnum/64*64, SEEK_SET);fread(buffer1,64,1,fc);里是在屏幕上顯示)*/;/*修改讀指針*/ }/*讀函數結束*/ int write_file(char *name,char *buff,int length)//P174 /*寫文件函數*/ //char *name;/*文件路徑名*/ //char *buff;/*存放準備寫入磁盤的內容*/ //int length;/*寫入內容的長度*/ { int i,t,dd;if((i=sopen(name))==-1)/*文件不存在,無法寫*/ { } if(openfile.file[i].flag==0){ } t=0;fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);fread(buffer1,64,1,fc);while(t buffer1[openfile.file[i].write.bnum]=buff[t];openfile.file[i].write.bnum++;openfile.file[i].length++;if(openfile.file[i].write.bnum>=64){ fseek(fc, openfile.file[i].write.dnum*64L, SEEK_SET);fwrite(buffer1,64,1,fc);/*一塊寫完,寫回磁盤*/ if((dd=allocate())==false){ openfile.file[i].write.bnum--;openfile.file[i].length--;printf(“無磁盤空間,部分信息丟失,寫失敗n”);return(false);printf(“文件以讀方式打開,不能寫n”);return(false);printf(“文件沒有打開或不存在n”);return(false);}/*if*/ fseek(fc,openfile.file[i].write.dnum/64*64L, SEEK_SET);fread(buffer1,64,1,fc);buffer1[openfile.file[i].write.dnum%64]=dd;fseek(fc,openfile.file[i].write.dnum/64*64L, SEEK_SET); fwrite(buffer1,64,1,fc);openfile.file[i].write.dnum=dd;openfile.file[i].write.bnum=0;}/*if*/ t++;}/*while*/ fseek(fc, openfile.file[i].write.dnum*64L, SEEK_SET);fwrite(buffer1,64,1,fc);/*一塊寫完,寫回磁盤*/ }/*寫函數結束*/ int search(char *name,int flag,int *dnum,int *bnum)/*查找路徑名為name的文件或目錄,返回該目錄的起始盤塊號 */ //char *name;//int flag;/*flag=8表示查找目錄,否則為文件*/ //int *dnum,*bnum;/*返回找到文件或目錄的目錄項的位置:盤塊dnum中第bnum項*/ { for(s=0;name[k]!='.'&&name[k]!='/'&&s<3&&name[k]!='
主站蜘蛛池模板:
日韩 亚洲 制服 欧美 综合|
亚洲成a人片在线观看中文|
在线看片免费人成视频影院看|
久久亚洲一区二区三区四区五区|
亚洲女线av影视宅男宅女天堂|
亚洲成年网站青青草原|
中国一 片免费观看|
高潮潮喷奶水飞溅视频无码|
永久亚洲成a人片777777|
怡春院久久国语视频免费|
欧美国产激情一区二区在线|
男女猛烈激情xx00免费视频|
亚洲sm另类一区二区三区|
国产素人在线观看人成视频|
精品极品三大极久久久久|
亚洲综合精品第一页|
国产免费午夜福利在线播放11|
少妇富婆高级按摩出水高潮|
欧美高清一区三区在线专区|
午夜福利理论片在线观看|
久久久久亚洲av成人网人人软件|
女同久久精品国产99国产精品|
精品无码成人片一区二区|
欧美又粗又大又硬又长又爽视频|
好大好硬好爽免费视频|
人人妻久久人人澡人人爽人人精品|
久久久久麻豆v国产精华液好用吗|
高清不卡一区二区三区|
久久香蕉国产线熟妇人妻|
日韩超碰人人爽人人做人人添|
日本欧美视频在线观看三区|
中文在线а√在线天堂中文|
成人网站在线进入爽爽爽|
少妇人妻综合久久中文|
麻豆tv入口在线看|
亚洲色在线无码国产精品|
大狠狠大臿蕉香蕉大视频|
特黄特黄欧美亚高清二区片|
亚洲精品久久久无码一区二区|
在线无码|
欧美日韩国产图片区一区|
第二篇:操作系統課程設計-磁盤調度算法
第三篇:操作系統課程設計,磁盤調度算法范文
第四篇:操作系統實習報告(磁盤文件操作)