?回顧
I0多路復用的原理?
- 程序首先向操作系統發起一個IO多路復用請求,告訴操作系統需要監視哪些IO通道。這些IO通道可以包括網絡套接字、文件描述符等
- 操作系統隨后會將這些IO通道放入一個隊列中,并在某個IO通道就緒時(如數據到達、文件可讀等)向程序發送一個事件通知
- 程序接收到事件后,可以立即處理該IO通道的操作。這意味著,程序可以在單個線程中同時監聽多個輸入流,并在有數據可讀或可寫時進行相應的處理,而不需要為每個通道創建一個獨立的線程
實現I0多路復用可以使用哪些函數完成?
- 可以使用 select、poll、epoll這些函數來完成
select和poll的區別?
????????select
- 支持的最大文件描述符數量是有限制的
- 采用輪詢方式,將所有待檢測的文件描述符放在一個fd_set集合中,每次輪詢需要遍歷整個集合
- 是標準POSIX接口,在幾乎所有操作系統上都能使用
- 對于返回狀態碼不夠清晰明了,需要使用FD_ISSET宏來判斷哪些文件描述符已經就緒
- elect函數僅支持三種事件標志:可讀、可寫和異常
????????poll
- 沒有相關限制,可以處理任意數量的文件描述符
- 采用鏈表方式,將所有待檢測的文件描述符放在一個鏈表中,每次檢查時只需要遍歷該鏈表即可,處理大量文件描述符時,poll效率更高
- 不是標準接口,在一些老舊的操作系統上可能無法使用
- 返回后直接通過revents字段來判斷哪些文件描述符已經就緒,這使得poll的返回結果更加直觀
- 支持更多的事件標志,包括可讀、可寫、異常、連接斷開、優先級帶數據和錯誤事件等
在UDP通信過程中,能否使用connect函數?為什么?有什么好處?
- 可以使用
- 使用connect函數為UDP套接字設置了一個目標地址后,后續調用send或sendto函數發送數據時,就可以省略目標地址參數。這可以使代碼更簡潔,減少出錯的可能性。
- 當UDP套接字未連接時,send或sendto函數調用失敗時,errno可能被設置為ENOTCONN或EDESTADDRREQ。而使用connect函數后,這些問題可以得到簡化
- 在某些實現中,使用connect函數連接UDP套接字可能會提高性能,因為系統可以優化網絡路徑和緩存
- 通常,UDP套接字使用recvfrom函數來接收數據,因為它需要知道數據來自哪個源地址。但是,如果使用connect函數連接了UDP套接字,那么也可以使用recv函數來接收數據,因為系統已經知道數據應該來自哪個地址。這允許你在同一端口上創建多個套接字,這在某些應用程序中可能是有用的
0SI 7層網絡體系結構有哪些?
- 應用層::應用層位于OSI參考模型的最高層,它的主要任務是通過應用程序間的交互來完成特定的網絡應用
- 表示層:表示層從應用層接受數據,這些數據是以字符和數字的形式出現的(如Chinese、666)
- 會話層:會話層負責建立、管理和終止會話。會話層通過提供單會話或多會話管理、同步以及重新同步服務,來控制哪些應用進程正在通信,并負責建立、管理和終止會話。
- 傳輸層:傳輸層的主要任務是將從下層接收的數據進行分段和傳輸,并在到達目的地址后再進行重組
- 網絡層:網絡層的主要任務是選擇合適的網間路由和交換節點,以確保數據分組(Packet)從發送端到達接收端
- 數據鏈路層:數據鏈路層通常也叫做鏈路層,它位于物理層和網絡層之間
- 物理層:物理層是OSI參考模型的最低層,它直接面向實際承擔數據傳輸的物理媒體(如通信鏈路),負責傳送比特流(即由“1”和“0”表示的二進制數串)的功能
四層網絡體系結構:
- 網絡接口層:這一層沒有規定具體內容,目的是互聯全世界各種不同的網絡接口,如有線的以太網接口,無線局域網的Wi-Fi接口。
- 網絡層:主要負責建立兩個節點之間的連接,通過尋址來選擇合適的路由和交換節點,確保數據能夠正確無誤地按照地址傳送給目的端的傳輸層。IP協議是這一層的核心。
- 傳輸層:負責在機器之間建立用于會話的端到端連接(用于數據傳輸),并提供可靠、透明和優化的數據傳輸服務機制。該層的核心協議包括TCP(傳輸控制協議)和UDP(用戶數據報協議)。
- 應用層:主要為用戶提供針對性的服務,包含大量的應用協議,如HTTP(超文本傳輸協議)、HTTPS(安全的HTTP)、FTP(文件傳輸協議)、SMTP(簡單郵件傳輸協議)、POP3(郵局協議第3版)等
ARP、HTTP、TFTP、IP、UDP、TCP說出全程和所在層
- ARP:地址解析協議,它在TCP/IP模型中屬于IP層(網絡層),在OSI模型中屬于鏈路層。ARP協議用于將計算機的網絡地址(IP地址32位)轉化為物理地址(MAC地址48位)
- HTTP:超文本傳輸協議,它屬于應用層協議。HTTP協議是為了實現某一類具體應用的協議,并由某一運行在用戶空間的應用程序來實現其功能
- TFTP:簡單文件傳輸協議,它也屬于應用層協議。TFTP是一個在UDP之上建立的簡單的、面向文件的傳輸協議,僅支持文件上傳和下載功能
- IP:網際互連協議,它位于TCP/IP模型的網絡層(相當于OSI模型的網絡層)。IP協議設計目的是提高網絡的可擴展性,如解決互聯網問題、實現大規模、異構網絡的互聯互通等
- UDP:用戶數據報協議,它在TCP/IP模型中屬于傳輸層。UDP是一種無連接的協議,它在傳輸數據之前不需要建立連接,因此它的傳輸速度較快,但數據安全性相對較低
- TCP:傳輸控制協議,同樣位于TCP/IP模型的傳輸層。TCP協議是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。在簡化的計算機網絡OSI模型中,它完成第四層傳輸層所指定的功能
順序表和鏈表的區別?
- 順序表
- 順序表底層存儲空間是連續的,它使用一塊連續的內存空間存儲元素,并通過下標來訪問和操作元素。由于元素在內存中連續存儲,順序表具有快速的隨機訪問能力,訪問元素的時間復雜度為O(1)。
- 在順序表中插入和刪除元素時,需要移動其他元素以保持順序,因此插入和刪除的時間復雜度較高,為O(n)。此外,順序表在插入時可能需要擴容,即開辟新空間、拷貝元素、釋放舊空間,這也增加了操作的復雜性。
- 順序表在存儲數據時通常具有較高的空間利用率,因為它使用連續的存儲空間,減少了空間碎片。然而,順序表要求大片連續空間,改變容量不方便。
- 順序表的設計相對簡單,因為它基于數組實現,可以直接使用數組的下標來訪問元素。
- 鏈表
- 鏈表底層存儲空間則是不連續的,它在計算機內存的位置是隨機存儲的。鏈表中的元素通過指針鏈接次序實現邏輯順序,因此在訪問元素時需要從頭節點開始逐個遍歷,訪問元素的時間復雜度為O(n)。
- 鏈表在插入和刪除元素時則相對簡單,不需要移動其他元素。鏈表中的節點包含數據域和指針域,插入和刪除操作只需要修改指針即可,時間復雜度為O(1)。
- 鏈表在存儲數據時空間利用率相對較低,因為每個節點除了存儲數據外還需要存儲指向下一個節點的指針。但是,鏈表在插入新數據時可以向系統申請新的內存空間,數據刪除后也可以將空間還給系統,因此更加靈活。
- 鏈表的設計則相對復雜,需要定義節點結構、實現節點的鏈接和遍歷等操作。此外,鏈表在查找數據時也需要按順序找到該數據為止,無法像順序表一樣進行隨機訪問
進程和線程的區別?
- 進程
- 是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配的基本單位,是操作系統結構的基礎。它具有獨立的功能,可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。
- 擁有獨立的地址空間和系統資源,包括文本區域、數據區域和堆棧區域等。因此,創建和銷毀進程的開銷相對較大
- 是獨立的執行單元,具有自己的調度算法,在并發條件下更加穩定可靠。然而,由于進程間的相互制約,進程的執行具有間斷性,即進程按各自獨立的、不可預知的速度向前推進。
- 必須通過IPC(進程間通信)進行通信,切換開銷相對較大。這是因為每個進程都有獨立的地址空間和資源,需要進行復雜的上下文切換操作。
- 由程序、數據和進程控制塊(PCB)三部分組成。一個程序在不同的數據集里就構成不同的進程,能得到不同的結果。
- 線程
- 是操作系統能夠進行運算調度的最小單位,它被包含在進程當中,是進程中的實際運作單位。與進程相比,線程更為輕量級,共享進程的地址空間和系統資源。每個進程都至少包含一個線程,稱為主線程,而其他線程則被稱為子線程。
- 則直接訪問其所屬進程的地址空間和資源,因此可以方便地共享數據。與進程相比,線程的創建和銷毀開銷較小,因為它們共享進程的資源
- 可以并發執行,提高程序的吞吐量和響應性。但由于線程共享進程的資源,線程之間的調度和同步比較復雜,對并發條件的處理需要更多的注意。
- 可以直接共享進程的地址空間和資源,因此切換開銷相對較小。這使得線程之間的通信更加高效和靈活。
- 一個進程可以包含多個線程,這些線程共享相同的地址空間和資源。這使得線程在編程中更加靈活和高效。