操作系統(tǒng)課程設計實驗報告_第1頁
已閱讀1頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  操作系統(tǒng)課程設計實驗報告</p><p>  二00九級計算機三班</p><p><b>  學 號: </b></p><p><b>  姓 名:</b></p><p><b>  指導老師: </b></p><p

2、>  時 間:2012.02.20--2012.03.01</p><p><b>  目 錄</b></p><p>  一、任務內容及進度安排</p><p>  1. 任務內容……………………………2</p><p>  2. 進度安排……………………………5</p><p&g

3、t;  實現(xiàn)任務及其問題分析</p><p>  任務一…………………………………7</p><p>  任務二…………………………………8</p><p>  任務三…………………………………9</p><p>  任務四…………………………………9</p><p>  三、心得體會………………………………10<

4、;/p><p>  四、附錄……………………………………11</p><p>  一、任務內容及進度安排</p><p><b>  1. 任務內容</b></p><p>  任務一 I/O系統(tǒng)調用開銷比較</p><p>  在LINUX平臺用C編程逆序一個文本文件,注意顯示逆轉結果的必須是

5、原文件名。如文件原內容為“abcd”,處理后內容應為“dcba”。</p><p><b>  請分別使用三種方法</b></p><p>  (1)標準C的I/O庫函數:fopen、fread和fwrite</p><p> ?。?)Unix的I/O函數:open、read 和write</p><p>  (3)op

6、en和mmap</p><p>  要求盡量考慮效率,比較三種方法的性能。</p><p>  任務二 實現(xiàn)一個簡單的shell</p><p>  實現(xiàn)一個簡單的shell(命令行解釋器),類似于sh,bash,csh等。</p><p>  你的shell 必須支持以下內部命令</p><p>  cd &l

7、t;目錄>更改當前的工作目錄到另一個<目錄>。如果<目錄>未指定,輸出當前工作目錄。如果<目錄>不存在,應當有適當的錯誤信息提示。這個命令應該也能改變PWD的環(huán)境變量。</p><p>  environ 列出所有環(huán)境變量字符串的設置(類似于Unix系統(tǒng)下的env命令)。</p><p>  echo <內容 > 顯示echo后的內容且

8、換行</p><p>  help 簡短概要的輸出你的shell的使用方法和基本功能。</p><p>  jobs 輸出shell當前的一系列子進程,必須提供子進程的命名和PID號。</p><p>  quit,exit,bye退出shell。</p><p>  所有的內部命令應當優(yōu)先于在$PATH中同名的程序。</p>

9、<p>  任何非內部命令必須請求shell創(chuàng)建一個新進程,且該子進程執(zhí)行指定的程序。這個新進程必須繼承shell的環(huán)境變量和指定的命令行參數。 </p><p>  Shell應當具有以下特征:</p><p>  Batch Processing 如果shell啟動帶有一個文件名作為參數,打開該文件并執(zhí)行文件里所有命令。待所有進程全部結束退出shell。該功能類似于shell

10、的交互模式。</p><p>  Debugging 提供-v選項,shell啟動時打開此選項將在運行過程中輸出若干調試信息。在該種模式下,shell應該顯示所有被創(chuàng)建了的進程的PID號,通報已結束的子進程和傳遞給子進程的參數等。</p><p>  Prompt(命令行提示符) 解釋器應該打印$PS2(而不是$PS1)作為提示符。</p><p>  Backgr

11、ound processing 如果命令以符號&終止,在后臺并發(fā)執(zhí)行該程序。shell立即等待下一命令行的輸入,而不等待該程序的結束。</p><p>  任務三 進程/線程同步</p><p>  編程實現(xiàn)下圖的效果,要求分別使用進程和線程</p><p> ?。?)進程+SYS V信號量</p><p>  (2)線程實現(xiàn)

12、+Posix同步操作API</p><p>  無論進程形式還是線程形式,進程/線程pi的主體反復輸出下面語句:</p><p>  I am process(or thread) pi</p><p>  執(zhí)行次數取必須保證進程并發(fā)情況的發(fā)生(比如p3和p4的交迭運行),大家自行調整。必須保證parbegin(p1(), p2(), ……, p6())并發(fā)形式的充

13、分發(fā)生, 一個典型的輸出系列如下:</p><p>  I am thread 1</p><p><b>  .....</b></p><p>  I am thread 1</p><p>  I am thread 1</p><p><b>  .....</b>&

