【Linux】冯诺依曼体系及操作系统

news2024/9/20 13:03:49

本期博客我们将深入学习操作系统的架构

目录

一、冯诺依曼体系结构

二、操作系统(Operator System)

2.1 操作系统的引入

2.2 操作系统的概念

2.3 操作系统的定位

2.4 深度理解操作系统的管理

2.5 系统调用和库函数概念


一、冯诺依曼体系结构

冯诺依曼体系这个名词相信大家或多或少都知道一些,我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系:

我们都知道使用计算机是为了计算数据的,那我们如何将数据交给计算机(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等等),有了库,就很有利于更上层用户或者开发者进行二次开发。设计好的库,经过系统调用的组合来给我们提供功能更丰富的库函数,通过调用库函数可以大大地提高我们的开发效率,除了库函数之外还有像框架等等,就是为了让我们更快地做出东西,不需要去了解一些底层的原理

下面是一张体系结构轮廓,可以帮助理解

 


本期博客就到这里啦,如有不足还请大家在评论区指正

我们下一期见~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

webpack5搭建react框架-配置优化

webpack5搭建react框架-配置优化 一、前言 使用webpack5已经搭建好了基础的开发环境和生产环境,但是有些功能在使用的时候还可以进一步优化,所以今天就来将之前的配置做一下最终的优化。 二、配置优化 1、设置扩展名和别名 目前的配置中我们在引入一…

Java泛型之通配符类型

1. 案例分析 class Animal {Overridepublic String toString() {return "animal";} }class Cat extends Animal {Overridepublic String toString() {return "cat";} }class Dog extends Animal {Overridepublic String toString() {return "dog&quo…

2023/4/25

今天主要重新复习了一下树的基础知识,对于树的遍历和深度的求解进行了一些训练(复习了一下写过的题) 刷了两个关于树的简单题 104. 二叉树的最大深度 难度简单1586收藏分享切换为英文接收动态反馈 给定一个二叉树,找出其最大深度…

mysql的读提交与可重复读

前景介绍 隔离级别脏读可能性不可重复读可能性幻读可能性加读锁READ UNCOMMITTEDYESYESYESNOREAD COMMITTEDNOYESYESNOREPEATABLE READNONOYESNOSERALIZABLENONONONO mysql事务 READ COMMITTED 时间事务1事务2事务3T1beginbeginbeginT2update wx_va set value “TT1” wher…

数据库基础篇 《13.约束》

1. 约束(constraint)概述 1.1 为什么需要约束 数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成…

Windows10下安装Ubuntu22.04(打造双系统)步骤 + 安装Nvidia显卡驱动

文章目录 下载Ubuntu22.04制作Ubuntu安装盘对硬盘分区查看磁盘分区形式 安装Ubuntu关于无法定位软件包错误安装显卡驱动 训练神经网络常用Lunix系统,这里使用Ubuntu22.04。 记录一下Windows10Ubuntu双系统安装方法。 下载Ubuntu22.04 下载链接:Ubuntu …

【Linux】一文读懂HTTP协议:从原理到应用

​🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录 👉HTTP协议…

如何提高项目估算精准度 关键有3方面

软件规模可以用多种方式进行估算,但是用功能点估算方式更准确,而自动估算让估算更快速,我们以CoCode需求分析工具为例来说明,如何提高项目估算精准度? 一、调整功能点数 要提高项目估算精准度,首先应该提高…

Pytorch 入门资源(一) annaconda3下安装pytorch2.0.0和python3.11,使用Pycharm编辑器环境配置

一、环境安装 用annaconda3-2023.03-windows_x86_64,安装上python3.11和pytorch2.0.0环境。 下载pycharm community版本,将pycharm环境选择到pytorch,就可以开始上手Pytorch了。 指路几个安装博客: 【ok】Anaconda3的安装配置…

springcloud的项目使用一个tomcat部署

背景 我们项目使用springcloud、redis(缓存)、rocketMQ(消息中间件)、tinyid(分布式id)、minio(文件存储)、nacos(配置注册中心)这些组件开发了一个mes系统&…

YOLOv7+单目实现三维跟踪(python)

YOLOv7单目跟踪 1. 目标跟踪2. 测距模块2.1 设置测距模块2.2 添加测距 3. 主代码4. 实验效果 相关链接 1. YOLOv5单目测距(python) 2. YOLOv7单目测距(python) 3. YOLOv5单目跟踪(python) 4. 具体效果已在B…

中期国际:值得信赖的外汇MT4开户平台应该具备那些特点

在外汇市场中,有许多外汇平台供投资者选择。然而,由于市场存在许多复杂因素,选择平台时必须谨慎。投资者必须选择具有可靠资质的正规外汇MT4开户平台,以提高投资的安全性。选择外汇MT4开户平台非常重要,因此&#xff0…

LVS负载均衡群集—NAT

目录 一、群集的概述1、群集的含义2、出现高并发的解决方法3、群集的三种分类3.1负载均衡群集3.2高可用群集3.3高性能运算群集 4、负载均衡的结构 三、LVS调度器用的调度方法四、LVS的工作模式及其工作过程1.NAT模式(VS-NAT)2.直接路由模式(V…

springboot整合juit和springboot整合mybatis

springboot整合juit 先看一眼包路径,发现main程序的路径和测试类的路径是一样的 启用新注解:SpringBootTest代替了之前sm整合juit时的 RunWith(SpringJUnit4ClassRunner.class) //spring配置类 ContextConfiguration(classes config.class)新的如此…

protoc 插件-protoc-gen-grpc-gateway-gosdk

👇我在这儿 基本介绍 protoc-gen-grpc-gateway-gosdk 是一个 protoc 插件, 能根据 proto 文件一键生成 go http sdk 客户端代码,通过借助 grpc-gateway 插件将 grpc 接口转化为 http 的方式, 进而可以通过本插件生成 http sdk 代码。 特性 1.一键自动生…

springboot整合cache+redis

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、cache是什么?二、使用步骤1.使用方式1.引入依赖2.搭建项目依赖问题application.ymlTestControllerTestServiceTestServiceImplUserMapperMyRedi…

使用vue.component全局注册组件、props的使用

通过components注册的是私有子组件 例如: 在组件A的 components 节点下,注册了组件F。 则组件F只能用在组件A中;不能被用在组件C中。 注册全局组件 在vue项目的 main.js 入口文件中,通过 Vue.component() 方法,可以注册全局组件…

数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)

目录 基本介绍 平衡因子 平衡二叉树 平衡二叉树的高度 基本介绍 什么是平衡二叉树? 以一个例子来解释一下: 搜索树结点按不同的插入次序,将会导致不同的深度和平均查找长度ASL 在二叉搜索树中查找一个元素: &#xff08…

TCP 协议的低效实现

包括 Linux kernel 在内的各种 TCP 实现均使用类似 skb 的对象管理一个个 packet,使 TCP 失去了 “流” 特征。应用通过 syscall 每写入一批数据,协议栈都可能生成一个 skb: ​ 仅管理这些 skb 就是一笔大开销。除了 skb 数据结构本身的 cru…

Python小姿势 - import requests

import requests Python中使用requests模块发送POST请求 在使用Python进行开发时,经常会遇到需要向某个网址发送POST请求的情况。这时候就需要使用到requests模块了。 requests模块是Python的一个标准模块,可以直接使用pip安装。 安装完成后,…