1. 程式人生 > >高併發伺服器開發--網路模型

高併發伺服器開發--網路模型

1 I/O型別

Read分為兩步:

a.Waiting for thedata to be ready(等待資料準備)。

b.Copying thedata from the kernel to the process(將資料從核心拷貝到程序中)

Blocking I/O:

官方:


個人理解:只有I/O操作完成,才能做其他事情;

Nonblocking I/O:

官方:


個人理解:進行I/O操作,核心立即返回結果;

Multiplexing I/O:

官方:


個人理解:將一些檔案描述符放入集合中進行監測,如果裡面有可讀或可寫的描述符,就讓其進行讀寫操作。

Signal Driven I/O:

官方:


個人理解:能夠進行讀寫了,核心傳送訊號到相應的程序,讓其進行讀寫操作。

Asynchronous I/O:

官方:非同步IO這個模型是真正的非同步模型,他直接呼叫了一個系統函式,然後等待kernel的資料準備好之後直接返回一個訊號。使用者程序接收到這個訊號之後得到從kernel發來的資料。


個人理解:

區別對比:


呼叫blocking IO會一直block住對應的程序直到操作完成;

non-blocking IO在kernel還準備資料的情況下會立刻返回;

A synchronous I/O operation causes the requestingprocess to be blocked until that I/O operation completes;

An asynchronous I/O operation does not cause therequesting process to be blocked;

2兩種設計模式

2.1Reactor模型

Reactor模式是處理併發I/O比較常見的一種模式,中心思想就是,將所有要處理的I/O事件註冊到一箇中心I/O多路複用器上,同時主執行緒阻塞在多路複用器上。一旦有I/O事件到來或是準備就緒(區別在於多路複用器是邊沿觸發還是水平觸發),多路複用器返回並將相應I/O事件分發到對應的處理器中。

多路複用器:

邊沿觸發:如果檔案描述符自上次狀態改變後有新的IO活動到來,此時會觸發通知。在收到一個IO事件通知後要儘可能多的執行IO操作,因為如果在一次通知中沒有執行完IO那麼就需要等到下一次新的IO活動到來才能獲取到就緒的描述符。訊號驅動式IO就屬於邊緣觸發。

水平觸發:如果檔案描述符已經就緒可以非阻塞的執行IO操作了,此時會觸發通知.允許在任意時刻重複檢測IO的狀態,沒有必要每次描述符就緒後儘可能多的執行IO.select,poll就屬於水平觸發。

參考:http://blog.csdn.net/liuxingen/article/details/38495545

2.2Proactor模型

與Reactor模型相對應,Proactor最大的特點是使用非同步I/O。所有的I/O操作都交由系統提供的非同步I/O介面去執行。Proactor多路複用器等待非同步I/O完成,並呼叫相應的使用者處理函式。

3開源網路庫

3.1libevent

事件觸發的網路庫。libevent是一個事件觸發的網路庫,適用於windows、linux、bsd等多種平臺,內部使用select、epoll、kqueue、IOCP等系統呼叫管理事件機制。

事件驅動(event-driven),高效能;
輕量級,專注於網路,不如ACE那麼臃腫龐大;
原始碼相當精煉、易讀;
跨平臺,支援Windows、Linux、*BSD和Mac Os;
支援多種I/O多路複用技術, epoll、poll、dev/poll、select和kqueue等;
支援I/O,定時器和訊號等事件;
註冊事件優先順序;


3.2原始碼學習

3.2.1開源例項的使用之資料庫防火牆

       Greensql:使用了定時器、事件驅動i/o。這已在另篇博文中分析了。

3.2.2Memcached

       此專案使用Reactor模式。

      主執行緒有一個Libevent事件分發器,主要負責新的socket連線。如果有新的連線到來,將這個socket檔案描述符放入佇列中,通過管道通知子執行緒。子執行緒收到通知後,從佇列中取出socket檔案描述符, 加入到子執行緒的libevent中,對改socket進行讀寫。

如下圖可以看到網路結構:

      

多執行緒模型如下:

      

相關推薦

併發伺服器開發--網路模型

1 I/O型別 Read分為兩步: a.Waiting for thedata to be ready(等待資料準備)。 b.Copying thedata from the kernel to the process(將資料從核心拷貝到程序中) Blocking I/O

epoll程式設計,如何實現併發伺服器開發

閒答。 按重要性和基礎程度,打亂下順序吧~~ 先回問題,然後說怎麼實現。 注:以下資料,均基於亞馬遜AWS c3.xlarge 機型。 虛擬CPU:4 記憶體:7.5 GB c3.xlarge 配置和價格: AWS | Amazon EC2 ~~~~~~~~~~ 分割線 ~~~~~~~~~~ 2、查了很多資料

負載併發伺服器開發參考

1、軟體框架 高效能的軟體框架,一般都基於event-driven、非同步模式,同時提供諸如執行緒池、epoll(*unx)IOCP(I/O Completion Port,windows)等技術來提高併發處理效能,python、C++、Java中有一個典型的框架性專案提供了對高效能網路通訊框架的支援,常用

