冯若依曼体系结构的现代计算机的工作原理 是存储程序 程序控制 还是程序存储 程序控制 ??

最开始以为忆阻器只是一个电气特性更加优越的存储元器件。

高速存储和低速存储实现完全统一,会很大改变计算机体系结构,会是很大飞跃。

但如果它既能作为存储单元又能构建计算回路,并且可以动态改变。

那么统一存储这个优点在这个特性面前就小到微不足道的了。

这代表可在硬件级可以实现数据和计算的统一,计算逻辑能自我调整。

如果是这样,计算机体系和所有依赖计算机的工业体系都会被彻底颠覆革新。

如果真的做到了,需要考虑的不只是计算机前景,是人类这个物种的前景。

在我们教科书上会提到分时系统、批处理系统等等现代操作系统前的中间产物,也会讲到管理硬件的功能,但似乎没有讲到为什么有操作系统这个东西,诞生操作系统是为了解决什么样的问题?下面就来通俗易懂的聊聊为什么有这个东西。

假设在远古时代的计算机需要由人工进行运行操作,但是运行期间又不需要更多的人为干预,这个时候人就空闲下来了,但是计算机被这个任务占据了,啥也干不了,白白的浪费时间(程序员的工资那么高,时间这么浪费了的话,损失惨重!),而且对于计算机的核心部件 CPU 来说,并不是一直有数据可以来运行,也有对于其他部件的操作等待,比如 IO 操作,在等待 IO 的时间里特别漫长,这就浪费了宝贵的 CPU 资源。所以这样的计算机运行状况是非常低效的,那么操作系统解决的一个问题就是提高效率,提高 CPU 的使用率,不让 CPU 休息,疯狂压榨它!!!


同时,计算机操作人员直接操作计算机硬件的话,非常麻烦,还容易出错,所以人们总是寻求一些办法来解决现有问题,这种解决问题的方法论在哪个学科都成立,既然麻烦,那何不根据计算机领域哲学方法论:添加一个中间层来解决现有问题,那么操作系统就是相对于硬件的中间层。它的出现就屏蔽了底层硬件的细节,从而让出错的概率大大降低,以及让计算机操作人员更加顺风顺水的操作,程序也开始可以被操作系统自动管理。

上面提到的两个问题可以归结于三个字:自动化。程序员总是趋向于追求自动化,比如自动化测试等等。自动化有什么好处呢?借用一句工业革命时期的话那就是:解放生产力。代替那些重复性工作。

所以操作系统的出现也可比喻成生产力的解放,使得程序运行更加高效。

既然我们知道了需要这么一个操作系统来进行自动化运行,那么什么是操作系统呢,为什么叫操作系统而不叫管理系统或者其他名字呢?

操作系统的英文名为:Operating Systems. 翻译为操作系统,操作二字有点流水线工人操作员的意味,是不是感觉有点土。这么理解的话,那就有些许偏差了,再来一个英语词汇:Operating Surgeon. 这个词汇的意思是主刀大夫. 主刀大夫是什么人物?在整个手术室里是权威呀,说上麻药,麻醉师马上就位,说要 xx 手术刀,助理大夫马上送到,是主宰手术室一切的人物。所以操作系统就是主宰一切的系统,计算机体系世界里的一把手。

那么操作系统主宰的一切,这一切包含什么呢?

当然是计算机上里发生的一切事情。在最原始的计算机并没有操作系统,而是直接由人来掌控事情,即所谓的单一控制终端、单一操作员模式。但是随着计算机复杂性的增长,人已经不能胜任直接掌控计算机了。于是我们编写出操作系统来掌控计算机,将人类从日益复杂的掌控任务中解脱出来。

所以明确的说操作系统就是 掌控计算机一切的舵主,权威至上。

我们知道操作系统管理计算机的一切,那操作系统具体管理哪些东西?

操作系统管理哪些东西?

还是来张图已显得更加清晰。如下图。操作系统的 4 个核心管理,当然还有其他的一些安全性管理等等。


