操作系统 — 了解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用户

指定的进程.

猜你喜欢

转载自blog.csdn.net/dawn_sf/article/details/79514146