当前位置: 首页 > news >正文

【Linux系统】—— 冯诺依曼体系结构与操作系统初理解

【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 的学习路上一起进步!

相关文章:

【Linux系统】—— 冯诺依曼体系结构与操作系统初理解

【Linux系统】—— 冯诺依曼体系结构与操作系统初理解 1 冯诺依曼体系结构1.1 基本概念理解1.2 CPU只和内存打交道1.3 为什么冯诺依曼是这种结构1.4 理解数据流动 2 操作系统2.1 什么是操作系统2.2 设计OS的目的2.3 操作系统小知识点2.4 如何理解"管理"2.5 系统调用和…...

易语言模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...

PHP旅游门票预订系统小程序源码

🌍 旅游门票预订系统:一站式畅游新体验,开启您的梦幻旅程 🌟 一款基于ThinkPHPUniapp精心雕琢的旅游门票预订系统,正翘首以待,为您揭开便捷、高效、全面的旅游预订新篇章!它超越了传统预订平台…...

侯捷 C++ 课程学习笔记:内存管理的每一层面

目录 一、C 应用程序的内存管理架构 二、C 内存原语 三、内存管理的实际应用 四、学习心得 一、C 应用程序的内存管理架构 C 应用程序的内存管理架构可以分为多个层次,从应用程序到操作系统 API,每一层都提供了不同的内存管理功能。 架构图&#xf…...

Python开发Django面试题及参考答案

目录 Django 的请求生命周期是怎样的? Django 的 MTV 架构中的各个组件分别是什么? Django 的 URL 路由是如何工作的? Django 的视图函数和视图类有什么区别? Django 的模板系统是如何渲染 HTML 的? Django 的 ORM 是如何工作的? Django 的中间件是什么?它的作用是…...

前端js进阶,ES6语法,包详细

进阶ES6 作用域的概念加深对js理解 let、const申明的变量,在花括号中会生成块作用域,而var就不会生成块作用域 作用域链本质上就是底层的变量查找机制 作用域链查找的规则是:优先查找当前作用域先把的变量,再依次逐级找父级作用域直到全局…...

【三十四周】文献阅读:DeepPose: 通过深度神经网络实现人类姿态估计

目录 摘要AbstractDeepPose: 通过深度神经网络实现人类姿态估计研究背景创新点方法论归一化网络结构级联细化流程 代码实践局限性实验结果总结 摘要 人体姿态估计旨在通过图像定位人体关节,是计算机视觉领域的核心问题之一。传统方法多基于局部检测与图模型&#x…...

将 Vue 项目打包后部署到 Spring Boot 项目中的全面指南

将 Vue 项目打包后部署到 Spring Boot 项目中的全面指南 在现代 Web 开发中,前后端分离架构已经成为主流。然而,在某些场景下,我们可能需要将前端项目(如 Vue)与后端项目(如 Spring Boot)集成部…...

Linux 权限系统和软件安装(二):深入理解 Linux 权限系统

在 Linux 的世界里,权限系统犹如一位忠诚的卫士,严密守护着系统中的文件与目录,确保只有具备相应权限的用户才能进行操作。与其他一些操作系统不同,Linux 并不依据文件后缀名来标识文件的操作权限,而是构建了一套独特且…...

计算机网络常考大题

运输层的主要功能 运输层为应用进程之间提供端到端的逻辑通信。 运输层还要对收到的报文进行差错检测。 运输层需要有两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP 传输控制协议 TCP 概述 TCP 是面向连接的运输层协议。 每一条 TCP 连接只能有两个端点…...

百度首页上线 DeepSeek 入口,免费使用

大家好,我是小悟。 百度首页正式上线了 DeepSeek 入口,这一重磅消息瞬间在技术圈掀起了惊涛骇浪,各大平台都被刷爆了屏。 百度这次可太给力了,PC 端开放仅 1 小时,就有超千万人涌入体验。这速度,简直比火…...

《跟李沐学 AI》AlexNet论文逐段精读学习心得 | PyTorch 深度学习实战

前一篇文章,使用 AlexNet 实现图片分类 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于学习 9年后重读深度学习奠基作之一:AlexNet【下】【论文精读】】的心得。 《跟李沐…...

Linux搭建Nginx直播流媒体服务RTMP/RTSP转Http-flv视频浏览器在线播放/Vue/Java/ffmpeg

参考文章: https://blog.csdn.net/whatareyouding/article/details/144317654 https://www.cnblogs.com/Gredae/p/18362900 https://www.cnblogs.com/kn-zheng/p/17422707.html https://blog.51cto.com/u_16099344/10281495 https://www.tulingxueyuan.cn/tlzx/jsp…...

Node.js高频面试题精选及参考答案

目录 什么是 Node.js?它的主要特点有哪些? Node.js 的事件驱动和非阻塞 I/O 模型是如何工作的? 为什么 Node.js 适合处理高并发场景? Node.js 与传统后端语言(如 Java、Python)相比,有哪些优势和劣势? 简述 Node.js 的运行原理,包括 V8 引擎的作用。 什么是 Nod…...

公开整理-最新中国城市统计NJExcel+PDF版本(1985-2024年)

数据简介:《中国城市统计NJ》从1985年开始,本NJ内容共分四个部分:第一部分是全国城市行政区划,列有不同区域、不同级别的城市分布情况;第二、三部分分别是地级以上城市统计资料和县级城市统计资料,具体包括人口、劳动力及土地资源、综合经济、工业、交通…...

ModuleNotFoundError: No module named ‘xgboost‘

问题: --------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) Cell In[1], line 64 import pickle5 from sklearn.metrics import mean_squared_error, r2_…...

应用层协议HTTP

应用层协议HTTP 引言 应用层协议是程序员自己制定的,但是良好的协议是保证网络通信的基础,前代的计算工程师已经帮助我们制定了一些很好用的应用层协议,http(hybertext transfer protocol)(超文本传输协议)就是其中之一。 http协议是客户端…...

常见的“锁”有哪些?

悲观锁 悲观锁认为在并发环境中,数据随时可能被其他线程修改,因此在访问数据之前会先加锁,以防止其他线程对数据进行修改。常见的悲观锁实现有: 1.互斥锁 原理:互斥锁是一种最基本的锁类型,同一时间只允…...

PAT 甲级 1091 Acute Stroke

一开始只是简单的递归&#xff08;bfs&#xff09;&#xff0c;导致最后两个没法通过&#xff08;爆栈了&#xff09; //最后两个案例没有通过&#xff0c;只是最简单的bfs暴力算法 #include<cstdio> using namespace std; int v[62][1288][130]{0}; int find(int i,int…...

flowable适配达梦数据库

文章目录 适配相关问题无法从数据库产品名称“DM DBMS”中推断数据库类型分析解决 构建ibatis SqlSessionFactory时出错&#xff1a;inStream参数为null分析解决 liquibase相关问题问题一&#xff1a;不支持的数据库 Error executing SQL call current_schema: 无法解析的成员访…...

Git入门:数据模型 to 底层原理

版本控制系统&#xff08;VCS&#xff09;是软件开发中不可或缺的工具&#xff0c;而Git作为现代版本控制的事实标准&#xff0c;其底层设计远比表面命令更加优雅。本文将从数据模型的角度&#xff0c;揭示Git的核心工作原理。 Git的核心概念 1. 快照&#xff08;Snapshot&am…...

Bootstrap Blazor UI 中 <Table> 组件 <TableColumn> 使用备忘01:EF Core 外码处理

应用场景&#xff1a;将外码转换为对应的文本进行显示、编辑。 例如&#xff0c;有一个【用户】表&#xff0c;其中有一个【用户类型ID】字段&#xff1b;另有一个【用户类型】表&#xff0c;包含【ID】、【名称】等字段。现在要求在 <Table> 组件显示列表中&#xff0c…...

Redis过期数据处理

Redis缓存过期后数据还能恢复吗&#xff1f; Redis缓存过期后&#xff0c;数据通常会被删除&#xff0c;但可以通过以下几种方法尝试恢复数据&#xff1a; 1. 数据备份恢复 RDB 持久化恢复&#xff1a;Redis 提供了 RDB&#xff08;Redis Database Backup&#xff09;持久化…...

零基础学C/C++160——字符串

题目描述 给定两个由小写字母组成的字符串A和B&#xff0c;判断B中的字符是否全部在A中出现。 输入 输入为多组测试数据。 输入数据只有一行&#xff0c;包含2个字符串A和B&#xff0c;每个字符串后面有一个#字符标记&#xff08;#不属于A或B&#xff09;&#xff0c;其中B…...

Spring Boot+Vue项目从零入手

Spring BootVue项目从零入手 一、前期准备 在搭建spring bootvue项目前&#xff0c;我们首先要准备好开发环境&#xff0c;所需相关环境和软件如下&#xff1a; 1、node.js 检测安装成功的方法&#xff1a;node -v 2、vue 检测安装成功的方法&#xff1a;vue -V 3、Visu…...

Linux 命令大全完整版(13)

5.文件管理命令 patch 功能说明&#xff1a;修补文件。语  法&#xff1a;patch [-bceEflnNRstTuvZ][-B <备份字首字符串>][-d <工作目录>][-D <标示符号>][-F <监别列数>][-g <控制数值>][-i <修补文件>][-o <输出文件>][-p &l…...

