課程設計java計時器和操作系統(tǒng)頁面置換_第1頁
已閱讀1頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  專業(yè)課程設計I</b></p><p>  題 目:《Java語言課程設計》和《操作系統(tǒng)課程設計》</p><p>  專 業(yè) 計算機科學與技術 </p><p>  學 生 姓 名 </p><p>  班 級 學 號

2、 </p><p>  指 導 教 師 </p><p>  指 導 單 位 </p><p>  日 期 2013/06/27 </p><p><b>  題目1數字式定時器</b></

3、p><p><b>  課題內容和要求</b></p><p>  計時器操作是周期性像實際生活中的秒表。創(chuàng)建一個計時器,確定計時器每隔幾毫秒“震鈴”一次,創(chuàng)建一個監(jiān)視器,計時器發(fā)生的震鈴事件是actionEvent類型的事件。當震鈴事件發(fā)生時,監(jiān)視器就會監(jiān)視到這個事件,就會執(zhí)行ActionListner中的方法actionPerformed。</p>&l

4、t;p>  計時器創(chuàng)建后,但觸發(fā)事件時調用到觸發(fā)事件的函數,然后調用thread線程中的start()方法后,一旦輪到它共享cpu資源,目標對象就會自動調用run()方法就是接口回調。</p><p>  需要用SWING設計簡單界面用于設定定時時間、開始、結束和暫停功能。單擊“開始”按鈕啟動計時器,時間開始計時。單擊“暫停”按鈕計時器停止計時,單擊“繼續(xù)”按鈕繼續(xù)計時。單擊“重設”按鈕時間清零。</

5、p><p>  首先要完成程序外觀界面的設計,其中包括創(chuàng)建窗體,在窗體中添加菜單、工具欄及多種GUI組件,設置各類組件的大小、位置、顏色等屬性。這個層次的工作可以認為是對程序靜態(tài)特征的設置。其次要為各種組件對象提供響應與處理不同事件的功能支持,從而使程序具備與用戶或外界事物交互的能力,使得程序“活”了起來。這個層次的工作可以認為是對程序動態(tài)特征的處理。</p><p><b>  概

6、要設計 </b></p><p>  1.程序設計的基本思想</p><p>  單擊“開始”按鈕啟動計時器,時間開始計時。單擊“暫?!卑粹o計時器停止計時,單擊“繼續(xù)”按鈕繼續(xù)計時。單擊“重設”按鈕時間清零。</p><p><b>  圖表 1</b></p><p>  2. 應為用SWING設計簡單界

7、面用于設定定時時間、開始、結束和暫停功能。Swing 的三個基本構造塊:標簽、按鈕和文本字段;但是現在需要個地方安放它們,并希望用戶知道如何處理它們。所以JFrame 類就是解決這個問題的——它是一個容器,允許 把其他組件添加到它里面,把它們組織起來,并把它們呈現給用戶。</p><p>  在此實驗中用到Jframe用到的主件有Button是按鈕,Label是標簽,用setLayout來設置標題,用setBou

8、nds()來設定按鈕的位置。</p><p><b>  圖表 2</b></p><p><b>  代碼段實現:</b></p><p>  start=new Button("開始");</p><p>  stop=new Button("停止")

9、;</p><p>  reset=new Button("重置");</p><p>  jixu=new Button("繼續(xù)");</p><p>  desplay=new Label();</p><p>  this.setLayout(null);//默認布局</p>

10、;<p>  this.setTitle("計時器");//設置標題</p><p>  desplay.setBounds(0,30,200,50);</p><p>  start.setBounds(0,80,50,50);</p><p>  stop.setBounds(60,80,50,50);</p&

11、gt;<p>  jixu.setBounds(120,80,50,50);</p><p>  reset.setBounds(180,80,50,50);</p><p>  refresh();//刷新</p><p>  add(desplay);//條件主件按鈕</p><p>  add(start);&l

