首页 > 其他分享 >per-CPU变量的静态和动态分配原理

per-CPU变量的静态和动态分配原理

时间:2023-06-18 14:01:59浏览次数:40  
标签:node __ percpu per CPU 动态分配 cpu


per-CPU是2.6内核中引入的,访问per-CPU变量几乎不需要锁,每个处理器都在其自己的副本上工作。这些副本是如何生成的呢?本文尝试解答这个问题。


静态per-CPU结构设计思路大体可以分为两个阶段:编译阶段和运行时阶段

在编译阶段,实际上只生成了一个CPU原本。系统中所有per-CPU结构都放到了一个叫做"data.percpu"的section中,在ld.S链接脚本有如下内容: 


. = ALIGN(32);
   __per_cpu_start = .;
   .data.percpu  : { *(.data.percpu) }
   __per_cpu_end = .;
   . = ALIGN(4096);
   __init_end = .;



由这个链接脚本知道, .data.percpu Section是处于init数据段的,在系统初始化结束后将被回收。那么,系统如何维持per-CPU数据呢?这个任务在运行时完成。在系统初始化阶段有一个函数会分配 NR_CPU * ( __per_cpu_end - __per_cpu_start)大小的内存,然后将


可见,静态per-CPU变量的locality非常好,CPU之间在Cache级都不彼此干扰。对于静态生成的per-CPU变量需要使用get_cpu_var来访问。


在讲述动态per-CPU结构之前不妨思考下,如何能把动态per-CPU的locality设计得跟静态的一样呢? 由于不知道系统中将会有多少动态结构出现,所以不宜采用预留内存的方式,这为我们的设计带来了很大挑战。实际上,Linux也没有完全解决这个问题,但还是做了最大程度的优化,手法也比较赞。考虑到per-CPU变量的访问模式,效率应该和静态方式不相上下。下面看看linux的处理方式。


动态per-CPU结构相对于静态结构来说,设计上更直观,但效率上要低一些。每次调用alloc_percpu(type)的时候会生成一个维度为NR_CPUS的指针数组,每个指针指向一个kzalloc/kmalloc_node出来的type型对象。Linux在这里采取了一个优化手段:如果第i个cpu在线(linux支持cpu的hot-plug),那么就采用kmalloc_node来分配空间,这个空间与cpu i的亲和性很高;如果cpu i不在线,则采用通用的kzalloc分配了。下面是空间分配代码:


int node = cpu_to_node(cpu);
    BUG_ON(pdata->ptrs[cpu]);
    if (node_online(node))
        pdata->ptrs[cpu] = kmalloc_node(size, gfp|__GFP_ZERO, node);
    else
        pdata->ptrs[cpu] = kzalloc(size, gfp);


对于动态生成的per-CPU变量需要用per_cpu_ptr来访问。


Ref: http://blog.chinaunix.net/u/12325/showart.php?id=1274548


标签:node,__,percpu,per,CPU,动态分配,cpu
From: https://blog.51cto.com/maray/6508355

相关文章

  • unity将安卓streamingAssetsPath文件复制到persistentDataPath
    privatevoidTestCopy(){stringfrom=Application.streamingAssetsPath+"/Test/test.txt";stringto=Application.persistentDataPath+"/Test/";CopyFile(from,to);}publicstaticvoidCopyFile(stringsourcePath,stringdesti......
  • 获取cpu、memory、disk的基本情况
    #!/bin/bash#获取逻辑CPU个数processors=`cat/proc/cpuinfo|grep"processor"|wc-l`functioncpu(){NUM=1while[$NUM-le$processors];doutil=`vmstat|awk'{if(NR==3)print100-$15"%"}'`user=`vmst......
  • NVIDIA Performance Primitives (NPP)
    NVIDIA PerformancePrimitivesGPU上的图像和信号处理 NVIDIAPerformancePrimitives(NPP)库提供GPU加速的图像、视频和信号处理函数,其执行速度比仅使用CPU的实现快30倍。借助超过5,000个用于图像和信号处理的基元,您可以轻松执行颜色转换、图像压缩、过滤、阈值处理......
  • NVIDIA Performance Primitives (NPP)
    NVIDIA PerformancePrimitivesGPU上的图像和信号处理 NVIDIAPerformancePrimitives(NPP)库提供GPU加速的图像、视频和信号处理函数,其执行速度比仅使用CPU的实现快30倍。借助超过5,000个用于图像和信号处理的基元,您可以轻松执行颜色转换、图像压缩、过滤、阈值处理......
  • 申威3231服务器Redis性能验证-及最全信创CPU性能分析
    申威3231服务器Redis性能验证-及最全信创CPU性能分析背景公司里面新进了几台服务器.有台申威服务器.因为前段时间参与过一次申威的POC验证.当时对性能有一点简单的理解.但是因为不方便,没有测试更多.这次有了一台实体机器,并且可以上网,所以感觉可以方便的多了.本来想使用......
  • 【C】专家编程 (Expert C Programming) 阅读笔记
      第一章C:穿越时空的迷雾  1p22~24 ANSIC有此问题。“安静”的类型转换原则:当执行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着浮点精度更高,长度更长的方向转换,整形术如果转换为singed不会丢失信息,就转换为signed,否则转换为unsign......
  • pysnooper打印运行过程值
    #withimportrandomimportpysnooperdefprint_upper_mid_lower():lst=[]foriinrange(10):lst.append(random.randrange(1,1000))withpysnooper.snoop():lower=min(lst)upper=max(lst)mid=(lower+up......
  • [ABC299G]MinimumPermutation
    [ABC299G]MinimumPermutation考虑一个必要的性质:如果现在有一个数\(x_1\),它后面有一个数\(y<x_1\),且\(x_1\)又在\(y\)后面出现了若干次(\(x_2,x_3,\dots,x_k\),我们直接考虑最后一个\(x_k\)),那么\(x1\)一定不是答案。(显然前面的\(x_1\)可以不选,然后选择\(y,x_2\simx_......
  • python--python脚本中保存处理后的音频文件到指定文件夹时报错permission denied 的问
    问题1:自己编写的python脚本中,将处理后的音频文件保存到指定的文件夹(用到了pydub库对音频文件进行处理),但保存处理后的文件到指定文件夹时,会报错permissiondenied的错误,如下截图解决思路:一开始网上查资料,基本上都是说文件夹没有读写权限,让设置文件夹权限等操作,但设置了之后还是......
  • transition-property属性改变元素背景色。
    未使用transition-property属性前使用transition-property属性后面代码如下:<html<!doctypehtml><html><head><metacharset="utf-8"><title>transition-property属性</title><styletype="text/css">//引用css文件div......