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

OpenStack开源虚拟化平台(一)

目录

    • 一、OpenStack背景介绍
      • (一)OpenStack是什么
      • (二)OpenStack的主要服务
    • 二、计算服务Nova
      • (一)Nova组件介绍
      • (二)Libvirt简介
      • (三)Nova中的RabbitMQ解析


  OpenStack既是一个社区,也是一个项目和一个开源软件,提供了一个部署云的操作平台或工具集。用OpenStack易于构建虚拟计算或存储服务的云,既可以为公有云、私有云,也可以为大云、小云提供可扩展、灵活的云计算。

在这里插入图片描述

一、OpenStack背景介绍

在这里插入图片描述

(一)OpenStack是什么

在这里插入图片描述
  OpenStack是一个管理计算、存储和网络资源的数据中心云计算开放平台,通过一个仪表板,为管理员提供了所有的管理控制,同时通过Web界面为其用户提供资源。

在这里插入图片描述

(二)OpenStack的主要服务

  OpenStack有三个主要的服务成员:计算服务(Nova)、存储服务(Swift)、镜像服务(Glance)。

在这里插入图片描述
1. 计算服务Nova

  Nova是OpenStack云计算架构的控制器,支持OpenStack云内的实例的生命周期所需的所有活动由Nova处理。Nova作为管理平台管理着OpenStack云里的计算资源、网络、授权和扩展需求。但是,Nova不能提供本身的虚拟化功能,相反,它使用Libvint的API来支持虚拟机管理程序交互。Nova通过Web服务接口开放所有功能并兼容亚马逊Web服务的EC2接口。

2. 对象存储服务Swift

  Swift提供的对象存储服务,允许对文件进行存储或者检索(但不通过挂载文件服务器上目录的方式来实现)。对于大部分用户来说,Swift不是必需的,只有存储数量达到一定级别,而且是非结构化数据才有这样的需求。Swift为OpenStack提供了分布式的、最终一致的虚拟对象存储。和亚马逊的Web服务–简单存储服务(S3)类似,通过分布式的存储节点,Swift 有能力存储数士亿计的对象,Swift具有内置冗余、容错管理、存档、流媒体的功能。Swift是高度扩展的。

3. 镜像服务Glance

  它提供了一个虚拟磁盘镜像的目录和存储仓库,可以提供对虚拟机镜像的存储和检索。 这些磁盘镜像广泛应用于Nova组件之中。Glance能进行多个数据中心的镜像管理和租户私有镜像管理。虽然这种服务在技术上是属于可选的,但任何规模的云都可能对该服务有需求。目前Glance的镜像存储,支持本地存储、NFS、Swift、sheepdog和Ceph。OpenStack镜像服务查找和检索虚拟机的镜像系统,它可以被配置为使用以下3个存储后端的任何一个:
(1)OpenStack对象存储到存储镜像。
(2)S3存储直连。
(3)S3存储结合对象存储成为中间级的S3访问。

4. 身份认证服务keystone

  它为OpenStack上的所有服务提供身份验证和授权。它还提供了在特定OpenStack云服务上运行的服务的一个目录。任何系统中,身份认证和授权其实都比较复杂,尤其是Openstack那么庞大的项目,每个组件都需要使用统一认证和授权。

5. 网络管理服务Quantum

  在接口设备之间提供“网络连接即服务”的服务,而这些接口设备主要是由Open Stack的其他服务(如Nova)进行管理的。该服务允许用户创建自己的网络,然后添加网络接口设备。Quantum提供了一个可插拔的体系架构,使其能够支持很多流行的网络供应商和新的网络技术。Quantum后端可以是商业产品或者开源。开源产品支持Openvswitch和Linux bridge。网络设备厂商都在积极参与,让他们的产品支持Quantum,目前思科、锐捷已经实现支持。

6. 存储管理服务Cinder

  Cinder存储管理主要是指虚拟机的存储管理,Swift主要是对象存储管理。目前支持开源和商业化产品sheepdog、Ceph等。
  对于企业来说,使用分布式作为虚拟机的存储,并不能真正节省成本,维护一套分布式存储,成本还是很高的。目前虚拟机的各种高可用、备份的问题,其实都可以把问题交给商业存储厂商来解决。

