資料鏈路層可以看成是乙個網絡卡驅動,為上層提供了乙個統一的介面。
telnet協議是一種遠端登入協議,它使得我們能在本地完成遠端任務。
產生復位報文段的三種情況:
訪問不存在的埠
異常終止連線
處理半開啟連線
tcp互動資料流(telnet,ssh)和成塊資料流(ftp)
tcp利用緊急指標標誌和緊急指標來實現所謂的帶外資料(只有乙個位元組)。
分為三個部分:
socket位址api(ip,port)
socket基礎api(sys/socket.h)
網路資訊api(netdb.h,用於主機名和ip位址的轉換)
詳見書中。
(需要更深入地理解)
系統日誌(linux提供了乙個寫日誌的介面)
使用者資訊(uid, euid, gid, egid)
程序間關係
系統資源限制
改變工作目錄和根目錄
伺服器程式後台化
阻塞io,io復用,訊號驅動io都是同步io模型,因為它們都是在io事件發生之後,由應用程式來完成(將資料從使用者空間寫入核心空間)。對非同步io來說,則是全部交給了核心(資料在核心和使用者空間之間的移動由核心完成)。同步io向應用程式通知的是io就緒事件,非同步io對應用程式通知的是io完成事件。
兩種高效的事件處理模式:reactor模式(同步io模型)和proactor模式(非同步io模型)
proactor模式將所有的io操作交給主線程和核心來完成:
併發程式設計就是為了提高cpu的利用率嘛,如果是計算密集型的那併發程式設計就沒有用了。
併發程式設計模式:
半同步半非同步模式:同步執行緒用於處理客戶邏輯,非同步執行緒用於處理io事件,一種變體如下(這其實是reactor模式,因為傳的是socket):
有限狀態機(一種高效的邏輯處理方式)的使用:舉了乙個解析http的例子。(由於不知道http的頭部長度,所以我們通過使用狀態機邊解析邊判斷,如果未讀完則繼續讀取,解析出錯則可以直接返回,不用等到全部讀完才解析了)這個有限狀態機的**實現值得研究。
提高伺服器效能的其他建議:
使用池(記憶體池,程序池,執行緒池,連線池):以空間換時間,避免對核心的頻繁訪問。記憶體池通常用於socket的接收快取和傳送快取,連線池通常用於伺服器或伺服器群的內部永久連線(例如:每個邏輯單元要訪問資料庫時,直接從連線池中取得乙個連線實體並使用,完成之後再返回給連線池)。
減少資料複製(比如ftp需要傳送乙個檔案,可以直接使用零拷貝函式sendfile,而不用讀到應用緩衝區再傳送給核心)
上下文切換和鎖:不應該有太多的執行緒,盡量避免使用鎖(鎖不但不處理任何業務邏輯,還需要訪問核心資源),減少鎖的粒度(使用讀寫鎖)。
io多路復用的應用:
客戶端非阻塞的connect,可以同時發起多個連線
splice函式也可以用來實現零拷貝,將使用者輸入內容直接定向到網路連線上(使用者輸入就是檔案描述符0)。
統一事件源:
使用乙個鍊錶來公升序儲存每個定時器的觸發內容,當有定時事件發生時,主迴圈(使用統一事件源)監測到可讀事件就會去遍歷鍊錶執行可以執行的定時事件。可以使用這個方法去實現服務端定時清除非活躍連線的功能。
兩種高效的管理定時器的容器:時間輪(雜湊)和時間堆(二叉樹)
linux伺服器必須處理的三種事件:io事件,訊號和定時事件(這三種都可以統一事件源)。原始碼
linux高效能伺服器程式設計
linux高效能伺服器程式設計 當當網 亞馬遜 目錄 第一章 tcp ip協議族 第二章 ip協議族 第三章 tcp協議詳解 第四章 tcp ip通訊案例 訪問internet 第五章 linux網路程式設計基礎api 第六章 高階io函式 第七章 linux伺服器程式規範 第八章 高效能伺服器框架...
linux 高效能伺服器程式設計
1.高效能定時器 時間輪,時間堆 處理超時時間,如nginx使用紅黑樹,找出最可能超時的事件 2.高效能伺服器程式框架 nginx 使用的是基於事件模型,epoll,不阻塞,非同步處理 兩種高效的事件處理模式 reactor模式 proactor模式 兩種高效的併發模式 半同步 半非同步模式 領導者...
Linux伺服器高效能程式設計 讀書筆記 二
第六章 高階i o函式 6.3 當讀寫分散的記憶體塊時,簡單的將他們拼接在一塊更大的記憶體上傳送或一開始將他們存在同一塊記憶體中都不是較好的解決方案,使用writev和readv可以讀寫分散的多塊記憶體資料。引數二是乙個指向陣列的指標,其單位struct iovc是用來乙個記憶體塊的結構體,這樣只需...