多进程模型、多线程模型
- 多进程模型
- 每接受一个连接就fork一个子进程,在该子进程中处理该连接的请求
- 特点是多进程占用系统资源多,进程切换的系统开销大,Linux下最大进程数有限制,不利于处理大并发
- 多线程模型
- 每接受一个连接就create一个子线程,利用子线程处理这个连接的请求
- Linux下有最大线程数限制(进程虚拟地址空间有限),进程频繁创建和销毁造成系统开销,同样不利于处理大并发
- 优缺点
- 多进程
- 编程相对容易;通常不需要考虑锁和同步资源的问题
- 更强的容错性:比起多线程的一个好处是一个进程崩溃了不会影响其他进程
- 有内核保证的隔离:数据和错误隔离
- 进程切换开销大
- 多线程
- 创建速度快
- 共享数据,多线程间可以共享同一虚拟地址空间,多进程间的数据共享就需要用到共享内存、信号量等IPC技术
- 较轻的上下文切换开销
- 一旦有一个线程挂掉,整个进程都可能会挂掉
- 需要对共享资源的访问进行同步
- 多进程
事件驱动模型
简介
- Linux下基于select、poll或epoll实现
- 程序的基本结构是一个事件循环结合非阻塞IO,以事件驱动和事件回调的方式实现业务逻辑,目前在高性能的网络程序中,使用得最广泛的就是这种并发模型
- 结合线程池,避免线程频繁创建和销毁的开销,能很好地处理高并发
- 事件驱动模型使得我们可以在一个线程内处理多个客户端的事件,省去了频繁创建销毁进程或线程的开销,结合非阻塞IO能够做到不使程序阻塞在某个描述符的读写操作上
I/O多路复用
I/O多路复用使得程序能同时监听多个文件描述符,在一个或更多文件描述符就绪前始终处于睡眠状态。Linux下的I/O复用方案有select、poll和epoll
- select
#include <sys/time.h>