操作系統(tǒng)課程設(shè)計(jì)--動(dòng)態(tài)優(yōu)先權(quán)算法模擬_第1頁(yè)
已閱讀1頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  操作系統(tǒng)課程設(shè)計(jì)</b></p><p>  設(shè)計(jì)題目 動(dòng)態(tài)優(yōu)先權(quán)算法模擬 </p><p><b>  課程設(shè)計(jì)任務(wù)書(shū)</b></p><p>  專(zhuān)業(yè):計(jì)算機(jī)科學(xué)與技術(shù) 學(xué)號(hào): 學(xué)生姓名: </p><p><b>

2、  設(shè)計(jì)題目:</b></p><p>  必做題目:動(dòng)態(tài)優(yōu)先權(quán)算法模擬</p><p>  選做題目:Linux內(nèi)核分析</p><p><b>  一、設(shè)計(jì)實(shí)驗(yàn)條件</b></p><p>  實(shí)驗(yàn)地點(diǎn):綜合樓808 </p><p><b>  語(yǔ)言環(huán)境:C語(yǔ)言<

3、/b></p><p><b>  二、設(shè)計(jì)任務(wù)及要求</b></p><p>  必做:模擬單處理機(jī)環(huán)境下的進(jìn)程調(diào)度模型,調(diào)度采用基于動(dòng)態(tài)優(yōu)先權(quán)的調(diào)度法。</p><p>  選做:對(duì)Linux操作系統(tǒng)的處理機(jī)管理、存儲(chǔ)器管理、文件管理、設(shè)備管理中一個(gè)或幾個(gè)功能進(jìn)行較全面系統(tǒng)分析,分析內(nèi)容包括設(shè)計(jì)實(shí)現(xiàn)原理、典型算法、主要實(shí)現(xiàn)函數(shù),分析內(nèi)

4、容寫(xiě)入綜述報(bào)告,報(bào)告內(nèi)容還要包括函數(shù)間調(diào)用關(guān)系圖、功能模塊圖、系統(tǒng)主要流程圖。</p><p><b>  設(shè)計(jì)報(bào)告的內(nèi)容</b></p><p><b>  設(shè)計(jì)題目與設(shè)計(jì)任務(wù)</b></p><p><b>  必做題目:</b></p><p>  設(shè)計(jì)題目:動(dòng)態(tài)優(yōu)先權(quán)算

5、法模擬</p><p>  設(shè)計(jì)任務(wù):模擬單處理機(jī)環(huán)境下的進(jìn)程調(diào)度模型,調(diào)度采用基于動(dòng)態(tài)優(yōu)先權(quán)的調(diào)度算法。</p><p><b>  選做題目:</b></p><p>  設(shè)計(jì)題目:Linux內(nèi)核分析</p><p>  設(shè)計(jì)任務(wù):對(duì)Linux操作系統(tǒng)的處理機(jī)管理、存儲(chǔ)器管理、文件管理、設(shè)備管理中一個(gè)或幾個(gè)功能進(jìn)行較

6、全面系統(tǒng)分析,分析內(nèi)容包括設(shè)計(jì)實(shí)現(xiàn)原理、典型算法、主要實(shí)現(xiàn)函數(shù),分析內(nèi)容寫(xiě)入綜述報(bào)告,報(bào)告內(nèi)容還要包括函數(shù)間調(diào)用關(guān)系圖、功能模塊圖、系統(tǒng)主要流程圖。</p><p><b>  前言(緒論)</b></p><p>  通過(guò)小組一起合作進(jìn)行操作系統(tǒng)課程設(shè)計(jì),讓大家對(duì)操作系統(tǒng)的知識(shí)學(xué)習(xí)可以更深入的理解。通過(guò)小組討論設(shè)計(jì)方案,讓大家學(xué)會(huì)了團(tuán)隊(duì)合作的重要性,并且通過(guò)上機(jī)實(shí)踐

7、,給提高大家上機(jī)編程實(shí)踐能力的一個(gè)提供一個(gè)很好的機(jī)會(huì)。</p><p>  在操作系統(tǒng)中調(diào)度算法的實(shí)質(zhì)是一種資源的分配,因而調(diào)度算法是指“根據(jù)系統(tǒng)資源分配策略所規(guī)定的資源分配算法”。對(duì)于不同的操作系統(tǒng)和系統(tǒng)目標(biāo),通常采用不同的調(diào)度算法。為了照顧緊迫作業(yè),使之在進(jìn)入系統(tǒng)后便獲得優(yōu)先處理,引入了最高優(yōu)先權(quán)先調(diào)度算法。在作為進(jìn)程調(diào)度算法時(shí),該算法是把處理機(jī)分配給就緒隊(duì)列優(yōu)先權(quán)最高的進(jìn)程。這可以分為搶占式優(yōu)先權(quán)算法和非搶

8、占式優(yōu)先權(quán)算法。對(duì)于最高優(yōu)先權(quán)優(yōu)先調(diào)度算法,其關(guān)鍵在于:它是使用靜態(tài)優(yōu)先權(quán)還是動(dòng)態(tài)優(yōu)先權(quán),以及如何確定進(jìn)程的優(yōu)先權(quán)。本次課程設(shè)計(jì)所實(shí)現(xiàn)的算法就是動(dòng)態(tài)優(yōu)先權(quán)算法的搶占式優(yōu)先權(quán)調(diào)度算法和非搶占式動(dòng)態(tài)優(yōu)先權(quán)算法。</p><p>  而在Linux內(nèi)核分析中大家針對(duì)操作系統(tǒng)的幾個(gè)主要功能分工合作,查閱資料,畫(huà)圖整理,進(jìn)行匯總,使得大家對(duì)Linux內(nèi)核都有了全面系統(tǒng)的認(rèn)識(shí)。</p><p>  3

9、.設(shè)計(jì)主體(各部分設(shè)計(jì)內(nèi)容、分析、結(jié)論等)</p><p>  3.1.必做題:動(dòng)態(tài)優(yōu)先權(quán)算法模擬</p><p><b>  【設(shè)計(jì)內(nèi)容】</b></p><p>  動(dòng)態(tài)優(yōu)先權(quán)是指在創(chuàng)建進(jìn)程之初,先賦予其一個(gè)優(yōu)先級(jí),然后其隨進(jìn)程的推進(jìn)或等待時(shí)間的增加而改變,以獲得更好的調(diào)度性能。</p><p>  非搶占式優(yōu)先權(quán)調(diào)

10、度算法。在這種方式下,系統(tǒng)一旦把處理機(jī)分配給就緒隊(duì)列中優(yōu)先權(quán)最高的進(jìn)程后,該進(jìn)程便一直執(zhí)行下去,直至完成;或因發(fā)生某事件使該進(jìn)程放棄處理機(jī)時(shí),系統(tǒng)方可再將處理機(jī)重新分配給另一優(yōu)先權(quán)最高的進(jìn)程。</p><p>  搶占式優(yōu)先權(quán)算法。系統(tǒng)同樣把處理機(jī)分配給優(yōu)先權(quán)最高的進(jìn)程,使之執(zhí)行。但在其執(zhí)行期間,只要又出現(xiàn)了另一個(gè)優(yōu)先權(quán)更高的進(jìn)程,進(jìn)程調(diào)度程序就立即停止當(dāng)前進(jìn)程的執(zhí)行,重新將進(jìn)程分配給優(yōu)先權(quán)最高的進(jìn)程。</