12、t;/p><p>  add(stop);</p><p>  add(reset);</p><p>  add(jixu);</p><p>  setSize(300,200);//設置窗口的大小</p><p>  setVisible(true); //窗口可見</p><p> 

13、 3.實驗中運用到線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執(zhí)行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統(tǒng)獨立調度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創(chuàng)建和撤消另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行。

14、由于線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態(tài)。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。下面是狀態(tài)的關系:</p><p><b>  圖表 3</b></p><p><b>  4.事件的監(jiān)聽</b></p><p>  事件表達了系統(tǒng)、應用程序及用戶

15、之間的動作和響應。利用事件機制實現用戶與程序之間的交互。java.awt.event包中定義了11個監(jiān)聽者接口,每個接口內部包含了若干處理相關事件的抽象方法。一般說來,每個事件類都有一個監(jiān)聽者接口與之相對應,而事件類中的每個具體事件類型都有一個具體的抽象方法與之相對應,當具體事件發(fā)生時,這個事件將被封裝成一個事件類的對象作為實際參數傳遞給與之對應的具體方法,由這個具體方法負責響應并處理發(fā)生的事件。ActionEvent類事件對應的接口是

16、ActionListener。處理ActionEvent事件的類都必須實現ActionListener接口,實現ActionListener接口就必須重載上述的actionPerformed()方法,在重載的方法體中,通常需要調用參數e的有關方法。</p><p><b>  代碼段:</b></p><p>  public class d extends JFra

17、me implements Runnable,ActionListener{</p><p>  start.addActionListener(this);</p><p>  stop.addActionListener(this);</p><p>  reset.addActionListener(this);</p><p>

18、;  jixu.addActionListener(this);</p><p>  this.addWindowListener(new WindowAdapter(){</p><p>  public void windowClosing(WindowEvent e){</p><p>  System.exit(0);}</p><

19、;p><b>  });}</b></p><p>  事件產生和處理的流程如下:</p><p><b>  圖表 4</b></p><p><b>  詳細設計 </b></p><p>  public class d extends JFrame imple

