有关likely和unlikely

实战指南:彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例 本文详细介绍了如何彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例,解决重新安装时的冲突问题。通过控制面板排查、注册表验证、安全卸载操作流程和注册表深度清理等步骤,确保完全移除残留组件,避免系统崩溃。文章还提供了安装环境重建策略和预防措施,帮助工程师高效管理西门子自动化软件。 阅读详情

原文: http://hi.baidu.com/zjlinus/blog/item/b0f831dd13ac50375882ddac.html

在 linux 中判断语句经常会看到 likely 和 unlikely ,例如:

if(likely(value)){

}

else{

}

简单从表面上看 if(likely(value)) == if(value) , if(unlikely(value)) == if(value) 。也就是 likely 和 unlikely 是一样的,但是实际上执行是不同的,加 likely 的意识是 value 的值为真的可能性更大一 些,那么执行 if 的机会大,而 unlikely 表示 value 的值为假的可能性大一些,执行 else 机会大一些。加上这种修饰,编译成二进制代码时 likely 使得 if 后面的执行语句紧跟着前面的程序, unlikely 使得 else 后面的语句紧跟着前面的程序,这样就会被 cache 预读取,增加程序 的执行速度, likely 和 unlikely 的实现在

include/linux/compiler.h 中:

      9 #if __GNUC__ == 2 && __GNUC_MINOR__ < 96
     10 #define __builtin_expect(x, expected_value) (x)
     11 #endif
     12
     13 #define likely(x)   __builtin_expect((x),1)
     14 #define unlikely(x) __builtin_expect((x),0)

__builtin_expect 是 gcc 的一个预处理命令,其解释如下:

long __builtin_expect (long exp, long c)
You may use __builtin_expect to provide the compiler with branch prediction information. In general, you should prefer to use actual profile feedback for this

(‘-fprofile-arcs’), as programmers are notoriously bad at predicting how theirprograms actually perform. However, there are applications in which this data is hard to collect.
The return value is the value of exp, which should be an integral expression. The value of c must be a compile-time constant. The semantics of the built-in are that it is expected that exp == c. For example:
if (__builtin_expect (x, 0))
foo ();
would indicate that we do not expect to call foo, since we expect x to be zero. Since you are limited to integral expressions for exp, you should use constructions such as
if (__builtin_expect (ptr != NULL, 1))
error ();
when testing pointer or floating-point values.

linux 的页表为什么没有实现自映射

玩过windows 内核的都应该知道windows 为了节省4k 的内存,实现了自映射,将页目录本身当作了一个页表来寻址4M 的虚拟空间(将4M 空间的虚 拟内存映射到物理内存),而这4m 的虚拟地址空间恰恰就是从0xc0000000 到0xc03FFFFF 的空间,这一段空间正好是页表页目录的映射区域。 下面我来说一下这怎么变成现实。
     
首先有几点必须遵守的规则:1. 一个页表映射的4m 虚拟地址肯定是连续的;2. 一个页表映射到的1024 个4k 的物理页不一定是连续的;3. 实现自映射必 须是页目录和页表结构一样。有了以上的规则,我们要想理解(或者自己实现一个)windows 的自映射就必须理解实际上windows 的页表虚拟地址都是 连续的,映射到0xc0000000 到0xc03FFFFF ,表现为一个页表数组,一共1024 项,每项4096 字节,一共正好4m ,页目录作为这4m 的 页表。我们反着想,如果页目录成为了这4m 的页表,那么肯定映射0xc0000000 到0xc03FFFFF 的地址,我们将端点的两个地址分 解:11000000000000000000000000000000B 和11000000001111111111111111111111B ,仔细 观察发现高10 位是相等的,而这高10 位正好是页目录项的索引,我们知道他是768 ,好了,页目录要作为第768 页目录项对应的页表,现在这个页目录可以 作为一个页表插入到这个页表数组的第768 项的位置了,它开始身兼两职了,CR3 寄存器里面写的是它的物理地址,它作为页目录,此页面偏移768 处也写入 了这个物理地址,它作为页表。
     
