1. 程式人生 > >某搜尋公司面試 待續

某搜尋公司面試 待續

商務搜尋部門,方向是分散式計算,對資料結構和作業系統摳得比較細,資料結構還好,作業系統當年沒選這門課,還得回過頭好好補

1. 電話面試

某搜尋公司商務搜尋部,電話面試一個小時,線上寫程式碼,你在這邊寫,人家遠端看著

linux指令

沒回答上,就搜了下,我跟他說我搜了下,找到了,然後面試官就有點毛了,說這種行為要影響面試表現什麼的,問你什麼問題不會就換下一個問題云云。。。搜完了不跟他說就是了。但是,linux命令這種東西用的時候搜一下不就完了,除了常用的誰會記這麼多呢?

一個文字檔案每行五列,列印第三列資料

awk

一個文字檔案有多少行

wc

專案介紹

講一下自己的專案,自己做視訊編解碼,影象處理相關的,比較偏的專業,電話裡面也講不太清楚

線上寫程式碼

1. 單鏈表倒數第k個元素

常見的問題,一個快指標一個滿指標,快指標先走k步,然後快慢指標一起走,當快指標走到結尾的時候,慢指標指到倒數第k個。
面試官比較摳程式碼風格,說我程式碼邊界檢查什麼的要做好之類的。

2. 一個數組裡面第k大的數

面試寶典裡面有的,申請k個元素的空間作為最大堆,前k個元素複製進去,建一個最大堆,用來儲存最小的k個元素,堆頂元素是這k個元素裡面最大的,當做哨兵,後面每來一個元素跟這個哨兵元素比較,如果小於這個堆頂元素則交換資料,對堆進行再排序;否則跳過,最後返回堆頂元素。複雜度是O(n*log(k))

你這邊還有什麼問題?

這邊做什麼

搜尋相關,推薦等等

對應聘者的要求

進來看具體能力,再分配工作

面試流程

電話面試,一面,二面,三面,電面結果會在一週內反饋。

2. 現場一面,工程師面

專案經歷

專業相關,SIMD偏門技術,講了人家也聽不懂

多執行緒,問題很多

多執行緒,上下文切換,現成個數和任務關係

多執行緒除錯基本命令:

命令 介紹
info threads 顯示當前可除錯的所有執行緒,每個執行緒會有一個GDB為其分配的ID,後面操作執行緒的時候會用到這個ID。 前面有*的是當前除錯的執行緒。
thread ID 切換當前除錯的執行緒為指定ID的執行緒。
break thread_test.c:123 thread all 在所有執行緒中相應的行上設定斷點
thread apply ID1 ID2 command 讓一個或者多個執行緒執行GDB命令command。
thread apply all command 讓所有被除錯執行緒執行GDB命令command。
set scheduler-locking off|on|step 估計是實際使用過多執行緒除錯的人都可以發現,在使用step或者continue命令除錯當前被除錯執行緒的時候,其他執行緒也是同時執行的,怎麼只讓被除錯程式執行呢?通過這個命令就可以實現這個需求。off 不鎖定任何執行緒,也就是所有執行緒都執行,這是預設值。 on 只有當前被除錯程式會執行。 step 在單步的時候,除了next過一個函式的情況(熟悉情況的人可能知道,這其實是一個設定斷點然後continue的行為)以外,只有當前執行緒會執行。

sophamore和mutex

makefile,編譯,

C源程式進行編譯的過程

參考《作業系統教程》陸鬆年版,12.2章節

  • 預處理程式/lib/cpp
    • 對標頭檔案和c原始檔進行處理
    • 預處理程式包括
      • 檔案包含:標頭檔案展開,產生臨時檔案
      • 巨集代換:#define
      • 條件編譯:#if #else等
      • cc命令列的選項和預處理程式
  • 編譯程式/lib/ccom,/lib/c2
    • 將預處理程式的輸出翻譯成組合語言源程式
    • 包括:
      • 編譯處理階段:兩遍編譯掃描,第一遍稱為符號生成,第二遍將符號於用於生成組合語言程式碼的符號表格匹配
      • 編譯選項:-g -p -O -S
  • 彙編程式/lib/as
    • 讀入組合語言源程式,產生包括二進位制程式碼和重定位資訊的目標檔案.o檔案
  • 連線裝入程式/lib/ld
    • 對目標檔案和庫檔案進行處理
    • 聯接和裝入所有的可重定位目標檔案和庫檔案,生成可執行程式檔案
    • 組合目標檔案和搜尋目標庫以解決沒有定義的引用

