【Linux系统】冯诺依曼体系结构 和 操作系统的介绍
文章目录
- 一、冯诺依曼体系结构
- 二、操作系统(Operator System)
- 1.概念
- 2.层状软硬件体系结构(设计OS的目的)
- 3.如何理解 "管理"
- 4.系统调用和库函数概念
一、冯诺依曼体系结构
截至目前,我们所认识的计算机,都是由⼀个个的硬件组件组成(冯诺依曼体系结构):
- 存储器:内存
- 中央处理器(CPU):主要由运算器(算数运算、逻辑运算)和控制器(执行代码,也就是分析指令,给出控制信号)组成
- 输入设备:包括键盘、鼠标、摄像头、磁盘、网卡等
- 输出设备:包括显示器、打印机、磁盘、网卡等
关于冯诺依曼体系结构,必须强调几点:
(1)在不考虑Cache的情况下,这里的CPU能且只能对内存进行读写,不能直接访问外设(输入或输出设备)
(2)外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
(3)⼀句话总结,在冯诺依曼体系结构中,所有设备都只能直接和内存打交道。
效率:CPU >> 内存 >> 输入输出设备(外设)
容量:磁盘等外设 >> 内存 >> CPU
(这主要与成本有关,CPU中寄存器的 价格/bit >> 内存 >> 外设 )
问题:可执行程序为什么必须先加载到内存后才能被执行?
答:这是由冯诺依曼体系结构决定的,只有CPU能执行程序指令,而CPU只能对内存进行读写,所以可执行程序必须先加载到内存中才能被执行。
那么冯诺依曼体系结构为什么要多此一举呢,直接把内存单元删除掉,让CPU直接能与输入输出设备交互岂不是效率更高:
让CPU直接与输入输出设备进行交互有两大弊端:
- 外设 与 CPU 之间效率差距太大了,外设的效率极大影响CPU效率
- 外设与CPU容量差距太大了,CPU对输出设备进行一次数据传输根本就输送不了多少数据
所以要在外设与CPU之间增加内存进行过渡,引入内存能解决上述弊端:
- 内存与CPU之间的效率差距 小于 外设 与 CPU 之间效率差距,缩小效率差距。而且添加了内存作为过渡之后,外设可以在CPU处理内存中程序的同时 预加载 后续要执行的程序到内存中。所以,内存的本质:实际是外设和CPU之间的缓存
- 内存的容量远大于CPU,可以更好地与外设进行数据传输
对冯诺依曼体系结构的理解,不能停留在概念上,要深入到对软件数据流理解上。请解释,从你登录上qq开始向某位朋友发送一个⽂件,数据的流动过程。从你打开窗口,开始给他发送文件,到他接受到文件之中的数据流动过程:
首先我和朋友要使用qq进行文件的发送和接收,要先登录各自电脑上的qq,qq是一款软件(实际就是可执行程序),打开qq就是将它载入到内存。
我发送文件的过程:文件是存在磁盘(外设)上的,先使用qq将输入设备磁盘上的指定文件加载(拷贝)到内存中,CPU对文件进行一些处理后,紧接着将文件从内存输送到(拷贝到)输出设备网卡,网卡通过网络将文件发送到朋友计算机的输入设备网卡中。
朋友接受文件的过程:朋友使用qq将输入设备网卡上接收到的文件加载到内存中,CPU对文件进行解析操作,解析完成之后,将文件保存到(拷贝到)输出设备磁盘中。
结论:数据传输的过程是基于冯诺依曼结构的,数据流动的本质是在进行数据的拷贝。
二、操作系统(Operator System)
1.概念
任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell程序等等)
后续都以狭义上的操作系统来进行分析。
2.层状软硬件体系结构(设计OS的目的)
硬件系统和软件系统共同构成了一个完整的计算机系统,计算机中的软硬件体系结构是层状的。 如下图:
操作系统位于用户层和系统底层之间,操作系统存在的必要性:
- 对下:管理好软硬件资源(手段)
- 对上:为用户提供一个良好(稳定、安全、高效)的运行环境(目的)
问:我们使用计算机,大部分情况是在做什么呢(从底层视角)?
答:通过软件来访问计算机的硬件资源!(而计算机的硬件资源是有限的,所以操作系统的存在就尤为重要,它要管理好计算机中有限的资源,合理分配)
在整个计算机软硬件架构中,操作系统实际就是:一款进行软硬件资源管理的软件
3.如何理解 “管理”
以公司的管理系统为例:
一个大公司中会有数量众多的员工,很多员工可能在公司工作了十几年都没有见过公司老板一面,但老板却能把公司众多素未谋面的员工管理的井井有条,由此可见管理者要对被管理者进行管理,见面不是必须条件。
那么对被管理者进行管理的必须条件是什么呢?获取每个被管理者对象的有效信息,才是管理的必须条件。
公司中员工的有效信息绝大部分取决于员工绩效考核表,各部门负责人负责收集员工的这些有效信息汇总给公司老板,这么多员工的有效信息公司老板总不能一个一个看过去吧,所以公司一般会设计一个员工有效信息管理系统来保管众多的员工信息。
有了所有被管理者的有效信息之后,老板就能进行管理工作了,比如:当公司遇到财政危机的时候,老板做出裁掉公司中绩效最差的10%员工的决策;当公司举办年会的时候,老板做出奖励公司中绩效最好的10%员工的决策;当公司需要与其它公司谈项目时,老板派工作责任感、客户服务意识和工作品质等部分绩效分总和最高的2%员工去谈项目。
结论:管理是对被管理对象的相关有效数据进行管理,本质就是对数据进行管理
管理的方法就是:先描述(绩效表就是公司对一个被管理者进行描述),再组织(员工有效信息管理系统就是对每个被管理者的有效信息进行组织)
世界管理的本质实际就是:先描述再组织
所以:
C++、Python、java等语言,为什么都要提供类?答:因为要描述对象
C++、Python、java等语言,为什么都要提供容器技术,比如stl?答:因为要组织对象
因为高级语言肯定要包含管理功能,而世界管理的本质就是先描述再组织,所以C++、Python、java等语言都必须要提供类 和 容器技术
操作系统是用什么语言写的?答:C语言
C语言描述对象用:struct
用数据结构来组织这些对象
(可以预料到OS中一定会存在大量的数据结构,不同的数据结构匹配对应的调度算法)
计算机管理硬件
(1)描述起来,用struct结构体
(2)组织起来,用链表或其他高效的数据结构
4.系统调用和库函数概念
在开发角度,开发者是不能直接访问操作系统的,因为直接访问操作系统的安全性太低,一些误操作可能会把操作系统搞崩掉。如何能让开发者安全的访问操作系统:
操作系统对外会表现为⼀个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用接口,使用操作系统提供的系统调用接口可以安全的访问操作系统。
结论:为了保证让用户安全的访问操作系统,所以设计出和操作系统交互:只能使用系统调用接口。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高(需要用户掌握操作系统及软硬件相关知识),所以,有心的开发者可以对部分系统调用进行适度封装,从而形成各种库(比如C++和C语言标准库),有了库,就很有利于更上层用户(主要指程序员,程序员想要操作计算机,掌握一门计算机语言就可以,降低程序员的学习成本)或者开发者进行二次开发,开发出各种软件 和 计算机图形化界面之后,小白用户也可以操作计算机了。
注: 大部分库函数使用都会涉及底层硬件,比如printf函数会使用屏幕、scanf函数会使用键盘、文件 I/O类函数使用时涉及磁盘,文件存储在磁盘等硬件设备。只要涉及调用底层硬件的库函数必定封装了系统调用,因为只有系统调用能访问操作系统进行硬件资源调用。 但并不是库中所有的库函数都封装了系统调用,比如C语言math库中的很多函数,它们执行纯粹的计算任务,此类函数主要依赖浮点数运算单元(FPU)来完成复杂的算术运算,这完全是基于CPU 浮点指令集上的操作,没有任何地方需要用到额外的硬件协助或是进入内核模式,所以也不存在对系统调用的需求。