14、lt;/p><p>  I am thread 1</p><p>  I am thread 3</p><p><b>  .....</b></p><p>  I am thread 3</p><p>  I am thread 2</p><p><b>

15、  .....</b></p><p>  I am thread 2</p><p>  I am thread 3</p><p><b>  .....</b></p><p>  I am thread 3</p><p>  I am thread 2</p>

16、<p>  任務四 文件內容的并行搜索</p><p>  在閱讀大型項目代碼時,經常要搜索某個標識符,找出該標識符的聲明、定義或引用的地方(某文件的哪一行)。本任務要求實現(xiàn)一個程序idfind,其使用格式如下:</p><p>  idfind [-j n] id dirname</p><p>  選項 -j 指定并行線程數目。如果省略該選

17、項,則只啟動一個線程。</p><p>  id表示要查找的標識符,dirname表示項目所在目錄。</p><p>  任務五 實現(xiàn)一個malloc/free</p><p>  實現(xiàn)一個malloc/free,必須按講義指出的方案(注意,因為網上有一些現(xiàn)成的版本,凡未按講義方案實現(xiàn)者均無效)</p><p>  設計測試實例,并與l

18、ibc的malloc實現(xiàn)進行性能比較。</p><p>  選做,分析你正在使用的libc下malloc的實現(xiàn)。</p><p>  請參考下面的材料注意其如何保證性能。</p><p>  任務六 利用元數據操作ext2文件系統(tǒng)</p><p>  1.了解并熟悉EX2文件系統(tǒng)的組織結構。</p><p>  

19、2.編制一個文件系統(tǒng)瀏覽器,該瀏覽器類似shell,但只能對一個ext2文件系統(tǒng)執(zhí)行以下操作:</p><p>  a) cd: 改變用戶當前工作目錄。假定初始目錄為ext2文件系統(tǒng)的根目錄。</p><p>  b) ls: 列出用戶當前目錄的所有文件,每項輸出格式包括:文件的權限,文件大小,修改時間和文件名。</p><p>  c) cat: 輸出一個文件的內

20、容。</p><p>  d) exit: 退出該程序 </p><p>  這幾個命令都比shell類似的命令要簡單一些。</p><p><b>  2. 進度安排</b></p><p>  周二(2012.02.21):</p><p>  1)編寫生成制定大小的文件的程序</p&g

21、t;<p>  2)編寫標準C的I/O操作程序</p><p>  3)編寫Unix的I/0操作程序</p><p>  周三(2012.02.22):</p><p>  1)編寫mmap的I/0操作程序</p><p>  2)測試三種不同方法的性能</p><p>  3)熟悉了解shell的相關機

22、理</p><p>  周四(2012.02.23):</p><p><b>  實現(xiàn)cd命令</b></p><p>  實現(xiàn)environ命令</p><p><b>  實現(xiàn)echo命令</b></p><p><b>  實現(xiàn)help命令</b>

23、;</p><p>  周五(2012.02.24):</p><p><b>  實現(xiàn)jobs命令</b></p><p><b>  實習退出命令</b></p><p><b>  實現(xiàn)命令提示符特征</b></p><p><b>  

24、實現(xiàn)后臺運行特征</b></p><p>  周一(2012.02.27):</p><p>  實現(xiàn)外部命令調用功能</p><p>  測試shell,檢測時候達到要求</p><p>  編寫任務三的進程同步</p><p>  4)編寫任務三的縣線程同步</p><p>  

25、周二(2012.02.28):</p><p>  1)文件的搜索的單進程實現(xiàn)</p><p>  2)文件搜索的多進程實現(xiàn)</p><p>  周三(2012.02.29):</p><p><b>  1)實現(xiàn)任務五</b></p><p>  周四(2012.03.01):</p>

26、;<p><b>  測試修改任務五代碼</b></p><p>  完成實驗六的部分代碼</p><p>  周五(2012.03.02):</p><p>  1)完成實驗六的代碼</p><p>  2) 測試實驗六的功能</p><p>  二、實現(xiàn)任務及其問題分析</

27、p><p>  任務一 I/O系統(tǒng)調用開銷比較</p><p><b>  實現(xiàn)的功能:</b></p><p>  1.生成制定大小的文件</p><p>  2. 利用C實現(xiàn)文件內容的逆序</p><p>  3. 利用unix函數實現(xiàn)文件內容的逆序</p><p>

