操作系統(tǒng)課程設(shè)計實驗報告--內(nèi)存的連續(xù)分配算法_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  組號 成績 </p><p><b>  計算機操作系統(tǒng)</b></p><p><b>  課程設(shè)計報告</b></p><p>  題目 內(nèi)存的連續(xù)分配算法 </

2、p><p>  專業(yè): 計算機科學(xué)與技術(shù) </p><p>  班級: </p><p>  學(xué)號姓名: </p><p>  指導(dǎo)教師: </p><p>  2016年12月 26 日<

3、;/p><p><b>  設(shè)計目的</b></p><p>  掌握內(nèi)存的里聯(lián)系分配方式的各種算法。</p><p><b>  設(shè)計內(nèi)容</b></p><p>  本系統(tǒng)模擬操作系統(tǒng)內(nèi)存分配算法的實現(xiàn),實現(xiàn)可重定位分區(qū)分配算法,采用PCB定義結(jié)構(gòu)體來表示一個進程,定義了進程的名稱和大小,進程內(nèi)存起

4、始地址和進程狀態(tài)。內(nèi)存分區(qū)表用空閑分區(qū)表的形式來模擬實現(xiàn)。</p><p><b>  設(shè)計原理</b></p><p>  動態(tài)分區(qū)的實現(xiàn)是根據(jù)進程所申請的內(nèi)存大小來決定動態(tài)的由系統(tǒng)進行分配內(nèi)存空間大小,因此分區(qū)表里的空閑分區(qū)個數(shù)是不定的,根據(jù)進程數(shù)和進程大小決定的??芍囟ㄎ环謪^(qū)算法比動態(tài)分區(qū)算法增加了緊湊的功能。</p><p><b

5、>  詳細(xì)設(shè)計及編碼</b></p><p><b>  模塊分析</b></p><p>  該實驗可分為三大部分,每一部分又由個數(shù)不同的幾個函數(shù)實現(xiàn)。第一部分是裝入作業(yè),第二部分是內(nèi)存回收,第三部分是進行緊湊。裝入作業(yè)的時候首先初始化一個鏈表,根據(jù)用戶輸入的操作代號進行相應(yīng)的操作。若用戶選擇裝入作業(yè)首先判斷空閑分區(qū)表里有沒有比作業(yè)需要的內(nèi)存大的分

6、區(qū),若有直接分配,若沒有進行緊湊操作,再將緊湊后的空閑分區(qū)與作業(yè)大小比較,若能裝的下則分配給作業(yè),若是進行緊湊后的空閑分區(qū)仍不能裝入整個作業(yè)則通知用戶內(nèi)存不夠。</p><p><b>  2、流程圖</b></p><p><b>  代碼實現(xiàn)</b></p><p>  #include<stdio.h>&

7、lt;/p><p>  #include<stdlib.h></p><p>  #include<time.h></p><p>  #include<windows.h></p><p>  #define TURE 1</p><p>  #define FALSE 0</p

8、><p>  #define OK 1</p><p>  #define ERROR 0</p><p>  #define INFEASIBLE -1</p><p>  #define OVERFLOW -2</p><p>  #define SIZE 3 </p><p><b>

9、;  //進程表</b></p><p>  int ppNo=1; //用于遞增生成進程號 </p><p>  int pLength=0;</p><p>  struct PCB</p><p><b>  {</b></p><p>  int pNo; //進

10、程號(名)</p><p>  int pSize; // 進程大小 </p><p>  int pOccupy; // 實際占用的內(nèi)存 </p><p>  int pStartAddr; // 進程起始地址 </p><p>  int pState; //進程狀態(tài) </p><p><

11、;b>  };</b></p><p>  struct PCB pList[200];</p><p>  //////////////////空閑分區(qū)表部分///////////////////////////////////////////////////// </p><p>  typedef int Status;</p>

12、<p>  typedef struct emptyNode</p><p>  { //空閑分區(qū)結(jié)構(gòu)體 </p><p>  int areaSize; //空閑分區(qū)大小 </p><p>  int aStartAddr; //空閑分區(qū)始址 </p><p>  struct emptyNode *next;</p>

13、;<p>  }emptyNode,*LinkList;</p><p>  int ListDelete(struct PCB *pList,int i);//刪除下標(biāo)為i的進程 </p><p>  void pSort(struct PCB *pList); //內(nèi)存中的進程按始址遞增排序 </p><p>  void com

