作業系統 實驗一實驗報告

2022-03-26 22:51:42 字數 2446 閱讀 1674

作業系統課程實驗指導書

【實驗名稱】:併發程式設計(實驗1)

【實驗目的】:掌握在程式中建立新程序的方法, 觀察並理解多道程式併發執行的現象。

【實驗原理】:fork():建立子程序。子程序得到父程序位址空間的乙個複製。

返回值:成功時,該函式被呼叫一次,但返回兩次,fork()對子程序返回0,對父程序返回子程序識別符號(非0值)。不成功時對父程序返回-1,沒有子程序。

【實驗內容】:首先分析一下程式執行時其輸出結果有哪幾種可能性,然後實際除錯該程式觀察其實際輸出情況,比較兩者的差異,分析其中的原因。

void main (void)

【實驗要求】:每個同學必須獨立完成本實驗、提交實驗報告、源程式和可執行程式。實驗報告中必須包含預計的實驗結果,關鍵**的分析,除錯記錄,實際的實驗結果,實驗結果分析等內容。

【預計的實驗結果】

355355【關鍵**分析】

1, 這個實驗**只有幾行,看起來很簡單。可以看到,重點就是fork()函式和乙個if else 條件分支語句。

2, 關於fork()函式,它是linux的系統呼叫。

函式定義:

int fork( void );

返回值:

子程序中返回0,父程序中返回子程序id,出錯返回-1

函式說明:

乙個現有程序可以呼叫fork函式建立乙個新程序。由fork建立的新程序被稱為子程序(child process)。fork函式被呼叫一次但返回兩次。

兩次返回的唯一區別是子程序中返回0值而父程序中返回子程序id。

子程序是父程序的副本,它將獲得父程序資料空間、堆、棧等資源的副本。注意,子程序持有的是上述儲存空間的「副本」,這意味著父子程序間不共享這些儲存空間,它們之間共享的儲存空間只有**段。

3, 如果不知道fork()函式的作用的話,一定會對為什麼會有兩組輸出結果感到疑惑。我們知道,英文單詞fork有分岔,叉子的意思,這就很形象地描述了fork()的作用。簡單地說,程式段呼叫了fork()之後,程式出現了分岔,系統派生出乙個跟主程式一模一樣的子程序。

可以這樣想象,2個程序一直同時執行,而且步調一致,在fork之後,他們分別作不同的工作,也就是分岔了。

4, 乙個程序表示的,就是乙個可執行程式的一次執行過程中的乙個狀態。當這個程式執行if(fork()) 時,作業系統建立乙個新的程序(子程序),並且在程序表中相應為它建立乙個新的表項。新程序和原有程序的可執行程式是同乙個程式;上下文和資料,絕大部分就是原程序(父程序)的copy,但它們是兩個相互獨立的程序!

在父程序中,程式繼續執行,根據linux作業系統對fork的實現(假定這裡fork()執行成功了),這個函式會返回剛剛建立的子程序的pid(肯定不為零)。所以在if中的判斷語句為true,程式執行

這些**,因此父程序的x變數被賦值為35,並輸出。

子程序在之後的某個時候得到排程,它的上下文被換入,佔據cpu,作業系統對fork的實現,使得子程序中fork函式返回整數0。所以在這個子程序if的判斷語句為false。因而它就會進入else語句執行。

因為子程序從父程序複製過來的x的值是5,也沒有被重新賦值,所以這裡子程序會輸出5。

再提一下,fork前父程序的東西子程序可以繼承,而在fork後子程序沒有任何和父程序的繼承關係了。在子程序裡建立的東西是子程序的,在父程序建立的東西是父程序的。可以完全看成普通的兩個程序。

所以在執行printf((「%d\n」,x);

的時候,父子程序當然都會執行它,因為他們本身程式段裡都有這句**。而x的值的則分別看父程序和子程序此時x的值,父程序輸出35,子程序輸出5。其實這裡的情況已經和明了了,這裡就是兩個沒有牽連的程式,他們各自該怎麼執行就怎麼執行,跟以前我們接觸的普通程式一樣。

一句話,執行自己的程序,甬管別的程序。

【除錯記錄】

這段**基本上沒有什麼執行的問題,在這裡我就用gdb來跟蹤檢視一下這個**的運**況。

(shell下) $gdb //進入gdb偵錯程式

在 < if(fork()) else

}執行結果是string\nstring\n。

如果我們在把printf(「string」);改為printf(「string\n」);,也就是**換行符,

執行結果是string\n\n\n

這是為什麼呢?

其實這跟printf函式的緩衝機制有關,在printf某些內容時,作業系統僅僅是把該內容放到了stdout(標準輸出)的緩衝佇列裡了,並沒有實際的寫到螢幕(終端)上。但是,只要看到有\n則會立即重新整理stdout,因此就馬上能夠列印在螢幕上了. 在執行了printf("string")後,string僅僅是被放到了緩衝裡而已,再執行到fork時,緩衝裡面的string被子程序繼承了。

因此在子進程度stdout緩衝裡面就也有了string。所以,最終結果是string被printf了2次。

而執行printf("string\n")後,string被立即列印到了螢幕上,之後fork到的子程序裡的stdout緩衝裡不會有string內容。因此結果會是string被printf了1次。

作業系統實驗報告

電腦科學與應用系 課程設計報告 作業系統原理 目錄1 題目簡述 2 2 需求分析 2 2.1設計思想 2 2.2要求 2 2.3任務 3 2.4執行環境 3 2.5開發工具 3 3 概要設計與詳細設計 3 3.1系統流程圖 3 3.2演算法流程圖 5 4 編碼與實現 10 4.1資料結構和演算法設計...

作業系統實驗報告

2014 2015 學年第 2 學期 系別計算機學院 專業電腦科學與技術 班級 2014級專公升本 姓名蔡圓圓 學號 1410211014 授課老師趙群禮 實驗一 熟悉linux基本命令及程式設計環境 實驗總結 編寫程式 gedit編輯器 編寫程式 c 存放 gcc linux c程式編譯工具 當前...

作業系統實驗報告

實驗名稱 哲學家就餐問題 班級 通訊1202班 學號 u201213584 姓名 趙越 指導老師 許毅平 一 實驗目的 1.熟練使用vc 6.0編譯環境,除錯並正確執行程式,更加熟練地利用c語言解決問題 2.了解哲學家就餐的基本原理,掌握死鎖的必要條件。3.理解源程式中產生和防止的演算法,及相關視窗...