28、  4. 利用mmap函數實現(xiàn)文件內容的逆序</p><p>  5. 按照要求跟蹤實現(xiàn)性能比較</p><p><b>  問題分析:</b></p><p>  1. 文件讀取后出現(xiàn)亂碼</p><p>  分析:fread()函數的使用出現(xiàn)問題,重新修改后問題解決。</p><p>  2.

29、 文件逆序后無法打開</p><p>  分析:fwrite()函數的使用出現(xiàn)問題,字符串在重新逆序后沒有添加結束符。</p><p>  3. 對漢字文件操作后,文件全部為亂碼</p><p>  分析:不同的編譯器中對漢字的大小定義不同,修改每次讀取的字節(jié)數,問題解決。</p><p>  4. 解決中間文件,實現(xiàn)文件逆序,程序執(zhí)行后無變

30、化</p><p>  分析:文件的打開方式不正確,導致無法寫入文件,修改打開方式后,文件操作成功。</p><p>  任務二 實現(xiàn)一個簡單的shell</p><p><b>  實現(xiàn)的功能:</b></p><p>  1. 內部命令cd功能</p><p>  2. 內部命令echo

31、功能</p><p>  3. 內部命令environ功能</p><p>  4. 內部命令help功能</p><p>  5. 內部命令jobs功能</p><p>  6. 內部命令退出功能</p><p>  7. 解釋器應該打印$PS2作為提示符。</p><p>  8. 命令以符

32、號&終止,在后臺并發(fā)執(zhí)行該程序。shell立即等待下一命令行的輸入,而不等待該程序的結束。</p><p><b>  問題分析:</b></p><p>  1. cd功能實現(xiàn)過程中,無法確定路徑改變時候成功</p><p>  問題分析:模仿linux的shell模式,在命令提示符中調用環(huán)境變量,打印當前的路徑。</p>

33、<p>  2. Echo命令執(zhí)行之后會,在字符串的最后會出現(xiàn)'\n'符號</p><p>  問題分析:檢查程序語句后,發(fā)現(xiàn)在命令解析時,字符串結束符的添加位置出現(xiàn)偏差,忽略了被讀取的換行符號。</p><p>  3. 實現(xiàn)jobs功能時,無法調用系統(tǒng)程序,而自己實現(xiàn)時又無法操作</p><p>  問題分析:設置結構體數字,存儲子

34、進程的名稱、ID號、及狀態(tài)。ID號在父進程返回時獲取并保存,狀態(tài)通過fork()返回的次數來確定。</p><p>  在解析命令時,當命令中參數比較多多時,解析代碼會出現(xiàn)錯誤。</p><p>  任務三 進程/線程同步</p><p><b>  實現(xiàn)的功能:</b></p><p><b>  1.

35、 線程的同步</b></p><p><b>  2. 進程的同步</b></p><p><b>  問題分析:</b></p><p>  1. 子進程在信號量為0的狀態(tài)下,沒有阻塞,依然執(zhí)行。</p><p>  問題分析:函數的參數設置問題,修改函數參數設置。</p>

36、<p>  2. 無法創(chuàng)建信號量或創(chuàng)建后無法初始化為0</p><p>  問題分析:信號量創(chuàng)建函數的參數設置問題,在最后的參數添加一個參數0666,問題解決。</p><p>  3. 進程并發(fā)一定后,程序死鎖</p><p>  問題分析:在程序中發(fā)現(xiàn)在同一進程代碼中兩次申請了 同一資源,導致死鎖。</p><p>  4.

37、 進程無法出現(xiàn)較為理想的并發(fā)狀態(tài)</p><p>  問題分析:在各個進程的打印次數設置方面不合理,修改各個子進程的打印次數,使其能產生理想的狀態(tài)。</p><p>  5. 進程4和進程3僅僅發(fā)生一次并發(fā),后來一直等待進程3結束后,進程4又開始執(zhí)行。</p><p>  問題分析:進程4釋放資源后,進程5占據,等待資源3,從而導致進程5和進程4競爭資源2,導致進程

38、4無法執(zhí)行,增加進程2的資源數后問題解決。 </p><p>  任務四 文件內容的并行搜索</p><p>  任務四的并行搜索實現(xiàn)的比較少,僅僅通過多種渠道了解了如何進行操作,但是后面沒有多余的時間進行編寫。</p><p><b>  心得體會</b></p><p>  在此次操作系統(tǒng)課程設計中,對于專業(yè)方

