在实时操作系统中,task是有优先级的,这里的优先级体现的是对CPU的使用权。按理说为了保证关键任务的执行,不光CPU,其他的系统资源,比如内存,也应该优先为这些任务提供服务才对。

操作系统可以保证关键任务对内存的需求,比如在中断上下文,或者持有spinlock的任务(两者都属于atomic上下文),通过GFP_ATOMIC标志位向内核申请内存,在系统内存不足的情况下,可以使用内核预留的内存(参考这篇文章)。

现在处理器的高速cache越来越大,常用的内存数据都是放在cache中的,CPU主要和cache打交道,而操作系统是没法让cache优先为某个任务服务的。

为此,intel从Xeon E5 v4系列处理器开始,提供了一种叫Cache Allocation Technology(CAT)的技术,可以让系统软件(OS或者虚拟化中的hypervisor)为某个应用划定可以使用的最外层的cache(LLC - Last Level Cache,通常为L3)空间的大小,后续新的处理器甚至支持对L2的划分。

在CAT技术中,任务对cache使用的优先级是通过classes of service (COS)来标定的,而cache的空间根据划分,比如一个有32个cache line的4-wat set associative的cache,其含有的set就是8个。

软件对CAT的配着和使用过程是这样的:

OS初始化的时候通过CPUID指令查询得到当前的处理器支持的COS级数和L2/L3的cache sets数目,然后OS为每级COS配置对应的cache sets。假设当前处理器支持4级COS,COS 0优先级最高,COS 3最低。

如果每个COS级别的任务对所有cache都有相同的访问权(相当于没有使用CAT),其配置关系就是这样的(横向代表cache set,纵向代表COS,A代表可以Allocate):

让高优先级的任务可以访问的cache sets多于低优先级的任务,但某些cache sets可以被高优先级和低优先级的任务共享(overlap),则是这样的:

如果把高优先级和低优先级的任务对cache的使用完全隔离,则是这样的:

当发生context switch时,OS会为即将执行的task分配一个COS级别(系统启动后所有任务默认都是COS 0级的)。那这个task运行起来后怎么知道OS是怎么配置cache空间的,或者说哪些cache sets是它可以访问的?

获得cache使用权靠的是tag比对,前面的文章介绍过,比如VIPT,就是以物理地址做tag同cache line中的tag做匹配的,匹配的上就可以使用可以这个cache line。同样的,task会带上OS给它的代表COS的tag去匹配该COS级别对应的cache空间。

COS的分配是动态的,也就是说OS可以为同一个task在两次调度运行时分配不同的COS优先级,但是更换了COS级别,很可能就更换了cache sets(如果是overlap的配置则不一定),这样新的cache sets里就没有这个task常用的数据和代码,所以一般不推荐这样做。

如果想进一步细化不同task对代码和数据的使用,还可以利用基于CAT的扩展技术Code and Data Prioritization(CDP)。CDP默认是关闭的,如果开启,由于每个COS级别都分为Code和Data,所以系统支持的COS级别将减半。

原创文章,转载请注明出处。

