青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

小明思考

高性能服務(wù)器端計(jì)算
posts - 70, comments - 428, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理


眾所周知,使用多進(jìn)程的服務(wù)端模型有利于程序的健壯性。傳統(tǒng)的做法是主進(jìn)程負(fù)責(zé)收發(fā)數(shù)據(jù),然后傳給子進(jìn)程來處理。這種做法的缺陷是需要大量的父子進(jìn)程IPC,對(duì)效率來說是一種損失。

這里,我提出另外一種比較獨(dú)特的做法,就是多個(gè)進(jìn)程share socket,每次進(jìn)程都可以accept,然后來自己處理。

幾個(gè)關(guān)鍵點(diǎn):
1) CreateProcess使用InheritHandle標(biāo)記來share socket handle
2) 通過command line直接向子進(jìn)程來傳遞父socket的值
3)使用Global Mutext來實(shí)現(xiàn)子進(jìn)程互斥的accept

可以改進(jìn)的地方
1) 使用動(dòng)態(tài)進(jìn)程池來程序具有更大的伸縮性
2)監(jiān)控子進(jìn)程的狀態(tài),處理僵死進(jìn)程

下面是一個(gè)echo server 的例子來展示這項(xiàng)技術(shù), FYI

父進(jìn)程(SSParent.cpp)

#include <stdio.h>
#include 
<winsock2.h>
#include 
<windows.h>
#include 
<process.h>

#define MUTEX_NAME "sschild"

int main(int argc, char* argv[])
{
    { 
//init
        WORD wVersionRequested;
        WSADATA wsaData;
        wVersionRequested 
= MAKEWORD( 22 );
        WSAStartup( wVersionRequested, 
&wsaData );
    }

    SOCKET s 
= socket(AF_INET,SOCK_STREAM,0);
    
if(s==INVALID_SOCKET)
    {
        printf(
"create socket failed!\n");
        
return -1;
    }

    { 
//bind&listen
        sockaddr_in sa;
        sa.sin_family 
= AF_INET;
        sa.sin_port 
= htons( 1500 );
        sa.sin_addr.s_addr 
= 0 ; 
        
int rc = bind(s,(sockaddr *)&sa,sizeof(sa));
        
if(rc == SOCKET_ERROR)
        {
            printf(
"bind failed:%d\n",::WSAGetLastError());
            
return -1;
        }
        listen(s,SOMAXCONN);
    }

    HANDLE hSocketMutex;
    { 
//create mutex
        hSocketMutex = ::CreateMutex(NULL,FALSE,MUTEX_NAME);
        
if(hSocketMutex==NULL)
        {
            printf(
"fail CreateMutex:%d\n",::GetLastError());
            
return -1;
        }
    }

    
const int CHILD_NUMBER = 5;
    HANDLE hProcess[CHILD_NUMBER];
    { 
//create child process
       STARTUPINFO si = { sizeof(si) };
       PROCESS_INFORMATION piProcess[CHILD_NUMBER];
       
char pCmdLine[256];
       sprintf(pCmdLine,
"SSChild %d",s);
       
for(int i=0;i<CHILD_NUMBER;++i)
       {
           
if(!CreateProcess(NULL,pCmdLine,NULL,NULL,TRUE,0, NULL, NULL, &si, &piProcess[i]))
           {
               printf(
"fail CreateProcess:%d\n",::GetLastError());
               
return -1;
           }
           hProcess[i] 
= piProcess[i].hProcess;
           CloseHandle(piProcess[i].hThread);
       }
    }

    ::WaitForMultipleObjects(CHILD_NUMBER,hProcess,TRUE,INFINITE);

    {
//close all child handle
       for(int i=0;i<CHILD_NUMBER;++i)
       {
           CloseHandle(hProcess[i]);
       }
    }

    
//clean
    CloseHandle(hSocketMutex);
    closesocket(s);
    WSACleanup( );
    
return 0;
}

 

子進(jìn)程(SSChild.cpp)

#include <stdio.h>
#include 
<winsock2.h>
#include 
<windows.h>
#include 
<process.h>

#define MUTEX_NAME "sschild"

int main(int argc, char* argv[])
{
    printf(
"sschild startup!\n");

    { 
//init
        WORD wVersionRequested;
        WSADATA wsaData;
        wVersionRequested 
= MAKEWORD( 22 );
        WSAStartup( wVersionRequested, 
&wsaData );
    }

    DWORD pid 
= ::GetCurrentProcessId();

    HANDLE hSocketMutex;
    { 
//open mutex
        hSocketMutex = ::OpenMutex(MUTEX_ALL_ACCESS,FALSE,MUTEX_NAME);
        
if(hSocketMutex==NULL)
        {
            printf(
"fail OpenMutex:%d\n",::GetLastError());
            
return -1;
        }
    }

    SOCKET s;
    {  
//get socket handle from cmdline
        if(argc<=1)
        {
            printf(
"usage: sschild socket_handle\n");
            
return -1;
        }
        s 
= (SOCKET) atoi(argv[1]);
    }

    
while(1)
    {
        WaitForSingleObject(hSocketMutex,INFINITE);
        sockaddr_in sa;
        
int add_len = sizeof(sa);
        SOCKET c 
= accept(s,(sockaddr*)&sa,&add_len);
        ReleaseMutex(hSocketMutex);
        
if(c!=INVALID_SOCKET)
        {
            printf(
"[%d],client:%s port:%d connected!\n",pid,inet_ntoa(sa.sin_addr),sa.sin_port);
            
while(1)
            {
                
char buffer[256]={0};
                
int rc= recv(c,buffer,255,0);
                
if(rc>0)
                {
                    printf(
"[%d]recv msg:%s\n",pid,buffer);
                    send(c,buffer,strlen(buffer)
+1,0);
                }
                
else if(rc == SOCKET_ERROR)
                {
                    printf(
"[%d]recv msg failed:%d\n",pid,::WSAGetLastError());
                    closesocket(c);
                    
break;
                }
                
else
                {
                    printf(
"[%d]connection close\n",pid);
                    closesocket(c);
                    
break;
                }
            }
        }
        
else
        {
            printf(
"[%d]fail accept:%d\n",pid,::WSAGetLastError());
        }
    }

    CloseHandle(hSocketMutex);
    
return 0;
}

Feedback

# re: 多進(jìn)程服務(wù)端實(shí)現(xiàn)-共享socket[未登錄]  回復(fù)  更多評(píng)論   

2008-03-10 14:42 by cppexplore
“這里,我提出另外一種比較獨(dú)特的做法,就是......”
呵呵,兄弟啊,我畢業(yè)答辯的時(shí)候,老師就反復(fù)的批評(píng)我們,“我提出.......”,“我發(fā)明......”之類的東西。
文中就是《unix網(wǎng)絡(luò)編程》中的預(yù)派生進(jìn)程阻塞在accept的方式嘛。
并且書中說明這種問題有驚群?jiǎn)栴},可以前面加文件鎖或者線程鎖互斥,你文中加的是互斥鎖。現(xiàn)在的linux從2.2.9版本起就不存在驚群?jiǎn)栴}而不需要加鎖了,更好的是2.6內(nèi)核的線程庫中線程鎖不陷入互斥狀態(tài)的話就不會(huì)陷入內(nèi)核態(tài)了,加不加性能一樣。而win就沒有這么好的線程鎖。
多進(jìn)程方式編程簡(jiǎn)單,程序健壯性相對(duì)比較好,但是切換開銷比較大。現(xiàn)在的更傾向于預(yù)派生線程的方式。
另可以,起多個(gè)多線程的程序,bind不同port,前端部署lvs提供均衡負(fù)載一樣可以達(dá)到更好的多進(jìn)程效果。

# re: 多進(jìn)程服務(wù)端實(shí)現(xiàn)-共享socket  回復(fù)  更多評(píng)論   

2008-07-06 02:12 by 放屁啊狗
windows的socket只能說是個(gè)小玩藝兒,跟unix下的socket簡(jiǎn)直無法比擬,可見windows只能做desktop系統(tǒng)

# re: 多進(jìn)程服務(wù)端實(shí)現(xiàn)-共享socket[未登錄]  回復(fù)  更多評(píng)論   

