cpu_relax()-----对自选循环等待(spin-wait loops)操作的优化

Linux·编译乱序 编译乱序 阅读详情

   在lock_timer_base()函数中看到在for循环操作中调用了cpu_relax(),本来以为是要让出CPU,调度其他进程运行,但是看代码之后发现完全不是这么回事。cpu_relax()中只有一条调用语句,调用的是rep_nop函数。rep_nop()函数如下:

static inline void rep_nop(void)
{
	asm volatile("rep; nop" ::: "memory");
}

只有一条简单的汇编语句,原来在论坛里看到过这条汇编语句,不是重复执行nop指令,"rep; nop"指令会被翻译成pause指令,到底是不是这样呢?反汇编一下看看,c代码如下:

#include <stdio.h>

static inline void rep_nop(void)
{
    asm volatile("rep; nop" ::: "memory");
}

int main(void)
{
    rep_nop();
    return 0;
}
文件名保存在nop.c,使用gcc编译成目标文件nop.o,命令如下:

gcc -c nop.c
使用objdump来反汇编,命令如下:

objdump -s -d nop.o

反汇编的结果如下图所示:


从图中可以看出"rep; nop"指令被翻译成pause指令,因此实际上rep_nop()函数执行了一次pause指令。关于这条指令,intel的指令手册《Instruction Set Reference, M-Z》中讲的比较详细,这里总结一下。

  pause指令的作用是:

    1)提升spin-wait loops(自旋循环等待)的性能。在执行一个 spin-wait loops时,Pentium4处理会遇到严重的性能损失,因为在循环退出时,处理器会检测到一个可能的内存顺序冲突。pause指令会向处理器提供一种提示,告诉处理器当前所执行的代码序列是一个spin-wait loop操作。大多数情况下,处理器会根据这个提示避开内存序列冲突,从而提高处理器的性能。正是基于此,建议在spin-wait loop中使用pause指令。

    2)pause指令的另外一个功能是让Pentium4处理器在执行spin-wait loop时可以减少电源的消耗。在等待资源而执行自旋等待时,Pentium4处理器以极快的速度执行自旋等待操作时,将会消耗很多电能,但使用pause指令则可以极大地减少处理器的电源消耗。

  PAUSE 指令在 Pentium4 处理器中引入,但它也是向前兼容的。在早先的 IA-32 处理器里,PAUSE 指令实际上就相当于 NOP 指令。Pentium4 处理器以一种 预延迟(pre-defined delay)的技术来实现 PAUSE 指令。这种延迟也是有限度的,并且在一些处理器上是零延迟。该指令不会改变处理器的处理器的状态。

  上面还提到一个概念就是内存顺序冲突(Memory order violation)。内存顺序冲突一般是由假共享引起,假共享是指多个CPU同时修改同一个缓存行的不同部分而引起的一个CPU的操作无效,当出现这个内存顺序冲突时,CPU必须清空流水线。

参考资料:

聊聊并发(五)——原子操作的实现原理

http://www.groad.net/bbs/read.php?tid-3373.html

【信息科学与工程学】【通信工程】第五十九篇 IP网络设计01 IP网络设计不是只写ip address;它本质是的问题,所以参数天然分布在:层级例子物理/传输(可选但你会要求光路/电路)光功率/OSNR/色散/衰减/BER/FEC;铜/微波链路预算L1/L2 链路模型速率、MTU、成帧开销、串行化、传播时延、缓冲排队/调度/QoS服务曲线、令牌桶、延迟界、丢包概率近似路由/TE/可靠性流守恒、路径容量、切换/收敛时间信息论/可达性Shannon 上限、FEC 有效码率、链路容量 after overhead计算科学/数值。 阅读详情

相关推荐

LVGL按键触发回调函数的完整流程

如果是我的话我会怎么写:例如按键,我先定义一个结构体里面包含ID,事件名等和回调函数的链表节点结构体里面有具体函数的指针,也有指向下一个回调函数的链表节点的指针,初始化一个结构体变量的,通过BSP层来驱动触摸屏幕,再通过中间层与被按下时就会判断是长按还是短按还是其他,改变变量的事件例如:改成长按,生成事件包后再注册你长按的回调函数链表节点,再根据变量的事件到链表中遍历最后实现功能.父容器监听所有子列表项的点击事件,无需为每个列表项单独注册回调。的回调,打印所有事件日志,观察事件触发顺序。

solomonzw的博客 3243

usleep(0)与sched_yield() 调度及cpu_relax()

