共享的邊界如何覆蓋獨享

2021-09-21 02:50:35 字數 2295 閱讀 6068

今天讀了一位朋友寫的一篇關於linux排程域的文章,感到甚是有用,讀了以後發了一番感慨如下:

smt共享了alu,然而卻獨享了暫存器;multicore共享了l2 cache,然而卻是獨享l1 cache的;smp共享了記憶體,然而每乙個處理器卻是獨享cache的;numa的所有節點共享了儲存陣列,然而每個節點卻是半獨享記憶體的;多台計算機共享了整個網路,然而卻獨享著自己的記憶體,外設...整個網路獨享著資料,然而卻共享了世界!這是一幅美麗的畫卷,如此和諧又如此對稱,這個畫卷反覆重複著共享與獨享之間的合作而不是爭奪,某些意義上,獨享是為了精確分工,而共享是為了不同工作者之間高效地合作。

資源的分配方式總是在各個層面影響工作的效率,資源的分配總的看來有兩種方式,一種是將乙個資源獨佔式的分配給工作者,這樣該資源只能由它的屬主工作者利用,別的工作者完全訪問,另外一種就是共享式分配,指的是資源可以由所有的工作者利用。如果確定性的,乙個工作者使用的資源絕對不會被別的工作者使用到,那麼這個資源就可以獨佔式的分配給該工作者,然而如果乙個資源需要很多的工作者來訪問,那麼就應該以共享的方式分配。自從分工開始以來,人類就面臨資源分配的問題,隨著分工的細化,社會化生產成了乙個時髦的詞,在工業界形成了流水線這樣的工程解決方案。分工就是為了更好的協作,為了更有效的產出,因此不可避免的要面臨工作者之間的通訊問題,凡是涉及到這部分問題的資源就要以共享的方式進行分配,其實完全可以消除共享,用專門的通訊規範進行工作者之間的通訊,然而那樣的話會帶來很大的開銷,而共享資源的方式無疑是最高效的,因為對於工作者來說,用自己的東西肯定是最高效的,共享的東西對於每個工作者來講都是自己資源。

對於分工來講,無非兩種方式,一種就是消除時間上的浪費,另一種就是消除空間的浪費,後一種比較容易實現,無非乙個屋子裡多安排幾個工人罷了,我們對於空間的操控力總是強於對時間的操控力,對於消除時間的浪費就不是那麼容易了,我們必須將乙個按照時間序列化的工作分解成好幾個可以按照空間展開的子工作,事實上我們人類生活在時間軸上,一開始就是在時間軸上序列化做事的,因此將乙個工作分解成n個子工作很有難度,雖然有難度,但是難度還不至於大到不可想象,在數學上有統籌學,在工程上有流水線,這些都是這種思想的體現,這些方案中,最重要的就是分解的子工作沒有太多的共享資源,如果有的話就會產生共享資源的同步互斥問題,但是如果沒有的話,那麼這種分解就絕妙到了極點,完全可以消除資源共享。大千世界是很複雜的,不是什麼設計都是絕妙的,按照道理來講,不同的任務同時展開不應該用什麼共享的資源,畢竟它們是不同的任務嘛,但是世界的事物不是孤立,世界因聯通而精彩,因此共享資源的問題是不可避免的,不僅僅同乙個任務的分解還是不同任務的並行。對共享資源處理的難度來自於我們對時間操作的難度,我們可以征服最高的山峰,可以征服太陽系甚至可以征服男人的下顎,可是我們卻征服不了時間,時間的流逝速度和方向我們只有眼睜睜看著的份兒,因此對於分解的子任務,我們不能主動引導工作流何時使用共享資源,也無力扭轉不同的子任務對共享資源的依賴關係,唯一能做的就是當衝突發生的時候,要麼等待,要麼丟棄已有的成果盡自己最大的努力來使得一切看起來安然。

這世上本來沒有也沒有必要有共享資源,參與者多了也就有了共享資源,因為聯通使世界精彩。難道僅僅是聯通的因素嗎?其實還有乙個因素就是為了高效,就是前面我說的,讓大家都使用的資源真的歸大家所有,任何工作者使用的時候就好比用自己的東西一樣方便,這樣可以節省很大的一筆資源重複建設的開銷,為此付出的同步互斥問題值得。

好了,最後我們來用一種更加獨特的眼光看一下資源的共享。前面說將單一的任務分解成不同的子任務之間或者不同的任務之間根本不需要共享資源,也就是說獨享為主,共享為次,但是如果將一件工作分配給不同的工作者來做,並且不是像前面那樣按照時間序列縱向分解而是橫向分解,然後將少的多得任務分配給不同的工作者,這種模式中共享卻比獨享來的必然,所有的子任務都是一模一樣地重複相同的事情,因此所有的資源都是共享的,但是這種分解有什麼意義?其實按照上面的敘述沒有什麼意義,因為上面強調的是乙個大任務的分解方式,本質上的說法應該是增加人手做相同的工作,顯著的意義就是提高吞吐量,這個不用多說了吧。因此要麼按照縱向的方式將流水線橫向展開,然後並行化各個流水環節,要麼增加人手,提高吞吐量,前者如果分解的好的話不必太在意資源共享問題,而後者則必須考慮資源共享問題。第一段中列出的計算機的架構的例子說明了計算機系統是乙個複雜的系統,在資源分配上兼用了橫向展開和縱向展開兩類。因此雖然硬體提供了如此好的機制,作業系統核心必須提供策略來最大化的利用這種優勢,最起碼不要將這種複雜的機制變成牽絆,對於linux核心,負載均衡就是幹這個事情的,為了負載均衡核心提供了排程域的概念,按照負載均衡的意義和代價將整個系統分為了多個排程域級別,其中最高端別的排程域中的負載均衡的代價最大,最低階排程域的負載均衡的代價最小,核心每各一段時間對各個排程域進行一次負載均衡,負載均衡代價越大的排程域其均衡間隔越大,因為核心為了盡量少付出昂貴的代價。核心的排程域的概念在軟體層面上再現了第一段的美麗畫卷的前半部分,也即是到numa的部分,作業系統核心的設計直接影響了上層軟體的效能是否按照硬體的本意來體現。

執行緒之間共享與獨享的資源

程序是資源分配的基本單位 執行緒是系統排程的基本單位。平時我們寫的程式都是作為執行緒執行的 程序可以看做是包括一系列執行緒和資源的統稱 乙個程序至少包括乙個 執行緒 主線程,進入main函式時產生的 在其中可以建立其它執行緒,也可以不建立。同一程序間的執行緒究竟共享哪些資源呢,而又各自獨享哪些資源呢...

揭秘IDC商家 獨享與共享頻寬的區別

100m 共享與2m 5m 10m 獨享有什麼區別 那個好?當然獨享好啊,雖然 100m 聽著好像很好,可是如果不是獨享的話,有的時候用著還不如2m獨享,共享是你很別的一些客戶共同使用這乙個頻寬資源,而獨享就是你自己使用,所以很穩定。獨享與共享,小心黑心的商家欺騙 百兆共享,就是 整個機房內部採用 ...

如何保證測試的覆蓋率

一 首先測試需求分析要全面。測試需求分析分兩步 1 測試需求的獲取 顯式需求 1 原始需求說明書 2 產品規格書 3 軟體需求文件 4 有無繼承性文件 5 經驗庫 6 通用的協議規範 隱式需求 使用者的主觀感受,市場的主流觀點,專業人士的評價分析 2,需求的分析 產生測試需求文件 將不同的需求 劃分...