商務搜索部門,方向是分佈式計算,對數據結構和操作系統摳得比較細,數據結構還好,操作系統當年沒選這門課,還得回過頭好好補
1. 電話面試
某搜索公司商務搜索部,電話面試一個小時,在線寫代碼,你在這邊寫,人家遠程看着
linux指令
沒回答上,就搜了下,我跟他說我搜了下,找到了,然後面試官就有點毛了,說這種行爲要影響面試表現什麼的,問你什麼問題不會就換下一個問題云云。。。搜完了不跟他說就是了。但是,linux命令這種東西用的時候搜一下不就完了,除了常用的誰會記這麼多呢?
一個文本文件每行五列,打印第三列數據
awk
一個文本文件有多少行
wc
項目介紹
講一下自己的項目,自己做視頻編解碼,圖像處理相關的,比較偏的專業,電話裏面也講不太清楚
在線寫代碼
1. 單鏈表倒數第k個元素
常見的問題,一個快指針一個滿指針,快指針先走k步,然後快慢指針一起走,當快指針走到結尾的時候,慢指針指到倒數第k個。
面試官比較摳代碼風格,說我代碼邊界檢查什麼的要做好之類的。
2. 一個數組裏面第k大的數
面試寶典裏面有的,申請k個元素的空間作爲最大堆,前k個元素複製進去,建一個最大堆,用來保存最小的k個元素,堆頂元素是這k個元素裏面最大的,當做哨兵,後面每來一個元素跟這個哨兵元素比較,如果小於這個堆頂元素則交換數據,對堆進行再排序;否則跳過,最後返回堆頂元素。複雜度是O(n*log(k))
你這邊還有什麼問題?
這邊做什麼
搜索相關,推薦等等
對應聘者的要求
進來看具體能力,再分配工作
面試流程
電話面試,一面,二面,三面,電面結果會在一週內反饋。
2. 現場一面,工程師面
項目經歷
專業相關,SIMD偏門技術,講了人家也聽不懂
多線程,問題很多
多線程,上下文切換,現成個數和任務關係
gdb多線程調試
多線程調試基本命令:
命令 | 介紹 |
---|---|
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的行爲)以外,只有當前線程會執行。 |
進階還有strace調試
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
- 對目標文件和庫文件進行處理
- 聯接和裝入所有的可重定位目標文件和庫文件,生成可執行程序文件
- 組合目標文件和搜索目標庫以解決沒有定義的引用
運行一個可執行二進制程序的過程
操作系統,很重要
推薦coursera上北大的os課程:http://c.open.163.com/coursera/courseIntro.htm?cid=2802
虛擬地址
物理內存大小爲2G,能否申請到4G大小的空間
邏輯地址,物理地址
中斷機制
中斷髮生後os底層工作步驟
- 硬件壓棧:程序計數器等
- 硬件從中斷向量裝入新的程序計數器
- 彙編語言過程保存寄存器值
- 彙編語言過程設置新的堆棧
- c語言中斷服務程序運行(例:讀並緩衝輸入)
- 進程調度程序決定下一個將運行的進程
- c語言過程返回至彙編代碼
- 彙編語言過程開始運行新的當前進程
cpu現場信息
進程上下文切換,從一個進程換到另一個進程的過程
- 進程運行時,寄存器值(通用寄存器,程序計數器pc,程序狀態字psw,棧指針,其他控制寄存器);進程不運行時,這些寄存器的值保存在進程控制塊pcb中
- 指向該進程頁表的指針
進程切換
含義:
- 切換全局頁目錄,加載新的地址空間
- 切換內核棧和硬件上下文,其中硬件上下文包括內核執行新進程的全部信息,如cpu相關寄存器
具體步驟,進程a上cpu,進程b下cpu
- 保存進程a的上下文環境
- 用新狀態和其他相關信息更新進程a的pcb
- 將進程a移至合適的隊列(就緒,阻塞…)
- 將進程b的狀態設置爲運行態
- 從進程b的pcb恢復上下文(程序計數器,程序狀態字,其他寄存器…)
上下文切換開銷cost
- 直接開銷:內核完成切換所用的cpu時間
- 保存和恢復寄存器…
- 切換地址空間
- 間接開銷
- 高速緩存,緩衝區緩存,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
個人職業規劃
我的問題
相關業務
分佈式計算
崗位需求
最好有相關經歷,當然對應屆生另外考慮
入職承擔角色
軟件開發工程師,擔心招進來做一些邊邊角角的活,對個人成長不好