14、pact(LinkList &L,struct PCB *pList);//緊湊 ,內(nèi)存中進程移動,修改進程數(shù)據(jù)結(jié)構(gòu);空閑分區(qū)合并,修改空閑分區(qū)表數(shù)據(jù)結(jié)構(gòu) </p><p>  void amalgamate(LinkList &L); //回收后進行合并空閑分區(qū) </p><p>  void recycle(LinkList &L,struc

15、t PCB *pList); //回收 ,從進程表中刪除進程 ,把釋放出的空間插入到空閑分區(qū)鏈表中 </p><p>  Status InitList(LinkList &L); ///構(gòu)造一個新的有頭節(jié)點的空鏈表L</p><p>  Status ClearList(LinkList &L); ///將鏈表L重置為空表<

16、/p><p>  Status ListInsert(LinkList &L,LinkList s1); //根據(jù)始址進行插入 </p><p>  void DeleteElem(LinkList &L,int aStartAddr);//刪除線性表中始址值為aStartAddr的結(jié)點</p><p>  void PrintList(LinkList

17、 L); //輸出各結(jié)點的值</p><p>  void creatP(struct PCB *p); ///初始化進程</p><p>  int search(LinkList &L,int pSize); //檢索分區(qū)表 ,返回合適分區(qū)的首址 </p><p>  int add(Lin

18、kList &L); //返回空閑分區(qū)總和 </p><p>  void pListPrint(struct PCB *pList); //AAA/輸出內(nèi)存中空間占用情況 </p><p>  void distribute(LinkList &L,struct PCB *process);</p><p>  

19、int ListDelete(struct PCB *pList,int i)//AAA/刪除下標(biāo)為i的進程 </p><p><b>  {</b></p><p>  for(;i<pLength-1;i++){</p><p>  pList[i]=pList[i+1];</p><p><b> 

20、 }</b></p><p>  pLength--;</p><p>  }//ListDelete</p><p>  void pSort(struct PCB *pList){ //AAA/內(nèi)存中的進程按始址遞增排序 </p><p><b>  int i,j;</b></p><