7. 仪表盘Horizon

  严格意义来说,Horizon不会为OpenStack增加一个功能,更多的是一个演示。对于很多用户来说,了解Open Stack基本都是从Horizon、 dashboard开始。从这个角度来看,它在OpenStack各个项目里显得非常重要。

二、计算服务Nova

  Nova是OpenStack云中的计算组织控制器。Nova处理OpenStack云中实例(instances)生命周期的所有活动。这样使得Nova成为一个负责管理计算资源、网络、认证、所需可扩展性的平台。
  但是,Nova并不具有虚拟化能力,相反它使用Libvirt API来与被支持的Hypervisors交互。Nova通过一个与Amazon Web Services(AWS)EC2 API兼容的Web Services API来对外提供服务。

(一)Nova组件介绍

1. API Server(Nova-Api)

  API Server对外提供一个与云基础设施交互的接口,也是外部可用于管理基础设施的唯一组件。

2. Message Queue(Rabbit MQ Server)

  OpenStack节点之间通过消息队列使用AMQP(Advanced Message Queue Protocol)完成通信。

3. Compute Worker(Nova-Compute)

  Compute Worker管理实例生命周期,通过Message Queue接收实例生命周期管理的请求,并承担操作工作。

4. Network Controller(Nova-Network)

  Network Controller处理主机的网络配置,包括IP地址分配、为项目配置VLAN、实现安全组、配置计算节点网络。

5. Volume Workers(Nova-Volume)

  Volume Workers用来管理基于LVM(Logical Volume Manager)的实例卷。Volume Workers有卷的相关功能,例如新建卷、删除卷、为实例附加卷、为实例分离卷。

6. Scheduler(Nova-Scheduler)

  调度器Scheduler把Nova-API调用映射为OpenStack组件。调度器作为一个Nova-Schedule守护进程运行,通过恰当的调度算法从可用资源池获得一个计算服务。当前Nova-Schedule实现了一些基本的调度算法:随机算法、可用域算法和简单算法。

(二)Libvirt简介

  Nova通过独立的软件管理模块实现XenServer、Hyper-V和VMWare ESX的调用与管理。同时对于其他的Hypervisor,如KVM、LXC、QEMU、UML和Xen则通过Libvirt标准接口统一实现。为了更好地理解在Nova环境下Libvirt如何管理底层的Hypervisor,先要基本了解Libvirt的体系架构与实现方法。

1. 什么是Libvirt

  虚拟云实现的三部曲:虚拟化技术实现→虚拟机管理→集群资源管理(云管理)。各种不同的虚拟化技术都提供了基本的管理工具,比如启动、停用、配置、连接控制台等。这样在构建云管理的时候就存在两个问题。
(1)如果采用混合虚拟技术,上层就需要对不同的虚拟化技术调用不同管理工具,很是麻烦。
(2)可能有新的虚拟化技术更加符合现在的应用场景,需要迁移过去。这样管理平台就需要大幅改动。
  Libvirt的主要目标是为各种虚拟化工具提供一套方便、可靠的编程接口,用一种单一的方式管理多种不同的虚拟化提供方式。

2. Libvirt主要支持的功能

(1)虚拟机管理:包括不同的领域生命周期操作,支持多种设备类型的热插拔操作。
(2)远程机器支持:只要机器上运行了Libvirt Daemon,所有的Libvirt功能就都可以访问和使用。
(3)存储管理:任何运行了Libvirt Daemon的主机都可以用来管理不同类型的存储,创建不同格式的文件镜像。
(4)网络接口管理:任何运行了Libvirt Daemon的主机都可以用来管理物理和逻辑的网络接口。
(5)虚拟NAT和基于路由的网络:任何运行了Libvirt Daemon的主机都可以用来管理和创建虚拟网络。

3. Libvirt体系结构

没有使用Libvirt的虚拟机管理方式:

在这里插入图片描述
Libvirt API与相关驱动程序的层次结构:

在这里插入图片描述
Libvirt的控制方式有以下两种。
(1)管理位于同一节点上的应用程序和域。管理应用程序通过Libvirt工作,以控制本地域。

在这里插入图片描述
(2)管理位于不同节点上的应用程序和域。该管理应用程序通过一种通用协议从本地Llibvirt连接到远程Libvirt。

在这里插入图片描述

(三)Nova中的RabbitMQ解析

在这里插入图片描述
1. RabbitMQ

