後臺開發面試經驗

readyao發表於2016-01-14

崗位:後臺開發,C/C++、JAVA

網路

  • HTTP1.1和HTTP1.0的區別,參考:http://blog.csdn.net/hguisu/article/details/8608888

    持久連線–connection,一個tcp連線上可以傳送多個請求; 
    host域–使用虛擬主機技術,這樣可以區分一臺主機上的多個應用; 
    增加了一些請求方法

  • HTTP的頭部欄位解析:http://www.cnblogs.com/xcsn/p/4308228.html

  • HTTP的狀態碼含義:1.資訊,2.成功,3.重定向,4.客戶端錯誤,5.伺服器端錯誤,參考:http://www.w3school.com.cn/tags/html_ref_httpmessages.asp
  • TCP、UDP和IP報文的格式:http://blog.csdn.net/kernel_jim_wu/article/details/7447377
  • TCP的慢啟動、快重傳:tcp有一個接收視窗用於流量控制,視窗為1是停等協議,效率低下,如果視窗太大,那麼可能會出現網路擁塞。所以擁塞控制依賴於擁塞視窗(cwnd)來進行控制。慢啟動有點類似於車輛啟動的時候,具體待闡述,參考:http://blog.csdn.net/loverooney/article/details/38323907
  • 多播協議、多播協議的應用場景:一點對多點,節省網路頻寬;IP多播廣泛應用在網路音訊、視訊中。依賴IP多播地址,是D類地址。
  • TCP連線三次握手、斷開四次揮手的過程:三次握手:客戶端發起請求(序列號)-伺服器回應ack並給出自己的序列號-客戶端回應ack。 斷開四次揮手:一端發起斷開(FIN),另外一端回應ack;這樣一端的寫就關閉了;另外一端發起斷開請求(FIN),本端回應ack。這樣雙方都關閉了連線。因為一端關閉了寫,但是另外一端可能還有資料要傳送,所以兩端可能不同時關掉連線,就出現了4次揮手的過程。
  • time_wait狀態:tcp 4次揮手的過程中,主動關閉連線的一方,在收到對方的FIN包後會進入time_wait狀態(2*MSL的時間),如果在這個時間段內,沒有再次收到對面的FIN包,就表示ack已經成功到達。假想,如果沒有這個狀態,而是直接就是close狀態的話,對面沒有收到ack,重發FIN包,這邊會傳送RST包,導致server端收到rst包報錯,影響程式程式; 並且假設沒有time_wait狀態,新的連線請求過來,老的關閉報文就會對新的連線產生干擾。 參考帖子:http://www.firefoxbug.com/index.php/archives/2795/
  • ping的實現:Ping類似於一個回聲系統,傳送一個請求、對端如果收到回應一個報文就可以判斷了。這裡採用ICMP(網際控制報文協議)來實現。傳送一個ICMP的回送請求報文,對端如果收到,回應一個ICMP的回送請求和回送應答報文。利用的是IP的點對點的協議,並沒有端到端,不需要埠這些,使用的是原始套接字(RAW).具體實現可以參考:http://blog.csdn.net/zzucsliang/article/details/41407387
  • traceroute的實現:traceroute是一個尋找到目的地路徑的命令。同樣是基於ICMP的回送請求報文配合TTL來實現。開始傳送一個TTL=1的ICMP回送請求報文,到達一個路由器時,TTL-1=0,此時回應一個ICMP的超時報文,源端收到之後再傳送一個TTL=2的報文,以此內推,直到到達目的地,目的端回應一個ICMP的回送應答報文。參考:http://blog.csdn.net/microtong/article/details/3220450
  • close和shutdown:參考:http://blog.liyiwei.cn/socket-%E7%BC%96%E7%A8%8B%E4%B8%ADclose%E5%92%8Cshutdown%E7%9A%84%E5%8C%BA%E5%88%AB/shutdown是優雅的關閉,會讓所有資料傳送完.
  • shell:1.找出當前目錄下檔案最大的前十個:du -s * | sort -nr | head;查詢指定字尾檔案並且這些檔案中包含特定的字串的檔案:find . -name “*.c” | xargs grep -H “hello”;找出檔案中指定字串的前後5行:grep -i “main” -C 3 sprintf.c

程式設計/演算法

