第1章 溫故而知新

第一章溫故而知新

第二節(jié)萬變不離其宗

凡是單純講史的章節(jié)我全部略去。

本節(jié)講的主要是由CPU、內存和I/O之間速度不匹配而設計的硬件架構及其發(fā)展。

這個就不用細說了CPU最快,內存次之,I/O更慢。由于CPU和內存速度還算接近,所以把CPU和內存算作一類,I/O單獨算作一類。當然這里說的I/O是指I/O設備,并不是操作。

隨著發(fā)展CPU頻率越來越高,處理速度越來越快,內存跟不上節(jié)奏了,它們之間的I/O也出現了速度不匹配的問題。

因為I/O設備可分為高速設備和低速設備兩種,所以為高速搭配北橋,低速搭配南橋。

它們之間的關系可用下圖表示:

CPU的頻率只能達到4GHz無法提升,這是由CPU制造工藝決定的,是個瓶頸,目前還無法突破。

一個CPU能力有限,那就讓多個CPU共同工作提升效率。但是這樣的CPU陣列各部件利用率不高,于是,發(fā)展出了多核心,其他部件共享的多核CPU設計。說白了,原來的CPU里面每個CPU一個核心,除此之外還有圍繞這個核的其他部件。但是現在多核CPU除了核心彼此獨立外,其他的部件是共享的。

這一節(jié)就這么點內容。

第3節(jié)站得高看得遠

從下圖可以看出計算機的結構大概是這樣的:

最底層是硬件,它提供硬件規(guī)格描述。再往上是操作系統(tǒng)內核,它提供系統(tǒng)調用。再往上是運行庫,它提供各種系統(tǒng)API。再往上就是各種系統(tǒng)軟件了。這種設計具有上層屏蔽下層,上層提供接口的特點。

這一節(jié)對接口的解釋非常好。作者說接口是一種協(xié)議,協(xié)議二字比較貼切。當然這個協(xié)議不是計算機網絡中的protocol。

第4節(jié)操作系統(tǒng)的功能

有二。1、提供抽象接口。2、管理硬件。

1.4.1不要讓CPU打盹

操作系統(tǒng)經歷了從多道程序設計、分時操作系統(tǒng)、到多任務操作系統(tǒng)等階段。

多道程序設計是指CPU空閑的時候出讓CPU以提高CPU利用率的設計;分時是指給每個程序固定的時間片執(zhí)行,時間片一到就停止的設計,不過這個時間片是輪轉著用的,不是一個程序用完了就沒了;多任務就是現在操作系統(tǒng)設計了,程序以進程的方式存在。

搶占:OS對程序執(zhí)行具有絕對的控制權,OS依據一定標準判斷該剝奪哪個程序的執(zhí)行就剝奪,想讓哪個程序執(zhí)行就讓哪個程序執(zhí)行。

1.4.2設備驅動

GDI和directX等都是硬件的抽象,是一個中間層,它們屏蔽了硬件的具體細節(jié),提供了通用的操作接口。

LBA(Logical Block

Address):因為硬盤結構復雜,概念繁多,尋找一個扇區(qū)要經過很多步驟,這個比較麻煩。與其如此,不如干脆為每個扇區(qū)配置一個邏輯編號,這樣找扇區(qū)就好像是哈希算法一樣快。

1.5內存不夠怎么辦?

程序在內存中的地址空間是需要相互隔離的。這是為了防止一個程序在無意間修改其他程序造成意料之外的結果,另外,這也是為了信息安全。

內存利用率要高,要不然程序在內存和硬盤之間進行I/O操作所花費的時間可就多了。

程序運行的地址應該是確定的。因為多數程序指令跳轉的目標地址是固定的,如果運行地址不確定就不能保證每次都在目標地址上運行,這就需要重定向進行調整,浪費時間。

解決上述問題的辦法是使用中間層,即把程序的運行地址與目標地址建立一種映射關系。

1.5.1關于隔離

我們平時說的什么32位,64位CPU啥的都是指CPU的處理能力,從硬件的角度講,即,計算機的地址總線的條數。從CPU的設計上講就是CPU一次能夠處理的二進制位數,而這個位數還有一個學名叫字長。

內存的物理地址空間就是真實的內存空間,虛擬地址空間則是應用于進程的邏輯地址空間。

1.5.2分段

我在想如何從16進制的差值一下推斷出地址空間的大???

以下是我的想法。1位16進制數字代表4位2進制數字,換句話說16進制數字轉換為2進制數字是以24為單位進行換算的。那么根據某個16進制數字所在位置乘以當前權值就可以得到該位置上的16進制數字所代表的2進制數字。而16進制某位的權值等于低一位的權值乘以24,并且16進制最低位的權值是20,因此可以根據這個規(guī)律換算出相應的2進制數字。

來看個例子。書上說從0X00000000到0X00A00000的地址空間大小就等于|0x00A00000-0x00000000|=|A00000|因為A是10所以其等價于|1000000|,現在按照上述規(guī)律進行換算。

10×220+0×216+0×212+0×28+0×24+0×20=10M(byte)。