在这里插入图片描述
  RabbitMQ是一种处理消息验证、消息转换和消息路由的架构模式,它协调应用程序之间的信息通信,并使得应用程序或者软件模块之间的相互意识最小化,有效实现解耦。
  RabbitMQ适合部署在一个拓扑灵活易扩展的规模化系统环境中,有效保证不同模块、不同节点、不同进程之间消息通信的时效性;RabbitMQ特有的集群HA安全保障能力可以实现信息枢纽中心的系统级备份,同时单节点具备消息恢复能力。

在这里插入图片描述
2. AMQP

  • AMQP是应用层协议的一个开放标准,为面向消息的中间件而设计
  • RabbitMQ是AMQP协议的一个开源实现
  • OpenStack Nova各软件模块通过AMQP协议实现信息通信
  • AMQP协议的设计理念可归纳为基于状态的面向无连接通信系统模式
  • 对于AMQP来讲,消息队列的状态信息决定通信系统的转发路径
  • IP数据包根据路由表实现报文的本地存储与逐级转发

在这里插入图片描述
  “消息”是AMQP实现通信的基本因素,交换器和队列是AMQP的核心要素。
  交换器(Exchange):交换器由消费者应用程序创建,并且可与其他应用程序实现共享服务。接收消息之后通过路由表将消息准确且安全地转发至相应的消息队列。每个交换器通过唯一的Exchange ID进行识别。交换器主要分为三种:
(1)持久交换器:持久交换器并不会因为系统重启或者应用程序终止而消除
(2)临时交换器:驻留在内存中,随着系统的关闭而消失
(3)自动删除交换器:随着宿主应用程序的中止而自动消亡
  队列(Queue):主要用于实现存储与转发交换器发送来的消息,队列同时也具备灵活的生命周期属性配置,可实现队列的持久保存、临时驻留与自动删除。
  消息、队列和交换器是构成AMQP的三个关键组件,任何一个组件的失效都会导致信息通信的中断,因此鉴于三个关键组件的重要性,系统在创建三个组件的同时会打上“Durable”标签,表明在系统重启之后立即恢复业务功能。

  构成AMQP的三个关键要素的工作方式如图所示。

在这里插入图片描述
  三种不同类型的交换器:广播式交换器(Fanout Exchange)、直接式交换器(Direct Exchange)和主题式交换器(Topic Exchange)。

3. Nova中的RabbitMQ应用

在这里插入图片描述
  目前Nova中的各个模块通过RabbitMQ服务器以RPC(远程过程调用)的方式实现通信,而且各模块之间形成松耦合关联关系,在扩展性、安全性以及性能方面均体现优势。以下是三个比较重要的概念。
(1)交换器
  接受消息并且将消息转发给队列。应用程序在它的权限范围之内可以创建、删除、使用和共享交换器实例。交换器可以是持久的、临时的或者自动删除的。
(2)队列
  “消息队列”,它是一个具名缓冲区,它代表一组消费者应用程序保存消息。这些应用程序在它们的权限范围内可以创建、使用、共享消息队列。
(3)绑定
  可以理解为交换器和消息队列之间的一种关系,绑定之后交换器会知道应该把消息发给哪个队列,绑定的关键字称为binding_key。

下面介绍一下RabbitMQ的三种类型的交换器。

1)广播式交换器类型(fanout)

  该类交换器不分析所接收到消息中的Routing Key,默认将消息转发到所有与该交换器绑定的队列中去。广播式交换器转发效率最高,但是安全性较低,消费者应用程序可获取本不属于自己的消息。
  广播交换器是最简单的一种类型,就像我们从字面上理解到的一样,它把所有接收到的消息广播到所有它所知道的队列中去,不论消息的关键字是什么,消息都会被路由到和该交换器绑定的队列中去。

在这里插入图片描述
  在程序中申明一个广播式交换器的代码如下:

channel.exchange_declare(exchange='fanout',type='fanout')

2)直接式交换器类型(direct)

  直接式交换器的转发效率较高,安全性较好,但是缺乏灵活性,系统配置量较大。相对广播交换器来说,直接交换器可以给我们带来更多的灵活性。
  直接交换器的路由算法很简单:一个消息的routing_key完全匹配一个队列的binding_key,就将这个消息路由到该队列。绑定的关键字将队列和交换器绑定到一起。当消息的routing_key和多个绑定关键字匹配时消息可能会被发送到多个队列中。

