




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
操作系統(tǒng)實習(xí)報告操作系統(tǒng)實習(xí)報告操作系統(tǒng)實習(xí)報告操作系統(tǒng)實習(xí)報告1/241/24實習(xí)一處理器調(diào)度一、 實習(xí)內(nèi)容選擇一個調(diào)度算法,實現(xiàn)處理器調(diào)度。二、 實習(xí)目的在采用多道程序設(shè)計的系統(tǒng)中,往往若干個進(jìn)程同時處于就緒狀態(tài)。當(dāng)就緒進(jìn)程個數(shù)大于處理器數(shù)時,就必須依照某種策略來決定哪些進(jìn)程優(yōu)先占有處理器。本實習(xí)模擬在單處理器情況下的處理器調(diào)度,加深了解處理器調(diào)度的工作。三、 實習(xí)題目設(shè)計一個按優(yōu)先數(shù)調(diào)度算法實現(xiàn)處理器調(diào)度的程序。[提示]: 假定系統(tǒng)有5個進(jìn)程,每個進(jìn)程用一個PCB來代表。PCB的格式為:進(jìn)程名、指針、要求運行時間、優(yōu)先數(shù)、狀態(tài)。進(jìn)程名——P1?P5。指針一一按優(yōu)先數(shù)的大小把5個進(jìn)程連成隊列,用指針指出下一個進(jìn)程PCB的首地址。要求運行時間一一假設(shè)進(jìn)程需要運行的單位時間數(shù)。 優(yōu)先數(shù)一一賦予進(jìn)程的優(yōu)先數(shù),調(diào)度時總是選取優(yōu)先數(shù)大的進(jìn)程先執(zhí)行。 狀態(tài)——假設(shè)兩種狀態(tài),就緒,用R表示,和結(jié)束,用E表示。初始狀態(tài)都為就緒狀態(tài)。每次運行之前,為每個進(jìn)程任意確定它的“優(yōu)先數(shù)”和“要求運行時間”。處理器總是選隊首進(jìn)程運行。采用動態(tài)改變優(yōu)先數(shù)的辦法,進(jìn)程每運行1次,優(yōu)先數(shù)減1,要求運行時間減1。 進(jìn)程運行一次后,若要求運行時間不等于0,則將它加入隊列,否則,將狀態(tài)改為 “結(jié)束",退出隊列。 若就緒隊列為空,結(jié)束,否則,重復(fù)(3)。 四、 數(shù)據(jù)結(jié)構(gòu)及符號說明進(jìn)程的定義:structpcb{/*定義進(jìn)程控制塊PCB*/charname[10];/*進(jìn)程名*/charstate;/*進(jìn)程狀態(tài),就緒或者完成*/intsuper;/*進(jìn)程優(yōu)先級*/intneedtime;/*進(jìn)程所需時間*/intruntime;/*進(jìn)程已完成時間*/structpcb*link;/*指向下一進(jìn)程*/}函數(shù)說明:voidinsert()功能:進(jìn)程優(yōu)先級排列函數(shù),比較進(jìn)程優(yōu)先級,將其插入適當(dāng)?shù)奈恢谩?參數(shù):super,依據(jù)進(jìn)程優(yōu)先級super來確定進(jìn)程的插入位置。調(diào)用:被進(jìn)程控制塊函數(shù)和進(jìn)程就緒函數(shù)調(diào)用。voidinput()功能:進(jìn)程控制塊函數(shù)參數(shù):num,i,name,super,needtime調(diào)用:主函數(shù)main()調(diào)用voiddisp(PCB*pr)功能:進(jìn)程顯示函數(shù),用于顯示當(dāng)前進(jìn)程。參數(shù):name,state,super,needtime,runtime調(diào)用:被進(jìn)程查看函數(shù)check()調(diào)用voidcheck()功能:進(jìn)程查看函數(shù),用于顯示當(dāng)前運行進(jìn)程和就緒隊列狀態(tài)。參數(shù):PCB*prpr=ready調(diào)用:被主函數(shù)main()調(diào)用voiddestroy()功能:進(jìn)程撤消函數(shù),用于當(dāng)進(jìn)程運行結(jié)束時,撤消進(jìn)程。參數(shù):p->name調(diào)用:被進(jìn)程就緒函數(shù)running()調(diào)用voidrunning()功能:進(jìn)程就緒函數(shù),當(dāng)進(jìn)程運行時間到,置進(jìn)程就緒狀態(tài)。參數(shù):p->runtime調(diào)用:被主函數(shù)main()調(diào)用main()功能:主函數(shù)五、程序流程圖六、實驗源程序#include<stdio.h>#include<stdlib.h>#include<conio.h>#definegetpch(type)(type*)malloc(sizeof(type))structpcb{/*定義進(jìn)程控制塊PCB*/charname[10];charstate;intsuper;intneedtime;intruntime;structpcb*link;}*ready=NULL,*p;typedefstructpcbPCB;voidsort()/*建立對進(jìn)程進(jìn)行優(yōu)先級排列函數(shù)*/{PCB*first,*second;intinsert=0;if((ready==NULL)ll((p->super)>(ready->super)))/*優(yōu)先級最大者,插入隊首*/{p->link=ready;ready=p;}else/*進(jìn)程比較優(yōu)先級,插入適當(dāng)?shù)奈恢弥?/{first=ready;second=first->link;while(second!=NULL){if((p->super)>(second->super))/*若插入進(jìn)程比當(dāng)前進(jìn)程優(yōu)先數(shù)大,*/{/*插入到當(dāng)前進(jìn)程前面*/p->link=second;first->link=p;second=NULL;insert=1;}else/*插入進(jìn)程優(yōu)先數(shù)最低,則插入到隊尾*/{first=first->link;second=second->link;}}if(insert==0)first->link=p;}}intinput()/*建立進(jìn)程控制塊函數(shù)*/{inti,num;printf("\n請輸入進(jìn)程數(shù)?”);scanf("%d",&num);for(i=0;i<num;i++){printf("\n進(jìn)程號P%d:\n",i);p=getpch(PCB);printf("\n輸入進(jìn)程名:”);scanf("%s",p->name);printf("\n輸入進(jìn)程優(yōu)先數(shù):”);scanf("%d",&p->super);操作系統(tǒng)實習(xí)報告操作系統(tǒng)實習(xí)報告printf("\n輸入進(jìn)程運行時間:”);scanf("%d",&p->needtime);printf("\n");p->runtime=0;p->state='w';p->link=NULL;sort();/*調(diào)用sort函數(shù)*/}returnnum;}voiddisp(PCB*pr)/*建立進(jìn)程顯示函數(shù),用于顯示當(dāng)前進(jìn)程*/{printf("\nqname\tstate\tsuper\tndtime\truneedtime\n");printf("|%s\t",pr->name);printf("|%c\t",pr->state);printf("|%d\t",pr->super);printf("|%d\t",pr->needtime);printf("|%d\t",pr->runtime);printf("\n");}voidcheck()/*建立進(jìn)程查看函數(shù)*/{PCB*pr;printf("\n****當(dāng)前正在運行的進(jìn)程是:%s”,p->name);/*顯示當(dāng)前運行進(jìn)程*/disp(p);pr=ready;printf("\n****當(dāng)前就緒隊列狀態(tài)為:\n");/*顯示就緒隊列狀態(tài)*/while(pr!=NULL){disp(pr);pr=pr->link;}}voiddestroy()/*建立進(jìn)程撤消函數(shù)(進(jìn)程運行結(jié)束,撤消進(jìn)程)*/{printf("\n進(jìn)程[%s]已完成,\n",p->name);free(p);}voidrunning()/*建立進(jìn)程就緒函數(shù)(進(jìn)程運行時間到,置就緒狀態(tài)*/{(p->runtime)++;if(p->runtime=p->needtime)destroy();/*調(diào)用destroy函數(shù)*/else{(p->super)--;p->state='w';sort();/*調(diào)用sort函數(shù)*/}}main()/*主函數(shù)*/{intlen,h=0;charch;len=input();while((len!=0)&&(ready!=NULL)){ch=getchar();h++;printf("\nTheexecutenumber:%d\n",h);p=ready;ready=p->link;p->link=NULL;p->state='R';check();running();printf("\n按任一鍵繼續(xù)......");ch=getchar();}printf("\n\n進(jìn)程已經(jīng)完成An");ch=getchar();}實習(xí)二主存空間的分配和回收一、 實習(xí)內(nèi)容主存儲器空間的分配和回收。二、 實習(xí)目的通過本實習(xí)幫助理解在不同的存儲管理方式下應(yīng)怎樣進(jìn)行存儲空間的分配和回收。三、 實習(xí)題目第一題:在可變分區(qū)管理方式下采用首次適應(yīng)算法實現(xiàn)主存分配和回收。操作系統(tǒng)
進(jìn)程操作系統(tǒng)
進(jìn)程1
連程3空閑區(qū)進(jìn)程2 空閑區(qū)可變分區(qū)方式是按作業(yè)需要的主存空間大小來分割分5k區(qū)的。當(dāng)要裝入一個作業(yè)時,根據(jù)作業(yè)需要的主存容量1貝查看是否有足夠的空閑空間,若有,則按需分配,否則,14k作業(yè)無法裝入。假定內(nèi)存大小為128K,初始狀態(tài)見右圖。空閑區(qū)說明表格式為:起始地址一一指出空閑區(qū)的£Sk起始地址;長度一一一個連續(xù)空閑區(qū)的長度;狀態(tài)一一實k有兩種狀態(tài),一種是“未分配”狀態(tài),另一種是“空表目"狀態(tài)。空閑區(qū)采用首次適應(yīng)算法分配。運行時,輸入一系列分配請求和回收請求。四、 程序流程為了說明哪些區(qū)是空閑的,可以用來裝入新作業(yè),必須要有一張空閑區(qū)說明表,格式如下:第一欄第二欄起址長度狀 態(tài)14K12K未分配32K96K未分配空表目空表目其中:起址一一指出一個空閑區(qū)的主存起始地址。長度一一指出從起始地址開始的一個連續(xù)空閑的長度。狀態(tài)一一有兩種狀態(tài),一種是“未分配”狀態(tài),指出對應(yīng)的由起址指出的某個長度分配算法流程圖:申靖曲主存區(qū)的賴個W欄I風(fēng)出分魚世耳]回收算法流程圖:操作系統(tǒng)實習(xí)報告操作系統(tǒng)實習(xí)報告賽空閑區(qū)說明支愚F鄰的空把下部空闞區(qū)登璧中狀忘置成上郭空闞區(qū)登記桂中悅度増加L1CT賽空閑區(qū)說明支愚F鄰的空把下部空闞區(qū)登璧中狀忘置成上郭空闞區(qū)登記桂中悅度増加L1CT鄰空閑區(qū)登記欄中始fibwS長度sLI按拖址?!序調(diào)醛和紫婚空鬧區(qū)說明衰找一"空衰目登圮始址|=SLgjBiE區(qū)長度S土蜒Hjfcit六、實驗源程序#include<stdio.h>#include<stdlib.h>#include<conio.h>#definen10/*假定系統(tǒng)允許的最大作業(yè)為,假定模擬實驗中n值為10*/ #definemlO/*假定系統(tǒng)允許的空閑區(qū)表最大為m,假定模擬實驗中m值為10*/#defineminisize100struct(floataddress;/*己分分區(qū)起始地址*/ floatlength;/*己分分區(qū)長度,單位為字節(jié)*/ intflag;/*己分配區(qū)表登記欄標(biāo)志,用”0”表示空欄目*/}used_table[n];/*已分配區(qū)表*/struct(floataddress;/*空閑區(qū)起始地址*/ floatlength;/*空閑區(qū)長度,單位為字節(jié)*/ intflag;/*空閑區(qū)表登記欄標(biāo)志,用”0”表示空欄目,用T表示未分配*/)free_table[m];/*空閑區(qū)表*/voidallocate(charJ,floatx)/*釆用首次適應(yīng)算法分配x大小的空間*/(inti,k;floatad;k=-1;for(i=0;i<m;i++)/*尋找空間大于xk的最小空閑區(qū)登記項k*/if(free_table[i].length>=x&&free_table[i].flag==1)if(k==-1llfree_table[i].length<free_table[k].length)k=i;if(k==-1)/*未找到可用空閑區(qū),返回*/{printf("無可用空閑區(qū)\n");return;}/*找到可用空閑區(qū),開始分配:若空閑區(qū)大小與要求分配的空間差小于msize大小,則空閑區(qū)全部分配;若空閑區(qū)大小與要求分配的空間差大于minisize大小,則從空閑區(qū)劃出一部分分配*/if(free_table[k].length-xv=minisize){free_table[k].flag=0;ad=free_table[k].address;x=free_table[k].length;}else{free_table[k].length=free_table[k].length-x;ad=free_table[k].address+free_table[k].length;}/*修改已分配區(qū)表*/i=0;while(used_table[i].flag!=0&&ivn)/*尋找空表目*/i++;if(i>=n)/*無表目填寫已分分區(qū)*/{printf("無表目填寫已分分區(qū),錯誤\n");/*修正空閑區(qū)表*/if(free_table[k].flag==0)/*前面找到的是整個空閑分區(qū)*/free_table[k].flag=1;else {/*前面找到的是某個空閑分區(qū)的一部分*/free_table[k].length=free_table[k].length+x;return;}}else{/*修改已分配表*/used_table[i].address=ad;used_table[i].length=x;used_table[i].flag=J;}return;}/*主存分配函數(shù)結(jié)束*/voidreclaim(charJ)/*回收作業(yè)名為J的作業(yè)所占主存空間*/{inti,k,j,s,t;floatS,L;/*尋找已分配表中對應(yīng)登記項*/s=0;while((used_table[s].flag!=Jllused_table[s].flag==0)&&svn)s++;if(s>=n)/*在已分配表中找不到名字為J的作業(yè)*/{printf("找不到該作業(yè)\n");return;}/*修改已分配表*/used_table[s].flag=0;/*取得歸還分區(qū)的起始地址S和長度L*/S=used_table[s].address;L=used_table[s].length;j=-1;k=-1;i=0;/*尋找回收分區(qū)的空閑上下鄰,上鄰表目k,下鄰表目j*/while(ivm&&(j=-1llk=-1)){if(free_table[i].flag==1){if(free_table[i].address+free_table[i].length==S)k=i;/*找到上鄰*/if(free_table[i].address=S+L)j=i;/*找到下鄰*/}i++;}if(k!=-1)if(j!=-1)/*上鄰空閑區(qū),下鄰空閑區(qū),三項合并*/{free_table[k].length=free_table[j].length+free_table[k].length+L;free_table[j].flag=0;}else/*上鄰空閑區(qū),下鄰非空閑區(qū),與上鄰合并*/free_table[k].length=free_table[k].length+L;elseif(j!=-1)/*上鄰非空閑區(qū),下鄰為空閑區(qū),與下鄰合并*/{free_table[j].address=S;free_table[j].length=free_table[j].length+L;}else/*上下鄰均為非空閑區(qū),回收區(qū)域直接填入*/{/*在空閑區(qū)表中尋找空欄目*/t=0;while(free_table[t].flag==l&&tvm)t++;if(t>=m)/*空閑區(qū)表滿,回收空間失敗,將已分配表復(fù)原*/{printf(”主存空閑表沒有空間,回收空間失敗\n");used_table[s].flag=J;return;}free_table[t].address=S;free_table[t].length=L;free_table[t].flag=1;}return;}/*主存回收函數(shù)結(jié)束*/main(){inti,a;floatx;charJ;/*空閑分區(qū)表初始化:*/free_table[0].address=10240;free_table[0].length=102400;free_table[0].flag=1;for(i=1;ivm;i++)free_table[i].flag=0;/*已分配表初始化:*/for(i=0;ivn;i++)used_table[i].flag=0;while(1){操作系統(tǒng)實習(xí)報告操作系統(tǒng)實習(xí)報告printf("選擇功能項(0-退出,1-分配主存,2-回收主存,3-顯示主存)\n");printf("選擇功項(0?3):");scanf("%d",&a);switch(a){case0:exit(0);/*a=0程序結(jié)束*/case1:/*a=1分配主存空間*/printf("輸入作業(yè)名J和作業(yè)所需長度x:");scanf("%*c%c%f”,&J,&x);allocate(J,x);/*分配主存空間*/break;case2:/*a=2回收主存空間*/printf("輸入要回收分區(qū)的作業(yè)名”);scanf("%*c%c",&J);reclaim(J);/*回收主存空間*/break;case3:/*a=3顯示主存情況*//*輸出空閑區(qū)表和已分配表的內(nèi)容*/printf("輸出空閑區(qū)表:\n起始地址分區(qū)長度標(biāo)志\n");for(i=0;i<m;i++)printf("%6.0f%9.0f%6d\n”,free_table[i].address,free_table[i].length,free_table[i].flag);printf("按任意鍵,輸出已分配區(qū)表");getch();printf("輸出已分配區(qū)表:\n起始地址分區(qū)長度標(biāo)志\n");for(i=0;i<n;i++)if(used_table[i].flag!=0)printf("%6.0f%9.0f%6c\n”,used_table[i].address,used_table[i].length,used_table[i].flag);elseprintf("%6.0f%9.0f%6d\n”,used_table[i].address,used_table[i].length,used_table[i].flag);break;default:printf("沒有該選項\n");}/*case*/}/*while*/ }/*主函數(shù)結(jié)束*/實習(xí)三磁盤存儲空間的分配和回收一、 實習(xí)內(nèi)容模擬磁盤空閑空間的表示方法,以及模擬實現(xiàn)磁盤空間的分配和回收。二、 實習(xí)目的磁盤初始化時把磁盤存儲空間分成許多塊(扇區(qū)),這些空間可以被多個用戶共享。用戶作業(yè)在執(zhí)行期間常常要在磁盤上建立文件或把已經(jīng)建立在磁盤上的文件刪去,這就涉及到磁盤存儲空間的分配和回收。一個文件存放到磁盤上,可以組織成順序文件(連續(xù)文件)、鏈接文件(串聯(lián)文件)、索引文件等,因此,磁盤存儲空間的分配有兩種方式,一種是分配連續(xù)的存儲空間,另一種是可以分配不連續(xù)的存儲空間。怎樣有效地管理磁盤存儲空間是操作系統(tǒng)應(yīng)解決的一個重要問題,通過本實習(xí)使學(xué)生掌握磁盤存儲空間的分配和回收算法。三、 實習(xí)題目第二題:用位示圖管理磁盤存儲空間[提示]:(1) 為了提高磁盤存儲空間的利用率,可在磁盤上組織成鏈接文件、索引文件,這類文件可以把邏輯記錄存放在不連續(xù)的存儲空間。為了表示哪些磁盤空間已被占用,哪些磁盤空間是空閑的,可用位示圖來指出。位示圖由若干字節(jié)構(gòu)成,每一位與磁盤上的一塊對應(yīng),“1”狀態(tài)表示相應(yīng)塊已占用,“0”狀態(tài)表示該塊為空閑。位示圖的形式與實習(xí)二中的位示圖一樣,但要注意,對于主存儲空間和磁盤存儲空間應(yīng)該用不同的位示圖來管理,絕不可混用。(2) 申請一塊磁盤空間時,由分配程序查位示圖,找出一個為“0”的位,計算出這一位對應(yīng)塊的磁盤物理地址,且把該位置成占用狀態(tài)“1”。假設(shè)現(xiàn)在有一個盤組共8個柱面,每個柱面有兩個磁道(盤面),每個磁道分成4個物理記錄。那么,當(dāng)在位示圖中找到某一字節(jié)的某一位為“0”時,這個空閑塊對應(yīng)的磁盤物理地址為:柱面號=字節(jié)號磁道號=[七數(shù)]物理記錄號={位數(shù)}4歸還一塊磁盤空間時,由回收程序根據(jù)歸還的磁盤物理地址計算出歸還塊在位示圖中的對應(yīng)位,把該位置成“0”。按照(2)中假設(shè)的盤組,歸還塊在位示圖中的位置計算如下: 字節(jié)號=柱面號位數(shù)=磁道號4+物理記錄號設(shè)計申請一塊磁盤空間和歸還一塊磁盤空間的程序。要求能顯示或打印程序運行前和運行后的位示圖;分配時把分配到的磁盤空間的物理地址顯示或打印出來,歸還時把歸還塊對應(yīng)于位示圖的字節(jié)號和位數(shù)顯示或打印出來。假定已有如表4-1的磁盤空間被占用了,現(xiàn)在要申請五塊磁盤空間,運行分配程序,按(4)中要求顯示或打印運行的結(jié)果。然后再歸還如表4-2的空間,運行回收程序,按(4)中的要求顯示或打印運行結(jié)果。表4-1柱面號磁道號物理記錄號001002010013100112表4-2柱面號磁道號物理記錄號002010101四、數(shù)據(jù)結(jié)構(gòu)及符號說明1-數(shù)據(jù)結(jié)構(gòu)說明:/*物理地址*/typedefstructaddress{intcylinder; /*柱面號*/inttrack; /*磁道號*/intblock; /*塊號*/}address;塊的物理地址。可直接通過這來尋址。便于和位示圖坐標(biāo)進(jìn)行轉(zhuǎn)換。/*文件*/typedefstructfile{intlength; /*文件長度*/block*head; /*文件的第一個塊*/}file;文件長度用來定量表明文件所需的空間大小,即物理塊數(shù)。2.函數(shù)說明/*初始化磁盤空間,用位示圖表示*/voidinitialize。功能:按照題目要求,初始化磁盤空間,使用位示圖來表示相應(yīng)塊的分配情況。參數(shù):無。使用全局變量bitmap[][]。調(diào)用:被主函數(shù)main()調(diào)用來初始化程序。/*轉(zhuǎn)換。將位示圖的坐標(biāo)轉(zhuǎn)換為物理地址*/addresstransform(intx,inty)功能:將位示圖的坐標(biāo)轉(zhuǎn)換為相應(yīng)塊的物理地址。參數(shù):intx,inty。x,y表示位示圖的坐標(biāo)。調(diào)用:被cmalloc(file&list)調(diào)用計算物理地址。/*顯示分配或回收文件的位示圖或物理地址*/voiddisplay(filelist,bools)功能:分配時把分配到的磁盤空間的物理地址顯示出來,歸還時把歸還塊對應(yīng)于位示圖的字節(jié)號和位數(shù)顯示出來。參數(shù):filelist,bools。調(diào)用:被cmalloc(file&list)和cfree(filelist)調(diào)用。/*顯示位示圖*/voiddis_map()功能:將位示圖輸出。參數(shù):無。調(diào)用全局變量bitmap[][]調(diào)用:被cmalloc(file&list)和cfree(filelist)調(diào)用。/*分配文件需求空間*/boolcmalloc(file&list)功能:依據(jù)文件的需求空間在位示圖中找足夠數(shù)目的空閑塊。成功則分配且返回true。否則,返回falseo。參數(shù):file&listo找到的物理塊插入到list鏈表中。調(diào)用:被request()調(diào)用。/*回收已分配文件空間*/voidcfree(filelist)操作系統(tǒng)實習(xí)報告操作系統(tǒng)實習(xí)報告功能:回收作業(yè)job在內(nèi)存中所占的空間。參數(shù):filelisto回收文件list的物理塊。調(diào)用:被release()調(diào)用。/*請求分配程序*/voidrequest()功能:若有分配請求,則分配空間。參數(shù):無。調(diào)用全局變量List[],bitmap[][]o調(diào)用:調(diào)用cmalloc(file&list)來分配磁盤空間。/*請求回收程序*/voidrelease()功能:若有回收請求,則回收空間。參數(shù):無。調(diào)用全局變量List[],bitmap[][]o調(diào)用:調(diào)用cfree(filelist)來回收文件list的磁盤空間。五、程序流程圖操作系統(tǒng)實習(xí)報告操作系統(tǒng)實習(xí)報告六、實驗源程序#include<stdio.h>#include<stdlib.h>#defineCYLINDER#defineTRACK#defineBLOCK#defineT_BYTE#defineT_BIT#defineN20824/*一個盤組共CYLINDER個柱面*//*每個柱面有TRACK個磁道*//*每個磁道分成BLOCK個物理記錄*//*位示圖橫坐標(biāo):字節(jié)數(shù)*/
/*位示圖縱坐標(biāo):位數(shù)*/
/*文件的最大個數(shù)*/CYLINDERTRACK*BLOCKboolbitmap[T_BYTE][T_BIT]; /*位示圖定義*/intblocknum=T_BYTE*T_BIT;/*空閑塊數(shù)目*/intn=0; /*文件的編號*//*物理地址*/typedefstructaddress{intcylinder; /*柱面號*//*磁道號/*磁道號*//*塊號*/intblock;}address;/*已分配給文件的塊*/typedefstructblock{addressaddr; /*塊的物理地址*/structblock*next;/*下一塊*/}block;/*文件*//*文件長度/*文件長度*//*文件的第一個塊*/intlength;block*head;}file;fileList[N];/*文件定義*//*初始化磁盤空間,用位示圖表示*/voidinitialize。{intc,t,b;/*將所有的塊設(shè)為為分配*/for(inti=0;i<T_BYTE;i++){for(intj=0;j<T_BIT;j++)bitmap[i][j]=0;}/*c=0; t= 0; b= 1;bitmap[c][t*BLOCK +b] = 1;blocknum--;c=0; t= 0; b= 2;bitmap[c][t*BLOCK +b] = 1;blocknum--;c=0; t= 1; b= 0;bitmap[c][t*BLOCK +b] = 1;blocknum--;c=0; t= 1; b= 3;bitmap[c][t*BLOCK +b] = 1;blocknum--;c=1; t= 0; b= 0;bitmap[c][t*BLOCK +b] = 1;blocknum--;c=1; t= 1; b= 2;bitmap[c][t*BLOCK +b] = 1;blocknum--;*/}/*轉(zhuǎn)換。將位示圖的坐標(biāo)轉(zhuǎn)換為物理地址*/addresstransform(intx,inty){inta,b,c;addressaddr;a=x;b=y/BLOCK;c=y%BLOCK;addr.cylinder=a;addr.track=b;addr.block=c;returnaddr;}/*顯示分配或回收文件的位示圖或物理地址*/voiddisplay(filelist,bools){block*p;inti,j;p=list.head;if(s=0) /*顯示分配文件的各塊的物理地址*/{printf(”分配文件的物理地址:\n");printf(”柱面磁道塊時);while(p!=NULL) /*未顯示完所有的塊*/{printf("%d %d%d\n",p->addr.cylinder,p->addr.track,p->addr.block);p=p->next;}}else /*顯示回收文件的各塊的位示圖坐標(biāo)*/{printf(”回收文件在位示圖中的位置:\n");while(p!=NULL) /*未顯示完所有的塊*/{i=p->addr.cylinder; /*物理地址轉(zhuǎn)換為位示圖坐標(biāo)*/j=p->addr.track*BLOCK+p->addr.block;操作系統(tǒng)實習(xí)報告操作系統(tǒng)實習(xí)報告printf("%d%d\n",i,j);p=p->next;}}}/*顯示位示圖*/voiddis_map(){inti,j;printf("當(dāng)前位示圖分配情況:\n");for(i=0;i<T_BYTE;i++){for(j=0;j<T_BIT;j++)printf("%d”,bitmap[i][j]); /*顯示一行*/printf("\n"); /*一行顯示完畢,換行*/}}/*分配文件需求空間*/boolcmalloc(file&list){intt=0;block*p,*q;if(list.length>blocknum) /*分配文件的需求空間大于空閑空間大小*/returnfalse;else{for(inti=0;i<T_BYTE;i++){for(intj=0;j<T_BIT;j++){if(bitmap[i][j]==0) /*此塊空間為空?*/{bitmap[i][j]=1; /*設(shè)此塊已分配*/if(list.head==NULL) /*此塊設(shè)為文件的頭塊*/{list.head=(block*)malloc(sizeof(block));list.head->addr=transform(i,j);list.head->next=NULL;p=list.head;/*使用p來構(gòu)造文件鏈表*/}else /*不是頭塊,加在鏈表后面*/{q=(block*)malloc(
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 牟平夜市活動方案
- 班級閱讀活動方案
- 煤礦抽水比武活動方案
- 球館拓展客戶活動方案
- 烘培門店活動方案
- 物業(yè)公司慈善活動方案
- 父子獻(xiàn)藝比賽活動方案
- 熊貓飲品活動方案
- 玻璃大棚活動方案
- 班級劇場活動方案
- 全過程工程咨詢投標(biāo)方案(技術(shù)方案)
- 風(fēng)力發(fā)電對環(huán)境影響評估-深度研究
- 2025年防臺防汛考試題及答案
- 《水利工程建設(shè)項目文件收集與歸檔規(guī)范SLT 824-2024》知識培訓(xùn)
- 蒙氏數(shù)學(xué)流程
- 病理切片HE染色
- 裝修工程招標(biāo)書范本
- 鋼結(jié)構(gòu)居間協(xié)議范本年
- 火災(zāi)自動報警系統(tǒng)的維護(hù)與保養(yǎng)
- 2025年江蘇南京水務(wù)集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 2025屆上海市普陀區(qū)高三上學(xué)期一模考試英語試題【含答案解析】
評論
0/150
提交評論