實驗二三程序的控制 互斥實驗

2022-12-02 15:45:05 字數 3388 閱讀 1291

北京聯合大學資訊學院

「作業系統」課程

實驗報告

實驗名稱: 實驗二三程序的控制、互斥實驗

姓名(學號

專業: 電腦科學與技術

編制時間2023年4月19日

指導教師

北京聯合大學-資訊學院編制

實驗二三程序的控制、互斥實驗

1、用fork( )建立乙個程序,再呼叫exec( )用新的程式替換該子程序的內容,利用wait( )來控制程序執行順序。

2、編寫程式,每乙個程序迴圈顯示一句話。子程序顯示'daughter …'及'son ……',父程序顯示 'parent ……',觀察結果,分析原因。

3、修改實驗(一)中的程式2,用lockf( )來給每乙個程序加鎖,以實現程序之間的互斥,編寫程式,每乙個程序迴圈顯示一句話。子程序顯示'daughter …'及'son ……',父程序顯示 'parent ……',觀察結果,分析原因。

4、觀察並分析出現的現象

5、分析給定程式的輸出結果。

1、掌握程序另外的建立方法

2、熟悉程序的睡眠、同步、撤消等程序控制方法

3、進一步認識併發執行的實質

4、分析程序競爭資源的現象,學習解決程序互斥的方法

一、所涉及的系統呼叫

在unix/linux中fork( )是乙個非常有用的系統呼叫,但在unix/linux中建立程序除了fork( )之外,也可用與fork( ) 配合使用的exec( )。

1、exec( )系列

系統呼叫exec( )系列,也可用於新程式的執行。fork( )只是將父程序的使用者級上下文拷貝到新程序中,而exec( )系列可以將乙個可執行的二進位制檔案覆蓋在新程序的使用者級上下文的儲存空間上,以更改新程序的使用者級上下文。exec( )系列中的系統呼叫都完成相同的功能,它們把乙個新程式裝入記憶體,來改變呼叫程序的執行**,從而形成新程序。

如果exec( )呼叫成功,呼叫程序將被覆蓋,然後從新程式的入口開始執行,這樣就產生了乙個新程序,新程序的程序識別符號id 與呼叫程序相同。

exec( )沒有建立乙個與呼叫程序併發的子程序,而是用新程序取代了原來程序。所以exec( )呼叫成功後,沒有任何資料返回,這與fork( )不同。exec( )系列系統呼叫在unix系統庫中,共有execl、execlp、execle、execv、execvp五個,其基本功能相同,只是以不同的方式來給出引數。

2、exec( )和fork( )聯合使用

系統呼叫exec和fork( )聯合使用能為程式開發提供有力支援。用fork( )建立子程序,然後在子程序中使用exec( ),這樣就實現了父程序與乙個與它完全不同子程序的併發執行。

一般,wait、exec聯合使用的模型為:

int status;

if (fork( )= =0)

wait(&status);

3、wait( )

等待子程序執行結束。如果子程序沒有完成,父程序一直等待。wait( )將呼叫程序掛起,直至其子程序因暫停或終止而發來軟中斷訊號為止。

如果在wait( )前已有子程序暫停或終止,則呼叫程序做適當處理後便返回。

系統呼叫格式:

int wait(status)

int *status;

其中,status是使用者空間的位址。它的低8位反應子程序狀態,為0表示子程序正常結束,非0則表示出現了各種各樣的問題;高8位則帶回了exit( )的返回值。exit( )返回值由系統給出。

4、exit( )

終止程序的執行。

系統呼叫格式:

void exit(status)

int status;

其中,status是返回給父程序的乙個整數,以備查考。

為了及時**程序所占用的資源並減少父程序的干預,unix/linux利用exit( )來實現程序的自我終止,通常父程序在建立子程序時,應在程序的末尾安排一條exit( ),使子程序自我終止。exit(0)表示程序正常終止,exit(1)表示程序執行有錯,異常終止。

如果呼叫程序在執行exit( )時,其父程序正在等待它的終止,則父程序可立即得到其返回的整數。核心須為exit( )完成以下操作:

(1)關閉軟中斷

(2)**資源

(3)寫記帳資訊

(4)置程序為「僵死狀態」

二、所涉及的系統呼叫

lockf(files,function,size)

用作鎖定檔案的某些段或者整個檔案。

本函式的標頭檔案為

#include ""

引數定義:

int lockf(files,function,size)

int files,function;

long size;

其中:files是檔案描述符;function是鎖定和解鎖:1表示鎖定,0表示解鎖。size是鎖定或解鎖的位元組數,為0,表示從檔案的當前位置到檔案尾。

1、用fork( )建立乙個程序,再呼叫exec( )用新的程式替換該子程序的內容,利用wait( )來控制程序執行順序。

圖 1 程式**

圖 2 執行**

2、修改實驗(一)中的程式2,用lockf( )來給每乙個程序加鎖,以實現程序之間的互斥,編寫程式,每乙個程序迴圈顯示一句話。子程序顯示'daughter …'及'son ……',父程序顯示 'parent ……',觀察結果,分析原因。

圖 3 程式**

圖 4 執行**

3、分析給定程式的輸出結果。

圖 5 程式**

圖 6執行結果

重點掌握如何用fork( )建立乙個程序,再呼叫exec( )用新的程式替換該子程序的內容,如何利用wait( )來控制程序執行順序;怎麼使用lockf(files,function,size),用作鎖定檔案的某些段或者整個檔案。

通過本次實驗,我掌握程序另外的建立方法,熟悉程序的睡眠、同步、撤消等程序控制方法,對程式有一定的了解,能夠對老師所給的程式進行改編,變成自己想要的程式,在程式編寫過程中,乙個小錯誤就使程式不能達到預期的效果,所以,我非常認真的檢查, 最後找到了實驗的錯誤所在,通過分析程序競爭資源的現象,學習解決程序互斥的方法。使我程式設計完有種成就感。

1、上述程式執行時,不同程序之間不存在共享臨界資源(其中印表機的互斥性已由作業系統保證)問題,所以加鎖與不加鎖效果相同?

如果存在臨界資源,我認為加鎖與不加鎖的效果是不一樣的,臨界資源保證了程式的互斥訪問,加鎖與不加鎖也實現了程式的互斥訪問。

2、思考

(1)什麼是程序同步?wait( )是如何實現程序同步的?

程序同步指的是同時發生的事情,在作業系統中指的是多個相關程序在執行次序上要協調。wait()實現程序同步的過程:首先查詢呼叫程序是否有子程序,若無,則返回出錯碼;若找到一處於「僵死狀態」的子程序,則將子程序的執行時間加到父程序的執行時間上,並釋放子程序的程序表項;若未找到處於「僵死狀態」的子程序,則呼叫程序便在可被中斷的優先順序上睡眠,等待其子程序發來軟中斷訊號時被喚醒。

實驗3程序管理

一.實驗目的 1 加深對程序概念的理解,明確程序和程式的區別。2 進一步認識併發執行的實質。3 分析程序競爭資源現象,學習解決程序互斥的方法。二.實驗內容 1 程序建立 2 程序控制。三.實驗作業 1 程序的建立 除錯下面源程式 系統呼叫fork 建立兩個子程序,當此程式執行時,在系統中有乙個父程序...

實驗一程序排程實驗報告

專業 嵌入式 軟體 學號 541013090210 姓名 郝春玲 實驗日期 2012年12月27日 一 實驗目的 通過對程序排程演算法的模擬加深對程序概念和程序排程演算法的理解。二 實驗要求 編寫程式實現對5個程序的排程模擬,採用優先權的排程演算法分別進行模擬排程。三 實驗方法內容 1.演算法設計思...

核心實驗一程序管理

實驗1 程序管理 一 實驗目的 1 加深對程序概念的理解,明確程序和程式的區別。2 進一步認識併發執行的實質。3 分析程序爭用資源的現象,學習解決程序互斥的方法。4 了解linux系統中程序通訊的基本原理。二 實驗預備知識 1 閱讀linux的sched.h原始碼檔案,加深對程序管理概念的理解。2 ...