Linux 伺服器模型小結

来源:http://www.cnblogs.com/xiaojiang1025/archive/2016/11/13/6060132.html
-Advertisement-
Play Games

當我們用socket進行編程的時候,細節上都是選擇一個 ,`AF_INET`再根據相應的類型填充地址,其實根據通信需求,有幾種簡單的服務模型可供選用,掌握了這些框架再結合socket高度的抽象,可以為我們編寫簡單的伺服器程式提供指導 迴圈服務 用戶請求服務需要排隊,伺服器一次只能服務一個客戶,服務完 ...


當我們用socket進行編程的時候,細節上都是選擇一個AF_LOCAL,AF_INET再根據相應的類型填充地址,其實根據通信需求,有幾種簡單的服務模型可供選用,掌握了這些框架再結合socket高度的抽象,可以為我們編寫簡單的伺服器程式提供指導

迴圈服務

用戶請求服務需要排隊,伺服器一次只能服務一個客戶,服務完才能對下一個客戶進行服務。ATM機就是這個1vs1模型。udp伺服器也經常使用這個模型

//模型偽代碼
main{
    //獲得偵聽文件描述符
    listenfd=socket();
    
    //準備地址addr
    
    //(listenfd,100);
    
    while(1){將伺服器的addr和listenfd綁定
    bind(listenfd,addr)
    
    //開始偵聽,設置緩衝隊列長度
    listen(listenfd,100);
    
    while(1){
        //如果偵聽到任務就獲取sockfd
        int sockfd = accept(listenfd);  //listenfd預設是阻塞IO,沒任務時進程會sleep
        
        //通信...
        
        close(sockfd);
    }
}

多進程併發服務

多進程只是放listen到請求的時候,不是在原進程中處理請求,而是在子進程中處理,父進程繼續偵聽請求。多進程的好處父進程不必等待子進程處理完一個請求才能獲取下一個請求,而是只要有請求就fork一個子進程處理,這樣就可以實現併發伺服器。多進程併發的更實際的方案是使用進程池來實現。

//模型偽代碼
main{
    //獲得偵聽文件描述符
    listenfd=socket();
    
    //準備地址addr
    
    //將伺服器的addr和listenfd綁定
    bind(listenfd,addr)
    
    //開始偵聽,設/準備地址add置緩衝隊列長度
    listen(listenfd,100);
    
    while(1){
        //如果偵聽到任務就獲取sockfd
        int sockfd = accept(listenfd);  //listenfd預設是阻塞IO,沒任務時進程會sleep
        pid=fork();
        if(0 == pid){
            //子進程一定要首先關閉listenfd,防止和父進程一起偵聽
            //也可以在父進程socket(,,SOCK_CLOEXEC);
            close(listenfd);
                    
            while(1){
                ret=read(sockfd);
                if(0 == ret) break;
                //通信...
            }
        
            exit(0);
        }
    }
}

多線程併發服務

使用多線程實現併發和多進程類似,但是創建一個線程的開銷比創建一個進程小得多,需要註意的是使用多線程需要做好對臨界資源的保護。實際操作經常使用線程池來實現多線程併發服務。

//模型偽代碼
void* communicate(void* arg){
    int sockfd=(int)arg;
    while(1){
        ret=read(sockfd);
        if(0 == ret) break;
        //通信...
    }
}

main{
    //獲得偵聽文件描述符
    listenfd=socket();
    
    //準備地址addr
    
    //將伺服器的addr和listenfd綁定
    bind(listenfd,addr)
    
    //開始偵聽,設置緩衝隊列長度
    listen(listenfd,100);
    
    while(1){
        //如果偵聽到任務就獲取sockfd
        //listenfd預設是阻塞IO,沒任務時進程會sleep
        int sockfd = accept(listenfd);  
        pthread_create(tid,communicate,(void*)&sockfd);
        }
    }
}

I/O多路復用併發服務

I/O多路復用實現併發服務我已經在Linux I/O多路復用一文中舉出了詳細的例子,其實質就是將udp伺服器的迴圈模型用在tcp上。

