mb与使用场景

Python 打包 90MB 压到 12MB 本文介绍了使用Nuitka替代PyInstaller打包Python程序的方法,可将90MB的EXE文件压缩到12MB,同时提升2-3倍性能。Nuitka通过将Python代码编译为C语言实现体积优化,避免了PyInstaller打包解释器的冗余。文章详细对比了两者的差异,提供了Nuitka的安装配置、高级优化技巧和常见问题解决方案,并分析了适用场景。相比PyInstaller,Nuitka具有体积小、启动快、性能高、误报率低等优势,特别适合需要发布给客户且对体积性能有要求的Python工具。 阅读详情

它是 Linux 内核等领域的一个底层原语。
mb() 是 内存屏障 或更具体地说是 内存隔离屏障 的一种。它的使用场景深刻关系到现代计算机体系的乱序执行和多核并发。换句话说,如果不是编译器的优化,把c语句进行可能的调整,导致执行次序和代码前后关系不一致,也不需要这个patch式功能;比如c语句 a-b-c三行,三者没有逻辑依赖,只是先后次序,编译器可能会优化为a-c-b;

核心问题:为什么需要内存屏障?

现代 CPU 和编译器为了提升性能,会对指令执行顺序和内存访问顺序进行优化,这可能导致指令不按代码的先后顺序执行。主要在两个层面发生:

  1. 编译器优化:编译器在编译时,可能会将指令重新排序,以提高指令流水线的效率。
  2. CPU 乱序执行:CPU 在执行时,如果后续指令不依赖于前面指令的结果,它可能会让后续指令先执行。此外,由于多级缓存的存在,对不同内存地址的写入操作,在其他 CPU 核心看来,其全局可见的顺序可能与写入顺序不一致。

在单核、单线程程序中,这种乱序通常是透明且无害的,因为最终结果是一致的。但在多核并发环境(特别是内核中)下,这种乱序会导致严重问题。


mb() 函数的使用场景

mb()(全称 smp_mb(), 即 Symmetric Multi-Processor Memory Barrier)的作用是创建一个完整的 memory barrier。它确保:

  • 屏障之前的所有内存访问操作(读和写),一定在屏障之后的所有内存访问操作之前完成。
  • 这个“完成”意味着结果已经对系统中的所有 CPU 核心可见。

它就像一个栅栏,阻止屏障两侧的指令穿越它进行重排序。

以下是几个经典的使用场景:

场景一:实现锁机制

锁是内存屏障最根本的应用场景之一。

static int locked = 0; // 0: unlocked, 1: locked

void acquire_lock(void) {
    while (test_and_set(&locked) == 1) { // 尝试原子性地获取锁
        /* 等待 */
    }
    mb(); // 内存屏障!确保在拿到锁之后,临界区的读写操作不会跑到拿锁之前去。
}

void release_lock(void) {
    mb(); // 内存屏障!确保在释放锁之前,临界区内的所有读写操作都已经完成。
    locked = 0;
}
  • 在 acquire_lock 中:mb() 确保一旦成功获取锁,后续进入临界区的代码不会因为乱序执行而被提前到获取锁之前,从而避免了数据竞争。
  • 在 release_lock 中:mb() 确保在释放锁(让其他线程可见)之前,临界区内的所有修改都已经完成并全局可见。否则,另一个线程可能看到旧的、不一致的数据。
场景二:生产者-消费者模式(使用共享标志位)

这是最经典、最能说明问题的场景。

// 共享数据
struct data {
    int value;
    int ready; // 标志位:0-数据未就绪,1-数据已就绪
};

// 生产者
void producer(struct data *data) {
    data->value = 42;          // 1. 准备数据

    mb();                     // 2. 内存屏障!确保 value=42 的写入一定在 ready=1 之前对消费者可见。

    data->ready = 1;           // 3. 发布数据,标记为就绪
}

// 消费者
void consumer(struct data *data) {
    while (data->ready == 0) { // A. 等待数据就绪
        /* 循环 */
    }

    mb();                     // B. 内存屏障!确保在读取 value 之前,一定已经看到了 ready=1 这个结果。

    int used_value = data->value; // C. 使用数据
}

如果没有内存屏障会发生什么?

由于乱序执行,CPU 或编译器可能让生产者的 data->ready = 1 先于 data->value = 42 执行并变得全局可见。这时,消费者线程看到 ready 变为 1,便跳出循环去读取 value,但此时 value 可能还是旧的(未初始化的)值,导致程序错误。

内存屏障的作用:

  • 生产者的 mb() 保证了 1 -> 2 -> 3 的顺序,消费者绝不会看到一个 ready=1 但 value 却不正确的状态。
  • 消费者的 mb() 保证了 A -> B -> C 的顺序,确保在读取 value 之前,已经正确地感知到了 ready 的变化。
