巨人網絡遊戲開發工程師1面

1、HTTP 和 TCP 協議的區別?

1、HTTP 是應用層的協議,主要解決如何包裝數據和解析數據,TCP 是傳輸層協議,解決數據如何在網絡中傳輸,以及可靠的傳輸

2、HTTP 協議是基於 TCP 協議的,當瀏覽器從服務器獲取數據的時候會發出一次 HTTP 請求,HTTP 會通過 TCP 協議建立到服務器的連接通道.

2、保證 TCP 傳輸可靠的機制?

TCP 協議傳輸的特點主要是面向字節流,面向有連接,通過確認應答、超時重傳、連接管理、流量控制、擁塞控制.

TCP 協議在傳輸的過程中,將每個字節的數據進行編號,如果數據傳輸到服務器,服務器會對客戶端進行確認應答,如果客戶端沒有收到 ACK 確認應答,這個時候 TCP 引入了超時重傳機制,進行再次發送數據.

連接管理可以分爲三次握手和四次揮手,服務器首先進入監聽狀態,然後客戶端發送一次連接請求報文,SYN 同部位置位1,同時初始化自己的序列號,進入同步已發送狀態,服務器收到請求報文後,如果同意連接,則發出確認報文,報文中 ACK 位和 SYN 位置爲 1 ,確認號值是上一個發送的序列號值 + 1,同時自己初始化一個序列號,進入已連接狀態;最後客戶端向服務器發送確認報文,ACK 依然置位 1,此時 TCP 已經進入連接狀態.

四次揮手依然是客戶端首先發送連接釋放報文,並且停止發送數據,報文中 FIN 置爲1,序列號比如爲 seq=u ,此時客戶端進入終止等待狀態 1,服務器收到連接釋放報文後,發出確認,確認號是上一次發送序列號+1,並且帶上自己的序列號,此時服務器進入關閉等待的狀態,如果服務器還有數據想要發送,依然是可以發送的,當客戶端收到確認釋放報文後,進入終止等待狀態2 . 如果服務器想要發送數據,則它將數據發送完畢後,會發送一次釋放連接報文,FIN 位置1,此時服務器進入最後確認狀態,等待客戶端最後發來確認報文,如果客戶端收到服務器發出的連接釋放報文,會向服務器發出確認,客戶端進入 TIME-WAIT 時間等待狀態,此時客戶端依然沒有關閉,當服務器收到客戶端發出的確認,立即進入關閉狀態,就結束了這次的連接.

流量控制,是針對發送端發送數據的約束,服務器每次發送的時候,會把緩衝區的大小作爲窗口字段的大小,如果發送的數據大於這個窗口則會浪費資源,因爲緩衝區容不下,所以需要進行流量控制.

3、線程和進程的區別?

進程指的是系統正在運行的一個實例,程序一旦加載到內存就是進程,從內核角度來看,進程是分配系統資源的基本單位

線程是程序執行的最小單位,或者可以說線程是進程內部獨立執行的單元執行流

線程的進程的區別主要體現在

  • 線程共享進程的地址空間, 進程擁有自己獨立的地址空間,這也就導致了創建進程的效率比線程更低,所以進程比線程更加安全,是因爲一個進程奔潰後,不會影響到別的進程,而一個線程奔潰後,整個進程就會掛掉

  • 在通信方面,線程比進程更加方便,線程可以通過訪問全局變量的方式,因爲線程之間共享數據段,但是需要實現同步與互斥,只一點可以使用互斥鎖、條件變量、信號量得以實現,而對於進程來說,有管道、消息隊列、共享內存、套接字、信號量等 IPC 通信方式來實現.

  • 在 CPU 系統上,線程使得 CPU 的分配更加高效,因爲操作系統可以保證當前線程數不大於 CPU 數目的情況下,實現並行.也就是不同的線程運行在多核 CPU 上面

進程和線程的聯繫
1、一個線程只能屬於一個進程,一個進程中有多個線程,線程是CPU 基本的調度單位