如图,第一个是进程管理,管理要素包含三个:第一个是公平,即每个程序都有机会被 CPU 执行。第二个是非阻塞,任何一个程序不能无限制的阻塞 CPU 给其他程序执行。如果一个程序在运行过程中需要输入输出或者因别的什么事情而发生阻塞,这个阻塞不能妨碍其他进程继续运行。第三个是优先级,CPU 也是分优先级的,也就说优先级高的进程会首先被 CPU 执行,都优先级其次。

内存管理主要是管理缓存、主存、磁盘、磁带等存储介质所形成的内存架构。为实现这一内存架构,设计了虚拟内存这一层结构,即将物理内存扩充到外部存储介质上。这样内存的空间就大大地增加了,能够运行的程序的大小也大大地增加了。内存管理的另一个目的是让很多程序 共享同一个物理内存。这就需要对物理内存进行分割和保护,不让一个程序访问另一个程序所占的内存空间。

外存管理通常也称为存储管理,它也就是文件系统管理了。文件系统的主要目的是将磁盘变成一个很容 易使用的存储媒介以提供给用户使用。这样我们在访问磁盘时无须了解磁盘的物理属性或数据在磁盘上的精确位置,诸如磁道、磁柱、扇面等。当然,文件系统还可以建立在光盘和磁带上。只是使用最为频繁的文件 系统都以磁盘为介质。

I/O 管理也称为设备管理,就是管理输入输出设备。I/O 管理的目的有两个:一是屏蔽不同设备的差异性,即用户用同样的方式访问不同的设备,从而降低编程的难度,你要知道目前存在有上万种 IO 设备,每个 IO 设备的适配都是在这里进行的,这是抽象和封装的魅力;二是提供并发访问,即将那些看上去并不具备共享特性的设备(如打印机等)变得可以共享。

上面三个问题,我们走进了操作系统的世界,了解了操作系统为何而来,它又在干些什么,下面还是来进入主题,操作系统历史,那么操作系统到底经历了些什么呢?老规矩:一图胜千言。


我们就从萌芽阶段的状态机系统来讲起。

状态机系统是计算机在萌芽阶段出现的,也就是大概 1940 年以前。其实这种系统其实都不能算做操作系统,因为他就是一种简单的状态转换程序,通过特定的输入和特定的状态进行转换。能做的计算也非常简单,也就仅限于加减法,也不支持命令交互等等功能。当然,它有一个非常大的好处,没有安全风险,没几个人能接触到它,自然就不存在安全问题了。

第二阶段:单一控制系统

学过计算机导论的话,你应该了解计算机领域的的经典模型——冯若依曼体系结构原理,它是 1945 年左右提出的,属于这个时期,那还记得我们全世界的第一台电子计算机是什么时候出现的吗?没错,也是这个时期出现的,时间是 1946 年 2 月,诞生在美国的宾夕法尼亚大学,名称叫做 ENIAC。


这台电子计算机其实没有搭载所谓的操作系统,他只是提供了一些标准的命令给用户使用,这些标准的命令集就构成了原始的操作系统 SOSC(System Operation Support Center)。这些 SOSC 满足了系统运行的基本功能,提供人机交互功能,在这种情况下,任何时刻却只能做一件事,不支持并发也不支持多道程序设计。在这种系统下的资源利用率很低很低,你输入一个命令它就执行一次,类似于拨一下就动一下,但是动的拿一下又全部占用计算机。这种情况,我们可以理想成只有一个程序能运行。从机器的角度出发,时时刻刻都要等着人来操作,效率真的太低了,详细情况看看下图更清晰。


多个人需要使用这台计算机,指令就会断断续续,就会影响效率,就算是一个人输入多个命令,相比于计算机来讲,人输入的指令速度也会很慢。

那有没有不等人的操作让其自己执行呢?随着计算机的发展那当然有了,接下来就打破这种过于笨拙的情况,来到自动化一点的时代。

在仔细考察了 SOSC 后,人们发现,SOSC 效率之所以低下,是因为计算机总是在等待人的下一步动作,而人的动作总是很慢。因此,人们觉得,如果去掉等待人输入命令的时间,即让所有的人先想好自己要运行的命令构成一个程序,然后列成一个清单,打印在纸带上,然后交给一个操作人员来一批一批地处理,效率不就提高了吗?这样就形成了批处理操作系统。这是又大大提高单一控制终端的操作系统 SOSC 的效率。


