您的位置:首页 > 其它

操作系统 — 了解CPU cache

2018-03-11 11:10 309 查看

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用户

指定的进程.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: