目录
编辑
1.关于计算机的体系结构
1.1 冯诺依曼体系结构的诞生
2.冯诺依曼体系结构
2.1 cpu:运算器:更多的是让cpu具有特殊的数据计算功能:
2.2 控制器
2.3输入设备
2.4输出设备
3.计算机各个硬件设备之间的关系
4.内存与计算机效率
5.关于为什么总说程序运行时要现将程序加载到内存
6 图示数据(文件)如何在不同体系之间流动
7.关于计算机软件层面:操作系统
8.操作系统向下:①关于驱动程序
9.②生活中的管理映射操作系统对计算机资源的管理
9.1 生活中的管理实例
9.2 计算机对硬件的管理
10. 操作系统向上服务
10.1系统调用接口
10.2 用户操作接口,库封装
1.关于计算机的体系结构
最简单的计算机模型:输入--计算--输出
计算机有各种各样的硬件(显卡、硬盘、键盘等)这些能够看到 和软件(看不到)的组成,而所有的硬件单元都要由一定的体系结构组织起来才能形成我们的计算机,软件也是由一定的软件结构组织起来。计算机有很多很多的组织方式也就是体系结构,被保留的叫做冯诺依曼体系结构。
1.1 冯诺依曼体系结构的诞生
历史:在计算机诞生之前,人们在计算的精度和数量上出现了瓶颈,对于计算机这样的机器的需求就十分强烈,冯·诺依曼的逻辑和计算机思想指导他设计并制造出历史上的第一台通用电子计算机。他的计算机理论主要受自身数学基础影响,且具有高度数学化、逻辑化特征,对于该理论,他自己一般会叫作“计算机的逻辑理论”。而他的计算机存储程序的思想,则是他的另一伟大创新,通过内部存储器安放存储程序,成功解决了当时计算机存储容量太小,运算速度过慢的问题。(引自百度百科)
第二次世界大战期间,美军要求实验室为其提供计算量庞大的计算结果。于是便有了研制电子计算机的设想。面对这种需求,美国立即组建研发团队,包括许多工程师与物理学家,试图开发全球首台计算机(后世称作ENIAC机)。虽然采取了最先进的电子技术,但缺少原理上的指导。这时,冯·诺依曼出现了。他提出了一个至关重要的方面:计算机的逻辑结构。冯·诺依曼从逻辑入手,带领团队对ENIAC进行改进。他的逻辑设计具有以下特点:
- (1)将电路、逻辑两种设计进行分离,给计算机建立创造最佳条件;
- (2)将个人神经系统、计算机结合在一起,提出全新理念,即生物计算机。
即便ENIAC机是通过当时美国乃至全球顶尖技术实现的,但它采用临时存储,将运算器确定成根本,故而缺点较多,比如存储空间有限、程序无法存储等,且运行速度较慢,具有先天不合理性。冯·诺依曼以此为前提制定以下优化方案:
- (1)用二进制进行运算,大大加快了计算机速度;
- (2)存储程序,也就是通过计算机内部存储器保存运算程序。如此一来,程序员仅仅通过存储器写入相关运算指令,计算机便能立即执行运算操作,大大加快运算效率。(引自百度百科)
2.冯诺依曼体系结构
计算机在硬件上被划分为五大单元
中央处理器(运算器、控制器)也被叫做芯片,输入设备 、输出设备、内存
2.1 cpu:运算器:更多的是让cpu具有特殊的数据计算功能:
比如在游戏王者荣耀中,移动游戏人物就是坐标的运算,在打架时,蓝量血量的减少增加本质上就是对蓝量,血量的重新计算后再刷新到人物模型上。如果爆发非常复杂的团战,就涉及到多个人物的状态计算,计算机就疯狂计算,不过这个过程被包装起来的,所以所有问题要计算机解决都要能转换成计算机可以计算的问题。一类是加减乘除常规运算,一类是逻辑运算。所以运算器就主要做算逻运算。
2.2 控制器
更多的协调协调设备之间,cpu之间的信息流动,比如一些指令操作。
2.3输入设备
计算机中,除了cpu和存储器,剩下的都是设备。显示器,鼠标,摄像头,网卡,显卡 声卡等,每个设备都有1不同1的品牌,比如硬盘:三星、镁光等等,所以计算机是分别有擅长造这些设备的厂家打造的设备按照冯诺依曼体系组织起来的,合起来变成新的品牌就是电脑品牌。这个就说明:每一个设备都是独立的物理设备。最典型的输入设备:键盘、摄像头、鼠标、网卡、磁盘
2.4输出设备
和输入设备定位类似,也是独立的,声卡、显卡、网卡、磁盘、显示器、打印机等
二者对比,不难发现,有些设备只做输入,有些设备只做输出,有些设备既可以做输入又可以做输出。 比如磁盘,当我们将磁盘中的内容输出,将数据写入,既输出又可输入。
这里的存储器指的是内存,不是测盘,内存有个特点:掉电易失性存储介质
硬盘:永久性存储介质,所以不叫存储器叫做输入输出设备
3.计算机各个硬件设备之间的关系
那么如果我们要通过计算机发送信息,我们在输入设备上键盘上敲下字符,先不谈发送,这个信息首先应该在计算机内部应该可以通过某种方式来到和网络相关的设备比如网卡,那么消息才能被发送。那么设备和设备之间是独立的,所以设备和设备之间应该要存在某种物理的方式,让数据可以在设备之间流动。:所以设备之间是连接起来的,通过线(系统层面叫总线,总线的分类)连接起来
现在所有的线都被集成在主板上了,对于cpu,磁盘有对应的插槽,插上过后就可以连接,主板上有很多设备线路,所以设备之间信息得以流转,至少设备之间互相通信是可以做到的,所以设备之间是连接的,但是各设备互相独立。
设备的链接不是目的,不是为了连接而连接,是通过连接手段达到设备之间信息流动的目的。所以键盘敲下字符,显示器可以拿到信息进行显示。
本篇文章是初次探索,所以仅仅考虑下图中的蓝色线路,也就是只探讨设备之间信息的流动
比如说:输入设备是键盘,将数据拷贝到内存,
中央处理器让设备写,暂停这些叫控制信号。
用户将数据给输入设备,输入设备给存储器,存储器给cpu,处理给存储器,给输出设备展示给用户。
4.内存与计算机效率
数据在设备之间流动,实际上设备之间会进行数据的来回拷贝。将数据从一个设备搬到另外一个设备。拷贝的整体速度,是决定计算机效率的重要指标。设备到设备之间,设备到数据之间拷贝数据速度的快慢就决定了计算机的效率。
计算机现在能够被家家户户使用的原因首先是产品性能稳定,其次这个商品的消费负担对于一个家庭来说可以负担也就是价格便宜。很早的计算机是非常昂贵的。
如果我们简单描述一些计算机:
那么存储器的作用和存在意义是什么呢?
首先为什么体系结构中存在内存,
计算机中存在一个存储的金字塔
距离cpu越近,效率越高(写入快),造价越高,单体容量越小,性价比不高
cpu是皇帝,寄存器就是苏公公,效率非常快,几乎要赶上cpu.
400-800只可以买到4-5g内存条
400-800可以买到1T到2T的固态硬盘。
所以可见内存的成本是要更高一些的。
那么,如果没有内存这块,按照我画的那个结构来讲应该计算机应该更稳定,因为体系结构简单,效率更快,因为数据从输入设备来到cpu直接计算。但是问题在于:输入输出这些叫做设备,磁盘等都离cpu很远,但是cpu处理数据能力很快
那么最后我们计算机的处理效率就会取决于这些满的外设的效率,导致整机的效率变慢,就像一个急性子和一个慢性子搭档,最后做一个项目的工期是有慢性子决定,这非常像我们的木桶原理,应该桶可以装多少水,完全取决于最短的一边有多高
所以如果二者直接相连就会拖累计算机的效率。cpu会一直处于等待停止状态。
cpu是纳秒级别单次运算,输入设备是毫秒差100w倍,(只是一个举例,数据不准确)外设跟不上,那么解决办法就是,在二者直接补充一个设备:内存,定期刷新数据给cpu,保证计算机速度不以外设速度作为计算机速度标准,以内存为标准。
但是外设的数据处理能力不变,而后原先cpu可以直接访问输入输出,现在又多一个中间商,本来原先就慢,现在多了一个内存坎,为什么不是反而更慢,而是更快。
内存把输入设备的数据在cpu还没有需要这个数据的时候,就将数据搬到内存了,cpu再读取就直接从内存取,输出数据,数据直观从cpu输入到内存然后接着处理其他事,内存再将数据慢慢刷新到输出设备,数据提前从输入设备加载到内存叫做预存,将数据从内存缓缓刷新到输出设备叫缓存。这样的机制,如果内存处理很好,cpu就只和内存交互,就整体提高计算机效率。内存怎么预先知道cpu要处理什么数据,这是操作系统要处理的工作,可以由一定方式知道。
所以在硬件级别上可以把内存看做一个非常大的缓存,介于设备和cpu之间,从此完后,数据得先放到内存,CPU直接和内存进行交互,不与外设打交道。就像老板跟着一个秘书,有签字等先给秘书,老板处理工作通过秘书。
所以有时计算机卡顿会通过添加内存条的方式提高效率。如果钱很多,将内存用寄存器铺满,甚至用寄存器做磁盘,不考虑断电,技术可以做到。但是很贵,所以内存存在,使得计算机价格便宜,效率也很不错,也就呼应了上文中为什么现在的计算机大面积可以普及。这才是冯诺依曼将效率问题转换为软件问题,计算机价格向下称为经典的原因。
结论:
拷贝速度越快,速度越高,数据先到内存,从内存到cpu,处理了从cpu到内存,再到输出。
计算机的核心工作:内存和cpu交互
5.关于为什么总说程序运行时要现将程序加载到内存
首先磁盘是外设,内存是内存
我们在写C语言代码的时候,一直说,程序在运行的时候,必须将程序先加载到内存。
原因:程序编译好之后是一个文件,文件存储在磁盘或者硬盘外设中,程序中有对应的指令和数据,语句等是由cpu执行,所以程序必须从外设拷贝到内存中,cpu读取数据只会从内存中读取
所以在数据层面,cpu只和内存打交道,外设也只和内存打交道。核心地位。所以,程序运行时必须先加载到内存是由冯诺依曼体系决定。
6 图示数据(文件)如何在不同体系之间流动
7.关于计算机软件层面:操作系统
计算机开机时第一个被加载的软件就是操作系统。开机等待就是在加载操作系统
操作系统是一个进行软硬件资源管理的软件
关键字:软硬件 管理 软件
操作系统存在的意义:
对下管理好软硬件资源---这是操作系统的手段
对上为用户提供一个良好的(稳定高效安全)的运行环境,这是操作系统的目的。
底层硬件是按照冯洛伊曼体系结构组成
8.操作系统向下:①关于驱动程序
驱动程序:首先只有每个硬件比如声卡、网卡等设备,只有其生产厂家知道这些设备该如何访问,比如说想让设备启动,终止,离线,或者对设备写入数据,那么对于这些设备如何访问只有企业才才知道,那么将访问这个设备的方式或者方法写成一个软件,软件可以控制对应硬件,或者将硬件的接口公开,由其他人来编写控制这个硬件的设备。所以驱动程序就是这样一个软件
操作系统要使用硬件,使用驱动程序提供的方法就可以读写关闭启动硬件。硬件软件打包给操作系统调用,操作系统就调用驱动程序提供接口就可以操作硬件了。驱动程序只提供访问方法,上层操作系统来决定硬件的动作,通过驱动访问硬件设备实现。每一款硬件都要有其匹配的驱动程序,这也就是为什么有时我们需要安装驱动程序。很多常见驱动是电脑内置的,网卡驱动,键盘驱动等等,有时我们购买一些硬件,可能没有对应的驱动,我们的对应硬件厂家就会提供对应硬件的驱动下载地址:
比如我们的游戏手柄,Xbox
所以驱动实际上和普通的软件没有区别。有时我们的网络突然掉了,声音没有了等通常也会采取更新驱动的方式解决。驱动在编写时也得按照操作系统的规矩来编写。
9.②生活中的管理映射操作系统对计算机资源的管理
操作系统是一个搞管理的软件,我们再来谈谈管理和如何管理(计算机领域)
世界上只有两种人:做决策 做执行 ,二者混合出行,(摆烂的就是既做决策又做执行)
那么所谓的管理更多的就是做决策,好的管理就要做出正确的决策。操作系统就相当于一个管理者的角色,被管理者基本就是做执行。就是硬件扮演的角色,驱动作为一个中间角色促进使得决策落地。
9.1 生活中的管理实例
用一个学院的例子来给大家举例
院长作为一个学校的真正的管理者,负责指定和安排学院的相关工作,包括学生和老师,但是重点是如何管理好学生。对于院长来说,管理工作并不是记住每一个人,然后亲自来看管每一个学生。这就是说管理者和被管理者可以没有交集,不用见面,管理的本质是对人的信息和数据做管理。比如学号为多少的同学旷课多,该采取什么措施,那些学号的住那个楼层,等等。管理者的核心工作是做出正确的决策,但是也是根据信息,根据数据来做出决策,要保证决策的正确性,比如要发奖学金,肯定就要找到成绩最高的那几个同学进行发放,发现有个学号老是显示旷课,就该开除。
那么管理者和被管理者之间互不见面,怎么实现通信,信息传达呢,这个就是辅导员(中间层)的作用,开学第一天院长就会让辅导员收集每个同学的基本信息,每个同学才有了自己的编号也就是学号、宿舍号、班级号等等。如果某一天某个学号的同学表现的太好或者太坏,院长就让辅导员找找这个同学执行一下开除或者奖励工作。
随着学院越来越多的人,也就说院长手里关于人的数据是非常多的。在院长层面来说,此时对于不同的学生信息是不一样的,管理起来就不怎么方便,对人的管理就要转变为对数据的管理,学生对于院长工作需要的信息类型是一样的,也就说院长只需要学生关于学校属性的数据,就像你工作后老板不关心你的学号这种属性数据是多少一样。那么对于每一个学生就有一个通用的属性描述了:
struct student
{
int student number;//学号
//性别
//年龄
//班级
//
//
};
但是有了这个对学生整体数据的描述觉得和拿着一张数据表的时候没有什么两样,只是稍微对数据进行精确化了一些。所以:
struct student
{
int student number;//学号
//性别
//年龄
//班级
//
//
struct student * next//创建一个指向下一个信息的指针
};
院长创建了一个这样的学生链表数据结构,将学院学生的数据都组织起来
对学生的组织管理决策工作也就变成了对学生数据管理的增删查改。此时的管理工作和效率变简单了。
这个过程也就是计算机对管理的一个建模过程,中心思想为:先描述再组织。
9.2 计算机对硬件的管理
那么映射到我们操作系统对应对底层硬件的管理来说也就是一样的了,底层硬件对于操作系统来说信息比较多也比较庞杂,操作系统将硬件的属性描述称为硬件的属性的结构体链表。然后根据设备命名通过驱动来操作我们的设备,打开、关闭、链接等等。同时,院长在管理学生的同时也要管理辅导员,那么操作系统也要对驱动程序进行管理,也是先描述再组织,利用数据结构进行管理。
struct device
{
char name;char status;//状态
:
:
struct device* next;
}
所以计算机操作系统管理硬件的方式为:
- ①先将硬件的属性进行描述,使用结构体(操作系统是用c语言写的)
- ②再将其组织起来,用链表或者其他数据结构(队列、二叉树都可以),方便管理。
- 重点先描述再组织的建模过程
- 建模:将现实问题转换成计算机认识处理的问题这个过程就是计算机建模。
10. 操作系统向上服务
我们再来看一下操作系统存在的意义;就是为什么要用操作系统呢?
在早期的计算机中是没有操作系统概念的,人们通过开关来控制计算机,控制输入输出。
二进制--汇编语言--C语言--软件--操作系统
这是一个发展流程。
为什么要有操作系统,也就是为什么要有操作系统的管理?
对下管理好软硬件资源---这是操作系统的手段,不然打游戏三分钟一个重启,一会儿没有声音,一会没有画面。那么操作系统的目的就有了,对上为用户提供一个良好的(稳定高效安全)的运行环境,这是操作系统的目的。那么我们就有了需要操作系统的理由。人工管理的计算机效率非常慢,人作为是使用者体验感也不是很好。
操作系统对底层硬件的管理方式是先描述再组织,那么对上是怎么样的呢?
10.1系统调用接口
首先为了保证一个稳点、高效、安全的环境,操作系统是不会让用户直接操纵操作系统,操作系统里面存放在各种各样的管理好的大量的计算机软硬件数据,直接让用户访问可能发生数据的丢失,盗取、打乱等对于操作系统来说是非常危险的。如果用户不是机器主人,可能就会发生数据的盗取。所以操作系统设置有系统调用接口,必须通过系统调用结构来访问操作系统,就像人到银行取钱都是到窗口取钱,而不是让用户自己去金库拿。这非常危险。
这里的系统调用接口就是操作系统提供的一批接口,只允许我们的用户通过系统调用接口来访问操作系统内部,不允许用户直接访问。所以操作系统被设计好了就必须有系统调用接口的概念。
我们c++中学过类,在类中我们是有权限的,对类内的数据一般设置为prevate,对于想让外部用户调用访问的写成公有的方法,不想暴露的就写成prevate,要想使用类内数据只能通过公有方法和公共接口来调用,public,这实质上是对类内数据的管理,所以操作系统也就相当于一个巨大的内,公共接口就是系统调用接口,用于给用户访问操作系统。linux是用C语言写的,这些系统调用接口实质上就是C语言设计的函数,只是这个函数由系统提供叫做系统调用,函数对应着有输入输出,当然不是全都有,当调用有输入输出的接口时,输入就是用户想把数据交给操作系统处理,输出就是想将操作系统数据给用户,这就叫做用户和操作系统的交互。就像银行用户输入要取多少钱,柜台给多少钱给用户。这是操作系统对数据方面的支持,(用户想知道当前多少进程),操作系统也提供功能方面的支持,所以我们需要操作系统,同时操作系统也会给我们提供系统调用接口。
结论:任何人都不可以直接访问操作系统内的任何数据,必须采用操作系统。
10.2 用户操作接口,库封装
那么用户可以绕过操作系统访问底层硬件吗?或者用户可以直接绕过系统调用直接访问操作系统吗?
答案是不可以的,操作系统是真正的管理者,不能有越过操作系统的动作,必须通过操作系统。越级访问是不允许的。操作系统对上服务也必须提供系统调用接口,系统中会在系统层面上提供上百个系统调用接口,用户通过系统调用接口完成特点的操作。
例子:printf
打印在显示器,显示器是硬件,printf并不是直接将数据打印在屏幕,这个函数底层必须经过操作系统向底层硬件显示器打印,操作系统为了内部环境的安全稳定,不会让任何人直接访问操作系统,所以print作为C语言函数内部肯定封装了系统调用接口。
未来使用函数,函数会影响硬件的变化,底层绝对封装系统调用。
那么用户可以直接调用系统调用接口吗:
是可以的,因为系统调用接口本身就是提供给客户的。
这些接口不是所有用户都会使用,就像银行柜台的操作不是任何人都会,爷爷每次取钱都会带上我,因为操作爷爷不会,流程爷爷也不理解。所以操作系统会提供一层服务层,这个服务层就是爷爷身边的孙子一样,因为接口函数返回值,参数需要用户对操作系统有一定的了解,所有就有人对这些系统调用进行封装形成对应的lib也就是库,方便用户(普通用户,开发者等)使用,减少用户使用成本,最典型的就是c/c++中操作系统将访问显示器和键盘这样的操作封装成printf函数,所以有c标准库的概念,系统调用层可以有用户接口和库,这样用户就不用使用系统调用了,使用库,shell外壳和指令操作,就更方便了。用户对系统的使用成本也就降低了。
系统调用和库函数的差异:
- 系统调用由操作系统向上提供
- 库函数由用户层提供,二者是上下层关系。不一定所有库函数都会调用系统调用,只要调用就是上下层关系。
这套结构适合所有操作系统
如果库在linux将系统调用封装,在windows中也分装,但是对上层只提供统一的接口,假设是printf,在C语言层面上使用printf,但是底层在不同的操作系统下面就采用不同的接口,这个库是c的设计者提供。所以说某些语言具有跨平台性,可移植性,因为差异化在库中就屏蔽了。同样的c代码编译在linux下可以跑,在windows下也可以跑,这叫做跨平台性,在库层面体现,这意思为什么提供库的封装的原因。
11.结语
以上就是本期所有内容的讲解,创作不易,大家如果觉得还可以的话,欢迎大家三连,有问题的地方欢迎大家指正,一起交流学习,一起成长,我是Nicn,正在c++方向前行的奋斗者,数据结构内容持续更新中,感谢大家的关注与喜欢。