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
          • 线性扫描:需要遍历所有描述符来检查状态
相关推荐
许彰午10 分钟前
01-Oracle 19c静默安装全流程
数据库·oracle
许彰午15 分钟前
02-Oracle连接池配置实战
数据库·oracle
Flandern111116 分钟前
HTTPS(TLS 1.3)完整流程
数据库·网络协议·计算机网络·https
Bonnie_121525 分钟前
Navicat Premium连接sql server数据库
数据库
其实防守也摸鱼1 小时前
前端应用的离线暂停更新策略:构建稳定可靠的渐进式部署方案
服务器·前端·数据库·学习·ai·命令行·linux系统
Android系统攻城狮1 小时前
Linux PipeWire深度解析之pw_context_add_spa_lib调用流程与实战(二十九)
linux·运维·服务器·音频进阶·pipewire音频进阶
Leighteen1 小时前
ORDER BY + LIMIT 的坑:为什么加了 `LIMIT` 结果顺序还乱
数据库
Dovis(誓平步青云)1 小时前
《如何在CentOS 7中添加Plex官方软件源:解决文件磁盘难管理难题》
linux·运维·服务器·后端·生成对抗网络·centos
一个天蝎座 白勺 程序猿1 小时前
复盘之我在金仓生产环境踩过的SQL暗坑,和攒了六年的编码规矩
数据库·sql·kingbasees