本篇文章,我们继续分享与Linux相关的知识。本篇文章的内容会涉及到冯诺依曼体系结构,操作系统等知识。
在认识进程前,我们先来了解一些必要的相关知识。
冯诺依曼体系结构
我们使用的计算机本质是一堆的硬件,诸如CPU,磁盘,显卡,显示器等等。这些硬件不是随便一放,就成一个计算机的。它们需要根据一定的逻辑组织起来,才能形成计算机。
这个冯诺依曼体系结构怎么去理解呢?简单来说就是:输出设备把数据放到存储器中。存储器再把数据传给运算器,运算器将数据处理的结果返回给存储器。存储器再将数据处理结果交给输出设备,进行输出。
图中的输入设备,存储器,运算器,控制器,输出设备,本质就是一堆硬件。以这样的逻辑组织的硬件,所形成的结构,我们称之为冯诺依曼体系结构。
那这里的存储器指的是什么呢?这里的存储器指的是内存。磁盘,U盘这些存储设备,我们称之为外存。
计算机是用来给人类提供数据处理服务的。在提供数据处理服务前,你得先把数据交给计算机吧。计算机只认识二进制0和1,而我们输入的却是一个个的字符。那是你以为的!在我们使用键盘这些输入设备进行输入时,它会将我们输入的字符转换成二进制0和1,进行输入。这就注定了,我们没法直接与中央处理器进行交流。我们想让数据处理结果以图片,字符的形式输出,而不是以二进制的形式输出。于是,就有了输出设备,将二进制的数据以字符或图片的形式输出。
输入设备和输出设备统称为外部设备,简称外设。
我们常见的输入设备有哪些呢?鼠标,键盘这是我们能经常看到的。我们看直播的时候,主播用的话筒以及摄像头。计算机获取数据的方式除了键盘鼠标,还可以是从文件读取,文件存放在哪?文件当然是存放在磁盘里啦!也可以是网上,访问网上中的数据,我们需要借助什么?网卡!
那我们常见的输出设备又有哪些呢?显示器是一个。我们平常听歌,声音从哪来?播放器硬件。还有就是,我们输出数据,不一定要往显示屏里输出,可以发到网上,也可以存储到文件里。数据发到网上需要借助网卡,存储到文件里,本质就是存储到磁盘里。
输出设备,输入设备以及存储器这三个部分都没数据计算处理的能力,那计算机计算处理数据的能力体现在哪里呢?
体现在运算器,运算器负责对数据进行计算任务。常见的计算任务主要有算术运算和逻辑运算这两中,简称算逻运算。
现在,我们有了输入设备将数据输入到存储器,存储器再交给运算器进行处理,把处理结果返回给存储器,存储器再交给输出设备进行输出。这个流程没什么毛病。可是,存储器怎么知道它什么时候从输入设备中读取数据?运算器怎么知道什么时候把数据写回存储器?存储器又该什么时候将数据写到输出设备进行输出呢?是不是得有个人来进行协调呀?你的输入设备好没,好了,我再读取数据到存储器中。这些都由谁来操心呢?由我们的控制器来完成对硬件计算硬件流程进行一定的控制。
输出设备,输入设备,存储器,控制器,运算器这五大硬件单元,每个都是一个独立的个体。我们把控制器和运算器称之为中央处理器,也就是我们所说的CPU。如何将这五个独立的个体联系起来,使得它们之间的信息相互流通起呢?各个硬件单元之间必须用“线”连接起来。存储器和外设之间的连接的线,称之为IO总线。存储器和中央处理器之间连接的线,称之为系统总线。
用一张图总结我们刚刚所了解的知识:
在冯诺依曼体系结构中,中央处理器为什么不与外设直接交互,非得加一个存储器在中间插一脚呢?补充一些小知识,存储容量越大意味着速度越慢,外设的速度是毫秒级别的,存储器的速度是微秒级别的,中央处理器的速度是纳秒级别的。
有一个效应叫做木桶效应,木桶能装下多体积的水,取决于木桶最短的那块木板。
如果中央处理器直接与外设进行交互,那么整个计算机效率,就以外设的效率为主,效率被极大的降低。于是,冯诺依曼就想出了,可以加一个存储器,它的效率介于外设和中央处理器之间。可存储器和中央处理器之间仍存有速度差距,效率的变化体现在哪?虽然存储器和中央处理器的仍存在差距,但比外设和中央处理器之间的差距小了很多。
这里我们可以将存储器看作硬件级别的缓存空间。在中央处理器处理数据时,可以将数据预加载到存储器中。待中央处理器处理完上一轮的数据,把处理结果交给存储器后,可以直接从存储器中读数据,进行下一轮的数据处理。在进行下一轮处理时,我们又可以把接下来要处理的数据全部预加载到存储器中,实现并行运作,一边处理数据一边加载数据。这里的数据处理结果为什不直接数据交给输出设备呢?一方面是因为输出设备的效率太慢了,另一方面,由存储器来将处理结果交给输出设备,可以实现并行运作,计算机一边处理数据,一边输出结果。此时,整个计算机的效率,以存储器为主,存储器处于核心地位。
外设和中央处理器之间并不是彻底没有交互的,它们之间在数据方面不需要进行交互,但在信号控制层面上的交互是需要的,这个我们在后面说。
说到这里,我们对冯诺依曼体系结构有了一个大致的认识。那我们怎么看待通过qq把实验报告发送给朋友这个行为呢?
你和朋友的计算机,相当于两个独立的冯诺依曼体系结构。当我们将实验报告拖拽到qq的输入框,发送给朋友。qq会从磁盘把实验报告这个这个文件读取到存储器中,存储器交给运算器处理,把处理结果返回给存储器。存储器将处理结果借助网卡发给你的朋友,网络部分我们还没学,先不管它。朋友的计算机通过网卡接收你发来的实验报告,加载到存储器中,再交给运算器处理。存储器得到数据处理结果后,交给显示屏。于是,你的朋友就在聊天对话框中看到了文件的图标。CPU是掉电易失介质,也就是没电了数据就没了。可当我们关机重启后,打开qq依然能看到文件图标,这是为什么?这是因为这个实验报告已经被存储到了磁盘中,qq会根据这个文件的格式,将图标呈现在对话框中。
冯诺依曼体系结构中的硬件只是提供了各种功能,但什么时候使用,怎么去使用这些功能,它们并不知道。现在,来了几个程序,该先运行谁,凭什么。为了解决这些问题,能更好的使用冯诺依曼体系结构,这时就需要一个人来控制,而这个人就是操作系统。
操作系统(operator system)
操作系统,它是一款对软件和硬件进行管理的软件。它分为内核和其他程序两部分,内核主要进行进程管理,文件管理,内存管理,驱动管理这些核心工作,其他程序包括函数库,shell程序等等。前面这是一个广义上的理解,操作系统内核和操作系统之上的软件这两部分合起来称之为操作系统。而狭义上的理解,操作系统只是指操作系统的内核。
其实,我们宏观的计算机结构是由如下的层状构成的。
最底层的是硬件,这些硬件根据冯诺依曼体系结构,通过总线连接起来。在硬件层之上,是驱动程序。每个硬件都配有相对应的驱动程序。驱动程序可以理解为一款与硬件打交道的软件,它可以直接把硬件用起来,而怎么用这些硬件,由它的上一层操作系统来决定。操作系统的核心功能有四块,内存管理,进程管理,文件管理和驱动管理。所谓驱动管理,就是管理它下面的驱动程序,判断那些应该被加载,那些处于健康工作状态。
结合这张图,我们来思考一个问题。为什么要有操作系统?操作系统帮助用户,管理好下面的软硬资源!前面这个是第一点,那第二点是什么呢?给你们举个例子你们就懂了,有一家银行,它里面有业务人员,清洁人员,安保人员等众多工作人,我们可以让他们自由的在银行里工作吗?当然不行,那样不就乱套了吗?我们需要银行行长来管理这些工作人员。管理这些人员的目的是什么?不就是为了打造一个好的环境,给客户提供一个良好的服务吗?如果说业务人员对待客户态度散漫,安保人员人员不制止无关的人员的捣乱,那谁还敢来你这存钱呀!说到这里第二点原因我们也就知道了:为了给用户提供一个良好的运行环境。怎么样才算良好,至少得是安全,稳定,高效。
总结一下:为什么要有操作系统?操作系统通过管理好底层的软硬件资源(手段),为用户提供良好的执行环境(目的)。这里的用户包括普通用户和程序员。
我们使用计算机的所有行为,最终都会转换成硬件行为。怎么理解?我们用qq发送信息,最终会由网卡来进行发送。发送信息这个过程,我们有没有用硬件?用了。是不是我们直接使用的?不是。那我们能不能绕过操作系统直接使用硬件呢?首先,第一点,我们根本不会使用硬件,底层有很多的协议和差异,我们一概不清楚。所以呢?用户需要通过操作系统来访问底层进行操作。那用户又该如何通过操作系统来访问硬件呢?
操作系统是一款软件,它里面会有各种数据。比如说我平时玩的王者荣耀,这个英雄有什么技能,血量有多少,技能冷却是几秒,这些数据都要保存在王者荣耀这个软件里。后面,操作系统还会把软硬件的数据采集上来,这些数据用户都可以直接的访问。可是,操作系统不相信任何用户。不相信你,又让你使用。这件事矛盾吗?并不矛盾,给大家举个例子。在银行里,银行相信你吗?不相信。银行除了工作人员的其他任何人员,它都不相信。我们进到银行,可以看到柜台只留有一小部分的窗口,大部分地方都用很厚的防弹玻璃封闭起来了。银行为什么不相信你?因为群众里有坏人,我们银行相信了所有人,所有的柜台都是敞开的,所有人随时都可以进来,时间久了,总会出现问题,丢了几块钱,帐对不上啦,网线差了一个。总之,对于我们来说,银行并不相信我们。所以,银行必须把自己封闭起来了。可一旦彻底封闭了,银行就没法提供存钱取钱的服务了。那怎么能在不相信你的情况下,给你提供服务呢?于是,我们就看到银行的柜台前开了一个小窗口。我们要取钱,就从小窗口里把银行卡丢进去。卡里还剩200,取多少?取100,在输完密码后,业务员又会把钱和银行卡从窗口里丢出来。
操作系统也不相信任何的用户,用户中有坏人,它里面的数据十分重要。我的磁盘原本还有300个G,他硬生生给我改成3个G。驱动程序处于健康状态,他给我改成离线状态,那我用还是不用。操作系统要被用户使用,但也不能让用户改我操作系统里面的核心代码和数据。因为,用户里有坏人。所以,操作系统为了防止有人干扰它影响它,就必须把自己封闭起来,不允许任何人直接访问操作系统里的数据。可操作系统还需要给用户提供良好的运行环境,那怎么办?所以,操作系统需要以接口的方式给用户提供调用接口,来获取操作系统内部的数据。这里的接口又该如何理解呢?简单来说,它是操作系统提供的,用C语言实现的,自己内部函数调用。我们把它称之为系统调用,用户的所有访问操作系统的行为,都只能通过系统调用完成。
在操作系统之上,就有了system call称之为系统调用接口。系统调用接口是操作系统自己写的。一方面,它获取数据的行为不会恶意更改操作系统里面的数据。另一方面,它可以对用户输入的参数进行审核。这样一来,既确保了操作系统自身的安全性,又为用户提供了良好的运行环境。
用一张图简单总结一下我们提到的知识点:
有了系统接口,操作系统的使用依然有一定的难度。于是,就有程序员基于系统接口的开发各种各样的软件给编程小白使用。这种基于系统接口的编程,我们称之为系统编程。
好了,到这里,我们本次的分享就到此结束了,不知道我有没有说明白,给予你一点点收获。关于更多和Linux相关的知识,会在后面的文章更新。如果你有所收获,别忘了给我点个赞,这是对我最好的回馈,当然你也可以在评论发表一下你的收获和心得,亦或者指出我的不足之处。如果喜欢我的分享,别忘了给我点关注噢。