[面試]百度搜索架構部面試記錄


自我介紹

  1. 部門是做什么的,百度搜索架構部,是百度搜索的主要部門,日常負責維護百度搜索以及搜索優化。

C++問題

  1. 聲明和定義的區別?
    聲明是將一個名稱引入程序。定義提供了一個實體在程序中的唯一描述,涉及到內存空間的分配以及初始值的設定。聲明和定義有時是同時存在的。
    常見的賦值語句為定義即聲明。

幾種只聲明不定義的情況:
void display(); 提供函數聲明
extern int a;
class A;
typedef 聲明;
在類中定義的靜態數據成員的聲明

  1. 內存分配的幾種方式?
    棧區(Stack): 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其
    操作方式類似於數據結構中的棧。

堆區(Heap): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回
收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。

全局區(靜態區靜態static):全局變量和靜態變量的存儲是放在一塊的,初始化的
全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 程序結束后由系統釋放。

文字常量區 (Stack):常量字符串就是放在這里的。 程序結束后由系統釋放。

程序代碼區(Stack):存放函數體的二進制代碼。

棧區和堆區的區別

堆和棧中的存儲內容:棧存局部變量、函數參數等。
堆存儲使用new、malloc申請的變量等。
申請方式:棧內存由系統分配,堆內存由自己申請。
申請后系統的響應:
棧:只要棧的剩余空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。
堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然后將該結點從空閑結點鏈表中刪除,並將該結點的空間分配給程序。
申請大小的限制:Windows下棧的大小一般是2M,堆的容量較大。
申請效率的比較:棧由系統自動分配,速度較快。堆使用new、malloc等分配,較慢。
總結:棧區優勢在處理效率,堆區優勢在於靈活。

  1. memcpy和memset的區別?為什么memset不能初始化一些其他類。
    對於memcpy:
    功能:由src所指內存區域復制count個字符串到dest所指內存區域.
    說明:src和dest所指內存區域不能重疊,函數返回指向dest的指針.

對於memset:
功能:把buffer所指內存區域的前count個字節設置成字符c
說明:返回指向buffer的指針.

memset 用來對一段內存空間全部設置為某個字符,一般用於在對定義的字符串初始化為' '
memcpy 是用來做內存拷貝,可以用來拷貝任何數據類型的對象,可以指定拷貝的數據長度.

memset是一個字節一個字節設置的,取要賦的值的后8位二進制進行賦值。所以當memset賦值為1時會出現錯誤。

  1. c++使用c代碼使用什么關鍵字?
    使用 extern "C" {}.

  2. const關鍵字以及其使用場景?

  • const變量: 不能修改值,定義時初始化 const int pi = 3.1415;
  • const類對象: 不能修改成員變量的值,不能調用非const函數。const myClass a;
  • 指向const變量的指針:指向內容不可變,指向可變. const int* a;
  • const 指針:指向內容可變,指向不可變。 int* const a;
  • 指向 const 變量的 const 指針。指向不可變,指向內容也不可變。const int* const a;
  • const 變量作為函數參數。函數內部不能修改該參數值。void myFun(const int a);
  • const 返回值. 用以返回const引用,上層不能用返回的引用來修改對象。 const string& myFun()
  • const 成員變量. 必須在初始化列表進行初始化,之后不能改變。
  • const 成員函數。 此函數不應該修改任何成員變量,傳給const成員函數的this指針,是指向const對象的const指針。

內存問題

  1. 內存分配的幾種方式?
    從全局存儲區域分配:這時內存在程序編譯階段就已經分配好,該內存在程序運行的整個周期都有效,如:全局變量、static靜態變量。
    從棧區分配:在執行函數的時候,函數中的局部變量的存儲單元都可以從棧中分配,函數執行結束后這些存儲單元都會被自動釋放,實現從棧中分配存儲單元運算操作內置於處理器的指令集中,效率很高 但是分配的內存容量有限。
    從堆中分配:也稱為動態內存分配,在程序運行期間,可以使用malloc和new申請任意數量的內存單元,由程序員決定在什么時候使用free和delete釋放內存。

操作系統問題

  1. 進程和線程之間的區別?
    進程是具有一定獨立功能的程序、它是系統進行資源分配和調度的一個獨立單位,重點在系統調度和單獨的單位,也就是說進程是可以獨立運行的一段程序。
    線程又是什么?線程進程的一個實體,是CPU調度和分派的基本單位,他是比進程更小的能獨立運行的基本單位,線程自己基本上不擁有系統資源。
    聯系:

    1. 一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程(通常說的主線程)。
    2. 資源分配給進程,同一進程的所有線程共享該進程的所有資源。
    3. 線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。
    4. 處理機分給線程,即真正在處理機上運行的是線程。
    5. 線程是指進程內的一個執行單元,也是進程內的可調度實體。
  2. 進程間通信的方式?

    1. 管道/匿名管道(pipe):
    2. 有名管道(FIFO)
    3. 信號(Signal)
    4. 消息(Message)隊列
    5. 共享內存(share memory)
    6. 信號量(semaphore)
    7. 套接字(socket)
  3. 線程對內存進行讀寫時會出現哪些問題?怎么解決這些問題?

    1. 臨界區(Critical Section)
    2. 互斥量(Mutex)
    3. 信號量(Semaphores)
    4. 事件(Event)
    5. 隊列
  4. cpu調度機制?

    1. 先到先服務調度算法(FCFS)
    2. 最短作業優先調度(SJF)
    3. 優先級調度
    4. 輪轉法調度(RR)
    5. 多級隊列調度
    6. 多級反饋隊列調度

編程題

  1. 快排
  2. 合並兩個有序鏈表


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM