Linux:冯·诺依曼结构 OS管理机制

Linux:冯·诺依曼结构 & OS管理机制

    • 冯·诺依曼结构
    • OS管理机制
      • OS对下层硬件的管理
      • OS对上层用户的服务


冯·诺依曼结构

我们常见的计算机,比如笔记本,台式电脑。以及一下不常见的计算机,比如服务器,几乎都遵循冯诺依曼体系结构。冯诺依曼体系结构可以说是计算机的灵魂,如果没有这个结构的提出,计算机就不可能走向百姓,以低成本完成高速的运算。接下来,我就为大家讲解这个结构的设计理念。

常见的冯诺依曼体系结构图如下:

在这里插入图片描述
我们认识的计算机,都是由一个个硬件组成的,按照以上图片,我们可以分为以下区域:

  • 输入设备:包括键盘,鼠标等
  • 输出设备:显示器,打印机,网卡,显卡等
  • 中央处理器CPU:计算机完成运算的核心部件,包括运算器控制器
  • 存储器

对于存储器,我这里要特地说明:

存储器就是内存
虽然计算机绝大部分数据存储在硬盘中,但是硬盘不是存储器,硬盘是输入输出设备,比如从硬盘读取数据,以及把数据写入硬盘

如果我们只考虑数据的流动,我们可以得到以下逻辑关系:

在这里插入图片描述

以上关系中,我们可以提炼出两点:

  1. 所有外设,即输入输出设备,都只能和内存交换数据
  2. CPU只能和内存交换数据

可见,内存在计算机中起到了核心枢纽的作用,那么为什么要这么做呢?为什么不直接让输入设备和CPU交换数据,CPU把计算好的数据直接输出给输出设备,这样不是更快吗???

就像这样:
在这里插入图片描述
在这个没有内存的计算机结构中,我们有输入设备输出设备CPU,其中CPU起到计算功能,用于处理计算机的数据。CPU具有极高的运算效率,但是输入输出设备的读取速度是很慢的,因此很多数据刚被读取到CPU中,就立马被计算完了,因此CPU会长期处于闲置状态,这对CPU的计算资源造成了大量浪费。因此我们要想办法提高CPU得到数据的速度,也就是输入输出设备的数据交换的速度。

但是如果想要提高输入输出设备的效率,那么就要用更好的材料和技术来制作这些设备,如果计算机中所有输入输出设备的材料以及技术都达到了CPU级别,那么确实可以让计算机的计算效率不被数据的读取速度影响,但是这将面临计算机成本大幅度提高的问题,有的人工作一辈子也买不起一台计算机。

因此冯诺依曼提出了用内存作为一个中间枢纽的想法:
在这里插入图片描述

内存的读取效率介于输入输出设备CPU之间,因此CPU读取数据的速度,就和内存输出数据的效率差不多了,只要内存的速度越接近CPU,那么CPU的利用率也就越高。

但是这个结构依然有问题,那就是:内存的读取速度又会受到输入输出设备的影响,内存想要从输入设备读取数据,最后的数据传输速度不取决于内存,而取决于输入设备。最后整个计算机的数据传输效率,还不是取决于输入输出设备的传输效率?

理论上来说,确实是这样的,就好像一个木桶,这个木桶能装多少水,不取决于最长的那一块板子,而取决于最短的那一块板子。

在这里插入图片描述

其实,冯诺依曼体系结构中,输入设备向内存输入数据,不是说CPU现在要计算啥,内存就从输入设备提取啥。内存会提前预知CPU要使用的数据,从而预先把它加载到内存中,这样一来,最后整个计算机的计算效率,就取决于内存的数据传输效率了。至于内存是如何预知CPU需要计算的数据,这是操作系统OS的工作了。

通过这样一个冯诺依曼体系结构,我们计算机的计算效率就主要取决于内存CPU了,因此电脑厂家只需要把内存CPU的性能提上来,整个计算机的效率也就上来了。其余的部件,都可以用低廉的材料制作,整个计算机的成本降下来的同时,效率还提高了。因此计算机得以走进普通百姓的家中。