显然,在这种工作模式下,系统的功能得到了提升,必然复杂性也随之提升,在这种系统下,用户只管把程序放在磁带上,用户自己可以不在场而去干别的,接下里就是由操作员操作批处理系统来处理一个个任务,处理完了就给出结果。最早的自动化处理雏形出现了。但是这个时候也只能一个个任务处理,一个任务读取 IO 的时候 CPU 就等待下来了,还是在一定程度上会影响 CPU 运行的效率,有没有办法再提高一些呢。这个时候就抓住了 CPU 和 I/O 设备运行时串行的这点,做了文章。

第四阶段:多道批处理系统

先来看看单道批处理下的 CPU 与 IO 运行关系,如图。


当 IO 操作的时候,CPU 会等待 IO 操作的结果,结果返回后才会继续执行程序,我们可以认为这个时候程序是串行的。由于 I/O 设备的运行速度相对于 CPU 来说实在太慢,这种让高速设备等待低速设备的状况无法接受。那能不能将 CPU 和 I/O 进行并发呢?即在一个程序输入输出时,让另一个程序继续执行。换句话说,能不能将 CPU 运行和 I/O 设备的运行重叠起来而改善整个系统的呢?答案是肯定的,我们可以设计将多个程序同时加载到计算机内存里,以前内存里只有一个程序,而现在有多个程序在运行,从而就出现了多道批处理操作系统。这是一个划时代的操作系统,开始从原来串行执行任务,到并发执行任务,大大提高了 CPU 的使用率,具体如图。


这样 CPU 就开始被任一时刻都用起来了,不会让它再次打盹了。这两个阶段都是可以为围绕如何提高 CPU 运行效率来优化。可以发现,在程序 1 要让出 CPU 的时候,那么到底是让程序 2 执行呢,还是程序 n 执行呢,这就涉及到 CPU 运行时间如何分配问题,随着发展,我们又有了分时运行的方案。

多道批处理操作系统的出现使计算机的效率(主要是吞吐率)大大提高。不过批处理系统这里有一个很大的问题,写程序的人需要交给一个计算机操作人员来执行程序,对于结果等全部执行完了之后才知道,也不能知道执行步骤,这显然也是低效且很难接受的。万一这个计算机操作人员操作失误或者忘记了呢,所以这个时候就得提出人人都可以拥有计算机的使用权,从而去考虑 CPU 资源怎么分配,这就是分时系统,给每个用户分配的时间是均等份的。即分给每个人有限的时间,只要时间到了,就换一个进程。这种时分切换下的操作系统就是分时操作系统。在这种系统下,用户就可以自己调试程序,这里就相当于有多个程序并发的在执行,只要我们将 CPU 切换的时间无限细分,那么每个用户就会感觉独自占有计算机资源一样,这样的运行模式下就是有多个程序一起执行,也就是我们现代操作系统里的进程并发概念。详细情况如图。


A,B,C,D 四个程序依次在 CPU 上执行,如果将每等分无限细分,就好像 A,B,C,D 四个程序自己一个人独占 CPU 资源一样,这也就出现了程序执行的并发现象,这是一个假象,只是执行速度太快,人类无法感知而已。

在分时系统下,操作系统的复杂性开始大大提高,还会涉及到资源互斥、进程通信死锁、保护等问题,复杂性指数可以说是增长超快了。

那么在分时系统下,每个进程获得 CPU 的执行时间是公平的,不存在偏差,这就会导致一个问题,比如我输入单词这么一个操作,不可能等 CPU 执行权限来到了才能执行吧,得及时响应,不然的话,用户体验极其差评!所以就出现了实时系统。

随着计算机技术的进步,产生了一种需求:有一个程序需要在需要运行的时候马上运行,而不能等到分时轮到这个进程执行,比如现在的鼠标、键盘等输入性操作,在不破坏操作系统原有运行体系下,需要响应这些事件。也就是计算机对这些事件必须在规定的事件内做出响应,这就是实时系统,详细情况如下图。


这个时候响应事件的优先级最高,CPU 会优先处理这些高优的事件,也就是有了实时被处理的感觉。

第七阶段:现代操作系统