现在考虑把这个页目录(页表)的虚拟映射地址换一下会怎样,别的页表不动。比如这个页目录映射到了0xdc000000 这个虚拟地址(仅仅据个例子)。然 后分解地址1101110000 0000000000 000000000000 ,通过计算发现其对应于页目录的880 项,那好吧,我把此页面880 偏移改成此页面的物理地址,别的偏移处仍然指向 0xc0000000 到0xc03FFFFF 的虚拟地址对应的物理地址。看看会发生什么事情,如果把这个从0xc0000000 到0xc03FFFFF 游 离出来的页面当作页表的话,那么它所映射的虚拟地址应该连续,但是它自己是游离出来的,它的虚拟地址和别的页表的虚拟地址根本不连续,所以这样做是不可以 的,也就是说对映射地址的连续性要求是一个必要的条件。windows 之所以这么简单的实现了自映射,完全归功于它的设计思想,实际上一个设计并没有多么 复杂,只要有了完备性,剩下的就是一个自然结果了,比如X 系统是复杂的,而且它在unix 出现很久以后才出现,但是unix 却完美地支持了x 系统,这就说 明unix 很完备。windows 的模块化作的很好,一致性作的也很好,它几乎将任何东西都标准化,每个进程的页表映射到同一个虚拟地址,在 windows 看来,为每个进程提供一个一致的视图要比巧妙的杂糅式进程管理重要的多,所以它将虚拟地址空间作了很复杂的划分和规定。
      linux
正好走了相反的路,它对于虚拟内存空间什么也没有规定,只是说了一下映射规则,提供了一套完备的机制,策略问题根本没有提及,内核虚存空间各个 进程完全共享,各个数据结构散落在各处,内核空间仅仅提供了直接映射和高端映射的若干种映射规则和分配规则,至于说每个空间范围干什么用,linux 只字 未提,所以说linux 的页表可以散落在物理内存的任何地方,因为物理内存和虚拟内存在内核的很大一部分是一一映射的,所以上面的虚拟地址连续的要求就很 难满足,比如这可能要求物理内存连续,在linux 连续地址空间如此宝贵,浪费当作页表linux 觉得这不值得,再说,页表可以随时分配,为什么要连续 呢?连续的话就要先预留4m 页面,然后页表没有完全分配前会造成很多空洞,有几个进程能完全用完4m 的页表呢?linux 保守的回答了这个问题。我们看一 下代码就明白页表的分配了,代码来自最新的2.6.27 内核:

int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,

                 unsigned long address, int write_access)

{

         pgd_t *pgd;

         pud_t *pud;

         pmd_t *pmd;

         pte_t *pte;

         __set_current_state(TASK_RUNNING); 

         count_vm_event(PGFAULT); 

         if (unlikely(is_vm_hugetlb_page(vma)))

                 return hugetlb_fault(mm, vma, address, write_access); 

         pgd = pgd_offset(mm, address);

         pud = pud_alloc(mm, pgd, address);

         if (!pud)

                 return VM_FAULT_OOM;

         pmd = pmd_alloc(mm, pud, address);

         if (!pmd)

                 return VM_FAULT_OOM;

         pte = pte_alloc_map(mm, pmd, address);// 此处即分配页表 

         if (!pte)

                 return VM_FAULT_OOM;

         return handle_pte_fault(mm, vma, address, pte, pmd, write_access);

}

#define pte_alloc_map(mm, pmd, address)                 / 

      ((unlikely(!pmd_present(*(pmd))) && __pte_alloc(mm, pmd, address))? /

                 NULL: pte_offset_map(pmd, address))

分配页表的策略是alloc_pages (GFP_KERNEL |__GFP_HIGHMEM |__GFP_REPEAT |__GFP_ZERO , 0 )好家伙,这么猛,你能保证这分配的页面和前一个页面是连续的吗?你不能,我也不能,甚至linus 也不能