OS管理机制

刚刚我们讲明白了计算机的硬件架构,现在我再来讲一讲计算机的软件架构。计算机中,最重要的软件就是操作系统OS在整个计算机的软硬件架构中,OS的定位是一个管理一切软硬件资源的管理者 

整个计算机的体系结构如下:
在这里插入图片描述

OS对下层硬件的管理

最后三层依次是:OS驱动底层硬件

那么操作系统是如何管理硬件的呢?我先来为大家举一个现实生活中的管理案例。

在大学中你很可能都没有见过你的校长,院长等管理层大人物。但是学校可以知道你有没有挂科,你能不能评奖学金等等。那么这些管理层人员,明明都没有见过你本人,是如何管理你这个学生的呢?

他们在管理你的时候,手中会有你的众多数据,比如:入学年份,年龄,招生方式,各科成绩等等。一旦管理层手中有你的数据了,他们就可以根据你的考试成绩来决定你能不能正常毕业;根据你的各项指标,来决定你能不能评奖学金等等。

这个过程中可以发现,管理的本质不在于对你本人做管理,而在于对你的信息做管理。管理者的核心工作,就是根据你的数据来做决策

操作系统亦然,操作系统想要管理硬件设备,它管理的并不是硬件本身,而是这个硬件的数据。那么下一个问题就来了,操作系统如何得到硬件的信息???

这就涉及到了驱动的工作:

每一个硬件设备,都会有自己的驱动程序,驱动程序内部有众多关于硬件的信息,操作系统通过管理驱动来管理硬件

有的人会发现,当你买了一个新的鼠标,新的键盘,第一次插到电脑上,它都要等待一小会才能使用。而且电脑有可能还会在屏幕上显示驱动程序安装成功这样的提示语句。

其实,每一个硬件在制作的时候,厂家都会在其内部写好一个驱动程序,一旦这个硬件接入到计算机,那么驱动程序就会被操作系统得到,从而进行管理。因此第一次使用一个新的鼠标,键盘的时候,之所以要等一下才能用,就是因为驱动程序还在安装,没有驱动程序,操作系统就无法管理硬件,自然也就无法使用硬件了。

再比如说,有一些硬件,当你接入到计算机后,其可能会提示你:这个设备与计算机不兼容,计算机怎么知道这个设备和计算机不兼容的?这就是因为接入的时候,操作系统得到了硬件的驱动程序,从驱动程序中检测到了这个设备的信息,从而判断出这个设备与计算机不兼容。

至此,我们就已经讲解完了操作系统是如何管理硬件的,以及是如何得到硬件的信息的。那么我们再来看到一个问题:当我们有众多硬件接入到计算机,操作系统是如何对这些硬件批量管理的?

在讲解这个问题之前,我要提出学习操作系统的六字真言,一切操作系统的管理行为,都遵顼以下六字:

先描述,再组织 \mathbf{{\color{Red} {\huge 先描述,再组织} } } 先描述,再组织

比如说,操作系统想要管理一个鼠标,于是得到鼠标信息后创建了一个结构体,存储鼠标的各项信息:

struct device
{int type;char* name;//...
}

比如以上结构体就存储了鼠标的名字,类型等信息。于是操作系统通过管理这个结构体来管理这个鼠标。同样的,键盘,显示器,打印机等等设备,在操作系统中都会有自己的结构体,这个结构体描述了硬件的各种信息,这个过程就叫做描述

那么操作系统要如何管理这么多结构体?其只需要通过数据结构把这些结构体组织起来即可,比如把这些结构体放到一个链表中,放到数组中,等等。于是操作系通过管理这个链表来管理这一堆结构体,比如说一个鼠标的USB接口被拔掉了,于是操作系统在这个包含了众多结构体的链表中,遍历查找“鼠标”的结构体,然后把这个结构体中描述状态的那个成员,从开启改为关闭。这个把描述硬件的结构体用数据结构连接起来统一管理的过程,就是组织

