




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、操作系統(tǒng)實驗報告學(xué) 院_計算機學(xué)院_專 業(yè)_軟件工程_班 級_ _學(xué) 號_ _姓 名_ _指導(dǎo)教師 (2010年10 月)學(xué)號: 姓名: 協(xié)作者:_實驗_一_題目_ 進程調(diào)度_第 周星期_ _一、實驗?zāi)康挠酶呒壵Z言編寫和調(diào)試一個進程調(diào)度程序,以加深對進程的概念及進程調(diào)度算法的理解。二、實驗內(nèi)容和要求編寫并調(diào)試一個模擬的進程調(diào)度程序,采用“輪轉(zhuǎn)法”調(diào)度算法對五個進程進行調(diào)度。·每個進程有一個進程控制塊(PCB)表示。進程控制塊可以包含如下信息:進程名、優(yōu)先數(shù)、到達時間、需要運行的時間、已用CPU時間、進程狀態(tài)等。·進程的優(yōu)先數(shù)以及需要的運行時間事先由人為指定(也可以隨機數(shù)產(chǎn)生
2、)。·如果運行一個時間片后進程的已占用CPU時間已達到所需要的運行時間,則撤銷該進程,如果還未達到,則把它送回隊尾。三、實驗主要儀器設(shè)備和材料實驗環(huán)境硬件環(huán)境:IBM-PC 或兼容機軟件環(huán)境:C語言編程環(huán)境四、實驗原理及設(shè)計方案1、實驗原理將程序順序的輸入進程隊列后,開始執(zhí)行程序,當(dāng)運行了一個時間片后,如果進程所占的CPU時間達到所需的運行時間時,該進程完成,并撤銷該進程,否則則把進程送回隊尾。2、設(shè)計方案用一個進程控制塊(PCB)表示進程。輸入進程名稱,優(yōu)先級,運行時間后,通過模擬系統(tǒng)對進程采用“輪轉(zhuǎn)法”調(diào)度,得到各個時間片進程的運行情況。3、相關(guān)數(shù)據(jù)結(jié)構(gòu)的說明struct pcb
3、/ 定義進程控制塊 PCB char name10;/ 進程名稱 char state;/ 進程當(dāng)前狀態(tài) int super;/ 進程優(yōu)先級 int ntime;/ 進程運行所需時間 int rtime;/ 進程已運行時間 struct pcb* link;/ 連接到隊列中下一個進程的指針4、程序流程圖(詳細(xì))5、給出程序中源程序名和可執(zhí)行程序名。源程序名:pcb.cpp可執(zhí)行程序名:pcb.exe輸入數(shù)據(jù):in.txt輸出數(shù)據(jù):out.txt6、程序清單(源程序中要附有詳細(xì)的注釋)#include <stdio.h>#define getpch(type) (type*)mall
4、oc(sizeof(type)struct pcb/ 定義進程控制塊 PCB char name10;/ 進程名稱 char state;/ 進程當(dāng)前狀態(tài) int super;/ 進程優(yōu)先級 int ntime;/ 進程運行所需時間 int rtime;/ 進程已運行時間 struct pcb* link;*ready,*p,*rear;typedef struct pcb PCB;void push()/ 建立將進程按 FCFS 排入隊列的函數(shù)rear->link = p;rear = p;p->link = NULL;p->state = 'w' / 插入
5、隊尾后把狀態(tài)改成'w' void input()/ 建立進程控制塊函數(shù)int i,num;printf(" 請輸入進程數(shù)量 ");scanf("%d",&num);p=getpch(PCB); / 給 p 分配空間 for( i=0; i< num; i+)printf("n 進程號 No.%d ",i);p = getpch(PCB);printf(" 輸入進程名:");scanf("%s",p->name);printf(" 輸入進程優(yōu)先等級:&
6、quot;);scanf("%d",&p->super);printf(" 輸入進程所需運行時間:");scanf("%d",&p->ntime);p->rtime = 0; / 為進程的已運行時間初始化為0 p->state = 'w' / 為進程的狀態(tài)初始化為 'w' p->link = NULL; push();void disp(PCB* pr)/ 建立進程顯示函數(shù) printf("n qnametstatetsupertndtimetru
7、ntime n"); printf("| %st",pr->name); printf("|%ct",pr->state); printf("|%dt",pr->super); printf("|%dt",pr->ntime); printf("|%dt",pr->rtime); printf("n");void check()/ 建立進程查看函數(shù) system("cls"); PCB *pr; pr=ready-&
8、gt;link; while(pr!=NULL) / 隊列從頭到尾顯示進程 disp(pr); pr = pr->link; void destroy()/ 建立進程撤消函數(shù) disp(p); printf("n 進程 %s 已完成。n",p->name); free(p); / 釋放 p void running() / 建立進程就緒函數(shù) p->rtime+; / 已運行時間增加 if(p->rtime = p->ntime) / 當(dāng)已運行時間等于所需運行時間時 p->state = 'f' / 狀態(tài)更新為'f&
9、#39; ready->link = p->link; destroy(); / 調(diào)用destory()函數(shù),釋放p p = ready->link; system("pause"); / 暫停,可了解當(dāng)前狀態(tài) else / 如果進程還沒達到所需運行時間,則把進程送入隊尾 ready->link = p->link; push(); p = ready->link; int main()/ 主函數(shù) int t=0; / 定義t表示已用的時間片 rear = getpch(PCB); / 為rear分配內(nèi)存 ready = rear; /
10、把ready指向rear input(); / 輸入進程 p = ready->link;check();while(ready->link) / 當(dāng)進程隊列中還有進程時運行 t+; p->state = 'r' / 將進程狀態(tài)設(shè)置為 ready check(); printf("第%d個時間片:",t); printf("正在運行n"); system("pause"); / 顯示正在運行的進程隊列 running(); check(); printf("第%d個時間片:",t)
11、; printf("運行完成n"); system("pause"); / 顯示運行完成后的進程隊列 printf("n全部進程已運行完成!n");system("pause");return 0;五、實驗結(jié)果及分析1、運行結(jié)果(要求截圖)(能動態(tài)說明執(zhí)行結(jié)果)(要求截圖尺寸大小適中)(1)輸入數(shù)據(jù)(2)開始運行,進程隊列如圖(3)經(jīng)過3個時間片,進程【333】完成(4)經(jīng)過9個時間片,進程【555】完成(5)經(jīng)過10個時間片,進程【111】完成(6)經(jīng)過12個時間片,進程【444】完成(7)經(jīng)過13個時間片,進程
12、【222】完成(8)全部進程運行完成2、實驗結(jié)果的分析及說明程序輸出與編寫程序的目的一致,直觀的反應(yīng)了輪轉(zhuǎn)法進程調(diào)度的運行規(guī)則,顯示了完成各個進程運行所需要的時間,以及各個進程完成的順序。六、調(diào)試總結(jié)及心得體會(調(diào)試過程中小結(jié)、所遇問題及解決方法、心得體會)整個調(diào)試過程中并未遇到太大的問題,程序編寫過程也很順利,運行程序模擬進程調(diào)度之后,更直觀的了解了輪轉(zhuǎn)法進程調(diào)度的過程。七、思考題1、 分析不同調(diào)度算法的調(diào)度策略,比較不同調(diào)度算法的優(yōu)缺點,總結(jié)它們的適用范圍。答:動態(tài)有限權(quán)算法:動態(tài)優(yōu)先權(quán)是指在創(chuàng)建進程時所創(chuàng)建的優(yōu)先權(quán),會隨進程的推進或者等待時間的增加而改變,以便獲得更好的調(diào)度性能。處理機為
13、每個進程分配一定的時間片,在就緒隊列中,優(yōu)先權(quán)高的進程將優(yōu)先獲得處理機,進程在進去運行完響應(yīng)的時間片后,如沒完成,優(yōu)先權(quán)減1,從新回到就緒隊列等待分配處理機。時間片的輪轉(zhuǎn)法:系統(tǒng)將所有進程排成一個隊列,按照先來先服務(wù)的原則,對隊列首的進程進行處理,每個進程在用完自己的時間片后,從新回到隊尾進行排隊。每運行一次,進程的需要時間減1,直到就緒隊列為空!學(xué)號: 姓名: 協(xié)作者:_實驗_二_題目_ 作業(yè)調(diào)度_第 周星期_ _一、實驗?zāi)康谋緦嶒炓髮W(xué)生模擬作業(yè)調(diào)度的實現(xiàn),用高級語言編寫和調(diào)試一個或多個作業(yè)調(diào)度的模擬程序,了解作業(yè)調(diào)度在操作系統(tǒng)中的作用,以加深對作業(yè)調(diào)度算法的理解。二、實驗內(nèi)容和要求作業(yè)調(diào)
14、度算法:采用基于先來先服務(wù)的調(diào)度算法。可以參考課本中的方法進行設(shè)計。 對于多道程序系統(tǒng),要假定系統(tǒng)中具有的各種資源及數(shù)量、調(diào)度作業(yè)時必須考慮到每個作業(yè)的資源要求。三、實驗主要儀器設(shè)備和材料硬件環(huán)境:IBM-PC或兼容機軟件環(huán)境:C語言編程環(huán)境四、實驗原理及設(shè)計方案1、實驗原理采用多道程序設(shè)計方法的操作系統(tǒng),在系統(tǒng)中要經(jīng)常保留多個運行的作業(yè),以提高系統(tǒng)效率。作業(yè)調(diào)度從系統(tǒng)已接納的暫存在輸入井中的一批作業(yè)中挑選出若干個可運行的作業(yè),并為這些被選中的作業(yè)分配所需的系統(tǒng)資源。對被選中運行的作業(yè)必須按照它們各自的作業(yè)說明書規(guī)定的步驟進行控制。2、設(shè)計方案(1)作業(yè)調(diào)度程序負(fù)責(zé)從輸入井選擇若干個作業(yè)進入主
15、存,為它們分配必要的資源,當(dāng)它們能夠被進程調(diào)度選中時,就可占用處理器運行。作業(yè)調(diào)度選擇一個作業(yè)的必要條件是系統(tǒng)中現(xiàn)有的尚未分配的資源可滿足該作業(yè)的資源要求。但有時系統(tǒng)中現(xiàn)有的尚未分配的資源既可滿足某個作業(yè)的要求也可滿足其它一些作業(yè)的要求,那么,作業(yè)調(diào)度必須按一定的算法在這些作業(yè)中作出選擇。先來先服務(wù)算法是按照作業(yè)進入輸入井的先后次序來挑選作業(yè),先進入輸入井的作業(yè)優(yōu)先被挑選,當(dāng)系統(tǒng)中現(xiàn)有的尚未分配的資源不能滿足先進入輸入井的作業(yè)時,那么順序挑選后面的作業(yè)。(2) 假定某系統(tǒng)可供用戶使用的主存空間共100k,并有5臺磁帶機。3、相關(guān)數(shù)據(jù)結(jié)構(gòu)的說明struct time/ 定義一個時間結(jié)構(gòu)體 int
16、 h; int m; t;struct jcb/ 定義一個作業(yè)結(jié)構(gòu)已 char name10;/ 作業(yè)名稱 struct time submittime;/ 提交時間 struct time starttime;/ 開始時間 struct time needtime;/ 需要運行的時間 struct time finishtime;/ 完成時間 char state;/ 狀態(tài) struct jcb* link;/ 連接到下一個作業(yè)的指針;4、程序流程圖(詳細(xì))5、給出程序中源程序名和可執(zhí)行程序名。源程序名:jcb.cpp可執(zhí)行程序名:jcb.exe輸入數(shù)據(jù):in.txt輸出數(shù)據(jù):out.txt
17、6、程序清單(源程序中要附有詳細(xì)的注釋)#include<stdio.h>#include<stdlib.h>#define getpch(type) (type*)malloc(sizeof(type)struct time/ 定義一個時間結(jié)構(gòu)體 int h; int m; t;struct jcb/ 定義一個作業(yè)結(jié)構(gòu)已 char name10;/ 作業(yè)名稱 struct time submittime;/ 提交時間 struct time starttime;/ 開始時間 struct time needtime;/ 需要運行的時間 struct time fini
18、shtime;/ 完成時間 char state;/ 狀態(tài) struct jcb* link;/ 連接到下一個作業(yè)的指針*ready,*p,*rear;typedef struct jcb JCB;int num;void push()/ 建立將進程按 FCFS 排入隊列的函數(shù)rear->link = p;rear = p;void disp(JCB* pr)/ 建立作業(yè)顯示函數(shù) printf("n nametstatetsubmittimetneedtimetstarttimetfinishtimettime n"); printf("| %st"
19、;,pr->name); printf("|%ct",pr->state); printf("|%d:%dtt",pr->submittime.h,pr->submittime.m); printf("|%d:%dtt",pr->needtime.h,pr->needtime.m); printf("|%d:%dtt",pr->starttime.h,pr->starttime.m); printf("|%d:%dtt",pr->finish
20、time.h,pr->finishtime.m); printf("|%d:%dtt",pr->finishtime.h-pr->submittime.h,pr->finishtime.m-pr->submittime.m); printf("n");void input()/ 建立作業(yè)控制塊函數(shù)int i;printf(" 請輸入作業(yè)數(shù)量 ");scanf("%d",&num);p=getpch(JCB); / 給 p 分配空間 for( i=0; i< num; i+
21、)p = getpch(JCB);printf(" 輸入作業(yè)名:");scanf("%s",p->name);printf(" 輸入作業(yè)提交時間(h:m):");scanf("%d:%d",&p->submittime.h,&p->submittime.m);printf(" 輸入作業(yè)所需運行時間(h:m):");scanf("%d:%d",&p->needtime.h,&p->needtime.m);printf
22、("n");p->state = 'w' / 為作業(yè)的狀態(tài)初始化為 'w' p->link = NULL; push(); p = NULL;void running() / 建立作業(yè)就緒函數(shù) if(p->submittime.h < t.h|(p->submittime.h = t.h && p->submittime.m <= t.m) p->starttime.h=t.h; / 當(dāng)提交時有程序在運行 p->starttime.m=t.m;/ 則開始時間等于上一程序運行
23、完成時間 else/ 否則開始時間等于提交時間 t.h=p->submittime.h; t.m=p->submittime.m; p->starttime.h=t.h; p->starttime.m=t.m; t.h=p->needtime.h+t.h; t.m=p->needtime.m+t.m; if(t.m>=60) t.h+; t.m-=60; p->finishtime.h=t.h; p->finishtime.m=t.m; p->state='f' push(); int main()/ 主函數(shù) /fre
24、open("in.txt","r",stdin); /freopen("out.txt","w",stdout); int i; rear = getpch(JCB); ready = getpch(JCB); rear = ready; input(); p=ready->link; t.h=p->submittime.h; t.m=p->submittime.m; printf("n"); for(i=0;i<num;i+) running(); disp(p); p
25、 = p->link; p=ready->link; system("pause"); return 0;五、實驗結(jié)果及分析1、運行結(jié)果(要求截圖)(能動態(tài)說明執(zhí)行結(jié)果)(要求截圖尺寸大小適中)輸入數(shù)據(jù):輸出結(jié)果:2、實驗結(jié)果的分析及說明根據(jù)實驗輸入,輸出了運行后各個作業(yè)的開始時間,完成時間以及周轉(zhuǎn)時間。六、調(diào)試總結(jié)及心得體會(調(diào)試過程中小結(jié)、所遇問題及解決方法、心得體會)有了第一個實驗的基礎(chǔ),在這個實驗中,除了在處理小時與分鐘的轉(zhuǎn)換上花費了點時間之外,其余的部分都完成的比較順利。七、思考題1、寫出每種算法的調(diào)度策略,最后比較各種算法的優(yōu)缺點。答:先來先服務(wù)算法
26、是根據(jù)作業(yè)的進入時間來排序,到達時間短的先運行,優(yōu)點是實現(xiàn)簡單,缺點是運行時間慢。短作業(yè)優(yōu)先算法是根椐作業(yè)的估計運行時間來排序,估計運行時間短的先運行,優(yōu)點是運行時間快,缺點是實現(xiàn)起來比較復(fù)雜。2、選擇調(diào)度算法的依據(jù)是什么?答:如果作業(yè)要求的速度不高,而且作業(yè)比較小型,那就最好用先來先服務(wù)算法。如果作業(yè)要求的速度高,作業(yè)流程復(fù)雜,那就最好用短作業(yè)優(yōu)先算法。學(xué)號: 姓名: 協(xié)作者:_實驗_四_題目 主存空間的分配和回收_第 周星期_ 一、實驗?zāi)康氖煜ぶ鞔娴姆峙渑c回收。理解在不同的存儲管理方式下,如何實現(xiàn)主存空間的分配與回收。掌握動態(tài)分區(qū)分配方式中的數(shù)據(jù)結(jié)構(gòu)和分配算法及動態(tài)分區(qū)存儲管理方式及其實現(xiàn)
27、過程。二、實驗內(nèi)容和要求主存的分配和回收的實現(xiàn)是與主存儲器的管理方式有關(guān)的。所謂分配,就是解決多道作業(yè)或多進程如何共享主存空間的問題。所謂回收,就是當(dāng)作業(yè)運行完成時將作業(yè)或進程所占的主存空間歸還給系統(tǒng)??勺兎謪^(qū)管理是指在處理作業(yè)過程中建立分區(qū),使分區(qū)大小正好適合作業(yè)的需求,并且分區(qū)個數(shù)是可以調(diào)整的。當(dāng)要裝入一個作業(yè)時,根據(jù)作業(yè)需要的主存量查看是否有足夠的空閑空間,若有,則按需要量分割一個分區(qū)分配給該作業(yè);若無,則作業(yè)不能裝入,作業(yè)等待。隨著作業(yè)的裝入、完成,主存空間被分成許多大大小小的分區(qū),有的分區(qū)被作業(yè)占用,而有的分區(qū)是空閑的。實驗要求使用可變分區(qū)存儲管理方式,分區(qū)分配中所用的數(shù)據(jù)結(jié)構(gòu)采用空
28、閑分區(qū)表和空閑分區(qū)鏈來進行,分區(qū)分配中所用的算法采用首次適應(yīng)算法、循環(huán)首次適應(yīng)算法、最佳適應(yīng)算法三種算法來實現(xiàn)主存的分配與回收。同時,要求設(shè)計一個實用友好的用戶界面,并顯示分配與回收的過程。三、實驗主要儀器設(shè)備和材料硬件環(huán)境:IBM-PC或兼容機軟件環(huán)境:VC+ 6.0四、實驗原理及設(shè)計方案1、實驗原理在該算法中,把主存中所有空閑區(qū)按其物理地址遞增的次序排列。在為作業(yè)分配存儲空間時,從上次找到的空閑分區(qū)的下一個空閑分區(qū)開始查找,直到找到第一個能滿足要求的空閑區(qū),從中劃出與請求的大小相等的存儲空間分配給作業(yè),余下的空閑區(qū)仍留在空閑區(qū)表或鏈中。2、設(shè)計方案(1)初始化空閑分區(qū);(2)反復(fù)對現(xiàn)有的空
29、閑分區(qū)進行進程創(chuàng)建和撤消,即內(nèi)存分配和回收;(3)退出。3、相關(guān)數(shù)據(jù)結(jié)構(gòu)的說明struct zoneint size; / 區(qū)域的大小 int state; / 區(qū)域的狀態(tài) char name10; / 區(qū)域的名稱 struct zone *link; / 連接到下一區(qū)域的指針 ; 4、程序流程圖(詳細(xì))5、給出程序中源程序名和可執(zhí)行程序名。源程序名:memory.cpp可執(zhí)行程序名:memory.exe輸入數(shù)據(jù):in.txt輸出數(shù)據(jù):out.txt6、程序清單(源程序中要附有詳細(xì)的注釋)#include <stdio.h>#include <stdlib.h>#def
30、ine MAX 5struct page / 定義一個頁表 page int num; / 頁號 char imformation100; / 頁表信息 page * next; / 指向下一個頁表的指針 *address,*memory; / 定義一個指令地址指針和主存指針 void print(page *pp) / 輸出頁表 printf("num:t%dn",pp->num); printf("imformation:t%snn",pp->imformation); void AddToAddress() / 向指令地址添加頁表 in
31、t a; page *p,*pp; p = address; while(1) printf("please input num:"); scanf("%d",&a); if(a) pp = (page *)malloc(sizeof(page); / 分配內(nèi)存空間 pp->num = a; printf("please input imformation:"); scanf("%s",pp->imformation); pp->next = NULL; p->next = pp;
32、/ 把頁表連接到address后 p = pp; print(p); pp = NULL; free(pp); else return; void init() / 初始化程序,為address和memory分配內(nèi)存空間 address = (page *)malloc(sizeof(page); memory = (page *)malloc(sizeof(page); AddToAddress();bool IsInMemory(int n) / 判斷頁號是否已在主存內(nèi) page * p; p = memory->next; while(NULL != p) if(p->num
33、 = n) printf("is in memoryn"); return 1; p = p->next; printf("is not in memoryn"); return 0;bool IsMemoryFull() / 判斷主存是否已滿 page *p; int i = 0; p = memory->next; while(NULL != p) i+; p = p->next; if(i >= MAX) / 主存中頁表的數(shù)量達到 MAX 時,主存已滿 printf("is fulln"); return
34、 1; else printf("is not fulln"); return 0; void DeletePage() / 用 FIFO 算法淘汰一頁 page *p; p = memory; memory = p->next; free(p);void AddToMemory(page *pp) / 向主存調(diào)入當(dāng)前頁表 page *p; p = memory; while(NULL != p->next) p = p->next; p->next = pp;int main() init(); /初始化 page * p; page * pp;
35、p = address; p = p->next; while(p) if(!IsInMemory(p->num) / 判斷 p 是否已在主存內(nèi) if(IsMemoryFull() / 判斷 主存是否已滿 DeletePage(); / 用 FIFO 算法淘汰一頁 printf("n"); AddToMemory(p); / 向主存調(diào)入當(dāng)前頁表 print(p); pp = p; p = p->next; pp->next = NULL; printf("n-memory:n"); / 打印當(dāng)前主存區(qū)內(nèi)情況 p = memory-
36、>next; while(p) print(p); p = p->next; system("pause");五、實驗結(jié)果及分析1、運行結(jié)果(要求截圖)(能動態(tài)說明執(zhí)行結(jié)果)(要求截圖尺寸大小適中)輸入命令:task1 new 130輸入命令:task2new60輸入命令:task3new100輸入命令:task2delete60輸入命令:task4new200輸入命令:task3delete100輸入命令:task1delete130輸入命令:task5new140輸入命令:task6new60輸入命令:task7new50輸入命令:task 3 new 50
37、 (錯誤的命令)輸入命令:quit 結(jié)束2、實驗結(jié)果的分析及說明本實驗用了一條鏈表將所有的內(nèi)存都連接起來,在之中按照書上要求的算法,分別執(zhí)行了每一條命令,結(jié)果完全正確,對錯誤的命令也能夠及時的判斷出來。六、調(diào)試總結(jié)及心得體會(調(diào)試過程中小結(jié)、所遇問題及解決方法、心得體會)通過前幾個實驗,對鏈表又有了深刻的了解,所以在這個對鏈表操作更為復(fù)雜的實驗中,感覺游刃有余,對內(nèi)存空間的開辟以及釋放有了更深刻的了解,整個程序在編寫的過程中也沒有碰到太大的困難,最主要是在編寫之前已經(jīng)深刻的把整個構(gòu)思在大腦中了。七、思考題1、內(nèi)存的主要分配方式有哪些?回收時可能出現(xiàn)的什么情況?應(yīng)怎樣處理這些情況?答:有定分區(qū)分
38、配和動態(tài)分區(qū)分配兩種,回收時可能出現(xiàn)內(nèi)存分區(qū)被切成若干在小不等小分區(qū),過小的分區(qū)浪費內(nèi)存資源,這要求我們要用緊湊技術(shù)修整。2、動態(tài)分區(qū)管理的常用內(nèi)存分配算法有哪幾種?比較它們各自的使用范圍。答:有首次適應(yīng)算法、循環(huán)首次適應(yīng)算法、最佳適應(yīng)算法三種。首次適應(yīng)算法適用于小型作業(yè),而且分配速度不怎么要求的作業(yè),循環(huán)首次適應(yīng)算法適用于一些大的作業(yè),避免大作業(yè)長期得不到分配,最佳適應(yīng)算法適應(yīng)于對分配速度要求高,作業(yè)容量比較大的作業(yè)。學(xué)號: 姓名: 協(xié)作者:_實驗_五_題目_ 文件系統(tǒng)_第 周星期_ _一、實驗?zāi)康哪M文件系統(tǒng)實現(xiàn)的基本功能,了解文件系統(tǒng)的基本結(jié)構(gòu)和文件的各種管理方法,加深理解文件系統(tǒng)的內(nèi)部
39、功能及內(nèi)部實現(xiàn)。通過用高級語言編寫和調(diào)試一個簡單的文件系統(tǒng),模擬文件管理的工作過程,從而對各種文件操作命令的實質(zhì)內(nèi)容和執(zhí)行過程有比較深入的了解。二、實驗內(nèi)容和要求編程模擬一個簡單的文件系統(tǒng),實現(xiàn)文件系統(tǒng)的管理和控制功能。要求本文件系統(tǒng)采用兩級目錄,即設(shè)置主文件目錄MFD和用戶文件目錄UED。另外,為打開文件設(shè)置運行文件目錄AFD。設(shè)計一個10個用戶的文件系統(tǒng),每次用戶可保存10個文件,一次運行用戶可以打開5個文件,并對文件必須設(shè)置保護措施。在用戶程序中通過使用文件系統(tǒng)提供的Create、open、read、write、close、delete等文件命令,對文件進行操作三、實驗主要儀器設(shè)備和材料
40、硬件環(huán)境:IBM-PC或兼容機軟件環(huán)境:C語言編程環(huán)境四、實驗原理及設(shè)計方案1、實驗原理運用二級目錄思想來模擬文件系統(tǒng)。為每個用戶建立一個單獨的用戶文件目錄UFD。這些文件目錄具有相似的結(jié)構(gòu),它由用戶文件的文件塊組成。此外,在系統(tǒng)再建立一個主文件目錄MFD;在主文件目錄中,每個用戶目錄都占有一個目錄項,其目錄項中包含文件名和指向該文件目錄文件的指針。2、設(shè)計方案按照課本要求,為每一個命令設(shè)置一個函數(shù),再由主界面接受命令,進行判斷以及調(diào)用函數(shù)。3、相關(guān)數(shù)據(jù)結(jié)構(gòu)的說明struct MDF/ 定義一個用來存放user和ufd的結(jié)構(gòu)體char username200;/ usernameint len
41、gth;/ user 文件目錄長度struct UFD *userufd;/ 指向user文件目錄的指針struct MDF *link;/ 指向下一個user的指針*mdfhead,*mdfptr;/ 頭指針struct UFD/ 定義用來存放files的鏈表char filename200;/ filenameint num;/ 保護碼int length;/ file長度struct UFD *link;/ 指向下一個file的指針*ufdptr;struct AFD/ 定義一個用來存放已經(jīng)打開的files的鏈表char username200;/ usernamechar filena
42、me200;/ filenameint num;/ 保護碼int state;/ 讀寫指針int length;/ file長度struct AFD *link;/ 指向下一個file的指針*afdhead,*afdptr;/ 頭指針4、程序流程圖(詳細(xì))5、給出程序中源程序名和可執(zhí)行程序名。源程序名:file.cpp可執(zhí)行程序名:file.exe6、程序清單(源程序中要附有詳細(xì)的注釋)#include <stdio.h>#include <stdlib.h>#include <string.h>struct MDF/ 定義一個用來存放user和ufd的結(jié)構(gòu)
43、體char username200;/ usernameint length;/ user 文件目錄長度struct UFD *userufd;/ 指向user文件目錄的指針struct MDF *link;/ 指向下一個user的指針*mdfhead,*mdfptr;/ 頭指針struct UFD/ 定義用來存放files的鏈表char filename200;/ filenameint num;/ 保護碼int length;/ file長度struct UFD *link;/ 指向下一個file的指針*ufdptr;struct AFD/ 定義一個用來存放已經(jīng)打開的files的鏈表cha
44、r username200;/ usernamechar filename200;/ filenameint num;/ 保護碼int state;/ 讀寫指針int length;/ file長度struct AFD *link;/ 指向下一個file的指針*afdhead,*afdptr;/ 頭指針void init();bool createfile(char* username,char* filename,int num);bool deletefile(char * username,char * filename);bool openfile(char * username,ch
45、ar * filename);bool closefile(char * username,char * filename);bool readfile(char * username,char * filename);bool writefile(char * username,char * filename);void init()/ 初始化函數(shù)afdhead = (AFD *)malloc(sizeof(AFD);afdhead->link = NULL;afdhead->length = 0;/ 為afdhead分配空間,并link = null,length = 0afd
46、ptr = afdhead;int i = 10;mdfhead = (MDF *)malloc(sizeof(MDF);mdfptr = mdfhead;/ 為mdfhead分配空間struct MDF *mp;struct UFD *up;char str200;while(i-)/ 初始化10個用戶名mp = (MDF *)malloc(sizeof(MDF);/ 為每個user分配空間,并link = nullsprintf(str,"user%d",10-i); strcpy(mp->username,str);/ 從user1到user10mp->l
47、ength = 0;up = (UFD *)malloc(sizeof(UFD);/ 為每個user分配一個ufd,并link = null,length = 0mp->userufd = up;mp->userufd->length = 0;mp->userufd->link = NULL;mp->link = NULL;mdfptr->link = mp;mdfptr = mp;up = NULL;mp = NULL;bool createfile(char* username,char* filename,int num)/ create函數(shù)bo
48、ol flag = false;/ 定義一個bool類型的flag用來做返回值mdfptr = mdfhead->link;struct UFD *up;while(mdfptr)/ 從第一個user開始尋找usernameif(!strcmp(mdfptr->username,username)/ 找到username之后if(mdfptr->length >=10)/ 如果user保存文件數(shù)超過10個,則提示錯誤并返回printf("error! the user have 10 files.n");return flag;ufdptr = mdfptr->userufd;up = ufdptr->link;while(up)/ 在user的ufd中查找filenameif(!strcmp(up-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大竹縣竹中中考數(shù)學(xué)試卷
- 營養(yǎng)型輸液項目風(fēng)險識別與評估綜合報告
- 自籌經(jīng)費措施方案
- 喀什非開挖頂管施工方案
- 智能制造與物聯(lián)網(wǎng)(IoT)應(yīng)用的策略及實施方案
- 新型城鎮(zhèn)化中的農(nóng)村振興與現(xiàn)代農(nóng)業(yè)發(fā)展的策略
- 能源結(jié)構(gòu)優(yōu)化與清潔能源轉(zhuǎn)型的策略
- 降碳減污擴綠增長的經(jīng)濟學(xué)分析
- 文化交流與一帶一路人文合作的推動路徑
- 更大力度穩(wěn)定和擴大就業(yè)的策略及實施路徑
- 人工挖孔樁施工危險源辨識與評價及應(yīng)對措施
- 品管圈成果匯報——提高導(dǎo)管固定正確率PPT課件
- 第2講 麥克斯韋方程組
- 讀懂教材、讀懂學(xué)生、讀懂課堂,構(gòu)建和諧有效的課堂教學(xué)
- 裝飾施工進度計劃網(wǎng)絡(luò)圖及橫道圖
- 機械畢業(yè)實習(xí)報告
- 材料科學(xué)與工程專業(yè) 畢業(yè)論文
- 糖尿病視網(wǎng)膜病變PPT課件
- 古詩分類講解五思鄉(xiāng)懷人詩
- 多極磁燃?xì)猸h(huán)保節(jié)能器-合力金科技
- 青少年心理學(xué)書籍:青少年心理學(xué)
評論
0/150
提交評論