select多路復用壓力測試

2021-10-10 07:12:33 字數 4502 閱讀 1450

1、shell指令碼

#!

/bin/bash

#!/bin/bash

for(

(i=1

;i<=

1100

;i=i+1)

)do./a &

echo "$i"

sleep 0.005

done

echo "***************************8"

cat test.log | grep "f"

|wc -l

cat test.log | grep "o"

|wc -l

echo "***************************"

2、客戶端**
#include

#include

#include

#include

#include

#include

/* see notes */

#include

#include

#include

#include

#include

#define msg "hello"

intmain()

//printf("create socket is successful:[%d]\n",cli_fd);if(

connect

(cli_fd,

(struct sockaddr *

)&cli_addr,

sizeof

(cli_addr)

)<0)

//printf("connect is successful\n");

/* rv = read(cli_fd, buf, sizeof(buf));

if(rv <0)

printf("data is :[%s]",buf);

*/if(

write

(cli_fd,

&msg,

sizeof

(msg)

)<0)

// printf("write is successful,\n");

memset

(buf,0,

sizeof

(buf));

rv =

read

(cli_fd, buf,

sizeof

(buf));

if(rv<0)

// printf("read is successful,data is [%s]\n",buf);

printf

("ok");

close

(cli_fd)

;exit(0);}

3、select**
#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define array_size(x) (sizeof(x)/sizeof(x[0]))

//求陣列元素的個數

static

inline

void

msleep

(unsigned

long ms)

;int

socket_server_init

(char

*listen_ip,

int listen_port)

;int main (

int argc,

char

**ar**)

printf

("%s server start to listen on port %d\n"

,"59.110.42.24"

,serv_port)

;for

(i=0

; i<

array_size

(fds_arry)

; i++

)//遍歷陣列

fds_arry[0]

= listenfd;

//將第乙個陣列賦值為listenfd

for(;;

) rv =

select

(maxfd+1,

&rdset,

null

,null

,null);

//select函式的返回值是就緒描述符的數目

if(rv <0)

else

if( rv ==0)

if(fd_isset

(listenfd,

&rdset)

)//判斷指定描述符是否在集合中

found =0;

for(i=

0; i<

array_size

(fds_arry)

;i++)}

if(!found)

}else

memset

(buf,0,

sizeof

(buf));

rv =

read

(fds_arry[i]

,buf,

sizeof

(buf));

if( rv <0)

else

if(rv ==0)

elseif(

write

(fds_arry[i]

, buf , rv)

<0)

}}}}

cleanup:

close

(listenfd)

;return0;

}static

inline

void

msleep

(unsigned

long ms)

intsocket_server_init

(char

*listen_ip,

int listen_port)

setsockopt

(listenfd, sol_socket, so_reuseaddr,

&on,

sizeof

(on));

memset

(&servaddr,0,

sizeof

(servaddr));

servaddr.sin_family=af_inet;

servaddr.sin_port =

htons

(listen_port);if

(!listen_ip )

else}if

(bind

(listenfd,

(struct sockaddr *

)&servaddr,

sizeof

(servaddr)

)<0)

if(listen

(listenfd,13)

<0)

cleanup:

if(rv <0)

close

(listenfd)

;else

rv = listenfd;

return rv;

}

select 實現過程是這樣的

max就是描述符中最大的哪乙個,比如上面的圖最大的就是10,將要連線的客戶端放入fd_set中,然後用select阻塞,接著如果有乙個或者多個客戶端來了資料,select就將&rset相應的位置1,其他全部位0,比如描述符是10,和11,那麼就在&rset 10和11位置1,其他全部為0 .這樣做的目的是後面會進行乙個fd_isset判斷描述符在&rset是否存在,如果存在才能進行讀取資料。

缺點

1、只能最多建立1024個描述符。(可修改)

2、每次都要進行乙個複雜度位o(n)的迴圈

3、每次rset都需要重新復位

4、開銷大,他的描述符會從使用者態拷貝到核心態

但是select還是有缺點的,比如每次rset都需要重新復位,而且rset的位只有1024個,也就是說只能最多建立1024個描述符,不過這個可以修改,最後的缺點是每次都要進行乙個複雜度位o(n)的迴圈,就是這個迴圈c for(i=0;i,但是效能最後還是不錯的。經過測試1100個客戶端連線正常連線的達到1043個

poll多路復用壓力測試

前面幾篇文章已經實現了shell指令碼執行和客戶端的 我就不多寫了,直接上poll poll include include include include include include include include include include include include include...

epoll多路復用壓力測試

epoll相對於select poll效能優越相當之多,可以說是二者結合加強版本,我們可以設想一下,假如有100w個tcp連線,那麼每次有資料過來了,select poll都需要去從第乙個到最後乙個進行依次遍歷,而epoll會講佇列排序講發生事件放在前面,後面的就不用遍歷了,所以準確的說處理幾千的連...

多路復用 select

在之前寫過一篇五種i o模型,感興趣的可以去看一下,今天主要講其中的一種,那就是i o多路復用。因為i o多路復用可以使乙個程序同時處理多個連線。這對提高程式的效能至關重要。對於io復用的概念與理解在上文說的挺清楚了。本文主要說實現io復用的系統呼叫。在linux下,實現io復用的系統呼叫主要有三個...