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

DPDK系列之三十一DPDK的并行机制简介

一、并行机制

什么是并行机制?这个很多开发者的眼中,其实是模糊的。可能说起来头头是道,但是细一查究竟,发现都是飘在空中的东西。在前面的“多核和多CPU编程”中,对并行机制已经进行了较深入的分析,这里只简单说明一下。
说起并行(parallelism),就不得不提并发(concurrent)。并发一般是指多线(进)程在一个执行单元上进行轮流执行(时间片),而并行指多线(进)程在多个执行单元上同时执行。大多数开发者一个最明显的谬误往往就在于把并发和并行混淆。当然,有的书籍中,把二者说的不太清楚,甚至从某个角度上有意无意的误导了学习者也是一个重要原因。之所以产生这个现象,一个最重要的原因在于大学课程中的操作系统和计算机原理为了更容易说明进程线程的机制,而简化了很多东西。这样,就导致很多开发者在一开始就把学习的知识想当然的扩展了,这在国外的教科书中就做的比较好(所以搞计算机,教科书尽量用国外的,技术尽量上国外的官网)。
另外一个就是在计算机普及的过程中,并发比并行更简单,实现成本更低。这也导致很多老的开发者,如果技术没有跟进,也会产生这种误解。起初的大型机和小型机上,多CPU的很正常,所以并行编程其实出现的很早。而并发编程,也就是现在开发者理解的多线(进)程(早期的多道程排除出去),其实比并行编程要出现的晚,就一如线程这个概念一样。
对并发和并行的表述很明白,但理解却不是这样简单,没有上面的说的那么清晰明白。因为很多实际的应用程序在现有的机器上执行时,并发和并行是同时存在的。所以可以形象的把并发和并行统一起来,即在应用者的眼中(前端)看来,都是并发,而是否并行,看底层(后端)执行单元(CPU或核心数量)来决定(这会不会是种误导?)。这个有点编译器发展的方向,前后端分离。
其实这也是一个计算机硬件进化的历史,从单核到多核的一个过程。现在主流的计算机,PC端一般是单CPU多核心为主,服务器以多CPU多核心为主。而其它异构的产品如手机等,更是细分了不同的执行和计算单元,从某种程度可以理解成多CPU多核心。而PC端随着GPU编程的发展,CPU和GPU协同工作其实也是一种并行的机制。
故而现在已经无法简单的把并发和并行严格区分出来。当然,实际上,大多数的PC端的应用程序仍然是以并发编程为主,这个是一时半会不会有太大的改变的。
需要注意的是:
上面虽然以多线(进)程为例说明,但一定要记清楚,这是任务分配(前端),到底决定是并行还是并发,还是看执行(后端)是同一执行单元还是多执行单元。另外不要混淆并行和并发混合(M:N:M个线程,N个执行单元,M>N这种情况)。
还有一个说明点,所谓异步和协程(Java21的虚拟线程这些都算)这些都是在以此为基础的另外一种抽象的应用,不要硬夹杂进来。

二、DPDK中的并行

明白了什么是并行机制后,现在看一下DPDK中是如何引入并行机制的。前面在“DPDK系列之五DPDK的线程模型”中已经初步对其进行了一个认识,这里开始进行一个较为全面的分析和介绍。
从宏观上来看,提高执行效率不外乎以下几点:
1、执行(计算等)单元的数量。从简单理论(不考虑竞态)上理解,越多越好(人多好干活嘛)。
2、线(进)程的调度。简单来说,没有调度这种理想状态效率最好(人多更要合理分工)。
3、动态的扩展性。即运行过程中动态的增减来达到效率的最高,否则一个单元执行足以应付,即有九十九个线程闲置也是低效,即达到线性的伸缩(人员需求动态可调配)。
而算法等的完善和优化(提高人员素质),这属于计算机提高效率的细节了或者说具体的业务范畴,这里暂时不做讨论。
在DPDK中应对上面的这些解决方式有:
1、支持多CPU和多核心,并进一步支持以此演进的NUMA。
现代的CPU一般可以有多个安装在一台服务器上,一个CPU上有多个Core,而一个Core又会有多个逻辑核心(超线程技术)。甚至从宏观上看,分布式的系统都可以看做一个大型的计算机,这个扯远了。扯回来,这样,通过多个CPU(含核心),可以最大限度保持非关联的并行度。而多个CPU又进一步衍生出NUMA,保证内存访问的安全和快捷,用来保持内存访问的效率。

