下图是描述冯诺依曼体系结构的一张图。
计算机的本质是为了数据的计算处理。所以,需要有设备将数据提供给计算机,那就是输入设备。同样地,也需要有设备存放计算之后的数据或者将数据呈现给使用者,即输出设备。
数据从输入设备到存储器,再由存储器到 CPU,CPU处理之后,将结果返回给存储器,存储器再将结果交给输出设备。(控制指令除外。)
我们可以看一下该体系结构下, 各个设备的一些例子。
输入设备:键盘、话筒、摄像头、网卡、磁盘等等。
输出设备:显示器、磁盘、网卡、声卡、音响等等。
存储器:内存。
CPU(中央处理器):运算器、控制器。
在理解了各个器件的作用之后,不免疑惑,内存存在的意义是什么呢?为什么不可以让输入设备和输出设备直接和 CPU 相连,这样岂不是方便一些。
首先要了解,一般而言将 输入设备 和 输出设备 称作“外设”。
其次,外设一般而言速度会比较慢。
但是,CPU 的运行速度很快。所以,如果去掉存储器,只剩下CPU 和外设,这样子当然也是可以运行到,但是根据木桶效应,整个系统的运行速度就以外设的运行速度为主(前面说到,外设运行速度是比较慢的)。所以,为了防止这种现象的发生,所以就有了存储器。
存储器的运行速度远比外设大得多,但是比不上 CPU 。如果说外设是 毫秒级别,CPU 是纳秒级别,那么存储器就是 微秒级别 。
并且,存储器有一个特点,就是可以临时存储数据。如果 CPU 现在有两个任务A、B要处理,在处理 A 任务的同时,B任务的数据也被加载进内存(存储器),所以CPU执行完 A 任务,就可以立马向内存索要 B 任务的数据。而不是执行完A任务之后,等内存先向外设要数据,CPU再从内存要数据。
所以,有了内存之后,我们就可以对数据做预加载,CPU在进行数据计算的时候,根本不需要访问外设,只需要向内存要数据就可以。解决了外设和CPU速度不匹配的问题,这就是存储器存在的意义。
结论:
到这里,我们就可以理解为什么程序在运行前,必须要被加载到内存。这是因为体系结构决定的,可执行程序是一个文件,在磁盘(外设)里面,程序要被 CPU 运行,而CPU只和内存打交道。
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
对于内核,常见的就是windows 、Mac 、Linux 、Unix 等等。
设计操作系统肯定是为了达到某种功能,其目的如下:
在整个计算机软硬件架构中,操作系统的定位是: 一款纯正的“搞管理”的软件。
那么如何理解“管理”就成了理解操作系统的重中之重。
以一个学校为例。学校里的学生就相当于计算机里面的“资源”。
要描述计算机里面的“资源”,就需要对其进行一定的描述。比如一个大学校园,每一个学生都有自己的“学号”,知道了学号,就知道了这个学生是谁,相当于是学生的唯一标识。当然,“描述”并不只是说记录一个“学号”那么简单,还要记录其他信息。
描述了对象,就要用一定的数据结构对其进行组织。比如学校里的学生信息,可以被存在一个个结构体里面,然后以链表的形式存储(当然也可以是顺序表),要找到某些学生,用一定的算法就可以。计算机里面的资源同理。
如下,操作系统对下进行硬件的管理;对上进行应用软件的管理,和对用户的交互,为上层用户、应用程序提供简单易用的服务。操作系统是一种系统软件。
操作系统对用户提供良好的服务,并不代表着它就相信用户了,相反,操作系统不相信任何用户!!!
这就和银行一样,银行为储户提供服务,但是储户都是通过小窗口办理业务,而不是直接进银行金库去进行存取。操作系统同理,为了防止计算机的硬件被破坏,操作系统只向上提供一些接口,供上层开发使用,也可以被称作系统调用。
但是,系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。当然,建立于系统调用之上的,还有 GUI,shell 等等。
操作系统有如下四个特征,其中,并发和共享是操作系统最基本的两个特征。
早期计算机是没有操作系统的,经过一代代的优化,才有了如今各种各样的操作系统。其发展历史大概如下(从上到下 —> 从早到晚):