操作系統(tǒng)源代碼[研究分析]_第1頁
操作系統(tǒng)源代碼[研究分析]_第2頁
操作系統(tǒng)源代碼[研究分析]_第3頁
操作系統(tǒng)源代碼[研究分析]_第4頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、#include#include#includeint memoryStartAddress = -1;int memorySize = -1;struct jobListint id; /* 作業(yè)ID */int size; /* 作業(yè)大小(需要的存儲空間大?。?*/int status; /* 作業(yè)狀態(tài) 0 : new job ,1 : in the memory , 2 : finished . */struct jobList *next; /* 作業(yè)鏈表指針 */;struct freeListint startAddress; /* 分區(qū)起始地址 */int size; /* 分區(qū)

2、大小 */struct freeList *next; /* 分區(qū)鏈表指針 */;struct usedList int startAddress; /* 分區(qū)起始地址 */int jobID; /* 分區(qū)中存放作業(yè)ID */struct usedList *next; /* 分區(qū)鏈表指針 */;void errorMessage(void) /*出現(xiàn)嚴(yán)重錯誤時顯示信息并結(jié)束程序*/printf(ntError !a);printf(nPress any key to exit !);getch();exit(1);void openFile(FILE *fp,char *filename,c

3、har *mode) /*以要求的方式打開文件*/if(*fp = fopen(filename,mode) = NULL)printf(nCant open %s in mode %s.,filename,mode);errorMessage();void makeFreeNode(struct freeList *empty,int startAddress,int size) /*根據(jù)參數(shù)startAddress、size創(chuàng)建空閑節(jié)點(diǎn),由empty指針返回*/if(*empty = malloc(sizeof(struct freeList) = NULL)printf(nNot eno

4、ugh to allocate for the free node .);errorMessage();(*empty)-startAddress = startAddress;(*empty)-size = size;(*empty)-next = NULL;void iniMemory(void) /*初始化存儲空間起始地址、大小*/char MSA10,MS10;printf(nPlease input the start address of the memory !);scanf(%s,MSA);memoryStartAddress = atoi(MSA);printf(nPleas

5、e input the size of the memory !);scanf(%s,MS);memorySize = atoi(MS);char selectFitMethod(void) /*選擇適應(yīng)算法*/FILE *fp;char fitMethod;doprintf(nnPlease input a char as fallow to select the fit method !n 1 (Best fit) n 2 (Worst fit) n 3 (First fit) n 4 (Last fit)n);fitMethod = getche();while(fitMethod 4)

6、; openFile(&fp,d:result.cl,a);switch(fitMethod)case 1: fprintf(fp,nnnntBest fit); fprintf(fp,n*); break;case 2: fprintf(fp,nnnntWorst fit); fprintf(fp,n*); break;case 3: fprintf(fp,nnnntFirst fit); fprintf(fp,n*); break;case 4: fprintf(fp,nnnntLast fit); fprintf(fp,n*); break;fclose(fp);return fitMe

7、thod;void inputJob(void) /*從鍵盤輸入作業(yè)到D盤的JOB文件*/int /*id,size, */status = 0,jobnum = 0;FILE *fp;char id10,size10;openFile(&fp,d:job.cl,w);fprintf(fp,job_IDtsizetstatus);printf(nnnnPlease input the jobs as fallow !nEnter a integer smaller than 1 to quit .njob_IDtsizen);do/*scanf(%d%d,&id,&size); */scanf

8、(%st%s,id,size);if(atoi(id) 0 & atoi(size) 0)fprintf(fp,n%st%st%d,id,size,status);/*fprintf(fp,n%dt%dt%d,id,size,status); */jobnum+;elsebreak;while(1);if(jobnum)printf(nFinished to input the jobs !);elseprintf(nNo job was given .);errorMessage();fclose(fp);int makeJobList(struct jobList *jobs) /*從JO

9、B文件中讀出作業(yè)并創(chuàng)建作業(yè)鏈表*/char jobID10,size10,status10;struct jobList *rear;FILE *fp;openFile(&fp,d:job.cl,r);fscanf(fp,%s%s%s,jobID,size,status);if(*jobs = malloc(sizeof(struct jobList) = NULL)printf(nNot enough to allocate for the job .);fclose(fp);errorMessage();rear = *jobs;(*jobs)-next = NULL;while(!feo

10、f(fp)struct jobList *p;fscanf(fp,%s%s%s,jobID,size,status);if(p = malloc(sizeof(struct jobList) = NULL)printf(nNot enough to allocate for the job .);fclose(fp);errorMessage();p - next = rear - next;rear - next = p;rear = rear - next;rear - id = atoi(jobID);rear - size = atoi(size);rear - status = at

11、oi(status);fclose(fp);return 0;int updateJobFile(struct jobList *jobs) /*更新作業(yè)鏈表中作業(yè)的狀態(tài)*/FILE *fp;struct jobList *p;openFile(&fp,d:job.cl,w);fprintf(fp,job_IDtsizetstatus);for(p = jobs - next;p;p = p - next)fprintf(fp,n%dt%dt%d,p-id,p-size,p-status);fclose(fp);return 0;int showFreeList(struct freeList

12、 *empty) /*空閑分區(qū)隊列顯示*/FILE *fp;struct freeList *p = empty - next;int count = 0;openFile(&fp,d:result.cl,a);fprintf(fp,nnNow show the free list.);printf(nnNow show the free list.);if(p)fprintf(fp,nnumbertsizetstartAddress);printf(nnumbertsizetstartAddress);for(;p;p = p - next)fprintf(fp,n%dt%dt%d,+cou

13、nt,p - size,p - startAddress);printf(n%dt%dt%d,count,p - size,p - startAddress);fclose(fp);return 1;elsefprintf(fp,nThe memory was used out !);printf(nThe memory was used out !); fclose(fp);return 0;void getJobInfo(struct jobList *jobs,int id,int *size,int *status) /*獲取作業(yè)的信息*/struct jobList *p = job

14、s-next;while(p & p-id != id)p = p-next;if(p = NULL)printf(nCant find the job which id is : %d .,id);errorMessage();else*size = p - size;*status = p - status;void updateJobStatus(struct jobList *jobs,int id,int status)struct jobList *p = (*jobs)-next;while(p & p-id != id)p = p-next;if(p = NULL)printf

15、(nCant find the job which id is : %d .,id);errorMessage();elsep - status = status;int showUsedList(struct jobList *jobs,struct usedList *used) /*作業(yè)占用鏈表顯示*/FILE *fp;struct usedList *p = used - next;int count = 0,size,status;openFile(&fp,d:result.cl,a);fprintf(fp,nnNow show the used list.);printf(nnNo

16、w show the used list.);if(p)fprintf(fp,nnumbertjobIDtsizetstartAddress);printf(nnumbertjobIDtsizetstartAddress);for(;p;p = p - next)getJobInfo(jobs,p - jobID,&size,&status);fprintf(fp,n%dt%dt%dt%d,+count,p-jobID,size,p- startAddress);printf(n%dt%dt%dt%d,count,p-jobID,size,p- startAddress);fclose(fp)

17、;return 1;elsefprintf(fp,nNo job in the memory ! You should input some jobs to it.);printf(nNo job in the memory ! You should input some jobs to it.);fclose(fp);return 0;int showJobList(struct jobList *jobs) /*顯示作業(yè)鏈表*/struct jobList *p;p = jobs-next;if(p = NULL)printf(nNo job in the list ! Try again

18、 next time.);return 0;printf(nnThe job list is as fallow :njob_IDtsizetstatus);while(p)printf(n%dt%dt%d,p-id,p-size,p-status);p = p-next;return 1;void moveFragment(struct jobList *jobs,struct freeList *empty,struct usedList *used)int size,status;struct usedList *p;int address = memoryStartAddress; /

19、*全局變量,初始化時分配存儲空間始址*/if(*empty)-next = NULL) /* 空閑分區(qū)鏈表為空,提示并返回 */printf(nThe memory was used out at all.nMay be you should finish some jobs first or press any key to try again !);getch();return;for(p = (*used) - next;p;p = p- next) /* 循環(huán)的修改占用分區(qū)的始址 */p - startAddress = address;getJobInfo(jobs,p - jobI

20、D,&size,&status); /* 由作業(yè)ID獲得作業(yè)大小 */address += size;(*empty)-next-startAddress = address;/*修改空閑分區(qū)的首節(jié)點(diǎn)始址、大小*/(*empty) - next - size = memorySize - (address - memoryStartAddress);(*empty) - next - next = NULL; /* 刪除首節(jié)點(diǎn)后的所有節(jié)點(diǎn) */void order(struct freeList *empty,int bySize,int inc)struct freeList *p,*q,*

21、temp;int startAddress,size;for(p = (*empty) - next;p;p = p - next) /* 按bySize和inc兩個參數(shù)尋找合適的節(jié)點(diǎn),用temp指向它 */for(temp = q = p;q;q = q - next)switch(bySize)case 0 : switch(inc)case 0:if(q-size size)temp = q;break;default:if(q-size temp-size)temp = q;break; break;default: switch(inc)case 0:if(q-startAddres

22、s startAddress)temp = q;break;default:if(q-startAddress temp-startAddress)temp = q;break; break; /* 交換節(jié)點(diǎn)的成員值 */ if(temp != p) startAddress = p-startAddress;size = p-size;p-startAddress = temp-startAddress;p-size = temp-size;temp-startAddress = startAddress;temp-size = size;int allocate(struct freeLi

23、st *empty,int size) /*為作業(yè)分配存儲空間、狀態(tài)必須為0*/struct freeList *p,*prep;int startAddress = -1;p = (*empty) - next;while(p & p-size next;if(p != NULL)if(p - size size)startAddress = p - startAddress;p - startAddress += size;p - size -= size;else startAddress = p - startAddress;prep = *empty;while(prep - nex

24、t != p)prep = prep - next;prep - next = p - next;free(p);elseprintf(nMay be you should move the fragment together .); /* Unsuccessful ! */return startAddress;void insertUsedNode(struct usedList *used,int id,int startAddress) /*插入釋放的空間到used鏈表中(作業(yè)號為id,startAddress由函數(shù)13返回)*/struct usedList *q,*r,*prer;

25、if(q = malloc(sizeof(struct usedList) = NULL)printf(nNot enough to allocate for the used node .);errorMessage();q - startAddress = startAddress;q - jobID = id;prer = *used;r = (*used) - next;while(r & r-startAddress next;q - next = prer - next;prer - next = q;int finishJob(struct usedList *used,int

26、id,int *startAddress) /*結(jié)束一個作業(yè)號為id的作業(yè),釋放存儲空間(由*startAddress返回空間的起始地址)*/struct usedList *p,*prep;prep = *used;p = prep - next;while(p & p - jobID != id)prep = p;p = p - next;if(p = NULL)printf(nThe job which id is : %d is not in the memory !,id);return 0;else*startAddress = p-startAddress;prep - next

27、 = p - next;free(p);return 1;void insertFreeNode(struct freeList *empty,int startAddress,int size)/*插入回收的空節(jié)點(diǎn)分區(qū),處理回收分區(qū)與空閑分區(qū)的四種鄰接關(guān)系。*/struct freeList *p,*q,*r; for(p = *empty;p - next;p = p - next) ; /* 處理鏈表尾部的鄰接情況 */if(p = *empty | p - startAddress + p - size next = p - next; /* 插入獨(dú)立的空閑節(jié)點(diǎn) */p - next

28、= r;return ;if(p - startAddress + p - size = startAddress) /* 與尾部上鄰 */p - size += size; /* 合并尾部節(jié)點(diǎn) */return ;q = (*empty) - next; /* 處理鏈表首節(jié)點(diǎn)的鄰接情況 */if(startAddress + size = q - startAddress) /* 與首節(jié)點(diǎn)下鄰 */q - startAddress = startAddress; /* 合并首節(jié)點(diǎn) */q - size += size;else if(startAddress + size startAddr

29、ess) /* 與首節(jié)點(diǎn)不相鄰 */makeFreeNode(&r,startAddress,size);r - next = (*empty) - next;(*empty) - next = r;else /* 處理鏈表中間的鄰接情況 */while(q - next & q-startAddress next;if(p-startAddress+p-size = startAddress & q-startAddress = startAddress+size) /* 上下鄰,合并節(jié)點(diǎn) */p-size+= size+q-size;p-next =q-next;free(q); /* 刪

30、除多余節(jié)點(diǎn) */else if(p - startAddress + p - size = startAddress & q - startAddress != startAddress + size) /*上鄰,增加節(jié)點(diǎn)的大小*/p - size += size;else if(p - startAddress + p - size != startAddress & q - startAddress = startAddress + size) /* 下鄰 */q - startAddress = startAddress; /* 修改節(jié)點(diǎn)起始地址 */q - size += size;

31、/* 修改節(jié)點(diǎn)的大小 */else /* 上下不相鄰 */makeFreeNode(&r,startAddress,size);r - next = p - next;p - next = r;void main(void)char fitMethod;FILE *fp;struct jobList *jobs;struct freeList *empty;struct usedList *used;if(used = malloc(sizeof(struct usedList) = NULL)printf(nNot enough to allocate for the used node.)

32、;errorMessage();used - next = NULL;remove(d:result.cl);makeFreeNode(&empty,0,0);while(1)char ch,step;int id,size,startAddress,status;struct jobList *q;printf(n1-Initializiation.n2-Put job into memory(allocate memory).n3-Finish job(reuse memory).n4-Show current free list.n5-Show current memory used b

33、y jobs.n6-Move fragment together.n7-Exit.);printf(nPlease select a digit to continue.n);step = getche();printf(n);switch(step)case 1:openFile(&fp,d:result.cl,a);fprintf(fp,nntInitializiation :);used - next = NULL;empty-next = NULL;iniMemory();makeFreeNode(&(empty-next),memoryStartAddress,memorySize)

34、;fprintf(fp,nnnDo you want to use your job file directly ?nDefault is N . Y/N : );printf(nnnDo you want to use your job file directly ?nDefault is N . Y/N : n);ch = getche();fprintf(fp,n%c,ch);fclose(fp);if(ch != Y& ch != y)inputJob();makeJobList(&jobs);if(ch = Y| ch = y) for(q = jobs-next;q;q = q-n

35、ext)if(q-status = 1)startAddress = allocate(&empty,q-size);if(startAddress != -1)insertUsedNode(&used,q-id,startAddress);fitMethod = selectFitMethod();break;case 2:if(memoryStartAddress 0 | memorySize next;q;q = q-next)if(q-status = 0)switch(fitMethod)case 1: order(&empty,0,0);break;case 2: order(&e

36、mpty,0,1);break; case 3: order(&empty,1,0);break;case 4: order(&empty,1,1);break;startAddress = allocate(&empty,q-size);if(startAddress != -1)insertUsedNode(&used,q-id,startAddress);updateJobStatus(&jobs,q-id,1);updateJobFile(jobs);elseshowJobList(jobs);openFile(&fp,d:result.cl,a);fprintf(fp,nPlease

37、 input a job id from above .);printf(nPlease input a job id from above .);scanf(%d,&id);fprintf(fp,%dn,id);getJobInfo(jobs,id,&size,&status);switch(status)case 0: printf(nOk !The jobs status is correct !);fprintf(fp,nOk !The jobs status is correct !);fclose(fp);break;case 1: printf(nThe job was in t

38、he memory !);fprintf(fp,nThe job was in the memory !);fclose(fp);goto label;case 2: printf(nThe job was finished !);fprintf(fp,nThe job was finished !);fclose(fp);goto label;default:printf(nUnexpected job status .Please check you job file.);fprintf(fp,nUnexpected job status .Please check you job fil

39、e.);fclose(fp);errorMessage();switch(fitMethod)case 1: order(&empty,0,0);break;case 2: order(&empty,0,1);break;case 3: order(&empty,1,0);break;case 4: order(&empty,1,1);break;startAddress = allocate(&empty,size);if(startAddress != -1)insertUsedNode(&used,id,startAddress);updateJobStatus(&jobs,id,1); updateJobFile(jobs);label : ;break;case 3:if(memoryStartAddress 0 | memorySize 1

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論