至此,我们就以及讲完了操作系统是如何管理硬件的,汇总如下:

  1. 操作系统通过驱动程序来获得硬件的信息,管理硬件
  2. 操作系统在管理众多硬件的时候,采用先描述,在组织的思想,把描述各个硬件的结构体用数据结构组织起来统一管理

OS对上层用户的服务

操作系统管理好硬件,是一种手段,而这个手段的最终目的,是为了给上层提供安全可靠的服务

我特意标红了四个字:安全可靠,那么操作系统又是如何保证自己提供的服务是安全可靠的?我们再看到一开始的计算机体系层次图:

在这里插入图片描述

从操作系统向上,依次是系统调用接口用户操作接口用户

请问:==用户可以直接访问操作系统的底层吗?==就拿我们刚刚的例子来说,我们知道每个硬件都有自己的结构体来描述自己,操作系统可以管理这些结构体。那么这些结构体可以直接交给用户管理吗?

很显然,这是很危险的,如果某个用户拿到了一个描述鼠标的结构体,原本这个鼠标是罗技公司生产的,用户直接修改这个结构体里面对厂商的描述,把它修改为了苹果公司生产的鼠标,这可就乱套了。因此操作系统不能把底层直接展示给用户,不然是非常危险的

但是操作系统又要为用户提供服务,于是操作系统给出了很多系统调用接口,也就是操作系统向上一层。

为了保护操作系统内部的数据,用户只能通过系统调用接口来访问计算机

最开始我们就说过,操作系统要为上层提供安全可靠的服务,而操作系统就是通过隐藏自己的底层,让用户通过系统调用接口来保护自己的数据,进而保证安全的。

系统调用接口再往上就是用户操作接口了,不妨想想,不论你是学习pythonc语言C++,你有直接操作过硬件吗??

其实是有的,比如说pythonprint函数,C++coutC语言printf函数。这些方法,我们都可以向屏幕输出字符,但是屏幕是一个硬件,想要向硬件输出,就一定要经过操作系统这一层。但是我刚刚说过,用户想要访问操作系统,只能通过系统调用接口。这么一说,难道各个语言的输入输出函数,都叫做系统调用接口吗???

这是否定的,其实语言层面的输入输出函数,本质上是对系统调用接口的再封装。现在市面上的操作系统五花八门,比如AndroidiOSWindowsLinux等等,这些操作系统向上层提供的系统调用接口都是不一样的,但是我们的计算机语言,既可以在Windows中运行,也可以在Linux中运行。

用户操作接口中,我列举了三个例子:shell外壳lib部分指令

对于C语言来说,printf这个函数就是一个用户操作接口,并且它属于lib,即库的范畴。在printf内部,一定封装了真正的系统调用接口,用户调用printf函数,而在printf函数内部再去调用系统调用接口来访问屏幕这个硬件,进而在屏幕上输出。

为什么要再封装一层用户操作接口呢?

  1.  用户操作接口以更加简单的方式向用户提供了服务,比如printf函数。用户无需学会复杂的系统调用接口,只需要使用用户操作接口就可以操控硬件。当然,有能力的人也可以直接调用系统操作接口
  2.  用户操作接口提供了跨平台能力,不论是Linux还是Windows等各种操作系统,都可以使用C语言C++这样的语言来访问,但是这些操作系统的系统调用接口很可能不一样,因此相同的printf函数在LinuxWindows中封装了不同的系统调用接口,从而使得一个用户操作接口层面的接口,可以在各种在操作系统中使用,这就是用户操作接口的跨平台能力。

当然,用户操作接口还要shell指令等等,比如说在Linux中使用ls指令,就会在屏幕上显示当前目录下的文件夹,这涉及一个向屏幕显示的操作,因此ls指令内部应该也封装了系统调用接口

再往上就是用户了,通过下层以操作系统为核心的软硬件体系架构,用户现在就可以方便快捷,又安全的形式来使用计算机。

至此,我就已经讲解完了计算机的软硬件体系大框架。

我再为大家回顾一下:

  • 底层硬件:遵顼冯诺依曼体系结构,通过内存为枢纽的数据交换,实现了降本增效,使得计算机走入百姓家中
  • 驱动程序:操作系统管理硬件的重要手段,操作系统通过驱动程序获取硬件的信息,进而实行管理
  • 操作系统:计算机体系中的管理者,管理各种软硬件资源,遵循先描述,再组织的重要思想,使得操作系统可以批量管理众多软硬件
  • 系统调用接口:为了保证操作系统提供的服务是安全可靠的,通过系统调用接口来帮助用户访问计算机,同时保护了操作系统内部的数据
  • 用户操作接口:直接通过系统调用接口访问计算机会比较麻烦,于是通过用户操作接口以更加便捷的方式提供服务,并且提供了跨平台的特性,使得计算机的访问方便快捷

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/295279.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何理解Java注解反射

Java 8 中文版 - 在线API手册 - 码工具 什么是注解 ◆Annotation是从JDK5.0开始引入的新技术 ◆Annotation的作用: 不是程序本身,可以对程序作出解释.(这一点和注释(comment)没什么区别) 可以被其他程序(比如:编译器等)读取 Annotation的格式: > 注解是以&quo…

redis 的StringRedisTemplate

6.3 StringRedisTemplate 尽管JSON的序列化方式可以满足我们的需求,但依然存在一些问题,如图: 为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存…

ES8 学习 -- async 和 await / 对象方法扩展 / 字符串填充

文章目录 1. async 和 await1.1 基本语法1.2 使用示例1.3 案例练习 2. 对象方法扩展2.1 Object.values(obj)2.2 Object.entries(obj)2.3 Object.getOwnPropertyDescriptors(obj)使用示例 3. 字符串填充4. 函数参数的末尾加逗号 1. async 和 await async 函数,使得异…

JavaScript 设计模式之代理模式

代理模式&#xff0c;代理&#xff08;proxy&#xff09;是一个对象&#xff0c;它可以用来控制对另一个对象的访问。 现在页面上有一个香港回归最想听的金典曲目列表&#xff1a; <ul id"container"><li>我的中国心</li><li>东方之珠<…

Photoshop 2024 Mac/win---图像处理的新纪元,解锁无限创意

Photoshop 2024是一款功能强大的图像处理软件&#xff0c;以其卓越的性能和广泛的应用领域&#xff0c;赢得了设计师、摄影师、图形艺术家等各类创意工作者的青睐。它提供了丰富的绘画和编辑工具&#xff0c;让用户能够轻松进行图片编辑、合成、校色、抠图等操作&#xff0c;实…

Redis缓存设计与性能优化【缓存和数据库不一致问题,解决方案:1.加过期时间这样可以一段时间后自动刷新 2.分布式的读写锁】

Redis缓存设计与性能优化 缓存与数据库双写不一致 缓存与数据库双写不一致 在大并发下&#xff0c;同时操作数据库与缓存会存在数据不一致性问题 1、双写不一致情况 2、读写并发不一致 解决方案&#xff1a; 1、对于并发几率很小的数据(如个人维度的订单数据、用户数据等)&a…

LabelConvert: 目标检测和图像分割数据集格式转换工具

LabelConvert LabelConvert是一个目标检测和图像分割的数据集格式转换工具&#xff0c;支持labelme、labelImg与YOLO、VOC和COCO 数据集格式之间的相互转换。 支持的转换格式 安装 pip install label_convert具体使用方法 由于文章篇幅所限&#xff0c;请移步LabelConvert官…

算法学习——LeetCode力扣动态规划篇8(300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组、1143. 最长公共子序列)

