




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實習六 磁盤存儲空間的分配和回收 1、 實習內容模擬磁盤空閑空間的表示方法,以及模擬實現磁盤空間的分配和回收。2、 實習目的磁盤初始化時把磁盤存儲空間分成許多塊(扇區),這些空間可以被多個用戶共享。用戶作業在執行期間常常要在磁盤上建立文件或把已經建立在磁盤上的文件刪去,這就涉及到磁盤存儲空間的分配和回收。一個文件存放到磁盤上,可以組織成順序文件(連續文件)、鏈接文件(串聯文件)、索引文件等,因此,磁盤存儲空間的分配有兩種方式,一種是分配連續的存儲空間,另一種是可以分配不連續的存儲空間。怎樣有效地管理磁盤存儲空間是操作系統應解決的一個重要問題,通過本實習使學生掌握磁盤存儲空間的分配和回
2、收算法。3、 實習題目本實習模擬三種磁盤存儲空間的管理方法。第一題:連續的磁盤存儲空間的分配和回收。提示:(1) 要在磁盤上建立順序文件時,必須把按序排列的邏輯記錄依次存放在磁盤的連續存儲空間中。可假定磁盤初始化時,已把磁盤存儲空間劃分成若干等長的塊(扇區),按柱面號和盤面號的順序給每一塊確定一個編號。隨著文件的建立、刪除、磁盤存儲空間被分成許多區(每一區包含若干塊),有的區存放著文件,而有的區是空閑的。當要建立順序文件時必須找到一個合適的空閑區來存放文件記錄,當一個文件被刪除時,則該文件占用的區應成為空閑區。為此可用一張空閑區表來記錄磁盤存儲空間中尚未占用的部分,格式如下: 序 號
3、起始空閑塊號空閑塊個數狀 態156未 分 配2143未 分 配32130未 分 配4 空 表 目MM MM MM MM (2) 要建立文件時,先查找空閑區表,從狀態為“未分配”的登記欄目中找出一個塊數能滿足要求的區,由起始空閑塊號能依次推得可使用的其它塊號。若不需要占用該區的所有塊時,則剩余的塊仍應為未分配的空閑塊,這時要修改起始空閑塊號和空閑塊數。若占用了該區的所有塊,則相應登記欄中的狀態修改成“空表目”。刪除一個文件時,從空閑區表中找一個狀態為“空表目”的登記欄目,把歸還的起始塊號和塊數填入對應的位置。磁盤存儲空間的
4、分配和回收算法類似于主存儲器的可變分區方式的分配和回收。同學們可參考實習四的第一題。(3) 當找到空閑塊后,必須啟動磁盤把信息存放到指定的塊中,啟動磁盤必須給出由三個參數組成的物理地址:柱面號、磁道號和物理記錄號。故必須把找到的空閑塊號換算成磁盤的物理地址。為了減少移臂次數,磁盤上的信息按柱面上各磁道順序存放。現假定一個盤組共有200個柱面,(編號0-199)每個柱面有20個磁道(編號0-19,同一柱面上的各磁道分布在各盤面上,故磁道號即盤面號。),每個磁道被分成等長的6個物理記錄(編號0-5,每個盤面被分成若干個扇區,故每個磁道上的物理記錄號即為對應的扇區號。)。那么,空閑塊號與磁盤物理地址
5、的對應關系如下:空閑塊號6空閑塊號6假設M= , m= M20則 物理記錄號 = m磁道號= M20柱面號= (4) 刪除一個文件時,從文件目錄表中可得到該文件在磁盤上的起始地址和邏輯記錄個數,假定每個邏輯記錄占磁盤上的一塊,則可推算出歸還后的起始空閑塊號和塊數,登記到空閑區表中。換算關系如下:起始空閑塊號=(柱面號´20+磁道號)´6+物理記錄號空閑塊數=邏輯記錄數(5) 請設計磁盤存儲空間的分配和回收程序,要求把分配到的空閑塊轉換成磁盤物理地址,把歸還的磁盤空間轉換成空閑塊號。假定空閑區表的初值如提示(1)中指出,現有一文件要占用10塊,運行你所
6、設計的分配程序,顯示或打印分配后的空閑區表以及分配到的磁盤空間的起始物理地址。然后,有一文件被刪除,它占用的磁盤空間為:1號柱面2號磁道,0號物理記錄開始的4塊,運行你所設計的回收程序,顯示或打印回收后的空閑區表。第二題:用位示圖管理磁盤存儲空間提示:(1) 為了提高磁盤存儲空間的利用率,可在磁盤上組織成鏈接文件、索引文件,這類文件可以把邏輯記錄存放在不連續的存儲空間。為了表示哪些磁盤空間已被占用,哪些磁盤空間是空閑的,可用位示圖來指出。位示圖由若干字節構成,每一位與磁盤上的一塊對應,“1”狀態表示相應塊已占用,“0”狀態表示該塊為空閑。位示圖的形式與實習四中的位示圖一樣,但要注意,對于主存儲
7、空間和磁盤存儲空間應該用不同的位示圖來管理,絕不可混用。(2) 申請一塊磁盤空間時,由分配程序查位示圖,找出一個為“0”的位,計算出這一位對應塊的磁盤物理地址,且把該位置成占用狀態“1”。假設現在有一個盤組共80個柱面,每個柱面有兩個磁道,每個磁道分成4個物理記錄。那么,當在位示圖中找到某一字節的某一位為“0”時,這個空閑塊對應的磁盤物理地址為: 柱面號=字節號位數4磁道號= 位數4物理記錄號= (3) 歸還一塊磁盤空間時,由回收程序根據歸還的磁盤物理地址計算出歸還塊在位示圖中的對應位,把該位置成“0”。按照(2)中假設的盤組,歸還塊在位示圖中的位置計算如下:字節號=柱面
8、號位數=磁道號´4+物理記錄號(4) 設計申請一塊磁盤空間和歸還一塊磁盤空間的程序。要求能顯示或打印程序運行前和運行后的位示圖;分配時把分配到的磁盤空間的物理地址顯示或打印出來,歸還時把歸還塊對應于位示圖的字節號和位數顯示或打印出來。(5) 假定已有如表6-1的磁盤空間被占用了,現在要申請五塊磁盤空間,運行分配程序,按(4)中要求顯示或打印運行的結果。然后再歸還如表6-2的空間,運行回收程序,按(4)中的要求顯示或打印運行結果。 表6-1柱面號磁道號物理記錄號001002010013100112 表6-2柱面號磁道號物理記錄號002010101 第三題:
9、模擬UNIX系統的空閑塊成組鏈接法,實現磁盤存儲空間的管理。提示:(1) 假定磁盤存儲空間已被劃分成長度為n的等長塊,共有M塊可供使用。UNIX系統中采用空閑塊成組鏈接的方法 來管理磁盤存儲空間,將磁盤中的每N個空閑塊(N<M)分成一組,最后一組可以不足N塊,每組的第一塊中登記了下一組空閑塊的塊數和塊號,第一組的塊數和塊號登記在專用塊中,登記的格式如下: 0空閑塊數k1空閑塊號12空閑塊號2MMMMK空閑塊號kMMMM 當第一項內容為“0”時,則第二項起指出的空閑塊是最后一組。(2) 現模擬UNIX系統的空閑塊成組鏈接,假定共有8塊可供使用,每3塊為一組,則空閑塊成組
10、鏈接的初始狀態為: 開始時,空閑塊號是順序排列的,但經若干次的分配和歸還操作后,空閑塊的鏈接就未必按序排列了。用二維數組A:array 0M-1 of array 0n-1來模擬管理磁盤空間,用Ai表示第I塊,第0塊A0作為專用塊。(3) 成組鏈接的分組情況記錄在磁盤物理塊中,為了查找鏈接情況,必須把它們讀入主存,故當磁盤初始化后,系統先將專用塊內容復制到主存中。定義一個數組MA存放專用塊內容,即MA: =A0。申請一塊磁盤空間時,查MA,從中找出空閑塊號,當一組的空閑塊只剩第一塊時,則應把該塊中指出的下一組的空閑塊數和塊號復制到專用塊中,然后把該塊分配給申請者。當一組的
11、空閑塊分配完后則把專用塊內容(下一組鏈接情況)復制到主存,再為申請者分配。分配算法如圖6-1。圖6-1 采用成組鏈接的分配算法(4) 歸還一塊時給出歸還的塊號,叵當前組不滿規定塊數時,將歸還塊登記入該組;若當前組已滿,則另建一新組,這時歸還塊作為新一組的第一塊,應把主存中登記的一組鏈接情況MA復制到歸還塊中,然后在MA重新登記一個新組。歸還一塊的算法如圖6-2。圖6-2 采用成組鏈接的回收算法 (5) 設計分配和歸還磁盤空間的程序,能顯示或打印分配的磁盤空間的塊號,在完成一次分配或歸還后能顯示或打印各空閑塊組的情況(各組的空閑塊數和塊號)。本實習省去了塊號與物理地址之間的轉換工作,而
12、在實際的系統中必須進行塊號與物理地址的轉換工作。(6) 運行你所設計的程序,假定空閑塊鏈接的初始狀態如提示(2),現先分配4塊,再依次歸還第2塊和第6塊。把執行后分配到的塊號依次顯示或打印出來,且顯示或打印空閑塊組的情況。在上次執行的基礎上繼續分配3塊,然后歸還第1塊,再申請5塊,顯示或打印依次分配到的塊號及空閑塊組情況。4、 相關數據結構及說明 struct freeblock int FBbegin;/起始空閑塊號 int num;/空閑塊數 char state;/狀態 struct freeblock *next; struct filetowrite
13、 char name10;/文件名 int size;/文件大小 int addr_cylinder;/裝入磁盤的首地址_柱面號 int addr_track;/裝入磁盤的首地址_磁道號
14、0; int addr_note;/裝入磁盤的首地址_物理記錄號 struct filetowrite *next; 六、源代碼及注釋1、 題一源代碼:#include<stdlib.h>#include<stdio.h>int getmalloc()/分配磁盤空間
15、 int flag=0; struct freeblock *p=FBhead; struct filetowrite *File; File=(struct filetowrite *)malloc(sizeof(struct filetowrite); printf("輸入要裝入的文件名:");
16、60;scanf("%s",File->name); printf("輸入所需的磁盤空間大小:"); scanf("%d",&File->size); for(p=FBhead->next;p!=NULL;p=p->next) if(File->size)<=(p->num)/分配空間
17、0; flag=1; File->addr_cylinder=(p->FBbegin)/6)/20; File->addr_track=(p-
18、>FBbegin)/6)%20; File->addr_note=(p->FBbegin)%6; File->next=Filehead->next;/加入文件鏈表 &
19、#160; Filehead->next=File; if(File->size)<(p->num)/修改該快的起始地址和塊數
20、; p->FBbegin=p->FBbegin+File->size; p->num=p->num-File->size; &
21、#160; else p->state='U' break;
22、0; if(flag=0) printf("抱歉!目前沒有足夠的磁盤空間分配給該文件.n"); else printf("分配磁盤成功!n該文件的物理地址:n柱面號t磁道號t物理塊號n "
23、;); printf(" %dt %dt %dn",File->addr_cylinder,File->addr_track,File->addr_note); int deletelfree()/回收磁盤空間 char
24、0;name10; int flag=0; struct filetowrite *p; printf("輸入要刪除的文件名:"); scanf("%s",&name); for(p=Filehead;p->next!=NULL;p=p->next)
25、60; if(strcmp(p->next->name,name)=0)/找到該文件 flag=1; int funion=0,nunion=0; int m=p->next->addr_cylinder;
26、; int n=p->next->addr_track; int k=p->next->addr_note; int addr=(m*20+n)*6+k;/起始空閑塊號 int
27、60;tail=p->next->size+addr; struct freeblock *pnode,*qnode,*tnode,*snode; pnode=FBhead->next; while(pnode!=NULL)/先考慮和后面的部分或許有合并的情況
28、0; if(pnode->FBbegin)=tail) pnode->FBbegin=addr; pnode->num=pnode->num+p->next->s
29、ize; nunion=1;
30、;break; pnode=pnode->next; qnode=FBhead->next; while(qnode!=NULL)/再考慮
31、是否和前面的可以合并 if(qnode->FBbegin+qnode->num)=addr)
32、60; if(nunion=0) qnode->num=qnode->num+p->next->size;
33、60; funion=1;break;
34、 else
35、160; qnode->num=qnode->num+pnode->num; tnode=FBhead; while(tnode->next!=pnode)
36、60; tnode=tnode->next;
37、 tnode->next=pnode->next; free(pnode);
38、 funion=1;
39、60; break;
40、60; qnode=qnode->next; if(funion=0&&nunion=0)/若沒有和前面的或后面的進行合并,則新建一個表目
41、 snode=(struct freeblock *)malloc(sizeof(struct freeblock); snode->FBbegin=addr;
42、 snode->num=p->next->size; snode->state='F'
43、; if(FBhead->next=NULL) FBhead->next=snode; &
44、#160; snode->next=NULL;
45、; else snode->next=FBhead->next;FBhead->next=snode;
46、160; struct filetowrite *q;
47、 q=p->next;/除該文件 p->next=p->next->next; free(q); break;
48、60; if(flag=0) printf("沒有該文件!n"); else printf("文件刪除成功!n"); int dispfree()/顯示磁盤空閑區表 int i=1; struct freeblock *p
49、=FBhead; printf("n磁盤空閑區表n"); printf("序號t起始空閑塊號t空閑塊個數t 狀態n"); for(p=FBhead->next;p!=NULL;p=p->next) if(p->state)='F')
50、160; printf(" %dt %dtt %dtt未分配n",i+,p->FBbegin,p->num); else printf(" %dttttt空表目n",i+);
51、160;int dispfile() char name10; struct filetowrite *p=Filehead; printf("輸入要查看的文件名:"); scanf("%s",&name); for(p=Filehead->next;p!=NULL;p=p->next)
52、60; if(strcmp(p->name,name)=0) printf("該文件的物理地址:n柱面號t磁道號t物理塊號n "); printf(" %dt %dt %dn",p->addr_cylinder,p
53、->addr_track,p->addr_note); break; if(p=NULL) printf("沒有該文件!n"); int
54、0;main() int n,i,AMAX,BMAX;/AMAX表示起始空閑塊號,BMAX表示空閑塊個數 char ch; struct freeblock *pnew; FBhead=(struct freeblock *)malloc(sizeof(struct freeblock); FBhead->
55、;next=NULL; printf("輸入磁盤空閑區個數:"); scanf("%d",&n); for(i=1;i<=n;i+) pnew=(struct freeblock *)malloc(sizeof(struct
56、;freeblock); pnew->next=NULL;pnew->next=FBhead->next; FBhead->next=pnew; printf("起始空閑塊號:"
57、); scanf("%d",&pnew->FBbegin); printf("空閑塊個數:"); scanf("%d",&pnew->num); &
58、#160; pnew->state='F' pnew=pnew->next; Filehead=(struct filetowrite *)malloc(sizeof(struct filetowri
59、te); Filehead->next=NULL; do system("cls"); printf("ntt * 主菜單 *nn");
60、 printf("ttt1.新建文件n"); printf("ttt2.刪除文件n"); printf("ttt3.查看磁盤n");
61、60; printf("ttt4.查看文件n"); printf("ttt5.退出n"); printf("請選擇:"); scanf("%c",&ch);
62、160; switch(ch) case '1':getmalloc();system("pause");break;
63、0; case '2':deletelfree();system("pause");break; case '3':dispfree();system("pause");break;
64、60; case '4':dispfile();system("pause");break; case '5':exit(1);break; default:printf("輸入錯誤!請重新輸入.n");
65、;printf("n"); getchar(); while(ch!=4); return 0; 2、 題二源代碼:#include <stdio.h> #include <process.h> void Initbitmap(int map
66、88) int cylinder,track,sector; char choice='Y' printf("初始化位視圖.n"); while(choice='y'|choice='Y') printf("柱面號:"); scanf("%d",&cylinder);
67、160;printf("磁道號:"); scanf("%d",&track); printf("物理記錄號:"); scanf("%d",§or); mapcylinder4*track+sector=1; printf("contiune?"); getchar();&
68、#160; scanf("%c",&choice); void allocate(int map88) int i,j; int flag=0; int cylinder,track,sector; for(i=0;i<8;i+)
69、; for(j=0;j<8;j+) if(mapij=0) mapij=1;flag=1;break; if(flag=1) break; if(flag=1) &
70、#160; cylinder=i; track=j/4; sector=j%4; printf("分配到的柱面號、磁道號、物理記錄數"); printf("%dt%dt%d",cylinder,track,sector);printf("n");
71、160; else printf("空間不足,分配失敗!"); void reclaim(int map88) int cylinder,track,sector; printf("柱面號:"); scanf("%d",&cylinder); printf("磁道號:");
72、60;scanf("%d",&track); printf("物理記錄號:"); scanf("%d",§or); if(mapcylinder4*track+sector=0) printf("此塊為未分配塊!回收出錯!"); getchar();
73、160;else mapcylinder4*track+sector=0; printf("回收塊對應的字節號:%4dt位數:%4dn",cylinder,4*track+sector); void main() int bitmap88; int i,j; int choice;or(i=0;i<8;i+)
74、0; for(j=0;j<8;j+) bitmapij=0; Initbitmap(bitmap); while(1) printf("n請輸入選擇:"); printf("1-分配,2-回收,3-顯示位示圖,0-退出n"); scanf("%d",&choice);
75、0; switch(choice) case 1:allocate(bitmap);break; case 2:reclaim(bitmap);break; case 3:for(i=0;i<8;i+) for(j=0;j<8;j+) printf("%8d",bitmapij); printf("n");
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 育嬰師考試的特殊需求與備考建議試題及答案
- 計算機病毒與網絡安全
- 重點復習策略2025年臨床執業醫師考試試題及答案
- 世界衛生組織流行病學周報
- 草甘膦顆粒直線振動流化床草甘膦顆粒烘干機草甘膦顆粒干燥機
- 【小學說明文閱讀】說明文閱讀《手機確定你的位置》附答案
- 系統架構設計師考試創新與挑戰并存試題及答案
- 12MWh儲能電站項目可行性分析與前景展望
- 計算機二級考試戰略鏈接試題及答案
- 調整復習節奏的護士資格證試題及答案
- 《我不是藥神》劇本
- JJF 1101-2019《環境試驗設備溫度、濕度校準規范》規程
- GB/T 6451-2023油浸式電力變壓器技術參數和要求
- 幼兒園中班繪本《城市里最漂亮的巨人》課件
- 醫院廉潔行醫廉政教育專題課件
- 醫務人員職業健康安全健康-課件
- 安全組織機構圖
- 舊石器時代考古-基礎知識課件
- 江蘇省建設工程現場安全文明施工措施費計價管理辦法
- 病區藥品規范化管理與問題對策黃池桃
- 螺紋塞規操作規程
評論
0/150
提交評論