国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

2.2.1服務器百萬并發(fā)實現(xiàn)

這篇具有很好參考價值的文章主要介紹了2.2.1服務器百萬并發(fā)實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Reactor模型的幾個重要組件:Event事件、Reactor反應堆、Demultiplex事件分發(fā)器、Evanthandler事件處理器

接上節(jié)課,上節(jié)課中,我們使用了epoll實現(xiàn)了同時監(jiān)聽多個文件描述符,是對IO的管理,也提到了reactor是對事件的管理,那具體來說是怎樣的呢?reactor是事件驅動模型,也就是EPOLLIN/EPOLLOUT,同時,我們應該維護一種結構,對于每個fd,都應該有這樣一種記錄該fd相關的結構。
2.2.1服務器百萬并發(fā)實現(xiàn)
對于其中的fd小塊,存儲的都是該fd相關的內容,比如該fd的讀寫緩存區(qū),對應的回調函數(shù)等等:
2.2.1服務器百萬并發(fā)實現(xiàn)
結構可以用代碼這樣表示:

typedef int (*ZVCALLBACK)(int fd, int events, void *arg);

typedef struct zv_connect_s {
    int fd;

    ZVCALLBACK cb;

    char rbuffer[BUFFER_LENGTH];
    int rc;
    char wbuffer[BUFFER_LENGTH];
    int wc;

    int count;
} zv_connect_t;

typedef struct zv_connblock_s {
    zv_connect_t *block;
    struct zv_connblock_s *next;
} zv_connblock_t;

typedef struct zv_reactor_s {
    int epfd;
    zv_connblock_t *blockheader;

} zv_reactor_t;

這樣,對于listenfd,我們設置它的accept_cb,對于clientfd,設置它的recv_cbsend_cb

具體來說,我們以fd為下標,唯一標識該fd相關的塊,對于listenfd,通過listenfd設置相關的accept_cb回調:

int accept_cb(int fd, int events, void *arg)
{
   	...
    int clientfd = accept(fd, (struct sockaddr*)&clientaddr, &len);
    if (clientfd < 0) {
        printf("accept errno: %d\n", errno);
        return -1;
    }

    zv_reactor_t *reactor = (zv_reactor_t*)arg;
    zv_connect_t *conn = &reactor->blockheader->block[clientfd];

    conn->fd = clientfd;
    conn->cb = recv_cb;
    ...
    struct epoll_event ev;
    ev.events = EPOLLIN;
    ev.data.fd = clientfd;
    epoll_ctl(reactor->epfd, EPOLL_CTL_ADD, clientfd, &ev);
}

reactor->blockheader->block[listenfd].fd = listenfd;
reactor->blockheader->block[listenfd].cb = accpet_cb;

接收和發(fā)送回調同理。
并且,當我們使用上節(jié)課提到的epoll將IO管理起來后,整體代碼就會顯得非常簡潔,因為當有EPOLLIN/EPOLLOUT事件來臨時,我們只需要根據(jù)fd找到對應的回調函數(shù)執(zhí)行即可:

while (1) {//mainloop,  event driver

        int nready = epoll_wait(reactor.epfd, events, 1024, -1);
        if (nready < 0) continue;
        int i = 0; 
        for (i = 0; i < nready; i++) {
            int connfd = events[i].data.fd;
            zv_connect_t *conn = &reactor.blockheader->block[connfd];
            if (events[i].events & EPOLLIN) {
                conn->cb(connfd, events[i].events, &reactor);
            }
            if (events[i].events & EPOLLOUT) {
                conn->cb(connfd, events[i].events, &reactor);
            }
        }
    }

這便是reactor對事件管理的方式,這樣一來,我們可以將網(wǎng)絡與業(yè)務分離,業(yè)務人員只需要在回調函數(shù)中讀寫相應的buffer即可,無需關注網(wǎng)絡細節(jié)!

再往后,為了提高處理能力,我們可以將clientfd相關的讀寫操作放到子線程去做,而主線程只負責appect等等,這就涉及到不同的網(wǎng)絡編程模型,之后再談。


1.并發(fā):服務器同時承載的客戶端數(shù)量
2.qps:每一秒處理的請求數(shù)量
3.最大時延:
4.新建(建鏈):每秒建立的鏈接數(shù)
5.吞吐量

ulimit -a查看每個進程可以打開的文件描述符個數(shù)
2.2.1服務器百萬并發(fā)實現(xiàn)
可以看到這里open files最大是1024,有兩種方式可以修改:
1.命令:ulimit -n 1048576(這是臨時修改)
2.2.1服務器百萬并發(fā)實現(xiàn)
2.修改文件/etc/security/limits.conf(注意中間是tab鍵)
2.2.1服務器百萬并發(fā)實現(xiàn)

gaoyuelong@ubuntu:~/23040voice/06$ sudo sysctl -p
gaoyuelong@ubuntu:~/23040voice/06$ sudo modprobe nf_conntrack

(目前虛擬機網(wǎng)絡沒有調試好,導致網(wǎng)絡通信有些問題,后續(xù)再寫百萬并發(fā)部分,先挖個坑)

文章參考與<零聲教育>的C/C++linux服務期高級架構系統(tǒng)教程學習:https://ke.qq.com/course/417774?flowToken=1020253文章來源地址http://www.zghlxwxcb.cn/news/detail-422084.html