20、ments Runnable,ActionListener{//實現Runnable,acitonListenr接口</p><p>  private int minutes;</p><p>  private static double seconds;</p><p>  private Thread mb;</p><p>  p

21、rivate boolean isRun;</p><p>  private Button start,stop,reset,jixu;</p><p>  private Label desplay; //成員變量的定義</p><p><b>  d(){</b><

22、/p><p>  start=new Button("開始");</p><p>  stop=new Button("停止");</p><p>  reset=new Button("重置"); </p><p>  jixu=new Button("繼續(xù)"

23、;); </p><p>  desplay=new Label(); //創(chuàng)建主件按鈕和標簽</p><p>  this.setLayout(null);</p><p>  desplay.setBounds(0,30,200,50);</p><p

24、>  start.setBounds(0,80,50,50);</p><p>  stop.setBounds(60,80,50,50);</p><p>  jixu.setBounds(120,80,50,50);</p><p>  reset.setBounds(180,80,50,50);</p><p>  re

25、fresh();</p><p>  add(desplay);</p><p>  add(start);</p><p>  start.addActionListener(this);</p><p>  stop.addActionListener(this);</p><p>  reset.a

26、ddActionListener(this);</p><p>  jixu.addActionListener(this); // 實現觸發(fā)事件的</p><p>  add(stop);</p><p>  add(reset);</p><p>  add(jixu);</p><p> 

27、 setSize(300,200);</p><p>  setVisible(true); </p><p>  this.addWindowListener(new WindowAdapter(){</p><p>  public void windowClosing(WindowEvent e){</p><p>  Sy

28、stem.exit(0);}</p><p><b>  });</b></p><p><b>  } </b></p><p>  public static void main(String[] args) </p><p><b>  { </b>

29、;</p><p>  new d(); </p><p><b>  } </b></p><p>  public void run(){ </p><p>  while(isRun){ </p><p><b>  try{ </b><

30、/p><p>  seconds+=0.001; </p><p>  Thread.sleep(50); //睡眠50ms</p><p>  if(seconds>59){ </p><p>  seconds=0; </p><p>  minutes=minutes+1; //改變

31、秒針</p><p>  System.out.print(minutes); </p><p><b>  } </b></p><p>  refresh(); </p><p>  }catch(Exception e){</p><p><b>  } &l

32、t;/b></p><p><b>  } </b></p><p><b>  } </b></p><p>  public void actionPerformed(ActionEvent e){ //事件的執(zhí)行</p><p>  if(e.getActionC

33、ommand().equals("開始"))</p><p><b>  { </b></p><p>  startCount(); //調用此函數</p><p><b>  } </b></p><p>  else if(e.getAction

34、Command().equals("停止"))</p><p><b>  { </b></p><p>  stopCount(); //調用此函數</p><p><b>  }</b></p><p>  else if(e.getActionCommand

35、().equals("繼續(xù)"))</p><p><b>  { </b></p><p>  startCount(); / /調用此函數 </p><p>  } </p><p>  else{ </p><p>  rese

36、t(); //調用此函數</p><p><b>  } </b></p><p><b>  } </b></p><p>  public void refresh(){ </p><p>  desplay.setText(toString()); </p&g

37、t;<p><b>  } </b></p><p>  public void startCount(){ </p><p>  if(!isRun){ </p><p>  isRun=true; </p><p>  mb=new Thread(this); <

38、;/p><p>  mb.start(); //開始進程</p><p><b>  } </b></p><p><b>  } </b></p><p>  public void stopCount(){ </p><p>  if(isRun

39、){ </p><p>  isRun=false; </p><p><b>  } </b></p><p><b>  } </b></p><p>  public void reset(){ </p><p>  isRun=false; <

40、/p><p>  minutes=0; </p><p>  seconds=0; </p><p>  refresh(); </p><p><b>  } </b></p><p>  public int getMinute(){ </p><p>

41、  return minutes; </p><p><b>  } </b></p><p>  public double getSecond()</p><p><b>  { </b></p><p>  return seconds; </p><p

42、><b>  } </b></p><p>  public int getTotalTime()</p><p><b>  { </b></p><p>  return minutes+(int)(seconds*100); </p><p><b>  } <

43、;/b></p><p>  public String toString(){ </p><p>  return ""+minutes+":"+(int)seconds+":"+(int)((seconds-(int)seconds)*100); //顯示</p><p><b>

44、;  }</b></p><p><b>  }</b></p><p>  測試數據及其結果分析</p><p>  1.點擊開始按鈕開始計時</p><p>  圖表 5點擊開始按鈕</p><p>  2.點擊停止,暫停計時</p><p>  圖表 6點

45、擊停止按鈕</p><p>  3.點擊繼續(xù),繼續(xù)計時</p><p>  圖表 7點擊繼續(xù)按鈕</p><p><b>  4.點擊重置,清零</b></p><p>  圖表 8點擊重置按鈕</p><p><b>  五、課程設計總結</b></p>&l

46、t;p><b>  總結內容包括:</b></p><p>  1)設計過程中的問題</p><p>  關于計時器像秒表一樣增加,一開始是獲得的本機的時間來計時的,但是不符合條件。所以運用本機時間來計算,所以時分秒之間的轉換倍數要十分的清昕。不懂監(jiān)聽事件時怎么點擊按鈕也不會運行,每隔按鈕都要實現監(jiān)聽事件中的addActionListener事件。老師問線程和進

47、程的概念和區(qū)別沒回答出來,現在回答一下:</p><p>  進程是表示資源分配的基本單位,又是調度運行的基本單位。進程調度程序選中它,為它分配CPU以及其它有關資源,該進程才真正運行。所以,進程是系統(tǒng)中的并發(fā)執(zhí)行的單位。線程是進程中執(zhí)行運算的最小單位,亦即執(zhí)行處理機調度的基本單位。如果把進程理解為在邏輯上操作系統(tǒng)所完成的任務,那么線程表示完成該任務的許多可能的子任務之一。線程可以在處理器上獨立調度執(zhí)行,這樣,在

