簡體   English   中英

解決現代類 Unix 操作系統中的數據競賽問題

[英]Data Race Problem Solving in Modern Unix-like Operating Systems

在流行的現代類 Unix 操作系統的內核中,對稱多處理器 (SMP) 系統如何支持多線程:Linux、FreeBSD 和 Solaris(這里的 Solaris 我指的是商業 Oracle Solaris 或免費的 Nexenta 和 Illumos 項目)?

當我們有一台單處理器多任務計算機和適用於這種計算系統的操作系統時,解決方案就足夠簡單了。 在任何時候,我們都有一個任務正在執行,kernel 在進程和線程之間切換並更改上下文(一組變量和表,描述進程的狀態)。

但是,當有多個線程同時由其自己的處理器或內核執行時,問題就會變得復雜得多。 OS kernel 包含大量的全局變量,中間的計算值保存在這里,這些全局變量讓 kernel 內部函數交換數據。 如果在不同的處理器上同時啟動多個線程/進程,它們很可能會破壞彼此的數據,共享相同的變量並在那里寫入它們的值。 所以 SMP kernel 中的問題與多線程應用程序中的問題相同。

我看到了兩種解決這個問題的方法。

首先,我們可以用互斥鎖保護這些全局變量(甚至它們的組)。 這將完全解決任務,但它會減慢我們的 kernel,因為有時不同的線程會同時處理相同的函數組並需要相同的內部變量和 arrays。 由於某些線程將被停止,並且在某些情況下,只有少數進程將在 kernel 空間中保持活動狀態。 我知道在早期的 FreeBSD 版本中使用了一個巨大的鎖(整個內核的單個互斥鎖),它嚴重破壞了性能。

第二種方法是嘗試消除這些由線程共享的全局變量,同時在 kernel 中處理,這是可能的。 因此,我們只保留這些對我們的內核來說是必需的全局變量,並為每個全局變量提供一個互斥鎖。 所有剩余的全局變量,用於內部 kernel 函數之間的信息交換,都是重復的,因此在 SMP 同步模式下啟動的每個並發線程都有自己的這些變量的副本。 我認為我們甚至可以為每個處理器或內核制作數據段的獨立副本(Unix 術語中的.text),以便每個並發線程都可以使用它自己的內部“全局”變量,並且會有一個公共數據段,由所有線程和所有內核共享,保存剩余的幾個真正的全局變量,受互斥鎖保護。

我不是說,我建議的兩種變體都是真正的解決方案,在實際操作系統中采用(我不是這里的專家)。 我的問題是:

全局變量之間的沖突問題(服務於 kernel 內部子程序之間的數據交換),即所謂的數據競爭,如何在真正現有的類 Unix(甚至可能是非 Unix)操作系統中解決? 前面提到的三個示例:Linux、FreeBSD 和 Solaris 尤其令人感興趣。

對於一個巨大的話題,沒有“簡短、簡單”的答案。

特別是關於“Linux”以及它如何在 SMP 系統上同步 kernel 結構:

https://en.wikipedia.org/wiki/Giant_lock

The Linux kernel had a big kernel lock (BKL) since the introduction of SMP, until Arnd Bergmann removed it in 2011 in kernel version 2.6.39,[2][3] with the remaining uses of the big lock removed or replaced by finer - 粒度鎖定。 Linux distributions at or above CentOS 7, Debian 7 (Wheezy) and Ubuntu 11.10 are therefore not using BKL.

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM