深信服實習麵筋
下面是實習面試過程中的一些總結:
面經1
一面:
1.this指標呼叫成員函式時的壓棧和相關暫存器使用?(從右往左呼叫,這個容易可以回答;在x86中,會將this指標放在暫存器ecx中,以便快速訪問,對於暫存器方面,我完全沒有了解)
2.虛表的呼叫,以及單繼承,多繼承,菱形繼承中虛表在物件記憶體中位置?是一個虛表還是多個虛表?(虛表呼叫就是類的首地址,然後查表,單繼承是單表,多繼承是多表)
3.RTTI的使用?(執行時型別鑑定,適用於使用基類的指標或引用轉換為派生類並呼叫非虛擬函式方法)
4.TCP的nagle演算法以及延遲ACK?(Nagel演算法將較小tcp包進行合併傳送;適用於批量資料傳輸,減少ACK迴應流量)
5.TCP擁塞控制的幾種方式?(慢開始和擁塞避免、快開始與快恢復)
6.linux環境下互斥鎖的使用以及互斥鎖釋放後,等待執行緒是隨機喚醒還是喚醒第一個等待佇列?(互斥鎖實現互斥機制,保護多個執行緒更改一個共享資源)(優先順序喚醒)(其實這跟鎖並沒有太多關係,而是系統的執行緒排程問題)
7.linux環境下條件變數的使用?(條件變數提供訊號機制,所有等待該條件的執行緒同時阻塞,使用過程需要一互斥量配合使用。作用?使用場景?如何使用?)
8.pthread_cond_boardcase和pthread_cond_signal的區別?(前者廣播喚醒等待該條件的所有執行緒,後者單播至少喚醒一個等待該條件的執行緒)
9.程序之間的通訊方式?有沒有實踐過?講講其中你覺得用的最多的方式?(;;最多是共享記憶體和訊號量,之前第二個專案是傳輸大塊資料,實現迴圈緩衝區;最後一個小問實際上是需要結合實際的需求,不同的需求會有不同的方式選擇)
10.select和epoll的區別以及他們的優劣?(是否重複拷貝、檢測過程是否遍歷所有)
11.問了一下大學幹了些啥以及意向城市?(社團工作、創業公司、校企培養;深圳-IT行業繁榮)
二面:
1.寫一下將一個整型的二進位制後三位清零?(n &=~7)
2.__stdcall和__cdecl有什麼區別?(一個是函式自己管堆疊引數清理;一個是呼叫者管堆疊引數清理,預設方式)
3.用一個父類的指標,怎麼呼叫子類的虛擬函式的?他們的呼叫流程是什麼?(就是虛擬函式機制,虛表的實現,說一遍即可)
4.為什麼浮點有誤差?二進位制無法精確的表達十進位制小數(計算機本質是二進位制,通過浮點表示小數,都是模擬出來的)
5.printf("%s%d", s, d)的壓棧情況?(突出說明要壓入下一條指令執行的地址,保護現場;也就是函式呼叫的堆疊幀的對映圖)
6.說一說大學做了什麼專案?學過什麼東西?(送分)
7.說說你這個專案中遇到的一些問題和對應的解決方案?你還能提出新的功能嗎?還有沒?這樣做的原因是什麼?(這一部分全靠想)(問題:網路傳輸不穩定,方案:流量控制;日誌系統,方便檢視執行過程中的錯誤)
8.有沒有做過開源專案?基於開源框架進行開發?()
9.看過linux原始碼,說說epoll和select以及poll的底層程式碼實現?具體有哪些?select和epoll的優劣,從實現上說明?(沒看過,但我還是知道一部分底層實現;是否重複拷貝、是否遍歷所有)
10.求一堆字串的最長公共字首?指標後移就可以了
11.求給定一堆字串中,其中幾個的最長公共字首?用字典樹說明一下就可以了
12.64位x86作業系統和32位x86作業系統函式呼叫的差別?(64位前6個引數放暫存器,32位是直接壓棧;這個我完全不會)
13.訊號傳遞機制?(訊號本質一個軟體模擬的中斷,或許是硬體中斷Ctrl-C等操作,或許是軟體kill函式等傳送訊號;程序註冊訊號,核心監控,程序切換至核心,檢測是否發生訊號,傳遞訊號,進入程序的訊號服務函式)
面經2
一面:
1.new和malloc的區別。(運算子與庫函式;分配記憶體後是否建立物件)
2.浮點數怎麼判斷相等。(相減比較0.0000001)
3.一共四個人過橋,每個通過橋的時間為1,2,5,8分鐘,他們只有一個手電筒,橋每次只能承受兩個人的重量,問你怎麼過橋最快?換成是一堆人該怎麼辦?(講述思路即可,8=5+2+1;一堆人的話,就湊整)
4.手寫程式碼,算出一個檔案裡的每個小寫字母出現的次數。(雜湊表直接擼,注意小寫字母,在獲取結果是陣列索引採用’a~z’即可)
5.怎麼比較兩個結構體相等?(逐個成員比較)
6.A函式呼叫了B函式,這時候在B中新增成員函式,問A需不需要重新編譯?(在C和C++ 中分別需不需要重新編譯。)
7.指標傳參和引用傳參的區別。(是否拷貝,是否同一實體,是否絕對安全)
二面:
1.將一個整型的二進位制最後三位清零。(x&=~7)
2.面試官自己手寫的一個程式碼讓你寫輸出結果。(這可以,最怕幾個loop的程式碼)
3.求一堆字串的最長公共字首。還有就是找這一堆字串中公共字首最長的兩個字串。
4.printf("%s%d", s, d)的壓棧情況,執行Printf函式時sp指標的變化。(被考無數次的題目?sp就是堆疊指標,直接移動即可,注意堆疊是從高到底,相加相減分清楚)
5.有一幢大樓(忘了他有沒有說大樓有多高),然後你有兩個玻璃球,玻璃球在你從大樓的第N層扔下的時候會碎,從小於N的樓層扔下不會碎,大於N的樓層扔下也會碎,讓你用最快的方法找到N的具體值。(二分法,具體忘記怎麼錄了)
6.浮點數不能直接比較的原理。(計算機基礎,不過也可以展開講)
7.說下你的專案經歷?
8.有沒有看過什麼開源專案。(FFmpeg)
面經3
深信服-星雲計劃 失敗
1.聊專案
2.對於N個點的網路,求任意兩點的最短路徑?(專門的演算法,貪心)
3.C語言區域性變數與全域性變數(記憶體位置、宣告週期、作用域等方面描述)
4.對於大的陣列,如何使用區域性變數?(修改程序棧大小、)
5.不同檔案中如何引用外部變數?(標頭檔案包含)
6.遞迴時棧溢位怎麼辦?任何遞迴都可以用非遞迴實現麼?(轉為迭代實現,尾遞迴可以)
7.儲存通訊錄資訊:姓名,手機,郵箱,簡介,如何能實現快速查詢以及部分查詢?
8.Linux程式設計中的鎖有哪些?(自旋鎖、互斥鎖、訊號量)
9.自旋鎖與互斥鎖區別(是否投入睡眠)
10.程序IPC方式(管道、FIFO、訊息佇列、訊號量、共享記憶體、socket)
11.socket與共享記憶體用於什麼情況?(socket實現程序間傳遞開啟檔案描述
符,共享記憶體實現大資料塊傳輸,最快IPC)
12.衛星網路中網路頻寬足夠,但丟包率高,導致網頁打不開,通訊質量差,什麼原因?如何解決?(裝置丟包、MTU設定不恰當、網路攻擊)
13.Dijkstra單源最短路徑(學習的時候弄懂了,現在又忘記了)
深信服這場也跪在了演算法上,面試官說只要你回答上這個問題就給你過,但還是沒想起來Dijkstra的具體內容。 無奈。
面經4
一面
1.你會什麼(Linux和C)
2.多程序的建立與返回值的意義、殭屍程序(;父程序沒有對子程序的退出進行wait,造成資源沒有完全歸還給系統,子進行依然保留在程序表裡面但不執行)
3.多執行緒的互斥、通訊機制、效率問題()
4.會幾種查詢演算法(二分、圖、樹)、某演算法的時間複雜度
5.你會幾種排序?(快排、選擇、希爾、雜湊、歸併、堆)、實現其中一個演算法
6.幾種錯誤訊號,並講述其中一個的意義(SIGSEVG段錯誤,記憶體越界、許可權問題)
7.說說TCP協議的(可靠機制、流量控制、擁塞控制、連線管理)
二面
1,new malloc的實現區別(運算子和庫函式、是否構造物件)
2,解釋struct的位元組對齊,估計是昨天的試卷這個錯誤比較嚴重,為什麼要對齊,如何實現兩個結構體的比較相等,可以用compare()按位元組比較嗎?(對齊的作用;逐個成員比較)
3,指標和引用的區別(是否拷貝,是否同一實體,是否絕對安全,引用只能初始化並且以後不能改變)
4,什麼技術可以代替巨集定義(這其實考的面非常廣,看你軟體開發的經驗,看你對巨集技術發展的理解;C++裡面可以:const實現常量、inline內聯替代巨集函式、typedef替代型別定義、條件編譯)
5,描述下快速排序的思想,時間複雜度是多少,什麼情況下複雜度最大(根本在於分治法;O(log(n));已排序好)
6,寫下二分查詢
7,動態連結庫的介面函式是什麼(dlopen類,這是顯示連結共享庫,我從來沒用過)
8,雲上傳是怎麼實現秒傳的(MD5)