2009-05-03 16:43 by sun
hProcess[i] = piProcess[i].hProcess;
piProcess[i].hProcess狀態(tài)改變,hProcess[i]狀態(tài)也改變?
仍沒弄明白
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国一区二区在线观看| 午夜精品一区二区三区在线播放| 亚洲国产高清一区| 韩国av一区二区| 亚洲国产精品va| 亚洲精品在线免费| 99国产精品99久久久久久粉嫩| 亚洲国产你懂的| 国产精品99久久久久久白浆小说 | 91久久精品www人人做人人爽| 在线日韩中文| 日韩视频免费| 亚洲欧美影音先锋| 另类综合日韩欧美亚洲| 欧美国产视频日韩| 一区二区高清在线| 欧美在线观看网站| 欧美国产日韩xxxxx| 国产精品久久久久久久久免费桃花 | 欧美成人精品影院| 欧美三级特黄| 国产一区二区三区在线免费观看 | 亚洲动漫精品| 这里只有精品电影| 久久久欧美精品sm网站| 亚洲电影观看| 亚洲一区二区三区精品在线观看| 午夜久久99| 欧美国产欧美综合 | 亚洲午夜视频| 久久这里有精品15一区二区三区| 亚洲国产乱码最新视频| 亚洲一区二区三区高清| 老司机凹凸av亚洲导航| 国产精品v片在线观看不卡| 国内外成人免费激情在线视频| 亚洲日本中文字幕免费在线不卡| 欧美日韩精品欧美日韩精品| 国产欧美午夜| 亚洲已满18点击进入久久| 久久中文精品| 午夜日韩福利| 国产精品日韩电影| 亚洲私人影院| 日韩视频免费观看| 欧美人妖在线观看| 亚洲精品一区二区三区99| 久久一区中文字幕| 午夜在线视频观看日韩17c| 国产精品theporn88| 一个色综合av| 亚洲精品小视频| 欧美成人午夜视频| 亚洲激情专区| 欧美福利视频在线观看| 久久久久久久999| 国产专区精品视频| 久久欧美中文字幕| 久久精品国产亚洲一区二区| 国产一区日韩欧美| 久久久免费精品| 久久精品免费电影| 亚洲国产成人精品久久| 欧美国产精品va在线观看| 老司机一区二区三区| 亚洲激情av| 亚洲精品日韩一| 欧美性做爰毛片| 欧美一区二区三区久久精品茉莉花| 亚洲视频1区| 国产日韩一区欧美| 免费91麻豆精品国产自产在线观看| 久久精品欧美| 亚洲另类在线一区| 亚洲精品少妇30p| 国产精品狼人久久影院观看方式| 午夜视频久久久| 久久久精品午夜少妇| 亚洲国产欧美一区| 日韩一级大片在线| 国产婷婷色一区二区三区| 老司机一区二区三区| 欧美国产成人精品| 亚洲午夜在线观看| 欧美影院视频| 亚洲精品美女久久7777777| 亚洲精品在线三区| 国产欧美日韩综合一区在线观看 | 欧美日韩情趣电影| 性欧美video另类hd性玩具| 久久国产精品99久久久久久老狼| 亚洲福利视频免费观看| 亚洲免费成人av| 亚洲欧洲一区二区在线观看| 欧美日韩在线视频一区二区| 久久国产精品毛片| 亚洲丰满少妇videoshd| 欧美人交a欧美精品| 久久国产精品黑丝| 欧美成熟视频| 欧美一区2区三区4区公司二百| 久久一区精品| 久久www成人_看片免费不卡| 欧美成人自拍视频| 久久精品国产69国产精品亚洲| 欧美.日韩.国产.一区.二区| 午夜日韩av| 欧美伦理91| 欧美/亚洲一区| 国产日韩欧美在线观看| 亚洲欧洲视频在线| 在线免费日韩片| 亚洲在线成人精品| 亚洲精品中文在线| 玖玖玖国产精品| 久久久综合精品| 国产精品久久久久高潮| 亚洲黄色一区二区三区| 在线观看视频一区| 性做久久久久久久免费看| 亚洲少妇一区| 欧美久久久久免费| 欧美激情一区在线观看| 狠狠久久亚洲欧美专区| 亚洲综合视频一区| 午夜欧美大尺度福利影院在线看| 欧美片在线播放| 91久久在线| 99视频一区二区| 欧美精品久久久久a| 亚洲国产高潮在线观看| 亚洲福利专区| 久久精品日韩| 免费av成人在线| 亚洲国产精品久久久久久女王| 久久成人在线| 久久尤物视频| 亚洲国产第一页| 久久综合99re88久久爱| 久久亚洲精品中文字幕冲田杏梨| 国产偷自视频区视频一区二区| 亚洲女性喷水在线观看一区| 亚洲欧美精品在线| 国产精品一区免费观看| 亚洲一区免费| 久久精品视频va| 在线观看欧美一区| 欧美va亚洲va香蕉在线| 亚洲黄色在线| 亚洲一区二区综合| 国产麻豆综合| 久久婷婷色综合| 亚洲国产精品第一区二区三区| 99精品视频免费全部在线| 欧美日韩一区二区在线| 亚洲调教视频在线观看| 久久福利一区| 亚洲国产天堂久久综合网| 欧美激情亚洲自拍| 亚洲一区二区在线播放| 久久免费一区| 一区二区三区欧美亚洲| 国产麻豆视频精品| 欧美xart系列高清| 亚洲欧美国产精品桃花 | 午夜在线成人av| 国产在线拍偷自揄拍精品| 久久国产精品免费一区| 亚洲成在线观看| 午夜精品一区二区三区电影天堂| 国产日韩欧美三区| 欧美国产日本| 午夜精品免费在线| 亚洲高清三级视频| 午夜久久一区| 亚洲精品乱码久久久久久黑人| 国产精品mv在线观看| 久久午夜电影网| 亚洲午夜视频在线| 欧美激情91| 久久久国产精品一区二区三区| 亚洲精品中文字| 狠狠久久亚洲欧美专区| 欧美日韩亚洲高清一区二区| 久久久久久高潮国产精品视| av72成人在线| 亚洲大胆av| 久久青草久久| 午夜一区二区三区在线观看| 亚洲精品免费在线观看| 国产在线国偷精品产拍免费yy| 欧美视频中文字幕| 欧美α欧美αv大片| 久久久999国产| 午夜欧美精品| 亚洲午夜久久久| av成人福利| 亚洲精品专区| 亚洲欧洲精品成人久久奇米网| 麻豆成人av|