21、;p>  struct PCB temp;</p><p>  for(i=0;i<pLength-1;i++){</p><p>  for(j=0;j<pLength-i-1;j++){</p><p>  if(pList[j].pStartAddr>pList[j+1].pStartAddr){</p><p>

22、;  temp=pList[j];</p><p>  pList[j]=pList[j+1];</p><p>  pList[j+1]=temp;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }&l

23、t;/b></p><p><b>  }</b></p><p>  void compact(LinkList &L,struct PCB *pList){//AAA/緊湊 ,內(nèi)存中進程移動,修改進程數(shù)據(jù)結(jié)構(gòu);空閑分區(qū)合并,修改空閑分區(qū)表數(shù)據(jù)結(jié)構(gòu) </p><p>  printf("進行緊湊\n"); &

24、lt;/p><p>  //1、進程移動,修改進程數(shù)據(jù)結(jié)構(gòu)</p><p><b>  int i;</b></p><p>  pList[0].pStartAddr=0; //第一個進程移到最上面 </p><p>  for(i=0;i<pLength-1;i++){</p><p>  

25、pList[i+1].pStartAddr=pList[i].pStartAddr+pList[i].pOccupy;</p><p><b>  }</b></p><p>  //2、 空閑分區(qū)合并,修改空閑分區(qū)表數(shù)據(jù)結(jié)構(gòu) </p><p>  LinkList p=L->next,s;</p><p>  i

26、nt sumEmpty=0;</p><p>  while(p!=NULL)//求空閑區(qū)總和 </p><p><b>  {</b></p><p>  sumEmpty+=p->areaSize;</p><p>  p=p->next;</p><p><b>  }

27、</b></p><p>  //printf("清空前\n"); </p><p>  //PrintList(L);</p><p>  ClearList(L); //清空空閑分區(qū)表</p><p>  //printf("清空后\n"); </p><p> 

28、 //PrintList(L);</p><p>  s=(LinkList)malloc(sizeof(emptyNode));</p><p>  s->aStartAddr=pList[pLength-1].pStartAddr+pList[pLength-1].pOccupy;</p><p>  s->areaSize=sumEmpty;<

29、;/p><p>  ListInsert(L,s); </p><p>  //printf("插入后\n");</p><p>  //PrintList(L);</p><p>  //printf("\n緊湊后的>>>>\n"); </p><p> 

30、 pListPrint(pList);</p><p>  PrintList(L);</p><p><b>  }</b></p><p>  void amalgamate(LinkList &L){//AAA/回收后進行合并空閑分區(qū) </p><p>  LinkList p=L->next,q=p

31、->next;</p><p>  while(q!=NULL){</p><p>  if(p->aStartAddr+p->areaSize==q->aStartAddr){</p><p>  p->areaSize+=q->areaSize;</p><p>  DeleteElem(L,q->

32、;aStartAddr);//刪除被合并的結(jié)點</p><p>  q=p->next; </p><p><b>  }else{</b></p><p><b>  p=q;</b></p><p>  q=q->next;</p><p><b>

33、  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void recycle(LinkList &L,struct PCB *pList){//AAA/回收 ,從進程表中刪除進程 ,把釋放出的空間插入到空閑分區(qū)鏈表中 </p>

34、<p>  int index,delPNo,delPSize,delPOccupy,delPStartAddr;</p><p>  LinkList s;</p><p>  //srand(time(0));</p><p>  //index=rand()%pLength;</p><p>  printf("請

35、輸入要回收的進程號:");</p><p>  scanf("%d",&index);</p><p>  delPNo=pList[index-1].pNo;</p><p>  delPSize=pList[index-1].pSize;</p><p>  delPOccupy=pList[inde

36、x-1].pOccupy;</p><p>  delPStartAddr=pList[index-1].pStartAddr;</p><p>  // printf("________________________________________________________________________________");</p><p

37、>  ListDelete(pList,index-1);</p><p>  //pListPrint(pList);</p><p>  s=(LinkList)malloc(sizeof(emptyNode));</p><p>  s->areaSize=delPOccupy;</p><p>  s->aStart

38、Addr=delPStartAddr;</p><p>  ListInsert(L,s);</p><p>  amalgamate(L);</p><p>  pListPrint(pList);//輸出內(nèi)存中空間占用情況 </p><p>  PrintList(L);</p><p><b>  }&

39、lt;/b></p><p>  /////////////////////////////////////////////////////////////////////////////</p><p>  Status InitList(LinkList &L) //1AAA/構(gòu)造一個新的有頭節(jié)點的空鏈表L</p><p><b>  {

40、</b></p><p>  LinkList s;</p><p>  L=(LinkList)malloc(sizeof(emptyNode)); //生成新節(jié)點(頭結(jié)點)</p><p>  if(!L) return ERROR; //申請內(nèi)存失敗 </p><p>  s=(LinkList)malloc(sizeof

41、(emptyNode));</p><p>  s->areaSize=100;</p><p>  s->aStartAddr=0;</p><p>  L->next=s; //頭節(jié)點的指針域指向第一個結(jié)點 </p><p>  s->next=NULL;</p><p>  retu

42、rn OK;</p><p>  }//InitList</p><p>  Status ClearList(LinkList &L) //2AAA/將鏈表L重置為空表</p><p><b>  {</b></p><p>  LinkList p,r;</p><p>  p=

43、L->next; r=p->next;</p><p>  while(p!=NULL)</p><p><b>  {</b></p><p><b>  free(p);</b></p><p>  if(r==NULL){</p><p><b>

44、  p=NULL;</b></p><p><b>  }else{</b></p><p><b>  p=r;</b></p><p>  r=p->next;</p><p><b>  }</b></p><p><b&g

45、t;  }</b></p><p>  L->next=NULL;</p><p>  return OK;</p><p>  }//ClearList</p><p>  Status ListInsert(LinkList &L,LinkList s1) //AAA/*****根據(jù)始址進行插入 </p&g

