面試問題整理之後臺問題

2021-08-20 13:02:54 字數 3757 閱讀 6854

1.epoll中et和lt的區別與實現原理

lt:水平觸發,效率會低於et觸發,尤其在大併發,大流量的情況下。但是lt對**編寫要求比較低,不容易出現問題。lt模式服務編寫上的表現是:只要有資料沒有被獲取,核心就不斷通知你,因此不用擔心事件丟失的情況。

et:邊緣觸發,效率非常高,在併發,大流量的情況下,會比lt少很多epoll的系統呼叫,因此效率高。但是對程式設計要求高,需要細緻的處理每個請求,否則容易發生丟失事件的情況。

2.tcp有哪些定時器?

tcp使用四種定時器(timer,也稱為「計時器」):

重傳計時器:retransmission timer

堅持計時器:persistent timer

保活計時器:keeplive timer

時間等待計時器:time_wait timer。

(1)重傳計時器:

重傳定時器:為了控制丟失的報文段或丟棄的報文段,也就是對報文段確認的等待時間。當tcp傳送報文段時,就建立這個特定報文段的重傳計時器,可能發生兩種情況:若在計時器超時之前收到對報文段的確認,則撤銷計時器;若在收到對特定報文段的確認之前計時器超時,則重傳該報文,並把計時器復位;

重傳時間=2rtt;

rtt的值應該動態計算。常用的公式是:rtt=previous rtti + (1-i)*current rtt。i的值通常取90%,即新的rtt是以前的rtt值的90%加上當前rtt值的10%.

karn演算法:對重傳報文,在計算新的rtt時,不考慮重傳報文的rtt。因為無法推理出:傳送端所收到的確認是對上一次報文段的確認還是對重傳報文段的確認。乾脆不計入。

(2)堅持計時器:persistent timer

專門為對付零視窗通知而設立的。

當傳送端收到零視窗的確認時,就啟動堅持計時器,當堅持計時器截止期到時,傳送端tcp就傳送乙個特殊的報文段,叫探測報文段,這個報文段只有乙個位元組的資料。探測報文段有序號,但序號永遠不需要確認,甚至在計算對其他部分資料的確認時這個序號也被忽略。探測報文段提醒接收端tcp,確認已丟失,必須重傳。

堅持計時器的截止期設定為重傳時間的值,但若沒有收到從接收端來的響應,則傳送另乙個探測報文段,並將堅持計時器的值加倍和並復位,傳送端繼續傳送探測報文段,將堅持計時器的值加倍和復位,知道這個值增大到閾值為止(通常為60秒)。之後,傳送端每隔60s就傳送乙個報文段,直到視窗重新開啟為止;

(3)保活計時器:keeplive timer

每當伺服器收到客戶的資訊,就將keeplive timer復位,超時通常設定2小時,若伺服器超過2小時還沒有收到來自客戶的資訊,就傳送探測報文段,若傳送了10個探測報文段(沒75秒傳送乙個)還沒收到響應,則終止連線。

(4)時間等待計時器:time_wait timer

在連線終止期使用,當tcp關閉連線時,並不認為這個連線就真正關閉了,在時間等待期間,連線還處於一種中間過度狀態。這樣就可以時重複的fin報文段在到達終點後被丟棄,這個計時器的值通常設定為一格報文段壽命期望值的兩倍。

3.tcp設定tcp_nodelay是不是就能做到tcp資料直接發出不經過緩衝區?

顯然是不能的。

tcp/ip協議中,無論傳送多少資料,總是要在資料前面加上協議頭,同時,對方接收到資料,也需要傳送ack表示確認。為了盡可能的利用網路頻寬,tcp總是希望盡可能的傳送足夠大的資料。(乙個連線會設定mss引數,因此,tcp/ip希望每次都能夠以mss尺寸的資料塊來傳送資料)。

nagle演算法就是為了盡可能傳送大塊資料,避免網路中充斥著許多小資料塊。

nagle演算法的基本定義是任意時刻,最多只能有乙個未被確認的小段。 所謂「小段」,指的是小於mss尺寸的資料塊,所謂「未被確認」,是指乙個資料塊傳送出去後,沒有收到對方傳送的ack確認該資料已收到。

舉個例子,一開始client端呼叫socket的write操作將乙個int型資料(稱為a塊)寫入到網路中,由於此時連線是空閒的(也就是說還沒有未被確認的小段),因此這個int型資料會被馬上發送到server端,接著,client端又呼叫write操作寫入乙個int型資料(簡稱b塊),這個時候,a塊的ack沒有返回,所以可以認為已經存在了乙個未被確認的小段,所以b塊沒有立即被傳送,一直等待a塊的ack收到(大概40ms之後),b塊才被傳送。

tcp_nodelay

簡單地說,這個選項的作用就是禁用nagle演算法,禁止後當然就不會有它引起的一系列問題了。使用setsockopt可以做到。

4.初始化序列和建構函式誰先執行

初始化序列

5.timewait如何強制結束

setsocketopt

6.顯示當前程序資訊的命令以及顯示網路連線的命令

ps 和 netstat

7.printf緩衝區的問題

以下**輸出幾個?

#include #include #include int main(void) 

return 0;

}

結果應該是輸出8個.第一次父程序進入之後fork子程序子1,同事要記得父子程序都會執行fork之後的**,所以此時父子都會printf「-」,此時是兩個「-」 然後第二次fork,父程序再建立乙個子程序子2,同時兩個都列印printf「-」, 子1程序fork孫子程序孫1,此時子1和孫1都列印「-」,此時共6個「-」; 這也是理論情況下的,但是由於printf有自己的緩衝區,所以會多列印兩個,即8個。因為printf重新整理緩衝區時不帶』\n』時,是按全緩衝重新整理的,即遇到檔案結尾或緩衝區寫滿才會重新整理,所以在fork時緩衝區作為乙個程序pcb中的一部分也被子程序繼承。

8.單鏈表刪除和公共節點查詢問題

單鏈表刪除節點的思路在於用後續節點代替當前節點以實現刪除

公共節點查詢的思路在於兩個鍊錶如果有公共節點則一定是y型,因此可以直接檢視尾部是否相等,不相等則一定沒有公共節點

9.32位機乙個程序最多可以建立多少個執行緒?

首先要知道32位機最多可以分配2的32次方的空間給虛擬記憶體,因此有4gb的記憶體空間分配堆疊,然而其中還有核心空間,windows為2g,linux為1g。剩餘空間在理想條件下可用於分配執行緒。而每個執行緒的保留堆疊空間為1m(也有的說2m,8m之類的),由此可計算出理論上的執行緒數上限。

10.word文件中插入、刪除文字以及修改文字效果應該用什麼樣的資料結構實現?

對每個字單獨做乙個資料結構,儲存文字的屬性。為了方便遍歷、方便查詢、方便各個位置插入,這裡跳躍表無疑是最好的選擇之一。跳躍表(skiplist)是一種有序資料結構,它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的。

跳躍表支援平均o(logn)、最壞o(n)複雜度的節點查詢,還可以通過順序性操作來批量處理節點。

在大部分情況下,跳躍表的效率可以和平衡樹相媲美,並且因為跳躍表的實現比平衡樹要來得更為簡單,所以有不少程式都使用跳躍表來代替平衡樹。

redis使用跳躍表作為有序集合鍵的底層實現之一,如果乙個有序集合包含的元素數量比較多,又或者有序集合中元素的成員(member)是比較長的字串時,redis就會使用跳躍表來作為有序集合鍵的底層實現。

和鍊錶、字典等資料結構被廣泛地應用在redis內部不同,redis只在兩個地方用到了跳躍表,乙個是實現有序集合鍵,另乙個是在集群節點中用作內部資料結構,除此之外,跳躍表在redis裡面沒有其他用途。

後台開發面試問題整理

最近實習招聘又開始了,被一些師弟問了面試會問到的問題,於是想把之前實習 校招被問過的問題整理出來,希望對需要的人有幫助。雖然下面很多問題,但面試時可以問的問題是乙個無限集,而且因人而異,只能作為一定的參考,如果把所有知識面都掌握得很牢固那問什麼都沒問題 這裡的問題也不是說要所有都能答得上來,能答大部...

後台開發面試問題整理

最近實習招聘又開始了,被一些師弟問了面試會問到的問題,於是想把之前實習 校招被問過的問題整理出來,希望對需要的人有幫助。雖然下面很多問題,但面試時可以問的問題是乙個無限集,而且因人而異,只能作為一定的參考,如果把所有知識面都掌握得很牢固那問什麼都沒問題 這裡的問題也不是說要所有都能答得上來,能答大部...

面試問題整理

所謂事務,就是提供一種機制,將乙個活動涉及的所有操作納入到乙個不可分割的執行單元,只要其中任何乙個操作執行失敗,都將導致整個事務的回滾。簡單的說,就是一種 要不什麼都不做,要麼做全套 機制。資料庫本地事務 acid原則 a atomicity 原子性 c consistency 一致性 i isol...