目录
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
它是由如下及部分构成:

其中:
输入设备:键盘、话筒、摄像头、网卡、磁盘等
- 计算机的本质是计算数据,要计算数据第一步是想办法把数据交给计算机,需要有对应的设备来采集相应的数据,这就需要使用输入设备。
输出设备:显示器、磁盘、网卡、声卡、音箱等
- 计算机的作用是服务用户,计算完数据后需要将数据输出给用户,这就需要输出设备
存储器:内存
CPU;运算器、控制器
计算机的本质工作是计算,CPU就是用来计算的,这是必不可少的。
比如我们今天买了一部手机,这个手机没有芯片,那也只能当作移到硬盘来用。
注意:同种设备可能即使输入设备,也是输出设备
如磁盘、网卡等,
存储器不是磁盘,是内存,之后会反复用到内存
上面讲了冯诺依曼体系中输入设备、输出设备、CPU为什么存在,那为什么要有**存储器(内存)**呢?这是本文的一个重点。我们需要一一讲解。
我们必须先来简绍一个常识
外设和内存特点:
外设的速度非常的慢
内存的速度比外设快的多
举例:
以磁盘为例(磁盘我们经常会接触到),我们在网上分别去买磁盘和存储器,磁盘我们可以买到七八百G的磁盘,而要是去买存储器(内存),只能买到4G或8G的内存条。
我们知道,内存和磁盘都可以保存数据,磁盘这样的设备我们将数据存入后,就不会丢失,而内存却是”掉电易失“存储介质,当我们的电脑突然关机将电源切断(对内存不在供电),内存中的数据也就没了。但内存的价格却是要比磁盘贵的。
内存凭什么贵呢?就凭它”掉电易失“吗?
当然不是这样,原因如下
- 内存的优势就是存储数据快
- 它本身制造成本高
谁都知道计算机越快越好,那为什么不把磁盘换成内存,提高存储速度,就是因为它的成本高。
如果将磁盘换为大小相同的内存,一台电脑的售价就会暴涨,这不是一般人能够消费的,不利于电脑的销售(不利于资本家挣钱),所以现在的电脑其实是一个性价比产品。
磁盘还是在我们自己电脑上,速度就慢于内存,而其它的外设,如网卡,需要借助网路,数据的传输更是在千里之外,速度就更慢了,所以我们必须明确一点,外设的速度相比于其它设备非常的慢。
上面讲了内存的速度要比外设的速度快,很多人会有疑问,计算机中快当然好,我们可以快速的存储数据,但是内存是”掉电易失“的,而且价格高,意味着我们最后存储数据的位置依然是磁盘,是不是可以去掉存储器,将CPU和输入设备输出设备直接连接呢?如下面的简易模型

首先,这么做一定是可以的,也能创造出一个计算机来,但是,这么做是要付出代价的。
这里在简绍一个概念:
在整个计算机中,内存还不是最快的,CPU以及CPU中的寄存器存储计算数据才是最快的。
注意: 寄存器最快,也最贵,存储数据最少,计算机中的数据很多,寄存器用来存储当前需要CPU运算的数据,不能被替代。
我们可以这样看代码计算机中各设备的速度:CPU的工作速度是纳秒级,内存的速度是微妙级,外设是毫秒级
1秒 (s) =1000 毫秒 (ms) = 1,000,000 微秒 (μs) = 1,000,000,000 纳秒 (ns)
这时我们已经知道,外设的速度是很慢的,而CPU的速度非常快,这样的计算机我们就能参考木桶原理
一个木桶中可以存放多少水,不是由最长的那片木头决定的,而是由最短的那片木头决定的。
再来看一下计算机,CPU的速度非常的快,而外设的速度非常慢,那该计算机整体的速率就以外设为主。
有了这些知识,下面我们看一下本文的重点,分别来看一下计算机在有无内存的情况下的速率。
CPU每次处理数据的大小是有限的,在没有内存的情况下,输入设备向CPU直接传入数据,CPU计算后再向输出设备传输数据,接着等待输入设备下一次的数据传入,计算机整体的速率就是外设的速率。
铺垫: CPU每次处理数据的大小有限,内存具有存储数据的能力,CPU的处理数据和内存加载数据可以同时进行。
根据统计学原理,当一个数据被访问时,那么下一次有很大可能访问的就是周围的数据,所以当CPU需要处理一段数据时,内存会将该数据和周围的数据一同加载进来,在CPU处理数据的同时,内存仍在工作,那下次CPU就可以在内存中获取数据。
输出数据也是相同的,CPU处理完数据后将数据放入内存中,当输出数据需要时,在从内存中获取。
所以,此时计算机的速率就是内存的速率
相对于无内存的情况,有内存时的情况要快很多。这就是内存的意义。