46、t;<p><b>  {</b></p><p>  LinkList r=L,p=L->next,s;//指針 </p><p>  s=(LinkList)malloc(sizeof(emptyNode));</p><p>  s->areaSize=s1->areaSize;</p>&l

47、t;p>  s->aStartAddr=s1->aStartAddr;</p><p>  if(p==NULL){</p><p>  L->next=s;</p><p>  s->next=NULL;</p><p><b>  }else{</b></p><p&

48、gt;  while(p!=NULL)</p><p><b>  { </b></p><p>  if(s1->aStartAddr < p->aStartAddr){</p><p>  s->next=r->next;</p><p>  r->next=s;</p&

49、gt;<p><b>  break;</b></p><p><b>  }</b></p><p><b>  r=p;</b></p><p>  p=p->next; //后移 </p><p><b>  }</b></

50、p><p>  if(p==NULL){</p><p>  r->next=s;</p><p>  s->next=NULL;</p><p><b>  }</b></p><p><b>  }</b></p><p>  return

51、 OK;</p><p>  }//ListInsert2</p><p>  void DeleteElem(LinkList &L,int aStartAddr)//*****刪除線性表中始址值為aStartAddr的結(jié)點</p><p><b>  {</b></p><p>  LinkList p=L,

52、q;</p><p>  while(p->next!=NULL)</p><p><b>  {</b></p><p>  q=p->next;</p><p>  if(q->aStartAddr==aStartAddr)</p><p><b>  {</

53、b></p><p>  p->next=q->next;</p><p><b>  free(q);</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  p=p->

54、next;</p><p><b>  }</b></p><p>  }//DeleteElem</p><p>  ///////////////////////////////////////////////////////////////////////////////</p><p>  void PrintL

55、ist(LinkList L)//AAA/*****輸出各結(jié)點的值 </p><p><b>  { </b></p><p>  LinkList p=L->next;</p><p>  while(p!=NULL)</p><p><b>  {</b></p><

56、;p>  printf(" %d \t\t\t%d KB\n",p->aStartAddr,p->areaSize);</p><p>  p=p->next;</p><p><b>  }</b></p><p>  printf("\n")

57、;</p><p>  }//PrintList</p><p>  void creatP(struct PCB *p){ //AAA/初始化進程</p><p><b>  int size;</b></p><p>  //srand(time(NULL));</p><p>  //si

58、ze=rand()%7+1;</p><p>  printf("請輸入進程大小:");</p><p>  scanf("%d",&size);</p><p>  //size=10;</p><p>  p->pNo=ppNo++;</p><p>  p-&

59、gt;pSize=size;</p><p>  p->pOccupy=0;</p><p>  p->pStartAddr=0;</p><p>  p->pState=0;</p><p><b>  }</b></p><p>  int search(LinkList &

60、amp;L,int pSize){ //AAA/檢索分區(qū)表 ,返回合適分區(qū)的首址 </p><p>  LinkList p=L->next;</p><p>  while(p!=NULL)</p><p><b>  {</b></p><p>  if(p->areaSize>=pSize){&l

61、t;/p><p>  ////成功 printf("search分區(qū)%d %d\n",p->areaSize,pSize);</p><p>  return p->aStartAddr;</p><p><b>  }</b></p><p>  p=p->next;</p&g

62、t;<p><b>  }</b></p><p>  return -1;//沒有足夠大的 </p><p><b>  }</b></p><p>  int add(LinkList &L){ //AAA/返回空閑分區(qū)總和 </p><p>  LinkList p=L-

