|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在上一节,我们介绍了Linux简单的并发服务器,通过在服务器端建立多个子进程,来接收客户端的请求,实现并发处理,但这种方式明显有缺陷,服务器并不知道客户端请求的数量,所以事先建立的进程数不好确定。所以,这里介绍三种高级并发服务器模式。第一种是服务器端统一accept,接收客户端的到来,然后为每个客户端分配一个进程去处理. 第二种是统一accept接收请求,然后为每个客户端分配一个线程去处理。第三种建立多个线程去处理客户端请求,每个线程独自监听客户端的请求。显然,第一种方案解决了简单服务器的并发问题。第二种方案其实是对第一种方案的改进,因为线程切换的开销明显要小于进程切换的开销。第三种方案就是原来用进程去处理每个请求,现在换成用线程去处理,个人认为改进不是很大。4 s9 }& c4 ]8 c& ^
/ u6 t, J' C5 i) g/ ]: b- A. i2. 高级并发服务器算法流程6 I! V; N4 E8 `2 U/ c
4 d" y" |0 g& t
(1)统一accept,多进程
' R( f& S; O8 Y7 K. \: q3 o! w3 N4 V6 E/ R
socket(...);
3 y9 l! I, G5 Q9 k3 U% {
, A" L; y) M& N2 f8 Q' f, b$ O bind(...);4 l4 v/ D% s% B* `
* g- |# I6 m& ^3 l2 [ listen(...);* H$ {9 j5 g' L I0 ^
7 S. e: w5 Z0 C7 M' w( _
while(1){6 _/ Q) K2 s' h& u! f' {2 W
( ?3 A$ b: Q6 k1 m+ l
accept(...);
. W$ o) S0 b7 n) ^7 \( ?2 K
: Y( D# J$ A+ c! b: p fork(...);//子进程
9 U$ Q( }$ i. V4 s# i8 U" T: W1 h4 I! v: N& t( u) R, A
}0 f; i1 j% F7 y6 [7 j5 s$ x
2 e& z D: k6 z. M
close(...);//关闭服务器套接字1 _& w' f6 K+ [$ a" P, V
# a, t$ s7 M3 `* [" C1 }
子进程:
% P+ u( r' H, F4 o
! E7 t2 f. F, L: x/ A/ v1 W; m3 r G) {; T _ i
: ], \& x4 k' ^) w2 b7 t S) N6 f* I" ], F
|
|