场景三:与设备交互(DMA)

当内核与硬件设备通过 DMA 直接访问内存时,顺序至关重要。

// 1. 告诉设备要读取的数据在哪里(写入设备寄存器)
writel(DMA_SOURCE_ADDR_REG, buffer_phys_addr);
writel(DMA_SIZE_REG, size);

mb(); // 内存屏障!确保上面两条配置信息一定先于下面的启动命令被设备看到。

// 2. 启动 DMA 读取操作
writel(DMA_START_REG, 1);

如果没有屏障,设备可能会先收到 DMA_START 命令,然后才收到地址和大小,这会导致设备行为异常。


其他类型的内存屏障

Linux 内核提供了不同强度和作用范围的屏障,mb() 是其中最严格的。

  1. 写屏障 wmb():只确保写操作的顺序。屏障前的写操作一定在屏障后的写操作之前完成。
  2. 读屏障 rmb():只确保读操作的顺序。屏障前的读操作一定在屏障后的读操作之前完成。
  3. 编译器屏障 barrier():仅阻止编译器重排序,不生成任何 CPU 指令。适用于防止编译器优化但不需要干预 CPU 乱序的场景(例如,在循环忙等待中)。

总结

在任何一个需要明确指定内存操作顺序,否则并发逻辑就会出错的地方,就是你该考虑使用内存屏障(如 mb())的时候。它是编写正确、可靠的多核并发底层代码的基石。
mb() 内存屏障的使用场景可以归结为:

场景特征具体例子屏障的作用
存在共享数据的多核/多线程环境锁、生产者-消费者确保修改顺序和可见性顺序的一致性,防止数据竞争和状态不一致。
对访问顺序有严格要求的硬件交互设备驱动、DMA确保CPU对设备寄存器的写入顺序符合硬件的工作逻辑。
需要保证指令执行顺序各种同步原语的实现作为一个“栅栏”,强制在屏障点完成所有之前的操作,再开始之后的操作。
探讨 SAP S/4HANA 中的 MB21 事务码及其应用实例 MB21 是 SAP 系统中 Material Reservation Creation(物料预留创建)的快捷方式。通过 MB21,用户可以手动创建物料预留,以便在后续的业务流程中进行物料消耗控制。预留的物料可能涉及生产、维修、项目或其他活动。与自动生成的预留相比,MB21 允许用户主动干预并设置细节参数,例如预留数量、物料编码、预留日期等。这种灵活性在动态业务需求下十分有用。MB21 是 SAP S/4HANA 中一个非常实用的工具,通过手动或编程方式创建物料预留,可以满足多种业务场景需求。 阅读详情

相关推荐

1.7 1200的MB_SLAVE使用

摘要:本文介绍了Modbus RTU通信的常用指令和实例应用。"MB_COMM_LOAD"指令用于配置Modbus RTU通信端口,支持RS485/RS232模块。"MB_SLAVE"指令使PLC作为从站响应主站请求。实例展示了S7-1200 PLC作为从站(地址2)与模拟量信号板通信的过程,包括端口配置、寄存器映射(QW1010)以及模拟量信号的标准化(NORM_X)和缩放(SCALE_X)处理。通过CB1241 RS485模块实现9600波特率的通信,演示了完整的

qq_34047402的博客 240

PHP中mb_detect_encoding函数的使用场景与常见问题解析

在PHP中处理多字节字符时,字符编码的检测和处理是一个常见的需求。mb_detect_encoding函数是PHP多字节字符串扩展(mbstring)中的一个重要函数,用于检测字符串的编码。今天我们来深入探讨这个函数的使用场景、常见问题以及如何在实际项目中应用它。

zjy6T8RO的博客 402

wandb:0.000 MB of 0.010 MB uploaded (0.000 MB deduped)解决方案

本文主要介绍了wandb:0.000 MB of 0.010 MB uploaded (0.000 MB deduped)解决方案,希望能对使用wandb的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 7万+

在每秒生成1MB测试数据(约1000条记录,包含电压、电流等)并使用队列分离数据生成与存储的场景下,优化队列性能是确保系统高效、稳定运行的关键

以下针对队列性能优化,从内存使用、并发处理、存储效率、可靠性和监控等方面提供详细的中文解释,并结合前述基于ConcurrentQueue<T> + 定期快照的方案,提出具体优化措施。在每秒生成1MB测试数据(约1000条记录,包含电压、电流等)并使用队列分离数据生成与存储的场景下,优化队列性能是确保系统高效、稳定运行的关键。队列性能优化的关键点队列性能优化的核心在于平衡吞吐量、延迟、内存占用和可靠性。1. 优化队列入队/出队效率。2. 优化数据库存储性能。5. 可靠性与快照优化。4. 并发与异步优化。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 673

《联邦学习实战》杨强 读书笔记十四——构建公平的大数据交易市场

当数据具有资产属性之后,数据便可以直接或者间接地为公司、为社会创造价值和收益,并且可以作为一种特殊的商品在市场中进行交易。 与传统的商品交易相比,数据资产交易的市场前景更广阔,但同时也面临着很多的挑战,主要包括: 数据的质量、价格如何定义 在合法合规的前提下,数据的交易如何确保不会泄露用户的隐私 如何构建合理的激励机制来鼓励更多的参与方加入数据交易市场中 大数据交易 数据交易的定义 数据交易是指一种对数据进行买卖的行为,大数据交易由三方共同参与,分别为数据提供方、大数据交易平台和数据需求方:

IEEE802_11的博客 3433

XY2-100协议解析

1.XY2-100包括四路信号 : SENDCK(时钟信号)、SYNC(同步信号)、CHANNELX(X通道)、CHANNELY(Y通道)

qq_38360574的博客 9531

千帆ab mb的使用说明

commanderScott的博客 240

安鸾渗透测试平台-CTF系列-bash

工具Xshell 公网VPS接收反弹shell Xshell新手的下载及安装教程(超详细)_新手程序员攀爬之路的博客-优快云博客_xshell使用教程 Xshell连接后 #!/bin/bash cat ${0} while : do echo "$" read input output=`$input` 显示了一个文件,不过咋做呢?这里可能考察的是linux的语法 方法 输入bash 获得shell cat ${0} while : do .

AAAAAAAAAAAA66的博客 2689

SAP MB1A MB1B MB1C MB11 MIGO的区别解析

点击进入:SAP MB1A MB1B MB1C MB11 MIGO的区别解析

matinal 當冬夜漸暖 。公众号:matinal 4758

ubuntu安装XXX包时出现(= 20.0.8-0ubuntu1~18.04.1) but it is not going to be installed

安装mujoco_py时,最后一步尝试 import mujoco_py 时出现报错 esashim.c:1:10: fatal error: GL/osmesa.h: No such file or directory 1 | #include <GL/osmesa.h> | ^~~~~~~~~~~~~ compilation terminated. 在https://github.com/openai/mujoco-py#ubuntu-ins

dealexce的博客 1794

ENSP实验一:防火墙基础配置

配置client(内网)、FTP Server(外网)的IP地址。进入防火墙,输入密码:默认为admin@123。

Carohuan的博客 1万+

分清常用的单位 MB Mb Byte byte

Byte byte MB Mb 等常用单位区分

weixin_51327216的博客 2034

Unity小游戏接入抖音敏感词检测

摘要: 本文介绍了Unity小游戏接入抖音敏感词检测的方法。抖音官方提供了两种API:SensitiveWordCheck用于检测敏感词,ReplaceSensitiveWords用于替换敏感词。此外,若使用键盘输入事件,可通过tt.onKeyboardComplete监听回调,平台会自动屏蔽敏感词(替换为*)。接入官方字库可有效避免审核驳回,适用于小游戏中的用户输入功能(如起名系统)。附官方文档链接及参数说明。

类人_猿的博客 4594

php 中mb开头什么意思,php的mb_substr和mb_strcut的区别

php的mbstring扩展模块提供了多字节字符的处理能力,平常最常用的就是用mbstring来切分多字节的中文字符,这样可以避免出现半个字符的情况,由于是php的扩展,它的性能也要比一些自定义的多字节切分函数要好上一些。mbstring extension提供了几个功能类似的函数,mb_substr和mb_strcut,看看手册上对它们的解释。mb_substrmb_substr() retur...

weixin_33209661的博客 341

基于ArduPilot的旋翼式无人机飞行器开发系列(二,学习路线)

一,热爱 作为一名耿直的技术男,在这里我只想说一句,热爱是可持续学习的第一要素,也只有热爱才能让你坚持到最后。 至于最后能得到什么,只有你自己知道。常说书中自有颜如玉,书中自有黄金屋。如果你是为了颜如玉,我相信大多数颜如玉做不了你的红颜知己。如果是为了黄金屋,当你持续投入时间和金钱却看不到回报的时候,相信退堂鼓早已隆隆作响。 我给自己的信条就是为当下努力工作,为将来持续学习。当前飞控行业并没有爆发,如果想赚块钱,去互联网汽车,去VR/AR吧,去元宇宙吧。 那么我热爱...

从0到1,突破自己 1667

PHP substr(),mb_substr()及mb_strcut的区别和用法

