在正式讲解进程之前,需要先铺垫一些基本知识.
目录
冯诺依曼结构
操作系统
这个名词相信大家非常熟悉,我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
这张图:
到现在,我们所知道的计算机,都是由一个个硬件组成的.
输入单元:包括键盘, 鼠标,摄像头,网卡,写字板等
存储器:内存
中央处理器(CPU):含有运算器和控制器等(运算器:算术运算(1+1=2),逻辑运算(if语句...)
控制器:CPU可以相应外部事件,协调外部事件就绪,比如拷贝数据到内存)
输出单元:显示器,音响,网卡,打印机等
根据图我们还知道:
CPU读取数据(数据+代码) 都是要从内存中读取。站在数据的角度,我们认为CPU不直接和外设交互.
CPU处理数据,必须先将外设的数据加载到内存。站在数据的角度,我们认为外设也只直接和内存交互.
总结:所有设备都只能和内存打交道。
所以这个时候相信大家都能理解为什么程序要运行,必须要先加载到内存里.
因为CPU只能直接和内存交互.
我们不仅要了解这张图,更要了解实际过程中是数据如何流向的.
请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。从你打开窗口,开始给他发消息,到他收到消息之后的数据流动过程。
它们也是严格遵守冯诺依曼结构的.
如果改成发文件呢?
无非是自己这端 输入设备从键盘变成了磁盘,对端的最后 输出设备从显示器变成了磁盘.
以上都是从硬件结构讲解的,那么现在该说说软件了.
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)
这是一个计算机大致组成,可以看到,
操作系统被设计的目的:
与硬件交互,管理所有的软硬件资源.
为用户 程序(应用程序)提供一个良好的执行环境.
在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件.
如何理解"管理"呢?
在大学,我们知道有校长,辅导员与学生之分。我们从管理角度来说,校长就是管理者,我们学生就是被管理者,如果我们挂的科目很多,校长不需要和我们见面,直接看着数据便可以对我们进行决策处置。这说明:拿到被管理者的核心数据,来进行支持管理决策才是最重要的. 当然虽然可以对我们进行决策处置,但总要有一个执行者,来执行校长的命令,那这就是辅导员了,充当一个执行者的身份.
对比操作系统中,操作系统就是校长,驱动程序就是辅导员,那些底层硬件就是学生.
总的来说,管理是对被管理数据对象数据的管理.
但是如果有很多学生,数据非常多而乱,就算只拿到数据想处理好也不太实际,所以我们可以把它组织起来.
我们可以单独对每个学生定义一个结构体,存放该学生的相关信息。然后假设有5000名学生,实则开一个大小为5000的结构体数组即可.
然后假设此时想开除3个分数最低的学生,那我们需要找出这个3个分数最低的学生,然后我们设计一个排序算法,找出来之后,然后让它离校就可以了吗?
我们还需要把这3名学生的数据删除,数据库里没这3名学生的信息了,然后辅导员让其离校,这样就算成功开除了.
总结下来:先对被管理对象进行描述,再根据描述类型,定义对象,把对象组织称数组----------------->对学生的管理工作,变成了对数组的增删查改!
对学生做管理,抽象成对数据做管理,但数据量大需要组织起来,又回到了我们刚才所讲的先描述,再组织!
描述每个学生.
再组织起来
记住这六字真言!这就是我们管理的核心思路.
我们这样就理解大致的概念.
下面接着以银行管理为例子,进行深入理解操作系统上层和下层.
比如银行中会有一些基础设施,例如桌椅,宿舍,电脑设备等等,然后每个设施会有一个专门的人员来管理它,这些人又受行长管理。比如某个桌子坏了,那个对应负责人便可以报告行长,行长便可以根据这些数据决定是否购买新桌子.
行长便可以类比于这个操作系统.这个和刚才上面说的类型.
但是我们发现银行很多都是柜台操作的,是封装好的,不能直接让客户直接使用银行里的电脑.而是通过专员操作.所以我们是不能直接把内部暴露给客户的.
上面的专员相当于操作系统向上的提供的系统接口.
由于LINUX是用C语言写的,所以这些系统接口相当于就是C语言提供的函数!
还是拿银行为例,这个时候来了一个不识字的人,来到柜台前,由于柜台人员说什么都听不懂意思,所以这个时候变设立了一个服务层,只要你把资料都给我,我就可以帮你把这些事情办了.
这个服务层便相当于是操作系统中的用户接口:例如我们的图形化界面,以及shell外壳,第三方库等等,这些都是更近一步方便我们用户操作的,现在相信很多人都不会用晦涩难懂的系统接口吧.
说到这,其实可以无限套壳,总之肯定越套,会让人使用的更加方便.
也就是说:
在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。