《碼出高效》讀書筆記(一)計算機基礎

一、計算機整數存儲

1、補碼

補碼是一種數據表示方法,正數的補碼與原碼相同,負數的補碼爲將其對應的正數取反+1,反過來用補碼算源碼,也是直接取反+1然後符號位置爲1。0的補碼還是爲0。

補碼的意義在於,將符號位和數字爲統一,符號位也可以參與運算,加減法都可以用加法器運算。

二進制整數都是以補碼的形式存儲的。

2、左移和右移

左移<<是所有數字左移,低位補0,高位捨棄。在沒溢出的情況下,就是乘2的n次方。

右移分爲有符號右移>>和無符號右移>>>。有符號右移 ,正數是最高位補0,負數是最高位補1,也就是高位補的都是符號位。無符號右移,不論正負數都是最高位都補0。

注意左移和右移都是對補碼進行操作,補碼操作不關心符號位。

有符號右移應用場景:負數只能用有符號右移。

無符號右移應用場景:有符號右移需要耗費更多的空間,對於unsigned類型的數據,用無符號右移減小空間消耗。

只有Java語言有有符號右移,C和C++是沒有的。

二、計算機浮點數存儲

1、浮點數存儲

浮點數包含3部分:符號位、階碼、尾數。其中,符號位佔1bit,階碼8bit,尾數23bit。

如上例78.375,故符號位爲0,階碼爲6,尾數爲001110011。

當十進制的小數轉換爲二進制科學記數法的時候,如果無法用23位以內的二進制小數表示,就會出現精度損失,這就是爲什麼3.0會變成2.99999999。

2、浮點數階碼全0爲機器0,階碼全1爲無窮大。

3、浮點數求和步驟

1)零值檢測,也就是參數校驗,若有一個爲0直接不用求和了。

2)對階,通過調整一個數的尾數,使得兩個數的階碼一樣。爲儘量減小精度損失,小一點的數執行右移。

3)尾數求和

4)結果規格化,將求和之後的結果調整到符合浮點數規則的狀態,計算出階碼和尾碼。

5)結果舍入,將對階過程丟失的精度儘量加回來。

 

三、TCP基礎

1、TCP三次握手

1)A->B : SYN = 1, seq = x

2)B->A : SYN = 1, ACK = 1, seq = y, ack = x + 1

3)A->B : ACK = 1, seq = x + 2, ack = y + 1

爲什麼是三次握手,核心點在於理解TCP建立連接成功的意思是,雙方互相確認拿到了對方的初始序列號。TCP保證數據傳輸的完整、有序、無差錯,都是依賴此序列號,後續的數據都會帶一個依此序列號增長的標,作爲數據校驗的依據。

A將序列號發送給B,需要得到B的確認消息。同樣,B將序列號發送給A,也要得到A的確認消息。這樣一共是四次握手,將第二、三次握手合併,就簡化爲3次握手。

下面看一下包丟失的處理:

如果第一次握手失敗,即A發給B的SYN失敗,沒有到達B,則A會週期性重傳,直到收到B的確認。

如果第二次握手失敗,即B給A的SYN和ACK失敗,沒有到達A,則B會週期性重傳,直到收到A的確認。注意A並不知道沒收到B的確認是由於第一次握手失敗還是第二次握手失敗,因此A和B的重傳可能會同時進行。

如果第三次握手失敗,即A給B的ACK失敗,沒有到達B,則分兩種情況(此時A已經爲ESTABLISHED,可以傳輸數據):

a)如果A有數據需要發送,則直接將數據會帶上ACK,B收到後會狀態置爲ESTABLISHED,可以接收數據。

b)如果A沒有數據要發送,則B週期性超時重傳,直到收到A的確認,收到後B狀態置爲ESTABLISHED。

2、TCP四次揮手

1)A->B : FIN = 1, seq = u ,A發送釋放連接報文,並停止發送數據,此時B可能有沒發送完的數據。

2)B->A : ACK = 1, seq = v, ack = u+1,A收到B的確認消息,如果此消息接收失敗,則A會重複嘗試上一步。此時B依然可以向A發送數據。

3)  B->A :FIN = 1, ACK = 1, seq = w, ack = u+1,B發送完全部數據,向A發出釋放連接報文,A收到後進入TIME_WAIT狀態,經過2MSL的時間後,進入CLOSED狀態。

4)A->B :ACK = 1, seq = u+1, ack = w+1, A確認收到B的釋放連接請求。如果B接收此消息失敗,B會重複上一步,否則B進入CLOSED狀態。

之所以是四次揮手,不能合併第二、三次揮手,是因爲B可能有數據沒傳輸完。

之所以A要等待2MSL才關閉,是因爲第四次揮手有可能失敗,這時候B會超時重新重傳,進行第三次揮手,A纔可以反饋。

高併發機器可以調小TIME_WAIT,也就是減小MSL,這樣A可以儘早釋放連接。

3、TCP的流量控制和擁塞控制

https://blog.csdn.net/ss1300460973/article/details/90270123

 

四、字符集

字符集其實就是將二進制數據映射到字符的規範,有ASCII、GBK、UTF-8等等。

ASCII是最初美國人定義的字符集,只考慮了鍵盤字符等128個字符,不兼容漢字等其他非英文字符。

GBK即漢字內碼擴展規範,是國標漢字字符集,跟ASCII不兼容。

爲制定通用的編碼規範,ISO推出了Unicode,Unicode兼容了所有的字符,但需要多個字節才能表示一個字符,而ASCII只需要1個字節。因此目前通用的是UTF-8可變長度編碼,UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符纔會被編碼成4-6個字節。

 

五、補充

1、什麼是指令週期、總線週期,時鐘週期,它們之間是什麼關係?

指令週期:CPU取出並執行一次指令的時間。

總線週期:一次訪問I/O或存儲器的時間。

時鐘週期:又稱震盪週期,是處理操作的最小單位,一個時鐘週期內CPU只會完成一個最基本動作。

一次指令週期包含若干個總線週期,一個總線週期包含若干個時鐘週期。

2、邏輯與或非有短路功能

如 a==1 && b==2,當a==1爲false時,不需要判斷b==2。

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