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

C/C++ 网络编程之关于多核利用问题

在 C/C++ 网络编程之中,多核利用分为以下几类:

1、一个链接一个线程,即传统且淘汰的 MTA 架构

     形式:每次捕获链接,create_new_thread 一个子线程出来处理。

     优点:开发简单,维护简单。

     缺点:CPU及内存负载,成本高

2、一个链接一个进程,即传统且淘汰的 MPA 架构

     形式:每次捕获链接,fork 一个子进程出来处理。

     有点:可靠性高,主程式不易崩溃

     缺点:CPU及内存负载,成本巨大且昂贵

3、把X个链接分配到一个工作线程上(利用线程池)

     形式:

              1、根据取模数分配到子线程

              2、求子线程链接负载最小

              3、队列线程FIFO分片轮替

                   即:队列拥有四个子线程的容量,每次需要捕获线程时,把顶部的线程弹出用于分配,并把使用后的线程压入队列尾部。

    优点:性能高效,多核能效利用高,CPU上下文切换少

    缺点:某个子线程,在一定的场景之中,必然会发生算术负载积压的问题,根据操作系统内核调度的特性,发生算术负载积压时,某个#CPU核会承担非常繁重的事务,这并不能达到,人们所期望的多核并行计算,同时且合理利用多个#CPU核。

              举例:

                     A子线程被分配,1,2,3个链接,而这三个链接没有太多的数据需要进行交换,所以CPU负担为占用该U核的1% load 能效。

                    B子线程被分配,2个链接,但该链接存在严重的IO数据交换U能负载,导致该线程当前执行的U核被占用100% load 能效。

                    那么,假设该设备只有两个核心,程式只应用到101%的能效,并且不能提高吞吐量,事实上,若令两个U核,同时为所有的链接,真正的多核并行提供能效,这必定可以提高其的能效宽频IO吞吐量,而非像如此一般因为U核负载瓶颈,迫使性能不能真正被发挥出来。

4、多核并行消息/事件驱动状态机

      形式:多个子线程,同时驱动一个消息/事件驱动状态机(MDSM/EDSM)

      优点:性能高效,多核能效利用最大,CPU上下文切换少(略高)

      缺点:具有一定的复杂性,工程维护成本偏高。

多个子线程,同时在一个消息/事件驱动状态机队列之中,捕获需要执行的任务(Task)并加以执行。

基于应用层的队列驱动下层实现,建议:

Windows:IOCP(完成端口)

Linux:EPOLL + ET(边缘触发),若内核大于等于 5.10.0 则应用采用 IO_URING(IO/U环)

MacOS X:Kqueue(K队列)

例如:

Network-IO 的读写行为,而得益于链接是线性状态,所以在多核计算时,同一个时间轮片调度之下,不会产生多个行为。
 

但人们仍旧,可以根据需要实现 strand(线),以确保某一个具体的事务,在多核并行处理时,保持时间轮片上的线性执行。

以下为 C/C++ 进行构建,允许单个网络链接,可被四个工作子线程相互调度执行。

妹妹苦爭鬥、玉碎瓦全登西樓。

              

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • x11vnc卡顿问题,debian11编译x11vnc
  • 数学建模笔记—— 模糊综合评价
  • k8s防火墙networkPolicy,的核心是“自己”
  • 中关村科金推出得助音视频鸿蒙SDK,助力金融业务系统鸿蒙化提速
  • HTTP 之 响应头信息(二十三)
  • ozon免费选品工具,OZON免费选品神器
  • 鸿蒙轻内核M核源码分析系列二一 02 文件系统LittleFS
  • AI为云游戏带来的革新及解决方案:深度技术剖析与未来展望
  • Android Framework(五)WMS-窗口显示流程——窗口布局与绘制显示
  • element UI学习使用(1)
  • Html、Css3动画效果
  • 1 MATLAB 绘图函数函数: plot
  • kvm 虚拟机命令行虚拟机操作、制作快照和恢复快照以及工作常用总结
  • 【Python爬虫】利用爬虫抓取双色球开奖号码,获取完整数据并通过随机森林和多层感知两种模型进行简单的预测
  • redis基本数据类型和常见命令
  • [译]如何构建服务器端web组件,为何要构建?
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Docker: 容器互访的三种方式
  • java2019面试题北京
  • java8-模拟hadoop
  • javascript数组去重/查找/插入/删除
  • Mysql数据库的条件查询语句
  • passportjs 源码分析
  • PAT A1092
  • Rancher如何对接Ceph-RBD块存储
  • vagrant 添加本地 box 安装 laravel homestead
  • 基于组件的设计工作流与界面抽象
  • 七牛云假注销小指南
  • 如何学习JavaEE,项目又该如何做?
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 微信开源mars源码分析1—上层samples分析
  • 一个完整Java Web项目背后的密码
  • 用Canvas画一棵二叉树
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 移动端高清、多屏适配方案
  • ​2020 年大前端技术趋势解读
  • ​secrets --- 生成管理密码的安全随机数​
  • ###C语言程序设计-----C语言学习(6)#
  • #AngularJS#$sce.trustAsResourceUrl
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (搬运以学习)flask 上下文的实现
  • (待修改)PyG安装步骤
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (离散数学)逻辑连接词
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (三)c52学习之旅-点亮LED灯
  • (十二)Flink Table API
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)C#调用WebService 基础
  • ..回顾17,展望18
  • .net refrector