48、多處理器環(huán)境下就允許幾個線程各自在單獨處理器上進行。操作系統(tǒng)提供線程就是為了方便而有效地實現這種并發(fā)性 </p><p><b>  引入線程的好處 </b></p><p><b> ?。?)易于調度。 </b></p><p> ?。?)提高并發(fā)性。 </p><p><b> ?。?

49、)開銷少。 </b></p><p>  (4)利于充分發(fā)揮多處理器的功能。 </p><p><b>  它們的主要區(qū)別是:</b></p><p>  (1)一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程。 </p><p>  (2)資源分配給進程,同一進程的所有線程共享該進程的所

50、有資源。 </p><p>  (3)處理機分給線程,即真正在處理機上運行的是線程。 </p><p> ?。?)線程在執(zhí)行過程中,需要協(xié)作同步。不同進程的線程間要利用消息通信的辦法實現同步。</p><p>  (2)課程設計過程的收獲和感受。</p><p>  課程設計經過了兩個星期的不懈努力,終于交出了一份程序和文檔,在這里要深深的感

51、謝老師。雖然最后交上的程序不是很完美的,但是在這個過程中我通過用心的去學和去做,能夠把事件、事件源和事件監(jiān)聽器三者的關系形象的理解為某條娛樂新聞、明星與記者之間的關系,還明白了線程該如何創(chuàng)建、Java中一些常用類的使用方法等基礎內容和一些難點。但是我最后答辯被老師批的很慘,我想說的是java是我自己一個一個字母敲上去的。我覺得這次java課程設計學的東西還是蠻多的。再次謝謝老師的教訓,在此后我會銘記的。</p><p

52、>  題目2虛擬存儲中頁面調度算法LRU的模擬實現</p><p><b>  課題內容和要求</b></p><p>  學習虛擬存儲機制中頁面調度算法,通過編程模擬實現頁面調度的LRU算法(最近最久未使用置換算法)。</p><p>  頁面置換算法是指在需要調入頁面且內存已滿時,確定將要換出頁面的算法。置換算法的好壞直接影響系統(tǒng)的性

53、能,不適當得算法可能導致進程發(fā)生“抖動”,又稱“顛簸”。LRU算法就是過去一段時間內不曾訪問過的頁面,在最近的將來也不會再訪問。該算法中必須記錄頁面使用時間的情況,所以算法賦予每個頁面一個訪問的字段,用來記錄頁面自上次被訪問以來經歷的時間,實際使用中常采用移位寄存器或棧來幫助實現。如果采用移位寄存器,進程訪問頁面時,該頁面上的移位寄存器左邊最高位置1,定期右移并在最高位補0,寄存器最小的頁面先淘汰。若采用棧來保存當前使用的各個頁面的頁號

54、,則被訪問的頁面從棧頂往下移動,棧底的頁面就是下一個將要淘汰的頁面。</p><p>  LRU置換算法雖然是一種比較好的算法,但要求系統(tǒng)有較多的支持硬件。為了了解一個進程在內存中的各個頁面各有多少時間未被進程訪問,以及如何快速地知道哪一頁是最近最久未使用的頁面,須有以下兩類硬件之一的支持:寄存器和棧。 </p><p><b>  二、概要設計 </b></

55、p><p><b>  1、調頁策略 </b></p><p><b>  1)何時調入頁面 </b></p><p>  如果進程的許多頁是存放在外存的一個連續(xù)區(qū)域中,則一次調入若干個相鄰的頁,會比一次調入一頁的效率更高效一些。但如果調入的一批頁面中的大多數都未被訪問,則又是低效的??刹捎靡环N以預測為基礎的預調頁策略,將那些

56、預計在不久之后便會被訪問的頁面,預先調入內存。如果預測較準確,那么,這種策略顯然是很有吸引力的。</p><p><b>  2)請求調頁策略 </b></p><p>  當進程在運行中需要訪問某部分程序和數據時,若發(fā)現其所在的頁面不在內存,便即提出請求,由OS將其所需頁面調入內存。由請示調頁策略所確定調入的頁,是一定會被訪問的,再加之請求調頁策略比較易于實現,故在