11、p><p><b>  【算法分析】</b></p><p>  模擬動(dòng)態(tài)優(yōu)先權(quán)算法,在主函數(shù)中選擇采用搶占式進(jìn)程調(diào)度算法還是非搶占式進(jìn)程調(diào)度算法,進(jìn)而調(diào)用對(duì)應(yīng)的函數(shù)完成模擬。</p><p><b>  設(shè)置進(jìn)程結(jié)構(gòu)體,</b></p><p>  struct PROCESS</p>

12、<p><b>  {</b></p><p>  int id; //進(jìn)程id</p><p>  double response_rate; //優(yōu)先權(quán)</p><p>  int cputime; //要求服務(wù)時(shí)間</p><p>  int waittim

13、e; //等待時(shí)間</p><p>  int endtime; //進(jìn)程完成時(shí)間,未完成時(shí)標(biāo)記-1</p><p>  int STATE; //進(jìn)程當(dāng)前狀態(tài)</p><p><b>  };</b></p><p>  記錄完成的進(jìn)程id,使用數(shù)組pro_list[

14、10]</p><p><b>  功能函數(shù)</b></p><p>  display() 打印各進(jìn)程當(dāng)前狀態(tài)</p><p>  init() 初始化進(jìn)程狀態(tài)</p><p>  change() 搶占式調(diào)度算法進(jìn)程狀態(tài)更新</p><p>  no_change

15、() 非搶占式調(diào)度算法進(jìn)程狀態(tài)更新</p><p>  函數(shù)調(diào)用順序如圖1:</p><p>  圖1 函數(shù)調(diào)用順序圖</p><p><b>  【代碼實(shí)現(xiàn)】</b></p><p>  #include<iostream></p><p>  #include<cstri

16、ng></p><p>  #include<stdio.h></p><p>  #include<cstdlib></p><p>  using namespace std;</p><p>  #define num 6</p><p>  #define RUN 1</p&

17、gt;<p>  #define READY 0</p><p>  #define RUNOUT -1</p><p>  int time=0;</p><p>  struct PROCESS</p><p><b>  {</b></p><p><b>  int

18、 id;</b></p><p>  double response_rate;</p><p>  int cputime;</p><p>  int waittime;</p><p>  int endtime;</p><p>  int STATE;</p><p>&l

19、t;b>  }pro[10];</b></p><p>  int pro_list[10],q=0;</p><p>  void display()</p><p><b>  {</b></p><p>  cout<<"Time:"<<time<

20、<endl;</p><p>  cout<<"==========================================="<<endl;</p><p>  cout<<"ID\t\t0\t1\t2\t3\t4\t5"<<endl;</p><p>  cou

21、t<<"respone_rate\t";</p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  cout<<pro[i].response_rate<<'\t';</p><p

22、><b>  }</b></p><p>  cout<<endl;</p><p>  cout<<"cputime\t\t";</p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b><

23、/p><p>  cout<<pro[i].cputime<<'\t';</p><p><b>  }</b></p><p>  cout<<endl;</p><p>  cout<<"waittime\t";</p>&

24、lt;p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  cout<<pro[i].waittime<<'\t';</p><p><b>  }</b></p><p>  cout&

25、lt;<endl;</p><p>  cout<<"endtime\t\t";</p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  cout<<pro[i].endtime<<&

26、#39;\t';</p><p><b>  }</b></p><p>  cout<<endl;</p><p>  cout<<"STATE\t\t";</p><p>  for(int i=0;i<num;i++)</p><p>

27、;<b>  {</b></p><p>  if(pro[i].STATE==RUN)</p><p>  cout<<"RUN\t";</p><p>  else if(pro[i].STATE==READY)</p><p>  cout<<"READY\t&

28、quot;;</p><p>  else cout<<"RUNOUT\t";</p><p><b>  }</b></p><p>  cout<<endl;</p><p>  cout<<"the end process<end time&g

29、t;: ";</p><p>  for(int i=0;i<q;i++)</p><p><b>  {</b></p><p>  cout<<"->"<<pro_list[i]<<'<'<<pro[pro_list[i]].en

30、dtime<<'>';</p><p><b>  }</b></p><p>  cout<<endl;</p><p>  cout<<"==========================================="<<endl;</p

31、><p><b>  }</b></p><p>  void init()</p><p><b>  {</b></p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><

32、;p>  pro[i].id=i;</p><p>  pro[i].response_rate=1;</p><p>  pro[i].waittime=0;</p><p>  pro[i].endtime=-1;</p><p>  pro[i].STATE=0;</p><p><b>  }&

33、lt;/b></p><p>  pro[0].cputime=5;</p><p>  pro[1].cputime=3;</p><p>  pro[2].cputime=1;</p><p>  pro[3].cputime=2;</p><p>  pro[4].cputime=4;</p>