39、面的知識又有了更多的了解,同時也接觸到了一個全新的程序設計平臺。</p><p>  此次課程設計的操作平臺是linux操作系統(tǒng),在此之前,自己</p><p>  對linux并沒有太多的了解。通過此次課程設計,自己對linux系統(tǒng)及基于linux核心的程序設計有了個更多的了解,同時也體會到linux平臺下編譯工具的方便及強大,同時也深刻體驗了開源的操作系統(tǒng)對于一個計算機從業(yè)者的重要性。

40、通過linux下的c編程,自己又找到了一個新的編程方向。</p><p>  此外,此次課程設計的前兩個任務的意義沒有特別的體現(xiàn),基本是利用編程的知識來實現(xiàn)一個具有特定功能的程序或者系統(tǒng),沒有感到太多的不同。然而,第三個實驗的同步卻讓我感覺到了有一中不一樣的感覺。通過自己編程實踐,體會到了多線程、多進程同步的機理,對于進程、線程同步有了更深刻的了解,確實感覺到了多進程多線程的優(yōu)越及有趣之處,使我自己對進程和線程同

41、步有了更大的興趣。</p><p>  后面的三個任務可能具有更大的意義,但是由于自己在前面的實驗花費了太多的時間的,導致后面沒有時間繼續(xù)完成?,F(xiàn)在看來感覺前面的任務其實沒什么,但是實際做起來,卻沒有那么高的效率,也使我認識到自己的不足及努力的方向。</p><p><b>  附錄:</b></p><p><b>  線程并發(fā):&

42、lt;/b></p><p>  #include <stdio.h></p><p>  #include <pthread.h></p><p>  #include <stdlib.h></p><p>  #include <unistd.h></p><p&g

43、t;  pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;</p><p>  pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;</p><p>  pthread_mutex_t mutex3 = PTHREAD_MUTEX_INITIALIZER;</p><p

44、>  pthread_mutex_t mutex4 = PTHREAD_MUTEX_INITIALIZER;</p><p>  pthread_mutex_t mutex5 = PTHREAD_MUTEX_INITIALIZER;</p><p>  pthread_mutex_t mutex6 = PTHREAD_MUTEX_INITIALIZER;</p><

45、;p>  pthread_mutex_t mutex7 = PTHREAD_MUTEX_INITIALIZER;</p><p>  void *thread1(void *arg)</p><p><b>  {</b></p><p><b>  int i,j;</b></p><p>

46、  for(i=0;i<10;i++)</p><p><b>  {</b></p><p>  printf("I am process 1\n");</p><p>  fflush(stdout);</p><p><b>  sleep(1);</b></p

47、><p><b>  }</b></p><p>  pthread_mutex_unlock(&mutex1);</p><p>  pthread_mutex_unlock(&mutex2);</p><p>  return NULL;</p><p><b>  }&

