實驗一——Linux環境下的進程管理_第1頁
實驗一——Linux環境下的進程管理_第2頁
實驗一——Linux環境下的進程管理_第3頁
實驗一——Linux環境下的進程管理_第4頁
實驗一——Linux環境下的進程管理_第5頁
已閱讀5頁,還剩5頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、軟 件 學 院上 機 實 驗 報 告課程名稱: 操作系統 實驗項目: 實驗一:Linux環境下進程管理 實 驗 室: 耘慧402 姓 名: 學 號: 專業班級: 實驗時間: 實驗成績評閱教師一、 實驗目的及要求1. 加深對進程概念的理解,明確進程和程序的區別;2. 進一步認識并發執行的實質;3. 分析進程爭用資源的現象,學習解決進程互斥的方法;4. 了解Linux系統中進程通信的基本原理;二、 實驗性質 1. 進程的創建:編寫一段程序,使用系統調用fork()創建兩個子進程。當此程序運行時,在系統中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:父進程顯示字符“a”;子進程分別

2、顯示字符“b”和字符“c”。試觀察記錄屏幕上的顯示結果,并分析原因。 2. 進程的控制:修改已編寫的程序,將每個進程輸出一個字符改為每個進程輸出一句話,再觀察程序執行時屏幕上出現的現象,并分析原因。如果在程序中使用系統調用lockf()來給每一個進程加鎖,可以實現進程之間的互斥,觀察并分析出現的現象。 3. 用fork( )創建一個進程,再調用exec( )用新的程序替換該子進程的內容;利用wait( )來控制進程執行順序。三、 實驗學時 實驗性質: 驗證性 實驗學時: 4學時 實驗要求: 必做四、 實驗環境 1.實驗環境: Linux系統開發環境 2.知識準備:(1) Linux系統開發環境

3、搭建;(2) Linux環境下GCC編譯器的使用;(3)語言中函數定義與調用、指針和類型的定義與使用、結構的定義、動態內存的申請等預備知識。五、實驗內容及步驟 實驗內容:(1)進程的創建編寫一段程序,使用系統調用fork()創建兩個子進程。當此程序運行時,在系統中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:父進程顯示字符“a”;子進程分別顯示字符“b”和字符“c”。試觀察記錄屏幕上的顯示結果,并分析原因。(2)進程的控制修改已編寫的程序,將每個進程輸出一個字符改為每個進程輸出一句話,再觀察程序執行時屏幕上出現的現象,并分析原因。如果在程序中使用系統調用lockf()來給每一

4、個進程加鎖,可以實現進程之間的互斥,觀察并分析出現的現象。(3) 用fork( )創建一個進程,再調用exec( )用新的程序替換該子進程的內容;利用wait( )來控制進程執行順序。 實驗步驟: 1.進程的創建1.1 進程UNIX中,進程既是一個獨立擁有資源的基本單位,又是一個獨立調度的基本單位。一個進程實體由若干個區(段)組成,包括程序區、數據區、棧區、共享存儲區等。每個區又分為若干頁,每個進程配置有唯一的進程控制塊PCB,用于控制和管理進程。PCB的數據結構如下:(1)進程表項(Process Table Entry)。包括一些最常用的核心數據:進程標識符PID、用戶

5、標識符UID、進程狀態、事件描述符、進程和U區在內存或外存的地址、軟中斷信號、計時域、進程的大小、偏置值nice、指向就緒隊列中下一個PCB的指針P_Link、指向U區進程正文、數據及棧在內存區域的指針。(2)U區(U Area)。用于存放進程表項的一些擴充信息。每一個進程都有一個私用的U區,其中含有:進程表項指針、真正用戶標識符u-ruid(read user ID)、有效用戶標識符u-euid(effective user ID)、用戶文件描述符表、計時器、內部I/O參數、限制字段、差錯字段、返回值、信號處理數組。由于UNIX系統采用段頁式存儲管理,

6、為了把段的起始虛地址變換為段在系統中的物理地址,便于實現區的共享,所以還有:(3)系統區表項。以存放各個段在物理存儲器中的位置等信息。系統把一個進程的虛地址空間劃分為若干個連續的邏輯區,有正文區、數據區、棧區等。這些區是可被共享和保護的獨立實體,多個進程可共享一個區。為了對區進行管理,核心中設置一個系統區表,各表項中記錄了以下有關描述活動區的信息:區的類型和大小、區的狀態、區在物理存儲器中的位置、引用計數、指向文件索引結點的指針。(4)進程區表系統為每個進程配置了一張進程區表。表中,每一項記錄一個區的起始虛地址及指向系統區表中對應的區表項。核心通過查找進程區表和系統區表,便可將區的邏輯地址變換