在这里插入图片描述
3)主题式交换器(Topic Exchange)

在这里插入图片描述
  Nova基于RabbitMQ实现两种RPC调用:RPC.CALL基于请求与响应方式,RPC.CAST只是提供单向请求。
  Nova的各个模块在逻辑功能上可以划分为两种:Invoker模块主要功能是向消息队列中发送系统请求消息,如Nova-API和Nova-Scheduler;Worker模块从消息队列中获取Invoker模块发送的系统请求消息以及向Invoker模块回复系统响应消息,如Nova-Compute、Nova-Volume和Nova-Network。

在这里插入图片描述

交换器和队列之间的通信关系

在这里插入图片描述

RPC.CALL的调用流程

  (1)Invoker端生成一个Topic消息生产者和一个Direct消息消费者。其中,Topic消息生产者发送系统请求消息到Topic交换器,Direct消息消费者等待响应消息。
  (2)Topic交换器根据消息的Routing Key转发消息,Topic消费者从相应的消息队列中接收消息,并传递给负责执行相关任务的Worker。
  (3)Worker根据请求消息执行完任务之后,分配一个Direct消息生产者,Direct消息生产者将响应消息发送到Direct交换器。
  (4)Direct交换器根据响应消息的Routing Key转发至相应的消息队列,Direct消费者接收并把它传递给Invoker。

  RPC.CAST的远程调用流程与RPC.CALL类似,只是缺少了系统消息响应流程。

在这里插入图片描述

RPC.CAST的远程调用流程

相关文章:

OpenStack开源虚拟化平台(一)

目录 一、OpenStack背景介绍(一)OpenStack是什么(二)OpenStack的主要服务 二、计算服务Nova(一)Nova组件介绍(二)Libvirt简介(三)Nova中的RabbitMQ解析 OpenS…...

C++ | Leetcode C++题解之第207题课程表

题目&#xff1a; 题解&#xff1a; class Solution { private:vector<vector<int>> edges;vector<int> indeg;public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {edges.resize(numCourses);indeg.resize(numCo…...

vue3中的自定义指令

全局自定义指令 假设我们要创建一个全局指令v-highlight&#xff0c;用于高亮显示元素。这个指令将接受一个颜色参数&#xff0c;并有一个可选的修饰符bold来决定是否加粗文本。 首先&#xff0c;在创建Vue应用时定义这个指令&#xff1a;&#xff08;这里可以将指令抽离成单…...

Postman接口测试工具的原理及应用详解(一)

本系列文章简介&#xff1a; 在当今软件开发的世界中&#xff0c;接口测试作为保证软件质量的重要一环&#xff0c;其重要性不言而喻。随着前后端分离开发模式的普及&#xff0c;接口测试已成为连接前后端开发的桥梁&#xff0c;确保前后端之间的数据交互准确无误。在这样的背景…...

C++ initializer_list类型推导

目录 initializer_list C自动类型推断 auto typeid decltype initializer_list<T> C支持统一初始化{ }&#xff0c;出现了一个新的类型initializer_list<T>&#xff0c;一切类型都可以用列表初始化。提供了一种更加灵活、安全和明确的方式来初始化对象。 class…...

造一个交互式3D火山数据可视化

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 Plotly.js 创建交互式 3D 火山数据可视化 应用场景 本代码用于将火山数据库中的数据可视化&#xff0c;展示火山的高度、类型和状态。可用于地质学研究、教育和数据探索。 基本功能 该代码使用 Plotly…...

【网络安全】一文带你了解什么是【CSRF攻击】

CSRF&#xff08;Cross-Site Request Forgery&#xff0c;跨站请求伪造&#xff09;是一种网络攻击方式&#xff0c;它利用已认证用户在受信任网站上的身份&#xff0c;诱使用户在不知情的情况下执行恶意操作。具体来说&#xff0c;攻击者通过各种方式&#xff08;如发送恶意链…...

短视频电商源码如何选择

在数字时代的浪潮下&#xff0c;短视频电商以其直观、生动、互动性强的特点&#xff0c;迅速崛起成为电商行业的一股新势力。对于有志于进军短视频电商领域的创业者来说&#xff0c;选择一款合适的短视频电商源码至关重要。本文将从多个角度探讨如何选择短视频电商源码&#xf…...

444444