作業系統

  • 闡述一下系統呼叫–參考帖子:http://blog.csdn.net/chosen0ne/article/details/7721550 
     要點:通過中斷從使用者態切換到核心態。中斷有兩個重要屬性–中斷號和中斷處理程式,中斷號表示不同的中斷。中斷號是一種很稀缺的資源。核心維護一張系統呼叫表,可以通過系統呼叫號,明確哪個系統呼叫,這樣就完成了系統呼叫的函式名稱轉換。引數傳遞是通過暫存器完成的。使用者態和核心態執行的程式使用的棧不同,棧切換是通過暫存器(棧指標,%esp)來回賦值,並且暫存器傳參需要額外的保護和恢復過程。從上面可以看出系統呼叫很費時間:1. 系統呼叫通過中斷實現,需要完成棧切換;2. 暫存器傳參,需要額外的儲存和恢復的過程。
  • 程式和執行緒的區別:程式是分配資源的基本單位(CPU、記憶體等),有獨立的地址空間。執行緒是程式中的一個實體,共享程式的地址空間,是輕量級的程式,是CPU排程和分配的基本單位,但是各個執行緒擁有自己的棧空間。 使用多執行緒程式設計的好處:(1)單執行緒遇到阻塞,會卡死,影響互動;(2)發揮多核CPU的計算能力;(3)簡化程式結構,使程式便於維護;(4)與程式相比,執行緒的建立和切換開銷更小。 參考:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.htmlhttp://www.nowcoder.com/discuss/1836?type=&order=0&pos=56&page=0
  • linux下面的程式間通訊方式:(1)管道:具有親緣關係的程式通訊,命名管道允許無親緣關係的程式通訊,shell命令中的”|”就是一種管道通訊,一個命令的輸出作為另外一個程式的輸入;(2)訊號:程式執行過程中可以隨時被各種訊號打斷,從而去處理訊號,Linux下面的kill命令就是通過訊號的方式和其它程式通訊,比如kill -l可以檢視訊號的分類,kill -9強制殺死對應程式;(3)訊息佇列:有足夠許可權的程式可以向佇列中新增訊息,被賦予讀許可權的程式則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點;(4)共享記憶體:非常快的程式通訊方式,和訊號量結合起來,達到程式間的同步與互斥;(5)socket:套接字可以讓不同主機之間的程式進行通訊,肯定還會講到,很重要。可以參考:http://www.cppblog.com/jerryma/archive/2011/08/03/152348.aspx
  • 執行緒之間同步的方式:因為執行緒之間共享記憶體,所以執行緒之間需要進行同步。同步的方式有互斥鎖、條件變數、讀寫鎖。互斥鎖用於保護臨界區;條件變數用於傳送訊號和等待訊號;讀寫鎖是在互斥鎖的基礎上做的改進,又被成為共享-獨佔,非常適合於讀資料的頻率遠大於寫資料的頻率的應用。 參考:http://blog.csdn.net/hanchaoman/article/details/5628789
  • 孤兒程式:父程式先退出,子程式被init程式收養;殭屍程式:子程式退出,父程式並沒有獲取子程式的狀態資訊,子程式的狀態描述符仍然存在系統中;守護程式:Linux的後臺服務程式,比如crond等,不受終端控制,在系統啟動時啟動,在系統關閉時終止。
  • 記憶體分配策略:malloc,first fit、best fit,分配的時候自然會產生記憶體碎片,可以在若干次free之後進行碎片合併。http://blog.jqian.net/post/malloc.html
  • 一個malloc的實現:http://blog.codinglabs.org/articles/a-malloc-tutorial.html
  • 使用malloc要注意的事項:1.申請是否成功判斷(不成功為null)2.申請成功之後,對記憶體區域賦初值;3. 使用時注意訪問越界;4.使用之後,記得free釋放掉;5.free掉之後,指標仍然指向原來的區域,置為NULL,防止再次使用。
  • 交換空間的作用:swap,交換空間可以有兩種,交換分割槽(硬碟分割槽)和交換檔案(沒有多的分割槽情況下,使用檔案代替)。交換空間,又叫虛擬記憶體,是指實體記憶體不夠用的時候,將不常用的資料放到交換空間裡,當需要的時候再將交換空間的內容換回實體記憶體,參考:http://blog.csdn.net/huaishu/article/details/8762957

併發程式設計