用易经智慧看懂人工智能:64卦中的科技密码--当古老智慧遇见未来科技 在人工智能狂飙突进的今天,我们总在追问:这些代码构建的智能究竟会带人类走向何方?或许答案早已藏在《周易》的六十四卦中——这本中华文明的“源代码”,正用一种跨越时空的语言,悄悄解释着最前沿的科技秘密。 阅读详情

相关推荐

ICESat-2数据下载的两种方法

ICESat-2数据下载

weixin_46341898的博客 2899

内核中的 likely() 与 unlikely()

首先要明确: if(likely(value)) 等价于 if(value) if(unlikely(value)) 也等价于 if(value) 也就是说 likely() 和 unlikely() 从阅读和理解代码的角度来看,是一样的!!! 这两个宏在内核中定义如下: #define likely(x) __builtin_expect((x),1)#define unl...

bangfan4745的博客 171

ABAP 7.40+新语法实战:用VALUE和REDUCE五分钟搞定复杂内表统计

本文详细介绍了ABAP 7.40+新语法中的VALUE和REDUCE操作符,如何高效处理复杂内表统计任务。通过实战案例展示,这些新语法能将代码量减少70%以上,显著提升开发效率和可读性,特别适合大数据量下的销售数据分析、分组统计等场景。

weixin_27219587的博客 206

内核中的likely和unlikely宏定义

在内核代码中经常会看到unlikely和likely的踪影。他们实际上是定义在 linux/compiler.h 中的两个宏。   #define likely(x)    __builtin_expect(!!(x), 1)   #define unlikely(x)  __builtin_expect(!!(x), 0)   这里的__built_expect()函数是gcc

win2domain的专栏 458

RK3568驱动XS9922B:AHD/CVBS双模摄像头兼容性实战

在嵌入式视频开发中,摄像头驱动的稳定性与兼容性往往决定项目交付质量。Linux内核的V4L2框架提供了统一的视频采集抽象,从v4l2_subdev子设备到media controller链路,再到用户态视频节点,每一层都需要精确配置。对于RK3568这类边缘计算平台,其MIPI CSI接口和自研ISP配合RKCIF,构成了完整的多路视频接入通路。当需要接入模拟视频解码芯片时,驱动设计就需同时考虑AHD高清协议与CVBS标清信号的模式切换、格式协商以及寄存器配置。XS9922B作为支持双模输入的解码芯片,可与

weixin_34216614的博客 346

即插即用系列(代码实践)| 2025 Strip R-CNN:大尺寸条形卷积——遥感目标检测新SOTA,专治细长目标(桥梁、船只)

摘要: 论文《Strip R-CNN: Large Strip Convolution for Remote Sensing Object Detection》针对遥感图像中细长目标(如桥梁、道路)检测难题,提出创新性解决方案。通过设计StripBlock模块,将传统方形卷积核替换为大尺寸条形卷积(水平1×19与垂直19×1组合),有效捕获长距离空间特征,同时减少背景噪声。结合CenterPooling增强目标中心定位,该模块可即插即用至现有网络,显著提升遥感检测任务(如DOTA数据集)的精度。代码已开源,

分享顶会顶刊论文即插即用模块 189

linux中 likely与unlikely

照抄别人的日志.. 看内核时总遇到if(likely( )){}或是if(unlikely( ))这样的语句,最初不解其意,现在有所了解,所以也想介绍一下。likely() 与 unlikely()是内核(我看的是2.6.22.6版本,2.6的版本应该都有)中定义的两个宏。位于/include/linux/compiler.h中,具体定义如下:#define likely(x) __bui

1736

YOLOv11的嗅觉传感器数据关联-(特殊场景下的气味-视觉联合分析)

摘要 本文探讨了YOLOv11与嗅觉传感器融合的多模态感知技术。通过分析YOLOv11的架构特性与嗅觉传感器的数据特点,提出了三种融合策略:数据级、特征级和决策级融合。系统采用硬件同步方案实现时空对齐,包含视觉采集模块、嗅觉传感模块和边缘计算单元。环境配置基于Python 3.9和PyTorch 2.0,支持实时多模态数据处理。该技术可应用于环境监测、工业检测等场景,突破单一视觉感知的局限性。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 625

