网络编程 -- 服务器端的多线程、多进程、I/O复用比较
来源:互联网 发布:难忘网络真情意 编辑:程序博客网 时间:2024/05/22 17:51
一、多线程
多线程模型适用于处理短连接,且连接的打开关闭非常频繁的情形,但不适合处理长连接。多线程模型默认情况下,(在Linux)每个线程会开8M的栈空间,再TCP长连接的情况下,2000/分钟的请求,几乎可以假定有上万甚至十几万的并发连接,假定有10000个连接,开这么多个线程需要10000*8M=80G的内存空间!即使调整每个线程的栈空间,也很难满足更多的需求。甚至攻击者可以利用这一点发动DDoS,只要一个连接连上服务器什么也不做,就能吃掉服务器几M的内存,这不同于多进程模型,线程间内存无法共享,因为所有线程处在同一个地址空间中。内存是多线程模型的软肋。
二、多进程
在UNIX平台下多进程模型擅长处理并发长连接,但却不适用于连接频繁产生和关闭的情形。Windows平台忽略此项。 同样的连接需要的内存数量并不比多线程模型少,但是得益于操作系统虚拟内存的Copy on Write机制,fork产生的进程和父进程共享了很大一部分物理内存。但是多进程模型在执行效率上太低,接受一个连接需要几百个时钟周期,产生一个进程 可能消耗几万个CPU时钟周期,两者的开销不成比例。而且由于每个进程的地址空间是独立的,如果需要进行进程间通信的话,只能使用IPC进行进程间通 信,而不能直接对内存进行访问。在CPU能力不足的情况下同样容易遭受DDos,攻击者只需要连上服务器,然后立刻关闭连接,服务端则需要打开一个进程再关闭。三、I/O复用
同时需要保持很多的长连接,而且连接的开关很频繁,最高效的模型是非阻塞、异步IO模型。而且不要用select/poll,这两个API的有着O(N)的时间复杂度。在Linux用epoll,BSD用kqueue,Windows用IOCP,或者用libevent封装的统一接口(对于不同平台libevent实现时采用各个平台特有的API),这些平台特有的API时间复杂度为O(1)。 然而在非阻塞,异步I/O模型下的编程是非常痛苦的。由于I/O操作不再阻塞,报文的解析需要小心翼翼,并且需要亲自管理维护每个链接的状态。并且为了充分利用CPU,还应结合线程池,避免在轮询线程中处理业务逻辑。
1 0
- 网络编程 -- 服务器端的多线程、多进程、I/O复用比较
- windows网络编程(八)——重叠I/O+多线程实现简单的聊天(windows服务器端 windows客户端)
- linux编程---网络编程之复用I/O模型
- core java 10~12(多线程 & I/O & Network网络编程)
- 网络编程的I/O模式
- Linux网络编程之I/O复用循环服务器
- Linux网络编程之I/O复用循环服务器
- Linux网络编程之I/O复用循环服务器
- 网络编程API-下 (I/O复用函数)
- 网络编程I/O复用方法详解
- Linux网络编程---I/O复用模型之select
- Linux网络编程---I/O复用模型之poll
- Linux网络编程---I/O复用模型之epoll
- 网络编程中I/O复用模型
- 网络编程之I/O复用模型select
- Linux网络编程--单进程服务器处理多客户请求(I/O复用)
- select服务器端的代码以及select的优缺点与多线程多进程服务器的比较
- Python网络编程中的select 和 poll I/O复用的简单使用
- 前端日记 #4 - canvas
- Qt 简单去掉对话框最大化、最小化按钮
- 详解Python中的is和==
- Ruby 和 Python 相比有什么优势和缺陷
- C语言------练习题
- 网络编程 -- 服务器端的多线程、多进程、I/O复用比较
- maven 学习
- unexpected inconsistency run fsck manully
- [poj2945] 找出克隆人
- 神经网络进阶(连载2)为机器人提供一存储器
- 2017年1月21日学习笔记 Spring是什么?
- Java语言程序设计基础(一)
- NOWL #50
- 名称空间与作用域