1980 之后,就开始进入现代操作系统时代了,计算机工业开始迅速腾飞,出现了 DOS,Windows,MacOS 主流操作系统,总结了前面各个阶段的优缺点,发展了现代操作系统,同期也出现了 PC 机,计算机算力开始大大提高,后来又出现网络,分布式操作系统又得到了发展。

在操作系统的历史演进过程中,我们可以发现基本上是围绕如何提高 CPU 效率这个方向来进行,让 CPU 不打盹是我们的目标,围绕这个点来看计算机发展史,非常能理解当前时代出现了什么问题,如何去解决问题。

我们生活在一个最好的时代,这个时代只要你动动手就能获取你想要了解的信息。一起享受这个时代所带来的的便捷吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

2.通过NPM命令行工具下载安装
  • 3.所有的页面都是展示在这个<div id='app'></div>中,每次改变不会全局刷新,而是通过Vue.js框架操作代码,对其中内容进行局部刷新
  • 4.控制台上出现下列语句即表示成功
  • 1.大部分Vue.js项目都是在Webpack的框架下进行开发的

不同Node版本可能出现冲突
需要在同一台机器上同时安装多个版本的Node,NVM可以帮我们解决这个问题

只要安装了node,就会捆绑安装该命令,它的作用与Ruby中的bundler以及Java中的maven相同,都是对第三方依赖进行管理

dev.env.js:开发模式下的配置文件,一般不用修改
prod.env.js:生产模式下的配置文件,一般不用修改
index.js:很重要的文件,定义了开发时的端口(默认8080),图片文件夹(默认static),开发模式下的代理服务器

dist:打包后的文件夹
node项目所用到的带三方包特别多,也特别大,这个文件是由命令npm install产生的,所有在package.json中定义的第三方包都会被自动下载,保存在该文件夹下
注意,这个文件夹不能放在git中

assets:文件夹用到的图片都可以放到这里
components:用到的视图和组件所在的文件夹(核心)
index.js是路由文件,定义了各个页面对应的url

如果说index.html是一级页面模块的话,App.vue就是二级页面模板,所有其他的Vue.js页面都作为该模板的一部分被渲染出来

main.js:没有实际的业务逻辑,但是为了支持整个Vue.js框架,很有必要存在

在Vue.js中创建页面需要以下两步

如果要在vue页面中定义一个变量,并显示出现,就需要事先在data中定义
通过对于与原生Vue的区别可以看出之前原生的代码中存在于new Vue({})中的代码,在Webpack框架下,都应该放到export default{}中

let,var,常量与全局变量
声明本地变量,使用let或var
var:有可能引起变量提升,或者块级作用域问题
let:就是为了解决以上两个问题存在的
在Webpack下的Vue.js中使用任何变量都需要使用var或let声明变量

而export default {…}则是暴露出一段没有名字的代码,不像上述有名字而已
在Webpack下的Vue.js,会自动对这些代码进行处理,属于框架内的工作

实际上是下面的简写形式

与coffeescript一样,ES也可以通过箭头表示函数

这样写的好处是强制定义了作用域,使用=>之后,可以避免很多由作用域产生问题

Vue.js渲染页面的过程和原理
只有知道页面是如何被渲染出来的,才能更好的理解框架和调试代码

就是将来会动态变化的内容

上面代码中的就是第二层模板,可以认为该页面的内容就是在这个位置被渲染出来的
所有的中的内容都会被自动替换,<script>中的代码这是脚本代码

Vue.js就是最典型的Ajax工作方式,即只渲染部分页面,不会整体刷新,
所有的动作都可以靠url来触发
不使用router的技术:QQ邮箱,QQ邮箱是属于url无法与某个页面一一对应的项目,所有页面的跳转都无法根据url来判断
最大的特点是不能保存页面的状态,难以调试,无法根据url进入某个页面

对于有参数的方法,直接传递参数即可

前提,在directive中使用表达式
普通语句:a=1;(这个是声明,不会有效)
控制语句:return a;(不会生效)

在所有的Directive中,只能使用表达式

注意,v-if后面的引号中是===,

===是Ecmascript的语言,表示严格判断,因为js的 == 有先天缺陷,一般都是使用三个等号的形式