356前期...

初识LangChain的快速入门指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…...

OpenBayes 教程上新 | CVPR 获奖项目,BioCLlP 快速识别生物种类,再也不会弄混小浣熊和小熊猫了!

市面上有很多植物识别的 App&#xff0c;通过对植物的叶片、花朵、果实等特征进行准确的识别&#xff0c;从而确定植物的种类、名称。但动物识别的 App 却十分有限&#xff0c;这使我们很难区分一些外形相似的动物&#xff0c;例如小浣熊和小熊猫。 左侧为小浣熊&#xff0c;右…...

24 年程序员各岗位薪资待遇汇总(最新)

大家好&#xff0c;我是程序员鱼皮。今天分享 24 年 6 月最新的程序员各岗位薪资待遇汇总。 数据是从哪儿来的呢&#xff1f;其实很简单&#xff0c;BOSS 直聘上有一个免费的薪酬查询工具&#xff0c;只要认证成为招聘者就能直接看&#xff0c;便于招聘者了解市场&#xff0c;…...

Android SurfaceFlinger——系统动画服务启动(十四)

在了解了 SurfaceFlinger、HWC、OpenGL ES 和 EGL 等相关概念和基础信息后,我们通过系统动画的调用流程引入更多的内容。 一、解析init.rc 开机就启动进程,肯定就要从 rc 文件开始。负责开机动画的进程是 bootanimation。 1、bootanim.rc 源码位置:/frameworks/base/cmds…...

VaRest插件常用节点以及Http请求数据

1.解析json &#xff08;1&#xff09;Construct Json Object&#xff1a;构建json对象 &#xff08;2&#xff09;Decode Json&#xff1a;解析json 将string转换为json &#xff08;3&#xff09;Encode json&#xff1a;将json转换为string &#xff08;4&#xff09;Get S…...

【Linux】线程id与互斥(线程三)

上一期我们进行了线程控制的了解与相关操作&#xff0c;但是仍旧有一些问题没有解决 本章第一阶段就是解决tid的问题&#xff0c;第二阶段是进行模拟一个简易线程库&#xff08;为了加深对于C库封装linux原生线程的理解&#xff09;&#xff0c;第三阶段就是互斥。 目录 线程id…...

JavaEE—什么是服务器?以及Tomcat安装到如何集成到IDEA中?

目录 ▐ 前言 ▐ JavaEE是指什么? ▐ 什么是服务器&#xff1f; ▐ Tomcat安装教程 * 修改服务端口号 ▐ 将Tomcat集成到IDEA中 ▐ 测试 ▐ 结语 ▐ 前言 至此&#xff0c;这半年来我已经完成了JavaSE&#xff0c;Mysql数据库&#xff0c;以及Web前端知识的学习了&am…...

主流分布式消息中间件RabbitMQ、RocketMQ

分布式消息中间件在现代分布式系统中起着至关重要的作用。以下是一些主流的分布式消息中间件&#xff1a; 1. Apache Kafka - 特点&#xff1a;高吞吐量、低延迟、持久化、水平可扩展、分布式日志系统。 - 使用场景&#xff1a;日志收集与处理、实时流处理、事件驱动架构、大数…...

【Unity Linux】模型导致的Unity项目崩溃

模型需勾选Strip Bones。如不勾选&#xff0c;则开启项目崩溃。 也可以删除有问题模型的.meta文件。 &#xff08;Unity默认会自动勾选&#xff0c;所以不会崩溃&#xff09; 或打开.meta文件&#xff0c;将optimizeBones的值&#xff0c;由0改为1。&#xff08;对应面板上的…...

22222

12212...

大数据领域的常用开发语言详解

大数据开发语言主要包括以下几个&#xff0c;以下是它们在大数据开发领域的优缺点和应用场景的详细说明&#xff1a; 1. Java 优点&#xff1a; 跨平台性&#xff1a;Java的“一次编写&#xff0c;到处运行”的特性使得其可以轻松地运行在多个操作系统上。面向对象&#xff…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

leetcode73-矩阵置零

leetcode 73 思路 记录 0 元素的位置&#xff1a;遍历整个矩阵&#xff0c;找出所有值为 0 的元素&#xff0c;并将它们的坐标记录在数组zeroPosition中置零操作&#xff1a;遍历记录的所有 0 元素位置&#xff0c;将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...