1、cpu_relax()用于短时间的忙等待,比如每个用户持锁的时间很短,让出cpu的代价不如忙等待。它和死循环等待的区别是,cpu空转功耗会低。所以一定会陷入内核态,调用deactivate_task触发任务调度,然后进行任务切换。而任务调度是比较耗时的。结论:重量级usleep(0) > sched_yield() > cpu_relax()2、sched_yield会调用sched_yield系统调用。3、usleep(n)会调用nanosleep系统调用。所以一定会陷入内核态,触发任务切换。

leiyanjie8995的博客 1269

深入解析.Net中SM2与sm-crypto的跨平台加解密实践

本文深入探讨了在.Net平台与前端sm-crypto库之间实现SM2国密算法跨平台加解密的实践方案。针对对接中常见的密钥格式、密文拼接顺序(C1C3C2与C1C2C3)等核心难点,提供了基于BouncyCastle的完整工具类实现、前后端联调示例及问题排查指南,旨在帮助开发者构建安全、兼容的数据加密通道。

weixin_29322855的博客 370

什么时候需要cpu_relax()锁

在典型的超线程处理器中,每个超线程不是一个独立的core,所以两个或者多个超线程之间仍然在竞争一些资源,如果其中一个人调用了yield,那么它会在争抢中放慢节奏,而旁边的那个兄弟会抢地更多。2, 如果是超线程CPU的机器,可以让渡CPU给其他的线程;当然,cpu_relax()的具体实现与体系架构相关,不同的体系架构实现不一样,可能只完成了上面3个功能中的1个,2个而不是全部。总之,不管具体的体系架构怎么实现,忙等里面都适合加cpu_relax(),毕竟内核多数的代码要求是跨平台的。

yiyeguzhou100的专栏 2507

三维(点云)语义分割概述以及方法总结

语义分割 语义分割需要两部分 classification: 需要全局信息 segmentation:更加依赖全局信息和局部信息 一般的网络结构是: 提特征-特征映射-特征图压缩(降维)-全连接-分类,其实就是encoder-decoder的过程, 比如在二维的的pspnet,fcn等等 0. 三维表示的数据结构 Point cloud 无序性 点云实际上是无序的,比如有8个点云,你放到...

renhaofan的博客 3万+

手把手调试Altera FPGA远程升级:从ASMI扇区擦除到Remote Update IP配置的避坑实录

本文详细解析了Altera FPGA远程升级的全流程,重点介绍了Cyclone IV系列FPGA的ASMI扇区擦除和Remote Update IP配置的实战技巧。通过双镜像架构设计、ASMI IP核优化配置及Remote Update IP的隐藏参数设置,帮助开发者避免常见陷阱,提升远程升级的可靠性和效率。

weixin_30872499的博客 447

cpu_relax和_mm_pause

cpu_relax和_mm_pause

qixiang2013的专栏 2013

Python量化交易实战:pytdx库高效获取通达信分笔成交数据

本文详细介绍了如何使用Python的pytdx库高效获取通达信分笔成交数据,为量化交易提供关键市场微观结构分析。通过环境搭建、服务器连接、数据获取与清洗的完整流程,帮助开发者快速掌握这一免费高质量数据源,并实现分笔数据的实战分析与应用。

weixin_29061509的博客 1351

cpu_relax()函数的意义

最近在看wake_up_process流程的时候,发现在try_to_wake_up函数里面有这么一条语句: while (p-&amp;amp;amp;gt;on_cpu) cpu_relax(); 一直想弄明白cpu_relax()函数的真实含义. 我们查看这个函数的定义如下: arm32: #if __LINUX_ARM_ARCH__ == 6 || defined(CON...

悟空明镜 1万+

电子元器件选型与实战应用—01 电阻选型

大家好, 我是记得诚。这是《电子元器件选型与实战应用》专栏的第一篇文章,今天的主角是电阻,在每一个电子产品中,都少不了电阻的身影,其重要性不言而喻。

记得诚 3537

英飞凌Tricore问题排查01_Det/Reset/Trap排查宝典

软件跑飞进Det或发生Reset或进Trap了,怎么查?有固定套路可以follow吗?英飞凌Tricore又有哪些专门的定位办法?本篇为您娓娓道来。

initiallizer的博客 4417

cpu_relax( )-----对自选循环等待(spin-wait loops)操作的优化【转】

cpu_relax()-----对自选循环等待(spin-wait loops)操作的优化 转自:http://www.doc100.net/bugs/t/173547/index.html 在lock_timer_base()函数中看到在for循环操作中调用了cpu_relax(),本来以为是要让出CPU,调度其他进程运行,但是看代码之后发现完全不是这么回事。cpu_relax()中只...

weixin_34190136的博客 117

ABAP Secure Storage 在事务码 SM59 中的应用