//模型偽代碼
main{
    //獲得偵聽文件描述符
    listenfd=socket();
    
    //準備地址addr
    
    //將伺服器的addr和listenfd綁定
    bind(listenfd,addr)
    
    //開始偵聽,設置緩衝隊列長度
    listen(listenfd,100);
    
    //準備偵聽對象,和相應的觸發事件的集合
    monitor_set_1[i]={fds...}   //監控I/O有數據流入
    monitor_set_2[i]={fds...}   //監控I/O變得可寫

    while(1){
        //監控對象,如果有事件發生就返回
        poll(monitor_set_1,monitor_set_2)
        for(n=0;n<maxfd;n++){       //poll返回,說明有(一些)事件被觸發,依次處理這些觸發了事件的文件描述符
            if(一個fd有數據流入){
                if(是listenfd有數據流入){
                    //獲取sockfd
                    int sockfd = accept(listenfd)
                    
                    //將這個sockfd加入監聽有數據流入可寫的集合
                    add_mem(moniter_set_1,sockfd)
                }else {     //不是listenfd有數據流入,而是之前加入的sockfd有數據流入
                    
                    //讀取信息
                    read(fd,&msg)
                    
                    //將其挪入加入監控可寫事件的集合
                    add_mem(monitor_set_1,fd)
                }
            }else{  //一個fd變得可寫了
                
                //寫入信息
                write(fd,&msg)
                
                //將其挪入監控可讀的集合
                add_mem(monitor_set_1,fd)
            }
        }
    }
}
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 從庫可以很多台,我們假設一臺主M,一臺從S。 主M配置文件添加: server-id=1 bin-log=logbin 這個名字隨意 記得重啟 從S配置文件添加: server-id=2 配置文件就完成了 在主M客戶端執行: >show master status; 紀錄下文件與位置(File,Po ...
  • info 伺服器基本信息 monitor 實時轉儲收到的請求 flushdb 清空當前資料庫 flushall 清空所有資料庫 quit 關閉連接 save 將數據同步保持到磁碟 bgsave 非同步 lastsave 返回最後一次成功保存數據到磁碟的時間戳 shundown 將數據同步保持到磁碟並關 ...
  • VMware虛擬機中安裝CentOS,進行網路連接,分為兩步,內網連接,與外網連接。 前提: 當你正確安裝VMware後,網路適配器會增加2個新的網卡:(可在設備管理器->網路適配器中查看) 第一步:內網連接在安裝CentOS時就已經開始了 點擊【自定義硬體】,網路適配器->自定義【VMnet8(N ...
  • 參考博客: http://www.aiuxian.com/article/p-705047.html http://blog.csdn.net/u013232419/article/details/45201437 contiki大神Jelline的博客:http://blog.chinaunix. ...
  • 第十單元 系統的初始化和服務 Linux系統引導的順序 Linux系統引導的順序 BOIS的初始化和引導載入程式 什麼是BIOS GRUB程式和grub.conf文件 什麼是grub grub配置文件grub.conf 內核的初始化和init的初始化 init的配置文件/etc/inittab in ...
  • chkconfig的級別: 0:關機 1:單用戶模式 2:無網路支持的多用戶模式 3:有網路支持的多用戶模式 4:保留,未使用 5:有網路支持有X-Windows(圖形界面)支持的多用戶模式 6:重新引導系統,即重啟 開機不重啟: #chkconfig server off server 0:off ...
  • vi編輯器簡介 什麼是vi vi編輯器的操作模式 vi編輯器的3種基本模式 在vi編輯器中游標的移動 移動游標位置的鍵與游標移動間的關係 進入插入模式 從命令行模式進入插入模式的命令 在命令行模式下刪除與複製的操作 刪除與複製命令 粘貼命令 複原和重做命令 擴展模式與文件的存儲和退出 擴展模式下常用 ...
  • tcpip協議使用"流式"(套接字)進行數據的傳輸,就是說它保證數據的可達以及數據抵達的順序,但並不保證數據是否在你接收的時候就到達,特別是為了提高效率,充分利用帶寬,底層會使用緩存技術,具體的說就是使用Nagle演算法將小的數據包放到一起發送,但是這樣也帶來一個使用上的問題——黏包,黏包就是說一次將 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...