57、目前的虛擬存儲器中,大多采用此策略。</p><p>  2、從何處調入頁面 </p><p>  在請求分頁系統(tǒng)中的外存分為兩部分:用于存放文件的文件區(qū)和用于存放對換頁面的對換區(qū)。通常,由于對換區(qū)是采用連續(xù)分配方式,而事件是采用離散分配方式,故對換區(qū)的磁盤I/O速度比文件區(qū)的高。 </p><p><b>  3頁面調入過程 </b>

58、;</p><p>  每當程序所要訪問的頁面未在內存時, 便向CPU發(fā)出一缺頁中斷,中斷處理程序首先保留CPU環(huán)境,分析中斷原因后,轉入缺頁中斷處理程序。該程序通過查找頁表,得到該頁在外在原物理 塊后,如果此時內存能容納新頁,則啟動磁盤I/O將所缺之頁調入內存,然后修改頁表。如果內存已滿,則須先按照某種置換算法從內存中選出一頁準備換出;如果該頁未被修改過,可不必將該頁寫回磁盤;但如果此頁已被修改,則必須將它寫回

59、磁盤,然后再把所缺的頁調入內存,并修改頁表中的相應表項,置其存在位“1”,并將此頁表項寫入快表中。在缺頁調入內存后,利用修改后的頁表,去形成所要訪問數據的物理地址,再去訪問內存數據。整個頁面的調入過程對用戶是透明的。 </p><p><b>  2流程圖</b></p><p>  1)LRU置換算法處理的流程圖</p><p><b&

60、gt;  圖表 9</b></p><p>  2)LRU置換內部流程圖</p><p><b>  圖表 10</b></p><p>  3. 最近久未使用(LRU)置換算法的思路</p><p>  最近久未使用置換算法的替換規(guī)則,是根據頁面調入內存后的使用情況來進行決策的。該算法賦予每個頁面一個訪問字

61、段,用來記錄一個頁面自上次被訪問以來所經歷的時間,當需淘汰一個頁面的時候選擇現有頁面中其時間值最大的進行淘汰。</p><p><b>  1)算法的事例:</b></p><p><b>  圖表 11</b></p><p><b>  2)代碼的實現是:</b></p><p

