glib库头文件找不着 glib.h/glibconfig.h: no such file or directory glib-2.0使用pkg-configMakefile加上CFLAGS += `pkg-config --cflags glib-2.0`LDFLAGS += `pkg-config --libs glib-2.0`
ARM 指令集版本和ARM 版本 常常能看到ARM7,ARM9,ARM11,以及armv6k等不同的表达。且在GCC编译中,常常要用到 -march, -mcpu等。他们分别表达什么涵义呢?Sam自己也不很清楚,只是大概有个模糊的概念。今天就仔细研究一下。 ARM(Advanced RISC Machines)是微处理器行业的一家知名企业。设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。1985年,
ARM CPU 简单分类 - ARM7 系列 ARMv4T intruction set (but ARM7EJ use ARMv5TE) Core:ARM7TDMI 、 ARM7TDMI-S 、ARM720T 、 ARM7EJ No MMU 三级流水线- ARM9 系列 ARMv4T intruction set Core:ARM920T
Linux下C语言多线程编程 一、多线程的创建1、Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连 接时需要使用库libpthread.a。因此,后面的编译必须在选项中加入 -lpthread 选项,否则提示找不到pthread_create()这些函数。Linux下pthread的实现是通过系统调用clone()来实现的。C
迭代与递归:To Iterate,Human; to Recurse, Divine. 引言从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?「从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?『从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……』」什么是递归递归(Recursion),在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。为什么要用
qemu 二进制翻译 执行流程分析 一.qemu简介 qemu是使用动态二进制翻译的cpu模拟器,它支持两种运行模式:全系统模拟和用户态模拟。在全系统模拟下,qemu可以模拟处理器和各种外设,可以运行操作系统。用户态可以运行为另外一种cpu编译的进程,前提是两者运行的os要一致。qemu使用了动态二进制翻译将targetinstruction翻译成hostinstruction,完成这个工作的是tcg模块。为
Linux程序设计 清空标准输入缓冲区 今天在Linux程序设计的时候需要清空标准输入缓冲区,于是使用了如下Windows程序设计中的方法:1.fflush(stdin);这个fflush()函数根本不是标准C中的函数,只是标准C的扩展,所以在Linux中使用根本不行;2.中网上搜索了下,发现有网友建议使用rewind(stdin);这个函数其实是将指针指向流的开始处。但是它是文件操作中的一个函数,操作的是FILE型流,
将标准输出重定向到一个文件的同时并在屏幕上显示 一、标准输出+标准错误输出标准输出和标准错误,同时保存到文件logfile方法一: 2>&1 | tee [root@home root]# id das 2>&1 |tee logfileid: das: No such user[root@home root]# cat logfileid: das: No such user 注释:管道的作用为把
内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap系统调用 如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看。 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。发成缺页中断后,执行了那些操作?
ln命令 软链接建立与删除 1 . 使用方式 :ln [option] source_file dist_file (source_file是待建立链接文件的文件,dist_file是新创建的链接文件) -f 建立时,将同档案名删除. -i 删除前进行询问. ln -s abc cde 建
GDB调试命令总结 1:定位某变量/内存地址 何时被修改a为待观察的变量gdb> watch *(long*)agdb> watch *(long*)(a+4)gdb> watch *(long*)(a+8)2:查看数组的值。编程时:array[i]用GDB查看时,用 p array+i即可。3:善于使用$4: layout功能ctrl x 然后再 a 可以切换
系统调用,stat,fstat以及lstat函数:检查文件的属性 头文件:#include #include 定义函数:int stat(const char * file_name, struct stat *buf);函数说明:stat()用来将参数file_name 所指的文件状态, 复制到参数buf 所指的结构中 。 我们使用函数stat,fstat和lstat来检查文件的属性。这些函数使用struct
系统调用 stat(), fstat(), lstat() 函数 stat函数讲解表头文件: #include #include 定义函数: int stat(const char *file_name, struct stat *buf);函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中返回值: 执行成功则返回0,失
Linux内存管理 mmap系统调用 转自: http://blog.chinaunix.net/uid-26669729-id-3077015.html heavent2010的ChinaUnix博客一. mmap系统调用1. mmap系统调用 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零
printf_系统调用过程分析_write() putc() 函数实现 系统调用”是操作系统提供给用户程序进行调用的一些服务。这些服务是系统预先提供的函数,在这一点上系统调用与普通的用户程序是没有区别的。而区别则在于“系统调用”是由操作系统提供给用户的,这些服务更接近底层或者要求的安全性更高,因此由操作系统来统一实现和管理。 程序员在写程序的过程中会经常需要调用“系统调用”来完成特定的任务。我们以教学用的类Linux操作系统xv6为例,以打印操作为主线来说明
C++ 多态性的实现方式 C + + 中多态性的实现方式 多态性是面向对象程序设计的一大支柱,它指的是在基类中定义的属性或服务被派生类继承之后,可以表现出不同的行为. 也就是指一段程序能够处理不同类型对象的能力. 在面向对象程序设计语言C + + 中,这种多态性的实现方式有4 种,分别是强制多态、重载多态、类型参数化多态和包含多态. 其中,类型参数化多态和包含多态称为一般多态性,用来系统地描述语义
Linux 查看系统信息命令 cpu、内存、进程、硬盘、网卡 系统# uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo # 查看CPU信息# hostname # 查看计算机名# lspci -tv # 列出所有PCI设备# lsus
linux 输出 重定向命令 标准输入,输出和错误---------------------------------文件文件 描述符---------------------------------输入文件—标准输入 0输出文件—标准输出 1错误输出文件—标准错误 2---------------------------------
C语言字节对齐及设置编译对齐方式方法 一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果
linux less命令 less 在查看之前不会加载整个文件。可以尝试使用 less 和 vi 打开一个很大的文件,你就会看到它们之间在速度上的区别。 在 less 中导航命令类似于 vi。本文中将介绍一些导航命令以及使用 less 的其它一些技巧。 1 搜索当使用命令 less file-name 打开一个文件后,可以使用下面的方式在文件中搜索。搜索时整个文本中匹配的部分会被高亮
Linux grep 命令用法 相信grep是UNIX和LINUX中使用最广泛的命令之一。 grep(全局正则表达式版本)允许对文本文件进行模式查找。如果找到匹配模式,grep打印包含模式的所有行。grep支持基本正则表达式,也支持其扩展集。grep有三种变形,即: grep:标准grep命令,本章大部分篇幅集中讨论此格式。 egrep:扩展grep,支持基本及扩展的正则表达式,但不支持\q模
scons —— Python自动化编译构建工具 转载自:http://blog.csdn.net/sealyao/article/details/6402257一、概述 scons是一个Python写的自动化构建工具,和GNU make相比优点明显: 1、 移植性:python能运行的地方,就能运行scons 2、 扩展性:理论上scons只是提供了python的类,scons使用者可以在这个类的基
C语言中字符串如何转换为二进制、八进制、十进制、十六进制 在C语言某个程序当中需要把文本16进制转换成对应的16进制数,比如字符串"0x1a"转换成10进制的26,可以用以下函数来实现相关函数: atof, atoi, atol, strtod, strtoul表头文件: #include 定义函数: long int strtol(const char *nptr, char **endptr, int base);函数的解释说明
gcc 编译器常用的命令行参数汇总 gcc 编译器常用的命令行参数汇总1. gcc -E source_file.c-E,只执行到预编译。直接输出预编译结果。2. gcc -S source_file.c -S,只执行到源代码到汇编代码的转换,输出汇编代码。3. gcc -c source_file.c-c,只执行到编译,输出目标文件。4. gcc (-E/S/c/) sour
安装vmare-tools ——实现ubuntu与windows的互相复制与粘贴(无需共享文件夹) 这里主要解决的问题是如实现linux系统与windows系统之间能够方便快捷的实现复制粘贴,就像ctrl+c 与ctrl+v一样方便。一 安装前准备: 1、一定要先安装 build-essential软件,否则不能够顺利安装 $ sudo apt-get install build-essential 2、要安装linux-head
Linux命令 查看操作系统版本&&查看操作系统的位数 1. 查看内核版本命令: [root@localhost Addy]$ cat /proc/version Linux version 2.6.5-7.244-smp (geeko@ buildhost) (gcc version 3.3.3 (SuSE Linux)) #1 SMP Mon Dec 12 18:32:25 UTC 2005 [root@local
CentOS操作系统 GCC升级到4.6.1 一、安装环境系统版本:centos6.0 X64原GCC版本:gcc-4.4.4新GCC版本:gcc-4.6.1二、正式安装1、下载安装的源码:如下需要下载以下包:gcc-4.6.1.tar.bz2 gmp-4.3.2.tar.bz2 mpc-0.8.1.tar.gz mpfr-2.4.2.tar.bz2 下载地址如下: wget ftp://gcc.gnu.org
gcc 编译器 最常用的命令行参数 1. gcc -E source_file.c-E,只执行到预编译。直接输出预编译结果。2. gcc -S source_file.c -S,只执行到源代码到汇编代码的转换,输出汇编代码。3. gcc -c source_file.c-c,只执行到编译,输出目标文件。4. gcc (-E/S/c/) source_file.c -o output_filenam
likely() 和 unlikely() 功能分析 在程序中,偶尔可以见到 likely() 和 unlikely() 判断语句,那么为什么要用它们?它们之间有什么区别? 首先要明确: if(likely(value)) 等价于 if(value) if(unlikely(value)) 也等价于 if(value)也就是说 likely() 和 unlikely() 从阅读和理解
Linux vim快捷键操作命令整理 前言Vim是一个超牛的编辑器,命令功能十分强大 。而且这些命令大都可以进行组合 ,比如,9yy命令表示复制9行内容,9表示要复制的行数,同样100dd表示删除100行,当数字和命令合作的时候,就比单纯的命令更强大,同样,c命令表示擦除,w表示word即单词,那么cw就表示擦除一个单词,c5w就表示删除5个单词等等。将这些简单命令合成在一起,就可以发挥出难以想象的强大功能。宏命令(M
虚拟机操作系统文件夹空间不足解决办法——对虚拟硬盘进行分区和格式化及 挂载到某个文件夹下 对虚拟硬盘进行分区和格式化及 挂载到某个文件夹下。。。[root@cncmail data1]# fdisk -l ## 这里是查看目前系统上有几块硬盘Disk /dev/sda: 36.4 GB, 36401479680 bytes255 heads, 63 sectors/track, 4425 cylindersUnits = c
VMware 中添加新的虚拟磁盘的方法 下是在VMware 中添加新的虚拟磁盘的方法: 一、VMware新增磁盘的设置步骤(建议:在设置虚拟的时候,不要运行虚拟机的系统,不然添加了新的虚拟磁盘则要重启虚拟机)1、选择“VM”----“setting”并打开,将光标定位在hard Disk这一选项,然后点击下方的Add按钮2、点击next,执行下一个步骤
ELF格式文件符号表全解析及readelf命令使用方法 1. 读取ELF文件头:$ readelf -h signELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data:
乱序执行中 寄存器重命名(Register Renaming )技术介绍 寄存器重命名技术在乱序执行流水线中有两个作用。一是消除指令之间的寄存器读后写相关(WAR),和写后写相关(WAW);二是当指令执行发生例外或转移指令猜测错误而取消后面的指令时可以保证现场的精确。寄存器重命名的思路很简单:就是当一条指令写一个结果寄存器时不直接写到这个结果寄存器,而是先写到一个中间寄存器过渡一下,当这条指令提交的时候再写到结果寄存器中。指令重命名有两种方法:软件重命名
单发射与多发射 单发射与多发射 1 流水线(pipeline)技术: 是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。流水线是Intel首次在486芯片中开始使用的。流水线的工作方式就象工业生产上的装配流水线。在CPU中由5—6个不同功能的电路单元组成一条指令处理流水线,然后将一条X86指令分成5—6步后再由这些电路单元分别执行,这样就能实现在一个CPU时钟周期完成一条指令,
分支预测器(Branch Predictor) 汇总介绍 当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的不同,有可能会产生转跳,而这会打断流水线中指令的处理,因为处理器无法确定该指令的下一条指令,直到分支执行完毕。流水线越长,处理器等待的时间便越长,因为它必须等待分支指令处理完毕,才能确定下一条进入流水线的指令。 分支预测技术便是为解决这一问题而出现的。 分支预测技术包含编译时进行的静态分支预测和硬件在
存储一致性模型研究——Research of Memory Consistency Model 一致性模型:所谓存储一致性模型(Memory Consistency Model),实际上是系统设计者与应用程序员之间的一种约定。如果应用软件遵从一定的规则访问虚内存系统,则应用软件可获得正确的存储访问结果;反之,若破坏约定的规则,则存储访问的正确性不受保证。 从某种意义上来讲,存储一致性模型对共享存储系统中多处理机的访存次序作了限制,从而对性能有影响。分布式共享存储系统(DSM
ptrace运行原理及使用详解 你想过怎么实现对系统调用的拦截吗?你尝试过通过改变系统调用的参数来愚弄你的系统kernel吗?你想过调试器是如何使运行中的进程暂停并且控制它吗?你可能会开始考虑怎么使用复杂的kernel编程来达到目的,那么,你错了。实际上Linux提供了一种优雅的机制来完成这些:ptrace系统函数。 ptrace提供了一种使父进程得以监视和控制其它进程的方式,它还能够改变子进程中的寄存器和内核映像,因而可以
intel 性能监控计数器PMC寄存器详解 所有内容来自intel官方手册,章节号已给出。。。一 以下内容来自(P279):30.1 PERFORMANCE MONITORING OVERVIEW从Pentium奔腾处理器开始,Intel引入了一组计数寄存器用于做系统性能监视(System Performance monitoring)。针对不同型号的CPU处理器,它们各自拥有的性能计数寄存器是不同
MSR-Model Specific Registers (特殊模块寄存器) 一 概念Model Specific Register (MSR) as the name implies is model specific and may change from processor model number (n) to processor model number (n+1).二 读写方法MSR 是CPU 的一组64 位寄存器,可以分别通
关闭虚拟机操作系统的 “嘀嘀” 报警声问题 && vi命令编辑文件没有颜色区分问题 第一:解决嘀嘀声音问题 在使用VMware下Linux的时候 ,操作出错或按tab补全的时候老是会有“嘀嘀”的报警声音, 如何关闭? 步骤: ① 关闭虚拟机; ②在找到目标操作系统的文件夹,用文本编辑器打开 *.vmx文件; ③在里加入下面一行代码: mks.noBeep
处理器 性能监控计数寄存器——Performance Monitor Counter registers 简介: 为了了解在执行应用程序时在处理器中发生的情况,处理器架构师设计了一组特殊的寄存器,它们对在处理器执行指令时发生的事件进行计数。这些寄存器称为 Performance Monitor Counter,它们提供关于处理器的重要信息,比如发生了多少次 I-cache 失效、完成了多少个指令等等(为性能监控事件)。如果发生 D-cache 失效(处理器无法在 D-cache 中找
有2n个硬币和一个天平,其中有两个假硬币一个质量为m+1,一个质量为m-1,其余质量都为m,用O(logn)的时间复杂度找到这两个假硬币。 问题: 有2n个硬币和一个天平,其中有一个质量为m+1,一个质量为m-1,其余质量都为m,用O(logn)的时间复杂度找到这两个假硬币?解答: 假设2n有k个2进制位。设计k次称量,第i(i=1~k)次是把二进制序号第i位为0的硬币给取出来称。 这样第i次称量的结果如下,左边2列是偏重偏轻的硬币的序号在第i列的二进制值,第3列是第i次称量结果:
公司聚会喜欢程度计算 算法(动态规划)Dynamic Programming 问题: Professor Stewart is consulting for the president of a corporation that is planning a company party. The company has a hierarchical structure; that is, the supervisor relation forms a tree r
Counting Inversions 统计逆序数算法 问题: Recall the problem of finding the number of inversions. As in the course, we are given a sequence of n numbers a1, ..., an, which we assume are all distinct, and we difine an inversionto be
Historically Highest Index algorithm HH-index算法 In stock market, HH-index( historically highest ) of the current price isk means that current price it the highest price in the previousk days, but not the highest one in the previousk+1 days. Giv
用GIF图片来告诉大家程序猿的真实生活 ————“你熬了一整夜、耗了一整天,开始调试代码时:” 那张最有感觉了,你们感受一下。。。 程序猿是最苦逼的一群人,究竟有多苦? 用GIF图片来告诉大家程序猿的真实生活。当你往产品环境中加入一些东西时:当你没有Google就发现问题的解决方法时:当你没保存代码就关闭了IDE接口时:凌晨3点还在修Bug时:当表达式返回值正如你所料时:
加载动态链接库文件.so 失败出错—— No such file or directory (没有文件或目录)问题处理 例如程序通过dlopen加载当前目录下的lib.so。代码如下: void * lib_ptr = dlopen("lib.so",RTLD_NOW); if(lib_ptr == NULL) { printf("%s",dlerror()); } dlerror()返回的错误是" No such file or directory
Linux系统调用解析 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。 随Linux核心还提供了一些C语言函数库,这些库对
Linux 命令大全 ►名称:cat 使用权限:所有使用者 使用方式:cat [-AbeEnstTuv] [--help] [--version] fileName说明:把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档案) 参数: -n 或 --number 由 1 开始对所有输出的行数编号 -b 或 --number-nonblank 和 -n 相似,只不过对于空白行
Graphite Simulator模拟器详解 Graphite模拟器 Graphite Simulator是由MIT的Carbon研究组开发的一款并行分布式全系统模拟器。设计目标是针对与未来的多核甚至千核,提供高性能的设计和软件开发平台。使用了直接执行、无缝多核和多机分布、可分析性建模、松散同步等技术来提高模拟性能。提供了功能模拟和性能模拟两方面的模型,能够模拟core、NoC、存储子系统包括维护cache一致性的cache
C语言中可变参数的用法——va_list、va_start、va_arg、va_end参数定义 C语言可变参简介 我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法: printf("%d",i);
linux 中C语言便于调试的宏定义编写及 __FILE__,__FUNCTION__, __LINE__参数使用 在linux编程中,当文件数量变的众多之后,使用gdb调试就是一场灾难。因此在程序中加入合理的打印信息,定位错误出现的文件名,函数名,行号等信息,能更高效的定位到问题的所在。 下面定义了宏,分别是WARNING,INFO,ERROR,SHOW_TIME,DEBUG等。利用了 __FILE__,_FUNCTION__, __LINE__等变量。。。 _FILE__,__FU
C语言中access函数 头文件:io.h 功 能: 确定文件或文件夹的访问权限。即,检查某个文件的存取方式,比如说是只读方式、只写方式等。如果指定的存取方式有效,则函数返回0,否则函数返回-1。 用 法: int access(const char *filenpath, int mode); 或者int_access( const char *path, int mode );
linux 互斥锁pthread_mutex_t 等其它函数定义 及 应用实例 linux下为了多线程同步,通常用到锁的概念。 互斥锁是一种通过简单的加锁的方法来控制对共享资源的存取,用于解决线程间资源访问的唯一性问题。互斥锁有上锁和解锁两种状态,在同一时刻只能有一个线程掌握某个互斥的锁,拥有上锁状态的线程可以对共享资源进行操作。若其他线程希望对一个已经上了锁的互斥锁上锁,则该线程会被挂起,直到上锁的线程释放掉互斥锁为止。 p
C语言编程技巧——signal(信号) 函数、信号机制及软中断详解 Signal()函数使用简介 signal()是一种系统调用,用于通知运行时系统,当某种特定的“软件中断”发生时调用特定的程序。它的真正的名字应该是“Call_that_routine_when_this_interrupt_Comes_in(当该中断发生时调用那个程序)", 调用signal()函数,并通过参数传递告诉它终端类型以及用于处理中断的程序。
C语言随机函数 rand()\srand()\randomize() 使用总结 说明: 1、这两个函数都在头文件是stdlib.h中。 2、rand()函数和srand()函数必须配套使用。(1) rand()函数: 原型: int rand(void) 功能: 产生从0到RAND_MAX(0x7fff)之间的随机数。 头文件: stdlib.h 例: #include #i
Simplescalar 模拟器介绍 及 sim-outorder超标量乱序执行步骤详解 SimpleScalar模拟器是一个超标量、5级流水的RISC(Reduced Instruction Set Computing)体系结构模拟器,提供了从最简单的功能模拟到超标量乱序发射的不同的模拟程序。 SimpleScalar模拟器在功能级上实现了执行驱动、解释执行,在行为级上实现了流水线模拟。该工具集提供了一个以GCC为主的编译器以及相关组件,能够产生基于SimpleSca
Could not read symbols:Linux/UNIX系统下编译时,常见的一类报错信息解决方法 ----陈运文 通常情况下,该编译报错信息之前会给出出现错误的静态库(.a结尾文件)、或动态库(.so结尾文件),该报错的基本原因是当前编译器无法对库文件进行正确的解析Could not read symbols报错类型 具体的报错信息会在Could not read symbols:字段后给出,常见的一些报警信息形如: /usr/lib/libdemo.so: co
linux 下动态链接库的创建与使用——dlopen,dlsym 一、引言 通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件名为“libxxx.
uC/OS-II 中的优先级翻转问题分析 1、uC/OS-II中的优先级翻转问题 当涉及到共享资源的互斥访问时,多任务实时操作系统常常会出现优先级翻转问题(priority inversion),不能保证高优先级任务的响应时间,影响系统的实时性,uC/OS-II中也存在同样问题。所谓优先级翻转问题(priority inversion)即当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,而这
GEM5 模拟器简介 GEM5是一款模块化的离散事件驱动全系统模拟器,它结合了M5和GEMS中最优秀的部分,是一款高度可配置、集成多种ISA和多种CPU模型的体系结构模拟器。M5是由Michigan大学开发的一款开源的多处理机模拟器,受到了业内的广泛关注,很多高水平论文都采用M5作为研究工具。另一方面,Wisconsin推出的GEMS能够对储存层次进行详细而灵活的模拟,包括对多种不同的cache一致性协议和互联模型的支