2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

6、區(qū),若有直接分配,若沒有進(jìn)行緊湊操作,再將緊湊后的空閑分區(qū)與作業(yè)大小比較,若能裝的下則分配給作業(yè),若是進(jìn)行緊湊后的空閑分區(qū)仍不能裝入整個(gè)作業(yè)則通知用戶內(nèi)存不夠。</p><p><b>  2、流程圖</b></p><p><b>  代碼實(shí)現(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、;  //進(jìn)程表</b></p><p>  int ppNo=1; //用于遞增生成進(jìn)程號(hào) </p><p>  int pLength=0;</p><p>  struct PCB</p><p><b>  {</b></p><p>  int pNo; //進(jìn)

10、程號(hào)(名)</p><p>  int pSize; // 進(jìn)程大小 </p><p>  int pOccupy; // 實(shí)際占用的內(nèi)存 </p><p>  int pStartAddr; // 進(jìn)程起始地址 </p><p>  int pState; //進(jìn)程狀態(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的進(jìn)程 </p><p>  void pSort(struct PCB *pList); //內(nèi)存中的進(jìn)程按始址遞增排序 </p><p>  void com

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

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

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

17、 L); //輸出各結(jié)點(diǎn)的值</p><p>  void creatP(struct PCB *p); ///初始化進(jìn)程</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的進(jìn)程 </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)存中的進(jìn)程按始址遞增排序 </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)存中進(jìn)程移動(dòng),修改進(jìn)程數(shù)據(jù)結(jié)構(gòu);空閑分區(qū)合并,修改空閑分區(qū)表數(shù)據(jù)結(jié)構(gòu) </p><p>  printf("進(jìn)行緊湊\n"); &

24、lt;/p><p>  //1、進(jìn)程移動(dòng),修改進(jìn)程數(shù)據(jù)結(jié)構(gòu)</p><p><b>  int i;</b></p><p>  pList[0].pStartAddr=0; //第一個(gè)進(jìn)程移到最上面 </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/回收后進(jìn)行合并空閑分區(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é)點(diǎn)</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/回收 ,從進(jìn)程表中刪除進(jìn)程 ,把釋放出的空間插入到空閑分區(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("請(qǐng)

35、輸入要回收的進(jìn)程號(hào):");</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)造一個(gè)新的有頭節(jié)點(diǎn)的空鏈表L</p><p><b>  {

40、</b></p><p>  LinkList s;</p><p>  L=(LinkList)malloc(sizeof(emptyNode)); //生成新節(jié)點(diǎn)(頭結(jié)點(diǎn))</p><p>  if(!L) return ERROR; //申請(qǐng)內(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é)點(diǎn)的指針域指向第一個(gè)結(jié)點(diǎn) </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ù)始址進(jìn)行插入 </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é)點(diǎn)</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é)點(diǎn)的值 </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/初始化進(jìn)程</p><p><b>  int size;</b></p><p>  //srand(time(NULL));</p><p>  //si

58、ze=rand()%7+1;</p><p>  printf("請(qǐng)輸入進(jìn)程大?。?quot;);</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進(jìn)程分配

65、情況: 起始地址\t\t大小\t\t進(jìn)程號(hào)\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é)點(diǎn))</p><p>  process->pStartAddr=p->aStartAddr; //進(jìn)程始址變化 </p><p>  process->pState=1; //進(jìn)程狀態(tài) </p><p>  process->pOccupy=p

70、->areaSize; //進(jìn)程實(shí)際占用內(nèi)存 為改空閑分區(qū)的大小 </p><p>  pList[pLength++]= *process; //把進(jìn)程加入進(jìn)程列表 </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; //進(jìn)程始址變化 </p><p>  process->pState=1; //進(jìn)程狀態(tài) </p><p>  process->

72、;pOccupy=process->pSize; //進(jìn)程實(shí)際占用內(nèi)存 為該進(jìn)程的大小 </p><p>  pList[pLength++]= *process; //把進(jìn)程加入進(jìn)程列表 </p><p>  pSort(pList); //進(jìn)程排序 </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("請(qǐng)選擇要進(jìn)行的操作(1:裝入;

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

77、________________________________________________________________________________");</p><p>  printf("待裝入作業(yè):%d Size = %d KB\n",p.pNo,p.pSize);</p><p>  //1、請(qǐng)求分配 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>  //按動(dòng)態(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ù)進(jìn)行4次裝入的操作后內(nèi)存中還剩30K的空間,接著進(jìn)行一次回收內(nèi)存的操作,回收作業(yè)1后不連續(xù)的空閑內(nèi)存共有50K,接著再裝入一個(gè)35K的作業(yè),分散的兩個(gè)分區(qū)都不能裝入作業(yè),但是總和可以裝入,所以先進(jìn)行緊湊再分配,重新分配后還剩15K的內(nèi)存。</p><p><b>  五、實(shí)驗(yàn)總結(jié)</b></p><p>  通過

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論