结合上面的知识,根据该图我们可以知道:
站在硬件和数据层面上,CPU与存储器相互传输数据,同时控制外设和存储器,告知需要处理的数据,汇总到存储器,在由CPU处理,处理后,返回给存储器,最后控制存储器存入外设。
总结:
- 在数据层面上,CPU不和外设直接沟通,而是直接和内存打交道
- 在数据层面上,外设只和内存打交道
这就是为什么,我们常听说,我们编写的C程序需要在运行先加载到内存。
因为CPU只和内存打交道,可执行程序就是一个文件,它放在磁盘中,需要先将其从外设中加载到内存,CPU才可以使其运行从而得到结果。在Windows中双击后即加载到内存,Linux中使用./后加载到内存。
这就是用硬件方案解释软件现象。
扩展:
我们经常说CPU当中有寄存器,实际上寄存器不仅在CPU中,在其它外设中也有寄存器。
如:当我们敲击键盘时,键盘是先将获取到的内容存储在寄存器当中,然后通过寄存器将数据写入内存中。
在物理层面,各个硬件单元之间是通过总线连接的,外设与内存之间的总线叫做IO总线,内存与CPU之间的总线叫做系统总线。
在早些年的计算机中,因为芯片能力不强,有时是之间将外设中的数据传输给CPU,CPU计算完后在交给内存,在合适的时候由内存拿出数据。现在不在使用这个技术,而是在外设中使用DMA芯片,将外设的数据存入内存,不在利用CPU。
在数据层面上,CPU不和外设交互,但有时候,有些控制信号需要二者交互。
如:一些外设给CPU发送控制信号,请求帮助处理一些数据。
我们已经有了对冯诺依曼体系的理解,接下来我们就可以看一下,在硬件层面,单机和跨主机之间,数据流是如何流向的!
也就是研究,我们使用./将我们的程序加载到内存,然后执行我们的代码,最后在外设显示器上打印,它的整个数据流在硬件上是如何走的。
该内容难度不高,作为理解软件的工具。
因为软件是无法脱离硬件的,当我们理解了硬件的数据流向,软件上的很多行为我们就可以尝试去理解它了。

以在音乐播放器(网易云音乐)播放音乐为例:
首先,我们的客户端软件,先加载到内存,然后由CPU执行,接着我们就看到了网易云的界面,
其次,我们点击播放音乐,通过外设的网卡,拿到数据,再将数据传输到内存,经CPU计算(此时的计算可以看作解析),计算后将计算结果返回到内存,由内存传到外设,传到计算机的音箱中播放出来。
以两个人(A和B)在QQ中聊天为例:
当A给B发送”在吗?“,数据是怎样流的的?(不考虑网络)
要使用QQ,首先需要联网,而A和B的电脑都是冯诺依曼体系结构,在A向B发送消息的过程中,A电脑中的键盘充当输入设备、显示器和网卡是输出设备。B电脑中的网卡充当输入设备、显示器充是输出设备。

A在键盘上输入数据,在硬件上讲,将数据输入到内存,在软件上讲,将数据输入到QQ中。然后数据要经过计算和加密,经由CPU计算,将计算结果传回内存,由内存传到外设,这里是传到了两个地方,一个是A自己的显示器,因为他输入的消息,他自己也要看到,另一个传到了网卡,经由网卡传给B。
B的计算机通过网卡拿到数据,将数据传给内存,经过CPU进行解密操作,在传回内存,由内存传到外设中的显示器,使B看到该消息。
其中,将外设中的数据读入内存,将数据显示在显示器上和发送到网卡,都是由软件(QQ)内部自己来完成。
从外设获得数据这样的操作,我们并不少见,比如C语言中的scanf,printf,都是从外设获得数据。
总结: 数据的流动必须遵守冯诺依曼的结构。
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"
对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化
在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto
Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好
文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分
我目前还在上学,正在上一门关于用C++实现数据结构的类(class)。在业余时间,我喜欢使用“高级”语言(主要是Ruby和一些c#)进行编程。既然这些高级语言为你管理内存,你会用数据结构做什么?我可以理解对队列和堆栈的需求,但是您需要在Ruby中使用二叉树吗?还是2-3-4树?为什么?谢谢。 最佳答案 Sosincethesehigherlevellanguagesmanagethememoryforyou,whatwouldyouusedatastructuresfor?使用数据结构的主要原因与垃圾收集无关。但它是以某种方式有效的
如何在Ruby中获取linux系统(这必须适用于Fedora、Ubuntu等)的软件/硬件信息? 最佳答案 Chef背后的优秀人才,拥有一颗名为Ohai的优秀gemhttps://github.com/opscode/ohai以散列形式返回系统信息,例如操作系统、内核、规范、fqdn、磁盘、空间、内存、用户、接口(interface)、sshkey等。它非常完整,非常好。它还会安装命令行二进制文件(也称为ohai)。 关于ruby-如何在Ruby中获取linux系统信息,我们在Stack