2015-10-20 50 views
0

我正在閱讀高爾文Abrahim的操作系統原理。在過程同步的話題,下面的定義給出了檢查並設置功能稍後用來確保互斥:Process Synchronisation- TestAndSetLock

boolean TestAndSet(boolean *target) { 
boolean rv = *target; 
*target = TRUE; 
return rv; 
} 

它在書中提到,該指令是一個特殊的硬件指令,它是自動執行。 我的問題是我如何在C中實現這個?我是否需要爲其他用戶定義的函數提供其定義,還是需要導入已實現此功能的某些庫?如果情況是前者,我自己定義函數,那麼它將以原子方式執行的保證是什麼?

通過這個詞原子上我所知道的是,它將作爲一個單一的指令執行,即如果兩個進程調用這個函數,然後被調用的函數將被順序執行,他們的語句不會交錯(即使轉換後機器語言)。

請幫忙。我在理解本書的文字方面遇到很多困難。

+0

這樣的功能是由您的ABI和OS提供的,而不是由C直接提供的。請先檢查您的OS API,然後再靠近處理器上可用的插卡指令。 –

+0

http://stackoverflow.com/questions/2287451/how-to-perform-atomic-operations-on-linux-that-work-on-x86-arm-gcc-and-icc – kaylum

回答

0

在書中提到這個指令是一個特殊的硬件指令,它是以原子方式執行的。我的問題是我如何在C中實現這個?

這本書提供了一個C函數,您介紹了這個函數,目的是解釋行爲。它已經做了一切,除了沒有任何原子性的保證。

C2011基本上以atomic_flag_test_and_set()的形式提供了您所描述的預建的內容。如果您可以將C2011視爲您的實施語言,那麼您可以使用它。

早期版本的標準C並沒有提供你需要實現這樣的功能,但事實上,即使C2011沒有爲你提供機制來實現你自己的原子操作,而不依賴於C的內置原子類型和功能。

我是否需要爲其他用戶定義的函數提供其定義,還是需要導入一些已經實現此功能的庫?

提出的代碼似乎是爲了解釋而不是功能。如果該功能可以保證以原子方式運行,那麼原子測試和設置就像該功能那樣工作。

如果情況是前者,我自己定義函數,那麼它將以原子方式執行的保證是什麼?

沒有。

通過原子我所理解的話,就是它會作爲一個單一的指令被執行,即,如果兩個進程調用這個函數,則調用的函數會按順序執行和他們的發言不會交錯(甚至沒有轉換成機器語言後)。

也許更具說明性的說,每個可能的觀察者都會看到原子操作開始之前的狀態,或者它完成後的狀態,從來沒有處於中間某處的狀態。

+0

謝謝。但是我找不到任何代碼實現原子testandset。你能幫我麼。 – shiva

+0

@shiva,我的幫助已經超過了我的答案。如果你從中得不到任何其他東西,至少得知沒有辦法在C中使用你自己的原子測試和設置。你需要在彙編中實現它,儘管你可能會把彙編程序包裝在C中功能\。 –