MMU内存管理单元和volatile

张开发
2026/4/17 15:56:46 15 分钟阅读

分享文章

MMU内存管理单元和volatile
1、MMU是计算机硬件中的一个关键组件它的核心作用是将程序使用的虚拟地址也称为逻辑地址转换为实实在在的物理内存中的物理地址2、PLC为了稳定可靠基本上都没有MMU因此不能跑多进程一般叫task多任务MMU将不同进程间的内存隔离开因此MMU是多进程的基础3、针对ARM架构的芯片部分有MMU部分没有MMU。3、程序在编译期间为了让程序跑得更快在编译时会进行优化可能会自作主张的把某个变量临时放在寄存器里后面直接从寄存器读而不是去内存里取。但是如果这个变量属于多线程中的共享数据在其他线程中会被修改如果再不从内存中取数据就会造成异常这时候volatile关键字就起作用了要求编译器不对该数据优化每次访问这个变量都必须从它的内存重新读取不能使用寄存器里的缓存值。还有某些硬件寄存器映射会被硬件或者中断等操作给修改了值每次使用它的时候必须去它的原始地址查看不能读取缓存的数据。4、在非标准语法中有支持多线程并行执行的编译语句使用的是OpenMP标准C和C支持该标准。OpenMP是一个用于共享内存并行编程的应用程序接口API它支持多种编程语言主要是C/C/Fortran等。特点1共享内存模型所有线程共享同一块内存空间线程之间通过共享变量进行通信适用于多核/多处理器系统2简单易用通过编译器指令pragma实现并行无需手动管理线程的创建和销毁代码入侵性小串行代码稍作修改即可并行。#include stdio.h double compute_pi_seq(const long num_steps) { double step 1.0 / num_steps; double sum 0.0; #pragma omp parallel for reduction(:sum) for (long i 0; i num_steps; i) { double x (i 0.5) * step; sum 4.0 / (1.0 x * x); } return step * sum; } int main() { long num_steps 1000000000; double pi compute_pi_seq(num_steps); printf(Computed value of pi: %.15f\n, pi); return 0; }以上代码中计算Πpai的公式#pragma omp parallel for reduction(:sum)这一句就是使用了OpenMP标准的预编译指令含义将下面的for循环并行化执行多个线程同时计算计算过程中对于共享变量sum采用变量快照的形式每个线程有自己的sum副本循环结束后将所有副本累加计算。reduction规约支持的操作有

更多文章