详解likely和unlikely函数

内核源码:linux-2.6.38.8.tar.bz2     参考文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Other-Builtins.html#Other-Builtins        在Linux内核中likely和unlikely函数有两种(只能两者选一)实现方式,它们的实现原理稍有不同,但作用是相同的,下面将结合linux-2

tanglinux 3万+

2ED2410-EM:12v / 24v智能模拟高侧MOSFET栅极驱动器

12v / 24v智能模拟高侧MOSFET栅极驱动器。2ED2410-EM具有输入CPP和CPN的电压比较器。该比较器可用于基于任何模拟电压触发SAFESTATE模式,甚至是外部电压2ED2410-EM。CPP为比较器的正输入,CPN为负输入。VcPREF可以通过微控制器进行调节,也可以通过板载电源芯片(如英飞凌SBC)或简单的分压器在限制VcP(REF)内进行固定,以保持稳定性。使用此比较器允许2ED2410-EM进入SAFESTATE并独立于微控制器关闭MOSFET。

让学习成为一种习惯 2188

【控制模块路径跟踪算法】PID控制算法实现路径跟踪(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对PID控制算法实现路径跟踪–飞思卡尔的方法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容PID属于无模型控制,调节三个环节的参数会产生什么影响根据控制对象的不同也会有很大差别PID形象解释小明接到这样一个任务:有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸里加水。

qq_35635374的博客 2386

使用likely和unlikely 优化程序性能

作用 likely unlikely是为编译器提供对分支优化的提示,基本用于if-else的分支优化场景。if-else在汇编时会将else分支的命令生成跳转语句(jmp),而跳转会影响程序性能,所以如果大部分情况下都是else分支成立的话,程序每次都会执行跳转,从而影响效率,使用likely和unlikely即可以告诉编译器大部分情况下哪个分支更有可能成立,从而将该分支的语句编译到前面,提高运行...

weixin_41666796的博客 1093

Python爬虫教程:如何爬取多平台电商商品信息(价格、评价、库存)

本文介绍了如何编写一个跨平台电商商品爬虫,爬取多个平台的商品信息,包括商品名称、价格、评价等数据。通过Python的爬虫库(如requestsSelenium)和数据处理库(如pandasmatplotlib)的结合,我们可以高效地获取和分析电商平台上的商品信息。

2201_76125261的博客 917

linux内核中likely与unlikely

前言   内核版本:linux 4.13   在linux内核中,经常可以看见if( likely(x))或if( unlikely(x))语句,那么likely和unlikely是什么意思呢?本文将对likely和unlikely进行一些讨论。 likely和unlikely 参考/include/linux/compiler.h */ # define likely(x) __bu...

夜风的博客 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NTscan扫描工具

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

likely和unlikely的用法

在实际使用中,应该基于性能分析和测试结果来确定哪些分支更有可能和不太可能执行,并相应地使用这些宏。如果错误地使用这些宏,可能会导致性能下降,因此建议在优化代码之前进行充分的性能分析。它们通常与条件语句的分支一起使用,以指示哪些分支更有可能执行,哪些分支更不可能执行。在一般的应用程序中,使用这些宏的性能影响可能不明显,因此在普通应用程序中使用它们可能没有太大的必要。例如,在Linux内核中,通常会将likely用于可能出现的快速路径,而将unlikely用于可能出现的慢速路径,以帮助编译器更好地优化代码。

坛城的博客 1292

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

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

likely和unlikely宏

    首先,无论在何处,当我们遇到宏likely和宏unlikely时,都要明确一点:  if(likely(value)) 等价于 if(value)  if(unlikely(value)) 也等价于 if(value)    也就是说 ,当value值为真时执行if分支,为假时执行else分支,从阅读和理解代码的角度来看,是一样的!!!以下为这两个宏的一般定义:#define likely(x)       __builtin_expect(!!(x), 1)#define unlikely(x) 

David_Henry的专栏 3107

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Linux likely、unlikely

​ 1、likely,unlikely同if else一样进行分支判断;likely 期望执行if (true)为真的分支;unlikely 期望执行 if (true) 当中的else分支, 直接运 行else分支代码。​ 2、likely, unlikely 通过分支预测指令的预取能提高代码的执行效率。

谨以此记录下自己的每一点、每一滴、每一步,以督促自己,不忘目标,不忘理想。 1651

likely和unlikely

gcc编译器在编译生成汇编代码时会在编译选项的引导下调整if分支内代码的位置,如果是likely修饰过的就调整到前面,如果是unlikely修饰过的就调整到后面。放到前面的代码可以节省跳转指令带来的时间开销,从而达到提升效率的目的。当代CPU都有ICache和流水线机制,在运行当前这条指令时,ICache会预读取后面的指令,以提升运行效率。但是如果条件分支的结果是跳转到了其他指令,那预取的下一条指令(有的CPU设计是4级流水,也就是4条指令)就没用了,这样就降低了流水线的效率。

weixin_42149196的博客 1046

Linux 中的 likely 和 unlikely

likely()、unlikely() 原理是利用了GCC 的内建函数(),通过编译器预测代码分支;GCC 编译器会将不希望的代码分支放最后;GCC 可能优先执行期盼的执行,再进行判断,不同的编译器版本实现方式不同;likely() 表示该表达式为 “True” 的概率大一些,unlikely() 表示改表达式为 “True” 的概率小一些;likely()、unlikely() 通过分支预测指令的预取能提高代码的执行效率。

私房菜 1276

C语言进阶——likely和unlikely

写C语言程序还没用过likely和unlikely? 那你就out了,跟我一起玩转起来吧!

穿越临界点的博客 1万+

C++关键字之likely和unlikely

摘要:C++中的likely/unlikely用于优化分支预测性能。GCC/Clang通过__builtin_expect实现,C++20引入标准属性语法[[likely]]/[[unlikely]]。它们指导编译器优化代码布局,但对CPU预测影响有限。建议基于性能分析数据使用,适用于错误处理等场景。C++20标准属性语法更清晰,而__builtin_expect兼容性更好。注意避免滥用,仅在性能关键路径且有实测依据时使用。

聚焦前沿科技与硬核技术底层拆解,深耕 AI、量子计算、WebAssembly 等核心领域,拒绝碎片化科普。以通俗语言讲透复杂原理,用干货内容拆解技术逻辑,助力从业者吃透核心、把握趋势,每篇都是可落地的深度技术沉淀。 893

unlikely和likely

主要是跟处理器有关,现在处理器都是流水线的,有些里面有多个逻辑运算单元,系统可以提前取多条指令进行并行处理,但遇到跳转时,则需要重新取指令,这相对于不用重新去指令就降低了速度。所以对unlikely的宏,系统运行时,将减少跳转,重新取指。 与assert()是不一样的,assert()是对一个值进行判断,如指针是否为NULL,如果为NULL,则程序直接exit。跟unlikely是不用级别上的东

随便写写 819

有关likely和unlikely??

在linux中判断语句经常会看到likely和unlikely,例如: if(likely(value)){ } else{ } 简单从表面上看if(likely(value)) == if(value),if(unlikely(value)) == if(value)。也就是likely和unlikely是一样的,但是实际上执行是不同的,加likely的意识是value的值为真的可能性...

~~ LINUX ~~ 350

likely和unlikely的区别

likely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢? 首先明确:  if (likely(value))等价于if (value)  if (unlikely(value))等价于if (value) 也就是说likely()和unlikely()从阅读和理解的角度是一样的。 这两个宏在内核中定义如下: #define lik

Wait for 的专栏 1900

likely, unlikely的作用

在项目中看到了likely、unlikely宏的使用, 一直不是很清楚它们的作用,所以就深究下。likely表示被测试的表达式大多数情况下为true, unlikely则表示相反。 两个宏定义:#define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0)这两个宏经常在条件转移的

蚂蚁大战大象 1063
上一篇: Windows xp/Vista/Linux的内核映射以及内存置换算法
下一篇: 缓存的位置
linuxcode_turing
博客等级 码龄17年 0粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值