34、<p>  pro[5].cputime=6;</p><p><b>  }</b></p><p>  void change()</p><p><b>  {</b></p><p>  double runflag=0;</p><p>  int ru

35、nprocess=0;</p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  if(pro[i].STATE!=RUNOUT)</p><p><b>  {</b></p><p>  pro[i

36、].response_rate=1.0*(pro[i].waittime+pro[i].cputime)/pro[i].cputime;</p><p>  if(pro[i].response_rate>runflag)</p><p><b>  {</b></p><p>  runflag=pro[i].response_rate

37、;</p><p>  runprocess=i;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  for(int i=0;i<num;i++)</p

38、><p><b>  {</b></p><p>  if(pro[i].STATE==RUN)</p><p><b>  {</b></p><p>  pro[i].STATE=READY;</p><p>  pro[i].waittime=-1;</p>

39、<p><b>  }</b></p><p><b>  }</b></p><p>  pro[runprocess].cputime--;</p><p>  pro[runprocess].waittime=-1;</p><p>  pro[runprocess].STATE=R

40、UN;</p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  if(pro[i].STATE==RUNOUT)</p><p><b>  {</b></p><p><b>  cont

41、inue;</b></p><p><b>  }</b></p><p>  pro[i].waittime++;</p><p>  if(pro[i].cputime==0)</p><p><b>  {</b></p><p>  pro[i].endt

42、ime=time;</p><p>  pro[i].STATE=RUNOUT;</p><p>  pro[i].response_rate=0;</p><p>  pro_list[q++]=i;</p><p><b>  }</b></p><p><b>  }</b&

43、gt;</p><p><b>  }</b></p><p>  void no_change()</p><p><b>  {</b></p><p>  int runprocess=0,flag=0;</p><p>  double runflag=0;</

44、p><p>  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  if(pro[i].STATE==RUNOUT)</p><p><b>  {</b></p><p><b>  continue;<

45、;/b></p><p><b>  }</b></p><p>  pro[i].response_rate=1.0*(pro[i].waittime+pro[i].cputime)/pro[i].cputime;</p><p>  if(pro[i].response_rate>runflag)</p><

46、p><b>  {</b></p><p>  runflag=pro[i].response_rate;</p><p>  runprocess=i;</p><p><b>  }</b></p><p><b>  }</b></p><p&g

47、t;  for(int i=0;i<num;i++)</p><p><b>  {</b></p><p>  if(pro[i].STATE==RUNOUT)</p><p><b>  {</b></p><p><b>  continue;</b></p&

48、gt;<p><b>  }</b></p><p>  if(pro[i].STATE==RUN)</p><p><b>  {</b></p><p><b>  flag=1;</b></p><p>  pro[i].cputime--;</p&g

49、t;<p>  pro[i].waittime=-1;</p><p>  for(int j=0;j<num;j++)</p><p><b>  {</b></p><p>  if(pro[j].STATE==RUNOUT)</p><p><b>  {</b></

50、p><p><b>  continue;</b></p><p><b>  }</b></p><p>  pro[j].waittime++;</p><p><b>  }</b></p><p>  if(pro[i].cputime==0)<

51、;/p><p><b>  {</b></p><p>  pro[i].STATE=RUNOUT;</p><p>  pro[i].endtime=time;</p><p>  pro[i].response_rate=0;</p><p>  pro_list[q++]=i;</p>

52、;<p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(!flag)</b>&

53、lt;/p><p><b>  {</b></p><p>  pro[runprocess].cputime--;</p><p>  pro[runprocess].waittime=-1;</p><p>  pro[runprocess].STATE=RUN;</p><p>  for(in

54、t j=0;j<num;j++)</p><p><b>  {</b></p><p>  if(pro[j].STATE==RUNOUT)</p><p><b>  {</b></p><p><b>  continue;</b></p><p

55、><b>  }</b></p><p>  pro[j].waittime++;</p><p><b>  }</b></p><p>  if(pro[runprocess].cputime==0)</p><p><b>  {</b></p>&l

56、t;p>  pro[runprocess].STATE=RUNOUT;</p><p>  pro[runprocess].endtime=time;</p><p>  pro[runprocess].response_rate=0;</p><p>  pro_list[q++]=runprocess;</p><p><b&

57、gt;  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int main()</p><p><b>  {</b></p><p>  int flag=0,type;<

58、;/p><p>  cout<<"selecet type£¨1.preemptive scheduling 2.non-preemptive scheduling£©£º";</p><p>  cin>>type;</p><p><b>  init

59、();</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p><b>  flag=0;</b></p><p>  display();</p><p>  for(int i

60、=0;i<num;i++)</p><p><b>  {</b></p><p>  if(pro[i].STATE!=RUNOUT)</p><p><b>  {</b></p><p><b>  flag=1;</b></p><p>&

61、lt;b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(!flag) break;</p><p><b>  time++;</b></p><p>

62、;  if(type==1)</p><p><b>  {</b></p><p><b>  change();</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  

63、no_change();</p><p>  cout<<endl;</p><p>  getchar();</p><p><b>  }</b></p><p>  cout<<endl<<endl;</p><p>  cout<<"

64、;All processes have runed out!!"<<endl;</p><p><b>  }</b></p><p><b>  【結(jié)果截圖】</b></p><p>  搶占式優(yōu)先權(quán)調(diào)度算法</p><p>  非搶占式優(yōu)先調(diào)度算法</p>&

65、lt;p>  3.2.選做題:Linux內(nèi)核分析</p><p><b>  Linux內(nèi)核分析</b></p><p>  【摘要】操作系統(tǒng)是控制其他程序運(yùn)行、管理系統(tǒng)資源并為用戶(hù)提供操作界面的系統(tǒng)軟件的集合。操作系統(tǒng)是一個(gè)龐大的管理控制程序,大致包括四個(gè)方面的管理功能:進(jìn)程與處理機(jī)管理、存儲(chǔ)管理、設(shè)備管理、文件管理。</p><p>

66、  【關(guān)鍵詞】Linux操作系統(tǒng);處理機(jī)管理;存儲(chǔ)器管理;文件管理;設(shè)備管理。</p><p>  操作系統(tǒng)是控制其他程序運(yùn)行、管理系統(tǒng)資源并為用戶(hù)提供操作界面的系統(tǒng)軟件的集合。它是管理計(jì)算機(jī)硬件和軟件資源的程序,同時(shí)也是計(jì)算機(jī)系統(tǒng)的內(nèi)核與基石。操作系統(tǒng)理論在計(jì)算機(jī)科學(xué)中是歷史悠久而又活躍的分支,而操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)則是軟件工業(yè)的基礎(chǔ)與內(nèi)核。操作系統(tǒng)本身負(fù)責(zé)諸如管理與配置內(nèi)存、決定系統(tǒng)資源供需的優(yōu)先次序、控制輸

67、入與輸出設(shè)備、操作網(wǎng)絡(luò)與管理文件系統(tǒng)等基本事物。</p><p>  操作系統(tǒng)能夠使計(jì)算機(jī)系統(tǒng)的所喲資源最大限度的發(fā)揮作用,為用戶(hù)提供方便、有效、友善的服務(wù)界面。操作系統(tǒng)是一個(gè)龐大的管理控制程序,大致包括4個(gè)方面的管理功能:進(jìn)程與處理機(jī)管理、存儲(chǔ)管理、設(shè)備管理、文件管理。本文主要是對(duì)存儲(chǔ)管理進(jìn)行全面系統(tǒng)的分析。</p><p><b>  一、處理機(jī)管理</b><

68、;/p><p>  處理機(jī)管理主要就是進(jìn)程管理,進(jìn)程的管理分為進(jìn)程的創(chuàng)建,進(jìn)程的調(diào)度以及進(jìn)程的終止。</p><p>  進(jìn)程的創(chuàng)建過(guò)程可以分為兩步,一是創(chuàng)建進(jìn)程的管理結(jié)構(gòu),即以task_struct為核心的進(jìn)程控制塊,二是為進(jìn)程加載應(yīng)用程序,即為進(jìn)程創(chuàng)建虛擬地址空間并設(shè)置初始參數(shù)和環(huán)境變量,做好運(yùn)行前的準(zhǔn)備。</p><p>  進(jìn)程的調(diào)度:普通類(lèi)進(jìn)程采用CFS調(diào)度算

69、法,它所需要的是一個(gè)按虛擬計(jì)時(shí)器由小到大排序的就緒進(jìn)程隊(duì)列。實(shí)時(shí)進(jìn)程調(diào)度類(lèi)實(shí)施進(jìn)程的調(diào)度同行比較簡(jiǎn)單,嚴(yán)格遵循優(yōu)先級(jí)即可,。目前的Linux用結(jié)構(gòu)rt_rq定義實(shí)時(shí)就緒隊(duì)列??臻e進(jìn)程調(diào)度類(lèi)每個(gè)處理器都有空閑的時(shí)候,當(dāng)處理器空閑時(shí),其上既沒(méi)有就緒的實(shí)時(shí)進(jìn)程也沒(méi)有就緒的普通進(jìn)程,處理器處于輪空狀態(tài)。</p><p>  進(jìn)程的終止:除了一些特殊的守護(hù)進(jìn)程之外,一般進(jìn)程的運(yùn)行時(shí)間都是有限的,或者在有限的時(shí)間內(nèi)完成處理工

70、作,或者被內(nèi)核或其他進(jìn)程殺死,即進(jìn)程運(yùn)行的終點(diǎn)都是終止。終止的進(jìn)程不會(huì)在運(yùn)行,它所占用的系統(tǒng)資源應(yīng)該被釋放,如內(nèi)存、堆棧、task_struct結(jié)構(gòu)等。</p><p>  進(jìn)程的終止一般被分為兩步:</p><p> ?。?)進(jìn)程自己執(zhí)行退出操作exit,釋放被占用的系統(tǒng)資源,而后向父進(jìn)程發(fā)送信號(hào),報(bào)告自己已經(jīng)退出。</p><p> ?。?)父進(jìn)程響應(yīng)進(jìn)程退出信

71、號(hào),執(zhí)行回收操作wait,找到已經(jīng)終止的子進(jìn)程,回收其中的統(tǒng)計(jì)信息,釋放其task_struct結(jié)構(gòu)和系統(tǒng)堆棧,從而徹底將系統(tǒng)注銷(xiāo)。</p><p><b>  二、存儲(chǔ)器管理</b></p><p>  Linux是為多用戶(hù)多任務(wù)的操作系統(tǒng),所以存儲(chǔ)資源要被多個(gè)進(jìn)程有效共享,Linux內(nèi)存管理的設(shè)計(jì)充分利用了計(jì)算機(jī)系統(tǒng)所提供的虛擬存儲(chǔ)技術(shù),真正實(shí)現(xiàn)了虛擬存儲(chǔ)器管理。

72、</p><p>  1、虛擬空間、內(nèi)核空間和用戶(hù)空間 </p><p>  Linux將這4GB的空間分為兩個(gè)部分,最高的1GB供內(nèi)核使用,稱(chēng)為“內(nèi)核空間”,較低的3GB,供各個(gè)進(jìn)程使用,稱(chēng)為“用戶(hù)空間”。因?yàn)槊總€(gè)進(jìn)程可以通過(guò)系統(tǒng)調(diào)用進(jìn)入內(nèi)核,因此,Linux內(nèi)核空間由系統(tǒng)內(nèi)的所有進(jìn)程共享,于是,從具體的進(jìn)程角度來(lái)看,每個(gè)進(jìn)程可以擁有4GB的虛擬地址空間(也叫虛擬內(nèi)存)

73、 </p><p>  圖1 進(jìn)程虛擬地址空間圖</p><p>  由圖可以看出,每個(gè)進(jìn)程有各自的私有用戶(hù)空間(0~3GB),這個(gè)空間對(duì)系統(tǒng)的其他進(jìn)程是不可見(jiàn)的。最高的1GB內(nèi)核空間為所有進(jìn)程及內(nèi)核所共享。</p><p>  1.1內(nèi)存空間到物理內(nèi)存的映射</p><p>  內(nèi)核空間內(nèi)所有進(jìn)程都是共享的,其中存放的是內(nèi)核代碼和數(shù)據(jù)

74、,而進(jìn)程的用戶(hù)空間中存放的是用戶(hù)程序的代碼和數(shù)據(jù)。 </p><p>  圖2 內(nèi)核的虛擬地址空間到物理地址空間的映射圖</p><p>  3GB在Linux中叫PAGE_OFFSET,對(duì)于內(nèi)核空間而言,給定一個(gè)虛地址x,其物理地址為x-PAGE_OFFSET,給定一個(gè)物理地址x,其虛地址為x+PAGE_OFFSET。</p><p><b>  1.

75、2內(nèi)核映像</b></p><p>  內(nèi)核的代碼和數(shù)據(jù)叫內(nèi)核映像。當(dāng)系統(tǒng)啟動(dòng)時(shí),Linux內(nèi)核映像裝入在物理地址0x00100000開(kāi)始的地方,即1MB開(kāi)始的區(qū)間,這1MB用來(lái)存放一些與系統(tǒng)硬件相關(guān)的代碼和數(shù)據(jù),內(nèi)核只占用從 0x00100000開(kāi)始到start_men結(jié)束的一段區(qū)域。從start_men到end_men這段區(qū)域叫動(dòng)態(tài)內(nèi)存,是用戶(hù)程序和數(shù)據(jù)使用的內(nèi)存區(qū)。</p><

76、;p>  0 0x100000 start_men end_men</p><p>  系統(tǒng)啟動(dòng)后的物理內(nèi)存布局</p><p>  由于在鏈接時(shí),所有符號(hào)地址都加了PAGE_OFFSET,這樣,內(nèi)核映像在內(nèi)存的起始地址為0xC0100000。</p><p>  2、 進(jìn)程的用戶(hù)空間管理&

77、lt;/p><p>  2.1 進(jìn)程用戶(hù)空間的描述</p><p>  一個(gè)進(jìn)程的用戶(hù)地址空間主要由兩個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)描述。一個(gè)是mm_struct結(jié)構(gòu),它對(duì)進(jìn)程的整個(gè)用戶(hù)空間進(jìn)行描述,簡(jiǎn)稱(chēng)內(nèi)存描述符;另一個(gè)是vm_area_structs結(jié)構(gòu),它對(duì)用戶(hù)空間的虛存區(qū)進(jìn)行描述。</p><p>  圖3 虛存區(qū)的操作函數(shù)圖</p><p>  2.2

78、進(jìn)程用戶(hù)空間的創(chuàng)建</p><p>  當(dāng)創(chuàng)建一個(gè)新進(jìn)程時(shí),拷貝或共享進(jìn)程的用戶(hù)空間,具體地說(shuō)就是內(nèi)核調(diào)用copy_mm()函數(shù)。該函數(shù)通過(guò)建立新進(jìn)程的所有頁(yè)表和mm_struct結(jié)構(gòu)來(lái)創(chuàng)建進(jìn)程的用戶(hù)空間,通常每個(gè)進(jìn)程都有自己的用戶(hù)空間,但是調(diào)用clone()函數(shù)創(chuàng)建內(nèi)核線(xiàn)程時(shí)共享父進(jìn)程的用戶(hù)空間。進(jìn)程用戶(hù)空間的創(chuàng)建主要依賴(lài)于父進(jìn)程,而且,在創(chuàng)建的過(guò)程中所作的工作僅僅是mm_struct結(jié)構(gòu)的建立、vm_area

79、_struct結(jié)構(gòu)的建立以及頁(yè)目錄和頁(yè)表的建立,并沒(méi)有真正復(fù)制一個(gè)物理頁(yè)面,這是為什么Linux內(nèi)核能迅速地創(chuàng)建進(jìn)程的原因之一。</p><p><b>  2.3虛存映射</b></p><p>  當(dāng)調(diào)用exec()系統(tǒng)調(diào)用開(kāi)始執(zhí)行一個(gè)進(jìn)程時(shí),進(jìn)程的可執(zhí)行映像(包括代碼段、數(shù)據(jù)段)必須裝入進(jìn)程的用戶(hù)地址空間。如果該進(jìn)程用到了任何一個(gè)共享庫(kù),則共享庫(kù)也必須裝入到進(jìn)程

80、的用戶(hù)空間。將映像鏈接到用戶(hù)空間的方法被稱(chēng)為“虛存映射”,也就是把文件從磁盤(pán)映射到進(jìn)程的用戶(hù)空間,這樣把對(duì)文件的訪(fǎng)問(wèn)轉(zhuǎn)化為對(duì)虛存區(qū)的訪(fǎng)問(wèn)。有兩種類(lèi)型的虛存映射:</p><p>  共享的:有幾個(gè)進(jìn)程共享這一映射,也就是說(shuō),如果一個(gè)進(jìn)程對(duì)共享的虛存區(qū)進(jìn)行寫(xiě),其他的進(jìn)程都能感覺(jué)到,而且會(huì)修改磁盤(pán)上的對(duì)應(yīng)文件。</p><p>  私有的:進(jìn)程創(chuàng)建的這種映射只為了讀文件,而不是寫(xiě)文件,因此對(duì)虛

81、存區(qū)的寫(xiě)操作不會(huì)修改磁盤(pán)上的文件,因此,私有映射的效率比共享映射的要高。 </p><p>  如果映射與文件無(wú)關(guān),叫做匿名映射。</p><p>  2.4與用戶(hù)相關(guān)的系統(tǒng)調(diào)用</p><p>  表1 與用戶(hù)相關(guān)的主要系統(tǒng)調(diào)用表</p><p>  如何調(diào)用mmap(),其原型為:</p><p>  Vo

82、id*mmap(void*start,int length,int prot,int flags,int fd,int offset)</p><p>  其中參數(shù)fd代表一個(gè)已打開(kāi)的文件,offset為文件的起點(diǎn),而start為映射到用戶(hù)空間的起始地址,length為長(zhǎng)度(以字節(jié)為單位)。參數(shù)prot表示對(duì)映射區(qū)間的 訪(fǎng)問(wèn)模式,如可寫(xiě)、可讀、可執(zhí)行等,而flags用于以下控制目的。</p><

83、;p>  MAP_SHARED:與子進(jìn)程共享虛存區(qū)。</p><p>  MAP_PRIVATE:子進(jìn)程對(duì)這個(gè)虛存區(qū)是“寫(xiě)時(shí)復(fù)制”。</p><p>  MAP_LOCKED:鎖定這個(gè)虛存區(qū),不能交換</p><p>  MAP_ANONYMOUS:匿名區(qū),與文件無(wú)關(guān)</p><p><b>  請(qǐng)頁(yè)機(jī)制</b>&

84、lt;/p><p>  當(dāng)一個(gè)進(jìn)程運(yùn)行時(shí),CPU訪(fǎng)問(wèn)的地址是用戶(hù)空間的虛地址。Linux采用請(qǐng)頁(yè)機(jī)制來(lái)節(jié)約物理內(nèi)存,它僅僅把當(dāng)前要使用的用戶(hù)空間的少量頁(yè)裝入物理內(nèi)存。</p><p>  3.1缺頁(yè)異常處理程序</p><p>  當(dāng)一個(gè)進(jìn)程執(zhí)行時(shí),如果CPU訪(fǎng)問(wèn)到一個(gè)有效的虛地址,但是這個(gè)地址對(duì)應(yīng)的頁(yè)沒(méi)有在內(nèi)存中,則CPU產(chǎn)生一個(gè)缺頁(yè)異常,同時(shí)將這個(gè)虛地址存入寄存器,

85、然后調(diào)用缺頁(yè)異常處理程序do_page_fault(),do_page_fault()函數(shù)首先讀取引起缺頁(yè)的虛地址,如果沒(méi)找到,則說(shuō)明訪(fǎng)問(wèn)了非法虛地址,Linux會(huì)發(fā)送信號(hào)終止進(jìn)程。</p><p>  缺頁(yè)異??隙ㄒl(fā)生在內(nèi)核態(tài),如果發(fā)生在用戶(hù)態(tài),則必定是錯(cuò)誤的,把相關(guān)信息保存在進(jìn)程的PCB中。如果這個(gè)虛存區(qū)的訪(fǎng)問(wèn)權(quán)限與引起缺頁(yè)異常的訪(fǎng)問(wèn)類(lèi)型相匹配,則調(diào)用handel_mm_fault函數(shù),該函數(shù)確定如何給進(jìn)程

86、分配一個(gè)新的物理頁(yè)面如下。</p><p>  如果被訪(fǎng)問(wèn)的頁(yè)不在內(nèi)存,那么,內(nèi)核分配一個(gè)新的頁(yè)面并適當(dāng)?shù)爻跏蓟?,這種技術(shù)叫“請(qǐng)求調(diào)頁(yè)”。</p><p>  有兩種原因,被尋址的頁(yè)可以不在主存中:進(jìn)程永遠(yuǎn)也沒(méi)有訪(fǎng)問(wèn)到這個(gè)頁(yè),內(nèi)核能夠識(shí)別這種情況,這是因?yàn)轫?yè)表相應(yīng)的表項(xiàng)被填充為0.宏pite_none用來(lái)判斷這種情況,如果頁(yè)表項(xiàng)為空返回1,否則返回0;進(jìn)程已經(jīng)訪(fǎng)問(wèn)過(guò)這個(gè)頁(yè),但是這個(gè)頁(yè)的內(nèi)容

87、被臨時(shí)保存在磁盤(pán)上,內(nèi)核能夠識(shí)別這種情況,因?yàn)橄鄳?yīng)的表項(xiàng)沒(méi)有被填充為0。在其他情況下,當(dāng)頁(yè)從未被訪(fǎng)問(wèn)時(shí)調(diào)用do_no_page()函數(shù)。do_no_page()函數(shù)通過(guò)檢查虛存區(qū)描述符的nopage域來(lái)確定這一點(diǎn),如果也與文件建立了映射關(guān)系,則nopage域就指向一個(gè)函數(shù),該函數(shù)把所缺的頁(yè)表調(diào)入內(nèi)存。當(dāng)nopage域?yàn)镹ULL,虛存區(qū)沒(méi)有映射磁盤(pán)文件,它是一個(gè)匿名映射,do_no_page()調(diào)用do_anonymous_page()函

