2019秋招面試題-開發

1、進程和線程的區別,問爛了

1.定義java

進程:具備必定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.linux

線程:進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),可是它可與同屬一個進程的其餘的線程共享進程所擁有的所有資源.數據庫

 

2.關係設計模式

一個線程能夠建立和撤銷另外一個線程;同一個進程中的多個線程之間能夠併發執行.數組

相對進程而言,線程是一個更加接近於執行體的概念,它能夠與同進程中的其餘線程共享數據,但擁有本身的棧空間,擁有獨立的執行序列安全

 

3.區別網絡

  進程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。多線程

1) 簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.併發

2) 線程的劃分尺度小於進程,使得多線程程序的併發性高。機器學習

3) 另外,進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率。

4) 線程在執行過程當中與進程仍是有區別的。每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。可是線程不可以獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

5) 進程是系統進行資源分配和調度的一個獨立單位,線程能夠擁有本身的堆棧,但不能擁有系統資源。從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分能夠同時執行。但操做系統並無將多個線程看作多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

 

4.優缺點

線程執行開銷小,但不利於資源的管理和保護;而進程正相反。

線程適合於在SMP機器上運行,而進程則能夠跨機器遷移。

 

5.總結:回答進程和線程的區別這個問題

a.進程有本身的獨立地址空間,每啓動一個進程,系統就會爲它分配地址空間。

b.線程不可以獨立執行,必須依存在進程中,使用相同的地址空間。

 

2、多線程之間的同步問題

3、進程間通訊的方式(這個必定多關注,被問了三四次了)

進程間通訊主要包括管道, 系統IPC(包括消息隊列,信號,共享存儲), 套接字(SOCKET).

1.管道:  

 匿名管道( pipe ):匿名管道是一種半雙工的通訊方式,一般是在父子進程間使用。
 命名管道 (named pipe) :命名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。

2.系統IPC:

  消息隊列( message queue ) :消息隊列是內核地址空間中的內部鏈表,經過linux內核在各個進程之間傳遞內容。消息順序地發送到消息隊列中,而且以幾種不一樣的方式從隊列中獲取,每一個消息隊列能夠用IPC標識符惟一的進行標識,內核中的消息隊列是經過IPC的標識符來區別的,不一樣的消息隊列之間是相互獨立的,每一個消息隊列中的消息又構成一個獨立的鏈表。

  信號 ( sinal ) :信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生。

  共享內存( shared memory ) :共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問。共享內存是最快的 IPC 方式,它是針對其餘進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號量,配合使用,來實現進程間的同步和通訊。

3.套接字( socket ) :

  套接字也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣進程間的進程通訊。

4、Linux經常使用指令

ipcs -q : 顯示全部的消息隊列
grep:文本搜索
cat:顯示文件內容
tail -f filename:監視filename文件的尾部內容(默認10行,至關於增長參數 -n 10),刷新顯示在屏幕上。退出,按下CTRL+C。
top:監控Linux的系統情況,好比cpu、內存的使用(實時更新)
ps:命令可以給出當前系統中進程的快照
lsof:顯示系統打開的文件
kill:刪除執行中的程序或工做
 

5、topK問題

 已求訪問量top100的網址ip爲例:

(一)單機內存足夠

能夠建一個哈希表,key是ip出現的次數,value是ip。

而後依次遍歷key,建一個最小堆,依次比較key與最小堆葉子結點的大小,若是key更大,那麼用key替換最小堆的根節點,更新最小堆的結構。

(二)單機內存不夠

採用MapReduce的思想,將ip散列到1000個小文件中,用hash表分別統計top100。最後進行歸併這些小文件,找出總共的top100。

6、數組和散列表的區別

數組和鏈表都被直接映射到內存。但散列表更復雜,它使用散列函數來肯定元素的存儲位置(將輸入映射到數字,輸入與數字是惟一對應的關係)。

7、數據庫底層原理

  B+樹(減小硬盤的I/O次數)

  • 只有最底層的節點(葉子節點)才保存信息(相關表的行位置)
  • 其它節點只是在搜索中用來指引到正確節點的。

  哈希表

  當你想快速查找值時,哈希表是很是有用的。

 8、網絡四層結構

TCP/IP 網絡協議共分爲四層(TCP/IP 參考模型):應用層、傳輸層、網絡層和數據鏈路層。其中MAC 協議屬於鏈路層,IP協議屬於網絡層,TCP 協議屬於傳輸層,HTTP 協議屬於應用

SYN請求同步,ACK確認同步,FIN結束

9、找到距離最近的數

結合機器學習中的k近鄰方法來作

基本的思路很簡單:首先經過二叉樹搜索(比較待查詢節點和分裂節點的分裂維的值,小於等於就進入左子樹分支,等於就進入右子樹分支直到葉子結點),順着「搜索路徑」很快能找到最近鄰的近似點,也就是與待查詢點處於同一個子空間的葉子結點;

而後再回溯搜索路徑,並判斷搜索路徑上的結點的其餘子結點空間中是否可能有距離查詢點更近的數據點,若是有可能,則須要跳到其餘子結點空間中去搜索(將其餘子結點加入到搜索路徑)。重複這個過程直到搜索路徑爲空。

10、工廠設計模式

  核心工廠類再也不負責產品的建立工做,讓它成爲一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可使系統在不修改具體工廠角色的狀況下引進新的產品,徹底遵照了開閉原則,提升了可擴展性。在這個模式中,工廠類和產品類每每一一對應,即一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品,這個具體的工廠就負責生產對應的產品。

 

  優勢

  (1)利用工廠的工廠方法類去建立具體的產品對象,隱藏了具體產品對象的建立細節,只須要關心具體產品對應的具體工廠;

  (2)遵照開閉原則。加入新的產品類時,只須要同時加入工廠類就能夠實現擴展,無需修改原來的代碼。

  缺點

  隨着產品種類的數量的增加,工廠類也會隨之增長,將不利於系統的維護,增長系統編譯和運行的開銷。

  適用場景

  (1)對於某個產品,調用者清楚地知道應該使用哪一個具體的工廠來服務,實例化該具體工廠,生產出具體的產品來;

  (2)只是須要一種產品,而不想知道也不須要知道工廠是如何生產出來的,自須要知道具體對應的工廠就行。

 8、

1.運行速度快慢爲:StringBuilder > StringBuffer > String

2.在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的

 若是一個StringBuffer對象在字符串緩衝區被多個線程使用時,StringBuffer中不少方法能夠帶有synchronized關鍵字,因此能夠保證線程是安全的,但StringBuilder的方法則沒有該關鍵字,因此不能保證線程安全,有可能會出現一些錯誤的操做。因此若是要進行的操做是多線程的,那麼就要使用StringBuffer,可是在單線程的狀況下,仍是建議使用速度比較快的StringBuilder。

相關文章
相關標籤/搜索