執行一個可執行二進位制程式的過程

作業系統,很重要

虛擬地址

實體記憶體大小為2G,能否申請到4G大小的空間
邏輯地址,實體地址

中斷機制

中斷髮生後os底層工作步驟

  1. 硬體壓棧:程式計數器等
  2. 硬體從中斷向量裝入新的程式計數器
  3. 組合語言過程儲存暫存器值
  4. 組合語言過程設定新的堆疊
  5. c語言中斷服務程式執行(例:讀並緩衝輸入)
  6. 程序排程程式決定下一個將執行的程序
  7. c語言過程返回至彙編程式碼
  8. 組合語言過程開始執行新的當前程序

cpu現場資訊

程序上下文切換,從一個程序換到另一個程序的過程

  1. 程序執行時,暫存器值(通用暫存器,程式計數器pc,程式狀態字psw,棧指標,其他控制暫存器);程序不執行時,這些暫存器的值儲存在程序控制塊pcb中
  2. 指向該程序頁表的指標

程序切換

含義:

  1. 切換全域性頁目錄,載入新的地址空間
  2. 切換核心棧和硬體上下文,其中硬體上下文包括核心執行新程序的全部資訊,如cpu相關暫存器

具體步驟,程序a上cpu,程序b下cpu

  1. 儲存程序a的上下文環境
  2. 用新狀態和其他相關資訊更新程序a的pcb
  3. 將程序a移至合適的佇列(就緒,阻塞…)
  4. 將程序b的狀態設定為執行態
  5. 從程序b的pcb恢復上下文(程式計數器,程式狀態字,其他暫存器…)

上下文切換開銷cost

  1. 直接開銷:核心完成切換所用的cpu時間
    1. 儲存和恢復暫存器…
    2. 切換地址空間
  2. 間接開銷
    1. 快取記憶體,緩衝區快取,TLB失效

程式語言

虛擬函式

高頻常考,包含虛擬函式的類裡面有個虛擬函式表指標,這個指標指向一個虛擬函式表,不同的類有不同的虛擬函式表指標,指向不同的的虛擬函式表
多型就是這樣實現的:

//parent是父類,child是子類,parent裡面有虛擬函式func,child裡面的func多型實現
child* cp = new child;
parent* pp = cp;

parent指向child類的結構,但是parent->func是通過child類裡面的虛擬函式表指標指向的虛擬函式表確定func的具體定義,雖然是父類的指標指向子類結構,但結構裡面的記憶體資料並沒有變化,虛擬函式表指標這個函式入口沒有變,所以通過父類指標呼叫子類函式其實還是呼叫子類的函式,這樣實現了多型。

類裡面一個指向動態申請記憶體空間的地址,析構的時候安全,只有最後一個物件析構時,才釋放申請的記憶體空間,如果實現?

現場程式碼

大小為n的陣列,找出裡面出現頻次大於n/2+1的元素
我給出了兩種解答:
一是快排裡面的partition, 分割槽後如果剛好第a[n/2+1]左邊的數小,右邊的數大,那麼a[n/2+1]為所求,演算法複雜度為O(n)
二是hash map

3. 現場二面,經理面

linux命令

輸入一個文字檔案,第二列為姓名,生成檔案二,輸出兩列,第一列為姓名,第二列為該姓名出現的頻次

sort相關

後臺開發經歷

為什麼用tornado

個人職業規劃

我的問題

相關業務

分散式計算

崗位需求

最好有相關經歷,當然對應屆生另外考慮

入職承擔角色

軟體開發工程師,擔心招進來做一些邊邊角角的活,對個人成長不好