2、支持线程亲和性和线程独占,这个有点类似于减少调度(尽量减少线程开销提高Cache命中率)。
多个核心就很容易保持着不相关的线程的并行执行,这其实就是干活的人多了,假如你做为一个包工头,如何保证这些多的人产生出更高的结果?那么最简单的一种办法,如果某个人擅长打字,你就让他专职打字,而不是打一会字就去搬砖。有些人有力气,你非要让他搬一会砖就去打字,除了让这两人感到痛苦,还会直线降低工作效率。这就是CPU的亲和性,这在NUMA的机器上非常重要。同样,亲和性只是让任务偏重于少调度而不是不调度。所以就又有线程独占,也就是绑定到CPU(核心)上,也就是说,这个核心不会再调度,只和绑定的线程快乐的玩耍。
当然,这些是有条件的,如果你的任务需要密集性的计算或者非常复杂和对实时性要求非常高等,才会要求这样做。这和大页内存的限制条件原理是类似的。举个例子,某人擅长打字,但打字的工作一天就一个小时,总不能余下的时间都让他歇着吧?

3、可扩展性
DPDK通过配置等手段可以实现对CPU核心数量的支持来实现计算的可扩展性,同样利用内存的管理实现内存的可扩展性操作,其它也是如此,特别是虚拟化的支持,其实已经从底层更好的支持了可扩展性。

之所以这样做,和整体任务计划中的局部性、减少互斥访问和避免多核调度以及锁的粒度尽量小(或者尽快通过临界区)是密不可分的。但即使如此,在实际的应用中,不可避免的会出现并行的并行控制问题。这其实又重新回到了一个数学概率的问题以及具体到某个场景的数学概率问题。

三、DPDK的应用

在DPDK中,在代码分析中可以知道其通过POSIX库创建线程的方式来Spawn线程并且通过上述的方式来绑定到具体的核心,来实现DPDK的高效率真通信的目标。它分为主从两类,分布在主从核心上。一般控制线程做为主线程,而数据线程做为从线程。
其实DPDK也是针对上面的几个方面进行了实现,只不过在逻辑上划分出来主从,来区分管理和业务,能够更好的满足实际的需求。

四、总结

DPDK的内存机制基本告一段落,那么高效的另外一个重点就是并行。以目前的计算机资源的使用来看,没有一个高效的并行框架基本上是无法达到榨干资源的可能的。就如资本一样,不浪费每一个资源,每一个资源的每一部分,是计算机开发者的终极目标。整体上要推进资源的技术进步,在无法短时间内实现技术进步的前提下,组合应用各种技术把对资源的利用达到极致,这就是计算机技术的宏观的目的。
DPDK就是这其中一个典型的代表,所以,这个并行的机制,就不得直面对待。

相关文章:

DPDK系列之三十一DPDK的并行机制简介

一、并行机制 什么是并行机制?这个很多开发者的眼中,其实是模糊的。可能说起来头头是道,但是细一查究竟,发现都是飘在空中的东西。在前面的“多核和多CPU编程”中,对并行机制已经进行了较深入的分析,这里只…...

【Java】复制数组的四种方式

1. System.arraycopy() 用来将一个数组的(一部分)内容复制到另一个数组里面去。 定义: void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);例: int[] arr1 { 1, 2, 3, 4, 5 }; int[] arr2 new…...

设计模式5、原型模式 Prototype

