什麼是內存鎖?

從歷史上看,所有計算機程序都是以完全順序的方式編寫的。這很容易讀、寫和理解。計算機執行起來也很簡單,並且需要相對簡單的硬件。使用這種設計範例,提高系統性能的唯一方法是編寫更高效的代碼和提高 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

如果 Powerbeats Pro 无法在充电盒中充电,该怎么办

如果 Powerbeats Pro 无法在充电盒中充电,该怎么办

如果您的 Powerbeats Pro 无法充电,请使用其他电源并清洁耳塞。充电时请保持充电盒打开。

3D打印基础知识:必读的维护清单

3D打印基础知识:必读的维护清单

保持设备良好的状态是必须的。以下是一些有用的提示,可以帮助您保持您的3D打印机处于最佳状态。

佳能 Pixma MG5220:无需墨水扫描

佳能 Pixma MG5220:无需墨水扫描

当佳能 Pixma MG5220 没有墨水时,如何启用扫描功能。

笔记本电脑过热的5个原因

笔记本电脑过热的5个原因

了解笔记本电脑过热的一些可能原因,以及避免这个问题和保持设备冷却的小贴士和技巧。

如何修复GeForce Now错误代码0xC272008F

如何修复GeForce Now错误代码0xC272008F

您正在为一晚的游戏做准备——这是一次重要的体验——您刚刚在GeForce Now流媒体服务上购买了“星球大战:外部法则”。了解唯一已知的解决方法,教您如何修复GeForce Now错误代码0xC272008F,以便您可以再次开始玩育碧游戏。

3D打印基础:您的3D打印机维护提示

3D打印基础:您的3D打印机维护提示

保持3D打印机的良好状态对于获得最佳效果非常重要。这里有一些重要的维护提示。

如何找到打印机的IP地址

如何找到打印机的IP地址

找不到你的打印机使用的IP地址吗?我们将向您展示如何找到它。

如何在三星手机上使用AirPods

如何在三星手机上使用AirPods

如果您不确定是否应该为您的三星手机购买AirPods,这篇指南可以帮助您。最明显的问题是这两者是否兼容,答案是:是的,它们是兼容的!

什麼是 WPS?它是如何工作的?

什麼是 WPS?它是如何工作的?

通過此詳細教程了解 WPS 的全部內容,學習如何簡單安全地連接無線網絡。

LinkedIn:如何防止其他人知道您看到了他們的個人資料

LinkedIn:如何防止其他人知道您看到了他們的個人資料

了解如何使用LinkedIn的私人模式,防止其他人知道您查看了他們的個人資料。這裡有不同的解決方案,以確保您的隱私。