62、>  if(memoryn==4)</p><p><b>  {</b></p><p>  for(i=3;i<pagen;i++)</p><p><b>  {</b></p><p>  if((pagememory[0]!=pagenumber[i])&&(p

63、agememory[1]!=pagenumber[i])</p><p>  &&(pagememory[2]!=pagenumber[i]))</p><p><b>  {</b></p><p>  pagememory[3]=pagenumber[i];</p><p><b>  no

64、w=i+1;</b></p><p><b>  want=4;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  } </b></p><p>

65、;  通過memoryn數來對物理塊來賦值,用if語句來看數據是否重復。通過want來計算缺頁數,now 來計算中斷。</p><p>  for(j=now;j<pagen;j++)</p><p><b>  {</b></p><p>  if((pagenumber[j]!=pagememory[0])&&(pag

66、enumber[j]!=pagememory[1])</p><p>  &&(pagenumber[j]!=pagememory[2])</p><p>  &&(pagenumber[j]!=pagememory[3])</p><p>  &&(pagenumber[j]!=pagememory[4]))<

67、/p><p><b>  {</b></p><p>  if(times[0]<=times[1])</p><p><b>  {</b></p><p>  max=times[1];</p><p><b>  }</b></p>

68、<p><b>  else </b></p><p><b>  {</b></p><p>  max=times[0];</p><p><b>  }</b></p><p>  if(max<=times[2])</p><p&g

69、t;<b>  {</b></p><p>  max=times[2];</p><p><b>  }</b></p><p>  if(max<=times[3])</p><p><b>  {</b></p><p>  max=time

70、s[3];</p><p><b>  }</b></p><p>  if(max<=times[4])</p><p><b>  {</b></p><p>  max=times[4];</p><p>  } </p>&

71、lt;p>  If語句中來判斷數是否是最近最近未置換time來計算數有多長時間沒有使用,把最大的值置換掉。</p><p><b>  三、詳細設計 </b></p><p>  實現課題主要功能的源程序:</p><p>  #include <stdio.h> //頭文件</p><p

72、>  #include <time.h> //</p><p>  #include <stdlib.h> //產生隨機數所需要的頭文件</p><p><b>  main()</b></p><p><b>  {</b></p><p&

73、gt;  int pagen;</p><p>  int memoryn; //可用內存塊數為memoryn,頁面長度為pagen,</p><p>  short times[5]={0,0,0,0,0}; //時間軸數組</p><p>  short pagenumber[20]={0};

74、 //控制頁面走向數組</p><p>  short pagememory[5]={0,0,0,0,0}; //物理塊數組</p><p>  int i; //控制變量為i </p><p>  int want=0; //want為缺頁數</p><p

75、>  int now; //中斷數 </p><p>  printf("\n\n請輸入您要求的內存塊數量(范圍為3至5):");</p><p>  scanf("%d",&memoryn);</p><p>  if(memoryn<3||memoryn&g

76、t;5)</p><p><b>  {</b></p><p>  printf("\n\n對不起,您的輸入有誤,請重新輸入:");</p><p>  scanf("%d",&memoryn);</p><p><b>  }</b></p&

77、gt;<p>  printf("\n\n請輸入您要求的頁面長度(范圍為10至20):");</p><p>  scanf("%d",&pagen);</p><p>  if(pagen<10||pagen>20)</p><p><b>  {</b></p&

78、gt;<p>  printf("\n\n對不起,您的輸入有誤,請重新輸入:");</p><p>  scanf("%d",&pagen);</p><p><b>  }</b></p><p>  srand(time(NULL));</p><p> 

79、 for(i=0;i<pagen;i++)</p><p><b>  {</b></p><p>  pagenumber[i]=rand()%9+1;</p><p>  printf("%2d ",pagenumber[i]);</p><p><b>  }</b>

80、</p><p>  printf("\n"); </p><p>  pagememory[0]=pagenumber[0];//對第一個物理塊進行賦值</p><p>  printf("第 %2d 步: ",i=1); </p><p>  f

81、or(i=0;i<memoryn;i++)</p><p><b>  {</b></p><p>  printf(" %2d",pagememory[i]);</p><p><b>  }</b></p><p>  printf("\n");&

82、lt;/p><p>  for(i=1;i<pagen;i++)</p><p><b>  {</b></p><p>  if(pagememory[0]!=pagenumber[i])</p><p><b>  {</b></p><p>  pagememory[

83、1]=pagenumber[i];</p><p><b>  now=i+1;</b></p><p><b>  break;</b></p><p><b>  } </b></p><p>  } //對第二個物理

84、塊進行賦值</p><p>  printf("第 %2d 步: ",now);</p><p>  for(i=0;i<memoryn;i++)</p><p><b>  {</b></p><p>  printf(" %2d",pagememory[i]);<

85、;/p><p><b>  }</b></p><p>  printf("\n"); </p><p>  for(i=2;i<pagen;i++)</p><p><b>  {</b></p><p>  if((pagememory[0]!=p

86、agenumber[i])&&(pagememory[1]!=pagenumber[i]))</p><p><b>  {</b></p><p>  pagememory[2]=pagenumber[i];</p><p><b>  now=i+1;</b></p><p>&

87、lt;b>  break;</b></p><p><b>  }</b></p><p>  } //對第三個物理塊進行賦值</p><p>  want=3; //此時可以將缺頁值暫定為3</p><p>  

88、printf("第 %2d 步: ",now);</p><p>  for(i=0;i<memoryn;i++)</p><p><b>  {</b></p><p>  printf(" %2d",pagememory[i]);</p><p><b> 

89、 }</b></p><p>  printf("\n");</p><p>  if(memoryn==4)</p><p><b>  {</b></p><p>  for(i=3;i<pagen;i++)</p><p><b>  {<

90、;/b></p><p>  if((pagememory[0]!=pagenumber[i])&&(pagememory[1]!=pagenumber[i])</p><p>  &&(pagememory[2]!=pagenumber[i]))</p><p><b>  {</b></p>

91、<p>  pagememory[3]=pagenumber[i];</p><p><b>  now=i+1;</b></p><p><b>  want=4;</b></p><p><b>  break;</b></p><p><b>  

92、}</b></p><p><b>  } </b></p><p>  printf("第 %2d 步: ",now);</p><p>  for(i=0;i<memoryn;i++)</p><p><b>  {</b></p><

93、p>  printf(" %2d",pagememory[i]);</p><p><b>  }</b></p><p>  printf("\n");</p><p>  } //如果為四個物理塊,則為第四個物理塊賦值</p>&l

94、t;p>  if(memoryn==5)</p><p><b>  {</b></p><p>  for(i=3;i<pagen;i++)</p><p><b>  {</b></p><p>  if((pagememory[0]!=pagenumber[i])&&

95、;(pagememory[1]!=pagenumber[i])</p><p>  &&(pagememory[2]!=pagenumber[i]))</p><p><b>  {</b></p><p>  pagememory[3]=pagenumber[i];</p><p><b> 

96、 now=i+1;</b></p><p><b>  want=4;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p&

97、gt;  printf("第 %2d 步: ",now);</p><p>  for(i=0;i<memoryn;i++)</p><p><b>  {</b></p><p>  printf(" %2d",pagememory[i]);</p><p><b

98、>  }</b></p><p>  printf("\n"); </p><p>  for(i=4;i<pagen;i++)</p><p><b>  {</b></p><p>  if((pagememory[0]!=pagenumber[i])&&(

99、pagememory[1]!=pagenumber[i])</p><p>  &&(pagememory[2]!=pagenumber[i])</p><p>  &&(pagememory[3]!=pagenumber[i]))</p><p><b>  {</b></p><p>

100、  pagememory[4]=pagenumber[i];</p><p><b>  now=i+1;</b></p><p><b>  want=5;</b></p><p><b>  break;</b></p><p><b>  }</b>

101、</p><p><b>  } </b></p><p>  //如果為五個物理塊,則為第四個物理塊賦值</p><p>  printf("第 %2d 步: ",now);</p><p>  for(i=0;i<memoryn;i++)</p><p>&

102、lt;b>  {</b></p><p>  printf(" %2d",pagememory[i]);</p><p><b>  }</b></p><p>  printf("\n"); </p><p><b>  }</b><

103、;/p><p>  int needchange; //頁面置換發(fā)生時要進行置換的物理塊塊號</p><p>  int mn=memoryn; //為時間軸賦初值所用到的物理塊數</p><p>  int max; //最大的時間值</p><p>  int j; //控制變量i.j</p>&

104、lt;p>  for(i=0;i<memoryn;i++)</p><p><b>  {</b></p><p><b>  mn--;</b></p><p>  times[i]=mn;</p><p>  } //給時間軸數組設定初值</p>

105、;<p>  for(j=now;j<pagen;j++)</p><p><b>  {</b></p><p>  if((pagenumber[j]!=pagememory[0])&&(pagenumber[j]!=pagememory[1])</p><p>  &&(pagenumb

106、er[j]!=pagememory[2])</p><p>  &&(pagenumber[j]!=pagememory[3])</p><p>  &&(pagenumber[j]!=pagememory[4]))</p><p><b>  {</b></p><p>  if(tim

107、es[0]<=times[1])</p><p><b>  {</b></p><p>  max=times[1];</p><p><b>  }</b></p><p><b>  else </b></p><p><b>  

108、{</b></p><p>  max=times[0];</p><p><b>  }</b></p><p>  if(max<=times[2])</p><p><b>  {</b></p><p>  max=times[2];</p&g

109、t;<p><b>  }</b></p><p>  if(max<=times[3])</p><p><b>  {</b></p><p>  max=times[3];</p><p><b>  }</b></p><p>

110、;  if(max<=times[4])</p><p><b>  {</b></p><p>  max=times[4];</p><p>  } //確定時間軸數組里儲存的最大時間</p><p>  for(i=0;i<memoryn;i++)</p><p&g

111、t;<b>  {</b></p><p>  if(max==times[i])</p><p><b>  {</b></p><p>  needchange=i;</p><p><b>  break;</b></p><p><b>

112、;  }</b></p><p>  } //提取出最大時間也就是先進入的頁面所對應的物理塊號</p><p>  pagememory[needchange]=pagenumber[j];</p><p>  for(i=0;i<memoryn;i++)</p><p><b>  {</

113、b></p><p>  if(i==needchange)</p><p><b>  {</b></p><p>  times[i]=0;</p><p><b>  }</b></p><p><b>  else</b></p>

114、;<p><b>  {</b></p><p>  times[i]++;</p><p><b>  }</b></p><p>  } //更新時間軸</p><p>  want++; //缺頁數進行自增運算</p><p&g

115、t;  printf("第 %2d 步: ",j+1);</p><p>  for(i=0;i<memoryn;i++)</p><p><b>  {</b></p><p>  printf(" %2d",pagememory[i]);</p><p><b&

116、gt;  }</b></p><p>  printf("\n"); </p><p><b>  } </b></p><p><b>  else</b></p><p><b>  {</b></p><p>  f

117、or(i=0;i<memoryn;i++)</p><p><b>  {</b></p><p>  if(pagenumber[j]==pagememory[i])</p><p><b>  {</b></p><p>  times[i]=0;</p><p>

118、<b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  times[i]++;</p><p><b>  }</b></p><p><b>  

119、}</b></p><p>  } //出線相同頁面只把時間軸自增一,不做其他操作</p><p><b>  } </b></p><p>  printf("\n\n LRU頁面置換次數為: %d\n",want);</p><p><b> 

120、 }</b></p><p>  測試數據及其結果分析</p><p>  1.當內存塊數量是3,頁面長度是10</p><p><b>  圖表 12</b></p><p>  1.當內存塊數量是5,頁面長度是15</p><p><b>  圖表 13</b>

121、;</p><p><b>  五、課程設計總結</b></p><p><b>  總結內容包括:</b></p><p>  (1)課程設計過程中的問題</p><p>  因為頁面走向的數字不是遞增或遞減排序的,所以數據時混亂的。要對頁面走向的數據進行比較,來判斷是否已經使用過。要判斷,想要知

122、道這個數是否是最近最久未使用的數,在程序中使用time數組來計算它有多長時間沒有使用,把給max值來進行比較。</p><p> ?。?)課程設計過程的收獲和感受。</p><p>  頁面置換算法的思想可以說比較簡單,易懂。但是在實現的時候,就沒那么容易了。 “實現算法”與“模擬算法”的區(qū)別,一開始我只是在“實現算法”,就是把數據給運算出來,顯示在界面上,但是后來發(fā)現這樣根本就不是“模擬

123、算法”,最重要的一個數據結構——物理塊中保存的頁,我卻沒有去定義它。于是我重新構建數據結構,但是之前運算的方法完全可以拿來使用,只是改改細節(jié)而已。進程分得的內存塊數多,則缺頁中斷率就低,反之,缺頁中斷率就高。頁面大小,如果劃分的頁面大,則缺頁中斷率就低,否則,缺頁中斷就高。頁面置換的算法的優(yōu)劣影響缺頁中斷次數。程序編制的方法不同,對缺頁中斷的次數有很大的影響,程序的局部性要好。我對頁面置換算法最近最久未置換算法方式有了進一步的理解,同時

溫馨提示

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

評論

0/150

提交評論