某搜索公司面試 待續

商務搜索部門,方向是分佈式計算,對數據結構和操作系統摳得比較細,數據結構還好,操作系統當年沒選這門課,還得回過頭好好補

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底層工作步驟

  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

個人職業規劃

我的問題

相關業務

分佈式計算

崗位需求

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

入職承擔角色

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

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