1. 程式人生 > >秋招材料整理——基礎(計算機網等)

秋招材料整理——基礎(計算機網等)

一、TCP三次握手

1.過程

TCP三次握手 1)首先 B 處於 LISTEN(監聽)狀態,等待客戶的連線請求。 2)A 向 B 傳送連線請求報文段,SYN=1,ACK=0,選擇一個初始的序號 x。 3)B 收到連線請求報文段,如果同意建立連線,則向 A 傳送連線確認報文段,SYN=1,ACK=1,確認號為 x+1,同時也選擇一個初始的序號 y。 4)A 收到 B 的連線確認報文段後,還要向 B 發出確認,確認號為 y+1,序號為 x+1。 5)B 收到 A 的確認後,連線建立。

2.原因

第三次握手是為了防止伺服器錯誤開啟失效的連結請求。 客戶端傳送的連線請求如果在網路中滯留,那麼就會隔很長一段時間才能收到伺服器端發回的連線確認。客戶端等待一個超時重傳時間之後,就會重新請求連線。但是這個滯留的連線請求最後還是會到達伺服器,如果不進行三次握手,那麼伺服器就會開啟兩個連線。如果有第三次握手,客戶端會忽略伺服器之後傳送的對滯留連線請求的連線確認,不進行第三次握手,因此就不會再次開啟連線。

二、TCP四次揮手

1.過程

TCP四次揮手 1)A 傳送連線釋放報文段,FIN=1。 2)B 收到之後發出確認,此時 TCP 屬於半關閉狀態,B 能向 A 傳送資料但是 A 不能向 B 傳送資料。 3)當 B 不再需要連線時,傳送連線釋放請求報文段,FIN=1。 4)A 收到後發出確認,進入 TIME-WAIT 狀態,等待 2 MSL(最大報文存活時間)後釋放連線。 5)B 收到 A 的確認後釋放連線。

2.原因

伺服器收到客戶端傳送的FIN 連線釋放報文之後,就進入了 CLOSE-WAIT 狀態,傳送還未傳送完畢的資料,傳送完畢之後,伺服器會發送 FIN 連線釋放報文。

3.TIME_WAIT

客戶端接收到伺服器端的 FIN 報文後進入此狀態,還需要等待2MSL。有兩個理由:

  • 確保最後一個確認報文段能夠到達。如果 B 沒收到 A 傳送來的確認報文段,那麼就會重新發送FIN連線釋放報文段,Time-wait就是為了處理這種情況。
  • 為了讓本連線持續時間內所產生的所有報文段都從網路中消失,使得下一個新的連線不會出現舊的連線請求報文段

三、UDP vs. TCP

  • 使用者資料報協議 UDP:是無連線的,盡最大可能交付,沒有擁塞控制,面向報文(對於應用程式傳下來的報文不合並也不拆分,只是新增 UDP 首部),支援一對一、一對多、多對一和多對多的互動通訊。
  • 傳輸控制協議 TCP:是面向連線的,提供可靠交付,有流量控制,擁塞控制,提供全雙工通訊,面向位元組流(把應用層傳下來的報文看成位元組流,把位元組流組織成大小不等的資料塊),每一條 TCP 連線只能是點對點的(一對一)。

四、程序 vs. 執行緒

  • 程序:資源分配的基本單位;
  • 執行緒:獨立排程的基本單位。一個程序中可以有多個執行緒,共享程序資源
  • 區別:1)資源:程序是資源分配的基本單位,執行緒不擁有資源,訪問隸屬程序的資源 2)排程:執行緒是獨立排程的基本單位。同一程序中的執行緒切換不會引起程序切換,不同程序中的執行緒切換會引起程序切換 3)系統開銷:建立/撤銷/切換程序的開銷遠大於執行緒 4)通訊:程序間通訊需要程序同步或互斥的輔助,執行緒間可直接讀/寫程序中的資料來通訊

五、程序狀態

建立,就緒,執行,阻塞,終止 就緒:程序已獲得除CPU以外的所有資源,等待分配CPU 執行:佔用CPU資源執行,處於此狀態的程序數小於等於CPU數 阻塞:程序等待某種條件,在條件滿足之前無法執行

六、程序間通訊

