马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
刷题
服务器多客户端连接核心要点
多进程服务器
实现原理
- fork子进程:每次accept新客户端后,调用fork创建子进程。
- 独立处理:子进程负责与客户端通信(如read/write),父进程继续监听新连接。
特点
- 隔离性高:进程间资源独立,制止数据竞争。
- 资源消耗大:频仍创建进程导致内存和CPU开销高。
多线程服务器
实现原理
- 创建新线程:accept后生成线程处理客户端哀求。
- 线程函数:在线程内执行read/write利用。
特点
- 轻量级:线程共享进程资源,开销低于进程。
- 需同步机制:需使用互斥锁(mutex)或信号量制止数据竞争。
多路I/O模子
核心题目
- 壅闭冲突:传统accept和read相互壅闭,无法同时处理多客户端。
- 解决方案:通过非壅闭模子(select/poll)同一监听所有描述符。
Select模子
流程
- fd_set read_fds;
- FD_ZERO(&read_fds); // 清空列表
- FD_SET(server_fd, &read_fds); // 添加服务端套接字
复制代码
- 循环监听:
- select(max_fd + 1, &read_fds, NULL, NULL, NULL); // 阻塞直至描述符激活
复制代码 - 处理激活描述符:
- 遍历描述符,通过FD_ISSET判断是否激活。
- 服务端套接字激活:调用accept接受新客户端。
- 客户端套接字激活:调用read读取数据。
缺点
- 服从低:每次调用需遍历所有描述符。
- 监视列表上限:默认限制1024个描述符。
Poll模子
流程
- struct pollfd fds[MAX_CLIENTS];
- fds[0].fd = server_fd;
- fds[0].events = POLLIN; // 监视可读事件
复制代码
- 循环监听:
- poll(fds, nfds, -1); // 永久阻塞直至事件触发
复制代码 - 处理激活描述符:
- 遍历fds数组,检查revents是否为POLLIN。
- 服务端激活:accept新客户端并加入列表。
- 客户端激活:read数据并相应。
优点
- 无描述符数目限制:支持动态扩展。
- 事件类型机动:可同时监视读写和非常事件。
模子对比
特性SelectPoll描述符上限1024(系统默认)无限制服从O(n)遍历O(n)遍历事件类型仅可读/可写/非常支持自定义事件(如POLLIN)跨平台支持广泛支持Linux专用 实际应用场景
总结:多进程/线程得当简单场景,多路I/O模子(select/poll)通过非壅闭监听提升服从,需根据并发需求选择模子。
|