【Linux】併發伺服器模型(多程序模型和多執行緒模型

多程序併發伺服器 使用多程序併發伺服器時要考慮以下幾點:             1.      父程序最大檔案描述個數(父程序中需要close關閉accept返回的新檔案描述符)             2.      系統內建立程序個數(與記憶體大小相關)      

實現併發伺服器三種簡化模型 執行緒 程序 IO複用

知識點:UNIX網路程式設計第四章, 第五章,第六章 多程序模型: #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<arpa/inet.h>

Netty 100萬級併發伺服器配置

前言 每一種該語言在某些極限情況下的表現一般都不太一樣,那麼我常用的Java語言,在達到100萬個併發連線情況下,會怎麼樣呢,有些好奇,更有些期盼。 這次使用經常使用的順手的netty NIO框架(netty-3.6.5.Final),封裝的很好,介面很全面,就像它現在的域名 netty.io,專注於網路I

用程序池和執行緒池實現併發伺服器

思想:   1.  建立與伺服器相同cpu個數的程序個數來監聽(accept)客戶端響應,並在每個程序中先建立好一個執行緒池   2.  有客戶端訪問時,解除其中一個程序的accpet阻塞,進入到執行緒中來執行接收資料工作( recv() ),用執行緒防止recv阻塞,執行緒呼叫recv方法   3. 

您的快遞(併發伺服器之poll和epoll)請簽收

  前言   之前已經介紹過select函式,請參考這篇部落格:https://www.cnblogs.com/liudw-0215/p/9661583.html,原理都是類似的,有時間先閱讀下那篇部落格,以便於理解這篇部落格。   一、poll函式   1、函式說明   原型:int poll(st

併發伺服器---基礎----IO模式和IO多路複用

轉自:https://www.cnblogs.com/zingp/p/6863170.html   閱讀目錄 1 基礎知識回顧 2 I/O模式 3 事件驅動程式設計模型 4 select/poll/epoll的區別及其Python示例   網路程式設計裡常聽到阻塞IO、

golang-gin-mgo併發伺服器搭建

gin-mgo伺服器搭建 該伺服器實現簡單接收請求並將請求引數封裝儲存在mongodb資料庫中,本文將講述gin-mgo的使用方法。 gin web框架使用介紹 首先獲取gin框架依賴 go get gopkg.in/gin-gonic/g

基於sysctl.conf優化併發伺服器的TCP引數

sysctl.conf工作原理   sysctl命令被用於在核心執行時動態地修改核心的執行引數,可用的核心引數在目錄/proc/sys中。它包含一些TCP/IP堆疊和虛擬記憶體系統的高階選項, 這可以讓有經驗的管理員提高引人注目的系統性能。用sysctl可以讀取設定超過五百個系統變

從0開始,部署.NetCore並構建非阻塞併發伺服器(2)

工具篇看我這篇部落格想搭建伺服器的朋友多半是想在Linux上使用,正所謂工欲善其事必先利其器,一個好用的SSH對我們的工作效率影響也很大,簡單的說下我在Win下常用的SSH軟體和使用教程,老手自動忽略即可推薦工具1--WinSCPWinSCP可以說是我最常用的遠端連線Linu

Linux併發伺服器解決方案

Linux高併發伺服器案例演示 在網路通訊中,我們常常的伺服器經常會受到成千上萬的請求提示,而電腦會根據請求建立相對應的socket連結,但是接觸過Linux網路程式設計的人都知道,Linux連結和客戶端建立連線,會經過四步(這裡以TCP說明) 第一步,建立socket

併發伺服器

12.7 socket IPCsocket API原本是為網路通訊設計的,但後來在socket的框架上發展出一種IPC機 制,就是UNIX Domain Socket。雖然網路socket也可用於同一臺主機的程序間通訊(通過 loopback地址127.0.0.1),但是UNIX Domain Socket用

IOCP 實現一個簡單併發伺服器程式

 前言:原始碼使用比較高階的IOCP技術,它能夠有效的為多個客戶端服務,利用IOCP程式設計API,它也提供了一些實際問題的解決辦法,並且提供了一個簡單的帶回復的檔案傳輸的客戶端/伺服器。 1.1 要求: l 文章要求讀者熟悉C++, TCP/IP, 套接字(sock

高效能併發伺服器架構淺析--多執行緒模式

談到高效能高併發伺服器的設計與開發,很關鍵的一模組就是高效的I/O處理了。 那麼如何高效的處理I/O呢?當然是首推epoll來實現I/O複用了! 首先我們來簡單的瞭解下epoll,有經驗的工程師都知道的。epoll是目前linux作業系統上最強大的事件管理機制,也是linu

Linux + C + Epoll實現併發伺服器(執行緒池 + 資料庫連線池)

一, 背景        先說下我要實現的功能,server端一直在linux平臺下面跑,當客戶端有請求過來的時候server端接受到請求,拿到客戶端的資料,根據拿到的資料做出相應的處理,得到處理的結果直接把結果資料傳送給客戶端。這樣一個連線的請求結束,我的不

分散式併發伺服器做請求分發,session共享(nginx+tomcat+redis)

我這裡列舉一個可行方案(nginx+tomcat+redis) 首先 nginx,它幫助實現了分散式 Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器

1併發伺服器:多路IO之select

 1 select A:select能監聽的檔案描述符個數受限於FD_SETSIZE,一般為1024,單純改變程序開啟 的檔案描述符個數並不能改變select監聽檔案個數 B:解決1024

利用libevent 和執行緒池實現併發伺服器的設計

主程序新增監聽套接字的事件並進行事件迴圈,將連線描述符放入定義的資料結構中,並在主程序中進行寫管道,觸發子執行緒的讀管道事件,然後從連線結構中獲取連線描述符進行和客戶端進行通訊。其中主程序和子執行緒都有不同的基事件base. #include <stdi