TCP并发服务器构建

  • 单循环服务器:服务端同一时刻只能处理一个客户端的任务
  • 并发服务器:服务端同一时刻可以处理多个客户端的任务
  • TCP服务端并发模型
    • 多进程
  • 进程资源开销大,安全性高
    • 多线程
  • 线程相对于进程资源开销小,相同资源环境下,并发量比进程大
    • 线程池
      • 为了解决多进程多线程模型在服务器运行过程中,频繁创建和销毁进程线程带来的时间消耗问题
      • 基于生产者和消费者编程模型,以及任务队列,实现的一套多线程框架
    • IO多路复用
      • 对多个文件描述符的读写可以复用一个进程

      • 在不创建新的进程线程的前提下,使用一个进程实现对多个文件读写的同时监测

      • select实现IO多路复用

        • 创建文件描述符集合
        • 添加关注的文件描述符到集合
        • 使用select传递集合表给内核,内核开始监测事件
        • 当内核监测到事件时,应用层select将解除阻塞,并获得相关的事件结果
        • 根据select返回的结果做不同的情况处理
      • 函数接口

        • void FD_CLR(int fd, fd_set *set); 从集合中移除描述符
        • int FD_ISSET(int fd,fd_set *set); 检查描述符是否在集合中
        • void FD_SET(int fd, fd_set *set); 添加描述符到集合
        • void FD_ZERO(fd_set *set) 清空集合
        • select :int select(int nfds,fd_set*readfds,fd_set *writefdsfd_set *exceptfds, struct timeval *timeout)
          • 功能:传递文件描述符结合表给内核并等待获取事件结果
          • 参数:
            • nfds:关注的最大文件描述符+1;
            • readfds:读事件的文件描述符集合;
            • writefds:写事件的文件描述符集合;
            • exceptfds:其他事件的文件描述符集合;
            • timeout:设置select监测时的超时时间;NULL:不设置超时时间(select一直阻塞等待)
          • 返回值:成功:返回内核监测的到达事件的个数;失败:-1;0:超时时间到达,但没有事件发生,则返回0
      • select的优缺点

        • 优点:
          • 跨平台:几乎所有Unix-like系统都支持
          • 简单易用:API相对简单,易于理解
          • 超时控制:可以设置精确的超时时间
        • 缺点:
          • 性能问题:每次调用都需要遍历所有描述符
          • 描述符限制:FD_SETSIZE通常限制为1024
          • 内存拷贝:每次调用都需要在用户空间和内核空间之间拷贝fd_set
          • 线性扫描:需要遍历所有描述符来检查状态
相关推荐
利刃大大21 分钟前
【高并发服务器:HTTP应用】十四、Util工具类的设计与实现
服务器·http·高并发·项目·cpp
zhanglianzhao24 分钟前
基于云服务器自建Rustdesk远程桌面——以京东云为例
运维·服务器·京东云
可乐大数据36 分钟前
Docker安装(基于云服务器ECS实例 CentOS 7.9系统)
服务器·docker·centos
菲兹园长44 分钟前
微服务组件(E、L、N、O、G)
linux·服务器·gateway
喝杯牛奶丶1 小时前
MySQL隔离级别:大厂为何偏爱RC?
java·数据库·mysql·面试
一 乐1 小时前
二手车销售|汽车销售|基于SprinBoot+vue的二手车交易系统(源码+数据库+文档)
java·前端·数据库·vue.js·后端·汽车
Databend1 小时前
BendSQL v0.30.3 Web UI 功能介绍
数据库
LBuffer1 小时前
破解入门学习笔记题二十五
服务器·前端·microsoft
gAlAxy...1 小时前
Spring 从 0 → 1 保姆级笔记:IOC、DI、多配置、Bean 生命周期一次讲透
数据库·sqlserver
richxu202510012 小时前
Linux本地部署deepseek大模型之 6. Windows本地连接远程云服务器中的MySQL常见错误的解决办法
linux·服务器·windows