河北企业建网站,建网站用自己的主机做服务器,wordpress分页ajax,上海电商摄影【Linux系统】—— 冯诺依曼体系结构与操作系统初理解 1 冯诺依曼体系结构1.1 基本概念理解1.2 CPU只和内存打交道1.3 为什么冯诺依曼是这种结构1.4 理解数据流动 2 操作系统2.1 什么是操作系统2.2 设计OS的目的2.3 操作系统小知识点2.4 如何理解管理2.5 系统调用和… 【Linux系统】—— 冯诺依曼体系结构与操作系统初理解 1 冯诺依曼体系结构1.1 基本概念理解1.2 CPU只和内存打交道1.3 为什么冯诺依曼是这种结构1.4 理解数据流动 2 操作系统2.1 什么是操作系统2.2 设计OS的目的2.3 操作系统小知识点2.4 如何理解管理2.5 系统调用和库函数 1 冯诺依曼体系结构 我们的计算机是由硬件构成的但各种硬件如显示器、键盘、网卡、磁盘等硬件设备并不是杂乱无法揉在一起就能成为计算机的所有的计算机都需要按照一定的组织结构将所有的硬件划分在一起而当前最常见的计算机组织结构就是冯诺依曼体系结构。 1.1 基本概念理解 对上图各个部分的介绍 输入设备 键盘、鼠标、话筒、摄像头、网卡、磁盘…… 输出设备 显示器、磁盘、网卡、打印机…… CPU中央处理器主要由运算器和控制器组成。 运算器主要是用来进行运算的我们所做的运算主要分为两种算术运算(加减乘除)和逻辑运算真假、位运算 控制器主要是用来控制CPU去取指令、分析指令、执行指令等工作 存储器现阶段理解存储器就是内存 其他概念介绍 外设 输入输出设备我们统称为外设。外设需要做的是将输入设备的数据读到内存里将内存中的数据输出到外设中。 磁盘和网卡比较特殊他们既是输入设备又是输出设备。网卡因为网络我们还没学习暂时先不做介绍。 IO 之前我们写C/C程序进行文件读取时读文件就是将磁盘中的文件读到内存里写文件就是将内存中的文件写到磁盘中。我们将这种读写的动作称为 input/output即IO。 理解IO应站在内存的角度输入设备把数据交给你内存就是input你内存把数据给输出设备就是output 1.2 CPU只和内存打交道 我们都知道我们写的程序要运行必须先将生成的可执行文件加载到内存中那么程序运行之前放在哪里 答案是在磁盘。 程序本质就是一个文件它就是我们编译好的在特定路径下的二进制文件。 为什么程序要运行必须先加载到内存中呢 上面的冯诺依曼体系结构图中红色箭头表示数据的流动方向。从图中不难看出CPU只能从内存中读写数据 在数据层面上CPU只认内存压根不认什么输入输出设备。 那我们的软件运行是谁在运行我们的软件呢正是CPU是CPU执行我们的代码访问我们的数据 可是CPU无法读取外设所以我们必须把程序加载到内存如此才能被CPU访问到。 这是由冯诺依曼体系结构规定的。 在冯诺依曼体系结构中数据的流动方向永远是输入设备 - 内存 - CPU - 内存 - 输出设备 但流动这个词太抽象我们换句话数据流动的本质是从一个设备 “拷贝” 到另一个设备 所以可以推导出冯诺依曼体系结构的效率取决于设备的拷贝效率决定
小结 CPU在数据层面只和内存打交道外设只和内存打交道。 1.3 为什么冯诺依曼是这种结构 所以冯诺依曼为什么是上图的结构呢可不可以不要内存直接输入设备 - CPU -输出设备 这种结构呢 这里给大家介绍一下存储分级如图 在计算机世界中存储这件事如果它离CPU越近(金字塔顶端)它的存储容量越小但是它速度更快、也更贵离CPU越远(金字塔低端)它的存储容量越小但速度更慢不过也更便宜。 ps我们可以在淘宝看看同等加钱分能买到多少G内存条和磁盘 如果直接输入设备 - CPU -输出设备 这种结构就会有一个很大的问题 输入输出设备属于外设它的运算效率相比于CPU特别低虽然CPU的运算效率很快但根据木桶效应总体的运行效率就取决于外设。 那我们能不能将我们的各种外设全部做成寄存器这样运行效率不就高了吗。是可以的只要你有钱因为这时一台电脑的造价将无比恐怖 为了在效率和成本之间找平衡我们在计算机体系结构中引入了寄存器内存 有了内存内存的运行效率本身相对较高我们可以提前将数据从外设拷贝到内存这样CPU可以直接从内存中读数据。 这样我们花少量的前就可以获得一台运算效率不错的计算机。现在的计算机本质上是性价比的产物。 为什么冯诺依曼体系这么简单却是目前计算机体系的主流结构 冯诺依曼的历史意义不在技术上它的意义在于让平民百姓可以用较低的价格买入效率不错的计算机百姓买得起全世界才有那么多网民有了这么多网民才有了互联网。冯诺依曼体系的历史意义在于它是构成互联网的必要条件。是历史选择了冯诺依曼体系 1.4 理解数据流动 请解释从你登录上qq开始和某位朋友聊天开始数据的流动过程。 既然两个人聊天是用电脑那么本质就是两台冯诺依曼体系进行聊天 首先要聊天要先登录 QQ登录 QQ 就是启动 QQ 这款软件其本质就是将QQ的可执行程序加载到内存。你在键盘输入你好本质就是输入设备键盘中的数据流动到了内存。数据经过运算器处理加密、封包后写回内存数据再从内存流动到输出设备网卡。 网卡将数据交到网络网络再将数据交到朋友的机器。这点我们以后详细学习 朋友的输入设备(网卡)拿到数据拷贝给内存QQ的可执行已加载到内存再交给CPU解密等CPU处理完后交给内存内存在将数据输出到输出设备显示器中。 数据流动的本质是在冯诺依曼体系中进行数据流动 2 操作系统
2.1 什么是操作系统 任何计算机系统都包含一个基本的程序集合称为操作系统(OS)。操作系统是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序 说人话操作系统是一款进行软硬件管理的软件。 没错操作系统自己本身是一款软件 操作系统分为狭义上的操作系统和广义上的操作系统 狭义操作系统的内核 内核的四大主要工作进程管理、内存管理、文件管理、驱动管理 广义内核 其他程序例如函数库、shell程序等等 后面若不加说明操作系统指的是狭义上的操作系统及内核 2.2 设计OS的目的 计算机软硬件结构 在计算机结构的最底层是各种硬件网卡、磁盘等各种硬件在逻辑上时按照冯诺依曼体系结构组织的。 每一种硬件都对应有一个驱动程序网卡有网卡驱动硬盘有硬盘驱动因为读取每一种设备的信息都有自己个性化的读取方式所以访问各种硬件都要配上对应的驱动程序。具体现象比如你插上鼠标可以依然动不了过了一两秒显示器上弹出某某驱动安装成功这时再动鼠标才有反应。驱动程序大部分是由对应硬件厂商来提供的。 在驱动程序之上则是操作系统。 操作系统对下要与硬件交互管理所有的软硬件资源 但操作系统管理硬件并不是目的而是手段。 操作系统的目的是对上为用户程序应用程序提供一个良好的执行环境 比如我打个游戏你总不能3分钟一黑屏5分钟一重启吧操作系统你能不能把底层的软硬件资源管理好不要让他出错让我安心打游戏。 小结操作系统存在的目的是给用户提供服务的一切以人为本
2.3 操作系统小知识点 从上图中不难看出计算机软硬件体系结构从硬件到用户整个过程是层状结构 如何理解呢 层状结构在软件工程上体现出的特点是高内聚低耦合。 高内聚把相同功能相同逻辑的代码和数据放在同一层内部比如操作系统内全是操作系统的代码数据 低耦合指的是层跟层之间只使用一些接口的方式来互相调用在数据和逻辑层面没有强耦合 有了这样的设计特点未来我想该某一层的数据或逻辑其他层基本没有影响。比如我改操作系统驱动和硬件都不用变。 高内聚低耦合主要是为了方便代码后续的可维护性。可维护性简单来说就是一个模块我们修改了并不影响另一个模块那个模块出问题就子啊那个模块找问题。 计算机各种硬件在设计上也是高内聚低耦合的。 一台计算机的各种硬件CPU、磁盘、主板、网卡、显卡都是由不同厂商提供的我们想换某一个硬件随便换。这说明计算机设计在硬件上就是高内聚低耦合的 操作系统不允许任何人直接访问操作系统内的各种代码和数据我们要访问操作系统必须使用系统调用 —— 其实就是函数只不过是系统提供的 用户要正确使用系统调用必须对操作系统有一定的了解。那使用起来成本不是很高 正是因为系统调用太麻烦了所以有人给我们做了封装给我们形成了一个库比如 C标准库 、C 库 所以我们平时的开发动作在整个体系结构的最上层 我们的程序只要判断出它访问了硬件那么它必须贯穿操作系统 我们之前用 printf 往显示器上打印其本质是用户把数据写到了硬件而我们是不可能直接绕过操作系统直接到硬件的所以 printf 这个函数底层一定要封装系统调用再通过操作系统访问对应驱动才能把数据交到硬件上。 所以我们之前的 scanf、printf 对各种文件的IO等等操作是要访问操作系统的
2.4 如何理解管理 在整个计算机软硬件架构中操作系统的定位是⼀款纯正的“搞管理”的软件 因此要理解操作系统就要先理解 “管理”。 为帮助小伙伴们更加深刻理解管理我们举一个小例子。 我们简化学校系统认为整个学校只有校长管理层、辅导员执行层、学生被管理层。 人类日常生活中做的事情就两种决策和执行 对老百姓来说决策和执行是不分家的。决定明天不去上早8是决策第二天睡到12点是执行 但对一个管理体系来说管理者最大的能力就是他有决策权比如学校的校长。辅导员作为执行层时没有决策权的 回过头看软硬件结构的下三层操作系统是决策层校长、驱动层序是执行层辅导员、底层硬件是被管理层学生 校长是如何管理生的呢 校长需要和学生见面吗不需要我们除了入学和毕业就没见过校长。 所以要管理管理者和被管理者可以不需要见面 连面都不见如何管理 见面并不是必要条件见面只是为了获取你身上的相关数据。只要我有其他方式获得相关数据就没必要见面。 比如校长想给张三发奖学金并不需要亲自去宿舍问张三成绩怎么样只需要知道张三排名全校前十就可以 所以管理是通过数据进行管理 不需要见面如何拿到数据 所以校长和学生之间必须要加一个人—— 辅导员。数据由辅导员帮忙获取。辅导员获取我们的信息记录在教务系统当中校长根据教务系统中的数据管理每一个学生。 回过头操作系统管理各种硬件并不需要和硬件接触它管理硬件是通过数据进行管理的而数据就是由驱动程序获取的。 数据要拿的有意义总不能让辅导员统计今天学生穿什么颜色的衣服吧。 校长给了辅导员一个Excel表格让辅导员获取相关数据 现在校长每天的工作由管理学生改为管理表格中的数据基于数据做决策比如校长看到表格中李四20门课挂科19门直接将李四开除。 但如果表格中的数据太多了呢100名学生校长还管得过来10万名呢 对学生的数据进行管理本质不就是增删查改吗可随着人越来越多增删查改的负担越来越大。 幸好校长是计算机专业出生 校长决定让计算机帮忙管理。 校长发现表格开头就是学生的各个属性不同行之间大家的属性一样只是具体的值不一样。 在软件层面上如何把不同的属性集合在一起呢 结构体校长只会C语言因为校长是操作系统操作系统是由C语言写的
struct student
{//姓名//年龄//籍贯//...
}这样我们就可以用这个结构体定义出上万个变量每个变量都对应一个学生。 可是上万个学生变量本身是独立的如何对他们进行管理呢 数据结构 比如我们可以用链表将所有学生变量链接起来当然也可以是其他结构。 这样校长对学生的管理工作就转化为了对链表的增删查改 如此校长管理学生的工作我们称为先描述再组织 即先用结构体将学生的属性描述起来再用各种数据结构如链表将各个学生结点组织起来 先描述再组织可以完成现实世界对任何场景的建模。 所以看完了上面的例子操作系统是怎么管理硬件的 操作系统先对硬件进行描述先定义一个结构体包含硬件的各种属性每个硬件对应一个对象再创建链表将各个对象链接起来。对应该的管理改为对链表中各个对象的增删查改。 所以C为什么要提供类的概念为什么C该提供STL 因为类解决的是先描述的问题而STL是容器本质是各种数据结构容器解决的是再组织的问题 任何面向对象的语言都提供了类和容器我们这个世界就是先描述再组织的世界。
2.5 系统调用和库函数 操作系统要向上提供对应的服务但是操作系统不相信任何用户或者人 操作系统不允许任何人直接访问操作系统内的各种代码和数据我们要访问操作系统必须使用系统调用 —— 其实就是函数只不过是系统提供的 这就是一个非常矛盾的地方一个事物要给人提供服务却不相信任何人 现实中有没有类似的机构呢要给人提供服务却不相信任何人。 银行! 银行要给我们提供各种金融服务却不信任任何人不让任何人到它的金库去取钱。 于是银行将自己封装起来仅仅设置了各个窗口开放给用户这个窗口就相当与操作系统的系统调用接口 Linux / Windows / macos 等大部分操作系统都是用 C语言 写的系统调用本质就是系统提供的函数 — C语言风格的函数。既然是函数就要有函数参数和返回值。 输入参数是用户给操作系统的返回值是操作系统给用户的所以系统调用的本质就是用户和系统之间进行数据交互。银行中我们要取钱要先将银行卡等资料给窗口里的工作人员这就是传参银行在自己内部运作再将结果返回给我们我们拿到结果。 这样操作系统与用户之间的耦合度就非常低能达到既给用户提供服务又不让用户访问的目的。 但是银行办一件事往往比较麻烦有的老太太去银行存钱可能还不知道去银行要先取个号。所以银行在大堂中设置了工作人员来帮助人们完成相关手续。 系统调用也同理如果让小白直接访问系统调用那成本比较高所以操作系统还给我们提供了各种库、外壳、指令我们只需访问库、外壳等不懂操作系统也能将操作系统用起来了。 这就是用户操作接口层而我们用户就是再最上层做相应开发
总结 在开发角度操作系统对外会表现为⼀个整体但是会暴露自己的部分接⼝供上层开发使用这部分由操作系统提供的接口叫做系统调用 系统调用在使用上功能比较基础对用户的要求相对也比较高所以有心的开发者可以对部分系统调用进行适度封装从而形成库有了库就很有利于更上层用户或者开发者进行二次开发。 库函数和系统调用属于上下层的关系 好啦本期关于冯诺依曼体系结构与操作系统的知识就介绍到这里啦希望本期博客能对你有所帮助。同时如果有错误的地方请多多指正让我们在 Linux 的学习路上一起进步