前言
前面对基本的指令、权限以及环境开发的基本工具进行了介绍,本期开始我们将进入系统的的学习,例如我们常听的进程等,在进入进程的学习前我们先要铺垫一下,所以本期我们先来介绍一下冯诺依曼体系结构和再谈操作系统!
本期内容介绍
冯诺依曼体系结构
再谈操作系统
系统调用和库函数的理解
冯诺依曼体系结构
截止目前,我们所认识的计算机,例如笔记本、台式机等其实都是一堆硬件设备(CPU、显示器、鼠标等)的集合体。其实这些硬件设备都是遵循一个叫冯诺依曼体系结构的!
什么是冯诺依曼体系结构?
冯诺依曼体系结构是20世纪40年代由匈牙利数学家约翰·冯·诺伊曼提出的一种基于存储程序的计算机体系结构,当代大部分计算机都遵循的是冯诺依曼体系结构,是现代计算机体系结构的基础!冯诺依曼体系结构中包含输入设备、输出设备、存储器、以及中央处理器!
冯诺依曼结构体系图:
OK,下面我们来详细谈以及理解一下图中的各个部分!
理解输入和输出设备
输入和输出设备统称为外设, 用于和计算机进行数据交互和通信。
输入设备是将外部数据引入计算机系统的设备。常见的输入设备有:键盘、鼠标、磁盘、话筒等
输出设备是获取计算机处理的结果或信息设备。常见的输出设备有:显示器、磁盘、网卡、声卡等
理解存储器
这里的存储器就是内存!
很多教材和书上只是笼统的说是存储器,但是没有交代清楚具体是什么。光看字面存储器是具有存储能力的某个设备,但是可以存储的设备很多,例如磁盘、u盘等。但是这里得注意他就是内存!
中央处理器
中央处理器俗称CPU。它由运算器和控制器组成!
运算器是负责各种算术和逻辑的运算。
控制器负责解释并执行存储在内存中的指令,通过控制信号来协调和管理CPU内部各个部件的操作,以及与其他硬件设备的交互。
例如:你在键盘上输入一个算式,运算器是拿着数去去计算的,控制器是控制外设拿取数据的。
各个设备是相互连接的
上面所述的各种设备在计算机的内部是通过总线连接起来的!总线又分为系统总线个IO总线!总线负责传输数据和控制信息!
系统总线:连接CPU、内存等主要组件的总线,负责这些组件间的数据传输和信号控制!是计算机系统中的最重要的总线之一!
IO总线:连接CPU和外部设备(输入和输出)的总线,负责CPU和外部设备数据传输和信号控制,实现了计算机与外部设备的数据交换和通信!
例如这个主板,它的各种设备就是通过总线连接的:
为什么要有存储器?
OK,有了上面的介绍,我们也就知道了,CPU控制器通过控制信号获取输入设备的数据到内存,然后CPU读取进行运算后将结果写入到内存,再通过控制器的控制信号,让输出设备从内存中读取结果到输出设备!如下图:
可是现在的问题是为什么要有存储器(内存)?我直接让CPU去输入设备读取数据,然后运算完了写到输出设备上不是更简便吗?为什么搞个内存?也就是如下图:
我们以前来了解过,数据在计算机体系结构中从一个设备流动到另一个设备的本质是从一个设备拷贝到另一个设备!而外设的速度是很慢的,CPU又是很快的,如果没有内存就会导致在很多时候CPU不是在计算而是99.5%的时间在等待外设!这样计算机的效率就低了很多,这就是一个木桶原理,整个计算机的速度取决于设备间拷贝速度最慢的那个!为了解决这个问题就引入了内存!OK,在介绍为什么加入内存就可以解决前,我们先来介绍一下存储金字塔!
存储金字塔的特点是:越距离CPU近速度越快、价格越贵、空间越小!
我们可以看到离CPU最近的是寄存器,cache下来就是内存!内存相较于外设是距离CPU近的,且效率比CPU直接与外设交互的高很多!所以冯诺依曼体系选择了他。也就是内存的效率是比较适中的,比外设快,但比CPU慢,让它做为CPU以及外设间的一个缓存,以后CPU读写数据不是去外设而是到内存,外设也不需要写入和读取数据来CPU了而是去内存!这样各个设备的拷贝效率变高了,根据木桶原理可以得出整个计算机的效率也就变高了!另一方面,内存的造价有没有很贵,冯诺依曼体系加入内存后计算机的效率不但提升了不少,而且在原来造价的基础上没有增加很多,这也就让计算机容易普及,也为当今的互联网行业的繁荣奠定了基础!
总结:内存的拷贝效率比较适中,很好的避免了让CPU等待外设的问题!使得计算机的整体效率提高了不少,由于内存的造价不贵使得计算机性价比高了,容易普及了,为当今给的互联网繁荣奠定了基础!
另外加入内存后,从硬件数据流动的层面上讲(不考虑缓存):
1、CPU不和外设直接打交道,CPU只和内存打交道
2、外设(输入输出)的数据不是直接给CPU的而是先要放入内存中的
我们在上面的存储金字塔看到了在CPU和内存间还有cache和寄存器,他们的效率比内存还快呀。为什么不选择他们作为存储器呢?是的他们的效率是比内存快但是他们的存储空间小而且是很贵的,一个512G的内存可能是500但是500的寄存器或cache就几十个,如果存储器是寄存器或cache的话要,计算机的造价会是普通计算机的几百倍甚至上千倍,目前一个正常的电脑3000~5000,如果存储器是寄存器的话那可能就是大几十万上百万,(例如王校长500W的电脑~)这就会导致普通人根本用不起,普及率大大的降低,也就没有了当今的互联网繁荣了!这也体现了冯诺依曼体系中内存的重要性!
为什么程序运行要加载到内存?
我们以前经常听老师说:一个程序要被运行先要加载到内存中!为什么呢?这个问题通过我们上面的介绍就很简单了!因为冯诺依曼体系结构的规定!
我们知道,程序 = 代码 + 程序的数据,数据都是要被CPU执行访问的!CPU只会从内存中读取代码和数据,所以要被运行必先要被加载到内存。那么问题是程序没有被加载到内存时在哪里?答案很简单程序没有被加载到内存的时候以二进制的形式存在磁盘中的!
在QQ聊天时数据流动的过程
假设你在甘肃你的好朋友在天津,有一天你给你的朋友发了一句QQ:"好兄弟,上号!"。你的兄弟看到后就上号了!请解释你发送"好兄弟,上号"一起你朋友看到这条消息时,该消息在计算机体系中的流动过程!
如果你没有学过计算机的话,可能会说,从你的qq发送到他的qq上,他就看到了!从普通用户的角度的确是这样的,但是我们本期介绍了,冯诺依曼体系结构后我们就不应该再这样认为了!我们应该以一个工程师的视角来理解这个问题:当你在要给你的好兄弟发QQ消息时你应该是先点击qq打开它,点击打开的过程就是把qq的代码和数据加载到内存,然后你的输入信息到内存(qq),内存经过计算(加密等)把结果又写入到内存,然后外设从内存中拿数据结果,这里的外设就是网卡了,网卡读取后通过网络(这里由于网络没有学就只能暂时认为通过网络就好了)你好兄弟登上qq后网卡进行读取数据,并加载到内存后ton过CPU运算解析后又写入内存,最后通过外设(显示器)读取你的好兄弟就知道了,我的老伙计在叫我上号~!
再谈操作系统
什么是操作系统?
在Linux专栏的第一期,初始Linux的时候就谈过操作系统了!我们当时介绍说:
在计算体系中都包含一个基本的程序集合被称为操作系统(OS)。操作系统是一款对软硬件资源管理的软件!
从广义上讲:操作系统 = 内核(进程管理、内存管理、文件管理、驱动管理)+ 外壳周边程序(例如:shell等)
从狭义上讲:操作系统 = 内核(进程管理、内存管理、文件管理、驱动管理)。
我们在shell运行原理介绍过我什么有外壳程序:一是操作系统的内核很复杂不适合用户直接操作,二是操作系统内怕用户直接访问时造成安全问题(修该内核属性),所以就提供了外壳程序!本期我们在此基础上再来对操作体统的认识在深入一些!
为什么要有操作系统?
这个我们也是在第一期哪里谈了一句的:
操作系统的目的是对下管理好各种然硬件资源,对上提供良好的运行环境!
这样解释没错,但是我今天再来补充一下:
对然硬件资源进行管理是操作系统的手段,对用户提供一个良好(稳定的、高效的、安全的)的运行环境是它的目的。
比如你今天在玩原神或CF或英雄联盟或王者荣耀等,你的手机或电脑有没有三分钟一黑屏、5分钟一蓝屏、10分钟一重启??没有吧,你有没有在网络稳定的情况下按一个技能半天等你死了才释放出来的??没有吧!为什么你在打开很多软件时任然可以丝滑的放技能 (网络因素先不管)?为什么没有在你打游戏的时候其他软件影响你和你当前的游戏抢硬件资源?你稳定玩好一把把游戏的背后是有一个叫操作系统的软件在默默为你保驾护航,让你有更好的体验!!!
如何理解操作系统的管理?
这里先说结论(下面解释):先描述,再组织!
我们上面可说了,操作系统是管理软件和硬件资源的软件,他是如何做管理的(由于目前连进程都没有介绍所以这里着重介绍他是如何管理硬件资源的)?OK再解释这个问题前我们先来看看计算机体系结构示意图:
我们可以清楚的看到操作系统稳居C位!最底下的是各种硬件,很明显操作系统是没有直接管理底层的硬件的,而是通过中间的驱动层去间接接管理的!这里谈到了驱动层,就先来介绍一下驱动层!
什么是驱动层?
驱动层是一层软件,专门来直接管理各种底层硬件资源的软件!对上层的操作系统提供统一的接口而隐藏底层的硬件细节!这就很类似于语言层面的封装!
其实驱动层就很像我们生活中的辅导员、图书馆馆长等!辅导员管理好他管理的学生给上面提供好管理的结果即可,图书馆馆长同理,管理好图书馆的图书对外面提供好统一的服务即可!
为什么要有驱动层?
其实原因很简单,更好的管理硬件资源为上层提供上层相关属性的数据,以及更好的与操作系统适配。(各个硬件厂商一般会提供驱动程序,在操作系统的驱动库中)!
这里解释一下为什么说适配操作系统:因为硬件的厂商不同提供的硬件可能略有差异,比如说你当前的磁盘觉的不够了,相加一个磁盘但是你买的磁盘一定是和原来电脑一样的吗?我想大概率不是,在硬件不相同的情况下操作系统是如和做管理的?如果没有驱动是不是加个磁盘还得改一下操作系统??这样代价太大了,所以为了更好的让操作系统管理,就产生了驱动。如果说操作系统是校长的话,驱动就是辅导员,辅导员管理好学生后将学生的属性给校长。
驱动程序安装成功了显示这个:(一般是某个新设备首次插入到电脑):
OK,我们上面也说了,操作系统没有直接接触硬件那他是如何做管理的?
这个问题就类似于你和你爸妈吵架了不接电话,你爹还是在你没钱的时候给你打了过了!你爹是怎么知道?答案是你舍友告诉的!你爹知道你没钱了这个信息后就给你打了钱!你爹无论给你打电话还是通过你舍友联系问你的情况,本质都是在获取你的信息!所以管理者和被管理者是不需要直接见面的,管理者只需要拿到被管理者的信息后就可以对被管理者作相应的管理了!同理操作系统也是无需直接和你硬件直接接触的,刚刚上面介绍了驱动就是专门管你硬件的,我直接找驱动要就可以拿到硬件的相应数据,这样可以对硬件管理了!所以操作系统对硬件的管理本质是对硬件的属性数据做管理!
理解系统的管理方式 ------ 先描述,在组织
OK,现在操作系统拿到数据了,他是如何做管理的?这里就和你们的校长拿到了你们学校所有的学生信息,校长如如何做管理一样!你的校长拿到3个人5个人的信息记载本子上管理还好,三五十人也还凑合,但是全校的不止几十人少则几千多则几万,你让校长如何记?假设今天校长想要找一下全校C语言最高的那个人,估计等他把他的本子翻完就可以今天下班了。所以这种方式是不行的!校长也意识到了这个问题,好在你的校长是计算机科班出生,在当老师前还是程序员,所以他就把这些学生通过类描述起来,然后通过某一种数据结构存起来,最后对这个数据结构管理就是对学生管理了!于是你的校长经过一夜的加班,搞了class student的类,把学生的属性都在类里面描述起来,然后外面通过一个链表把所有学生管理起来!这样他在管理学生就变成了对链表的增删查改!这样就对学生的信息进行了建模!同理操作系统也是这样的,通过驱动拿到数据过后先把硬件的数据先通过类进行描述,在通过某种数据结构进行组织!然后操作系统对然硬件资源的管理就变成了对某种特定数据结构增删查改的过程!其实到这里我们在想想C++或Java等面向对象的语言为什么要提供各种数据结构的容器?答案就是:语法(例如:继承、封装、多态)是做描述的,数据结构是对描述的对象进行组织的!以及我们以写的通讯录,为什么一开始先搞一个节点类,这实际上是对被管理者做描述,通过链表或数组存储就是组织的过程!所以,先描述、在组织。这六个字对语言也是符合的!
为什么要对操作系统要对软硬件进行管理?
为上层用户提供良好(安全、稳定、高效)的运行环境!
这个问题就好像问校长为什么要管学生、宿管为什么要管理该栋宿舍楼一样。如果校长不管你,你今天去A学校了,明天去玩了,等有事情的时候又找不到?如果宿管不管理楼,你可能连宿舍都不扫,今天A宿舍,明天B宿舍。这就会导致很混乱,也容易出问题!同理如果操作系统不对软硬件资源做管理,你都不知道硬件好没好着,如果用户用的时候是坏的,而你操作系统在此前都不知道,那这个损失的代价就很大了!
系统调用和库函数的理解
什么是系统调用
系统调用(System Call)是操作系统提供给用户程序或应用程序的一种接口,用于请求操作系统内核执行特定的操作或服务。
我们可以看到在操作系统的上面还有一层是系统调用:
为什么会有系统调用?
这个就和银行系统很像了,为什么银行不直接让用户进到银行自己办理业务而是要通过柜台窗口来对用户进行办理相关的业务呢!很简单因为银行不相信任何人,但是还要给群众要办理业务所以提供了柜台。假设银行没有柜台窗口,每个人都是自主办理业务,假设你要存钱,业务员说你进来别站外面了,那边是保险柜,你把放进去这是电脑放完后给自己加上就好了!能这样吗?我们虽然是新时代的好青年不会对账目做手脚,老老实实的如是操作了!但是群众中不可能没有坏人,一代你一个人说是存一百块但是没向保险柜放反而还拿了1000W出来,还给自己的账户上加了一个亿,这样银行系统很快会挂!所以银行就设立了柜台窗口,你要办什么业务把相关材料给我,我再把办理的结果给你即可!同理,操作系统也不相信任何人,但还是要为用户服务,所以就提供了大量不同功能的系统接口,你给我相关的参数我给你执行结果!这里假设没有接口用户随便访问操作系统,进来一看这有个链表、那有个队列、那边还有个红黑树我们拿着玩一玩?显然是不被允许的,假设你访问的过程中把数据修改了咋办?把数据结构搞不正常了咋办?如果异常就后期就无法正常管理然硬件资源了,也就无法向用户提供服务了!所以操作系统避免这种情况就提供了系统调用接口!
什么是库函数?
库函数就是在开发中的一些常用函数的集合!这些库函数是对上面系统调用接口的封装,便于用户(程序员)进行对库函数的调用,提高开发效率!例如我们平时的printf就是C标准库中的一个库函数!
库函数一般集成于用户操作接口这一层的某个库中:
我们的代码以来的库也是可以查看的(这里是一个C标准库):
为什么要有用户操作接口层?
这个再联系我们上面介绍的银行系统,银行不相信任何人,但还要为人民办理业务。所以加了窗口,操作系统也是一样加了系统调用接口。这里的问题是会不会有一部分人根本就不熟悉你的银行办理业务的流程,不知道如何到哪个柜台办理?答案是一定存在的!比如说某一天一个大妈来银行存钱了,你让他挂号,大妈一脸无语我是来存钱的挂什么号?你让他签字确认信息是否正确,他压根连字都不认识,就不要谈写字了!但是这部分用户依然得服务。所以,银行就提供了柜台外的一批工作人员,专门服务这类人!同样操作系统也是,我是一个程序员我现在要通过系统接口向显示器写一个“cpyyds"可是我压根不了解系统调用接口,所以就在系统调用的上面有封装了一层:用户操作接口层!便于一般的程序员进行调用!降低了使用门槛!
总结:因为程序员可能不了解系统调用接口,但是必须得给他们提供系统调用的功能,所以就提供了用户操作接口层!常见的用户接口层有各种标准库、以及以前介绍的shell和部分指令!
结构图中的最上面的那一层是一般用户(程序员)进行日常给开发的,这一层比如说图形化界面各种开发工具等等,我们日常开发就在这一层!
所以,Linux的内核就是系统调用和操作系统,外壳就是用户操作接口!
OK,本期分享就到这里,好兄弟我们下期再见~!
结束语:不骄、不躁、冷静、热爱、前进!