服务器并发处理几种模式:基本服务模式、多进程、多线程、I/O多路复用

1、基本服务模式

对于网络中数据交互的双方,请求数据的称为客户端(client),接受请求并进行处理的为服务端(server)。服务端调用socket创建监听套接字,通过bind函数监听本地的指定端口,最后使用listen 函数阻塞等待客户端请求的到来。相应的客户端,在创建好socket 之后,调用connect 主动发起连接。连接的建立过程需要进行TCP 传输协议层的三次握手,成功建立后便可进行数据双向传输。

2、多进程模式

进程指计算机中占据内存正在运行的一个独立程序。多进程的服务器设计模型,也就是对于每一个客户端连接都创建一个新的子进程来进行连接处理,以及后续的IO 请求,这种模式通常以process-per-connection 简称之。在操作系统中进程拥有自己独立的地址内存空间,每个子进程独立处理一个客户请求,相互之间不干扰,达到并发的效果。在多进程服务器中,父进程会持续进行端口的监听工作,每当客户端的连接请求到来,立刻fork 对应的新子进程进行处理。对于高并发连接请求,会使服务器充斥着大量进程,消耗大量内存资源,同时CPU 也会忙于进程间切换而服务响应速度降低。

3、多线程模式

多线程的并发服务器模型初始化开销要比多进程少很多。作为轻量级的进程,线程创建的速度比进程要快10-100 倍。一个进程的地址空间由该进程内的所有线程共享,在不占据大量地址空间的同时共享数据,便于信息传输。由于线程是操作系统最基本的调度单元,所以它可以充分发挥现代多核CPU 的性能,达到并发效果。类似于多进程设计,多线程服务器通常分配一个主线程完成客户端的连接请求,进行三次握手的连接过程;对于已连接的事件,创建一个新的线程来进行实际数据的IO 过程,线程与客户连接一一对应,依据多核CPU 实现并发,同时服务于多个客户,通常以thread-per-connection 简称之。不过对于高并发短连接请求服务,其连接上限同样受到系统线程数的限制,成千上万的并发量势必会影响到处理速度。

4、I/O 多路复用

在实际的工程应用中,网络应用场景是十分复杂的。例如:客户需要同时处理多个描述符事件,在完成网络套接字事件的同时处理数据交互输入;Tcp 服务器既要完成套接字监听,又要处理已连接的交互套接字;既要处理Tcp,又要处理Udp...这些场合都意味着服务器需要同时关注多个I/O 条件是否就绪,并及时通知给进程,从而进行相应的数据操作,这称为I/O 多路复用。对于这种情形,操作系统在早期便提供了select 和poll 这两个函数来完成。对于处理大规模并发连接,现代类UNIX 操作系统提供的epoll、event ports 和kqueue 则更加高效。不同于多进程或多线程模式下的阻塞式I/O 模型,I/O 复用方式只会使进程受阻于select 或epoll 的函数调用,等待多个套接字中的任一个就绪,避免在实际的I/O 数据读写时发生阻塞。其优势在于可以同时等待多个描述符就绪,一旦有任意一个响应送达就会立即返回进行有效事件的处理,高效处理复杂场合中的多个事件。

猜你喜欢

转载自blog.csdn.net/lijie45655/article/details/129715346
今日推荐