2、系統將資源分配給進程後,同一進程中所以線程共享該進程的資源,共享代碼段,數據段,但是每個線程又都有自己的堆棧,存放局部變量和臨時變量

3、在 CPU 上運行的是線程,所以線程是 CPU 調用的基本單位,而進程是資源分配的基本單位.

4、進程的通信方式?

進程之間通信可以實現數據的傳輸和資源共享,或者事件通知

管道,分爲匿名管道和命名管道,半雙工的通信方式,匿名管道只能在親緣之間的進程之間通信,命名管道運行無親緣關係的進程通信

它們的功能和限制區別不大,比如當緩衝區(管道本質就是一塊緩衝區)沒有數據時,read 讀數據的時候會陷入阻塞,當管道中寫滿數據的時候,write 寫數據會陷入阻塞,如果寫端對應的文件描述符被關閉,則 read 會返回0,如果讀端對應的文件描述符被關閉,則 write 寫數據會觸發異常.

消息隊列在內核中創建一個隊列,隊列中的每個元素是一個數據報,不同的進程之間可以通過句柄去訪問這個隊列,每個數據都是有類型的

共享內存是最快的進程間通信方式,因爲它少了兩步用戶態到內核態之間的數據拷貝,當系統加載一個進程的時候,分配給進程的內存並不是實際物理內存,而是虛擬內存空間,那麼我們可以讓兩個進程各自拿出一塊虛擬地址空間來,然後映射到相同的物理內存中,這樣,兩個進程雖然有着獨立的虛擬內存空間,但有一部分卻是映射到相同的物理內存,這就完成了內存共享機制了

5、哈希結構和鏈表結構的區別?

鏈表是一種物理存儲單元非連續的結構,通過指針的指向進行插入和刪除元素,它是由一系列的接口組成,這些節點可以在動態的時候生成

哈希表是根據關鍵字 key 去計算對於的哈希地址的方式來訪問數據,通過把哈希碼映射到哈希表中的一個位置,這樣可以加快查找的速度,這個映射是哈希函數,或者哈希散列函數,存放記錄的元素是哈希散列表

他們之間的區別?
對於插入元素,鏈表不需要擴容,直接改變指針的指向即可,哈希表需要通過計算哈希裝載因子來判斷是否需要擴容,在增容的時候可以重新創建一個哈希表,將之前的元素插入到新的哈希表中,如果在插入的過程中,遇到哈希碰撞,可以通過閉散列或者開散列的方式解決.

對於刪除元素,鏈表可以直接改變指針的指向,然後釋放節點的內存,對於哈希表則不可以直接刪除,因爲一個哈希位置可能會對應多個關鍵字,所以需要對位置進行標記,意味着這是僞刪除,其實並沒有真正的刪除元素.

對於查找元素,鏈表的底層的內存並不是連續的,所以需要遍歷的方式去查找,對於哈希表來說,可以直接通過關鍵碼來查找對應的值,這也是哈希結構的優勢,查找的效率很高.

6、C++ 智能指針的原理?

智能指針通過類將一個普通的指針封裝成棧對象,當棧對象聲明週期結束的時候,由於超出了類的作用範圍,所以會自動調用析構函數釋放內存,C++11 中最常用的智能指針是 shared_ptr ,它是通過引用計數的方法來記錄當前資源被多少個對象使用,新增一個對象會 + 1,釋放一個對象會 -1,當引用計數爲0的時候,會釋放內存資源.

7、算法概率題

題目:有三隻老鼠,分別停留在三角形的三個頂點,三個老鼠分別沿着三條邊朝一個方向運動,它們互相不碰撞的概率是多大?

概率:1/4 ,同時朝着順時針移動,或者同時朝着逆時針移動.感覺這題很簡單,很可惜答錯了,我回答的是 1/8 ,沒考慮另一個方向,面試官是一個技術小姐姐,完全出乎意料,語速超快. 感覺這次涼了,面試被掛應該不是我的問題,怪她聲音太好聽了,耳朵懷孕啦~~~

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