後臺開發面試經驗
崗位:後臺開發,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
程式設計/演算法
-
gdb除錯相關
檢視變數的二進位制值:p /t 變數;
bt:列出函式呼叫棧;
info frame:檢視當前棧的資訊;
frame 幀號:切換幀;
gdb除錯core檔案:ulimit -c unlimited,gdb exec coreFile,執行至crash,會列印crash的資訊,bt檢視棧資訊,一般都是段錯誤:訪問了錯誤的記憶體段或者沒許可權,或者根本不存在對應的記憶體段; -
字串中子字串的替換:http://blog.csdn.net/songjinghao/article/details/11659051
- ascii和Unicode、UTF-8的區別:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
- 動態連結和靜態連結:靜態庫:程式碼的裝載速度快,執行速度也比較快,因為編譯時它只會把你需要的那部分連結進去,應用程式相對比較大。但是如果多個應用程式使用的話,會被裝載多次,浪費記憶體。動態連結可以動態的安裝和解除安裝,更加靈活。
- 如何寫一個ORM框架:orm框架的作用是代替你去寫sql語句,比如直接將一個物件插入到表中。 框架要有基本的介面(增刪改查等介面),輸入引數是需要處理的物件等,在介面中,通過反射,獲取到我們需要的內容,比如類型別、欄位、欄位值等,然後拼湊sql語句,去執行sql語句,然後返回結果,釋放資源即可。可以參考我的一個開原始碼:https://github.com/zy416548283/JDBCSimpleORM/
- 二叉查詢樹:定義,查詢演算法,最大、最小值,新增演算法,刪除演算法,其中會有前驅和後繼的相關查詢,參考:http://blog.csdn.net/dc_726/article/details/7391869
- extern C的作用:實現C/C++的混合程式設計,在C++中,指示編譯器用C語言進行編譯。參考:http://blog.csdn.net/jiqiren007/article/details/5933599
- 判斷結構體是否相等,可以考慮memcmp函式,逐位元組比較。參考:http://www.cnblogs.com/cxz2009/archive/2010/11/11/1875125.html
- 伺服器端經常用到的shell命令:free -m(檢視記憶體使用情況),fdisk -l(檢視硬碟分割槽資訊),iostat(檢視硬碟的IO效能),uptime(檢視伺服器的平均負載),vmstat(檢視伺服器的整體效能),netstat(統計與網路相關的引數)等 參考:http://blog.jobbole.com/15430/http://www.cnblogs.com/linzhenjie/archive/2013/01/14/2859085.html
- 堆排序:http://blog.csdn.net/morewindows/article/details/6709644/
- 格雷碼的遞迴編寫:注意格雷碼除了最高位是相反的以外,後面的都是對稱的,可以通過遞迴很方便的寫出n位格雷碼,參考:http://fanli7.net/a/ITxinwen/google/2011/1206/150387.html
- c++的虛擬函式實現多型的原理:有一個指向虛表的指標,如果子類覆蓋了父類的虛擬函式,虛表裡的指標也會覆蓋,這樣呼叫的時候就可以呼叫子類的函式了。參見:http://blog.csdn.net/haoel/article/details/1948051
作業系統
- 闡述一下系統呼叫–參考帖子: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
併發程式設計
- select和epoll的區別:select缺點就是epoll的優點。(1) 最大併發數限制;(2)效率不高,線性掃描全部的fd集合;(3)核心和使用者空間資料拷貝,採用了記憶體拷貝。而epoll:(1)沒有最大連線數的限制;(2)只管活躍的連線;(3)共享記憶體http://blog.csdn.net/tianmohust/article/details/6677985 然而select也有相對於epoll的優點:在大部分連線都是活躍的情況下,epoll的維護佇列的開銷要大一些。
- 執行緒池:參考nginx引入執行緒池提升效能的例子:http://www.infoq.com/cn/articles/thread-pools-boost-performance-9x
- 阻塞、非阻塞,同步、非同步的區別:http://blog.csdn.net/klarclm/article/details/8828486
- nginx的負載均衡策略:輪詢、最少連線優先、ip地址雜湊(同一客戶端的web請求會到同一個伺服器上,可以解決session的問題–一般解決是通過資料庫持久化session,然後用分散式的資料庫)、基於權重的負載均衡。參考:http://blog.chinaunix.net/uid-301743-id-4801730.html
資料庫
- 關係型資料庫:儲存的是具有格式化資料結構的資料;
- 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
- 回撥函式:參考http://blog.csdn.net/xiaanming/article/details/8703708 寫的很詳細,分為同步回撥、非同步回撥。
- jvm記憶體回收3大步:回收哪些東西,什麼時候回收,怎麼回收。
閒聊
- 你還有什麼想問我的麼? 如果是技術面的話,一般我會把這個當做結束語,很可能會跪,但也不絕對。面試前要對公司有一定的瞭解,面試所在部門的業務是什麼? 部門的規模多大? 團隊的氛圍,對新人的培養模式? 待補充。。
- 你有什麼缺點:對於這個問題,有什麼缺點可以說,但是要把缺點圓起來,比如說你怎麼克服的? 想了一下,自己的缺點是“有時候不懂得合理的分配工作任務,覺得自己幹起來效率高一些”,舉一個例子,還是把工作模組化劃分好,這樣效率高一些。
- 你的最大特點是什麼? 身邊同學朋友都怎麼評價你的。。。根據自己情況來吧,平時也多總結一下自己,多反省一下。
相關文章
- Java面經 面試經驗 網際網路公司面試經驗 後端面試經驗Java面試後端
- 一年經驗Java開發0713面試Java面試
- python 後端開發面經Python後端
- linux面試經驗Linux面試
- 2年Java開發工作經驗,跳槽之後面試20餘家公司的總結Java面試
- 偽經驗;不稱職面試官的面試經面試
- android開發面試經典收藏Android面試
- 面試官十年面試經驗總結面試
- 騰訊後臺研發面經 | 掘金技術徵文
- python後端開發面試總結Python後端面試
- 記美國面試經驗,前端開發,提前預告,目前已經進背調了面試前端
- 膜拜大牛!3年Android開發工程師面試經驗分享,最全的BAT大廠面試題整理Android工程師BAT面試題
- 面試總結:鵝廠Linux後臺開發面試筆試C++知識點參考筆記面試Linux筆試C++筆記
- 作業系統面試經驗作業系統面試
- 分享net面試題和經驗面試題
- 國企&銀行面試經驗面試
- Android大廠面試經驗分享Android面試
- 程式設計師面試經驗程式設計師面試
- 【乾貨】BAT面試經驗分享BAT面試
- 騰訊泛工業化後臺開發面試問題彙總面試
- 拿下阿里、頭條、滴滴的offer後談談面試經驗(上)阿里面試
- 經典web開發工程師面試題Web工程師面試題
- 最近面試 Java 後端開發的感受!面試Java後端
- 最近面試Java後端開發的感受面試Java後端
- 8年經驗面試官詳解 Java 面試祕訣面試Java
- 零經驗噩夢般的面試面試
- 半年工作經驗今日頭條和美團面試題面經分享面試題
- 後臺面試型別總結面試型別
- 經過兩個月面試,一名七年的後端開發寫下的面試總結面試後端
- 2020畢業後我所經歷的面試【面試系列】 面試題四面試題
- 【200人面試經驗】,程式設計師面試,常見面試題解析程式設計師面試題
- Java後端高階開發面試技巧解析Java後端面試
- 深入Vue後臺管理開發之登入驗證Vue
- Android開發社招面試經驗:深入解析android核心元件和應用框架,3面直接拿到offerAndroid面試元件框架
- 2 年面試 900 多位工程師後,我總結了這些經驗面試工程師
- 跳槽!3年Java面試經驗總結Java面試
- 這兩天的面試經驗總結面試
- 面試要求之電商相關經驗面試
- 寫給初級前端的面試經驗前端面試