MySQL面试学习

MySQL 1.事务 事务的4大特性 事务4大特性&#xff1a;原子性、一致性、隔离性、持久性 原⼦性&#xff1a; 事务是最⼩的执⾏单位&#xff0c;不允许分割。事务的原⼦性确保动作要么全部完成&#xff0c;要么全不执行一致性&#xff1a; 执⾏事务前后&#xff0c;数据保持⼀…...

CentOS中shell脚本对多台机器执行下载安装

1.建立免密ssh连接 详情见这篇&#xff1a; CentOS建立ssh免密连接&#xff08;含流程剖析&#xff09;-CSDN博客 2.脚本编写 我这里只是简单写了个demo进行演示&#xff0c;如果服务器很多可以先暂存成文件再逐行读取host进行连接并执行命令 用node1去ssh连接node2和node…...

【Java】多线程和高并发编程(四):阻塞队列(上)基础概念、ArrayBlockingQueue

文章目录 四、阻塞队列1、基础概念1.1 生产者消费者概念1.2 JUC阻塞队列的存取方法 2、ArrayBlockingQueue2.1 ArrayBlockingQueue的基本使用2.2 生产者方法实现原理2.2.1 ArrayBlockingQueue的常见属性2.2.2 add方法实现2.2.3 offer方法实现2.2.4 offer(time,unit)方法2.2.5 p…...

C语言多人聊天室 ---chat(客户端聊天)

head.h #ifndef __HEAD_H #define __HEAD_H// 常用头文件 #include <stdio.h> #include <stdlib.h> #include <string.h>// 网络编程涉及的头文件 #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h>#include <…...

设计模式教程:命令模式(Command Pattern)

1. 什么是命令模式&#xff1f; 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式。它将请求封装成一个对象&#xff0c;从而使你能够用不同的请求、队列和日志请求以及支持可撤销操作。 简单来说&#xff0c;命令模式通过把请求封装成对象的方式解耦了…...

【华三】STP的角色选举(一文讲透)

【华三】STP的角色选举 一、引言二、STP基础概念扫盲三、根桥选举过程详解四、根端口选举过程详解五、指定端口选举过程详解六、阻塞端口七、总结与配置建议七、附录**1. BPDU字段结构图&#xff08;文字描述&#xff09;****2. 华三STP常用命令速查表** 文章总结 一、引言 在…...

Trae+Qt+MSVC环境配置

Trae Trae是字节跳动基于VSCode推出的AI集成开发环境&#xff08;IDE&#xff09;&#xff0c;是一款专为中文开发者深度定制的智能编程工具。其目标是通过AI技术实现从“Copilot”到“Autopilot”的编程模式演进。 类似这样的IDE比如Windsurf、Cursor&#xff0c;都是基于VS…...

SpringSecurity初始化的本质

一、对SpringSecurity初始化的几个疑问 通过前面第一次请求访问的分析我们明白了一个请求就来后的具体处理流程 对于一个请求到来后会通过FilterChainProxy来匹配一个对应的过滤器链来处理该请求。那么这里我们就有几个疑惑。 FilterChainProxy什么时候创建的?过滤器链和对应的…...

3D Gaussian Splatting(3DGS)的核心原理

3D Gaussian Splatting&#xff08;3DGS&#xff09;的核心原理 1. 基本概念 3D Gaussian Splatting&#xff08;3DGS&#xff09; 是一种基于 高斯分布的点云表示与渲染技术&#xff0c;核心思想是将三维场景建模为一系列 可学习的高斯分布&#xff0c;每个高斯分布具有以下…...

Transformers快速入门-学习笔记

一、自然语言处理 NLP 是借助计算机技术研究人类语言的科学自然语言处理发展史 一、不懂语法怎么理解语言 依靠语言学家人工总结文法规则 Chomsky Formal Languages 难点&#xff1a;上下文有关文法 规则增多&#xff0c;存在矛盾 二、只要看得足够多&#xff0c;就能处理语言…...

【Http和Https区别】

概念&#xff1a; 一、Http协议 HTTP&#xff08;超文本传输协议&#xff09;是一种用于传输超媒体文档&#xff08;如HTML&#xff09;的应用层协议&#xff0c;主要用于Web浏览器和服务器之间的通信。http也是客户端和服务器之间请求与响应的标准协议&#xff0c;客户端通常…...

学习路程二 LangChain基本介绍

前面简单调用了一下deepseek的方法&#xff0c;发现有一些疑问和繁琐的问题&#xff0c;需要更多的学习&#xff0c;然后比较流行的就是LangChain这个东西了。 目前大部分企业都是基于 LangChain 、qwen-Agent、lammaIndex框架进行大模型应用开发。LangChain 提供了 Chain、To…...