88、數(shù)獲一個(gè)新的界面,分別處理寫(xiě)請(qǐng)求和讀請(qǐng)求。當(dāng)處理寫(xiě)訪(fǎng)問(wèn)時(shí),調(diào)用_get_free_page()分配一個(gè)新的頁(yè)面,并把新頁(yè)面填為0。</p><p>  如果被訪(fǎng)問(wèn)的頁(yè)已在內(nèi)存但標(biāo)為只讀,內(nèi)核分配一個(gè)新的頁(yè)面并把舊頁(yè)面的數(shù)據(jù)拷貝到新頁(yè)面上初始化它,被稱(chēng)為“寫(xiě)時(shí)復(fù)制”。寫(xiě)時(shí)復(fù)制是一種可以推遲甚至免除拷貝數(shù)據(jù)的技術(shù)。內(nèi)核此時(shí)并不復(fù)制整個(gè)進(jìn)程空間,而是讓父進(jìn)程和子進(jìn)程共享同一個(gè)拷貝。</p><p&g

89、t;  否 是</p><p>  是 否</p><p>  是 否</p><p>  是 否</p><p>  否 是

90、否</p><p><b>  是</b></p><p>  是 否</p><p>  是 否 </p><p>  否 是 </p><p><b>  是&l

91、t;/b></p><p>  圖4 缺頁(yè)異常處理程序流程圖</p><p>  物理內(nèi)存的分配與回收</p><p>  4.1頁(yè)描述符和伙伴算法</p><p>  Struct page結(jié)構(gòu)表示系統(tǒng)的每個(gè)物理頁(yè),也叫頁(yè)描述符。系統(tǒng)中的每個(gè)物理頁(yè)面都要分配這樣一個(gè)結(jié)構(gòu)體。要管理系統(tǒng)中很多的物理頁(yè)面,可以采用最簡(jiǎn)單的數(shù)組結(jié)構(gòu):&l