==!= 比较若类型不同,先偿试转换类型,再作值比较,最后返回值比较结果 。 ===!== 只有在相同类型下,才会比较其值。 ==, 两边值类型不同的时候,要先进行类型转换,再比较。 ===,不做类型转换,类型不同的一定不等。 先说 ===,这个比较简单。下面的规则用来判断两个值是否===相等: 1、如果类型不同,就[不相等] 2、如果两个都是数值,并且是同一个值,那么[相等](!例外)的是,如果其中至少一个是NaN,那么[不相等]。(判断一个值是否是NaN,只能用isNaN()来判断) 3、如果两个都是字符串,每个位置的字符都一样,那么[相等];否则[不相等]4、如果两个值都是true,或者都是false,那么[相等]5、如果两个值都引用同一个对象或函数,那么[相等];否则[不相等]6、如果两个值都是null,或者都是undefined,那么[相等]。 再说 ==,根据以下规则: 1、如果两个值类型相同,进行 === 比较。 2、如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较: b、如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。 c、如果任一值是 true ,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。 d、如果一个是对象,另一 个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。js核心内置类,会尝试 valueOf先于toString;例外的是DateDate利用的是toString转换。非js核心的对象,令说(比较麻烦,我也不大懂) e、任何其他组合,都[不相等]。 类型不等,true会先转换成数值 1,现在变成 "1" == 1,再把"1"转换成 1,比较 1 == 1, 相等。 因为a,b的类型不一样 ===用来进行严格的比较判断 下面需要如何判断flag的值? 因为true加双引号==推测是字符串true 如果不加双引号===就是布尔值true 这个很重要,之前我一直没有搞清楚这一点 这样写怎么都是正确的,根本得不到else的值,原因是这种写法相当于 这样写怎么都是正确的,根本得不到else的值,原因是这种写法相当于 “=”:这个表示赋值,不是表示运算符 “==”:表示等于()===”:表示全等于(类型和值)

v-bind指令用于把某个属性绑定到对应的元素属性


通过v-bind把《p》元素的style的值绑定成了’color:’ + my_color表达式,当my_color的值发生变化时,对应的颜色也会变化

对于所有的属性,都可以使用v-bind

v-on指令用于触发事件
上面通过v-on:click的声明,当被单击(click后),就会触发相应的方法
v-on后面可以接HTML的标准事件
click(鼠标单击事件)
mouseover(指针移到有事件监听的元素或其子元素内)
mouseout(指针移出元素,或者移到其子元素上)
keydown(键盘动作,按下任意键)
keyup(键盘动作:释放任意键)

v-model往往用来做双向绑定
1.可以通过表单(用户手动输入的值)来修改某个变量的值
2.可以通过程序的运算来修改某个变量的值,并且影响页面的展示

每个SPA项目都要使用http请求,这些请求从服务器读取数据然后
1.在前端页面进行展示,如论坛中显示文章列表
2.做一些逻辑判断,如注册页面需要判断某个用户是否已经存在
3.做一些数据库的保存操作,如修改密码

使用http请求需要为当前的SPA项目加上http请求的支持

该方法表示当页面加载完毕后应该做哪些事情,是一个钩子方法

设置Vue.js开发服务器的代理

正常来说,JavaScript在浏览器中是无法发送跨域请求的,我们需要在Vue.js的开发服务器上做转发配置

以上代理服务器内容只能在开发模式下才能使用,在生成模式下,只能靠服务器的nginx特性来解决js跨域问题

data()方法用于声明页面会出现的变量,并赋予初始值
mounted()方法表示页面被渲染好之后的钩子方法,会立即执行

开 头 的 变 量 都 是 v u e 的 特 殊 变 量 , 往 往 是 v u e 框 架 自 带 , 这 里 的 开头的变量都是vue的特殊变量,往往是vue框架自带,这里的 vuevuehttp就是可以发起http请求的对象

普通的web开发中,参数传递有一下几种形式
而在Vue.js中,不会产生表单的提交(因为会引起页面的整体刷新)

修改页面的跳转方式:使用事件

我要回帖

更多关于 冯偌依曼计算机结构 的文章

 

随机推荐