PHP substr()函数可以 分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这个函数,mb_substr() /mb_strcut的用法与substr()相似,只是在mb_substr()/mb_strcut最后要加入多一个参数,以设定字符串的编码,但是 一般的服务器都没打开php_mbstring.dll,需要在php.ini

tommypierce的专栏 599

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

php strtops,mb_strps,编码转化 substr(),mb_substr()及mb_strcut函数用法与区别

$b = mb_strpos($name,'曾效力新');$encoding = strtoupper(mb_detect_encoding($name, array("UTF-8", "GBK", "GB2312", "BIG5", "ASCII")));if (strcmp('UTF-8', $encoding) !== 0){$content = mb_convert_encoding($n...

weixin_32596769的博客 348

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

substr(),mb_substr()及mb_strcut的区别

<br />截取字符时用substr可能会遇到些问题,比如截取时后半部分出现乱码.当然写个方法也能解决,但是不在我们讨论之中.<br />这时候用mb_substr或mb_subcut;<br />mb_substr是按字来切分,而mb_subcut是按字节切分.下面是例子:<br /> <br /><br /><?php<br />echo mb_substr('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');<br />?><br />输出:这样一来我的字<br /><?php<

iVan 1217

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深入理解 MySQL 中的 UTF-8 与 UTF-8MB4 字符集

UTF-8 是一种变长的字符编码,它是 Unicode 的一种实现方式。在 UTF-8 编码中,每个字符可以使用 1 到 4 字节来表示。UTF-8 编码的最大特点是向后兼容 ASCII,即所有标准的 ASCII 字符(U+0000 到 U+007F)仍然使用 1 字节表示。UTF-8 能够表示几乎所有的语言字符,并且它已经成为 Web 上最广泛使用的字符编码标准。1 字节:ASCII 字符(0x00 到 0x7F)2 字节:较常见的字符,如拉丁字母、汉字等(0x80 到 0x7FF)3 字节。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 1万+

MB_OK IDOK

MB_OK 和IDOK时不同的。 MessageBox(_T("确定取消正在传输的节目!"),NULL,MB_OKCANCEL) == MB_OK) 应该使用IDOK 转载于:https://www.cnblogs.com/WeRtogether/archive/2009/09/17/1568480.html...

weixin_30872867的博客 295

PHP substr(),mb_substr(),mb_strcut()比较

                                        PHP substr(),mb_substr(),mb_strcut比较1、前言:    1)、这三个函数都用来截取字符串,所不同的是:        substr是最简单的截取,无法适应中文;        mb_substr是按字来切分字符串;        mb_strcut是按字节来切分字符串,截取中文都不会产...

夏已微凉、 885

【Unity3d】3d网页游戏场景打包与加载

http://www.mysjtu.com/page/M0/S716/716482.html   3d游戏中 一个场景往往斗劲大 若是游戏的进行须要下载一个10M甚至更大的场景时 加载所用的时候会导致很大项目组玩家的流失 我们知道unity3d中的内置地形是应用一张高度图 对其地形进行打包今后 发明 那么若是采取unity3d的内置地形作为游戏中的地形时 起首加载地形并显示 再去加载

BoYueJiang's Zone 1582

PHP学习:mb_substr和substr

用法:返回字符串的一部分。 mb_substr()用于截取中文; substr是按字节来截取的,即UTF-8编码的中文,使用substr截取,只会截取1/3个中文。 // 中文字符船 $IString = '我喜欢'; // mb_strlen()函数返回长度为3 echo mb_strlen($IString ); // strlen()函数返回长度为9 echo strlen($IString ); // 而对于英文字符串,两者返回结果相同 $youString = 'I do not like'; /

weixin_41339032的博客 535

不知事务码MB1A / MB1B / MB1C之间有什么区别吗?

MB1A / MB1B / MB1C-->发货/转移过账/其它收货。还有其他有用的代码比如MB01 MB31 这些代码在MIGO中集成。MIGO是新界面的集成性事物代码。如果平时对库存操作的话,建议用MIGO。但是如果作BDC或者CATT或者USER EXIT的话,建议用以上五个老的事物代码。因为MIGO经常出现UNEXPECTED SITUATION

少年休闲海 7479

PHP 解决采集乱码问题mb_convert_encoding和iconv使用比较 by cubeking

mb_convert_encoding的用法见官方: http://cn.php.net/manual/zh/function.mb-convert-encoding.php 做一个GBK To UTF-8 header("content-Type: text/html; charset=Utf-8"); echo mb_convert_encoding("妳係我的友仔", "UT

sun886的专栏 5155
上一篇: 需要知道的spinlock
liveloading
博客等级 码龄7年 53粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值