算法学习——LeetCode力扣动态规划篇8 300. 最长递增子序列 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删…

Flutter开发之图片选择器

使用FLutter开发了一个图片选择的组件&#xff0c;功能如下&#xff1a; 1、支持设置最大可选图片的个数&#xff1b; 2、根据选择的图片个数自适应容器组件的高度&#xff1b; 3、可设置容器的最大高度&#xff1b; 4、支持点击放大和删除功能&#xff1b; 具体效果如下 …

Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…

漂亮哇塞的可视化大屏页面该如何设计?

要提升可视化界面的设计美观度&#xff0c;可以从以下几个方面入手&#xff1a; 使用高质量的图片和素材&#xff1a;使用高质量的图片和素材可以让界面更加美观。可以选择高清晰度的图片和素材&#xff0c;使得整个界面的质感更加高端。突出重点&#xff1a;在界面设计中&…

《QT实用小工具·八》数据库通用翻页类

1、概述 源码放在文章末尾 该项目实现数据库通用翻页类&#xff0c;主要包含如下功能&#xff1a; 1:自动按照设定的每页多少行数据分页 2:只需要传入表名/字段集合/每页行数/翻页指示按钮/文字指示标签 3:提供公共静态方法绑定字段数据到下拉框 4:建议条件字段用数字类型的主…

debian的使用笔记

1. XP风格任务栏 安装 debian-live-12.5.0-amd64-xfce.iso 后&#xff0c;把下面的任务栏删除&#xff0c;把上面的任务栏移到下面&#xff0c;然后设置如下选项 2. 命令自动补全 sudo apt install bash-completion 3. 找不到命令 sudo apt install command-not-found sudo…

RISC-V GNU Toolchain 工具链安装问题解决(含 stdio.h 问题解决)

我的安装过程主要参照 riscv-collab/riscv-gnu-toolchain 的官方 Readme 和这位佬的博客&#xff1a;RSIC-V工具链介绍及其安装教程 - 风正豪 &#xff08;大佬的博客写的非常详细&#xff0c;唯一不足就是 sudo make linux -jxx 是全部小写。&#xff09; 工具链前前后后我装了…

论文阅读RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection

文章目录 RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection问题笛卡尔坐标结构图Meta-Kernel Convolution RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection 论文&#xff1a;https://arxiv.org/pdf/2103.10039.pdf 代码&…

栈溢出攻击的软硬件缓解技术

为了防范栈溢出攻击&#xff0c;现代处理器架构&#xff08;如Arm架构&#xff09;具有执行权限。在Armv8-A中&#xff0c;主要的控制是在MMU地址转换表&#xff08;translation tables&#xff09;中的执行权限位。 UXN User (EL0) Execute-never …

SpringBoot+thymeleaf完成视频记忆播放功能

一、背景 1)客户要做一个视频播放功能,要求是系统能够记录观看人员在看视频时能够记录看到了哪个位置,在下次观看视频的时候能够从该位置进行播放。 2)同时,也要能够记录是谁看了视频,看了百分之多少。 说明:由于时间关系和篇幅原因,我们这里只先讨论第一个要求,第…

基于WEB的花卉养殖知识平台的设计与实现|SSM+ Mysql+Java(可运行源码+数据库+LW)植物绿植种植,留言管理,知识科普,新闻数据

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

Android Studio学习5——布局layout与视图view

wrap_content&#xff0c;内容有多大&#xff0c;就有多宽&#xff08;包裹&#xff09; 布局 padding 边框与它自身的内容 margin 控件与控件之间

docker容器环境安装记录(MAC M1)(完善中)

0、背景 在MAC M1中搭建商城项目环境时&#xff0c;采用docker统一管理开发工具&#xff0c;期间碰到了许多环境安装问题&#xff0c;做个总结。 1、安装redis 在宿主机新建redis.conf文件运行创建容器命令&#xff0c;进行容器创建、端口映射、文件挂载、以指定配置文件启动…