《进程概念(1)》
引言:
在认识了Linux的基础开发工具之后,接下来我们接着学习新的Linux知识了,接下来我们就先从进程开始,在学习进程之前,我们需要先有一些前置的知识,这篇文章就先来学习一下冯诺依曼体系结构和操作系统。
一:冯诺依曼体系结构
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
下面先给出一张逻辑图:
截至目前,我们所认识的计算机,都是由一个个的硬件组件组成
- 输入单元:包括键盘、鼠标、扫描仪、写板等。
- 中央处理器(CPU):含有运算器和控制器等。
- 输出单元:显示器,打印机、扬声器、耳机等。
- 存储器:内存、硬盘、固态硬盘、U盘、光盘等
看上面的执行流程图,有的同学可能会有疑问,用户通过输入设备来输入数据,然后交给CPU来处理,再通过输出设备进行输出,内存好像并没有参与啊,那么内存存在的意义是什么呢?其实内存是非常非常重要的,下面通过几个方面来解释:
1. 内存的意义?
(1)体系结构效率问题:
我们要知道这些部分的效率是明显不对等的,输入设备相较于CPU来说是很慢的,而CPU执行速度非常快,如果输入设备(外设)直接跟CPU打交道的话,整体的执行效率就会大打折扣,也就是所谓的木桶效应,因此需要内存来做两者交流的一个中转站,因为数据是可以提前加载到内存里面的,这样就能做到数据的相对等,由之前的输入设备与CPU的交互变为了内存与CPU的交互,使得CPU能够不断地处理数据,而不是等半天才接到一个任务,导致效率低下,比如我们在看电影,刷视频的时候会存在一个白色进度条,这个就是数据提前加载的一个案例,在一定程度上避免的观看时的卡顿,提升了用户的观看体验。
(2)存储分级的问题:
先来看这张图:
注:这里的存储效率可以理解为拷贝的效率。
可以看到在这个金字塔形状的图里,越往上走,这些存储设备的效率越高,但是存储空间越小,也就是说内存之间还存在着存储分级,说到这里有聪明的同学就要说了,既然越往上面的存储设备效率越高,那么都用上面的存储设备不就可以了吗?其实不然,因为越往上面,这些存储设备的成本是很高的,而且存储空间很有限,这样的话计算机怎么可能普及大众呢?普通人肯定消费不起啊,正是因为存储的分级,才使得内存效率得到了平衡,因此内存也就必须存在。
(3)局部性原理:
正是因为局部性原理,使得数据可以提前加载到内存中,因此大部分情况下就可以转换为CPU与内存的交互,因此计算机的效率就以内存为主了。
2. 冯诺依曼的现实意义:
正是由于冯诺依曼体系结构,使得计算机的效率以内存为主,使得用户能够用较低的价格获得一台性能不错的计算机,使得计算机能够得到大范围的普及,从而孵化出了庞大的网络世界。(冯诺依曼体系结构的伟大)
3.小结:
(1)数据层面来看各部分的关系:
- 在数据层面来看,CPU并不会直接和输入、输出设备(外设)打交道,CPU的读写数据只会和内存进行交互。
- 考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)(数据层面)
- 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
- 一句话,所有设备都只能直接和内存打交道。
(2)数据流动的本质:
所谓的数据流动,实质上就是数据的拷贝,因此计算机的效率问题也就是由设备的拷贝效率决定的。
(3)我们口中的输入输出是站在谁的角度:
其实,我们口中的输入输出都是站在内存的角度(也可以说是加载到内存中的程序的角度)来说的,比如:IO流。
4. 实例:
(1)C语言程序的执行:
(2)QQ聊天:
二:操作系统(Operator System)
1. 概念:
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell程序等等)
2. 设计OS的目的
- 对下,与硬件交互,管理所有的软硬件资源。
- 对上,为用户程序(应用程序)提供一个良好的执行环境。
3. 理解OS系统
(1)先描述,再组织:
这里拿校长、导员、学生之间的关系来说明:
在一个学校里,学生的数量是非常多的,如果让校长直接去管理的话,校长肯定是会被累死的,因此就需要分班级让辅导员、班主任去一级一级地来进行代管理,校长就不需要自己一个人去直接管理这么多的学生了,只需要通过辅导员就可以间接地对全校的学生进行管理。
再回到这里的操作系统,这里的操作系统怎么管理这些系统呢?
肯定是通过数据结构来管理起来的,用什么样的数据结构呢?于是就需要先对这些系统进行描述,接着再将这些系统通过某种数据结构组织起来,这就是先描述,再组织
这是把现实世界中的问题进行计算机建模的核心规律。
这就是为什么C++里会存在类和STL的原因,为了方便我们管理。
(2)OS管理的本质:
(3) 用户是如何管理系统的?
由于确保操作系统的安全性,是不能让用户直接对操作系统进行管理的,下面来通过银行的案例来理解:
用户通过系统调用来管理系统,避免了用户直接接触操作系统,确保了操作系统的安全性。我们在写代码的时候用到的库函数其实就是系统调用的一种封装。
- 在开发角度,操作系统对外会表现为⼀个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
- 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。