1.自我介紹就不多贅述了
2. 請介紹一下你的項目經歷
- 介紹了專輯鑒賞項目,前端使用html語言編寫,后端基于http協議使用C語言進行網頁開發。此外,還提及項目中涉及處理多線程問題以及做過內存池管理項目。
3. 項目中HTTP協議是使用庫實現的嗎
- 真忘了,只能往別的地方掰扯,我說我記得HTTP底層是TCP協議,通過TCP建立連接,經過傳輸層、網絡層找到服務器地址實現通信。
4. 實際開發過程中遇到過什么問題,如何解決的
- 將項目從Linux系統移植到云服務器時,網頁無法打開。經查閱資料發現是80端口未打開,打開后網頁得以正常顯示。
5. 處理多線程問題需要注意什么
- 需要注意線程安全、資源競爭和死鎖等問題。解決線程安全問題可使用鎖保護共享資源;避免死鎖要盡量避免多個鎖嵌套使用、統一加鎖順序或使用超時鎖;線程數太多時可使用線程池復用線程。
6. 進程申請的內存是虛擬內存還是物理內存,虛擬內存和物理內存如何映射
- 進程申請內存后拿到的是虛擬內存地址。虛擬內存是操作系統提供的假象內存空間,每個進程有獨立的虛擬地址空間;物理內存是內存條上的存儲單元,系統會調配物理內存給不同進程使用。?
7. 在一臺給定配置的電腦上,每個進程理論上可得的內存大小受哪些因素影響
- 受操作系統位數、系統總物理內存、交換空間、單個進程限制、地址空間布局以及分配方式等因素影響。
8. 32位系統中每個進程理論上可操作的內存空間最大是多少
- 32位系統中,理論上每個進程可操作的虛擬內存最大為4G。
9. 假設物理內存只有4G,有5個進程,每個進程啟動時申請1G內存,操作系統會如何處理
- 操作系統會使用虛擬內存、分頁機制和交換空間來解決。采用按需分配和頁面置換策略,不會一次性給進程分配所有所需內存,而是先給活躍部分分配物理內存頁,將不常用的內存頁換到硬盤的交換空間,再把新需要的內存頁從磁盤換進來。
10. 內存池前后添加強防止越界怎么理解,為什么要加
-在內存池前后添加強制邊界,是指在內存池的起始和結束位置額外添加一些特殊標記(通常是設置特定的標記值)。在內存池_邊界標識法中,通過在內存池的前后各添加一個標記單元,設置其tag
為 1 來表示邊界。
Space pav = (Space)malloc((SIZE+2) *?sizeof(WORD));// 內存池 + 2 邊界
pav->tag =?1;?// 左邊界
pav++;
// ...
(p +?1)->tag =?1;?// 右邊界
原因:
-防止內存越界訪問:在內存管理過程中,可能會出現程序意外地訪問超出內存池范圍的情況。例如,在合并相鄰空閑塊時,如果沒有邊界標記,可能會錯誤地訪問到內存池之外的區域,導致未定義行為(如程序崩潰、數據損壞等)。通過添加邊界標記,可以在程序訪問到邊界時進行檢查,避免越界訪問。
-簡化合并邏輯:在釋放內存時,需要判斷相鄰的內存塊是否為空閑塊,以便進行合并操作。邊界標記可以作為一個明確的終止條件,簡化合并邏輯,避免不必要的錯誤。
11. 在申請內存的函數中需要傳什么參數,返回值是什么
(1)在伙伴系統中:
-參數:
FreeList* pf:指向空閑鏈表數組的指針,用于管理不同大小的空閑塊。
int n:需要申請的內存塊大小,以WORD_b
為單位。
-返回值:
如果申請成功,返回一個指向分配的內存塊的指針WORD_b*
;
如果申請失敗(如沒有足夠的空閑塊),返回NULL
。
(2)在邊界標識法中:
-參數:
Space* pav:指向內存池的指針,用于管理空閑內存塊。
int n需要申請的內存塊大小,以WORD
為單位。
-返回值:
如果申請成功,返回一個指向分配的內存塊的指針WORD*
;
如果申請失敗(如沒有足夠的空閑塊),返回NULL
。
12. 釋放內存時如何得知之前申請的空間大小
(1)在伙伴系統中,每個內存塊都有一個?kval
?字段,表示該內存塊的大小為?(2^{kval})?個?WORD_b
?單元。
因此,在釋放內存時,可以通過訪問該內存塊的?kval
?字段來確定其大小。
void?MyFree(FreeList* pf, WORD_b* p)
{// ...int?size =?1?<< p->kval;?// 計算內存塊的大小// ...
}
(2)在邊界標識法中,每個內存塊的頭部都有一個size
字段,用于記錄該內存塊的大小。
因此,在釋放內存時,可以直接訪問該內存塊頭部的size
字段來確定其大小。
???????
void?MyFree(Space* pav, WORD* p)
{// ...int?size = p->size;?// 獲取內存塊的大小// ...
}
13. TCP請求相對于UDP有什么特點
- TCP比較可靠,是面向字節流的一對一傳輸協議。通過序列號、確認應答、流量控制和擁塞控制等手段保證可靠性。
14. TCP的滑動窗口機制用于什么場景,有什么作用
- 滑動窗口機制用于TCP發送端和接收端之間,根據網絡帶寬和接收方接收能力動態調整窗口大小,主要解決流量控制和擁塞控制問題。
15. 假設客戶端一次性發10個序列包,在部分包未收到應答的情況下還能繼續發送嗎
- 不能,需要每個數據包都被接收方確認到達,發送窗口才會滑動,釋放出空間才能發送新的數據包。
16. 在瀏覽器上輸入域名到收到后臺服務器返回的包,大概流程是怎樣的
- 流程包括:瀏覽器解析網址;進行DNS解析,查詢本地緩存,若沒有則向DNS服務器請求,獲取目標網址的IP地址;建立TCP連接;發送HTTP請求,請求包含請求方法、請求頭;服務器處理請求,如訪問數據庫或讀取文件;服務器發送HTTP響應,通常是HTML頁面、CSS、圖片等;瀏覽器解析HTML,構建文檔對象模型樹,進行CSS、JavaScript解析和頁面渲染;加載頁面資源,可能觸發新的HTTP請求,并緩存已加載資源;關閉TCP連接,通過四次揮手完成。
17. 在局域網內部,服務器如何找到發送請求的設備
- 設備連接局域網會通過動態主機配置協議或靜態IP配置獲得唯一的局域網內IP地址。服務器通過ARP地址解析協議,發送ARP請求詢問擁有該IP地址的設備,獲取設備的Mac地址。若設備和服務器在同一子網,交換機根據目標IP地址或Mac地址將數據包發送到相應設備;若在不同子網,路由器通過IP地址轉發數據包。
18. 找最長遞增子序列(手撕+思路)???????
class?Solution?{
public:int?lengthOfLIS(vector<int>& nums)?{int?n = (int)nums.size();if?(n ==?0) {return?0;}vector<int>?dp(n,?0);for?(int?i =?0; i < n; ++i) {dp[i] =?1;for?(int?j =?0; j < i; ++j) {if?(nums[j] < nums[i]) {dp[i] =?max(dp[i], dp[j] +?1);}}}return?*max_element(dp.begin(), dp.end());}
};
-加上輸入輸出后死活運行不出來,最后給面試官說了解題思路
- 采用動態規劃方法,定義一個Vector類型的DP數組,DP數組的第i個元素表示數組中第i個元素的最長遞增子序列的長度。對于原數組中的每個元素,從它前面找所有比它小的元素,若滿足條件則在相應DP元素基礎上延長長度,最終DP數組中的最大值就是最長遞增子序列的長度。
- 時間復雜度是O(n^2),空間復雜度是O(n)。