验证cpu缓存一致性

文章通过一个简单的多线程程序展示了CPU缓存行大小(64字节)对程序执行效率的显著影响。当结构体中的无用成员(tmp1和tmp2)被启用时,由于缓存冲突,程序运行时间增加,表明缓存一致性的考虑对于极致性能优化至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cpu内存加载行size为64字节

参考代码:

#include <stdio.h>
#include <pthread.h>

static long COUNT = 1000000000;

typedef struct 
{
    // long tmp1[7];
    long value;
    // long tmp2[7];
}NODE;

NODE data[2];

void *my_add_func(void *args){
    NODE *mydata = (NODE *)args;
    for(long i =0;i < COUNT;i++){
        mydata->value = i;
    }
    return NULL;
}

int main(){
    int thread_num = 2;
    pthread_t pt[thread_num];
    for(int i = 0; i < thread_num;i++){
        pthread_create(&pt[i], NULL, my_add_func, (void *)&data[i]);
    }
    for(int i = 0; i < thread_num;i++){
        pthread_join(pt[i], NULL);
    }
    
    return 0;
}

验证结果:
cpu缓存一致对系统的性能确实有比较大的影响,在极致性能优化方面可以考虑

# 打开 tmp 定义
C02CN0QPMD6V:$ gcc cache.c
C02CN0QPMD6V:$ time ./a.out
real	0m2.926s
user	0m4.488s
sys	0m0.011s

# 关闭 tmp 定义
C02CN0QPMD6V:$ gcc cache.c
C02CN0QPMD6V $ time ./a.out
real	0m5.321s
user	0m9.952s
sys	0m0.015s
### Linux 缓存一致性机制及其问题 #### 背景介绍 在现代操作系统中,文件系统的性能很大程度上依赖于内存中的数据缓存。然而,在多处理器或多节点环境中,不同组件之间的缓存可能会导致不一致的情况。这种现象被称为 **缓存不一致 (Cache Inconsistency)**。 Linux 提供了一套复杂的机制来处理这些情况,尤其是在网络文件系统(NFS)和其他分布式存储场景下。以下是关于 Linux 缓存一致性的一些核心概念和解决方案: --- #### 文件系统同步标志 `s_need_sync_fs` `int s_need_sync_fs` 是一个用于标记超级块(superblock)是否需要同步其挂载的文件系统的标志位[^1]。当这个标志被设置时,表示当前文件系统可能处于未完全写入磁盘的状态,因此需要执行额外的操作以确保数据的一致性和持久化。 此标志通常会在以下情况下触发: - 当有脏页(dirty pages)存在时。 - 在某些特定事件发生后,比如进程退出或显式的同步请求。 通过这种方式,Linux 可以控制何时以及如何将缓冲区的内容刷新到实际设备上,从而减少潜在的数据丢失风险并提高整体效率。 --- #### 非可缓存页面的支持 如果硬件支持,则可以将某些类型的物理地址空间定义为“不可缓存”的区域[^2]。这种方法对于那些频繁更新或者对外部可见性要求较高的资源特别有用——例如 I/O 寄存器或其他特殊用途 RAM 块。 这样做不仅能够避免因 CPU 或其他子系统内部副本而导致的信息陈旧问题,还可以简化软件层面的设计复杂度。不过需要注意的是,并不是所有的体系结构都允许这样的配置选项;具体实现取决于底层架构特性及驱动程序开发者的决策。 --- #### NFS 缓存一致性模型概述 针对远程访问需求设计而成的 Network File System(NFS),在其协议版本之间引入了一个专门用来管理客户端与服务器端间共享对象状态差异的方法论—即所谓的 *cache coherence strategy*[^3] 。它主要涉及以下几个方面: 1. **属性缓存时间窗口(Attribute Cache Time Window):** 客户端会暂时保存最近获取过的元数据信息一段时间而不是每次操作前都要重新查询服务端, 这样做可以在一定程度上降低通信开销. 2. **数据有效性(Data Validity Checking):** 对于读取动作来说,NFS 协议规定只有当本地副本被认为是最新的时候才能直接返回给应用程序; 否则就需要发起新一轮验证流程甚至强制重传整个区块内容回来填充进来. 3. **写回策略(Write Back Policy):** 为了平衡实时响应速度同最终一致性目标两者间的矛盾关系, 开发者们提出了多种不同的提交时机安排方案可供选用, 如立即递交模式(immediate commit mode),延迟累积型(batched write-behind)等等... 上述措施共同构成了完整的 NFS 缓存协调框架, 力求满足大多数应用场景下的功能预期的同时兼顾性能表现指标. --- ```c // 示例代码展示如何手动调用 fsync() 函数以确保文件更改已记录至硬盘. #include <unistd.h> #include <fcntl.h> void ensure_persistent_changes(const char *filename){ int fd = open(filename,O_RDWR); if(fd != -1){ // 执行必要的 IO 操作... // 请求内核尽快把关联的所有修改推送到永久储存介质上去 fsync(fd); close(fd); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值