1.模型一:C/S(經典的) 原由:TCP/IP協議是沒有客戶和服務端的區別。可是資源(視頻,新聞,軟件)都是被數據提供者所壟斷 邏輯:服務器啓動後,首先建立一個或多個監聽socket,而且調用bind函數將其綁定到須要(自定義)的端口,而後調用listen函數等待客戶鏈接 特色:客戶鏈接是隨機事件,須要某種I/O模型來監聽鏈接。 例子:服務器I/O複用技術之一的select系統調用 (當監聽接收到鏈接 ,服務器用accept來接收,而且分配一個邏輯單元爲它服務,(fork系統產生邏輯單元,邏輯單元處理好一切返回給客戶端,邏輯單元能夠是新建立的子進程,子線程或其餘)))
2.接下來就是宅男熟悉的P2P模型linux
優點:就是去掉通訊的中心
特色;就是每臺機器在消耗服務的時候也會給別人提供服務
例子:迅雷,雲計算機羣
問題:主機相互之間很難發現(發現服務器來解決這個問題)
可是本質仍是CS,只是一個變相的擴展數據庫
I/O處理單元--------》邏輯單元---------》網絡存儲單元 中間都是由請求隊列(通訊方式,通常是永久的tCP鏈接)
2.1I/O處理單元:管理客戶鏈接的模塊,等待而且接受新的鏈接,接受客戶的數據,將服務器的相應的數據返回客戶端。數據的收發不必定在這裏,也可能在邏輯單元,(取決於事件處理模式) 2.2邏輯單元:分析而且處理數據,而後將結果傳遞給I/O處理單元或者直接發送給客戶端(對於機器羣來講,一個邏輯單元也許就是一臺邏輯服務器) 2.3.網絡儲存:能夠是數據庫,緩存和文件,或者一臺服務器(有些是不須要的,如ssh,telnet) 2.4.請求隊列:各個單元之間通信方式的抽象 兩個方面:I/O處理單元通知邏輯單元的方式,邏輯單元訪問存儲單元的機制 這裏就會涉及到池的概念,這個TCP理解通常是事先創建好的永久高效的TCP鏈接
3.I/O模型
3.1阻塞和非阻塞能夠用於全部的文件描述符,不只僅是socket,
3.2阻塞是多是沒法當即完成而被操做系統掛起,知道等待完成事件發生。
3.3非阻塞是系統的調用老是當即返回。,因此若是完成世家沒有發生,就會返回和錯誤同樣的標記。(errno能夠區分)
要求:咱們須要在完成世家發生的狀況下,操做非阻塞,才能實現高效率。
例子:I/O複用(最經常使用的通知機制,還有SIGIO信號)
含義:有個函數叫I/O複用函數,他能夠向內核註冊一組事件,內核能夠將已經完成的事件通知給應用程序。
例子:I/O複用函數:select,poll,epoll_wait
原理:自己每一個函數都是阻塞的,可是他們都具備監聽多個I/O事件 的能力
備註:SIGIO的信號處理之後再說
備註2:上述的阻塞I/O,I/O複用和信號驅動I/O都是同步I/O模型。
原理:I/O讀寫操做都是在I/O事件發生以後
異步I/O:(POSIX規範)用戶能夠直接對I/O進行讀寫操做,這些操做會告訴用戶讀寫緩衝區的位置,以及操做完成後內核通知應用程序的方式緩存
兩者核心區別:同步是用戶本身處理I/O操做,異步I.O是內核執行I/O操做。
區別2:同步嚮應用程序通知二是I/O就緒事件,異步是I/O完成事件。服務器
linux下,aio.h 提供了對異步I/O的支持網絡