0

共享資源是在兩個應用過程A和過程B.用於避免競態條件在Linux的共享資源的切換,決定執行的代碼部分,當處理共享資源禁用上下文切換和重新啓用在退出進程的共享部分之後進行切換。避免應用程序[過程]

但不知道如何避免進程切換到另一個進程,執行共享資源的一部分,退出過程中共享部分後再次啓用進程切換時。

或者有沒有更好的方法來避免競爭條件?

問候,
學習者

+0

你需要想出一個更好的主意,因爲你不會在用戶模式下這樣做。 –

+0

你有什麼想法嗎? –

+0

不要試圖阻止從繁忙進程(不允許)進行上下文切換,而應將注意力集中在防止將進程切換到不應運行的進程,直到其他人完成關鍵任務。阻止對同步機制的調用,該調用在您準備好繼續進行該過程之前不會返回。 –

回答

1

但是不知道如何避免進程切換到另一個進程,執行共享資源部分時,並且在退出進程的共享部分後再次啓用進程切換。

你不能直接這樣做。你可以做你想要的內核幫助。例如,等待一個Mutex或其他方式來執行IPC(進程間通信)。

如果這還不夠「好」,你甚至可以製作你自己的內核驅動程序,它具有你想要的語義。內核可以在「睡眠」和「運行」之間移動進程。但是在考慮編寫自己的內核驅動程序之前,你應該有充分的理由說明現有方法爲什麼不起作用。

或者有沒有更好的方法來避免競爭條件?

避免競爭條件是所有關於權衡。內核有許多不同的IPC方法,每種都有不同的特性。獲得關於IPC的好書,並研究Postgres如何擴展到許多處理器。

0

對於所有用戶空間應用,以及絕大多數的內核代碼的,它是有效的,你無法禁用上下文切換。原因是上下文切換不是應用程序的責任,而是操作系統。

在您提到的場景中,您應該使用互斥鎖。所有進程必須遵循以下約定:在訪問共享資源之前,它們獲取互斥鎖,並在完成訪問共享資源後釋放互斥鎖。

比方說一個應用程序訪問共享資源獲取互斥,並且正在做共享資源的一些處理,而操作系統執行上下文切換,從而停止從處理共享資源的應用程序。操作系統可以調度其他進程想要訪問共享資源,但他們將處於等待狀態,等待互斥體被釋放,並且這些進程都不會對共享資源做任何事情。在一定數量的上下文切換之後,OS將再次調度原始應用程序,這將繼續處理共享資源。這將繼續,直到原始應用程序最終釋放互斥鎖。然後,其他一些進程將按照設計順序開始訪問共享資源。

如果你想要什麼更權威和詳細的解釋和類似的情景個爲什麼,你可以看,例如。

希望這會有所幫助。

+0

這適用於我的控制下的應用程序。假設,如果我提供該Linux系統。用戶可以安裝他自己的應用程序,其中用戶也使用相同的共享資源,無論我使用什麼。所以我沒有任何控制來避免共享資源訪問。我怎樣才能擺脫這種競爭狀態? –

0

我會建議尋找名爲信號量。 sem_overview (7)。這將允許你確保在你的暴力部分互相排斥。

相關問題