[c/c++後臺開發面經系列]3 bigo/映客面經(含答案)

此係列內容以及觀點僅個人感受,不妥之處直接私我!目的爲了大家能更好的知道面試題難度以及如何準備,希望能讓大家少浪費時間尋找資料,多點時間學點乾貨!因爲篇幅原因,大部分題目題解簡潔,但有相關資料推薦進階閱讀,學會使用搜索引擎是一門藝術!望諒解!

兩個公司崗位都是後臺開發工程師,公司共同點都是直播,短視頻相關,其面試中問到的題目爲常見題目,所以不要怕。bigo四面爲電話+視頻。映客直播一共三面,但是必須現場筆試,如果通過一面第二天當場面試,嘻嘻,說實話,小姐姐的確多!

一 Bigo面試

一面,二面,三面間隔時間比較長,問題直戳中心(感覺蠻厲害),每輪幾乎都有手撕算法,不過可能運氣還行,常見題!

1 一面(視頻面40分鐘)

  • 自我介紹

主要表明自己姓名,學校,爲什麼面這個崗位或者公司,具有XX技術,想嘗試貴公司等。

  • 析構函數是否可以爲虛函數?爲什麼?

首先,析構函數可以爲虛函數,原因:

 在實現多態時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。一般情況下,用基類指針指向派生類對象,刪除基類指針,這樣的刪除只能夠刪除基類對象,而不能刪除子類對象,形成了刪除一半形象,造成內存泄漏。在公有繼承中,基類對派生類及其對象的操作,只能影響到那些從基類繼承下來的成員。如果想要用基類對非繼承成員進行操作,則要把基類的這個函數定義爲虛函數。析構函數自然也應該如此:如果它想析構子類中的重新定義或新的成員及對象,當然也應該聲明爲虛的.

如果不需要基類對派生類及對象進行操作,則不能定義虛函數,因爲這樣會增加內存開銷.當類裏面有定義虛函數的時候,編譯器會給類添加一個虛函數表,裏面來存放虛函數指針,這樣就會增加類的存儲空間.所以,只有當一個類被用來作爲基類的時候,才把析構函數寫成虛函數.

  • 虛函數和純虛函數的作用和區別

虛函數引入原因:爲了方便使用多態特性,我們常常需要在基類中定義虛函數。

純虛函數引入原因:

1、爲了方便使用多態特性。

2、在很多情況下,基類本身生成對象是不合情理的。例如,動物作爲一個基類可以派生出狗子、貓等子類,但動物本身生成對象明顯不合常理。純虛函數就是基類只定義了函數體,沒有實現過程(其實可以在類外部實現函數體)。

虛函數和純虛函數的區別:

帶純虛函數的類叫抽象類,抽象類不能實例化,而能被繼承,並重寫其純虛函數後,才能使用。

  • 說說tcp三次握手/四次揮手,加上相關的狀態

TCP狀態轉化圖(引自51)

可以考慮從一次完整的會話來回答,這樣思路會更加的清晰。

  • 使用過epoll?爲什麼用它

不管是java還是c++還是what,網絡通信的相關模式思路都是一致,能少輪詢就少輪詢,能使用緩存儘量使用,所謂局部性原理,非常的重要!再比如說消息隊列中的kafka,爲了削減高峯(上游流量),採用kafka緩解上下文的計算能力,這也是類似的思想吧!如果你想看epoll源碼註釋,後臺回覆[epoll]即可!

  • 介紹一下http與https及區別

HTTPS和HTTP的區別

超文本傳輸協議HTTP協議被用於在Web瀏覽器和網站服務器之間傳遞信息。HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息,比如信用卡號、密碼等。

爲了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。爲了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通信加密。

HTTPS和HTTP的區別主要爲以下四點:

一、https協議需要到ca申請證書,一般免費證書很少,需要交費。

二、http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。

三、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。

四、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全(相對安全)。

  • 編程題1 反轉鏈表

c++版本
java版本
python版本

這個問題一般來說會有下文,只要不問一些敏感話題就行了。

2  二面(視頻面40分鐘)

忘記相隔了多少天,某一天晚上一個小姐姐打電話約時間面試。

  • 自我介紹

  • 講一個你熟悉的項目,當時講了一個跨網通信程序,引發不少問題出來。(所以,面多了你就知道簡歷怎麼修改,怎麼引導面試官問你問題了吧)

  • 遇見過粘包現象嗎,如何避免

1 如果是發送方引起的粘包現象,我們可以通過操作指令讓其不等待緩衝區滿就直接發出。缺點是它會關閉優化算法,從而降低網絡發送效率。

2 如果對於接收方引起的粘包,可以考慮通過提高接收進程的優先級,讓其及時接受數據。缺點是,發送頻率稍微一高,接收方仍然來不及處理,所以粘包可能性還是很大。