資料庫

  • 關係型資料庫:儲存的是具有格式化資料結構的資料;
  • mysql的兩種主要儲存引擎:Myisam和InnoDB(預設)。基本只要你寫會用mysql,這個問題是必問的。myisam是不支援事務安全的,但是插入速度非常快,innoDB支援事務安全,但是插入速度相對較低。像12306這種涉及交易的網站,肯定會用到事務的。 具體可以看看視訊的講解:http://www.iqiyi.com/w_19rr0jh7o1.html
  • 事務、事務特點:事務是一個整體,不能分割,比如A向B轉賬100:A-100,B+100,這兩步要一起執行。一起成功、一起失敗。所以事務的特點是:ACID–原子性、一致性、隔離性、永續性。簡單理解一下,原子性就是指一個事務要麼執行,要麼不執行;一致性是指事務的執行並不改變資料庫中資料的一致性;隔離性是指兩個以上的事務不會出現交錯執行的狀態,比如一個事務的操作結果不會讓另外一個事務看到,直到完成;永續性是指事務執行成功以後,吃持久化儲存的,不會無緣無故的回滾。
  • 正規化:1正規化–每一列不可分割;2正規化–非主屬性完全依賴於主屬性;3正規化:每一列資料都和主鍵直接相關,不能傳遞依賴於主鍵;
  • 資料庫查詢優化的常用技巧:(1)索引:優點是讀速度快;帶來的缺點是體積變大、插入效能變差(需要建立索引);(2)快取配置(快取查詢語句,快取查詢資料);(3)分庫分表,分表又分為垂直和水平拆分; (4)子查詢優化。參考:http://blog.csdn.net/zwan0518/article/details/11972853
  • 資料庫中高併發出現的悲觀鎖和樂觀鎖,悲觀鎖假設衝突率相當高,直接佔有;而樂觀鎖假設衝突不是很高,讀的時候有一個版本號,如果寫的時候版本號與讀取的版本號不一致,表示已經被人修改過,樂觀鎖可以用版本號和時間戳來實現。參考:http://www.cnblogs.com/Bob-FD/p/3352216.html
  • where 1=1和where 1=0語句的作用:where 1=1是在表單提交中如果有多個查詢條件在拼湊sql語句時如果沒有填查詢條件時可能會出異常,這個語句規範了sql語句。 where 1=0,這個語句恆為false,表示不返回結果集,節省了記憶體,可以用於快速建表,比如:create table newtable as select * from oldtable where 1=0; 參考:http://www.cnblogs.com/junyuz/archive/2011/03/10/1979646.html
  • 資料庫連線池:客戶端呼叫資料庫提供的服務,需要建立到資料庫的tcp連結,然而建立連結是很耗時的,所以,我們可以使用一個池子(容器)來儲存這些連線,客戶端需要連線的時候,從連線池裡取出可用連線即可,用完的時候,把連線放回池子就可以了。參考:http://it.deepinmind.com/db/2014/05/04/the-anatomy-of-connection-pooling.html
  • 儲存過程:我們常用的運算元據庫語言SQL語句在執行的時候需要要先編譯,然後執行,而儲存過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數(如果該儲存過程帶有引數)來呼叫執行它。優點是:靈活、可程式設計、執行速度快(預編譯)、減少網路流量等。參考:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html
  • 左連線、右連線、等值連線:left join,會把左表中的資料全部顯示出來,如果右表中有相等的也顯示出來,沒有的話,顯示為NULL。右連線同樣道理。等值連線是隻取相等的。參考:http://blog.csdn.net/wyzxg/article/details/7276979

java/jvm

閒聊

  • 你還有什麼想問我的麼? 如果是技術面的話,一般我會把這個當做結束語,很可能會跪,但也不絕對。面試前要對公司有一定的瞭解,面試所在部門的業務是什麼? 部門的規模多大? 團隊的氛圍,對新人的培養模式? 待補充。。
  • 你有什麼缺點:對於這個問題,有什麼缺點可以說,但是要把缺點圓起來,比如說你怎麼克服的? 想了一下,自己的缺點是“有時候不懂得合理的分配工作任務,覺得自己幹起來效率高一些”,舉一個例子,還是把工作模組化劃分好,這樣效率高一些。
  • 你的最大特點是什麼? 身邊同學朋友都怎麼評價你的。。。根據自己情況來吧,平時也多總結一下自己,多反省一下。

相關文章