您现在的位置是:首页 >技术教程 >【Linux】冯诺依曼体系及操作系统网站首页技术教程
【Linux】冯诺依曼体系及操作系统
本期博客我们将深入学习操作系统的架构
目录
一、冯诺依曼体系结构
冯诺依曼体系这个名词相信大家或多或少都知道一些,我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系:
我们都知道使用计算机是为了计算数据的,那我们如何将数据交给计算机(CPU)呢?
答案就是将一系列输入设备(如:键盘、话筒、摄像头、网卡、磁盘)输入的数据交给存储器(内存),CPU再从内存中调用需要处理的数据,在处理完后交给内存由内存交给输出设备(如:显示器、声卡、网卡、磁盘),最后呈现一系列的效果。
• 我们有一个疑问,既然CPU可以直接处理数据,那为什么要将输入设备的数据先交给内存,再呈递给CPU进行计算呢?这不是多此一举吗?
○ 这是因为CPU的计算速度是非常快的,而输入和输出设备的数据传递跟CPU不在一个数量级上,由于木桶效应( 一只木桶能盛多少水,并不取决于最长的那块木板,而是取决于最短的那块木板),导致CPU计算完数据之后,需要花大量时间等候输入和输出设备完成数据传递,计算机的整体处理速度会被大大减缓。
所以有了内存就可以提前将输入和输出设备的数据加载存储起来(预加载),在CPU计算完成之后直接将需要计算的数据交给CPU,这样CPU就不需要访问外设了,大大提高了计算机的运行效率。
• 那CPU中不是有个叫寄存器的东西吗?也可以起到临时存储的功能,为什么不直接用它呢?
○ 因为寄存器太贵了,只要是贵的东西就不会让我们广泛去使用。内存可以适配和外设之间的效率,既能够完成我们需要的功能,而且便宜,性能还不怎么差。
根据以上的冯诺依曼体系我们可以得出两个结论:
1.一般CPU不和外设直接沟通,而是直接只和内存打交道(数据层面)
2.外设只会和内存打交道(数据层面)
二、操作系统(Operator System)
2.1 操作系统的引入
我们上面所讲到的冯诺依曼体系中的各大部件可以理解为硬件,在冯诺依曼体系之上,还有一堆概念叫做软件
刚才我们有说过,因为有存储器的存在,所以可以把外设的数据预加载到内存当中,然后供CPU进行读取,但是文件中数据非常多,那此时就面临以下几个问题:
• 既然要预加载,那是要加载哪一部分数据呢?
• 预加载的时候如果内存不够了怎么办?
• CPU在执行对应的数据时,如何快速地找到你预加载的数据?
• 计算机在进行某种计算的时候,是不是把一个任务直接跑完才跑下一个,还是多个任务同时在跑?
• 数据计算完后可以将其重定向到文件当中,在特定的路径下就可以看到所写入的文件内容,可是我们怎么去快速地找到这个文件呢?
以上这些工作是无法通过硬件自己来完成的,而是要通过软件来控制数据的流动去完成
2.2 操作系统的概念
为了解决以上问题程序员们写出了一个可以解决以上问题的软件,这个最基本软件就被称为:操作系统。操作系统是系统最基本最核心的软件,属于系统软件的组成部分,用于控制和管理整个计算机的硬件和软件资源
笼统的理解,操作系统包括:
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)
2.3 操作系统的定位
在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件
首先来看看下面这张图,是一整个计算机内部的软硬件系统架构:
可以明确地看出,操作系统是位于整个系统架构的中间层,所以你可以理解它是核心所在,也就是我们常说的C位,在上面我们也有提到,对于操作系统而言,它可以对上管理软件,对下管理硬件,那么就可以它被设计出来的目的就是与硬件交互,管理所有的软硬件资源和为用户程序(应用程序)提供一个良好的执行环境了
2.4 深度理解操作系统的管理
• 我们先来想象一个场景:如果你是一个大学生,我们平常都是充当被管理的角色,那辅导员和校长谁才是我们的管理者呢?
此时我们一般都会认为:那肯定是辅导员呀!校长我都没怎么见过,怎么管的了我呢?
但是真正的管理者却是校长,只是你没有察觉而已,要理解这一点,我们要先来看看决策和执行这两个概念
决策也就是你决定是否要去做某件事情,比方说今天有一节水课,那你可以决定不去听课。但是呢若有一些课你觉得很重要,老师也讲得不错,那你会决定去听这节课
那执行呢?上面说到我们自己可以决定是否要去上这个课、或者不上,但这也只是决定,还没有行动呢!执行其实就是行动:不去上这个课的话就考虑做其他有意义的事,去上这个课的话就会需要将对应的教科书、笔记放到书包然后背着书包去教室,我们将这些对于决定之后相对应做出的行为称之为执行。
在理解这两个概念之后,我们可以发现校长才是真正的管理者,虽然在很多地方并没有看到他在执行,因为这些不是他做的,他要做的是决策。而当校长做完决策之后,辅导员就会落实这些决策,主要做的是一个执行,所以并不是真正的管理者。
所以我们从中可以看到管理者和被管理者,其实是不需要直接沟通的!
• 既然校长和学生不需要直接沟通,那他是怎么把我管理好的呢?
可以通过辅导员的一系列执行措施来收集学生数据啊,比如你是哪个学院的、哪个班的、学号是多少、上个学年的学分绩点是多少等等各种信息,当校长拿到这些信息之后就可以做出下一步的决策了。
所以我们可以发现管理的本质就是对被管理对象的数据做管理!
• 校长拿到了这么多数据,那应该如何管理呢?
校长可以将学生的基本信息(例如:姓名、年级、电话、成绩、紧急联系人)做一个封装,例如像C语言中所学的结构体或者C++中所学的类和对象封装一个学生对象,再将这些封装完后的数据联系成一个链表,那既然有了链表之后,就可以对里面的结点进行增、删、查、改等等一系列操作了。
说到这里我们可以知道,管理的本质就是:先描述,再组织。(语言帮我们完成描述的过程,数据结构帮我们完成组织的过程,只有理解了先描述再组织,才能理解管理的本质,进而去理解操作系统;换言之,想要理解操作系统,就必须得懂语言和数据结构!)
说了这么半天,继续回归我们开头所将的校长、辅导员、学生,我们便可以重新去定义一下它们之间的关系
校长【发布决策】 ⇒ 操作系统
辅导员【执行决策】 ⇒ 硬件驱动(一般每一种硬件设备都会为其配置一个驱动程序,鼠标、键盘、网卡、声卡、显卡都具备驱动程序)
学生【参与执行】 ⇒ 硬件
这样子一说各位是不是对操作系统的管理行为有了更深刻的了解了呢
那操作系统怎么知道一个硬件出问题了呢?
那肯定是通过驱动程序的报告来随时查看硬件的状态,或者驱动程序直接在驱动层直接改了某一个结点的状态,然后操作系统在遍历结点的时候发现某个结点的状态是band就知道他出现问题了
2.5 系统调用和库函数概念
操作系统可以管理好软硬件之间的分配,那我们在使用操作系统时,是否可以随意查看其内部数据甚至是做一些修改呢?
想都不用想,根本不可能,如果操作系统随意让用户调取数据,谁能保证用户可以正确的使用呢?万一系统崩溃了怎么办呢?
在开发角度,操作系统对外会表现为一个整体,但是不能完全限制用户进行数据信息的交换啊,不然还怎么提供服务呢。于是操作系统会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。 操作系统通过响应上层用户的需求,通过系统调用接口向下对驱动发起指令,当驱动程序拿到这些指令后再交给硬件去执行,最后再把执行的结果反馈回来给操作系统,操作系统再通过用户调用的系统调用将结果反馈给用户。这便是一次用户操作在体系结构中数据的相关流动和内部的响应。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以有心的开发者可以对部分系统调用进行适度封装,从而形成库(如:我们在Linux环境使用的指令,在Windows环境下进行的图像点击,在C语言中使用头文件stdio.h等等),有了库,就很有利于更上层用户或者开发者进行二次开发。设计好的库,经过系统调用的组合来给我们提供功能更丰富的库函数,通过调用库函数可以大大地提高我们的开发效率,除了库函数之外还有像框架等等,就是为了让我们更快地做出东西,不需要去了解一些底层的原理
下面是一张体系结构轮廓,可以帮助理解
本期博客就到这里啦,如有不足还请大家在评论区指正
我们下一期见~