48、lt;/b></p><p>  void *thread2(void *arg)</p><p><b>  {</b></p><p><b>  int i,j;</b></p><p>  pthread_mutex_lock(&mutex1);</p><

49、p>  for(i=0;i<10;i++)</p><p><b>  {</b></p><p>  printf("I am process 2\n");</p><p>  fflush(stdout);</p><p><b>  sleep(1);</b>&

50、lt;/p><p><b>  }</b></p><p>  pthread_mutex_unlock(&mutex1);</p><p>  pthread_mutex_unlock(&mutex3);</p><p>  pthread_mutex_unlock(&mutex4);</p&

51、gt;<p>  return NULL;</p><p><b>  }</b></p><p>  void *thread3(void *arg)</p><p><b>  {</b></p><p><b>  int i,j;</b></p>

52、;<p>  pthread_mutex_lock(&mutex2);</p><p>  for(i=0;i<30;i++)</p><p><b>  {</b></p><p>  printf("I am process 3\n");</p><p>  fflus

53、h(stdout);</p><p><b>  sleep(1);</b></p><p><b>  }</b></p><p>  pthread_mutex_unlock(&mutex2);</p><p>  pthread_mutex_unlock(&mutex5);&l

54、t;/p><p>  return NULL;</p><p><b>  }</b></p><p>  void *thread4(void *arg)</p><p><b>  {</b></p><p><b>  int i,j;</b><

55、/p><p>  pthread_mutex_lock(&mutex3);</p><p>  for(i=0;i<40;i++)</p><p><b>  {</b></p><p>  printf("I am process 4\n");</p><p>  

56、fflush(stdout);</p><p><b>  sleep(1);</b></p><p><b>  }</b></p><p>  pthread_mutex_unlock(&mutex3);</p><p>  pthread_mutex_unlock(&mutex

57、7);</p><p>  return NULL;</p><p><b>  }</b></p><p>  void *thread5(void *arg)</p><p><b>  {</b></p><p><b>  int i,j;</b>

58、;</p><p>  pthread_mutex_lock(&mutex4);</p><p>  pthread_mutex_lock(&mutex5);</p><p>  for(i=0;i<20;i++)</p><p><b>  {</b></p><p>  

59、printf("I am process 5\n");</p><p>  fflush(stdout);</p><p><b>  sleep(1);</b></p><p><b>  }</b></p><p>  pthread_mutex_unlock(&mu

60、tex4);</p><p>  pthread_mutex_unlock(&mutex5);</p><p>  pthread_mutex_unlock(&mutex6);void *thread6(void *arg)</p><p><b>  {</b></p><p><b>  i

61、nt i,j;</b></p><p>  pthread_mutex_lock(&mutex6);</p><p>  pthread_mutex_lock(&mutex7);</p><p>  for(i=0;i<5;i++)</p><p><b>  {</b></p&g

62、t;<p>  printf("I am process 6\n");</p><p>  fflush(stdout);</p><p><b>  sleep(1);</b></p><p><b>  }</b></p><p>  pthread_mutex

63、_unlock(&mutex6);</p><p>  pthread_mutex_unlock(&mutex7);</p><p>  return NULL;</p><p><b>  }</b></p><p>  int main(void)</p><p><b&

64、gt;  {</b></p><p>  pthread_t mythread1,mythread2,mythread3,mythread4,mythread5,mythread6;</p><p><b>  int i;</b></p><p>  pthread_mutex_lock(&mutex1);</p&g

65、t;<p>  pthread_mutex_lock(&mutex2);</p><p>  pthread_mutex_lock(&mutex3);</p><p>  pthread_mutex_lock(&mutex4);</p><p>  pthread_mutex_lock(&mutex5);</p&g

66、t;<p>  pthread_mutex_lock(&mutex6);</p><p>  pthread_mutex_lock(&mutex7);</p><p>  for(i=1;i<=6;i++)</p><p><b>  {</b></p><p>  if( 1 ==

67、i )</p><p><b>  {</b></p><p>  if( pthread_create(&mythread1,NULL,thread1,NULL) )</p><p>  { printf("error:111111111111111\n");</p><p>&

68、lt;b>  abort();</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if( 2 == i )</p><p><b>  {</b></p><p>  if( p

69、thread_create(&mythread2,NULL,thread2,NULL) )</p><p>  { printf("error:22222222222222222\n");</p><p><b>  abort();</b></p><p><b>  }</b>&

70、lt;/p><p><b>  }</b></p><p>  return NULL;</p><p><b>  }</b></p><p>  if( 3 == i )</p><p><b>  {</b></p><p> 

71、 if( pthread_create(&mythread3,NULL,thread3,NULL) )</p><p>  { printf("error:13333333333333333\n");</p><p><b>  abort();</b></p><p><b>  }</

72、b></p><p><b>  }</b></p><p>  if( 4 == i )</p><p><b>  {</b></p><p>  if( pthread_create(&mythread4,NULL,thread4,NULL) )</p><p

73、>  { printf("er4444444444444441\n");</p><p><b>  abort();</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if( 5

74、== i )</p><p><b>  {</b></p><p>  if( pthread_create(&mythread5,NULL,thread5,NULL) )</p><p>  { printf("error:6666666666666666\n");</p><p&

75、gt;<b>  abort();</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if( 6 == i )</p><p><b>  {</b></p><p>  i

76、f( pthread_create(&mythread6,NULL,thread6,NULL) )</p><p>  { printf("error:666666666666666\n");</p><p><b>  abort();</b></p><p><b>  }</b>

77、;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(pthread_join(mythread6,NULL))</p><p><b>  {</b></p><p>  printf("

78、;6666666666666666666\n");</p><p><b>  abort();</b></p><p><b>  }</b></p><p><b>  exit(0);</b></p><p><b>  }</b><

溫馨提示

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

評論

0/150

提交評論