当前位置: 首页 > article >正文

cache写策略 操作系统

cache写策略 操作系统

在计算机系统中,为了提高数据的响应速度在CPU内置了cache,用来提高CPU和主存的交互。以下主要是对cache的理解。

1、cache写策略

cache是主存里数据的副本。cache的写策略,又分为两种:

  • 写直达
  • 写回

1.写直达

在这里插入图片描述

  • 如果数据已经在Cache里,就更新到Cache Block,再写到内存里;
  • 否则的话就把直接更新到内存中,读的时候直接读取内存;

写直达简单、直观,但是性能不高。

2.写回

在这里插入图片描述

  • 写命中:CPU直接将数据写入到Cache Block中,将该Cache Block的脏位设置为1,表示该数据已经被修改,但主存中的对应数据尚未更新,可以减少不必要的写操作。
  • 写未命中
    • Cache Block为脏:在新数据写入缓存前,先将脏的Cache Block中的旧数据写回主存,以确保主存中保存最新的数据。然后将要写入的数据从主存中读取到Cache Block,并将新数据写入该块,将脏位设置为1,标记数据已被修改。
    • Cache Block不为脏:直接将需要的数据从主存载入到Cache Block,并写入新的数据。同样,将脏位设置为1,表示数据已修改,但主存中尚未更新。

在写回机制中,新的数据仅仅被写入到Cache Block里,只有当修改过的Cache Block被替换时才需要写到内存中。

Cache机制就是为了让CPU在处理数据时不总是访问主存,尽可能从更靠近CPU的存储位置获取数据。

2、缓存一致性

问题:在一个多核的CPU中,比如四核的CPU,我在1号核心执行i++,但是2号核心使用i的时候是0,这表示了在一号核心计算后的结果并未同步到其他核心,那么就会导致执行结果错误。

  • CPU核心的Cache数据同步问题
  • CPU核心的数据操作顺序问题

对于第一个问题,解决方法就是写传播的方式,当某个CPU核心更新了Cache里的数据,就把该事件广播到其他核心。

那么这个方法就是总线嗅探。

1.总线嗅探

每个CPU都会监听总线上的广播事件,及时更新自己Cache的数据,但是不能保证操作数据的顺序。所以又有基于总线嗅探的协议MESI协议。

2.MESI协议

  • Modified:已修改
    • 该缓存行中的数据已被修改,与主存中的数据不一致,且该数据只存在于当前缓存中。如果其他核心需要该数据,需要先将其写回主存。
  • Exclusive:独占
    • 该缓存行中的数据与主存一致,且只存在于当前缓存中。如果当前核心修改了该数据,则状态将转变为Modified。
  • Shared:共享
    • 该缓存行中的数据与主存一致,且该数据可能存在于多个缓存中。可以被读取,但如果要修改,需要先通知其他核心,使其无效。
  • Invalidated:已失效
    • 该缓存行中的数据无效,不可使用。如果当前核心需要访问此数据,则需要从其他缓存或主存中重新加载。

MESI协议状态转换行为表

当前状态事件行为转换后状态
无效 (I)Local Read如果其他核心没有该数据,则从主存中加载数据,状态变为Exclusive;如果其他核心有该数据,则状态变为Shared。E 或 S
Local Write从主存加载数据到Cache并修改,将状态设置为ModifiedM
Remote Read保持无效,其他核心读取无影响I
Remote Write保持无效,其他核心写入无影响I
独占 (E)Local Read从Cache中读取数据,状态保持不变E
Local Write修改数据,将状态设置为ModifiedM
Remote Read将数据共享给请求的核心,状态变为SharedS
Remote Write使当前Cache行无效,状态变为InvalidI
共享 (S)Local Read从Cache中读取数据,状态保持不变S
Local Write修改数据,将状态设置为ModifiedM
Remote Read共享数据给请求的核心,状态保持不变S
Remote Write其他核心写入数据,当前Cache行失效,状态变为InvalidI
修改 (M)Local Read从Cache中读取数据,状态保持不变M
Local Write修改数据,状态保持不变M
Remote Read将数据写回主存以更新,再共享给请求的核心,状态变为SharedS
Remote Write将数据写回主存以更新,然后将当前Cache行失效,状态变为InvalidI

http://www.kler.cn/a/390140.html

相关文章:

  • Unity3D 包体裁剪与优化详解
  • nginx部署H5端程序与PC端进行区分及代理多个项目及H5内页面刷新出现404问题。
  • #渗透测试#SRC漏洞挖掘#云技术基础02之容器与云
  • ODOO学习笔记(1):ODOO的SWOT分析和技术优势是什么?
  • ODOO学习笔记(3):Odoo和Django的区别是什么?
  • 深度学习服务器租赁AutoDL
  • nginx 部署2个相同的vue
  • 241111.学习日志——【CSDIY】Cpp零基础速成
  • 2024年11月10日系统架构设计师考试题目回顾
  • 【算法速刷(9/100)】LeetCode —— 42.接雨水
  • 2024年9月青少年软件编程(C语言/C++)等级考试试卷(四级)
  • flask logger 使用 TimedRotatingFileHandler 报错 PermissionError 另一个程序正在使用此文件
  • NVR录像机汇聚管理EasyNVR多品牌NVR管理工具/设备:大华IPC摄像头局域网访问异常解决办法
  • 哪家云服务器好跑AI?瞄准AutoDL(附NVIDIA GPU 算力排名表)
  • Linux基础之病毒编写
  • Docker 操作指令
  • 如何设置el-date-picker的默认截止时间为“23:59:59”
  • 故事121
  • Ceph MDS高可用架构探索:从零到一构建多主一备MDS服务
  • (Go基础)Go的运行流程步骤与包的概念
  • 使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
  • 【Linux系列】 环境配置文件合并的艺术:从`.env`到`.env.combined`
  • Radix Sorts
  • 音视频入门基础:FLV专题(25)——通过FFprobe显示FLV文件每个packet的信息
  • LeetCode每日一题3258---统计满足 K 约束的子字符串数量 I
  • pycharm连接oracle数据库查询数据