解释说明:使用原型实例指定待创建对象的类型,并且通过复制这个原型阿里创建型的对象 UML 结构图: 抽象原型(Prototype):规定了具体原型对象必须实现的clone()方法 具体原型(ConcretePrototype&…...

驱动挂载物理页代码示例

驱动挂载物理页代码示例 使用的实验环境为32位xp系统在101012分页模式下 此实验用于测试对分页模式的掌握程度 代码思路如下: 获取目标进程的cr3在目标进程中申请新的物理页拆分新申请的物理页的线性地址通过差分出的内容获取pte将pte写入到要挂载的线性地址的p…...

【新版】系统架构设计师 - 层次式架构设计理论与实践

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 层次式架构设计理论与实践考点摘要层次式体系结构概述表现层框架设计MVC模式MVP模式MVVM模式使用XML设计表现层表现层中UIP设计思想 中间层架构设计业务逻辑层工作流设计业务逻辑层设计 数据访问层…...

大数据Flink(九十):Lookup Join(维表 Join)

文章目录 Lookup Join(维表 Join) Lookup Join(维表 Join) Lookup Join 定义(支持 Batch\Streaming):Lookup Join 其实就是维表 Join,比如拿离线数仓来说,常常会有用户画像,设备画像等数据,而对应到实时数仓场景中,这种实时获取外部缓存的 Join 就叫做维表 Join。…...

Docker方式创建MySQL8的MGR集群

目录 一、MGR简述二、安装环境及要求2.1 系统版本2.2 网络要求 三、安装步骤3.1 创建容器3.2 创建用户3.3 安装插件3. 4 启动集群3.5 加入集群 四、查看集群查看 MGR 组成员列表查看 MGR 组成员拓扑信息 五、其他说明集群配置要求集群配置限制集群相关变量和状态 一、MGR简述 …...

问 ChatGPT 关于GPT的事情:扩展篇

一、GPT预训练有什么节省显存和算力的技巧吗?我如何拿四块A100完成175B模型的预训练? 对于GPT预训练,有一些技巧可以帮助节省显存和算力。以下是一些常用的技巧: 按批次截断:在较长的文本序列中,将其切割…...

Spring Boot 集成 MinIO 实现文件上传、下载和删除

MinIO 是一种开源的对象存储服务,它基于云原生架构构建,并提供了高性能、易于扩展和安全的存储解决方案。 一.安装和配置 MinIO 服务器 为了演示方便,本文采用Windows安装 1.在官方网站下载MinIO 安装文件,地址:ht…...

Polygon Miden交易模型:Actor模式 + ZKP => 并行 + 隐私

1. 引言 前序博客: Polygon Miden:扩展以太坊功能集的ZK-optimized rollupPolygon Miden zkRollup中的UTXO账户混合状态模型 Polygon Miden为: ZK-optimized rollup由客户端生成证明完善Polygon ZK系列解决方案,致力于成为网络…...

Java流的体系结构(二)

文章目录 一、对象流的使用1.概念2.序列化机制3.代码案例:序列化过程:将内存中的java对象保存到磁盘中或通过通络传输出去4.反序列化,将磁盘文件中的对象还原为内存中的一个java对象 二、RandomAccessFile的使用1.说明2.代码案例 提示&#x…...

python计算阶层

阶层(Factorial)是指从1到一个正整数n的所有整数相乘,即n! 1 2 3 … n。下面是Python代码计算阶层: def factorial(n):"""计算阶层:param n: 正整数:return: n的阶层"""if n 1 or n 0:retu…...

前端架构师之01_ES6_基础

1 初识ES6 简单来说,ECMAScript是JavaScript语言的国际标准,JavaScript是实现ECMAScript标准的脚本语言。 2011年,ECMA国际标准化组织在发布ECMAScript 5.1版本之后,就开始着手制定第6版规范。 存在的问题:这个版本…...

银行卡号识别

# 导入工具包 from imutils import contours import numpy as np import argparse import cv2 import myutils# 设置参数 # ap = argparse.ArgumentParser() # ap.add_argument("-i", "--image", required=True, # help="path to input image")…...

【Idea】idea、datagrip设置输入法

https://github.com/RikudouPatrickstar/JetBrainsRuntime-for-Linux-x64/releases/tag/jbr-release-17.0.6b829.5https://github.com/RikudouPatrickstar/JetBrainsRuntime-for-Linux-x64/releases/tag/jbr-release-17.0.6b829.5 下载后解压并重命名为 jbr, 然后替换对应 ide…...

回归预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于RF-Adaboost随机森林结合…...

最小生成树 | 市政道路拓宽预算的优化 (Minimum Spanning Tree)

任务描述: 市政投资拓宽市区道路,本着执政为民,节省纳税人钱的目的,论证是否有必要对每一条路都施工拓宽? 这是一个连问带答的好问题。项目制学习可以上下半场,上半场头脑风暴节省投资的所有可行的思路&a…...

Java实现使用多线程,实现复制文件到另一个目录,起不一样的名字,创建100万个数据

目录 1 需求2 实现 1 需求 我现在有一个300MB 的文件,想要根据这个文件,创建100万个大小一样的,名称不一样,如何实现,如何比较快点实现 2 实现 1 先准备好这个文件 2 准备好目录 3 写代码 private static void crea…...

uni-app:canvas-图形实现1

效果 代码 <template><view><!-- 创建了一个宽度为300像素&#xff0c;高度为200像素的canvas元素。canvas-id属性被设置为"firstCanvas"&#xff0c;可以用来在JavaScript中获取该canvas元素的上下文对象。 --><canvas style"width:200p…...

【算法分析与设计】动态规划(下)

目录 一、最长公共子序列1.1 最长公共子序列的结构1.2 子问题的递归结构1.3 计算最优值1.4 举例说明1.5 算法的改进 二、最大子段和2.1 代码2.2 最大子段和问题的分治算法2.3 代码2.4 分治算法的时间复杂度2.5 最大子段和问题的动态规划算法 三、凸多边形最优三角剖分3.1 三角剖…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

结构化文件管理实战:实现目录自动创建与归类

手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题&#xff0c;进而引发后续程序异常。使用工具进行标准化操作&#xff0c;能有效降低出错概率。 需要快速整理大量文件的技术用户而言&#xff0c;这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB&#xff0c;…...

接口 RESTful 中的超媒体:REST 架构的灵魂驱动

在 RESTful 架构中&#xff0c;** 超媒体&#xff08;Hypermedia&#xff09;** 是一个核心概念&#xff0c;它体现了 REST 的 “表述性状态转移&#xff08;Representational State Transfer&#xff09;” 的本质&#xff0c;也是区分 “真 RESTful API” 与 “伪 RESTful AP…...