百度個人網盤一面
時間:07.29下午五點
方式:電話面
部門:百度個人網盤
崗位:后端方向
面試官性別:女(因為第一次遇到女面試官,所以着重強調下!)
時長:40分鍾左右
1. 自我介紹(自己balabala大概14分鍾)
2. 選擇一個難點或者創新點的地方(到這里大概20分鍾了),會根據你的回答,問你某個方面怎么實現的,為什么這么做,我相信都是自己做的項目,基本上都能答出來滴!
3. 既然你的主要語言是C++,問你幾個C++的問題。C++中類的封裝講一下?
答:封裝可以隱藏實現細節,使得代碼模塊化;封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。在面向對象編程上可理解為:把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。
4. C++中const介紹一下?
答:const 是 constant 的縮寫,本意是不變的,不易改變的意思。在 C++ 中是用來修飾內置類型變量,自定義對象,成員函數,返回值,函數參數。
C++ const 允許指定一個語義約束,編譯器會強制實施這個約束,允許程序員告訴編譯器某值是保持不變的。如果在編程中確實有某個值保持不變,就應該明確使用const,這樣可以獲得編譯器的幫助。
5. 進程和線程有什么區別?
答:
1) 根本區別:進程是操作系統資源分配的基本單位,而線程是CPU調度和執行的基本單位。
2) 開銷:每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行棧和程序計數器(PC),線程之間切換的開銷小。
3) 環境:在操作系統中能同時運行多個進程(程序);而在同一個進程(程序)中有多個線程同時執行(通過CPU調度,在每個時間片中只有一個線程執行)
4) 內存分配:系統在運行的時候會為每個進程分配不同的內存空間;而對線程而言,除了CPU外,系統不會為線程分配內存(線程所使用的資源來自其所屬進程的資源),線程組之間只能共享資源。
5) 包含關系:只有一個線程的進程可以看做是單進程的,如果一個進程內有多個線程,則執行過程不是一條線的,而是多條線(線程)共同完成的;線程是進程的一部分,所以線程也被稱為輕權進程或者輕量級進程。
6.線程中的同步方式有哪幾種,介紹下?
答:
1) 互斥鎖(Mutex)
互斥量是最簡單的同步機制,即互斥鎖。多個進程(線程)均可以訪問到一個互斥量,通過對互斥量加鎖,從而來保護一個臨界區,防止其它進程(線程)同時進入臨界區,保護臨界資源互斥訪問。
2) 條件變量(condition variable)
條件變量適合多個進程(線程)等待同一事件發生,然后去干某事。舉一個簡單的例子:生產者和消費者模型:
多個消費者去等待生產者生產物品,消費者去消耗物品。當生產者生產出來一件物品時,便可以通知所有的消費者(當然也可以只通知其中一個等待的消費者)---可以去消耗物品了。這時多個消費者便去爭搶物品,誰快誰拿到物品消耗。當物品被消耗完時,消費者就等待生產者。就類似於這樣的場景。
條件變量必須配合互斥量一起工作。為什么?因為生產者生產出來的物品是臨界資源,即所有進程和線程都可以使用的公共資源,則在一個時刻僅允許一個消費者去取。這時便使用互斥量去保護臨界資源
3) 讀寫鎖(reader-writer lock)
讀寫鎖適合於使用在讀操作多,寫操作少的情況,比如數據庫。讀寫鎖讀鎖可以同時加很多,但是寫鎖是互斥的。當有進程或者線程要寫時,必須等待所有的讀進程或者線程都釋放自己的讀鎖方可以寫。數據庫很多時候可能只是做一些查詢。
4) 信號量(semaphore)
在生產者消費者模型中,對任務數量的記錄就可以使用信號量來做。可以理解為帶計數的條件變量。當信號量的值小於0時,工作進程或者線程就會阻塞,等待物品到來。當生產者生產一個物品,會將信號量值加1操作。 這是會喚醒在信號量上阻塞的進程或者線程,它們去爭搶物品。
7. 場景題:比如有很多銀行:中國,建設,交通等銀行,現在在一個網站中,輸入“建設”關鍵字,自動提示關於建設的所有信息。(這個題目我記得不太清楚了,所以描述的不准確,大家可以忽略它。。)(這個題沒明白啥意思,直接說不了解)
8. 場景題:在海量數據中快速查找一個數(或者字符串)是否出現,(數據無序,查找時間在秒級內)
答:推薦:https://blog.csdn.net/yxccc_914/article/details/53737446
9. 面試官:今天就到這里吧!(到這里40分鍾)