92、t;/p><p>  Struct page *men_map; </p><p>  在內(nèi)核代碼中,men_map是一個(gè)全局變量,它描述了系統(tǒng)中的全部物理頁(yè)面。</p><p>  由于頻繁地請(qǐng)求和釋放不同大小一組連續(xù)頁(yè)面,會(huì)導(dǎo)致外碎片,所以要分配一個(gè)大的連續(xù)頁(yè)面無(wú)法滿(mǎn)足,Linux采用著名的伙伴算法來(lái)解決外碎片問(wèn)題?;锇橄到y(tǒng)中采用的數(shù)據(jù)結(jié)構(gòu)是一個(gè)叫做free_ar

93、ea數(shù)組。滿(mǎn)足以下條件的兩個(gè)塊成為伙伴即兩個(gè)塊的大小相同;兩個(gè)塊的物理地址連續(xù)?;锇樗惴ò褲M(mǎn)足以上兩個(gè)條件的兩個(gè)塊合并為一個(gè)塊,該算法是迭代算法,如果合并后的塊還可以跟相鄰的塊進(jìn)行合并,那么該算法就繼續(xù)合并。</p><p>  4.2物理頁(yè)面的分配</p><p>  Linux中采用伙伴算法有效地分配和回收物理頁(yè)塊,該算法試圖分配一個(gè)或多個(gè)連接物理頁(yè)面組成的內(nèi)存塊,大小為1頁(yè),2頁(yè)或4