7、為物理地址。1.2 進程映像UNIX系統中,進程是進程映像的執行過程,也就是正在執行的進程實體。它由三部分組成:(1)用戶級上、下文。主要成分是用戶程序;(2)寄存器上、下文。由CPU中的一些寄存器的內容組成,如PC,PSW,SP及通用寄存器等;(3)系統級上、下文。包括OS為管理進程所用的信息,有靜態和動態之分。1.3 所涉及的系統調用fork( )   創建一個新進程。系統調用格式:pid=fork( )參數定義:int fork( )fork( )返回值意義如下:0:在子進程中,pid變量保存的fork( )

8、返回值為0,表示當前進程是子進程。>0:在父進程中,pid變量保存的fork( )返回值為子進程的id值(進程唯一標識符)。-1:創建失敗。如果fork( )調用成功,它向父進程返回子進程的PID,并向子進程返回0,即fork( )被調用了一次,但返回了兩次。此時OS在內存中建立一個新進程,所建的新進程是調用fork( )父進程(parent process)的副本,稱為子進程(child process)。子進程繼承了父進程的許多特性,并具有與父進程完全相同的用戶級上下文。父進程與子進程并發執行。1.4 核心為fork( )完成以下操作(1)為新進程分配一進程表項和進程標識符

9、進入fork( )后,核心檢查系統是否有足夠的資源來建立一個新進程。若資源不足,則fork( )系統調用失??;否則,核心為新進程分配一進程表項和唯一的進程標識符。(2)檢查同時運行的進程數目超過預先規定的最大數目時,fork( )系統調用失敗。(3)拷貝進程表項中的數據將父進程的當前目錄和所有已打開的數據拷貝到子進程表項中,并置進程的狀態為“創建”狀態。(4)子進程繼承父進程的所有文件對父進程當前目錄和所有已打開的文件表項中的引用計數加1。(5)為子進程創建進程上、下文進程創建結束,設子進程狀態為“內存中就緒”并返回子進程的標識符。(6)子進程執行雖然父進程與子進程程序完全相同,但每個進程都有

10、自己的程序計數器PC(注意子進程的PC開始位置),然后根據pid變量保存的fork( )返回值的不同,執行了不同的分支語句。6、 實驗數據及結果分析<運行結果1分析:由于函數printf()輸出的字符串之間不會被中斷,因此,每個字符串內部的字符順序輸出時不變。但是 , 由于進程并發執行時的調度順序和父子進程的搶占處理機問題,輸出字符串的順序和先后隨著執行的不同而發生變化。這與打印單字符的結果相同。<運行結果2 分析:因為上述程序執行時,lockf(1,1,0)鎖定標準輸出設備,lockf(1,0,0)解鎖標準輸出設備,在lockf(1,1,0)與lockf(1,0,0)中

11、間的for循環輸出不會被中斷,加鎖與不加鎖效果不相同。<運行結果3 分析:程序在調用fork( )建立一個子進程后,馬上調用wait( ),使父進程在子進程結束之前,一直處于睡眠狀態。子進程用exec( )裝入命令ls ,exec( )后,子進程的代碼被ls的代碼取代,這時子進程的PC指向ls的第1條語句,開始執行ls的命令代碼。7、 實驗總結 經過這次上機實驗的學習,我們一共做了三道題,碰到的第一問題是Linux系統并非我們通常使用的Windows系統,還未上手便已產生畏懼的心理;碰到的第二個問題,在剛開始搭建環境的時候,.后面的的并非手打而是按Tab鍵引出之后的代碼,之后陸陸續續的一

12、些小問題,在老師、學長耐心的幫助下相對輕松地解決了,相比在課堂上老師的講解與課件的演示,最大的不同是我更加的直觀且真實觸摸到了這一學科,在實踐的過程中明白了當時邏輯并不清晰的抽象問題什么是進程,我想在實踐的過程中我會更加熱愛這個學科并受益匪淺。附錄 源程序清單程序1#include<stdio.h>void main()int p1,p2;while(p1=fork()=-1);if(p1=0)putchar('b');elsewhile(p2=fork()=-1);if(p2=0)putchar('c');else putchar('a&#

13、39;);<程序2#include<stdio.h>#include<unistd.h>main()int p1,p2,i;while(p1=fork()=-1);if(p1=0)lockf(1,1,0);for(i=0;i<50;i+)printf("child %d/n",i);lockf(1,0,0);elsewhile(p2=fork()=-1);if(p2=0)lockf(1,1,0);for(i=0;i<50;i+)printf("son %d/n",i);lockf(1,0,0);elselockf(1,1,0);for(i=0;i<50;i+)printf("daughter %d/n",i);lockf(1,0,0);程序3#include<stdio.h>#include<unistd.h>main( ) int pid; pid=fork( ); /*創建子進程*/switch(pid) case -1:/*創建失敗*/printf("fork fail!n");exit(1);

溫馨提示

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

評論

0/150

提交評論