当前位置: 首页 > news >正文

服务器并发模型

服务器:

单循环服务器:服务器在同一时刻只能响应一个客户端的请求

并发服务器模型:服务器在同一时刻可以响应多个客户端的请求
 

UDP:无连接
    
    TCP:有连接
    1.多进程
        资源空间消耗大
        效率低

    2.多线程
        相对进程资源消耗小
        效率较高
    3.IO多路复用:
      为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,
      使进程不阻塞于某个特定的 I/O 系统调用。
     优势:
        系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程。

多进程并发服务器

 

多线程并发服务器 

Linux系统IO模型:

1.阻塞IO

scnaf
        getchar
        fgets
        gets
        
        read
        recv
        recvfrom
        1.可以实现多任务同步(多个事件相互影响)
        2.可以节省CPU资源开销,提高执行效率
 

2.非阻塞IO

        1. 获取文件描述符属性
            fcntl---------flag      0
        2. 为文件描述符添加非阻塞属性
        3. 设置文件描述符属性
            fcntl

        增加非阻塞属性
        flag = fcntl(0,F_GETFL);
        flag = flag | O_NONBLOCK;
        fcntl(0,F_SETFL,flag);
    
        1.可以访问多个IO事件
        2.配合轮询操作,浪费CPU资源


3.信号驱动IO

        1.实现异步IO操作,节省CPU开销
        2.只能针对比较少的IO事件
        
        
        1)为IO设备增加信号驱动属性
            O_ASYNC
        2)关联SIGIO信号到对应进程
            fcntl(fd, F_SETOWN, getpid());
        3) 注册SIGIO处理函数
            signal

4.多路复用IO

select


         缺点:
            1.select监听文件描述符最大个数为1024    (数组)    
            2.select监听的文件描述符集合在用户层,需要应用层和内核层互相传递数据
            3.select需要循环遍历一次才能找到产生的事件
            4.select只能工作在水平触发模式(低速模式)无法工作在边沿触发模式(高速模式)

 int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);
      功能:
        监听文件描述符集合
      参数:
        nfds:监测的文件描述符上限值(最大文件描述符的值+1)
        readfds:读文件描述符集合
        writefds:写文件描述符集合
        exceptfds:异常条件的描述符集合
        timeout:设置超时时间
            NULL:一直等待
            
      返回值:
        成功返回产生事件文件描述符个数
        失败返回-1 
        定时时间到达仍没有事件产生返回0 
    
       void FD_CLR(int fd, fd_set *set);
       将fd从文件描述符集合中清除
       
       int  FD_ISSET(int fd, fd_set *set);
       判断文件描述符fd是否仍在文件描述符集合中
       
       void FD_SET(int fd, fd_set *set);
       将fd加入文件描述符集合中
        
       void FD_ZERO(fd_set *set);
       文件描述符集合清0 

fcntl

int fcntl(int fd, int cmd, ... /* arg */ );
      功能:
        设置文件描述符属性 
      参数:
        fd:文件描述符 
        cmd:F_GETFL        获得文件描述符属性
            F_SETFL        设置文件描述符属性 
      返回值:
        F_GETFL:
            成功返回获得的属性
            失败返回-1 
        F_SETFL:
            成功返回0 
            失败返回-1 

        O_NONBLOCK   非阻塞
        O_ASYNC      异步方式
        
        修改IO属性:
        1)获取原有属性
        2)增加新的属性
        3)设置新的属性

注意:文件属性是直接设置完成的,设置完成后就算去掉代码行,依旧会保留上一次更改设置。

 

 select内核监听,当对应的监听内容触发后执行,大大减小了cpu的开支,以扩大服务器的容量。

使用select创建一个无进程和线程的io多路复用服务器,对多用户进行连接。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 互联网家政小程序,为大众带来高效、便捷的服务
  • 多个线程同时调用接口
  • 【Canvas与艺术】六角大楼
  • Windows重装系统「统信UOS」+家庭版专业版选择
  • Python基础知识笔记——特殊符号
  • SQL常用函数
  • W1R3S靶机全通详细教程
  • 【Git】Git概述
  • konvajs绘制带有透明度的多边形
  • 【python】PyQt5中QRadioButton的详细用法教程与应用实战
  • 力扣-3232. 判断是否可以赢得数字游戏
  • Miniconda快速安装conda
  • 网络编程 --------- 2、socket网络编程接口
  • C++跳跃表个人理解
  • 如何设计一个测试用例
  • Apache Pulsar 2.1 重磅发布
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • CODING 缺陷管理功能正式开始公测
  • Java 最常见的 200+ 面试题:面试必备
  • Javascript基础之Array数组API
  • jquery cookie
  • js正则,这点儿就够用了
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • vue.js框架原理浅析
  • Webpack 4 学习01(基础配置)
  • XML已死 ?
  • 阿里云应用高可用服务公测发布
  • 构建二叉树进行数值数组的去重及优化
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 移动端唤起键盘时取消position:fixed定位
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 追踪解析 FutureTask 源码
  • 数据可视化之下发图实践
  • #### go map 底层结构 ####
  • #### golang中【堆】的使用及底层 ####
  • #、%和$符号在OGNL表达式中经常出现
  • #QT(TCP网络编程-服务端)
  • #QT项目实战(天气预报)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $.each()与$(selector).each()
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm码农论坛 毕业设计 231126
  • (论文阅读40-45)图像描述1
  • (四) Graphivz 颜色选择
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转载)Google Chrome调试JS
  • .java 9 找不到符号_java找不到符号