63、>next;</p><p>  int sum=0; </p><p>  while(p!=NULL)</p><p><b>  {</b></p><p>  sum+=p->areaSize;</p><p>  p=p->next;</p><p&

64、gt;<b>  }</b></p><p>  return sum;</p><p><b>  }</b></p><p>  void pListPrint(struct PCB *pList){//AAA/輸出內(nèi)存中空間占用情況 </p><p>  printf("\n進程分配

65、情況: 起始地址\t\t大小\t\t進程號\n");</p><p>  for(int i=0;i<pLength;i++){</p><p>  printf(" %d\t\t\t %d K\t\t%d \n",pList[i].pStartAddr,pList[i].pOccupy,pList[i].pN

66、o);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void distribute(LinkList &L,struct PCB *process){</p><p>  LinkList p=L->next;</p>

67、<p>  while(p!=NULL)</p><p><b>  {</b></p><p>  if(p->areaSize>=process->pSize)</p><p><b>  break;</b></p><p>  p=p->next;<

68、;/p><p><b>  }</b></p><p>  //printf("%d KB < %d KB",process->pSize,p->areaSize);////////////////////</p><p>  if(p->areaSize-process->pSize<=SI

69、ZE){</p><p>  //不用分割全部分配 (直接刪除此空閑分區(qū)結(jié)點)</p><p>  process->pStartAddr=p->aStartAddr; //進程始址變化 </p><p>  process->pState=1; //進程狀態(tài) </p><p>  process->pOccupy=p

70、->areaSize; //進程實際占用內(nèi)存 為改空閑分區(qū)的大小 </p><p>  pList[pLength++]= *process; //把進程加入進程列表 </p><p>  pSort(pList); </p><p>  pListPrint(pList);//輸出內(nèi)存中空間占用情況 </p><p>  Delete

71、Elem(L,p->aStartAddr);</p><p>  }else{//分割分配 </p><p>  process->pStartAddr=p->aStartAddr; //進程始址變化 </p><p>  process->pState=1; //進程狀態(tài) </p><p>  process->

72、;pOccupy=process->pSize; //進程實際占用內(nèi)存 為該進程的大小 </p><p>  pList[pLength++]= *process; //把進程加入進程列表 </p><p>  pSort(pList); //進程排序 </p><p>  pListPrint(pList);//輸出內(nèi)存中空間占用情況 </p>

73、<p>  p->aStartAddr+=process->pSize; //空閑分區(qū)始址變化 </p><p>  p->areaSize-=process->pOccupy; //空閑分區(qū)大小 變化 </p><p><b>  } </b></p><p><b>  }</b>

74、</p><p>  ///////////////////////////////////////////////////////</p><p>  int main(){</p><p>  struct PCB p;</p><p>  int i,num,dele,k,stAddr,flag;</p><p>

75、;  LinkList s,L;</p><p>  if(!InitList(L)) //初始化空閑分區(qū)表 </p><p>  printf("創(chuàng)建表失敗\n");</p><p><b>  while(1){</b></p><p>  printf("請選擇要進行的操作(1:裝入;

76、2:回收)");</p><p>  int flag; </p><p>  scanf("%d",&flag);</p><p>  if(flag==1){</p><p>  creatP(&p);//初始化進程</p><p>  //printf("

77、________________________________________________________________________________");</p><p>  printf("待裝入作業(yè):%d Size = %d KB\n",p.pNo,p.pSize);</p><p>  //1、請求分配 size</p>

78、<p>  //2、檢索空閑分區(qū)表(首次適應(yīng)FF)</p><p>  //PrintList(L);</p><p>  stAddr=search(L,p.pSize);//得到足夠大的分區(qū)的始址 ,沒有則返回-1 </p><p>  if(stAddr==-1){//沒有足夠大的分區(qū) </p><p>  if(add(L

79、)>=p.pSize){//空閑區(qū)總和足夠大 </p><p>  // printf("沒有足夠大的空閑分區(qū)但空閑總和足夠大\n"); </p><p><b>  //緊湊</b></p><p>  compact(L,pList); </p><p>  //按動態(tài)分區(qū)方式分配</

80、p><p>  distribute(L,&p);</p><p>  PrintList(L);</p><p>  //compact(L,pList); //緊湊</p><p>  }else{ //空閑區(qū)總和不足 </p><p>  printf("分配失敗\n\n"); </

81、p><p><b>  } </b></p><p>  }else{//有足夠大的 </p><p>  distribute(L,&p);</p><p>  PrintList(L);</p><p>  //compact(L,pList); //緊湊 </p><

82、p><b>  } </b></p><p>  }else{//回收 </p><p>  if(pLength>0){</p><p>  recycle(L,pList);</p><p>  //compact(L,pList); //緊湊 </p><p><b>

83、  }else{</b></p><p>  printf("無可回收內(nèi)存! "); </p><p><b>  } </b></p><p><b>  } </b></p><p>  //system("pause");</p&

84、gt;<p>  // scanf("%d")</p><p><b>  } //while</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  四、結(jié)果及其相關(guān)分析&l

85、t;/p><p>  結(jié)果分析:連續(xù)進行4次裝入的操作后內(nèi)存中還剩30K的空間,接著進行一次回收內(nèi)存的操作,回收作業(yè)1后不連續(xù)的空閑內(nèi)存共有50K,接著再裝入一個35K的作業(yè),分散的兩個分區(qū)都不能裝入作業(yè),但是總和可以裝入,所以先進行緊湊再分配,重新分配后還剩15K的內(nèi)存。</p><p><b>  五、實驗總結(jié)</b></p><p>  通過

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論