94、頁(yè)等。只要系統(tǒng)有滿(mǎn)足需要的足夠的空閑頁(yè)面,就會(huì)在free_area數(shù)組中查找滿(mǎn)足需要大小的的一個(gè)頁(yè)塊。函數(shù)_get_free_pages用于物理頁(yè)塊的分配,其定義如下:</p><p>  Unsigned long_get_free_pages(int gfp_mask,unsigned long order)</p><p><b>  { </b></p&

95、gt;<p>  struct page *page; </p><p>  VM_BUG_ON((gfp_mask & __GFP_HIGHMEM) != 0); </p><p>  page = alloc_pages(gfp_mask, order); </p><p>  if (!page) </p><p>

96、;  return 0; </p><p>  return (unsigned long) page_address(page); </p><p><b>  } </b></p><p>  Gfp_mask 是分配標(biāo)志,order是指數(shù),所請(qǐng)求的頁(yè)塊大小為2的order次冪個(gè)物理頁(yè)面,即塊的索引。</p><p>

97、;  該函數(shù)所做的工作主要是檢查所請(qǐng)求的頁(yè)塊大小是否滿(mǎn)足;檢查系統(tǒng)中空閑物理頁(yè)的總數(shù)是否低于允許的下界;正常分配;換頁(yè),通過(guò)調(diào)用函數(shù)try_to_free_pages()啟動(dòng)換頁(yè)進(jìn)程。</p><p>  4.3物理頁(yè)面的回收 </p><p>  分配頁(yè)塊的過(guò)程中將大的頁(yè)塊分為小的頁(yè)塊,會(huì)使內(nèi)存更為零散。頁(yè)分配與頁(yè)回收的過(guò)程相反,它會(huì)盡可能把小頁(yè)塊合并成大的頁(yè)塊。</p>

98、<p>  函數(shù)free_pages用于頁(yè)塊的回收,定義如下:</p><p>  Void free_pages(unsigned long addr,unsigned long order)</p><p>  { if (addr != 0) </p><p><b>  { </b></p><p> 

99、 VM_BUG_ON(!virt_addr_valid((void *)addr)); </p><p>  __free_pages(virt_to_page((void *)addr), order); </p><p><b>  } </b></p><p><b>  } </b></p><

100、p>  自此我們知道伙伴算法分配內(nèi)存時(shí),每次至少分配一個(gè)頁(yè)面,當(dāng)我們需要的內(nèi)存少于一個(gè)頁(yè)面時(shí),或者更小的數(shù)據(jù)時(shí),該如何做?Linux引入了slab分配模式。</p><p>  4.4slab分配模式</p><p>  slab的主要思想是對(duì)內(nèi)核數(shù)據(jù)進(jìn)行頁(yè)面分配時(shí),首先要對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行初始化,用完之后就要回收。對(duì)小對(duì)象的分配,它們會(huì)在系統(tǒng)生命周期內(nèi)進(jìn)行無(wú)數(shù)次分配。slab 緩存分配

101、器通過(guò)對(duì)類(lèi)似大小的對(duì)象進(jìn)行緩存而提供這種功能,從而避免了常見(jiàn)的碎片問(wèn)題。slab 分配器還支持通用對(duì)象的初始化,從而避免了為同一目而對(duì)一個(gè)對(duì)象重復(fù)進(jìn)行初始化。最后,slab 分配器還可以支持硬件緩存對(duì)齊和著色,這允許不同緩存中的對(duì)象占用相同的緩存行,從而提高緩存的利用率并獲得更好的性能。</p><p>  緩沖區(qū)的創(chuàng)建通過(guò)kmem_cache_create()建立,其原型如下:</p><p

102、>  struct kmem_cache *kmem_cache_create( const char *name, size_t size, size_t offset,</p><p>  unsigned long c_flags; void (*ctor)(void*, struct kmem_cache *, unsigned long), void (*dtor)(void*, struct k

103、mem_cache *, unsigned long)); </p><p>  其中name為緩沖區(qū)的名字,size為對(duì)象的大小,offset參數(shù)定義了每個(gè)對(duì)象必需的對(duì)齊。 c_flags 參數(shù)指定了為緩存啟用的選項(xiàng)。其可能取值SLAB_HWCACHE_ALIGN表示與第一個(gè)緩沖區(qū)中的緩沖行邊界對(duì)齊;SLAB_NO_REAP表示允許系統(tǒng)回收內(nèi)存;SLAB_CACHE_DMA表示使用的是DMA內(nèi)存(DMA是直接存

104、儲(chǔ)器訪(fǎng)問(wèn)的縮寫(xiě),他允許不同速度的硬件裝置來(lái)溝通,而不需要依于 CPU 的大量 中斷 負(fù)載);最后兩個(gè)函數(shù)分別是構(gòu)造函數(shù)(用于對(duì)數(shù)據(jù)初始化)和析構(gòu)函數(shù)(用于對(duì)數(shù)據(jù)回收處理)。其中數(shù)據(jù)結(jié)構(gòu)kmem_cache是用來(lái)對(duì)緩沖區(qū)進(jìn)行管理的。</p><p>  緩沖區(qū)的分配與釋放函數(shù)分別如下:</p><p>  kmem_cache_alloc(struct

105、 kmem_cache *cachep, gfp_t flags);</p><p>  kmem_cache_free(struct kmem_cache *cachep, void *objp) </p><p>  內(nèi)核函數(shù) kmem_cache_destroy 用來(lái)銷(xiāo)毀緩存。這個(gè)調(diào)用是由內(nèi)核模塊在被卸載時(shí)執(zhí)行的。在調(diào)用這個(gè)函數(shù)時(shí),緩存必須為空。</p><p&g