简识Kafka集群与RocketMQ集群的核心区别

前记&#xff1a;各位潘安、各位子健/各位彦祖、于晏&#xff0c;文字较多&#xff0c;优先看目录。 Kafka集群与RocketMQ集群的核心区别及架构图例说明 一、核心区别对比 特性Kafka 集群RocketMQ 集群设计目标高吞吐量实时日志流系统&#xff08;如日志收集、大数据流水线&a…...

基于Python+django+mysql旅游数据爬虫采集可视化分析推荐系统

2024旅游推荐系统爬虫可视化&#xff08;协同过滤算法&#xff09; 基于Pythondjangomysql旅游数据爬虫采集可视化分析推荐系统 有文档说明 部署文档 视频讲解 ✅️基于用户的协同过滤推荐算法 卖价就是标价~ 项目技术栈 Python语言、Django框架、MySQL数据库、requests网络爬虫…...

9-1. MySQL 性能分析工具的使用——last_query_cost,慢查询日志

9-1. MySQL 性能分析工具的使用——last_query_cost&#xff0c;慢查询日志 文章目录 9-1. MySQL 性能分析工具的使用——last_query_cost&#xff0c;慢查询日志1. 数据库服务器的优化步骤2. 查看系统性能参数3. 统计SQL的查询成本&#xff1a;last_query_cost4. 定位执行慢的…...

网络安全监测探针安装位置 网络安全监测系统

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 软件简介&#xff1a; SockMon(SocketMonitor)网络安全监控系统是一款为电脑专业人员打造的一款出色的安防监控软件。在如今这个恶意软件&#xff0c;攻击&#…...

Git版本控制系统---本地操作(万字详解!)

目录 git基本配置 认识工作区、暂存区、版本库 添加文件--情况一&#xff1a; 添加文件-情况二: 修改文件: 版本回退&#xff1a; git基本配置 1.初始化本地仓库&#xff0c;注意&#xff1a;一定要在一个目录下进行&#xff0c;一般都是新建一个文件夹&#xff0c;在文件…...

forge-1.21.x模组开发(二)给物品添加功能

功能效果 创建一个兑换券&#xff0c;当使用兑换券对着兑换机右键时&#xff0c;获得一条烤鱼 创建兑换券 创建ExchangeCouponsItem.java&#xff0c;继承Item&#xff0c;定义兑换券内容 public class ExchangeCouponsItem extends Item {public ExchangeCouponsItem(Prop…...

elasticsearch在windows上的配置

写在最前面&#xff1a; 上资源 第一步 解压&#xff1a; 第二步 配置两个环境变量 第三步 如果是其他资源需要将标蓝的文件中的内容加一句 xpack.security.enabled: false 不同版本的yaml文件可能配置不同&#xff0c;末尾加这个 xpack.security.enabled: true打开bin目…...

机器学习数学通关指南——拉格朗日乘子法

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一句话总结 拉格朗日乘子法…...

Matplotlib,Streamlit,Django大致介绍

Matplotlib&#xff1a;是一个用于创建各种类型的静态、动态和交互式图表的Python绘图库。可以通过pip install matplotlib命令进行安装&#xff0c;安装完成后&#xff0c;在Python脚本中使用import matplotlib语句导入即可开始使用。Streamlit&#xff1a;是一个用于快速构建…...

智慧废品回收小程序php+uniapp

废品回收小程序&#xff1a;数字化赋能环保&#xff0c;开启资源循环新时代 城市垃圾治理难题&#xff0c;废品回收小程序成破局关键 随着城市化进程加速与消费水平提升&#xff0c;我国生活垃圾总量逐年攀升&#xff0c;年均增速达5%-8%&#xff0c;其中超30%为可回收物。然…...

深搜专题2:组合问题

描述 组合问题就是从n个元素中抽出r个元素(不分顺序且r < &#xff1d; n)&#xff0c; 我们可以简单地将n个元素理解为自然数1&#xff0c;2&#xff0c;…&#xff0c;n&#xff0c;从中任取r个数。 例如n &#xff1d; 5 &#xff0c;r &#xff1d; 3 &#xff0c;所…...

Redis 如何实现消息队列?

在当今的分布式系统架构中&#xff0c;消息队列起着至关重要的作用&#xff0c;它能够帮助系统实现异步通信、解耦组件以及缓冲流量等功能。Redis&#xff0c;作为一款高性能的键值对存储数据库&#xff0c;也为我们提供了便捷的方式来构建消息队列。今天&#xff0c;咱们就深入…...