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像素,高度为200像素的canvas元素。canvas-id属性被设置为"firstCanvas",可以用来在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 三角剖…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

Appium下载安装配置保姆教程(图文详解)
目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

生信服务器 | 做生信为什么推荐使用Linux服务器?
原文链接:生信服务器 | 做生信为什么推荐使用Linux服务器? 一、 做生信为什么推荐使用服务器? 大家好,我是小杜。在做生信分析的同学,或是将接触学习生信分析的同学,<font style"color:rgb(53, 1…...

第2篇:BLE 广播与扫描机制详解
本文是《BLE 协议从入门到专家》专栏第二篇,专注于解析 BLE 广播(Advertising)与扫描(Scanning)机制。我们将从协议层结构、广播包格式、设备发现流程、控制器行为、开发者 API、广播冲突与多设备调度等方面,全面拆解这一 BLE 最基础也是最关键的通信机制。 一、什么是 B…...
如何让非 TCP/IP 协议驱动屏蔽 IPv4/IPv6 和 ARP 报文?
——从硬件过滤到协议栈隔离的完整指南 引言 在现代网络开发中,许多场景需要定制化网络协议(如工业控制、高性能计算),此时需确保驱动仅处理特定协议,避免被标准协议(如 IPv4/IPv6/ARP)干扰。本文基于 Linux 内核驱动的实现,探讨如何通过硬件过滤、驱动层拦截和协议栈…...

Electron通信流程
前言 今天讲Electron框架的通信流程,首先我们需要知道为什么需要通信。这得益于Electron的多进程模型,它主要模仿chrome的多进程模型如下图: 作为应用开发者,我们将控制两种类型的进程:主进程和渲染器进程 。 …...