到了這里,關于2.2.1服務器百萬并發(fā)實現(xiàn)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(中)Channel 模塊的實現(xiàn)

    基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(中)Channel 模塊的實現(xiàn)

    在這篇文章中雖然實現(xiàn)了能夠和多客戶端建立連接,并且同時和多個客戶端進行通信。 基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(上)-CSDN博客 https://blog.csdn.net/weixin_41987016/article/details/135141316?spm=1001.2014.3001.5501 但是有一個 問題(O_O)? : 這個程序它是單線程的。如果我們想

    2024年02月03日
    瀏覽(90)
  • 用反應器模式和epoll構建百萬并發(fā)服務器

    用反應器模式和epoll構建百萬并發(fā)服務器

    此處的百萬并發(fā)指的是可以建立至少100w個客戶端連接,不考慮業(yè)務處理。 反應器模式下的epoll相比起普通的epoll不同在于:普通的epoll在獲取到就緒狀態(tài)的event結構體之后,先判斷是什么類型的fd,再進行操作。而reactor先判斷是什么類型的事件,再進行操作。本文從頭用react

    2024年02月02日
    瀏覽(25)
  • 基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(中)完整代碼

    Buffer.h Buffer.c Channel.h Channel.c ChannelMap.h ChannelMap.c Dispatcher.h EpollDispatcher.c? PollDispatcher.c SelectDispatcher.c EventLoop.h EventLoop.c HttpRequest.h HttpRequest.c ? HttpResponse.h HttpResponse.c TcpConnection.h TcpConnection.c TcpServer.h TcpServer.c ThreadPool.h ThreadPool.c WorkerThread.h WorkerThread.c

    2024年01月20日
    瀏覽(91)
  • 基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(下)重構Channel類

    一、C語言 Channel.h Channel.c 二、C++ Channel.h Channel.cpp ?

    2024年01月21日
    瀏覽(105)
  • 【網(wǎng)絡進階】服務器模型Reactor與Proactor

    【網(wǎng)絡進階】服務器模型Reactor與Proactor

    在高并發(fā)編程和網(wǎng)絡連接的消息處理中,通常可分為兩個階段:等待消息就緒和消息處理。當使用默認的阻塞套接字時(例如每個線程專門處理一個連接),這兩個階段往往是合并的。因此,處理套接字的線程需要等待消息就緒,這在高并發(fā)場景下導致線程頻繁地休眠和喚醒

    2024年02月01日
    瀏覽(15)
  • 基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(中)EventLoop初始化和啟動

    基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(中)EventLoop初始化和啟動

    (一)詳述 EventLoop? 這個 Dispatcher 是一個事件分發(fā)模型,通過這個模型,就能夠檢測對應的文件描述符的事件的時候,可以使用 epoll/poll/select ,前面說過三選一。另外不管是哪一個底層的檢測模型,它們都需要使用一個數(shù)據(jù)塊,這個數(shù)據(jù)塊就叫做 DispatcherData 。除此之外,還有另外一

    2024年01月23日
    瀏覽(21)
  • 使用select實現(xiàn)TCP并發(fā)服務器模型

    使用select實現(xiàn)TCP并發(fā)服務器模型

    本期主要分享的是對于select的使用,使用select實現(xiàn)TCP并發(fā)服務器模型,由于之前所用到的技術知識只能夠支撐我們進行單個訪問,但是有了select之后呢,我們就能夠實現(xiàn)多用戶進行訪問;這也是非常符合客觀需求的; 這次呢我們重點來使用一下select; 用到的頭文件如下: 我

    2024年02月08日
    瀏覽(21)
  • 基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(中)HttpRequest模塊 解析http請求協(xié)議

    基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(中)HttpRequest模塊 解析http請求協(xié)議

    一、HTTP響應報文格式 二、根據(jù)解析出的原始數(shù)據(jù),對客戶端的請求做出處理? processHttpRequest? 1.解碼字符串?? 解決瀏覽器無法訪問帶特殊字符的文件得到問題 2.判斷文件擴展名,返回對應的 Content-Type(Mime-Type) 3.發(fā)送文件??sendFile 4.發(fā)送目錄 三、解析http請求協(xié)議? parseHttpR

    2024年02月02日
    瀏覽(25)
  • 基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(中)在TcpConnection 中接收并解析Http請求消息

    基于多反應堆的高并發(fā)服務器【C/C++/Reactor】(中)在TcpConnection 中接收并解析Http請求消息

    一、在TcpConnection 中多添加和http協(xié)議相關的request和response 二、給客戶端回復數(shù)據(jù)(方法一) 1.在 Buffer.h 文件中添加 bufferSendData 函數(shù): ?2.在 TcpConnection.c 文件中添加 processWrite 函數(shù): 3.修改 tcpConnectionInit 函數(shù)中調用的 channelInit函數(shù) 的寫回調函數(shù)為 processWrite函數(shù) 三、給客戶端

    2024年01月23日
    瀏覽(16)
  • 基于epoll實現(xiàn)Reactor服務器

    基于epoll實現(xiàn)Reactor服務器

    在我們調用epoll_create的時候會創(chuàng)建出epoll模型,這個模型也是利用文件描述類似文件系統(tǒng)的方式控制該結構。 在我們調用epoll_create的時候,就會在內核管理中創(chuàng)建一個epoll模型,并且建管理模塊地址給file結構體,file結構體也是連接在管理所有file結構體的數(shù)據(jù)結構中 所以epo

    2024年02月20日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包