【刷遊戲開發面經記錄】2

頭號理想發表於2020-12-26

TCP中的擁塞控制

在TCP傳輸過程中,傳送端開始傳送資料的時候,如果剛開始大量傳送資料,那麼可能造成一些問題,網路可能在開始的時候非常的擁堵,如果給網路中再次加入大量的資料,那麼這個擁堵就會加劇。
擁堵加劇會產生大量的丟包,就會產生大量的超時重傳,嚴重影響傳輸速率

所以TCP引入了慢啟動機制,在開始傳送資料的時候,先傳送少量的資料探路,探清當前的網路狀態如何
在決定使用多大的速度進行傳輸
**擁塞視窗:**傳送剛開始定義擁塞視窗為1,每次收到ACK應答 擁塞視窗加一
在傳送資料之前,首先將擁塞視窗和接收端返回的視窗大小進行比對,取最小值作為實際傳送的視窗

擁塞視窗的增長是指數級別的,慢啟動機制只是說明在開始的時候傳送的少,傳送的慢,但是增長的速度是很快的,
為控制擁塞視窗的增長,不能單純的是擁塞視窗加倍
設定一個擁塞視窗閾值,當擁塞視窗超過閾值以後,不再按照指數來增長,而是線性的增長
在慢啟動開始的時候,如果慢啟動的閾值等於視窗的最大值,一旦發生網路阻塞,發生超時重傳
慢啟動的閾值會降低為原來的一半,同時擁塞視窗設定為1

擁塞控制是TCP在傳輸的儘可能的將資料傳輸,並且避免擁塞的一系列問題,是可靠性的保證同時也維護了傳輸的高效型

C++編譯過程中的動態連結和靜態連結有什麼區別?動態連結的流程是怎樣的

動態連結和靜態連結最大的區別就在於連結的時機不同
動態連結的進行在程式執行時連結,靜態連結在形成可執行程式之前的連結

流程

預處理->編譯->彙編->連結

預處理 編譯器把c程式的標頭檔案編譯進來,還有巨集的替換

編譯 這個階段主要做詞法分析,語法分析,語義分析,在檢查無錯誤之後,把程式碼翻譯成為組合語言

彙編 組合語言變成機器語言

連結 將編譯階段生成的檔案連結為一個整體的檔案

TCP和UDP的不同點

1.TCP提供面相連結的傳輸,通訊之前建立連線(三次握手);UDP提供無連線的傳輸,通訊之前不需要連線
2.TCP提供可靠的傳輸(有序,無差錯,不丟失,不重複);UDP提供不可靠的傳輸
3.TCP面相位元組流的傳輸,每次傳輸之前,先把資訊分割成組,到達接收端在將其充足,UDP面相資料的傳輸,沒有分組和充足
4.TCP提供擁塞控制和流量控制機制,UDP不提供擁塞控制和流量控制機制

用UDP如何保證資料的完整性

外加校驗碼來保證正確性,加順序碼保證完整性,相當於把TCP保證完整性和可靠性的東西自己去完成,不需要做的太複雜

值型別和引用型別的區別

1.管理機制: 值型別是作業系統負責管理,作用於結束只有作業系統會自動釋放,引用型別是垃圾回收器負責管理
2.記憶體分配: 值型別:被分配到變數宣告的地方,區域性變數分配到棧上
引用型別分配到託管堆上,變數 儲存在棧中
3.賦值方式 值型別:賦值變數包含的值,引用型別:賦值物件引用的地址
4.基類值型別:繼承System.ValueType;System.ValueType又繼承自System.Object
引用型別:繼承自System.Object

結構體和類的區別

1.語法定義的區別一個是class 一個是struct
2.宣告欄位是否可以設定初值 結構體中欄位不可設定初值 類中欄位可以設定初值
3.建構函式要求 結構體的建構函式中要求所有欄位賦值,類的建構函式中無限制
4.所佔空間 結構體是值型別在棧中分配空間,類是引用型別,在堆上分配空間
5.處理方式 struct變數使用完成之後會自動解除記憶體分配,class例項有垃圾回收機制保證記憶體回收處理

C#中的GC

GC就是記憶體的垃圾收集器,以應用程式root為基礎,遍歷應用程式在Heap上動態分配的所有物件,通過辨識他們是否被引用來確定哪些物件是死亡的,哪些是仍需要被使用的,已經不再被應用程式的root或者是別的物件所引用的就是已經死亡的物件,即所謂垃圾

優點:
1.提高了軟體開發的抽象度
2.程式設計師可以將精力集中在實際問題上,而不是專門分心來管理記憶體的問題
3.可以使模組的介面更加清晰,減少模組之間的耦合
4.大大減少了因為認為不當的處理而帶來的bug
5.是記憶體更加的使用高效

總體來說就是GC把程式設計師從複雜的記憶體問題中解放了出來,從而提高了軟體的開發速度,質量和安全性

以上即是最近我刷面經遇到的高頻問題,我都總結下來
希望對大家有所幫助

相關文章