最近學習作業系統,我在課堂上基本上沒怎麼認真的聽老師講課,只是明白她講的的核心思想,但是對於老師講的具體例子我沒聽懂,原因不想在此陳述。
我想說一下我對對ipc(interprocess communication)的一點總結。
我們在學習新事物的時候,我總想先知道為啥有這個東西。為啥有ipc呢?我的理解是很大原因是由於程序之間需要共享共享資源,比如共享某個全域性變數,並且通過對共享資源的讀寫來進行通訊(訊息佇列不是這樣的)。
由於計算機在執行程式時是按照每條指令來執行的,而不是按照每條高階程式語言的語句來執行的,所以在程序間通訊時就有可能會出現問題,舉乙個極端的例子就是死鎖。指令和語句的不同是指令是原子性操作,不可分割的,中斷時發生在一條指令執行完,所以一條指令在執行的過程中是不會有中斷的;而語句是由n條指令組成的,所以語句發生中斷是很正常的,其實這也是程序間通訊問題的根本原因。
解釋乙個名詞--競爭條件。兩個或多個程序讀寫某些共享資料,而最後的結果取決於程序執行的精確時序。(宣告一下,本文的名詞解釋都是參考《modern operating systems》這本書)對於競爭條件的理解最好是舉個例子。
競爭條件舉例。現在有乙個緩衝區(buffer),這個緩衝區的作用是存放將要被列印的檔案,緩衝區的結構可以看成為乙個佇列,佇列中存放列印檔案的地方叫槽(英文slot),槽是按照其標號(1、2、3。。。)排列。由於這是乙個共享的緩衝區(因為任何想要列印檔案的程序都可以向這個緩衝區中存放要列印的檔案),所以要設定兩個類似於全域性變數的變數in和out。in表示緩衝區中下乙個空閒的槽,out表示下乙個要列印的檔案。比如in=7表示7號槽是空的,out=3表示該列印3號槽的檔案。每乙個想要列印檔案的程序,都要對緩衝區執行三個操作1)、讀出in的值,目的是找到空槽的位置;2)、此程序將它要列印的檔案寫入1)中找到的空槽中;3)、把in的值加一。現在有兩個程序pro1和pro2,程序pro1先來,讀出此時的in值,假如說in=6,程序pro1會在自己的臨時變數(如temp1)中儲存in=6這個值。這時程序pro2來了,中斷發生了。排程器讓程序pro2執行,pro2也是先讀出in,讀出的是6,然後pro2把它要列印的檔案放到標號為6的這個槽中,最後pro2對in進行加一操作,現在in變成7。pro2執行完畢離開。程序排程器現在讓pro1接著執行,由於pro1它讀出的in==6,所以它也要把它要列印的檔案放到標號為6的這個槽中,因此pro1的檔案把pro2的檔案給覆蓋了。問題就來了,pro2的檔案永遠也不會被列印。
這就是競爭條件的乙個例子。這對我們理解ipc問題的發生有很大的幫助作用。未完待續。
現代作業系統 IPC
一 程序間可能存在的關係 資源共享關係 相互合作關係 二 競爭條件race condition 三 mutual exclusion互斥 四 解決方案 五 忙等待的互斥 1.遮蔽中斷 最簡單的方法是使每個程序在剛剛進入臨界區後立即遮蔽所有中斷,並在就要離開之前再開啟中斷。2.鎖變數 設想有乙個共享 ...
RT Thread作業系統之 IPC
執行緒的排程,都是建立在中斷的基礎上的,當我們關閉中斷,系統將不能進行排程了,還有我們可以禁止排程器排程來保護臨界資源。除了這些我們還用執行緒間通訊的方式保護執行緒間的同步。ipc機制 inter process communication 意思是程序間通訊。rt thread中ipc物件有 訊號量...
linux作業系統理解 IPC
ipc指程序間通訊方式,注意不是執行緒間,執行緒之間同步只有訊號量和互斥量 1.管道pipe shell的管道就是這個原理 程序管道 popen pclose函式 1.2命名管道fifo,是一種特殊的檔案,在檔案系統中以檔案的形式存在 2.訊號量 備註 學習多程序的同步與互斥,和多線的同步與互斥時,...