做为程序员大家天天都在不停的写各种各种程序,想着如何如何改变世界(曾经我是这么想的,但是现在我还是这么想的)。但我在工作中发现好多同事对计算机本身这个东西并不了解,尤其是cpu、内存、网络、磁盘等等。不知道他们是如何运转的。这也不能怪我们,现在的高级语言对他们封装的太好了,好到我们都不知道他们是否还存在了。但是我编写的程序需要运行在她们上面,一不小心我们就会被她们捉弄了(相信大家都有这样的体会,网络怎么慢了、磁盘IO怎么慢了、线程怎么被夯住了等等),解决这些问题真的很辣手啊。在开发出高性能高可靠的程序的时候你要非常了解你的宿主服务器,我们在日常工作中都是在不停的压榨我们的宿主服务器(把宝宝都压榨的骨瘦如柴,我都看不下去了)。我分享一下我自己对计算机的一些认识。

一、从cup到内存的距离

CPU是机器的心脏,你的所有的程序最终都是由它来执行和运算的。主内存(RAM)是你的数据(包括代码行)存放的地方。本文将忽略硬件驱动和网络之类的东西,我们的程序的目标是尽可能多的在内存中运行。CPU和主内存之间有好几层缓存,因为即使直接访问主内存也是非常慢的。如果你正在多次对一块数据做相同的运算,那么在执行运算的时候把它加载到离CPU很近的地方就有意义了。

cpu-memory

越靠近CPU的缓存越快也越小。所以L1缓存很小但很快(译注:L1表示一级缓存),并且紧靠着在使用它的CPU内核。L2大一些,也慢一些,并且仍然只能被一个单独的 CPU 核使用。L3在现代多核机器中更普遍,仍然更大,更慢,并且被单个插槽上的所有 CPU 核共享。最后,你拥有一块主存,由全部插槽上的所有 CPU 核共享。

cpu到各个缓存的时间:

cpu到各个缓存的时间

二、cup如何调戏内存

当CPU执行运算的时候,它先去L1查找所需的数据,再去L2,然后是L3,最后如果这些缓存中都没有,所需的数据就要去主内存拿。走得越远,运算耗费的时间就越长。所以如果你在做一些很频繁的事,你要确保数据在L1缓存中。当这份数据运行完整后CPU会把数据回写到主内存中去。

数据在缓存中不是以独立的项来存储的,如不是一个单独的变量,也不是一个单独的指针。缓存是由缓存行组成的,通常是64字节(译注:这篇文章发表时常用处理器的缓存行是64字节的,比较旧的处理器缓存行是32字节),并且它有效地引用主内存中的一块地址。一个Java的long类型是8字节,因此在一个缓存行中可以存8个long类型的变量。非常奇妙的是如果你访问一个long数组,当数组中的一个值被加载到缓存中,它会额外加载另外7个。

问题:如果同一份数据同时被两个cup加载并且都缓存到各自的L1缓存中时,如何保证这两份数据的一致性?

cpu有个缓存一致性协议,这类协议有MSI、MESI、MOSI及Dragon Protocol,基本的思想是cpu通过各种机制保证:当一份在多cpu共享的数据,其中一个cpu有修改时并写回主内存后,别的cpu缓存会无效,使用时会强制从主内存加载。

缓存一致性协议

三、mmap技术

当我们在操作一个文件时,linux是这样的:常规文件操作为了提高读写效率和保护磁盘,使用了页缓存机制。这样造成读文件时需要先将文件页从磁盘拷贝到页缓存中,由于页缓存处在内核空间,不能被用户进程直接寻址,所以还需要将页缓存中数据页再次拷贝到内存对应的用户空间中。这样,通过了两次数据拷贝过程,才能完成进程对文件内容的获取任务。写操作也是一样,待写入的buffer在内核空间不能直接访问,必须要先拷贝至内核空间对应的主存,再写回磁盘中(延迟写回),也是需要两次数据拷贝。而使用mmap操作文件中,创建新的虚拟内存区域和建立文件磁盘地址和虚拟内存区域映射这两步,没有任何文件拷贝操作。而之后访问数据时发现内存中并无数据而发起的缺页异常过程,可以通过已经建立好的映射关系,只使用一次数据拷贝,就从磁盘中将数据传入内存的用户空间中,供进程使用。

mmap

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。

如果大家有平凡的对文件的读写操作建议使用mmap,现在各个高级语言已经支持如java的MappedByteBuffer等。现在好多中间件的文件操作都是使用mmap技术。

四、Zero-Copy技术

许多web应用都会向用户提供大量的静态内容,这意味着有很多data从硬盘读出之后,会原封不动的通过socket传输给用户。这种操作看起来可能不会怎么消耗CPU,但是实际上它是低效的:kernal把数据从disk读出来,然后把它传输给user级的application,然后application再次把同样的内容再传回给处于kernal级的socket。这种场景下,application实际上只是作为一种低效的中间介质,用来把disk file的data传给socket。

data每次穿过user-kernel boundary,都会被copy,这会消耗cpu,并且占用RAM的带宽。幸运的是,你可以用一种叫做Zero-Copy的技术来去掉这些无谓的copy。应用程序用zero copy来请求kernel直接把disk的data传输给socket,而不是通过应用程序传输。Zero copy大大提高了应用程序的性能,并且减少了kernel和user模式的上下文切换。现在各个高级语言已经完美支持Zero-Copy技术,javaapi的java.nio.channel.FileChannel的transferTo()方法。

计算机内部对,聊聊计算机内部的东西--一对吵闹的夫妻(CPU和RAM)相关推荐

  1. 强制重启计算机_我的计算机如何能够自行重启?

    强制重启计算机 It's such a common place activity that most of us have likely never stopped to even think ab ...

  2. 点击泰坦单位计算机,泰坦导弹制导计算机内部

    作者最近一直在研究 Titan II核导弹的制导计算机.这台小型计算机在 1970 年代用于引导 Titan II 核导弹对准目标,或将 Titan IIIC 火箭送入正确的轨道.该计算机与惯性测量单 ...

  3. 国家一级计算机等级考试 阴影效果的预设值为内部右上角,全国计算机等级考试一级练习题(1)解析...

    <全国计算机等级考试一级练习题(1)解析>由会员分享,可在线阅读,更多相关<全国计算机等级考试一级练习题(1)解析(18页珍藏版)>请在人人文库网上搜索. 1.全国计算机等级考 ...

  4. 当前使用的个人计算机中在cpu内部,江苏省一级计算机信息技术及应用考试(样卷)(2015秋)...

    江苏省一级计算机信息技术及应用考试(样卷)(2015秋起执行) 江苏省高等学校计算机等级考试 一级计算机信息技术及应用考试(样卷)(2015秋) (本试卷完成时间90分钟) 一.基础知识题(共45分, ...

  5. 内部计算机是否可以存储器,计算机基本理论基础知识总汇.

    计算机基本理论基础知识总汇. 32.BIOS是用来控制主板的一些最基本的(输入系统)和(输出系统) 33.扩展槽包括(CPU插槽)(控制芯片)(键盘和面板控制开关接口)(指 示灯插接件)(扩充插槽)等 ...

  6. 智能不属于计算机理论,讨论:计算机如何能提出自己的理论

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 作者: 没事少抽烟 2006-8-28 13:20 1.如何定义"AI自己的理论"这个命题?AI是简单的输出几个单词还是提出具体的理论 ...

  7. 对计算机的分析,对计算机思维的逻辑分析(范文).doc

    对计算机思维的逻辑分析(范文) 第 PAGE \* Arabic 1 页第 PAGE \* Arabic 1 页 对计算机思维的逻辑分析 " 计算机思维",指的是"计算机 ...

  8. 计算机类学生综合素质论文,【计算机教学论文】计算机教学中培养学生综合素质的探讨(共2338字)...

    关键词:计算机教学:综合素质:培养 1重视非智力因素的培养,形成良好的学习习惯 在教学中,我们常常发现很多学生对计算机的学习一开始不仅兴趣浓,而且动力足,热情高,但随着内容的增多,难度的加大,不少学生 ...

  9. 计算机的人分类,计算机的分类

    一 计算机的分类 计算机的分类很多 一般可以从下面几个方面来划分 1 从计算机规模来分 有巨型机 大型机 中型机 小型机和微型机 Personal Computer 2 从信息表现形式和被处理的信息来 ...

最新文章

  1. 另一个.java文件调用_java - 如何调用另一个类“写文件”的方法? - SO中文参考 - www.soinside.com...
  2. 大数据量传输时配置WCF的注意事项
  3. java linux res很高_Linux下Java进程RES是1.6G,但是jmap里用到的才五百多M,剩下的1.1G左右是去哪了?...
  4. java 加法表编程_java编程——数据的加法
  5. 【Lucene】Lucene的使用和优化
  6. Java笔记-WEB算术验证码
  7. Linux系统有线网络抓包程序
  8. Werkzeug routing
  9. Shiro配置cookie以及共享Session和Session失效问题
  10. AnsiString用法(转)
  11. 电子罗盘电磁干扰_车载电子罗盘中的一种新型抗干扰设计
  12. android虚拟pdf打印机,pdf虚拟打印机(PDF-XChange Lite Printer)
  13. TensorFlow之saved_model使用笔记
  14. oauth2+JWT实现oauth2服务
  15. 如何设置一个可扩展的MongoDB数据库?
  16. 详解与重构hyman《Android SurfaceView实战 打造抽奖转盘》
  17. c语言从键盘输入十个整数,冒泡法从大到小排序
  18. 源发行版 8 需要目标发行版 1.8
  19. 震惊!网瘾少年在冒险岛的逆袭之路
  20. 中科院大牛博士是如何进行文献检索和阅读的(好习惯受益终生)

热门文章

  1. 从技术转管理,做了什么来拯救自己?
  2. 鸿蒙9月22日,华为鸿蒙OS或在9月22日发布,Mate30 Pro渲染图曝光,谷歌急了!
  3. [go] 360安全卫士七 --带动画效果的登陆框
  4. ValueError: unsupported pickle protocol: 5
  5. Linux 5.17将引入新驱动程序来修复x86平板电脑问题
  6. python 生成md5
  7. gtest基础使用10:Google Test自带示例七:通过TestWithParam进行接口测试
  8. 三星s4android操作系统耗电,三星s4耗电快怎么办?怎么解决?三星Galaxy S4耗电问题的解决方法...
  9. AUTO CAD Electrical缺少AceRedist文件
  10. QT学习笔记之QMainWindow