106、t;  void kmem_cache_destroy( struct kmem_cache *cachep );</p><p><b>  通用緩沖區(qū):</b></p><p>  通用緩沖區(qū)中分配和釋放緩沖區(qū)的函數(shù)為:</p><p>  void *kmalloc(size_t,int flags );</p><p

107、>  void kfree(const void *objp);</p><p>  當(dāng)然還有其他函數(shù)來(lái)輔助slab完成任務(wù)。kmem_cache_size 函數(shù)會(huì)返回這個(gè)緩存所管理的對(duì)象的大小。您也可以通過(guò)調(diào)用 kmem_cache_name 來(lái)檢索給定緩存的名稱(chēng)(在創(chuàng)建緩存時(shí)定義)。具體函數(shù)原型如下:</p><p>  unsigned int kmem_cache_size(

108、 struct kmem_cache *cachep ); const char *kmem_cache_name( struct kmem_cache *cachep );</p><p>  4.5內(nèi)核空間非連續(xù)內(nèi)存區(qū)分配</p><p>  非連續(xù)內(nèi)存的線(xiàn)性地址空間是從VMALLOC_START~VMALLOC_END,共128MB大小。當(dāng)內(nèi)核需要用vmalloc類(lèi)的函數(shù)進(jìn)行非連續(xù)內(nèi)

109、存分配時(shí),就會(huì)申請(qǐng)一個(gè)vm_struct結(jié)構(gòu)來(lái)描述對(duì)應(yīng)的vmalloc區(qū),若分配多個(gè)vmalloc的內(nèi)存區(qū),那么相鄰兩個(gè)vmalloc區(qū)之間的間隔大小至少為4KB,即至少是一個(gè)頁(yè)框大小PAGE——SIZE。內(nèi)核中描述非連續(xù)區(qū)的數(shù)據(jù)結(jié)構(gòu)是struct vm_struct:</p><p>  struct vm_struct {        

110、;    struct vm_struct *next;                 void *addr;              </p><p>  unsigned lo

111、ng size;            </p><p>  unsigned long flags;                       struct page **pages; &

112、#160;                 unsigned int nr_pages;               phys_addr_t phys_addr;       

113、;        const void *caller;        };  內(nèi)核中用get_vm_area函數(shù)來(lái)創(chuàng)建一個(gè)新的非連續(xù)區(qū)結(jié)構(gòu),在該函數(shù)的實(shí)現(xiàn)中又會(huì)調(diào)用kmallloc函數(shù)和kfree函數(shù)分別為vm_struct結(jié)構(gòu)分配和釋放所需的內(nèi)存。vmalloc給內(nèi)核分配一個(gè)非連續(xù)的內(nèi)存區(qū),其原型為: 

114、            void *vmalloc(unsigned long size)       函數(shù)首先把size參數(shù)取為頁(yè)面的大小(即4KB)的倍數(shù),然后進(jìn)行有效性檢查,若有大小適合的可用內(nèi)存,就調(diào)用get_vm_area()獲得一個(gè)內(nèi)存區(qū)的結(jié)構(gòu),最后會(huì)調(diào)用vmalloc_area_pages()進(jìn)行真正的

115、的非連續(xù)內(nèi)存的分配,該函數(shù)實(shí)際上建立了非連續(xù)內(nèi)存到物理頁(yè)</p><p><b>  交換機(jī)制 </b></p><p>  當(dāng)物理內(nèi)存出現(xiàn)不足時(shí) ,Linux內(nèi)存管理子系統(tǒng)需要釋放部分物理內(nèi)存頁(yè)面。這一任務(wù)由內(nèi)核的交換守護(hù)進(jìn)程kswapd,該守護(hù)進(jìn)程實(shí)際是一個(gè)內(nèi)核線(xiàn)程,它在內(nèi)核初始化時(shí)啟動(dòng),并周期性地運(yùn)行。在Linux中用于交換的磁盤(pán)空間叫做交換文件或交換區(qū)。<

116、;/p><p><b>  文件管理</b></p><p>  系統(tǒng)調(diào)用(trap)</p><p><b>  I/O請(qǐng)求</b></p><p>  圖5 文件系統(tǒng)的整體結(jié)構(gòu)圖</p><p>  文件系統(tǒng)是結(jié)構(gòu)化管理塊設(shè)備上的數(shù)據(jù)的機(jī)制。它通過(guò)文件和目錄等概念,是管理設(shè)

117、備上的數(shù)據(jù)成為可能。Linux文件系統(tǒng)是由兩大模塊構(gòu)成的:(一)VFS虛擬文件系統(tǒng)。(二)具體的文件系統(tǒng)。而文件系統(tǒng)主要有文件系統(tǒng)的建立,文件系統(tǒng)的安裝與卸載,文件的注冊(cè)與注銷(xiāo)這幾個(gè)部分,基于文件系統(tǒng)的概念又可以把數(shù)據(jù)成分分為數(shù)據(jù)、記錄和文件三級(jí)。</p><p>  文件結(jié)構(gòu)是文件存放磁盤(pán)等存儲(chǔ)設(shè)備上的組織方法,只要體現(xiàn)在對(duì)文件和目錄的組織上。目錄提供了管理文件的一個(gè)方便而有效的途徑。Linux采用的樹(shù)形結(jié)構(gòu)。

118、最上層是根目錄,其他所有目錄都是從根目錄出發(fā)而生成的。</p><p><b>  /(根目錄)</b></p><p>  Bin dev etc home lib sbin tmp root mnt proc usr var</p><p>  Linux下主要目錄的功能:</p><p> 

119、 /bin 存放二進(jìn)制可執(zhí)行文件。</p><p>  /dev 存放設(shè)備文件。</p><p>  /etc 存放系統(tǒng)管理和配置文件。</p><p>  /home 用戶(hù)主目錄的幾點(diǎn),如用戶(hù)usr的主目錄就是/usr。</p><p>  /lib 標(biāo)準(zhǔn)程序設(shè)計(jì)庫(kù),又叫動(dòng)態(tài)鏈接共享庫(kù)。</p><p> 

120、 /sbin 系統(tǒng)管理命令目錄,存放的是系統(tǒng)管理員使用的管理程序。</p><p>  /tmp 公用的臨時(shí)文件目錄。</p><p>  /root 系統(tǒng)管理員的主目錄。</p><p>  /mnt 用于用戶(hù)零食安裝其他文件系統(tǒng)的目錄。</p><p>  /proc 虛擬的目錄,是系統(tǒng)內(nèi)存的映射??芍苯釉L(fǎng)問(wèn)這個(gè)目錄來(lái)獲取系統(tǒng)信