系统管理人员在进行维护时,应关注相关日志信息,及时发现可能出现的安全异常,并针对不同安全等级的操作制定相应的备份与恢复策略,以降低潜在风险。该区域在设计上具备高度隔离性,仅允许经过授权的组件访问。保存后,系统会将密码存储在 Secure Storage 中,这种处理方式充分体现了 SAP 标准程序在安全设计上的考量。对于系统管理员而言,这种机制在日常维护与审计中提供了有力的支持,可以通过比对存储数据的哈希值或其他完整性校验手段,及时发现异常变动,保障系统长期稳定运行。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 675

LINUX下的几种CPU让渡策略

CPU作为服务器重要的计算资源,因为其资源的稀缺性,所以其对所有程序来说都是弥足宝贵的;尤其是对性能要求极高的应用程序而言,如何更好的利用CPU将是 提升性能的一个关键因素。 本文将探讨几种应用程序让渡CPU的策略,以此来研究如何让CPU更好的被不同用途的应用程序或者相同协作的一组应用程序使用,从而更好的使用CPU这种宝贵的资源。 cpu_relax cpu_relax在LINUX内核中使用较...

xiaokaige198747的专栏 1357

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

linux驱动32:延迟执行

linux驱动32:延迟执行

dongyoubin的博客 1083

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux内核同步机制之三------Seqlock

一、前言 普通的spin lock对待reader和writer是一视同仁,RW spin lock给reader赋予了更高的优先级,那么有没有让writer优先的锁的机制呢?答案就是seqlock。本文主要描述linux kernel 4.0中的seqlock的机制,首先是seqlock的工作原理,如果想浅尝辄止,那么了解了概念性的东东就OK了,也就是第二章了,当然,我还是推荐普通的驱动工程师

changexhao的专栏 862

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

linux内核时钟机制及延时

时钟时间维护和利用是操作系统的一个基础任务。操作系统中的时间相关的服务包括: 时间维护时钟同步time-of-day的表示下一个事件的调度处理器以及内核定时器进程统计进程度量 linux最初的实现包括了对这些服务的支持。其模型如图所示(TOD:time of day): 这种实现下每一种架构都有自己的一套时钟实现方案代码,同时也只支持低分辨率定时器,无法支持高分辨率定时器

浩海拾贝 8976

Plotly Python Tile County Choropleth 地图绘制实战指南:px.choropleth_map 与 go.Choroplethmap 全解析

Tile Choropleth(瓦片底图分级统计图)是 Plotly Python 中基于在线瓦片底图(MapLibre 风格)渲染的色块地图,适合表达失业率、选举票数、人口密度等按行政区聚合的数值在空间上的分布。本文围绕 [tile-county-choropleth.md](https://link.gitcode.com/i/7d63d16135eec399995668380f01eee5)

gitblog_00551的博客 475

[scheduler]11. 主调度器(__schedule()函数)如何工作的

一 概述 我们经常在创建线程执行函数/worker执行函数,定时器执行函数等等情况下,会经常看到schedule函数的调用,这是进程上下文,还有中断上下文的调度,即preempt_schedule_irq.另外我们在进程调度的时候会看到是否需要设置重新调度的标识,这时候 1.1 schedule() 这个函数是最常使用的调度函数: static inline void sched_submit_w...

悟空明镜 9046

linux内核中的延迟和定时器

内核中的延迟和定时器 1. 关于延时 忙等待 while(time_before(jiffies, j1)) cpu_relax(); 这种代码会占用大量内核cpu运行时间,是不好的方式 超时等待 有两个重要的api #include <linux/wait.h> long wait_event_timeout(wait_queue_head_t q, condition, long timeout); long wait_event_interrupt_timeou

qq_32783703的博客 707

【linux 内核】 锁机制的实现 spin_lock()函数

这篇记录下内存锁是如何实现的。 以下是spin_lock()函数的代码调用流程片段: 注意__raw_spin_lock这里调用了preept_disable()函数关闭了cpu抢占。这个函数不用关心LOCK_CONTENDED宏的作用,知道这里调用do_raw_spin_lock()函数就可以,参数是lock。 锁的结构介绍: 从__spin_lock_debug开始初见端倪,先尝试for循环4096×HZ次加锁,这里并没有挂死,400多万次的尝试加锁...

zhangwenxinzck的博客 3208

cpu_chill

最近在看linux实时内核的一些东西,顺便记录一些。 cpu_relax();  boot.h中定义#define cpu_relax()    asm volatile("rep; nop") rep;nop在这个连接有解释  http://blog.sina.com.cn/s/blog_4bbf98c00100ysdq.html我发现rt内核用cpu_chill替换了cpu_relax ...

baidu_38316985的博客 327
上一篇: SKB包的接收-----从网卡驱动到TCP层的处理流程
下一篇: LVS-DR模式配置详解
Justlinux2010
博客等级 码龄16年 175粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值