讀深入理解計算機得到的新發現

  看了些涉及底層的書,像深入理解計算機。發現以前看不懂是因爲不明白一些基礎的事,後來懂得些微機原理就容易看明白。

  想起來以前併發裏的同步,在很久之前就被老師給講授過P和V組成的互斥,現在看了才稍微明白些。

  從各方面說現在增加的理解的話。

  首先,是底層方面。計算機寄存器方面,一些賦值語句,同樣是等號相連,有的是在寄存器裏直接取,有的是去緩存裏取。像循環裏訪問的數組就是去緩存取,定義一個外部變量累加數組的值時,這個變量就是在寄存器中直接取。大體知道哪些賦值是寄存器內的操作,哪些賦值是需要多次訪問緩存,減少對緩存的訪問。

  接着對緩存的訪問就涉及到緩存替換,從慢速緩存替換到高速緩存。這種替換遵循局部性,越是靠攏的數據和操作,越容易減少這種替換。或許靠攏太多在較高速緩存上存放不下,也可以在臨近一級緩存上快速提取。當涉及較細節操作,這些細節操作繼續遵循局部性,就容易利用好較高一級緩存。表現在取址就近取。在寫代碼的時候,每個數據或者方法都有距離當前“焦點”的遠近度。把相關的數據和代碼各自靠攏,形成一個個獨特的單元。再把相關聯的單元靠攏,形成一個獨特的組織。關聯地越合理,運行起來就有越好的局部性。

  緩存是容易接觸的概念,可以把它作爲第一層考慮,爲寫好代碼的考慮。接下來一層可以是虛擬地址相關。

  每個程序運行時都顯得獨享整個內存空間。這個過程中虛擬地址負責一些需要的實際內存替換。對於程序員來說,是否知道虛擬地址對整個編程似乎都沒有關係,操作系統已經提供了完整的抽象。往往這部分也直接被忽略掉,或者稍微關心一下這個抽象對運行速度的影響。就像調用一個庫函數,想知道它的運行速度。到最後發現好像只是明白了它是怎樣運行的,可是對自己的編程完全沒有影響,也沒有什麼可以和它配合的操作來提升速度等。知道這個“函數”怎樣運行,自己卻並不能改變這個函數的任何過程。於是這是一層考慮是沒有必要的。如果說有什麼作用,可以知道虛擬地址的實現很多都不佔用計算量,既不佔用CPU。它也是朝着這個目標去設計的,儘量讓應用程序忽略它的存在,空出更多的計算量。

  每個機器都有固定的計算量,多線程和多進程就是在有限的運輸速度下,更好地利用計算速度。這可以作爲第三層考慮。

  涉及長途傳輸就需要等待,如硬盤讀取。有時候等待是在等另一個任務先完成。這些等待都需要去做別的事來填充。這或許是多線程多進程,既併發,最初的目的。後來多了一個功能:讓程序看起來在同步執行。每個程序像是一個客戶,每個客戶都不用等待直接接收到服務,儘管每次只接收一小部分,可是在持續不斷地接收到回饋,請求在得到持續不斷地得到處理。請求量小就很快處理完成,請求量大自然要等待時間長。

  如果可以一個進程完成就沒有必要多進程,如果可以一個線程完成就沒有必要多線程。除非需要用到讓任務“同步執行”。多線程和多進程不一樣,一個程序可以設置多進程來完成任務,也可以設置多線程。線程共享同一個進程的上下文,所以切換的時候處理量少一些。線程有自己的線程上下文。進程用內核的環境變量來存儲共享變量。線程原則上說可以共享進程內的任意有效地址,一般把共享部分放入全局變量、全局或局部靜態變量、進程堆。

  有些時候是不需要共享卻放錯了位置。如果不需要共享就設置成局部或私有,並且不傳遞它們的指針給其它線程。共享的話就要考慮代碼指令被內核調度切成片,在每個可能被切的位置,交出共享變量都是安全的。交出的共享變量會被別的任務做處理。

  P和V實現的同步中,共同維護着一個信號量s。執行P時檢測信號量s,如果不是0就減一併返回,如果是0就等待,直到被V喚醒,被喚醒後就s減一併返回。執行V的時候對信號量加一,如果有在等待的相應P就選擇其中一個喚醒。

  其中規定P和V中的每一個流程都是原子的。底層實現,網上說用了CPU的lock和unlock指令,以及V會選擇最先進入等待的P進行喚醒。不過這書上說喚醒順序是未定義,既不可預估的。

  P和V實現對一塊共享區域的訪問量限制,同一時間最多隻有s個線程進入被限制的領域。信號量s可以設置成1,也可以設置成多個。P和V可以在一個函數內,也可以在不同的函數內。

  同步問題有意思的地方是,不容易確定一段程序是否會在併發時出錯。函數間傳遞信號有時會引用到共享變量,這時不能假設這部分代碼總會被單個程執行。線程間傳遞信息,有時也會引用共享區域。每當引用或操作共享變量,都應該在引用或操作的局部加上互斥鎖。對共享區域加鎖是必然的,可以把取到的共享區域第一時間複製到局部並退出鎖。

  加鎖時把多組互斥鎖上鎖的順序做出規定,就不會出現死鎖。也就是某處引用需要多個鎖,就規定固定的上鎖順序,在某處解鎖時,用固定相反的順序。不過書上的例子中,上鎖的順序有明顯的默認邏輯,就像開啓連接時先開外層再開內層一樣,所以這個順序很容易確定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章