的优先级大小_cache也有优先级相关推荐

  1. android线程优先级大小,android 设置线程优先级 两种方式

    1) android.os.Process.setThreadPriority (int priority)或android.os.Process.setThreadPriority (int tid ...

  2. 的优先级大小_如何评估需求的优先级?

    一. 需求的优先级怎么定义? 很多产品经理,包括我,一定都会遇到这样的场景:" 需求堆如山,什么都想做 ". 面对各种各样.来自各个渠道的需求,产品经理的工作职责之一,就是梳理需求 ...

  3. 验证条件逻辑运算符优先级大小

    条件逻辑运算符:逻辑与优先级大于逻辑或 逻辑与( && ):如果两个操作数都是true,结果为true:否则为false. 逻辑或( || ):如果至少一个操作数是true,结果为tr ...

  4. and or not 优先级_快速划分测试用例优先级

    在工程工期时间有限的情况下,怎么解决测试工期和全部测试用例执行时间之间的矛盾呢? 怎么样的设计才能算测试用例 引自:IEEE Standard 610 (1990): A set of test in ...

  5. c语言中优先级队列_C ++中的优先级队列

    c语言中优先级队列 A Priority Queue is a variant of a Queue such that it's elements are ordered based on thei ...

  6. c语言运算符优先级结合,C语言运算符优先级及结合性

    今天去翻了下C语言运算符的优先级和结合性,发现当初学习的时候就没认真记住,惭愧.发现一篇讲得不错的文章,编辑了下转来供以后翻阅. C语言运算符优先级表(由上至下,优先级依次递减) 运算符 结合性 () ...

  7. 华为修改优先级命令_华为QoS 优先级配置教程-qos设置

    二.QoS 优先级配置 1.QoS优先级信任模式配置 [Huawei-GigabitEthernet0/0/2]trust ? 8021p Specify trust VLAN 802.1p para ...

  8. 华为修改优先级命令_华为QoS 优先级配置教程

    二.QoS优先级配置 1.QoS优先级信任模式配置 [Huawei-GigabitEthernet0/0/2]trust ? 8021p     Specify trust VLAN 802.1p p ...

  9. css选择器有哪些?各种选择器优先级大小顺序

    1.类型选择器 CSS中的一种选择器是元素类型的名称.使用这种选择器(称为类型选择器),可以向这种元素类型的每个实例上应用声明.例如,以下简单规则的选择器是H1,因此规则作用于文档中所有的H1元素. ...

  10. python优先级排序_Python实现一个优先级队列的方法

    问题 怎样实现一个按优先级排序的队列? 并且在这个队列上面每次 pop 操作总是返回优先级最高的那个元素 解决方案 下面的类利用 heapq 模块实现了一个简单的优先级队列: import heapq ...

最新文章

  1. 怎样把DataGrid存放在ViewState中的无用数据卡掉
  2. 华为eNSP模拟器学习(一)
  3. 5分钟了解 Python 中的super函数是如何实现继承的
  4. 保持你的决心——《传说之下》背后的设计之道
  5. React的Ant Design Pro目录结构
  6. 包含天,时,分,秒的倒计时
  7. 商汤科技「工业视觉AI」研发介绍
  8. linux ucontext族函数的原理及使用
  9. android 内存对齐,Go struct 内存对齐
  10. 什么叫做数字功放?它的电路原理是什么?
  11. PyTorch 成程序员“新宠”,TensorFlow 风光不再?
  12. Python 爬虫proxy
  13. pycharm python InvalidVersionSpecError: Invalid version spec: =2.7
  14. spidev 驱动 probe 获取 dts 节点参数
  15. c 语言dll源码查看,易语言DLL函数查看器源码
  16. android多个单选框超格,福昕PDF阅读器打印时提示“打印机被意外删除了”怎么处理?...
  17. 基于OpenCV的土壤裂缝分割系统
  18. VxVM Volume Snapshot Issue -- 卷快照删除失败示例一
  19. ClickHouse技术分享第二弹(英文讲义)
  20. [笔记]n个点的基环树数量

热门文章

  1. 记录一次:微信支付申请时,网站不通过/统一驳回的问题解决方法
  2. Tomcat默认端口,关闭不必要的安全隐患
  3. centos solr4.5 tomcat 简单安装[已测试ok]
  4. 线上解决Resin服务响应过慢的几个方法(转)
  5. 【Java与智能设备】用户界面基础
  6. java确定随机数组的范围_Java程序以生成一定范围内的随机数数组并获取最小值和最大值...
  7. jboss mysql amp amp_怎么在JBoss中配置MySQL数据库连接池让Mysql支持中文
  8. 什么是webpack? ----(webpack入门)
  9. android如何关闭响应程序,android – 如何修复应用程序没有响应?
  10. java 中如何临时保存某输入值_java笔记临时存放