分段的方法可以使各進程彼此隔離,并且可以使程序運行的地址確定。

分段的缺點就是它以程序為單位進行處理,但是根據程序運行的局部性原理,程序通常情況下只有一少部分需要常駐內存,因此以程序為單位換進換出嚴重影響了內存的利用率和處理速度。

1.5.3分頁

頁面有3種:1、虛擬頁;2、內存頁;3、磁盤頁。

MMU(Memory Management

Unit)負責把虛擬地址轉換成物理地址。

1.6眾人拾柴火焰高

1.6.1線程基礎

使用線程的好處?

1、多線程可以有效利用等待時間。因為某線程陷入等待狀態(tài)后別的線程可以繼續(xù)執(zhí)行;

2、多線程不會使與用戶的交互中斷。因為可以一個線程負責與用戶交互,另一個線程負責計算;

3、能夠實現程序內部并發(fā)執(zhí)行操作;

4、多核CPU等硬件的潛力只有多線程才能使其充分發(fā)揮;

5、在數據共享方面更高效。

線程的私有存儲空間?

1、棧;2、線程局部存儲(Thread Local Storage,TLS);3、寄存器。

線程真正的并發(fā)執(zhí)行和非真正并發(fā)執(zhí)行?

在同一時間只有處理器核心數量大于等于執(zhí)行線程數量的時候才是真并發(fā)執(zhí)行,除此之外都是模擬出來的。

線程調度:在同一時間處理器的核心數量小于執(zhí)行線程的數量時就需要在同一核心不斷切換來執(zhí)行線程。

改變線程優(yōu)先級的3種方式

1、用戶指定優(yōu)先級;2、根據等待狀態(tài)的頻繁程度調整優(yōu)先級;3、長時間得不到執(zhí)行而被提升優(yōu)先級。

可搶占執(zhí)行線程和不可搶占執(zhí)行線程:線程的各種狀態(tài)完全由操作系統(tǒng)來控制這就叫可搶占,就像某線程的時間片用完進入就緒態(tài)一樣,這就是由操作系統(tǒng)來控制的。除此之外的就是不可搶占線程。

不可搶占線程主動放棄執(zhí)行的時機:1、線程等待某事件發(fā)生時。2、線程主動放棄時間片。因為就這倆條件所以不可搶占線程調度的時機是確定的。

Linux下的多線程:不像Windows那樣把線程和進程分得那樣清楚,Linux是以任務為單位的,如果某幾個任務的執(zhí)行是做同一件事的各個部分,那么這幾個任務就可以看成是線程,而這件事就可以看成是進程。所以Linux下的線程和進程是動態(tài)的概念。

Linux下的fork函數:fork是叉子的意思,我不知道為啥Linux用它來給函數命名。它的作用就是復制任務,新任務和原任務共享同一塊內存空間,并且是寫時復制。所謂寫時復制就是寫的時候才從內存空間里面復制出一塊給你寫,原內存空間內容不變。讀的時候新舊任務讀同一塊內存空間。

Linux下的exec函數:fork產生的是本任務的鏡像,也就是復制品。兩個同樣的任務完成同樣的功能是浪費啊,所以fork是個半成品函數,必須搭配別的函數才有用,這個函數就是exec函數。Exec函數用來執(zhí)行別的可執(zhí)行文件,換句話說就是干別的事。所以可以把fork理解成在一塊內存空間上創(chuàng)造出個接口給exec執(zhí)行新任務。

Linux下的clone函數:我對它的理解就是fork和exec二合一,clone的作用就是產生新線程。

1.6.2線程安全

要知道線程安全就得知道啥叫線程不安全。所謂線程不安全就是指多個線程同時訪問共享數據造成結果的不確定性。

原子操作:絕對不會被打斷的操作。因為原子是化學反應中的最小微粒不可再分所以拿這個來比擬原子操作。它適用于簡單應用環(huán)境。

解決線程不安全的通用方法是鎖。

線程同步:一開始我還以為是多個線程一起訪問某個資源呢,其實不然,線程同步是解決線程訪問同一數據資源的解決方式,保證了同一時間只有同一線程訪問數據資源,從而保證了線程安全。

鎖——二元信號量:最簡單的鎖機制。只允許一個線程獨占,一旦有線程占用,鎖就呈現占用狀態(tài),其他線程無法訪問資源。否則,非占用狀態(tài),可以接受線程。

鎖——多元信號量:就是它允許多個線程同步訪問資源,比二元信號量高能一些。我感覺信號量就像管道。一個線程想訪問資源它就必須首先獲取一個管道,這樣原來的管道數就少1,于是信號量首先減1。但是如果信號量減1以后成為負值,說明原來的管道數為0,即原來就已經沒有管道了,那么此時信號量機制就只能讓該線程等待了,這就是P原語。而如果一個線程用完了資源想要釋放,那么它必須歸還它所使用的管道,那么管道總數應該加1,即信號量加1。正因為信號量已經加1,如果此時的信號量值為小于1,那說明在加1之前管道總量就已經透支了,而且先前那些因為沒有獲得管道的線程還在那等著呢。正好有個線程歸還了管道,V原語趕緊從那些等待的線程中找一個出來把管道給它,這就是在信號量值小于1的情況下喚醒線程的意思。

