前言
本文进入Linux较为晦涩的概念——冯诺依曼体系结构和操作系统的理解。
一、先谈硬件——冯诺依曼体系结构
1.什么是冯诺依曼体系结构?
冯诺依曼体系结构是我们日常计算机都遵守的一个整体架构,计算机有很多硬件,比如硬盘,内存条,cpu等等。这些硬件通过冯诺依曼体系结构组装起来就是一台计算机。
这张图体现的就是冯诺依曼体系结构整体概览。
2.拆解冯诺依曼体系结构的硬件
- (1)存储器指的是
内存
。 - 外设:
- (2)输入设备:鼠标,键盘,摄像头,话筒,磁盘,网卡等等
- (3)输出设备:显示器,播放器硬件,磁盘,网卡等等
- CPU(中央处理器):
- (4)运算器:对数据进行运算任务(算数运算,逻辑运算)
- (5)控制器:对我们的计算硬件流程进行控制。
上面每一个硬件都是独立的个体。拆解任何一个硬件出来并不会影响其他硬件的正常运行。这些硬件具有独立性。
但它们每个硬件直接都会用线连接起来。
CPU和内存之间交互的线叫做系统总线,内存和外设之间交互的线叫做IO总线。
有些设备同时作为输入设备和输出设备:比如磁盘
假如我今天下载了一个抖音短视频并保存在磁盘上,这个过程相当于磁盘采集我的抖音数据,就是输入行为。
明天那个用户打开磁盘,播放他的抖音短视频,这个过程是磁盘将数据结果呈现给用户,就是输出行为。
像计算机的存储器,也是分有许多等级:
不同的等级造价不同,越往下造价越低,但是离CPU越来越远。
并且内存具有掉电易失性,也就是断电之后内存中的数据会丢失,反观磁盘则不会。
3.内存有多重要?
问题1:为什么冯诺依曼体系结构要有一个存储器(内存)?为什么不能让CPU和外设直接进行交互呢?
我们知道,CPU的运行速度是非常快的,是一个纳秒级别的硬件。而外设就显得非常慢,外设的运行速度通常只在毫秒级。你要知道,纳秒和毫秒是相差10的6次方,百万倍的差距。
这里有一个木桶原理:
一个木桶能盛水多少取决于木桶中最短的那块木板。
如果整机只采用CPU和外设进行交互的话,会极大拖慢CPU的运行效率,因为CPU实在
是太快了,只能等着输入设备缓慢地输入,CPU进行运算完成后,把数据交给输出设
备,输出设备又在缓慢地输出,CPU花费大量时间等待。
这使得整机运行效率只取决于外设的运行速度。
这样的环境使得冯诺依曼
想到了必须用一个内存来作为媒介,将输入的数据交给内存,CPU再从内存中读取数据运算后再交还给内存,内存再将数据输出到输出设备中。
由于内存的运行速度即不算快,也不算慢,在微秒级别。不至于让CPU过长时间等待,使得整机效率提升到以内存为核心的运行速度上。
问题2:既然你说内存不算快,那不也得让CPU在干等着吗?
在实际计算机体系中,输入数据会有一个预加载的过程,也就是把输入的数据提前加载到内存,这样CPU从内存中拿数据时,实现了数据一边加载到内存,CPU一边从内存中拿数据的并行实现
方式,让整个体系没有正在等待中的硬件,这样能实现高效地输入,存储,计算,输出的过程。
实际上,在冯诺依曼体系结构中,输入设备和输出设备并不会直接与CPU进行交互,而是通过内存来实现几个硬件交互。
既然内存叫做存储器,它本身是没有运算能力而只有存储能力的。既然内存比CPU慢,那为什么不将内存全部用寄存器来做?
很简单,太贵了,寄存器虽然非常快,但同时它的造价非常高。我们现在用的笔记本内存通常是8G
,16G
,32G
等等。如果一个8G的内存全部用装上寄存器,那它的造价会非常高,甚至几十万,几百万,这样的价格会让我们平民百姓难以用得起。
要知道,计算机能在这几十年飞速发展,一个很重要的原因在于计算机的价格不算特别贵,平民百姓有机会去接触计算机,大量的想象力和创造力才得以体现出来。
问题3:一个程序要运行,必须先加载到内存中运行,为什么?
程序中既有代码也有数据,既然有数据代码,就注定要进行运算,并且CPU和输入设备是不会直接交互的,那就注定代码和数据要加载到内存中,CPU才能从内存中拿数据进行计算,结果返回给内存,再输出到输出设备中。
所以,是冯诺依曼体系结构规定的!
4.数据在体系结构中的流动
假如今天我在qq上跟麻辣哥
进行聊天。我通过qq对话框向麻辣哥
发了一句在吗? 在这个过程数据是如何流动呢?
首先我会在键盘中输入在吗?,即我的输入设备是键盘,输入完成后,这个数据会被内存进行读取存储,由于计算机只认识二进制,不认识我们中华汉字,所以这个数据一定会被CPU读取进行计算转化等等操作,再将数据返回到内存中存储。这是一个对话框,当我点击发送后,信息会输出到网卡中。
在麻辣哥的冯诺依曼计算机里,我的那一句在吗? 会被麻辣哥的网卡进行读取,即麻辣哥的计算机的输入设备应该是网卡,然后这句话同样会被采集加载到内存中,CPU再拿走这句话进行解码读取等行为,再将数据返回到内存中,最后将在吗? 输出到显示器上。
所以这整个过程就是两台冯诺依曼计算机在进行交互!
关于冯诺依曼,总结几点:
- 1.这里的存储器指的是内存
- 2.不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
- 3.外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
一句话,所有设备都只能直接和内存打交道
二、再谈软件——操作系统
1.操作系统是什么
我们知道,前面讲的冯诺依曼体系结构都是一大堆硬件,它们虽然提供许多功能,但是它们本身并不聪明,需要有人对它们进行工作分配和资源管理。
简单来说,就是要有人管理好一大批硬件和软件,而这个人就是操作系统。
操作系统是一款进行管理的软件!
其中操作系统会对硬件和软件都进行管理。
操作系统由几大块组成:内存管理,进程管理,文件管理,驱动管理。
在操作系统之下,有一些驱动程序和底层的硬件。
其中底层硬件就是我们上面所讲的冯诺依曼体系结构。
驱动程序就是让硬件动起来的程序,每个硬件都必须有自己对应的驱动程序,我们新买的电脑,大部分都是厂商帮我们安装好了各种驱动程序,有些则是让我们自己去安装的。
2. 为什么操作系统要把资源管理好
我们知道,银行有各种工作人员,有大堂经理,有前台服务人员,有安保等等。
还有各种业务,借贷系统,预约系统等等。
操作系统就像是银行一样,可以帮助来银行办理业务的管理好各种工作。
- 也就是操作系统可以帮助用户管理好下面的软硬件资源。
假如一个银行的安保系统不行,或者我的卡里时不时就不见了几万块钱,或者我的银行每天又扣了点钱,这就是银行的管理没做好。
就相当于操作系统没有管理好它下面的软硬件资源。
所以我们在选择操作系统时,注重的是:
- 为了给用户提供一个良好(稳定,高效,安全)的运行环境。
所以,操作系统通过管理好它底层的软硬件资源(手段)
,为用户提供一个良好的运行环境。(目的)
3.什么是系统调用接口?
我们知道,银行里面有大量资金,如果银行不将这些资金储存并封闭起来,这些资金对任何一个普通人来说无疑是巨大的诱惑。
此时这个银行就像是操作系统,里面有各种数据,可是操作系统,不相信任何用户!
操作系统为了保证数据安全,会把自己封闭起来。
那么,如果操作系统把数据封闭起来了,我又想访问这些数据,怎么办?
正如同银行把自己封闭起来,我又要去取钱,该怎么办?
我们只能通过银行开放的那几个小窗口来进行取存钱业务!
对操作系统也是这样,我们只能通过操作系统开放的接口,来获取内部的数据!
那么,什么是接口?
操作系统是c语言实现的,这个接口只能由操作系统提供,一般来讲,这些接口不难猜到,就是普通的函数。然而,函数需要传递参数,有返回值,就像我们去银行取钱,需要提供身份证等个人信息一样,待银行工作人员验证后,才把我需要的钱给我。
操作系统对我传递的函数参数等验证后,会把我需要的数据返回给我。
这个就是接口。
所以接口是操作系统提供的c函数实现的,这个通过调用接口的过程,叫做系统调用!
所有访问操作系统的行为,都只能通过系统调用来实现。
所以,传说中的shell外壳程序
,就是因为系统开放了调用接口,程序员通过系统调用接口访问数据的同时进一步对这些数据进行封装,从而实现了给用户小白提供的用户操作接口,比如xshell
。
而对系统调用接口函数进行进一步的封装 ,就成了我们日常中所见到的库,库函数
也是这样来的。这些也叫做用户调用接口,对这些shell外壳,库进行再封装,就可以实现门槛极低,小白都能使用的各种软件了。
所以,我们所有对底层硬件的各种操作,都必须经过操作系统,而访问操作系统的数据,则必须通过操作系统开放的系统调用来进行访问。
在这个计算机世界,操作系统是少有的不变的东西,尽管其他东西一直在变,但是操作系统是不变的。
三、操作系统如何管理
1. 管理的本质
在大学生活中,可能管理者不是人人都参与过,但是被管理,我们全都知道。
因为我们每个人都是被管理者。
而校长是最典型的管理者。
一个学期过去了,有些同学成绩优异,学分绩点高,有些同学挂科无数,差的不行。而这些数据,都是我们的辅导员获取的,辅导员可以知道我们什么时候上下课,我们每个人的成绩如何。
所以,校长可以通过拿到辅导员手上的数据,也就是我们每个同学的数据,就可以知道我们哪个同学成绩好,发奖学金的时候,直接发给那些成绩好的同学就行,这个过程,并不需要管理者和被管理者见面!
你没有听错,管理者和被管理者不需要见面!
可是,管理者和被管理者不见面,如何管好?
再细想一下,管理者和被管理者需要见面吗?校长如果知道我的姓名,学号,身份证,籍贯,照片,家庭电话,成绩,课堂表现等各种他想要的数据,就可以通过这些数据,在未来进行管理决策
。
那么,辅导员是管理者吗?
实际上,事情就分为两种:
- 1.决策
- 2.执行
我们生活中的所有事情,就只有这两种,比如我和同学聊天:“你中午想吃点啥?” “中午吃个塔斯汀!” ——这个过程就是事情的决策过程
。
“好!现在就去!” ——这个过程就是执行过程
。
可以回答上面的问题了:辅导员也是被管理者,充当执行者。
上面整个过程,就相当于校长是操作系统,辅导员是驱动程序,学生就是软硬件资源一样。
所以,这整个管理的过程,就体现出了管理的本质:
通过对数据的管理,达到对人的管理。
2.操作系统如何管理?
在学校虽然学生有很多,但是他们都有相同的属性:
姓名,年龄,性别,身份,籍贯,电话等等。假如我们的校长是一名程序员,这些各种信息不就可以被放在struct student
结构体当中了吗?
上面说到,校长可以拿到辅导员手上我们这堆学生的数据,从而给成绩好的学生发奖学金,那校长怎么知道哪些学生成绩好呢?
很简单,我们需要通过排序,对每个学生的成绩都进行排序。而每个学生的信息那么多,校长又是一个程序员,此时校长有一个想法:把学生的各种数据看作是一个结构体。——这个过程就是描述
的过程!
然后我们对这些结构体一一串联起来,就形成了我们熟悉的数据结构——链表
校长通过对链表按学分绩进行排序,就很容易知道哪些学生成绩最高,奖学金应该发给谁,哪些学生挂科,作弊等等,一目了然。
甚至新的学期来了,有同学从其他学校转学过来,校长从辅导员手里拿到学生信息后,就将该学生的信息定义成一个结构体,再将该结构体插入到链表即可!
如果哪个学生作弊,严重程度达到了勒令退学的程度,校长就将该学生的信息结构体从链表中删除,此后在学校的管理系统就不会再出现该同学了!
所以校长对学生数据的管理,转换成了对链表的增删查改!
校长将每个学生的结构体串成一个链表,这个过程就是组织
的过程!
从此以后,校长手里就拎着一个链表走天下!
至此我们知道,这整个管理的过程,总结起来就是:
先描述,再组织
同时,这句话将来会贯穿整个Linux,所以这里再提一遍。
如何进行管理?
先描述,再组织
总结管理的以下几点:
1.管理的本质是:先描述,再组织
2.事情分为两种:1)决策 2)组织
3.如何进行管理:先描述,再组织
总结
本篇文章讲述了两大概念:冯诺依曼体系结构和操作系统。
- 冯诺依曼体系结构是每一台计算机都必须遵守的体系结构,再冯诺依曼体系结构中尤为重要的是存储器(内存),有了内存的存在,整机效率得到大幅度提升,核心效率转变成内存的运行效率。
- 操作系统是少有的不变的东西,操作系统存在的意义是通过对软硬件资源进行管理,从而给用户提供一个良好的运行环境。操作系统之下管理者各种驱动程序和软硬件资源,对上来说,只开放一个系统调用接口来供外部访问数据,因为操作系统要保证安全性,必须要把自己封闭起来。程序员通过系统的接口进一步封装,实现了我们程序员常用的shell外壳程序,对函数进一步封装,实现了我们常见的库和库函数,而对这些shell外壳和库进一步封装,就可以给普通的小白用户使用了。