3 接收方進行控制,將數據分爲多段多次接收,最後合併缺點就是對實時應用的場合不太適合。

4 接收方創建一預處理線程,對接收到的數據包進行預處理,將粘連的包分開。

面試官:我們看幾個簡單題

  • 構造函數爲什麼不能是虛函數?

虛函數的調用需要虛函數表指針,而該指針存放在對象的內容空間中;若構造函數聲明爲虛函數,那麼由於對象還未創建,還沒有內存空間,更沒有虛函數表地址用來調用虛函數。

  • 父進程先退出了,子進程會咋樣?

會被init進程回收。

  • 智能指針內部實現(C++11)

智能指針類將一個計數器與類指向的對象相關聯,引用計數跟蹤該類有多少個對象共享同一指針。每次創建類的新對象時,初始化指針並將引用計數置爲1;當對象作爲另一對象的副本而創建時,拷貝構造函數拷貝指針並增加與之相應的引用計數;對一個對象進行賦值時,賦值操作符減少左操作數所指對象的引用計數(如果引用計數爲減至0,則刪除對象),並增加右操作數所指對象的引用計數;調用析構函數時,構造函數減少引用計數(如果引用計數減至0,則刪除基礎對象)。智能指針就是模擬指針動作的類。所有的智能指針都會重載 -> 和 * 操作符。智能指針還有許多其他功能,比較有用的是自動銷燬。這主要是利用棧對象的有限作用域以及臨時對象(有限作用域實現)析構函數釋放內存。

  • 知道B樹和B+?說說他們的區別

B樹:爲了存儲設備或者磁盤設計的一種平衡查找樹,B+樹是B樹的一種變形,它把數據存儲在葉子節點,內部只存儲關鍵字和孩子指針,簡化了內部節點。

B+樹遍歷高效,將所有葉子節點串聯成鏈表從頭到尾遍歷。

爲什麼B+樹比B樹更加適合做系統的數據庫索引和文件索引?

B+樹的磁盤讀寫代價更低,因爲B+樹內部節點沒有指向關鍵字具體信息的指針,內部節點相對B樹小。

因爲非終端節點並不是指向文件內容的節點,僅僅是作爲葉子節點的關鍵字索引,因爲所有關鍵字的查詢都會走一條從根節點到葉子結點的路徑。即所有關鍵字查詢的長度一樣,查詢效率穩定。

  • 進程間的通信

答出一共有哪幾種,優點/缺點是什麼,最快又是什麼,也可以從一中方式爲突破點,從內核角度闡述更爲與衆不同了!

進程間通信方式描述
管道pipe半雙工通信方式,數據單向流動,只能在父子進程中使用。
命名管道FIFO半雙工方式是,但是允許非父子關係通信
消息隊列大小有限,存放在內核中的鏈表,建議好好使用ipcs命令。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流等缺點
共享存儲一塊內存,多個進程可以訪問,共享內存爲最快IPC方式。通過和信號量等來解決進程間的同步問題。
信號量計數器,控制多個進程對共享資源的訪問,不錯的同步手段。
信號通知機制的完美實現,某個進程有事件發生時通知處理即可。
  • 說說系統調用

簡單來說是操作系統給我們提供了接口,使用這個接口來和系統進行通信。可以從以下三個方面闡述

1 計算機中的系統態和用戶態

應用程序需要調用系統功能時,通過系統調用,CPU轉爲系統態,取得系統資源,執行系統功能。對應CPU的系統態和用戶態,CPU所執行的指令分爲特權指令和非特權指令。

  • 系統態:也說是和心態。處理機運行系統的狀態

  • 用戶態:處理機運用應用程序的狀態

2 cpu執行的特權命令和非特權命令

  • 特權命令:

     即CPU在系統態所執行的指令。這種指令只允許系統態的CPU運行,即只允許操作系統調用。特權指令可以對操作系統執行能執行的所有操作,不受任何限制。

  • 非特權:

     即CPU在用戶態所執行的指令。這種指令只能執行一般性的操作任務,不能直接進行訪問系統中的硬件和軟件,其對內存的訪問範圍也侷限於用戶空間。應用程序想要訪問系統中的硬件和軟件,只能通過系統調用間接進行。

  • 項目介紹

老規矩,項目背景,擔任什麼角色,解決了什麼問題,還有什麼優化方案等。

二 映客直播面試

因爲這個公司基本上都是線下筆試+面試,兩天走完流程,如果小夥伴們當地城市有宣講,可以去嘗試嘗試的,待遇也還不錯!你懂得,姐姐也多!

1 筆試

其中筆試題類似牛客網習題,不過可能還會簡單很多,比如進程幾個狀態呀,畫一畫狀態圖呀,mysql優化方式有哪些,b+樹和其他樹區別(簡答題),還有兩三個編程題,劍指offer原題。

