什麼是內存鎖?

從歷史上看,所有計算機程序都是以完全順序的方式編寫的。這很容易讀、寫和理解。計算機執行起來也很簡單,並且需要相對簡單的硬件。使用這種設計範例,提高系統性能的唯一方法是編寫更高效的代碼和提高 CPU 速度。提高代碼效率是可能的,但它通常是一個複雜的過程,結果往往有限。

幾十年來,等待新的、更高效的 CPU 可能會降低性能。正如摩爾定律所描述的那樣,CPU 的性能大約每兩到三年翻一番。不幸的是,這些性能提升大部分來自使用越來越小的製造節點。由於在納米尺度上工作的材料困難,現代技術一直在努力以歷史速度減小節點尺寸。

為了解決這個問題,現代 CPU 架構師選擇向 CPU 添加多個處理器內核。每個處理器內核都可以獨立執行不同的任務。雖然他們不能合併同一個問題,但他們可以同時處理兩個問題。這種基本的架構變化提供了許多額外的性能,但它並沒有直接使單個進程受益,儘管它確實減少了對處理器時間的爭用。

要利用多核 CPU,必須以多線程方式編寫代碼。然後每個線程都可以並發運行,通過可用線程和 CPU 內核的數量來擴展性能優勢。但是,這樣做會遇到一個新的挑戰,即“競爭條件”。

注意:有些任務不能是多線程的,而其他任務可以是大規模多線程的。可能的性能優勢確實取決於正在完成的工作。

競爭條件

多線程軟件可以利用多核。危險潛伏在那些水域中,隨時準備讓沒有經驗的程序員陷入困境。當兩個不同的線程與相同的內存位交互時,可能會出現競爭條件。

一個簡單的例子可能是兩個線程試圖同時檢查和遞增一個變量。假設a=0。然後兩個不同的線程執行它們的功能,並在某個時候檢查a並將其遞增 1。通常,您希望兩個線程將 1 加 0 的結果是 2。大多數時候,情況應該如此。如果兩個線程恰好在正確的時間執行該特定功能,您會得到不同的結果。

在這種情況下,第一個線程讀取a的值。在第一個線程可以增加though的值之前,第二個線程讀取它。現在第一個線程將 1 加 0,但第二個線程已經認為該值為 0,因此將 1 加 0。這樣做的結果是a的最終值為1,而不是 2。

奔向最壞的情況

雖然上面的例子聽起來可能不是特別糟糕,但它可以產生戲劇性的效果。如果a的值選擇機器的運行模式怎麼辦?如果該機器的特定操作模式可能是危險的甚至危及生命怎麼辦?

競爭條件也不需要那麼簡單。例如,一個線程可以在另一個線程寫入內存部分的同時讀取它。在這種情況下,讀取線程可能會從之前和之後獲得奇怪的數據混合。假設該檢查是一個簡單的真/假檢查。

如果變量在讀取開始時為 true,但正在被覆蓋為 false,則讀取操作的結果可能類似於“trlse”。這不是“真”或“假”。不是二元選擇中的兩個選項中的任何一個幾乎肯定會導致應用程序崩潰。這種內存損壞會導致許多安全問題,例如拒絕服務和特權升級。

鎖定比賽

了解程序中的哪些內存位在不同線程之間共享對於防止競爭條件至關重要。如果變量僅由單個線程控制和訪問,則無需執行任何操作。如果兩個或多個線程可以訪問一個變量,那麼您必須確保對該內存塊的所有操作都是獨立完成的。

這種獨立性是通過鎖實現的。在程序代碼中,您需要在編寫對共享內存塊進行操作的函數時加鎖。這個鎖會阻止其他線程訪問那塊內存,直到鎖被釋放。

鎖不是最優雅的解決方案。一方面,它有內存開銷。它還可以強制線程掛起,等待鎖被釋放。視情況而定,鎖可能會在很長時間內不會釋放,或者可能根本不會釋放。在最壞的情況下,解鎖鎖可能取決於另一個阻塞線程中發生的事情,從而導致死鎖。

優化鎖的使用至關重要。您可以控制鎖定的粒度。例如,如果您正在編輯表格中的數據,您可以鎖定整個表格或只鎖定編輯的行。鎖定整個表將是一個粗粒度的鎖。它最大限度地減少了實施過多鎖的開銷,但增加了另一個線程被鎖阻塞的機會。只鎖定行將是一個細粒度的鎖。這不太可能干擾其他線程,但意味著將需要撕裂鎖,從而增加總開銷。

結論

內存鎖是一種代碼工具,用於確保多線程環境中內存操作的原子性。通過在對其進行操作之前鎖定一塊內存,您可以確保不會因為競爭條件而發生意外行為。內存鎖會帶來內存開銷,但也會導致阻塞。

阻塞是另一個線程試圖對鎖定的 pemory 進行操作的地方。線程坐在那裡,阻塞直到鎖被釋放。如果釋放鎖需要另一個線程做某事,這可能會導致問題,因為它可能會在完成釋放阻塞它的鎖的先決條件之前被阻塞。可以通過編寫非阻塞代碼來避免內存鎖。然而,這樣做可能比使用鎖更複雜且性能更低。不要忘記在下面留下您的評論。



Leave a Comment

如何克隆硬碟

如何克隆硬碟

在資料是寶貴資產的現代數位時代,在 Windows 上複製硬碟對許多人來說可能是一個至關重要的過程。這份綜合指南

如何修復驅動程式 WUDFRd 在 Windows 10 上載入失敗?

如何修復驅動程式 WUDFRd 在 Windows 10 上載入失敗?

您在啟動電腦時是否遇到錯誤訊息,提示驅動程式 WUDFRd 無法在電腦上載入?

如何修復 NVIDIA GeForce Experience 錯誤代碼 0x0003

如何修復 NVIDIA GeForce Experience 錯誤代碼 0x0003

您是否在桌面上遇到 NVIDIA GeForce 錯誤代碼 0x0003?如果是,請閱讀部落格以了解如何快速輕鬆地修復此錯誤。

How to Use Auto Clicker for Chromebook

How to Use Auto Clicker for Chromebook

Today, were going to delve into a tool that can automate repetitive clicking tasks on your Chromebook: the Auto Clicker. This tool can save you time and

如何在 2023 年從 Windows PC 中移除 GPU

如何在 2023 年從 Windows PC 中移除 GPU

您需要從 PC 上卸下 GPU 嗎?和我一起在這個分步指南中解釋如何從您的 PC 中刪除 GPU。

如何在台式機和筆記本電腦中安裝 NVMe SSD

如何在台式機和筆記本電腦中安裝 NVMe SSD

買了新的 NVMe M.2 SSD 但不知道如何安裝?繼續閱讀以了解如何在筆記本電腦或台式機上安裝 NVMe SSD。

什麼是邏輯炸彈?

什麼是邏輯炸彈?

邏輯炸彈是一種安全事件,攻擊者會在其中設置延遲操作。繼續閱讀以了解更多信息。

什麼是震網?

什麼是震網?

Stuxnet 是一種自我傳播的蠕蟲病毒。這是第一次使用網絡武器,也是第一個惡意軟件實例。

什麼是道德黑客?

什麼是道德黑客?

道德黑客是在法律約束下行事的黑客。繼續閱讀以了解有關該主題的更多信息。

什麼是對稱加密?

什麼是對稱加密?

密碼學有很多不同的部分。如果你想加密一些數據,你可以使用兩種類型的算法: symmetric