操作系统 — 了解CPU cache

CPU cache



Cache一词源自法语,其原意为"藏匿处,隐藏的地方". Cache被应用于计算机科学之后,专指CPU与主内存之间的存储器高速缓冲器

,Cache的出现是为了缓解CPU的存储需求与主内存的存取性能之间越来越大的差距.现代CPU的Cache都是集成在片内的,越靠近CPU

流水线的Cache由于需要极其快速的存取速度,只能保持越小的容量,并且单位容量的成本越高.因此,为了进一步缓解需求与性能

之间的差距,并应对不断增大的主内存,最新的CPU都采用了三级Cache结构.


1.靠近CPU流水线的L1 Cache速度最快,容量最小

2.L2 Cache速度与容量都居中

3.靠近主内存的L3 Cache则是容量最大,但速度相对最慢(仍然比主内存快很多).


局部性原理

一般的计算机程序对存储器的访问行为,存在很大的局部性,主要分为两个方面:

时间局部性:既程序会在一个比较短的时间窗口内频繁访问同一个内存地址.

空间局部性:既程序会倾向于访问一组数据或者一个数据相邻的数据.


Cache正是利用了程序访存的这两个局部性特点,将程序最常使用的指令与数据放在离CPU流水线最近的地方,以便在需要时最快获

取这部分指令与数据.


当我们了解到局部性原理后,我们就会有一个新的概念,有的时候,我们需要将进程运行在指定的CPU内核当中. 为什么? 因为当

你上一个进程运行完,如果当前进程需要上一个进程的数据,这个时候该CPU当中Cache中拥有上一个进程的热数据,当前进程可

以直接拿起来使用. 所以当你持续让你的程序尽量可以使用到热数据,不用再在的CPU上重新加载,那么你的程序性能就会高很多.


在"多核CPU调优"章节,提到"我们不能任由操作系统负载均衡,因为我们自己更加了解自己的程序,所以,我们可以手动为其分配

CPU核,而不会过多的占用CPU0,或者是让我们关键进程和一堆别的进程挤在一起" 上一段说到的就是原因.


1.taskset

taskset是Linux提供的一个命令,他可以让某个程序运行在某个某些CPU上.

1)显示进程运行的CPU

命令: taskset -p 21184

2)指定进程运行在某个特定的CPU上

命令:taskset -pc 3 21184

3)进程启动时指定CPU

命令:taskset -c 1 ./a.out


2.sched_setaffinity系统调用

sched_setaffinity可以将某个进程绑定在一个特定的CPU. 你比操作系统跟了解你自己的程序,为了避免调度器愚蠢的调度你的程

序,或者是为了在多线程程序中避免缓存失效造成的开销,你可能会希望这样做.

NAME
       sched_setaffinity, sched_getaffinity - set and get a process’s CPU affinity mask

SYNOPSIS
       #define _GNU_SOURCE
       #include <sched.h>

       int sched_setaffinity(pid_t pid, size_t cpusetsize,cpu_set_t *mask);

       int sched_getaffinity(pid_t pid, size_t cpusetsize,cpu_set_t *mask); 

父进程和子进程之间会继承对affinity的设置,因此,大胆猜测,taskset实际上是首先执行了sched_setaffinity系统调用,然后

fork+exec用户指定的进程.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值