鎖——互斥量(Mutex):信號量與互斥量的區(qū)別是一個信號量可以被一個線程獲取并釋放給另一個線程使用,正如V原語的操作。而互斥量始終都是一個線程,上鎖是這個線程,這個線程不執(zhí)行完就不解鎖。

鎖——臨界區(qū):獲取臨界區(qū)的鎖為進入臨界區(qū),釋放鎖為離開臨界區(qū)。它的作用對象是某一位以進程,一旦某進程進入臨界區(qū),其他進程就無法進入。除此之外,臨界區(qū)與互斥量相同。

鎖——讀寫鎖:互斥量、臨界區(qū)和信號量適用于讀寫都非常頻繁的場合,而讀寫鎖適用于讀頻繁而寫不頻繁的場合。它的工作規(guī)律可用下表表示:

鎖寫鎖狀態(tài)

以共享方式獲取

以獨占方式獲取

自由

成功

成功

共享

成功

等待

獨占

等待

等待

鎖——條件變量:相當于一個開關,它可以讓等待它的線程繼續(xù)等待也可以讓它們繼續(xù)執(zhí)行。而這個開關需要一些其他的線程打開或關閉它。

可重入函數:一個函數沒有執(zhí)行完全,但是由于內部因素或者外部調用,又一次開始執(zhí)行該函數。它不產生任何不良后果。

產生可重入的條件:1、多線程共同執(zhí)行該函數。2、函數自己直接或者間接調用自身。

可重入函數的特點:1、不使用任何(局部)靜態(tài)或全局的非const變量。因為如果使用的話它就涉嫌操縱共享數據,這樣會導致線程不安全。2、不返回任何(局部)靜態(tài)或全局的非const變量的指針。因為這同樣涉及到共享數據。3、僅依賴于調用方提供的參數。因為這樣可以把函數的執(zhí)行過程局限在局部。4、不依賴于任何單個資源的鎖。單個資源的鎖不允許被中斷,這不符合可重入函數的定義。5、不調用任何不可重入函數。這個沒啥好說的,如果調用了,可重入函數就成了不可重入函數。可重入性質是并發(fā)安全的強力保證可在多線程環(huán)境下大膽使用。

過度優(yōu)化:P53這個例子就是說本來2個x++結果是2,但是經過上鎖以后卻是1,這證明即使通過鎖機制也不能完全保障計算正確,這是計算機內部工作機制造成的線程不安全。

CPU對程序的優(yōu)化可能導致線程不安全,因為它會調整程序語句執(zhí)行順序以達到CPU所謂的優(yōu)化,這有時候很麻煩。Volatile關鍵字可以阻止這種優(yōu)化。1、它阻止編譯器為提高程序執(zhí)行速度將一個變量緩存到寄存器內而不寫回。2、它阻止編譯器調整語句執(zhí)行順序。這兩件事就是volatile所做的具體工作。但是,volatile能管住編譯器管不了CPU,CPU還是能對指令進行動態(tài)調整。

P54舉了一個double-check的例子,雖然現在我對這個沒有多深的理解,但是從這個例子中我看到作者是怎么分析的。它是將各個語句內部實際所進行的操作都列出來進行分析的,這個值得我學習。

雖然volatile管不了CPU,但是CPU有CPU相當于volatile的指令,一般這個指令叫做barrier。

1.6.3多線程內部情況

線程分為內核級線程和用戶級線程,內核級線程是用戶直接接觸不到的,用戶只能接觸到用戶級線程。

3種內核級線程與用戶級線程的模型。

1、一對一模型:就是每個用戶級線程都對應一個內核級線程,但反過來不是,因為內核級線程可能沒有用戶級線程與之對應。一般直接使用API或者系統(tǒng)調用創(chuàng)建的線程均為一對一模型。

它的優(yōu)點:真正實現線程的并發(fā)執(zhí)行,線程之間彼此互不影響。

它的缺點:1、許多操作系統(tǒng)限制了內核級線程的數量導致用戶級線程數量受限。2、許多操作系統(tǒng)用在內核級線程調度上的開銷較大,主要為上下文切換開銷,致使用戶級線程執(zhí)行效率低下。

2、多對一模型:多個用戶級線程對應同一個內核級線程,線程的切換由用戶級代碼決定。作者說多處理器對提升處理速度沒有明顯幫助,這是當然的了,CPU處理的是內核級線程,而這個模型就在那擺著,CPU也只能按照這個模式來處理。再說了,一個線程只能在一個核上跑,你再多給幾個核也沒用啊。

它的優(yōu)點:它比一對一模型快,還有高效的上下文切換和近似無限制的線程數量。

它的缺點:只要有一個線程阻塞,對應于同一個內核級線程的其他線程也無法執(zhí)行,該內核級線程也阻塞,這很好理解,因為只有一條通路。

3、多對多模型:是上面二者的合體。很顯然它能克服上述二者的缺點,同理多處理器也無法顯著提升它的執(zhí)行效率。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容