主要包括管道, 系統IPC (包括訊號,訊息佇列,共享記憶體,訊號量), 套接字(SOCKET)

  • 管道:可用於具有親緣關係程序間的通訊
  • 系統IPC:
    • 訊號:用於通知接受程序有某種事件發生
    • 訊息佇列:訊息連結串列,存放在核心中並由訊息佇列識別符號標識。
    • 共享記憶體:多個程序可訪問同一記憶體空間,最快的IPC形式,通常與其他機制結合使用
    • 訊號量:計數器,控制多個程序對共享資源的訪問,鎖機制
  • 套接字:可用於不同機器間的程序間通訊

七、死鎖,產生條件

  • 死鎖:多個併發程序中,如果每個程序持有某種資源而又等待其它程序釋放其他資源,在未改變這種狀態之前都不能向前推進,稱這一組程序產生了死鎖。通俗的講就是多個程序無限期的阻塞、相互等待的一種狀態。
  • 條件(有一個條件不成立,則不會產生死鎖):
    • 互斥:一個資源一次只能被一個程序使用
    • 請求與保持:一個程序因請求資源而阻塞時,對已獲得資源保持不放
    • 非搶佔條件:程序獲得的資源,在未完全使用完之前,不能強行搶佔
    • 迴圈等待:若干程序之間形成一種頭尾相接的環形等待資源關係

八、python裡面字典底層怎麼實現的

  • 用雜湊表實現。兩個list,一個放key,一個放value,用雜湊函式將key和陣列下標進行對映,使其均勻地分佈在陣列中。
  • 雜湊函式:只要能將所有資料均對映到list中即可
    • 摺疊法:將每個元素分為相等的幾部分後相加後再取模
    • 取中法:平方後取中間的值再取模
  • 衝突處理:
    • 開放定址法 1)線性探測再雜湊:H_i=(hash(key)+i)%m ,i=0,1,2,…,m-1 2)二次探測再雜湊/平方探查法:H_i=(hash(key)+i^2 )%m ,i=0,1,2,…,m-1
    • 再雜湊:換另一個雜湊函式
    • 鏈地址法:將所有關鍵字雜湊值相同的記錄都存在同一線性連結串列中
  • 裝載因子 = \frac{已有記錄數}{雜湊表長度 },越大,衝突的可能性越大,一般0.75比較合適

九、動態規劃 vs. 貪心演算法

  • 都是用來求“最優化問題”,且都必須有“最優子結構”(一個問題的最優解包含其子問題的最優解)。貪心可以解決的問題,動態規劃都能解決,可以說,貪心是動態規劃的一個特例
  • 動態規劃:自底向上,通過組合子問題的解來求解原問題
    • 關鍵是狀態轉移方程,即如何由已求出的區域性最優解來推導全域性最優解,全域性最優解一定包含某個區域性最優解,但不一定包含前一個區域性最優解,因此需要記錄之前的所有最優解
    • 邊界條件:最簡單的,可以直接得出的區域性最優解
  • 貪心:自頂向下,進行一次次選擇,將給定問題變得更小 從問題的某一個初始解出發逐步逼近給定的目標,總是做出當時看來最佳的選擇,由上一步的最優解推導下一步的最優解,因此只需要記錄上一步的最優解

十、堆疊區別

  • 棧儲存的是區域性變數而堆儲存的是實體
  • 棧的更新速度要快於堆記憶體,因為區域性變數的生命週期很短,變數只在作用域內有效,一旦離開就會被釋放,而堆記憶體存放的實體會被垃圾回收機制不定時的回收 堆疊

十一、排序複雜度

排序演算法 比較次數 移動次數 輔助空間 穩定性
最好時間 平均時間 最壞時間 最好情形 最壞情形
直接插入排序 O(n) O(n2) O(n2) 0 O(n2) O(1) 穩定
希爾排序 O(n1.3) 0 O(n2) O(1) 不穩定
直接選擇排序 O(n2) O(n2) O(n2) 0 O(n2) O(1) 不穩定
堆排 O(nlog2n) O(nlog2n) O(nlog2n) O(log2n) O(n2) O(1) 不穩定
氣泡排序 O(n) O(n2) O(n2) 0 O(n2) O(1) 穩定
快排 O(nlog2n) O(nlog2n) O(n2) O(nlog2n) O(log2n) 不穩定
歸併排序 O(nlog2n) O(nlog2n) O(nlog2n) O(nlog2n) O(n) 穩定
基數排序(鏈式、順序) O(dn) O(dn) O(dn) O(n) 穩定