欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      操作系統(tǒng)專題實驗報告樣式

      時間:2019-05-12 06:54:51下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《操作系統(tǒng)專題實驗報告樣式》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《操作系統(tǒng)專題實驗報告樣式》。

      第一篇:操作系統(tǒng)專題實驗報告樣式

      操作系統(tǒng)專題實驗報告

      班級:

      學(xué)號:

      姓名:

      2014 年月日

      目錄

      1內(nèi)核編譯與系統(tǒng)調(diào)用......................3

      1.1實驗?zāi)康?.............................3

      1.2實驗內(nèi)容..............................3

      1.3實驗思想(或流程圖).....................3

      1.4實驗步驟..............................3

      1.5測試數(shù)據(jù)設(shè)計.......................3

      1.6程序運行初值及運行結(jié)果分析.......................3

      1.7實驗總結(jié)..............................3

      1.7.1實驗中的問題與解決過程....................3

      1.7.2實驗收獲...........................3

      1.7.3意見與建議.......................3

      1.8附件...............................3

      1.8.1附件1 程序......................3

      1.8.2附件2 MakeFile......................3

      1.8.3附件3 Readme........................3模塊編程與字符設(shè)備驅(qū)動....................4

      2.1實驗?zāi)康?.............................4

      2.2實驗內(nèi)容..............................4

      2.2.1 模塊編程..........................4

      2.2.2 字符設(shè)備驅(qū)動.........................4

      1內(nèi)核編譯與系統(tǒng)調(diào)用

      1.1實驗?zāi)康?.2實驗內(nèi)容

      1.3實驗思想(或流程圖)

      1.4實驗步驟

      1.5測試數(shù)據(jù)設(shè)計

      1.6程序運行初值及運行結(jié)果分析

      1.7實驗總結(jié)

      1.7.1實驗中的問題與解決過程

      1.7.2實驗收獲

      1.7.3意見與建議

      1.8附件

      1.8.1附件1 程序

      1.8.2附件2 MakeFile

      1.8.3附件3 Readme模塊編程與字符設(shè)備驅(qū)動

      2.1實驗?zāi)康?.2實驗內(nèi)容

      2.2.1 模塊編程

      1)

      (1)

      (2)

      2)

      2.2.2 字符設(shè)備驅(qū)動

      第二篇:操作系統(tǒng)實驗報告

      實驗二

      進程調(diào)度

      1.目的和要求

      通過這次實驗,理解進程調(diào)度的過程,進一步掌握進程狀態(tài)的轉(zhuǎn)變、進程調(diào)度的策略,進一步體會多道程序并發(fā)執(zhí)行的特點,并分析具體的調(diào)度算法的特點,掌握對系統(tǒng)性能的評價方法。

      2.實驗內(nèi)容

      閱讀教材《計算機操作系統(tǒng)》第二章和第三章,掌握進程管理及調(diào)度相關(guān)概念和原理。

      編寫程序模擬實現(xiàn)進程的輪轉(zhuǎn)法調(diào)度過程,模擬程序只對PCB進行相應(yīng)的調(diào)度模擬操作,不需要實際程序。假設(shè)初始狀態(tài)為:有n個進程處于就緒狀態(tài),有m個進程處于阻塞狀態(tài)。采用輪轉(zhuǎn)法進程調(diào)度算法進行調(diào)度(調(diào)度過程中,假設(shè)處于執(zhí)行狀態(tài)的進程不會阻塞),且每過t個時間片系統(tǒng)釋放資源,喚醒處于阻塞隊列隊首的進程。

      程序要求如下:

      1)輸出系統(tǒng)中進程的調(diào)度次序; 2)計算CPU利用率。

      3.實驗環(huán)境

      Windows操作系統(tǒng)、VC++6.0 C語言

      4設(shè)計思想:

      (1)

      程序中進程可用PCB表示,其類型描述如下:

      struct PCB_type

      {

      int pid;

      //進程名 int

      state;

      //進程狀態(tài)

      2——表示“執(zhí)行”狀態(tài)

      1——表示“就緒”狀態(tài)

      0——表示“阻塞”狀態(tài)

      int cpu_time;//運行需要的CPU時間(需運行的時間片個數(shù))

      } 用PCB來模擬進程;

      (2)設(shè)置兩個隊列,將處于“就緒”狀態(tài)的進程PCB掛在隊列ready中;將處于“阻塞”狀態(tài)的進程PCB掛在隊列blocked中。隊列類型描述如下:

      struct QueueNode{

      struct PCB_type

      PCB;

      Struct QueueNode *next;} 并設(shè)全程量:

      struct QueueNode *ready_head=NULL,//ready隊列隊首指針

      *ready_tail=NULL , //ready隊列隊尾指針

      *blocked_head=NULL,//blocked隊列隊首指針 *blocked_tail=NULL;//blocked隊列隊尾指針(3)設(shè)計子程序:

      start_state();

      讀入假設(shè)的數(shù)據(jù),設(shè)置系統(tǒng)初始狀態(tài),即初始化就緒隊列和阻塞隊列。

      dispath();

      模擬調(diào)度,當(dāng)就緒隊列的隊首進程運行一個時間片后,放到就緒隊列末尾,每次都是隊首進程進行調(diào)度,一個進程運行結(jié)束就從就緒隊列中刪除,當(dāng)?shù)絫個時間片后,喚醒阻塞隊列隊首進程。

      calculate();

      就緒進程運行一次,usecpu加1,當(dāng)就緒隊列為空時unusecpu加1,CPU利用率為use_cpu/(use_cpu+unuse_cpu)。

      5源代碼:

      #include #include

      struct PCB_type {

      int pid;

      //進程名

      int

      state;

      //進程狀態(tài)

      //2--表示“執(zhí)行”狀態(tài)

      //1--表示“就緒”狀態(tài)

      //0--表示“阻塞”狀態(tài)

      int cpu_time;//運行需要的CPU時間(需運行的時間片個數(shù))};struct QueueNode{

      struct PCB_type

      PCB;

      struct QueueNode *next;};struct QueueNode *ready_head=NULL,//ready隊列隊首指針

      *ready_tail=NULL,//ready隊列隊尾指針

      *block_head=NULL,//blocked隊列隊首指針

      *block_tail=NULL;

      //blocked隊列隊尾指針

      int use_cpu,unuse_cpu;

      void start_state()//讀入假設(shè)的數(shù)據(jù),設(shè)置系統(tǒng)初始狀態(tài) {

      int n,m;

      int i;

      struct QueueNode *p,*q;

      printf(“輸入就緒節(jié)點個數(shù)n:”);

      scanf(“%d”,&n);

      printf(“輸入阻塞節(jié)點個數(shù)m:”);

      scanf(“%d”,&m);

      p=(struct QueueNode *)malloc(sizeof(struct QueueNode));

      p->next =NULL;

      ready_head=ready_tail=p;

      for(i=0;i

      {

      p=(struct QueueNode *)malloc(sizeof(struct QueueNode));

      p->next =NULL;

      p->PCB.state=1;

      printf(“輸入就緒進程%d的pid和cpu_time:”,i+1);

      scanf(“%d%d”,&p->PCB.pid,&p->PCB.cpu_time);

      ready_tail->next=p;

      ready_tail=p;

      }

      q=(struct QueueNode *)malloc(sizeof(struct QueueNode));

      q->next =NULL;

      block_head=block_tail=q;

      for(i=0;i

      {

      q=(struct QueueNode *)malloc(sizeof(struct QueueNode));

      q->next=NULL;

      q->PCB.state=0;

      printf(“輸入阻塞進程%d的pid和cpu_time:”,i+1);

      scanf(“%d%d”,&q->PCB.pid,&q->PCB.cpu_time);

      block_tail->next=q;

      block_tail=q;

      }

      printf(“n處于就緒狀態(tài)的進程有:n”);

      p=ready_head->next;

      i=1;

      while(p)

      {printf(“進程%d的pid和cpu_time:%5d%5d%5dn“,i,p->PCB.pid,p->PCB.state,p->PCB.cpu_time);

      p=p->next;

      i++;

      } } void dispath()

      //模擬調(diào)度 {

      int x=0,t;

      use_cpu=0;

      unuse_cpu=0;

      printf(”輸入t:“);

      scanf(”%d“,&t);

      printf(”開始調(diào)度n“);

      while(ready_head!=ready_tail||block_head!=block_tail)

      {

      struct QueueNode *p,*q;

      if(ready_head!=ready_tail)

      {

      p=ready_head->next;

      ready_head->next=p->next;

      p->next=NULL;

      if(ready_head->next==NULL)

      {

      ready_tail=ready_head;

      }

      p->PCB.state=2;

      printf(”進程%d調(diào)度t“,p->PCB.pid);

      state和

      use_cpu++;

      x++;

      p->PCB.cpu_time--;

      if(p->PCB.cpu_time)

      {

      ready_tail->next=p;

      ready_tail=p;

      }

      else

      {

      printf(”進程%d完成t“,p->PCB.pid);

      free(p);

      }

      }

      else

      {

      unuse_cpu++;

      x++;

      printf(”空閑一個時間片t“);

      }

      if(x==t&&block_head!=block_tail)

      {

      q=block_head->next;

      block_head->next=q->next;

      q->next=NULL;

      if(block_head->next==NULL)

      {

      block_tail=block_head;

      }

      ready_tail->next=q;

      ready_tail=q;

      x=0;

      }

      } } void calculate()

      //計算CPU利用率 { printf(”ncpu的利用率%.2fn“,(float)use_cpu/(use_cpu+unuse_cpu));

      } void main(){start_state();

      dispath();

      calculate();} 6運行結(jié)果:

      7實驗總結(jié):

      實驗幫我復(fù)習(xí)了數(shù)據(jù)結(jié)構(gòu)和C語言,且鞏固課本知識,知道了如何定義結(jié)構(gòu)體,如何在鏈接隊列中增刪節(jié)點。模擬進程調(diào)度幫我們鞏固了進程三狀態(tài)之間的變遷。懂得調(diào)式的重要性。總之,我們明白了理論聯(lián)系實際。多看書,多上機。

      實驗三

      可變分區(qū)存儲管理

      1.目的和要求

      通過這次實驗,加深對內(nèi)存管理的認(rèn)識,進一步掌握內(nèi)存的分配、回收算法的思想。

      2.實驗內(nèi)容

      閱讀教材《計算機操作系統(tǒng)》第四章,掌握存儲器管理相關(guān)概念和原理。編寫程序模擬實現(xiàn)內(nèi)存的動態(tài)分區(qū)法存儲管理。內(nèi)存空閑區(qū)使用自由鏈管理,采用最壞適應(yīng)算法從自由鏈中尋找空閑區(qū)進行分配,內(nèi)存回收時假定不做與相鄰空閑區(qū)的合并。

      假定系統(tǒng)的內(nèi)存共640K,初始狀態(tài)為操作系統(tǒng)本身占用64K。在t1時間之后,有作業(yè)A、B、C、D分別請求8K、16K、64K、124K的內(nèi)存空間;在t2時間之后,作業(yè)C完成;在t3時間之后,作業(yè)E請求50K的內(nèi)存空間;在t4時間之后,作業(yè)D完成。要求編程序分別輸出t1、t2、t3、t4時刻內(nèi)存的空閑區(qū)的狀態(tài)。

      3.實驗環(huán)境

      Windows操作系統(tǒng)、VC++6.0 C語言

      4.設(shè)計思想

      模擬內(nèi)存分配和回收,要設(shè)置兩個鏈隊列,一個空閑區(qū)鏈和一個占用區(qū)鏈,空閑區(qū)鏈節(jié)點有起始地址,大小和指向下一節(jié)點的指針等數(shù)據(jù)域,占用區(qū)鏈節(jié)點有起始地址,大小,作業(yè)名和指向下一節(jié)點的指針等數(shù)據(jù)域,本實驗用最壞適應(yīng)算法,每次作業(yè)申請內(nèi)存都是從空閑鏈隊頭節(jié)點分配,如果相等,就刪除空閑頭結(jié)點,如果小于申請的,就不分配,否則就劃分內(nèi)存給作業(yè),剩下的內(nèi)存大小,重新插入空閑鏈隊,按從大到小,接著把作業(yè)占用的內(nèi)存放到占用區(qū)鏈節(jié)點的末尾。每次作業(yè)運行完,就要回收其占用的內(nèi)存大小,把作業(yè)節(jié)點按從大到小插入到空閑鏈隊中。5.源代碼:

      #include #include struct freelinkNode{ int len;int address;

      struct freelinkNode *next;};struct busylinkNode{ char name;

      int len;int address;struct busylinkNode *next;};struct freelinkNode *free_head=NULL;

      //自由鏈隊列(帶頭結(jié)點)隊首指針

      struct busylinkNode *busy_head=NULL;

      //占用區(qū)隊列隊(帶頭結(jié)點)首指針

      struct busylinkNode *busy_tail=NULL;

      //占用區(qū)隊列隊尾指針 void start(void)/* 設(shè)置系統(tǒng)初始狀態(tài)*/ { struct freelinkNode *p;

      struct busylinkNode *q;

      free_head=(struct freelinkNode*)malloc(sizeof(struct freelinkNode));

      free_head->next=NULL;// 創(chuàng)建自由鏈頭結(jié)點

      busy_head=busy_tail=(struct busylinkNode*)malloc(sizeof(struct busylinkNode));

      busy_head->next=NULL;// 創(chuàng)建占用鏈頭結(jié)點

      p=(struct freelinkNode *)malloc(sizeof(struct freelinkNode));

      p->address=64;

      p->len=640-64;//OS占用了64K

      p->next=NULL;

      free_head->next=p;

      q=(struct busylinkNode *)malloc(sizeof(struct busylinkNode));

      q->name='S';/* S表示操作系統(tǒng)占用

      */

      q->len=64;q->address=0;q->next=NULL;

      busy_head->next=q;busy_tail=q;} void requireMemo(char name, int require)/*模擬內(nèi)存分配*/ { freelinkNode *w,*u,*v;busylinkNode *p;if(free_head->next->len>=require){

      p=(struct busylinkNode*)malloc(sizeof(struct busylinkNode));

      p->name=name;

      p->address=free_head->next->address;

      p->len=require;

      p->next=NULL;

      busy_tail->next=p;

      busy_tail=p;} else

      printf(”Can't allocate“);

      w=free_head->next;

      free_head->next=w->next;

      if(w->len==require)

      {

      free(w);} else {

      w->address=w->address+require;

      w->len=w->len-require;}

      u=free_head;

      v=free_head->next;

      while((v!=NULL)&&(v->len>w->len)){

      u=v;

      v=v->next;}

      u->next=w;

      w->next=v;} void freeMemo(char name)/* 模擬內(nèi)存回收*/ { int len;

      int address;busylinkNode *q,*p;freelinkNode *w,*u,*v;q=busy_head;

      p=busy_head->next;

      while((p!=NULL)&&(p->name!=name))

      {

      q=p;

      p=p->next;}

      if(p==NULL){

      printf(”%c is not exist“,name);} else

      {

      if(p==busy_tail)

      {

      busy_tail=q;

      }

      else

      {

      q->next=p->next;

      len=p->len;

      address=p->address;

      free(p);

      w=(struct freelinkNode*)malloc(sizeof(struct freelinkNode));

      w->len=len;

      w->address=address;

      u=free_head;

      v=free_head->next;

      while((v!=NULL)&&(v->len>len))

      { u=v;v=v->next;

      }

      u->next=w;

      w->next=v;

      } } } void past(int time)/* 模擬系統(tǒng)過了time 時間*/ { printf(”過了時間%d后:n“,time);} void printlink()/* 輸出內(nèi)存空閑情況(自由鏈的結(jié)點)*/ {

      freelinkNode *p;

      printf(”內(nèi)存的空閑情況為:n“);

      p=(struct freelinkNode *)malloc(sizeof(struct freelinkNode));

      p=free_head->next;

      while(p!=NULL)

      {

      printf(”內(nèi)存的起始地址和內(nèi)存的大小%5dt%5d:n",p->address,p->len);

      p=p->next;

      } }

      void main(){

      int t1=1,t2=2,t3=3,t4=4;

      start();

      past(t1);

      requireMemo('A',8);

      requireMemo('B',16);

      requireMemo('C',64);

      requireMemo('D',124);

      printlink();

      past(t2);

      freeMemo('C');

      printlink();

      past(t3);

      requireMemo('E',50);

      printlink();

      past(t4);

      freeMemo('D');

      printlink();} 6.運行結(jié)果:

      7.實驗總結(jié):

      鞏固編程能力,和調(diào)式能力,復(fù)習(xí)課本知識,明白理論聯(lián)系實際的重要性,動手能力非常重要,多看書,多獨立思考,品味痛苦的過程,享受成功的喜悅。

      操作系統(tǒng)實驗報告

      院系:數(shù)計學(xué)院

      班級:大類6班 學(xué)號:100511624 姓名:明章輝

      指導(dǎo)教師:徐軍利

      第三篇:操作系統(tǒng)實驗報告

      許昌學(xué)院

      《操作系統(tǒng)》實驗報告書

      學(xué)號:姓名:閆金科班級:成績:

      5006140057

      14物聯(lián)網(wǎng)工程 2016年02月實驗一 Linux的安裝與配置

      一、實驗?zāi)康?/p>

      1.熟悉Linux系統(tǒng)的基本概念,比如Linux發(fā)行版、宏內(nèi)核、微內(nèi)核等。2.掌握Linux系統(tǒng)的安裝和配置過程,初步掌握Linux系統(tǒng)的啟動和退出方法。3.熟悉Linux系統(tǒng)的文件系統(tǒng)結(jié)構(gòu),了解Linux常用文件夾的作用。

      二、實驗內(nèi)容

      1.從網(wǎng)絡(luò)上下載VMware軟件和兩個不同Linux發(fā)行版鏡像文件。2.安裝VMware虛擬機軟件。

      3.在VMware中利用第一個鏡像文件完成第一個Linux的安裝,期間完成網(wǎng)絡(luò)信息、用戶信息、文件系統(tǒng)和硬盤分區(qū)等配置。

      4.在VMware中利用第二個鏡像文件完成第二個Linux的安裝,并通過LILO或者GRUB解決兩個操作系統(tǒng)選擇啟動的問題。

      5.啟動Linux系統(tǒng),打開文件瀏覽器查看Linux系統(tǒng)的文件結(jié)構(gòu),并列舉出Linux常用目錄的作用。

      三、實驗過程及結(jié)果

      1、啟動VMware,點擊新建Linux虛擬機,如圖所示:

      2、點擊下一步,選擇經(jīng)典型,點擊下一步在選擇客戶機頁面選擇Linux,版本選擇Red Hat Enterprise Linux 5,如圖所示:

      3、點擊下一步創(chuàng)建虛擬機名稱以及所要安裝的位置,如圖所示:

      4、點擊下一步,磁盤容量填一個合適大小,此處選擇默認(rèn)值大小10GB,如圖所示:

      5、點擊完成,點擊編輯虛擬機設(shè)置,選擇硬件選項中的CD-ROM(IDE...)選項,在右側(cè)連接中選擇“使用ISO鏡像(I)”選項,點擊“瀏覽”,找到Linux的鏡像文件,如圖所示:

      6點擊確定按鈕后,點擊啟動虛擬機按鈕,來到Linux的安裝界面,如圖所示:

      7、到此頁面之后,等待自動檢測安裝,如圖所示:

      8、等到出現(xiàn)如圖所示頁面后點擊“skip”按鈕,跳過檢測,直接進入安裝設(shè)置界面,如圖所示:

      9、安裝設(shè)計界面如圖所示:

      10、點擊Next按鈕進入設(shè)置語言界面,設(shè)置語言為“簡體中文”,如圖所示:

      11、點擊Nest按鈕進入系統(tǒng)鍵盤設(shè)置按鈕,設(shè)置系統(tǒng)鍵盤為“美國英語式”,如圖所示:

      12、點擊下一步按鈕,彈出“安裝號碼”對話框,選擇跳過輸入安裝號碼,如圖所示:

      13、按照提示,一直點擊下一步按鈕,如圖所示:

      14、到設(shè)置最后一步,點擊下一步按鈕進入開始安裝Red Hat Enterprise Linux Sever界面,如圖所示:

      15、安裝完成后,進入歡迎界面,按照提示點擊前進按鈕知道進入Linux桌面,如圖所示:

      16、安裝成功的Linux系統(tǒng)桌面如圖所示,桌面包含五個圖標(biāo),分別為:計算機、jk’s Home、回收站、RHEL/5.3 i386DVD。

      四、實驗總結(jié)

      通過安裝虛擬機等操作讓我認(rèn)識到Linux這系統(tǒng)一些基本特點,本次試驗學(xué)會了安裝虛擬機并且使用虛擬機安裝操作系統(tǒng),掌握了紅帽Linux系統(tǒng)的安裝和配置過程,以及對鏡像ISO文件的使用,有別于我們機器上使用的系統(tǒng),通過虛擬機這個軟件還可以在已有系統(tǒng)的基礎(chǔ)上使用其他操作系統(tǒng)。安裝過程中一定要注意選擇版本的時候要選擇Red Hat Enterprise Linux 5版本,否則安裝不能成功。自己動手成功的安裝了Linux系統(tǒng),自己對Linux的學(xué)習(xí)產(chǎn)生更大的興趣。

      實驗二 Linux操作系統(tǒng)的運行模式

      一、實驗?zāi)康?/p>

      1.熟悉Linux系統(tǒng)終端工作環(huán)境的使用,了解Linux命令的格式,使用學(xué)會利用常用的Linux命令來完成系統(tǒng)的管理和維護。

      2.了解X-Windows的特點,熟悉Linux圖形用戶接口的使用,掌握GNOME桌面環(huán)境的基本操作。

      3.了解和掌握在Linux環(huán)境下安裝軟件包的方法,如QQ for Linux等用軟件的安裝方法。

      二、實驗內(nèi)容

      1.啟動Linux系統(tǒng)打開虛擬終端界面,使用Linux的在線幫助指令man或help獲得ls、uname、date、cal、mkdir、cp等Linux命令的幫助手冊,了解這些命令的具體使用方法。同時,也可以通過執(zhí)行“命令名 –help”來顯示該命令的幫助信息,如“l(fā)s –help”,試用這些命令。

      2.通過uname命令的執(zhí)行,查看并給出相關(guān)系統(tǒng)信息:操作系統(tǒng)的名稱、系統(tǒng)域名、系統(tǒng)CPU名稱等。

      3.在主目錄下創(chuàng)建一個名為myetc的子目錄,將/etc目錄下與網(wǎng)絡(luò)相關(guān)的文件和子目錄拷貝到該目錄,并將這些文件的執(zhí)行權(quán)限設(shè)置為可執(zhí)行。

      4.在主目錄/home下創(chuàng)建目錄program、music 和temp,然后在program下建立目錄java和C,列出完成該過程的所有命令。

      5.在圖形界面環(huán)境中,查看GNOME桌面的面板和桌面,設(shè)置GNOME,包括屏幕保護程序、更改背景和指定關(guān)聯(lián)程序等。6.實現(xiàn)對光盤的加載和訪問,然后卸載。

      三、實驗過程及結(jié)果

      1、打開終端,輸入 【ls –help】來查看【ls】指令的使用方法,同理查看uname、date、cal、mkdir、cp的使用方法。

      2、在終端中輸入【uname –a】顯示操作系統(tǒng)名系統(tǒng)cpu名和系統(tǒng)域名

      3、重啟系統(tǒng),用【root】用戶名進入系統(tǒng),以獲得權(quán)限。在終端中輸入【mkdir myetc】,在主目錄下創(chuàng)建【myrtc】的目錄,【ls】查看是否創(chuàng)建。輸入【cd..】返回至【/】文件,輸入【cp –r etc root/myetc】講etc中內(nèi)容復(fù)制到myetc中,進入myetc文件【ls】查看。輸入

      【chmod u+x etc】賦予文件可執(zhí)行的權(quán)限,輸入【ll】查看。

      4、在home下,輸入【mkdir {program,music,temp}】,可在home下創(chuàng)立這三個目錄,輸入【ls】查看。在program下輸入【mkdir{java,C}】,可創(chuàng)立java和C兩個目錄,【ls】查看。

      5、在桌面上方選擇【系統(tǒng)】-【首選項】,即可設(shè)置屏幕保護程序和更改背景和指定關(guān)聯(lián)程序

      5、在桌面上可見看到有CD光盤,雙擊瀏覽,右鍵【彈出】即卸載。

      四、實驗總結(jié)和體會

      Linux的指令系統(tǒng)是學(xué)習(xí)Linux操作系統(tǒng)很重要的一部分,指令系統(tǒng)相當(dāng)于在Windows操作系統(tǒng)下的doc,可以省去圖形化界面。通過這次的實驗讓我了解了Linux的強大功能,了解到Linux有許多方便快捷的設(shè)置基本配置的方法,這使我更喜歡上Linux的使用。在使用指令的過程中,有時候?qū)ξ募牟僮餍枰欢ǖ臋?quán)限,這時需要在登陸時用戶名使用【root】,而不是我們在安裝時使用的用戶名,這樣就獲得了管理員權(quán)限,可以對一些系統(tǒng)文件進行操作。

      實驗三 Linux應(yīng)用軟件與系統(tǒng)管理

      一、實驗?zāi)康?/p>

      1.了解OpenOffice.Org集成辦公軟件,掌握利用OpenOffice.Org的套件來完成文檔和圖片的處理。

      2.了解Linux網(wǎng)絡(luò)管理的知識,熟悉Linux網(wǎng)絡(luò)配置的方法,掌握在Linux環(huán)境下配置Web服務(wù)器和ftp服務(wù)的方法。

      二、實驗內(nèi)容

      1.配置Linux系統(tǒng)的網(wǎng)絡(luò)環(huán)境,安裝FTP和Web服務(wù)器,并配置相關(guān)的屬性,利用FTP實現(xiàn)WINDOWS和Linux之間的數(shù)據(jù)交換。

      2.利用FTP程序上傳自己的照片到FTP服務(wù)器,利用OpenOffice的文字處理工具OpenOffice Writer制作一份表格形式的個人簡歷。個人簡歷中至少包含學(xué)號、姓名、性別、專業(yè)、照片和學(xué)習(xí)經(jīng)歷等內(nèi)容,并保存為網(wǎng)頁格式(html格式)。3.將個人簡歷網(wǎng)頁設(shè)置為WEB服務(wù)器的首頁,然后在客戶端利用瀏覽器訪問WEB服務(wù)器,查看效果。

      4.通過讀取proc文件系統(tǒng),獲取系統(tǒng)各種信息(如主機名、系統(tǒng)啟動時間、運行時間、版本號、所有進程信息、CPU使用率等),并以比較容易的方式顯示。

      三、實驗過程及結(jié)果

      1.配置網(wǎng)絡(luò)環(huán)境:在(服務(wù).cmd).里面進行以下操作:在服務(wù)里選擇3按回車

      完成后,可在本地連接看到VMware已連接上網(wǎng)絡(luò)

      在虛擬機設(shè)置中設(shè)置以太網(wǎng)網(wǎng)絡(luò)連接方式為

      網(wǎng)關(guān)地址填虛擬機的網(wǎng)管,IP地址設(shè)為虛擬機的一個子網(wǎng):

      四、總結(jié):

      在linux系統(tǒng)下,make是我們經(jīng)常用到的編譯命令,所以關(guān)于make代碼和他的操作指令一定要記清楚。所以,熟練掌握了make和makefile工具之后,源碼安裝軟件就變的像windows下安裝軟件一樣簡單。

      實驗四 進程控制與管理

      一、實驗?zāi)康?/p>

      1.掌握GCC編譯器的用法,學(xué)會利用GCC編輯器來編輯C語言程序,學(xué)會利用GDB調(diào)試器來調(diào)試C語言程序。

      2.理解進程和程序的區(qū)別和聯(lián)系,3.掌握在Linux環(huán)境下觀察進程運行情況和CPU工作情況的命令。4.了解fork()系統(tǒng)調(diào)用,掌握利用fork()創(chuàng)建進程的方法。

      5.了解Linux系統(tǒng)其他與進程相關(guān)的系統(tǒng)調(diào)用,如exec、wait和exit等。6.了解Linux常用的進程通信機制。

      二、實驗內(nèi)容

      1.利用Linux的進程管理命令ps、top來監(jiān)視和跟蹤進程,體會進程和程序的關(guān)系。2.利用Linux的文字編輯器編寫文件復(fù)制的C語言程序,并用gcc編譯該程序,然后運行該程序。

      3.編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個子進程。當(dāng)此程序運行時,在系統(tǒng)中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:父進程顯示'a',子進程分別顯示字符'b'和字符'c'。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。

      4.修改上述程序,每一個進程循環(huán)顯示一句話。子進程顯示'daughter ?'及'son ??',父進程顯示 'parent ??',觀察結(jié)果,分析原因。5.用fork()創(chuàng)建一個進程,再調(diào)用exec()用新的程序替換該子進程的內(nèi)容。

      三、實驗過程及結(jié)果

      1、利用Linux的進程管理命令ps、top來監(jiān)視和跟蹤進程,體會進程和程序的關(guān)系。<1>從用戶身份切換到ROOT身份

      <2>輸入命令 ps 查看進程

      <2>輸入命令 top 跟蹤進程

      2、利用Linux的文字編輯器編寫一個計算機100個自然數(shù)和的C語言程序,并用gcc編譯該程序,然后運行該程序。

      <1>創(chuàng)建一個.C文件 并進入進行編輯

      <2>用GCC 進行編譯,再查看文件,發(fā)現(xiàn)產(chǎn)生執(zhí)行文件 a.out

      <3>執(zhí)行這個可執(zhí)行文件得到結(jié)果5050

      1、編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個子進程。當(dāng)此程序運行時,在系統(tǒng)中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:父進程顯示'a',子進程分別顯示字符'b'和字符'c'。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。

      <1>穿件一個.C文件 并進行編寫程序代碼

      <2>反復(fù)執(zhí)行2次該程序

      <3>可以看出兩次執(zhí)行的結(jié)果 a b c 出現(xiàn)的順序不同,原因是,3個進程的輸出次序是隨機的,并不會按規(guī)定的順序出現(xiàn),所以會出現(xiàn)上述結(jié)果。

      4、修改上述程序,每一個進程循環(huán)顯示一句話。子進程顯示'daughter ?'及'son ??',父進程顯示 'parent ??',觀察結(jié)果,分析原因。<1>重新修改代碼

      <3>執(zhí)行這段程序

      <4>原分析:

      因和之前一樣,可以看出執(zhí)行的結(jié)果 3個單詞出現(xiàn)的順序不同,原因是,3個進程的輸出次序是隨機的,并不會按規(guī)定的順序出現(xiàn),所以會出現(xiàn)上述結(jié)果。

      5、用fork()創(chuàng)建一個進程,再調(diào)用exec()用新的程序替換該子進程的內(nèi)容。<1>

      編寫代碼

      <2> 執(zhí)行的結(jié)果

      結(jié)果表明 execl 替代了son的內(nèi)容

      四、實驗總結(jié)和體會

      這個實驗考察的是進程之間存在很多可能性以及對編輯器的使用。本次實驗學(xué)習(xí)了在linux環(huán)境下用gcc編譯器運行c語言程序,在linux環(huán)境下編寫程序用到了vi編輯器,知道了該編輯器也需要各種命令來操作。編寫C語言程序時用到了fork()函數(shù),再調(diào)用execl()用新的程序替換該子進程的內(nèi)容。

      實驗五 進程調(diào)度模擬程序的設(shè)計與實現(xiàn)

      一、實驗?zāi)康?/p>

      1.了解進程調(diào)度的概念,掌握常用進程調(diào)度算法的原理。2.掌握Linux程序設(shè)計編輯、編譯和調(diào)試的技巧。

      二、實驗內(nèi)容

      1.編寫程序?qū)崿F(xiàn)進程調(diào)度調(diào)度算法先來先服務(wù)、優(yōu)先級高優(yōu)先和時間片輪轉(zhuǎn)調(diào)度算法。(編程語言不限)

      2.輸入數(shù)據(jù),輸出運行結(jié)果。

      三、實驗過程及結(jié)果

      1先來先服務(wù)

      #i nclude float t,d;

      struct { int id;

      float ArriveTime;float RequestTime;float StartTime;float EndTime;float RunTime;float DQRunTime;int Status;}arrayTask[4];GetTask(){ int i;float a;

      for(i=0;i<4;i++){arrayTask[i].id=i+1;printf(“input the number”);

      printf(“input the the ArriveTime of arrayTask[%d]:”,i);scanf(“%f”,&a);

      arrayTask[i].ArriveTime=a;

      printf(“input the RequestTime of arrayTask[%d]:”,i);scanf(“%f”,&a);

      arrayTask[i].RequestTime=a;arrayTask[i].StartTime=0;arrayTask[i].EndTime=0;arrayTask[i].RunTime=0;arrayTask[i].Status=0;

      } }

      int fcfs()

      {

      int i,j,w=0;

      for(i=0;i<4;i++)

      {

      if(arrayTask[i].Status==0)

      {

      t=arrayTask[i].ArriveTime;

      w=1;

      }

      if(w==1)

      break;

      }

      for(i=0;i<4;i++)

      {

      if(arrayTask[i].ArriveTime

      t=arrayTask[i].ArriveTime;

      }

      for(i=0;i<4;i++)

      {

      if(arrayTask[i].ArriveTime==t)

      return i;

      }

      }

      int sjf(){

      int i,x=0,a=0,b=0;float g;

      for(i=0;i<4;i++){

      if(arrayTask[i].Status==1){g=arrayTask[i].EndTime;x=1;} }

      if(x==0){

      t=arrayTask[0].ArriveTime;

      for(i=0;i<4;i++){

      if(arrayTask[i].ArriveTime

      t=arrayTask[i].ArriveTime;a=i;} }

      return a;} else {

      for(i=0;i<4;i++){ if(arrayTask[i].EndTime>g)g=arrayTask[i].EndTime;}

      for(i=0;i<4;i++){ if(arrayTask[i].Status==0&& arrayTask[i].ArriveTime<=g){ t=arrayTask[i].RequestTime;a=i;b=1;} /*判斷有沒有進程在前個進程完成前到達*/ }

      if(b!=0)/*有進程到達則按SJF*/ { for(i=0;i<4;i++){

      if(arrayTask[i].Status==0&&arrayTask[i].ArriveTime<=g&&arrayTask[i].RequestTime

      return a;} else{ /*否則按FCFS*/ for(i=0;i<4;i++)

      {if(arrayTask[i].Status==0)t=arrayTask[i].ArriveTime;}

      for(i=0;i<4;i++){

      if(arrayTask[i].Status==0&&arrayTask[i].ArriveTime

      return a;} } }

      new(int s)/*定義執(zhí)行進程后相關(guān)數(shù)據(jù)的修改*/ { int i,g=0;for(i=0;i<4;i++){

      if(arrayTask[i].Status==0)continue;else { g=1;break;} }

      if(g==0)/*當(dāng)處理的是第一個未執(zhí)行的進程時執(zhí)行*/ {

      arrayTask[s].StartTime=arrayTask[s].ArriveTime;

      arrayTask[s].EndTime=arrayTask[s].RequestTime+arrayTask[s].ArriveTime;arrayTask[s].RunTime=arrayTask[s].RequestTime;arrayTask[s].Status=1;g=2;}

      if(g==1)/*當(dāng)處理的不是第一個未執(zhí)行的進程時執(zhí)行*/ {

      arrayTask[s].Status=1;for(i=0;i<4;i++){

      if(arrayTask[i].Status==1)d=arrayTask[i].EndTime;}

      for(i=0;i<4;i++)/*查找最后執(zhí)行的進程的完成時間*/ {

      if(arrayTask[i].EndTime>d&&arrayTask[i].Status==1)d=arrayTask[i].EndTime;}

      if(arrayTask[s].ArriveTime

      arrayTask[s].StartTime=arrayTask[s].ArriveTime;

      arrayTask[s].EndTime=arrayTask[s].StartTime+arrayTask[s].RequestTime;arrayTask[s].RunTime=arrayTask[s].EndTime-arrayTask[s].ArriveTime;}

      arrayTask[s].DQRunTime=arrayTask[s].RunTime/arrayTask[s].RequestTime;}

      Printresult(int j)/*定義打印函數(shù)*/ {

      printf(“%dt”,arrayTask[j].id);

      printf(“%5.2ft”,arrayTask[j].ArriveTime);printf(“%5.2ft”,arrayTask[j].RequestTime);printf(“%5.2ft”,arrayTask[j].StartTime);printf(“%5.2ft”,arrayTask[j].EndTime);printf(“%5.2ft”,arrayTask[j].RunTime);printf(“%5.2fn”,arrayTask[j].DQRunTime);} main(){

      int i,b,k,a,c=0;int d[4];clrscr();

      printf(“t F.FCFS n”);printf(“t S.SFJ n”);printf(“t Q.EXIT n”);for(i=0;;i++){ if(c)break;

      printf(“please input the number a:n”);scanf(“%d”,&a);switch(a){

      case Q: c=1;break;

      case F:printf(“please input the different-ArriveTime of arrayTasksn”);GetTask();

      printf(“*****************************the result of fcfsn”);printf(“NumbertArrivetServertStarttFinishtTurnovetTake power turnover timen”);

      for(b=0;b<4;b++)/*調(diào)用兩個函數(shù)改變結(jié)構(gòu)體數(shù)的值*/ {

      k=fcfs();d[b]=k;new(k);}

      for(b=0;b<4;b++)

      Printresult(d[b]);/*調(diào)用打印函數(shù)打出結(jié)果*/ continue;

      case S: printf(“please input the different-RequestTime of array

      Tasksn”);GetTask();

      printf(“******************************the result of sjfn”);printf(“NumbertArrivetRequesttStarttEndtRuntDQRun timen”);for(b=0;b<4;b++){ k=sjf();d[b]=k;new(k);}

      for(b=0;b<4;b++)Printresult(d[b]);continue;

      default:printf(“the number Error.please input another number!n”);} } }

      四、實驗總結(jié)和體會

      通過做本實驗,讓我對進程或作業(yè)先來先服務(wù)、高優(yōu)先權(quán)、按時間片輪轉(zhuǎn)調(diào)度算法以及進程調(diào)度的概念和算法,有了更深入的認(rèn)識!理解進程的狀態(tài)及變化,動態(tài)顯示每個進程的當(dāng)前狀態(tài)及進程的調(diào)度情況。進程調(diào)度是處理機管理的核心內(nèi)容。優(yōu)先級高優(yōu)先是根據(jù)作業(yè)的優(yōu)先級,總是選擇優(yōu)先級最高者進入隊列。輪轉(zhuǎn)調(diào)度算法是調(diào)度程序每次把CPU分配給就緒隊列首進程/線程使用規(guī)定的時間間隔,就緒隊列中都路保留巡行一個時間片。

      第四篇:操作系統(tǒng)第一次實驗報告

      操作 系統(tǒng) 實驗報告

      實驗名稱:

      線程 控制實驗

      計算機科學(xué)與技術(shù)學(xué)院

      目錄

      一、實驗?zāi)康暮鸵?2 二、實驗內(nèi)容 2 三、實驗步驟 2 四、實驗結(jié)果與分析 3 1.單線程 3 2.單線程(睡眠 4s)3 3.多線程 4 4.多線程(每個子線程睡眠 1s)4 5.單線程與多線程對比 5 五、程序源代碼 5 1.單線程實驗代碼 5 2.單線程實驗代碼 6 六、實驗體會 7

      一、實驗?zāi)康暮鸵?/p>

      通過本實驗掌握在 Linux 操作系統(tǒng)中遵循 Posix線程標(biāo)準(zhǔn)接口進行多線程程序編程,熟練掌握線程的創(chuàng)建 pthread_create(),線程的終止 pthread_exit(),等待線程合并 pthread_join()等線程控制操作,利用信號量或者互斥鎖實現(xiàn)線程建的同步。

      二、實驗內(nèi)容

      問題:求 1000000 個浮點數(shù)(精確到小數(shù)點后 4 位)的平均值(和,最大值,最小值),具體的問題描述流程圖如下圖圖 1 所示:

      三、實驗 步驟

      1、隨機生成 1000000個浮點數(shù); 2、創(chuàng)建 4個子線程,分別求 250000個浮點數(shù)之和; 3、完成 1000000 個浮點數(shù)之和并打印結(jié)果; 4、統(tǒng)計多線程并發(fā)執(zhí)行完成計算的時間; 5、寫一個單線程程序,同樣完成 1000000 個隨機數(shù)求和的計算,統(tǒng)計計算時間,并和前面結(jié)果進行對比; 6、讓單線程程序睡眠四秒鐘、多線程程序各子程序睡一秒的條件下(兩個程序總的睡眠時間相同),對比執(zhí)行結(jié)果; 7、分析兩次對比結(jié)果的差異,寫出自己的見解。

      四、實驗結(jié)果與分析 1、單線程完成 1000000 個浮點數(shù)的求和運算所用的時間情況如下圖圖 2 所示:

      圖 圖 2 單線程計算 時間

      分析:實驗中每次隨機產(chǎn)生一個 0 到 1 之間的浮點數(shù),1000000 個這樣的數(shù)相加的話的平總和大概就在 500000 左右(按照隨機數(shù)的平均值原理),實驗中 sum=,顯然結(jié)果正確,整個計算運行時間為。

      2、單線程完成 1000000 個浮點數(shù)的求和運算,單線程中睡眠 4 秒鐘,所用的時間情況如下圖圖3 所示:

      圖 圖 3 單線程計算 時間(睡眠 4 秒)分析:根據(jù)上一次單線程的執(zhí)行情況來看,這一次讓單線程睡眠 4 秒鐘,最后執(zhí)行時間剛好就是4 秒加上計算時間。也就是說計算 1000000 個浮點數(shù)的總和平均時間約為。

      3、四個子線程共同完成 1000000 個浮點數(shù)的求和計算所用時間情況如下圖圖 4所示:

      圖 圖 4 多線程計算時間

      分析:因為這次是 4 個子線程并發(fā)運行,每個子線程只需計算 250000個浮點數(shù)的總和,理想情況下這時候的運行時間應(yīng)該是這單線程中計算時間的四分之一。從圖中可以看到執(zhí)行時間是,很顯然這個時間約為單線程求 1000000 個浮點數(shù)之和的時間()的四分之一,符合預(yù)期的結(jié)果。

      4、四個子線程共同完成 1000000 個浮點數(shù)的求和計算,其中每個子線程睡眠 1 秒鐘,最終所用時間情況如下圖圖 5所示:

      圖 圖 5 多線程計算時間(每個 子線程眠 睡眠 1 秒)

      分析:這里四個子線程每個子線程睡眠一秒,但由于四個子線程并發(fā)同步的在執(zhí)行,當(dāng)一個子線程在睡眠時,另外一個子線程卻仍然在繼續(xù)求和計算,因此他們一起合作同步完成1000000個浮點數(shù)的計算所需的時間就是 1 秒加上上圖中不睡眠的時候的計算時間。從圖中可以

      看到≈1s+,所以最終的結(jié)果符合預(yù)期值。

      5、單線程計算時間(睡眠 4s)與多線程計算時間(每個子線程睡眠 1s)對比效果如下圖圖 6 所示:

      圖 圖 6 單線程(睡眠 4s)與 與 多線程(每個眠 子線程睡眠 1s)計算時間 對比圖 五、程序源代碼 /************************* *FileName:

      *Author:

      *Date:2013/11/22 ***************************/ #include <> #include <> #include <> #include <> #include #define LOOP 1000000 float SUM=0;void *ADD(){

      int i;

      srand(time(NULL));

      for(i=0;i

      {

      SUM +=(float)(rand()/(float)RAND_MAX);

      }

      sleep(4);} int main(){

      pthread_t p;

      int result;

      float time;

      struct timeval start;

      struct timeval end;

      gettimeofday(&start,NULL);

      result=pthread_create(&p,NULL,ADD,NULL);

      if(result!=0)

      {

      printf(“Create Thread of ADD Failuren”);

      exit(-1);

      }

      pthread_join(p,NULL);

      gettimeofday(&end,NULL);

      time =((float)-*1000000+(float)

      -)/1000000;

      printf(“Signal_Thread_Sum:%.4fn”,SUM);

      printf(“Signal_Thread_Execution_Time:%.4fs(sleep 4 sec)n”,time);

      return 0;}

      /************************* *FileName:

      *Author:wangtao *Date:2013/11/22 ***************************/ #include <> #include <> #include <> #include <> #include #define LOOP 25000 pthread_mutex_t mutex;float SUM=0;void ADD(int * k){

      int i;

      srand(time(NULL));

      for(i=0;i

      {

      pthread_mutex_lock(&mutex);

      SUM +=(float)((float)rand()/RAND_MAX);

      pthread_mutex_unlock(&mutex);

      }

      printf(“pthread%d:%.4fn”,*k,SUM);

      sleep(1);} int main(void){

      pthread_t p1,p2,p3,p4;

      int result1,result2,result3,result4;

      int k1=1,k2=2,k3=3,k4=4;

      struct timeval start;

      struct timeval end;

      float time;

      gettimeofday(&start,NULL);

      pthread_mutex_init(&mutex,NULL);

      result1=pthread_create(&p1,NULL,(void*)ADD,&k1);

      result2=pthread_create(&p2,NULL,(void*)ADD,&k2);

      result3=pthread_create(&p3,NULL,(void*)ADD,&k3);

      result4=pthread_create(&p4,NULL,(void*)ADD,&k4);

      if(result1!=0||result2!=0||result3!=0||result4!=0)

      {

      printf(“Create Child

      Thread

      Failure!n”);

      exit(1);

      }

      pthread_join(p1,NULL);

      pthread_join(p2,NULL);

      pthread_join(p3,NULL);

      pthread_join(p4,NULL);

      gettimeofday(&end,NULL);

      time =((float)-*1000000 +(float)-)/1000000;

      printf(“SUM = %.4fn”,SUM);

      printf(“Multi_thread_time = %.4fs(Each child thread sleep 1 sec)n”,time);

      return 0;} 六、實驗體會

      這是第一次使用多線程編程編寫代碼,第一次直觀感受到這種多線程編程對程序的執(zhí)行速率的影響。雖然說操作系統(tǒng)課程已經(jīng)上了好幾個星期了,課堂上一直在學(xué)習(xí)多線程編程的算法思想,但是那只是書面上的講授,真正直觀的感受和體會還是得依靠實驗來了解。

      因為之前就接觸過 linux 系統(tǒng),所以對于程序的編譯執(zhí)行方面還是問題不大,最主要的就是代碼的編寫問題。一開始到實驗室完全不知道要做什么,因為根本連實驗內(nèi)容都不知道,直到助教在大屏幕上顯示這個實驗題目,我才開始了解實驗的題目和要求。這里我就是想建議一下老師您可以應(yīng)該給我們實驗題目,讓我們在實驗前就了解一下實驗內(nèi)容,不然到了實驗室都不知道到底要干嘛。讀懂了解題意之后,我就開始參考所給的一些線程創(chuàng)建函數(shù)說明來編寫多線程同步完成1000000個浮點數(shù)的求和運算。因為對這些線程函數(shù)不是很了解,在使用 pthread_create()函數(shù)創(chuàng)建線程時,老是傳入函數(shù)參數(shù)不對,后來百度之后了解到傳入的子線程函數(shù)的類型應(yīng)該為 void *(*start_thread)(void)形式。最后運行試驗與單線程的進行比較,強烈感受到多線程的并發(fā)同步運行的特點。

      總之,這次試驗使我對課堂知識有了更深的體會和鞏固,為以后的課程學(xué)習(xí)打下了基礎(chǔ)。

      第五篇:嵌入式操作系統(tǒng)實驗報告

      實驗一 嵌入式開發(fā)環(huán)境的建立

      一、實驗?zāi)康?/p>

      通過此實驗系統(tǒng),讀者可以了解嵌入式實時操作系統(tǒng) uC/OS-II 的內(nèi)核機制和運行原理。本實驗系統(tǒng)展示了 uC/OS-II 各方面的管理功能,包括信號量、隊列、內(nèi)存、時鐘等。在各個實驗中具體介紹了 uC/OS-II 的相關(guān)函數(shù)。讀者在做實驗的同時能夠結(jié)合理論知識加以分析,了解各個函數(shù)的作用和嵌入式應(yīng)用程序的設(shè)計方法,最終對整個 uC/OS-II 和嵌入式操作系統(tǒng)的應(yīng)用有較為清楚的認(rèn)識。

      二、實驗步驟

      1.安裝集成開發(fā)環(huán)境LambdaEDU 集成開發(fā)環(huán)境LambdaEDU 的安裝文件夾為 LambdaEDU,其中有一個名為“Setup.exe” 的文件,直接雙擊該文件便可啟動安裝過程。具體的安裝指導(dǎo)請看“LambdaEDU 安裝手 冊.doc”文件。

      當(dāng) LambdaEDU 安裝完畢之后,我們看到的是一個空的界面,現(xiàn)在就開始一步一步地將 我們的實驗項目建立并運行起來。

      2.建立項目

      為了我們的實驗運行起來,需要建立1 個項目基于x86 虛擬機的標(biāo)準(zhǔn)應(yīng)用項目。通過點 擊“文件”、“新建”、“項目”開始根據(jù)向?qū)?chuàng)建一個項目。

      在隨后出現(xiàn)的對話框中選擇“Tool/標(biāo)準(zhǔn)應(yīng)用項目”,點擊下一步,開始創(chuàng)建一個標(biāo)準(zhǔn)的 可執(zhí)行的應(yīng)用程序項目。

      在隨后出現(xiàn)的對話框中填入項目名稱“ucos_x86_demo”。點擊“下一步”。

      選擇“pc386 uC/OS-II 應(yīng)用(x86)”作為該項目的應(yīng)用框架。點擊“下一步”

      選擇“pc386_elf_tra_debug”作為該項目的基本配置。點擊“完成”。

      新創(chuàng)建的項目“ucos_x86_demo”將會被添加到項目列表。src 文件夾下保存了該項目中 包含的源文件。ucos2 文件夾中包含了移植到x86 虛擬機的全部代碼。init.c 文件是基于ucos2 和本虛擬機的一個應(yīng)用程序。在進行ucos2 內(nèi)核實驗中,只需要替換init.c 文件,即可。文

      件名不限,但是文件名中最好不要使用英文符號和數(shù)字以外的其他字符,3.構(gòu)建項目

      到這里,項目配置全部完成。接下來就可以進行構(gòu)建項目了。

      第一次構(gòu)建本項目,在此項目上點擊右鍵,選擇“重建BSP 及項目”。即可開始構(gòu)建。

      之后彈出的對話框顯示了構(gòu)建的進度??梢渣c擊“在后臺運行”,以隱藏該對話框

      在構(gòu)建的同時,在右下角的“構(gòu)建信息”視圖輸出構(gòu)建過程中的詳細信息:

      注:“重新構(gòu)建”將本項目中的全部源代碼進行一次完全的編譯和連接,花費時間較多。“構(gòu)建項目”則僅僅將新修改過的源代碼進行編譯和連接,花費時間最少。“重建BSP及項 目”,不但要完成“重新構(gòu)建”的全部工作,另外還要編譯與該項目有關(guān)的的LambdaEDU 中內(nèi)置的部分代碼,花費時間最多。但是在項目剛建立后,第一次構(gòu)建時需要選擇“重建 BSP 及項目”。以后的構(gòu)建中選擇“重新構(gòu)建”或“構(gòu)建項目”即可。另外,在替換了源代 碼中的文件后,需要選擇“重新構(gòu)建”來完成該項目的構(gòu)建。

      4.配置虛擬機和目標(biāo)機代理

      (1)制作X86啟動盤

      在 LambdaEDU 中依次點擊“工具”、“Bochs”、“制作虛擬機啟動映象”。對啟動盤進行一些參數(shù)設(shè)置后(如下圖所示),系統(tǒng)將自動為你生成一個PC 虛擬機的 啟動盤映像。

      (2)配置虛擬機 選擇使用的網(wǎng)絡(luò)適配器(網(wǎng)卡)后,點擊“確定”完成配置。

      注意:如果計算機上有多網(wǎng)卡,請將其他網(wǎng)卡停用(包括 VMware 虛擬機添加的虛擬 網(wǎng)卡)。

      (3)創(chuàng)建目標(biāo)機代理

      配置好虛擬機后,創(chuàng)建目標(biāo)機代理:點擊LambdaEDU 左下方窗口中綠色的十字符號,在彈出的窗口中選擇“基于TA 的連接方式”,并點擊“下一步”。

      在彈出的“新目標(biāo)機連接配置中”的這些參數(shù),應(yīng)該與之前制作啟動盤時設(shè)置的參數(shù)一致。

      注意:

      名字:輸入目標(biāo)機的名字(缺省是 default),注意如果和現(xiàn)有目標(biāo)機重名的話,改個名 字。

      連接類型:默認(rèn)選擇 UDP IP地址:這里輸入目標(biāo)機(在本實驗系統(tǒng)中是虛擬機)的 IP地址;

      最后點擊“確定”,在目標(biāo)機管理窗口中,可以看到新增加了一個名為default 的目標(biāo)機 節(jié)點

      (4)調(diào)試應(yīng)用 啟動虛擬機。

      虛擬機啟動后的畫面如下(其中顯示的IP 地址創(chuàng)建虛擬機啟動盤時填入的IP 地址)中設(shè)置的IP 地址):

      在成功完成構(gòu)建的項目ucos_x86_demo 中的“pc386_elf_tra_debug”上點擊鼠標(biāo)右鍵,在彈出的菜單中選擇“調(diào)試”,啟動調(diào)試器調(diào)試生成的程序:

      第一次進行調(diào)試/運行,需要選擇目標(biāo)機,如下圖,選擇“Default”,點擊“確定”,開 始向目標(biāo)機(虛擬機)下載應(yīng)用程序。程序下載完成后,會彈出一個“確認(rèn)透視圖切換”對話框,選擇“是”,切換到調(diào)試透 視圖。

      調(diào)試的界面如下:

      點擊綠色的按鈕,全速運行。

      注意:全速運行后,程序不能夠被暫停和停止。

      三、實驗過程中遇到的問題及體會

      在設(shè)置IP地址時,要求該IP地址與本計算機在同一個子網(wǎng)中,同時要求該 IP地址沒有被網(wǎng)絡(luò)上其他計算機使用。此外,通過構(gòu)建開發(fā)環(huán)境,處次體驗到了嵌入式開發(fā)工作的樂趣。

      實驗二 任務(wù)的基本管理

      一、實驗?zāi)康?/p>

      1.理解任務(wù)管理的基本原理,了解任務(wù)的各個基本狀態(tài)及其變遷過程; 2.掌握 uC/OS-II 中任務(wù)管理的基本方法(創(chuàng)建、啟動、掛起、解掛任務(wù)); 3.熟練使用 uC/OS-II 任務(wù)管理的基本系統(tǒng)調(diào)用。

      二、實驗原理及程序結(jié)構(gòu)

      1.實驗設(shè)計

      為了展現(xiàn)任務(wù)的各種基本狀態(tài)及其變遷過程,本實驗設(shè)計了 Task0、Task1 兩個任務(wù): 任務(wù) Task0 不斷地掛起自己,再被任務(wù) Task1 解掛,兩個任務(wù)不斷地切換執(zhí)行。通過本實驗,讀者可以清晰地了解到任務(wù)在各個時刻的狀態(tài)以及狀態(tài)變遷的原因。2.運行流程 描述如下:

      (1)系統(tǒng)經(jīng)歷一系列的初始化過程后進入 boot_card()函數(shù),在其中調(diào)用 ucBsp_init()進 行板級初始化后,調(diào)用 main()函數(shù);

      (2)main()函數(shù)調(diào)用 OSInit()函數(shù)對 uC/OS-II 內(nèi)核進行初始化,調(diào)用 OSTaskCreate 創(chuàng) 建起始任務(wù) TaskStart;

      (3)main()函數(shù)調(diào)用函數(shù) OSStart()啟動 uC/OS-II 內(nèi)核的運行,開始多任務(wù)的調(diào)度,執(zhí) 行當(dāng)前優(yōu)先級最高的就緒任務(wù) TaskStart;(4)TaskStart 完成如下工作:

      a、安裝時鐘中斷并初始化時鐘,創(chuàng)建 2 個應(yīng)用任務(wù);

      b、掛起自己(不再被其它任務(wù)喚醒),系統(tǒng)切換到當(dāng)前優(yōu)先級最高的就緒任務(wù)Task0。之后整個系統(tǒng)的運行流程如下:

      ? t1 時刻,Task0 開始執(zhí)行,它運行到 t2 時刻掛起自己;

      ? t2 時刻,系統(tǒng)調(diào)度處于就緒狀態(tài)的優(yōu)先級最高任務(wù) Task1 執(zhí)行,它在 t3 時刻喚醒Task0,后者由于優(yōu)先級較高而搶占 CPU;

      ? Task0 執(zhí)行到 t4 時刻又掛起自己,內(nèi)核調(diào)度 Task1 執(zhí)行; ? Task1 運行至 t5 時刻再度喚醒 Task0; ? ……

      3.μC/OS-Ⅱ中的任務(wù)描述

      一個任務(wù)通常是一個無限的循環(huán),由于任務(wù)的執(zhí)行是由操作系統(tǒng)內(nèi)核調(diào)度的,因此任務(wù)是絕不會返回的,其返回參數(shù)必須定義成 void。在μC/OS-Ⅱ中,當(dāng)一個運行著的任務(wù)使一個比它優(yōu)先級高的任務(wù)進入了就緒態(tài),當(dāng)前任務(wù)的 CPU 使用權(quán)就會被搶占,高優(yōu)先級任務(wù)會立刻得到 CPU 的控制權(quán)(在系統(tǒng)允許調(diào)度和任務(wù)切換的前提下)。μC/OS-Ⅱ可以管理多達 64 個任務(wù),但目前版本的μC/OS-Ⅱ有兩個任務(wù)已經(jīng)被系統(tǒng)占用了(即空閑任務(wù)和統(tǒng)計任務(wù))。必須給每個任務(wù)賦以不同的優(yōu)先級,任務(wù)的優(yōu)先級號就是任務(wù)編號(ID),優(yōu)先級可以從 0 到 OS_LOWEST_PR10-2。優(yōu)先級號越低,任務(wù)的優(yōu)先級越高。μC/OS-Ⅱ總是運行進入就緒態(tài)的優(yōu)先級最高的任務(wù)。4.源程序說明(1)TaskStart任務(wù)

      TaskStart 任務(wù)負責(zé)安裝操作系統(tǒng)的時鐘中斷服務(wù)例程、初始化操作系統(tǒng)時鐘,并創(chuàng)建所 有的應(yīng)用任務(wù):

      UCOS_CPU_INIT();/* Install uC/OS-II's clock tick ISR */ UCOS_TIMER_START();/*Timer 初始化*/ TaskStartCreateTasks();/* Create all the application tasks */ OSTaskSuspend(OS_PRIO_SELF);

      具體負責(zé)應(yīng)用任務(wù)創(chuàng)建的 TaskStartCreateTasks 函數(shù)代碼如下,它創(chuàng)建了兩個應(yīng)用任務(wù) Task0 和 Task1:

      void TaskStartCreateTasks(void){

      INT8U i;

      for(i = 0;i < N_TASKS;i++)// Create tasks {

      TaskData[i] = i;// Each task will display itsown information }

      OSTaskCreate(Task0,(void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE1], 6);}

      TaskStart 任務(wù)完成上述操作后將自己掛起,操作系統(tǒng)將調(diào)度當(dāng)前優(yōu)先級最高的應(yīng)用任務(wù)Task0 運行。(2)應(yīng)用任務(wù)

      應(yīng)用任務(wù) Task0 運行后將自己掛起,之后操作系統(tǒng)就會調(diào)度處于就緒狀態(tài)的優(yōu)先級最高的任務(wù),具體代碼如下: void Task0(void *pdata){

      INT8U i;INT8U err;i=*(int *)pdata;for(;;){

      printf(“Application tasks switched %d times!nr”,++count);

      printf(“TASK_0 IS RUNNING..............................................................nr”);printf(“task_1 is suspended!nr”);

      printf(“**************************************************nr”);err=OSTaskSuspend(5);// suspend itself } }

      應(yīng)用任務(wù) Task1 運行后將 Task0 喚醒,使其進入到就緒隊列中: void Task1(void *pdata){

      INT8U i;INT8U err;i=*(int *)pdata;for(;;){

      OSTimeDly(150);

      printf(“Application tasks switched %d times!nr”,++count);printf(“task_0 is suspended!nr”);printf(“TASK_1 IS RUNNING..............................................................nr”);printf(“**************************************************nr”);OSTimeDly(150);

      err=OSTaskResume(5);/* resume task0 */ } }

      三、運行及觀察應(yīng)用輸出信息

      按照本實驗手冊第一部分所描述的方法建立應(yīng)用項目并完成構(gòu)建,當(dāng)我們在 LambdaEDU 調(diào)試器的控制下運行構(gòu)建好的程序后,將看到在μC/OS-Ⅱ內(nèi)核的調(diào)度管理下,兩個應(yīng)用任務(wù)不斷切換執(zhí)行的情形:

      四、本實驗中用到的μC/OS-Ⅱ相關(guān)函數(shù)

      4.1 OSTaskCreate()

      OSTaskCreate()建立一個新任務(wù)。任務(wù)的建立可以在多任務(wù)環(huán)境啟動之前,也可以在 正在運行的任務(wù)中建立。中斷處理程序中不能建立任務(wù)。一個任務(wù)必須為無限循環(huán)結(jié)構(gòu),且 不能有返回點。

      OSTaskCreate()是為與先前的μC/OS 版本保持兼容,新增的特性在 OSTaskCreateExt()函數(shù)中。

      無論用戶程序中是否產(chǎn)生中斷,在初始化任務(wù)堆棧時,堆棧的結(jié)構(gòu)必須與 CPU 中斷后 寄存器入棧的順序結(jié)構(gòu)相同。詳細說明請參考所用處理器的手冊。函數(shù)原型:

      INT8U OSTaskCreate(void(*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);

      參數(shù)說明:

      task 是指向任務(wù)代碼首地址的指針。

      pdata 指向一個數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)用來在建立任務(wù)時向任務(wù)傳遞參數(shù)。

      ptos 為指向任務(wù)堆棧棧頂?shù)闹羔?。任?wù)堆棧用來保存局部變量,函數(shù)參數(shù),返回地址 以及任務(wù)被中斷時的 CPU 寄存器內(nèi)容。任務(wù)堆棧的大小決定于任務(wù)的需要及預(yù)計的中斷嵌 套層數(shù)。計算堆棧的大小,需要知道任務(wù)的局部變量所占的空間,可能產(chǎn)生嵌套調(diào)用的函數(shù),及中斷嵌套所需空間。如果初始化常量 OS_STK_GROWTH 設(shè)為 1,堆棧被設(shè)為從內(nèi)存高地址 向 低 地 址 增 長,此時 ptos 應(yīng) 該 指 向任 務(wù)堆 棧 空 間 的 最 高 地 址。反 之,如 果OS_STK_GROWTH 設(shè)為 0,堆棧將從內(nèi)存的低地址向高地址增長。prio 為任務(wù)的優(yōu)先級。每個任務(wù)必須有一個唯一的優(yōu)先級作為標(biāo)識。數(shù)字越小,優(yōu)先級越高。返回值:

      OSTaskCreate()的返回值為下述之一: ? OS_NO_ERR:函數(shù)調(diào)用成功。

      ? OS_PRIO_EXIST:具有該優(yōu)先級的任務(wù)已經(jīng)存在。

      ? OS_PRIO_INVALID:參數(shù)指定的優(yōu)先級大于 OS_LOWEST_PRIO。? OS_NO_MORE_TCB:系統(tǒng)中沒有 OS_TCB 可以分配給任務(wù)了。注意:

      任務(wù)堆棧必須聲明為 OS_STK 類型。

      在任務(wù)中必須調(diào)用μC/OS 提供的下述過程之一:延時等待、任務(wù)掛起、等待事件發(fā)生(等待信號量,消息郵箱、消息隊列),以使其他任務(wù)得到 CPU。用 戶 程 序 中 不 能 使 用 優(yōu) 先 級 0,1,2,3,以 及 OS_LOWEST_PRIO-3, OS_LOWEST_PRIO-2, OS_LOWEST_PRIO-1, OS_LOWEST_PRIO。這些優(yōu)先級μC/OS 系統(tǒng)

      保留,其余的 56 個優(yōu)先級提供給應(yīng)用程序。4.2 OSTaskSuspend()

      OSTaskSuspend()無條件掛起一個任務(wù)。調(diào)用此函數(shù)的任務(wù)也可以傳遞參數(shù)

      OS_PRIO_SELF,掛起調(diào)用任務(wù)本身。當(dāng)前任務(wù)掛起后,只有其他任務(wù)才能喚醒。任務(wù)掛起 后,系統(tǒng)會重新進行任務(wù)調(diào)度,運行下一個優(yōu)先級最高的就緒任務(wù)。喚醒掛起任務(wù)需要調(diào)用 函數(shù) OSTaskResume()。

      任務(wù)的掛起是可以疊加到其他操作上的。例如,任務(wù)被掛起時正在進行延時操作,那么 任務(wù)的喚醒就需要兩個條件:延時的結(jié)束以及其他任務(wù)的喚醒操作。又如,任務(wù)被掛起時正 在等待信號量,當(dāng)任務(wù)從信號量的等待對列中清除后也不能立即運行,而必須等到被喚醒后。函數(shù)原型:

      INT8U OSTaskSuspend(INT8U prio);參數(shù)說明:

      prio 為指定要獲取掛起的任務(wù)優(yōu)先級,也可以指定參數(shù) OS_PRIO_SELF,掛起任務(wù)本 身。此時,下一個優(yōu)先級最高的就緒任務(wù)將運行。返回值:

      OSTaskSuspend()的返回值為下述之一: ? OS_NO_ERR:函數(shù)調(diào)用成功。

      ? OS_TASK_ SUSPEND_IDLE:試圖掛起 μC/OS-II 中的空閑任務(wù)(Idle task)。此為非法操作。

      ? OS_PRIO_INVALID :參數(shù)指定的優(yōu)先級大于 OS_LOWEST_PRIO 或沒有設(shè)定 ? OS_PRIO_SELF 的值。

      ? OS_TASK_ SUSPEND _PRIO:要掛起的任務(wù)不存在。注意:

      在程序中 OSTaskSuspend()和 OSTaskResume()應(yīng)該成對使用。用 OSTaskSuspend()掛起的任務(wù)只能用 OSTaskResume()喚醒。4.3 OSTaskResume()

      OSTaskResume()喚醒一個用 OSTaskSuspend()函數(shù)掛起的任務(wù)。OSTaskResume()也是唯一能“解掛”掛起任務(wù)的函數(shù)。函數(shù)原型:

      INT8UOSTaskResume(INT8U prio);參數(shù)說明:

      prio 指定要喚醒任務(wù)的優(yōu)先級。返回值:

      OSTaskResume()的返回值為下述之一: ? OS_NO_ERR:函數(shù)調(diào)用成功。

      ? OS_TASK_RESUME_PRIO:要喚醒的任務(wù)不存在。

      ? OS_TASK_NOT_SUSPENDED:要喚醒的任務(wù)不在掛起狀態(tài)。

      ? OS_PRIO_INVALID:參數(shù)指定的優(yōu)先級大于或等于 OS_LOWEST_PRIO。

      五、實驗過程中遇到的問題及體會

      實驗過程中體會到了嵌入式開發(fā)的樂趣,對上課老師所講的內(nèi)容有了進一步的認(rèn)識與理解。17 實驗三 信號量:哲學(xué)家就餐問題的實現(xiàn)

      一、實驗?zāi)康?/p>

      掌握在基于嵌入式實時操作系統(tǒng) uC/OS-II 的應(yīng)用中,任務(wù)使用信號量的一般原理。通 過經(jīng)典的哲學(xué)家就餐實驗,了解如何利用信號量來對共享資源進行互斥訪問。

      二、實驗原理及程序結(jié)構(gòu)

      1.實驗設(shè)計

      掌握在基于嵌入式實時操作系統(tǒng) uC/OS-II 的應(yīng)用中,任務(wù)使用信號量的一般原理。通 過經(jīng)典的哲學(xué)家就餐實驗,了解如何利用信號量來對共享資源進行互斥訪問。2.源程序說明

      五個哲學(xué)家任務(wù)(ph1、ph2、ph3、ph4、ph5)主要有兩種過程:思考(即睡眠一段時

      間)和就餐。每個哲學(xué)家任務(wù)在就餐前必須申請并獲得一左一右兩支筷子,就餐完畢后釋放 這兩支筷子。五個哲學(xué)家圍成一圈,每兩人之間有一支筷子。一共有五支筷子,在該實驗中 用了五個互斥信號量來代表。每個任務(wù)的代碼都一樣,如下所示: void Task(void *pdata){

      INT8U err;INT8U i;INT8U j;

      i=*(int *)pdata;j=(i+1)% 5;

      uC/OS-II 實驗指導(dǎo)書 for(;;){

      TaskThinking2Hungry(i);OSSemPend(fork[i], 0, &err);

      OSSemPend(fork[j], 0, &err);/* Acquire semaphores to eat */ TaskEat(i);

      OSSemPost(fork[j]);

      OSSemPost(fork[i]);/* Release semaphore */ OSTimeDly(200);/* Delay 10 clock tick */ } }

      操作系統(tǒng)配置

      修改 uC_OS-II/OS_CFG.h: :: :

      #define OS_MAX_EVENTS 10 /*最多可以有 10 個事件*/ #define OS_MAX_FLAGS 5 /*最多可以有 5 個事件標(biāo)志*/

      #define OS_MAX_MEM_PART 5 /*最多可以劃分 5 個內(nèi)存塊*/ #define OS_MAX_QS 2 /*最多可以使用 2 個隊列*/ #define OS_MAX_TASKS 8 /*最多可以創(chuàng)建 8 個任務(wù)*/

      #define OS_LOWEST_PRIO 14 /*任務(wù)優(yōu)先級不可以大于 14*/ #define OS_TASK_IDLE_STK_SIZE 1024 /*空閑任務(wù)堆棧大小*/ #define OS_TASK_STAT_EN 1 /*是否允許使用統(tǒng)計任務(wù)*/ #define OS_TASK_STAT_STK_SIZE 1024 /*統(tǒng)計任務(wù)堆棧大小*/ #define OS_FLAG_EN 1 /*是否允許使用事件標(biāo)志功能*/

      #define OS_FLAG_WAIT_CLR_EN 1 /*是否允許等待清除事件標(biāo)志*/ #define OS_FLAG_ACCEPT_EN 1 /*是否允許使用 OSFlagAccept()*/ #define OS_FLAG_DEL_EN 1 /*是否允許使用 OSFlagDel()*/

      #define OS_FLAG_QUERY_EN 1 /*是否允許使用 OSFlagQuery()*/ #define OS_MBOX_EN 0 /*是否允許使用郵箱功能*/

      #define OS_MEM_EN 0 /*是否允許使用內(nèi)存管理的功能*/

      #define OS_MUTEX_EN 0 /*是否允許使用互斥信號量的功能*/ #define OS_Q_EN 0 /*是否允許使用隊列功能*/ #define OS_SEM_EN 1 /*是否允許使用信號量功能*/

      #define OS_SEM_ACCEPT_EN 1 /*是否允許使用 OSSemAccept()*/ #define OS_SEM_DEL_EN 1 /*是否允許使用OSSemDel()*/

      #define OS_SEM_QUERY_EN 1 /*是否允許使用OSSemQuery()*/ #define OS_TASK_CHANGE_PRIO_EN 1 /* 是 否 允 許 使 用 OSTaskChangePrio()*/

      #define OS_TASK_CREATE_EN 1 /*是否允許使用 OSTaskCreate()*/

      #define OS_TASK_CREATE_EXT_EN 1 /*是否允許使用 OSTaskCreateExt()*/ #define OS_TASK_DEL_EN 1 /*是否允許使用 OSTaskDel()*/

      #define OS_TASK_SUSPEND_EN 1 /* 是 否 允 許 使 用 OSTaskSuspend()and OSTaskResume()*/

      #define OS_TASK_QUERY_EN 1 /*是否允許使用 OSTaskQuery()*/ #define OS_TIME_DLY_HMSM_EN 1 /* 是 否 允 許 使 用 OSTimeDlyHMSM()*/

      #define OS_TIME_DLY_RESUME_EN 1 /* 是 否 允 許 使 用 OSTimeDlyResume()*/

      #define OS_TIME_GET_SET_EN 1 /* 是否允許使用 OSTimeGet()和 OSTimeSet()*/

      #define OS_SCHED_LOCK_EN 1 /* 是 否 允 許 使 用 OSSchedLock()和 OSSchedUnlock()*/

      #define OS_TICKS_PER_SEC 200 /*設(shè)置每秒之內(nèi)的時鐘節(jié)拍數(shù)目*/

      三、運行及觀察應(yīng)用輸出信息

      開始,所有的哲學(xué)家先處于 thinking 狀態(tài),然后都進入 hungry 狀態(tài):

      后首先獲得兩個信號量的 1、3 號哲學(xué)家開始 eating,待他們釋放相關(guān)信號量之后,哲

      學(xué)家 2、5、4 獲得所需的信號量并 eating: 應(yīng)用如此這般地循環(huán)執(zhí)行程序下去??

      四、本實驗中用到的μC/OS-Ⅱ相關(guān)函數(shù)

      4.1 OSSemCreate()

      OSSemCreate()函數(shù)建立并初始化一個信號量。信號量的作用如下: ? 允許一個任務(wù)和其他任務(wù)或者中斷同步 ? 取得設(shè)備的使用權(quán) ? 標(biāo)志事件的發(fā)生

      函數(shù)原型:

      OS_EVENT *OSSemCreate((((WORD value))))參數(shù)說明:

      value 參數(shù)是所建立的信號量的初始值,可以取 0 到 65535 之間的任何值。返回值:

      OSSemCreate()函數(shù)返回指向分配給所建立的信號量的控制塊的指針。如果沒有可用的 控制塊,OSSemCreate()函數(shù)返回空指針。注意:

      必須先建立信號量,然后使用。4.2 OSSemPend()

      OSSemPend()函數(shù)用于任務(wù)試圖取得設(shè)備的使用權(quán),任務(wù)需要和其他任務(wù)或中斷同

      步,任務(wù)需要等待特定事件的發(fā)生的場合。如果任務(wù)調(diào)用 OSSemPend()函數(shù)時,信號量 的值大于零,OSSemPend()函數(shù)遞減該值并返回該值。如果調(diào)用時信號量等于零,OSSemPend()函數(shù)函數(shù)將任務(wù)加入該信號量的等待隊列。OSSemPend()函數(shù)掛起當(dāng)前 任務(wù)直到其他的任務(wù)或中斷置起信號量或超出等待的預(yù)期時間。如果在預(yù)期的時鐘節(jié)拍內(nèi)信 號量被置起,μC/OS-Ⅱ默認(rèn)最高優(yōu)先級的任務(wù)取得信號量恢復(fù)執(zhí)行。一個被 OSTaskSuspend()函數(shù)掛起的任務(wù)也可以接受信號量,但這個任務(wù)將一直保持掛起狀態(tài)直到通過調(diào)用 OSTaskResume()函數(shù)恢復(fù)任務(wù)的運行。函數(shù)原型: :: :

      Void OSSemPend(OS_EVNNT *pevent, INT16U timeout, int8u *err);參數(shù)說明: :: :

      pevent

      是指向信號量的指針。該指針的值在建立該信號量時可以得到。(參考 OSSemCreate()函數(shù))。

      Timeout

      允許一個任務(wù)在經(jīng)過了指定數(shù)目的時鐘節(jié)拍后還沒有得到需要的信號量時 恢復(fù)就緒狀態(tài)。如果該值為零表示任務(wù)將持續(xù)地等待信號量,最大的等待時間為 65535 個時

      鐘節(jié)拍。這個時間長度并不是非常嚴(yán)格的,可能存在一個時鐘節(jié)拍的誤差。

      Err 是指向包含錯誤碼的變量的指針。OSSemPend()函數(shù)返回的錯誤碼可能為下述幾 種:

      ? OS_NO_ERR :信號量不為零。

      ? OS_TIMEOUT :信號量沒有在指定數(shù)目的時鐘周期內(nèi)被設(shè)置。

      ? OS_ERR_PEND_ISR :從中斷調(diào)用該函數(shù)。雖然規(guī)定了不允許從中斷調(diào)用該函數(shù),但 μC/OS-Ⅱ仍然包含了檢測這種情況的功能。

      ?

      OS_ERR_EVENT_TYPE :pevent 不是指向信號量的指針。返回值: 無 注意:

      必須先建立信號量,然后使用。不允許從中斷調(diào)用該函數(shù)。

      4.3 OSSemPost()

      OSSemPost()函數(shù)置起指定的信號量。如果指定的信號量是零或大于零,OSSemPost()函數(shù)遞增該信號量并返回。如果有任何任務(wù)在等待信號量,最高優(yōu)先級的任務(wù)將得到信

      號量并進入就緒狀態(tài)。任務(wù)調(diào)度函數(shù)將進行任務(wù)調(diào)度,決定當(dāng)前運行的任務(wù)是否仍然為最高 優(yōu)先級的就緒狀態(tài)的任務(wù)。函數(shù)原型:

      INT8U OSSemPost(OS_EVENT *pevent);參數(shù)說明:

      pevent

      是指向信號量的指針。該指針的值在建立該信號量時可以得到。(參考 OSSemCreate()函數(shù))。返回值:

      OSSemPost()函數(shù)的返回值為下述之一: ?

      OS_NO_ERR :信號量被成功地設(shè)置 ?

      OS_SEM_OVF :信號量的值溢出

      ?

      OS_ERR_EVENT_TYPE :pevent 不是指向信號量的指針 注意:

      必須先建立信號量,然后使用。4.4 OSTimeDly()

      OSTimeDly()將一個任務(wù)延時若干個時鐘節(jié)拍。如果延時時間大于 0,系統(tǒng)將立即進 行任務(wù)調(diào)度。延時時間的長度可從 0 到 65535 個時鐘節(jié)拍。延時時間 0 表示不進行延時,函

      數(shù)將立即返回調(diào)用者。延時的具體時間依賴于系統(tǒng)每秒鐘有多少時鐘節(jié)拍(由文件 SO_CFG.H 中的常量 OS_TICKS_PER_SEC 設(shè)定)。函數(shù)原型:

      void OSTimeDly(INT16U ticks);參數(shù)說明:

      ticks 為要延時的時鐘節(jié)拍數(shù)。返回值:

      注意:

      注意到延時時間 0 表示不進行延時操作,而立即返回調(diào)用者。為了確保設(shè)定的延時時間,建議用戶設(shè)定的時鐘節(jié)拍數(shù)加 1。例如,希望延時 10 個時鐘節(jié)拍,可設(shè)定參數(shù)為 11。

      五、實驗過程中遇到的問題及體會

      在實驗前要對該問題進行深入的理解,即五個哲學(xué)家任務(wù)(ph1、ph2、ph3、ph4、ph5)主要有兩種過程:思考(即睡眠一段時間)和就餐。每個哲學(xué)家任務(wù)在就餐前必須申請并獲得一左一右兩支筷子,就餐完畢后釋放這兩支筷子。五個哲學(xué)家圍成一圈,每兩人之間有一支筷子。只有理解了,才能更好的進行實驗。

      下載操作系統(tǒng)專題實驗報告樣式word格式文檔
      下載操作系統(tǒng)專題實驗報告樣式.doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進行舉報,并提供相關(guān)證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實,本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        操作系統(tǒng)實驗報告[五篇材料]

        計算機學(xué)院實驗報告 課 程實驗名稱 專 業(yè)班 級學(xué) 號學(xué)生姓名 操作系統(tǒng) 進程的控制 計算機操作系統(tǒng) 131110196 鄒明鎮(zhèn) 嘉應(yīng)學(xué)院計算機學(xué)院 1305 一、實驗?zāi)康?熟悉......

        linux操作系統(tǒng)實驗報告

        Linux實驗報告一 一、實驗步驟及內(nèi)容 1.虛擬機軟件的安裝 (1)先準(zhǔn)備虛擬機安裝包。 (2)更改安裝路徑: "D: VMwareVMware Workstationvmware.exe" (3)輸入序列號:ctrl+v, 在安裝過......

        操作系統(tǒng)實驗報告一

        實驗報告一 一、實驗?zāi)康?通過本實驗,掌握Linux的基本操作以及Linux的文本編輯,對Linux有一個基本的了解。 二、實驗任務(wù) 1、 Linux的基本操作 1) 在圖形交互方式下實現(xiàn)對用戶......

        操作系統(tǒng)實驗報告(clock算法)

        實驗四 頁面置換算法 一、實驗?zāi)康?本實驗主要對操作系統(tǒng)中請求分頁式內(nèi)存管理及其應(yīng)用的一些關(guān)鍵算法進行模擬。學(xué)生通過設(shè)計與實現(xiàn)Clock算法,能夠加強對相應(yīng)理論的理解,并對......

        操作系統(tǒng)銀行家算法實驗報告

        實驗四死鎖 一、 實驗?zāi)康? 當(dāng)系統(tǒng)的總資源數(shù)m小于或等于所有進程對對資源的最大需求時,就可能產(chǎn)生 死鎖。死鎖會引起計算機系統(tǒng)的癱瘓。銀行家算法是在實現(xiàn)資源分配時避免......

        操作系統(tǒng)實驗報告(共5篇)

        實驗項目二 進程管理 一、 實驗?zāi)康?1. 理解進程的概念,掌握父、子進程創(chuàng)建的方法。 2. 認(rèn)識和了解并發(fā)執(zhí)行的實質(zhì),掌握進程的并發(fā)及同步操作。 二、 實驗內(nèi)容 1. 編寫一C語言......

        操作系統(tǒng)上機實驗報告格式規(guī)范

        操作系統(tǒng)上機實驗報告學(xué)生姓名:學(xué)號:學(xué)院: 實驗日期:實驗名稱:實驗?zāi)康模簩嶒瀮?nèi)容:實驗步驟及分析: (此部分為關(guān)鍵內(nèi)容。要求總結(jié)編寫實驗過程中遇到哪些問題,如何解決的,若未解決也應(yīng)總......

        S操作系統(tǒng)實驗報告五篇

        DOS操作系統(tǒng)實驗報告(2) 班級_____________姓名_____________學(xué)號_____________ 一、寫出下列命令(設(shè)當(dāng)前目錄為C:): 1、將c盤windows目錄中主名長度為1-4個字符的所有文件拷貝......