2 一面(35分鐘)

福利態度挺不錯的,我記得大廳給我們準備了不少吃的,然後面試過程中還提供飲用水。另外注意了,一面的時候會考察昨天的試卷,而且同樣伴隨二面,所以第一天沒做出來的題目最好回去後查閱下資料吧!

  • 自我介紹

  • 面試官會看昨天的試題,比如筆試題目你做出來了棧實現隊列[leetcode棧隊列]1 棧實現隊列,那麼可能會讓你寫隊列轉棧。

  • 儘量多的方法實現兩個整數的交換(數學方法,介入中間值,位運算)

  • 反轉鏈表(第三次出現)

3 二面

上來先是對一面的總結,然後開始騷操作,一堆邏輯題(就寫部分吧,受不了)!

  • 感覺一面如何。

小藍還是要囉嗦一句,學會覆盤

  • 簡歷中看你使用過kafka,爲什麼使用kafka,瞭解其他消息隊列嗎,你們項目中的topic多少個,有嘗試過優化?

自己看,一口氣下來多少個問題,其實你寫在簡歷上面的各個知識點都可以按照這種套路來問你,所以自己做好準備。這也是我們學習一門新的知識非常重要的一環。

暫時先簡述消息隊列,比如目前的RQ包含了RabbitMQ,ZeroMQ,Redis等,但是kafka天生分佈式,高吞吐量,消息可以較長時間持久化,且提供良好的API c接口(因爲我當時用的c接口)。其詳細總結網上很多,後續自己也會寫一份!

  • const 在*左和右的區別,const修飾成員函數有什麼作用,如果想修改成員變量,可以將變量修飾成mutable(推薦書籍《c與指針》)

如果const位於星號的左側,則const就是用來修飾指針所指向的變量,即指針指向爲常量;


如果const位於星號的 右側,const就是修飾指針本身,即指針本身是常量。


有 const 修飾的成員函數(指 const 放在函數參數表的後面,而不是在函數前面或者參數表內),只能讀取數據成員,不能改變數據成員;沒有 const 修飾的成員函數,對數據成員則是可讀可寫的。

  • redis支持哪些數據類型

string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合).當然,最好說說其特點(參考《redis設計與實現》)

  • 來給你寫個題目:“請問把一盒蛋糕切成8份,分給8個人,但蛋糕盒裏還必須留有一份。大家如何把蛋糕分給這八個人。”

把切成的8份蛋糕先拿出7份分給7人,剩下的1份連蛋糕盒一起分給第8個人

  • 什麼是緩存穿透?如何避免?什麼是緩存雪崩?何如避免?

緩存穿透

一般來說,緩存系統會通過key去緩存查詢,如果不存在對應的value,就應該去後端系統查找(比如DB)。這個時候如果一些惡意的請求到來,就會故意查詢不存在的key,當某一時刻的請求量很大,就會對後端系統造成很大的壓力。這就叫做緩存穿透。

如何避免?

  • 對查詢結果爲空的情況也進行緩存,緩存時間設置短一點,或者該key對應的數據insert了之後清理緩存。

  • 對一定不存在的key進行過濾。可以把所有的可能存在的key放到一個大的Bitmap中,查詢時通過該bitmap過濾。

緩存雪崩

當緩存服務器重啓或者大量緩存集中在某一個時間段失效,這樣在失效的時候,會給後端系統帶來很大壓力。導致系統崩潰。

如何避免?

  • 在緩存失效後,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。

  • 做二級緩存,A1爲原始緩存,A2爲拷貝緩存,A1失效時,可以訪問A2,A1緩存失效時間設置爲短期,A2設置爲長期。

  • 不同的key,設置不同的過期時間,讓緩存失效的時間點儘量均勻。

4 總結

請記下以下幾點:

  • 公司招你去是幹活了,不會因爲你怎麼怎麼的而降低對你的要求標準。

  • 工具上面寫代碼和手撕代碼完全不一樣。

  • 珍惜每一次面試機會並學會覆盤

  • 對於應屆生主要考察的還是計算機基礎知識的掌握,項目要求沒有那麼高,是自己做的就使勁摳細節,做測試,只有這樣,才知道會遇到什麼問題,遇到什麼難點,如何解決的。從而可以侃侃而談了。

  • 非科班也不要怕,怕了你就輸了!一定要多嘗試。

暖男告知

跟小藍每天進步一點點,生活就會美一點!

進入高手如雲學習交流羣,一起成長!

關注就有內部資源!

往期精彩回顧

[c/c++後臺開發面經系列]1 深信服面經

[c/c++後臺開發面經系列]2 京東面經(含答案)

寫簡歷這幾點一定要注意!

Linux後臺開發必看!

今天給二叉樹加個BGM,二叉樹唱歌了!

在看”的永遠18歲~

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