121、息。</p><p>  /var 某些大文件的溢出區(qū),存放例如各種服務(wù)的日志文件。</p><p>  /usr 最龐大的目錄,會(huì)用到的應(yīng)用程序和文件幾乎都在這個(gè)目錄下。</p><p><b>  文件類(lèi)型</b></p><p>  ·常規(guī)文件 供計(jì)算機(jī)用戶(hù)和曹組系統(tǒng)存放數(shù)據(jù)、程序等信息的文件。<

122、;/p><p>  ·目錄文件 Linux文件系統(tǒng)將文件索引節(jié)點(diǎn)號(hào)和文件同時(shí)保存在目錄中。</p><p>  ·設(shè)備文件 Linux把所有的外設(shè)都當(dāng)作文件來(lái)處理。</p><p>  ·管道文件 主要用于在進(jìn)程間傳遞數(shù)據(jù)。</p><p>  ·鏈接文件 提供了共享文件的一種方法。</p>

123、<p><b>  設(shè)備管理</b></p><p>  系統(tǒng)中有兩種設(shè)備文件:塊設(shè)備文件和字符設(shè)備文件。第三種設(shè)備類(lèi)型是網(wǎng)絡(luò)設(shè)備,它是兼有塊設(shè)備屬性和字符設(shè)備屬性的特殊設(shè)備,但并不用文件來(lái)表示?;镜耐ㄓ脡K設(shè)備有open、close(或release)和ioct1函數(shù),以及最重要的request函數(shù)。字符設(shè)備與塊設(shè)備不同,字符設(shè)備用于傳送數(shù)據(jù)流。所有串行設(shè)備都是字符設(shè)備。網(wǎng)絡(luò)設(shè)備

124、兼有塊設(shè)備和字符設(shè)備的一些屬性,通常被認(rèn)為是一組特殊的設(shè)備。與字符設(shè)備類(lèi)似,網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)在物理層上串行傳輸。</p><p>  輸入輸出:Linux內(nèi)核可以運(yùn)行與一個(gè)或多個(gè)處理器上。處理器為系統(tǒng)中其余部分提供的接口離不開(kāi)硬件的支持。在硬件依賴(lài)性極強(qiáng)的底層,內(nèi)核使用匯編語(yǔ)言指令與這些設(shè)備“對(duì)話(huà)”。通過(guò)將對(duì)頂層虛擬文件系統(tǒng)的操作實(shí)現(xiàn)為底層想物理介質(zhì)寫(xiě)入二進(jìn)制位,來(lái)分析Linux內(nèi)核如何將軟硬件結(jié)合起來(lái)。</

125、p><p>  廣義上說(shuō),操作系統(tǒng)包括內(nèi)核和運(yùn)行在內(nèi)核之上的所有工具軟件,如瀏覽器等。狹義上說(shuō),操作系統(tǒng)就是內(nèi)核,其余軟件都是應(yīng)用程序。一個(gè)操作系統(tǒng)可以擁有許許多多的應(yīng)用程序,但卻只有一個(gè)內(nèi)核。</p><p>  為了管理資源、提供服務(wù),在內(nèi)核中需要實(shí)現(xiàn)許多程序,如各種中斷的處理程序、各種服務(wù)請(qǐng)求的處理程序、各種資源的管理程序、各種設(shè)備的驅(qū)動(dòng)程序等。為了實(shí)現(xiàn)這些程序,在內(nèi)核中還需要定義多種數(shù)

126、據(jù)結(jié)構(gòu)。由于操作系統(tǒng)內(nèi)核完成的都是核心管理工作,因而內(nèi)核本身必須被嚴(yán)格地保護(hù)起來(lái),以免被破壞。另外,操作系統(tǒng)內(nèi)核和應(yīng)用程序的能力也應(yīng)該有所區(qū)別,有些工作只能在內(nèi)核中做,不應(yīng)由應(yīng)用程序來(lái)實(shí)現(xiàn)。</p><p>  人們?cè)谟?jì)算機(jī)上使用程序,操作系統(tǒng)內(nèi)核的唯一任務(wù)就是幫助這些程序運(yùn)行。所有操作系統(tǒng)內(nèi)核本身從來(lái)沒(méi)有主動(dòng)做任何事,它僅僅是等待應(yīng)用程序請(qǐng)求某些資源或者請(qǐng)求硬盤(pán)上的某些文件或者請(qǐng)求程序把它們連接到外部世界等等,

127、然后操作系統(tǒng)內(nèi)核來(lái)了,它干預(yù)并且試圖讓人們更容易地運(yùn)行程序。</p><p><b>  【結(jié)束語(yǔ)】 </b></p><p>  此次課程設(shè)計(jì)由小組成員一起討論,合作完成。大家結(jié)合課本及平時(shí)的實(shí)驗(yàn)知識(shí),討論出算法的可行性、各個(gè)變量,函數(shù)使用,結(jié)構(gòu)定義和界面安排等。然后根據(jù)討論結(jié)果確定主要變量、結(jié)構(gòu)體和主要函數(shù)等編寫(xiě)出程序。通過(guò)大家之間的合作與討論,互補(bǔ)不足,解決了很

128、多編程過(guò)程中遇到的問(wèn)題,同時(shí)也使我們對(duì)動(dòng)靜態(tài)優(yōu)先權(quán),搶占式和非搶占式等操作系統(tǒng)知識(shí)都有了更深刻的了解。除了課本上的知識(shí),我們更學(xué)會(huì)了團(tuán)隊(duì)合作的重要性和上機(jī)實(shí)踐對(duì)學(xué)習(xí)的幫助。 </p><p>  動(dòng)態(tài)優(yōu)先權(quán)算法保證了緊急任務(wù)的高優(yōu)先權(quán)先處理,同時(shí)彌補(bǔ)了靜態(tài)優(yōu)先權(quán)事先設(shè)置數(shù)值不能完全適合每一個(gè)時(shí)刻的缺點(diǎn),動(dòng)態(tài)賦值,更加的靈活。</p><p>  在選做題的Linux內(nèi)核分析設(shè)計(jì)中,我們小

129、組成員根據(jù)Linux操作系統(tǒng)的幾個(gè)重要功能分工合作去圖書(shū)館查閱資料,根據(jù)內(nèi)容畫(huà)圖整理,最后進(jìn)行匯總,從而使得小組成員對(duì)操作系統(tǒng)的各個(gè)功能都有了全面系統(tǒng)的了解,收獲很大。</p><p><b>  【參考資料】</b></p><p>  [1]郭玉東,尹青,董衛(wèi)宇.Linux原理與結(jié)構(gòu)[M].西安:電子科技大學(xué)出版社,2012. </p><p&

130、gt;  [2]陳莉君,康華.Linux操作系統(tǒng)原理與應(yīng)用[M].北京:清華大學(xué)出版社,2012.</p><p>  [3]何炎祥,李飛,李寧.計(jì)算機(jī)操作系統(tǒng)[M].北京:清華大學(xué)出版社,2011.</p><p>  [4]陳莉君,賀炎,劉霞林.Linux內(nèi)核編程[M].北京:人民郵電大學(xué)出版社,2011.</p><p>  [5]吳小平,羅俊松.操作系統(tǒng).[

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論