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

虚拟内存知识详解

  • 虚拟内存

    • 单片机的 CPU 是直接操作内存的「物理地址」

    • 在这种情况下,要想在内存中同时运行两个程序是不可能的

    • 操作系统是如何解决这个问题呢?

      • 关键的问题是这两个程序都引用了绝对物理地址,而这正是我们最需要避免的。

      • 可以把进程所使用的地址「隔离」开来,即让操作系统为每个进程分配独立的一套「虚拟地址」

      • 人人都有,大家自己玩自己的地址就行,互不干涉

      • 前提每个进程都不能访问物理地址,至于虚拟地址最终怎么落到物理内存里,对进程来说是透明的,操作系统已经把这些都安排的明明白白了。

      • 操作系统会提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来。

      • 如果程序要访问虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不会冲突了

        • 我们程序所使用的内存地址叫做虚拟内存地址(Virtual Memory Address

        • 实际存在硬件里面的空间地址叫物理内存地址(Physical Memory Address)。

      • 进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存

    • 操作系统是如何管理虚拟地址与物理地址之间的关系?

      • 主要有两种方式,分别是内存分段内存分页

  • 内存分段

    • 程序是由若干个逻辑分段组成的,如可由代码分段、数据分段、栈段、堆段组成。

    • 不同的段是有不同的属性的,所以就用分段(Segmentation)的形式把这些段分离出来。

    • 分段机制下,虚拟地址和物理地址是如何映射的?

      • 虚拟地址由两部分组成,段选择因子和段内偏移量。

        • 段选择子就保存在段寄存器里面。段选择子里面最重要的是段号,用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。

        • 虚拟地址中的段内偏移量应该位于 0 和段界限之间,如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址

      • 知道了虚拟地址是通过段表与物理地址进行映射的,分段机制会把程序的虚拟地址分成 4 个段,每个段在段表中有一个项,在这一项找到段的基地址,再加上偏移量,于是就能找到物理内存中的地址

      • 分段的办法很好,解决了程序本身不需要关心具体的物理内存地址的问题,但它也有一些不足之处

        • 第一个就是内存碎片的问题。

        • 第二个就是内存交换的效率低的问题。

        • 内存分段会出现内存碎片吗?

          • 内部内存碎片外部内存碎片

          • 内存分段管理可以做到段根据实际需求分配内存,所以有多少需求就分配多大的段,所以不会出现内部内存碎片。

          • 但是由于每个段的长度不固定,所以多个段未必能恰好使用所有的内存空间,会产生了多个不连续的小物理内存,导致新的程序无法被装载,所以会出现外部内存碎片的问题。

          • 解决「外部内存碎片」的问题就是内存交换

            • 先写到硬盘上再重新写回内存,这样可以把内存的位置集中,去掉碎片

        • 分段为什么会导致内存交换效率低的问题?

          • 对于多进程的系统来说,用分段的方式,外部内存碎片是很容易产生的,产生了外部内存碎片,那不得不重新 Swap 内存区域,这个过程会产生性能瓶颈。

          • 因为硬盘的访问速度要比内存慢太多了,每一次内存交换,我们都需要把一大段连续的内存数据写到硬盘上。

          • 如果内存交换的时候,交换的是一个占内存空间很大的程序,这样整个机器都会显得卡顿。

  • 内存分页

    • 分段的好处就是能产生连续的内存空间,但是会出现「外部内存碎片和内存交换的空间太大」的问题。

    • 当需要进行内存交换的时候,让需要交换写入或者从磁盘装载的数据更少一点,这样就可以解决问题了。这个办法,也就是内存分页(Paging)。

    • 分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。

    • 这样一个连续并且尺寸固定的内存空间,我们叫页(Page)。在 Linux 下,每一页的大小为 4KB

    • 页表是存储在内存里的,内存管理单元 (MMU)就做将虚拟内存地址转换成物理地址的工作。

    • 当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。

    • 分页是怎么解决分段的「外部内存碎片和内存交换效率低」的问题?

      • 采用了分页,页与页之间是紧密排列的,所以不会有外部碎片

      • 内存分页机制会有内部内存碎片

      • 如果内存空间不够,操作系统会把其他正在运行的进程中的「最近没被使用」的内存页面给释放掉,也就是暂时写在硬盘上,称为换出(Swap Out

      • 一旦需要的时候,再加载进来,称为换入

      • 一次性写入磁盘的也只有少数的一个页或者几个页,不会花太多时间,内存交换的效率就相对比较高。

      • 只有在程序运行中,需要用到对应虚拟内存页里面的指令和数据时,再加载到物理内存里面去。

    • 分页机制下,虚拟地址和物理地址是如何映射的?

      • 在分页机制下,虚拟地址分为两部分,页号和页内偏移。

      • 页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,这个基地址与页内偏移的组合就形成了物理内存地址

      • 对于一个内存地址转换,其实就是这样三个步骤

        • 把虚拟内存地址,切分成页号和偏移量;

        • 根据页号,从页表里面,查询对应的物理页号;

        • 直接拿物理页号,加上前面的偏移量,就得到了物理内存地址。

    • 简单的分页有什么缺陷吗?

      • 有空间上的缺陷。

      • 因为操作系统是可以同时运行非常多的进程的,那这不就意味着页表会非常的庞大。

    • 多级页表

      • 要解决上面的问题,就需要采用一种叫作多级页表(Multi-Level Page Table)的解决方案。

      • 对于单页表的实现方式,在 32 位和页大小 4KB 的环境下,一个进程的页表需要装下 100 多万个「页表项」,并且每个页表项是占用 4 字节大小的,于是相当于每个页表需占用 4MB 大小的空间。

      • 把这个 100 多万个「页表项」的单级页表再分页,将页表(一级页表)分为 1024 个页表(二级页表),每个表(二级页表)中包含 1024 个「页表项」,形成二级分页。

        • 分了二级表,映射 4GB 地址空间就需要 4KB(一级页表)+ 4MB(二级页表)的内存,这样占用空间不是更大了吗?

          • 我们应该换个角度来看问题,还记得计算机组成原理里面无处不在的局部性原理么?

          • 如果使用了二级分页,一级页表就可以覆盖整个 4GB 虚拟地址空间,但如果某个一级页表的页表项没有被用到,也就不需要创建这个页表项对应的二级页表了,即可以在需要时才创建二级页表

          • 那么为什么不分级的页表就做不到这样节约内存呢?

            • 页表一定要覆盖全部虚拟地址空间,不分级的页表就需要有 100 多万个页表项来映射,而二级分页则只需要 1024 个页表项(此时一级页表覆盖到了全部虚拟地址空间,二级页表在需要时创建)。

          • 对于 64 位的系统,两级分页肯定不够了,就变成了四级目录,分别是:

            • 全局页目录项 PGD(Page Global Directory);

            • 上层页目录项 PUD(Page Upper Directory);

            • 中间页目录项 PMD(Page Middle Directory);

            • 页表项 PTE(Page Table Entry);

    • TLB

      • 多级页表虽然解决了空间上的问题,但是虚拟地址到物理地址的转换就多了几道转换的工序,这显然就降低了这俩地址转换的速度,也就是带来了时间上的开销。

      • 程序是有局部性的

      • 利用这一特性,把最常访问的几个页表项存储到访问速度更快的硬件。在 CPU 芯片中,加入了一个专门存放程序最常访问的页表项的 Cache,这个 Cache 就是 TLB(Translation Lookaside Buffer) ,通常称为页表缓存、转址旁路缓存、快表等。

        • 在 CPU 芯片里面,封装了内存管理单元(Memory Management Unit)芯片,它用来完成地址转换和 TLB 的访问与交互。

        • 有了 TLB 后,那么 CPU 在寻址时,会先查 TLB,如果没找到,才会继续查常规的页表。

  • 段页式内存管理

    • 内存分段和内存分页并不是对立的,它们是可以组合起来在同一个系统中使用的,那么组合起来后,通常称为段页式内存管理。

    • 段页式内存管理实现的方式:

      • 先将程序划分为多个有逻辑意义的段,也就是前面提到的分段机制;

      • 接着再把每个段划分为多个页,也就是对分段划分出来的连续空间,再划分固定大小的页

    • 地址结构就由段号、段内页号和页内位移三部分组成。

    • 用于段页式地址变换的数据结构是每一个程序一张段表,每个段又建立一张页表,段表中的地址是页表的起始地址,而页表中的地址则为某页的物理页号

    • 段页式地址变换中要得到物理地址须经过三次内存访问

      • 第一次访问段表,得到页表起始地址;

      • 第二次访问页表,得到物理页号;

      • 第三次将物理页号与页内位移组合,得到物理地址。

    • 增加了硬件成本和系统开销,但提高了内存的利用率

  • Linux内存布局

    • 页式内存管理的作用是在由段式内存管理所映射而成的地址上再加上一层地址映射。

    • 逻辑地址和线性地址

      • 程序所使用的地址,通常是没被段式内存管理映射的地址,称为逻辑地址;

      • 通过段式内存管理映射的地址,称为线性地址,也叫虚拟地址;

      • 逻辑地址是「段式内存管理」转换前的地址,线性地址则是「页式内存管理」转换前的地址。

    • Linux 内存主要采用的是页式内存管理,但同时也不可避免地涉及了段机制。

    • Linux 内核所采取的办法是使段式映射的过程实际上不起什么作用

    • Linux 系统中的每个段都是从 0 地址开始的整个 4GB 虚拟空间(32 位环境下),也就是所有的段的起始地址都是一样的。这意味着,Linux 系统中的代码,包括操作系统本身的代码和应用程序代码,所面对的地址空间都是线性地址空间(虚拟地址),这种做法相当于屏蔽了处理器中的逻辑地址概念,段只被用于访问控制和内存保护。

    • Linux 的虚拟地址空间是如何分布的?

      • 虚拟地址空间的内部又被分为内核空间和用户空间两部分

        • 32 位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间;

        • 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的。

      • 内核空间与用户空间的区别

        • 进程在用户态时,只能访问用户空间内存;

        • 只有进入内核态后,才可以访问内核空间的内存;

      • 每个虚拟内存中的内核地址,其实关联的都是相同的物理内存这样,进程切换到内核态后,就可以很方便地访问内核空间内存。

      • 用户空间分布

        • 代码段,包括二进制可执行代码;

        • 数据段,包括已初始化的静态常量和全局变量;

        • BSS 段,包括未初始化的静态变量和全局变量;

        • 堆段,包括动态分配的内存,从低地址开始向上增长;

        • 文件映射段,包括动态库、共享内存等,从低地址开始向上增长;

        • 栈段,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。当然系统也提供了参数,以便我们自定义大小;

相关文章:

虚拟内存知识详解

虚拟内存 单片机的 CPU 是直接操作内存的「物理地址」 在这种情况下,要想在内存中同时运行两个程序是不可能的 操作系统是如何解决这个问题呢? 关键的问题是这两个程序都引用了绝对物理地址,而这正是我们最需要避免的。 可以把进程所使用的…...

数据结构初阶:顺序表和链表

线性表 线性表 ( linear list ) 是 n 个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串 ... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性…...

在flutter中添加video_player【视频播放插件】

添加插件依赖 dependencies:video_player: ^2.8.3插件的用途 在Flutter框架中,video_player 插件是一个专门用于播放视频的插件。它允许开发者在Flutter应用中嵌入视频播放器,并提供了一系列功能来控制和定制视频播放体验。这个插件对于需要在应用中展…...

golang微服务框架特性分析及选型

目录 一、微服务框架特性(10个)包括:Istio、go-zero、go-kit、go-kratos、go-micro、rpcx、kitex、goa、jupiter、dubbo-go、tarsgo 1、特性及使用场景2、比较 二、web框架特性(7个)包括:gin、fiber、beego…...

苹果cmsV10 MXProV4.5自适应PC手机影视站主题模板苹果cms模板mxone pro

演示站:http://a.88531.cn:8016 MXPro 模板主题(又名:mxonepro)是一款基于苹果 cms程序的一款全新的简洁好看 UI 的影视站模板类似于西瓜视频,不过同对比 MxoneV10 魔改模板来说功能没有那么多,也没有那么大气,但是比较且可视化功…...

GPU的了解

3D动画揭秘显卡的GPU是如何工作的_哔哩哔哩_bilibili 位于显卡中。 与CPU区别: 100名小学生和1位数学博士 做100道非常简单的算术题,小朋友一个人一道题,比博士快。 做1道非常复杂的数学问题,只有博士可以做出来。 CPU主要用于快…...

鸿蒙实战开发-如何使用Stage模型卡片

介绍 本示例展示了Stage模型卡片提供方的创建与使用。 用到了卡片扩展模块接口,ohos.app.form.FormExtensionAbility 。 卡片信息和状态等相关类型和枚举接口,ohos.app.form.formInfo 。 卡片提供方相关接口的能力接口,ohos.app.form.for…...

蓝桥杯刷题 前缀和与差分-[2128]重新排序(C++)

问题描述 给定一个数组 A 和一些查询 L**i, R**i,求数组中第 L**i 至第 R**i 个元素之和。 小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查询结果的和尽可能地大。小蓝想知道相比原数组,所有查询结果的总和最多…...

STM32重要参考资料

stm32f103c8t6 一、引脚定义图 二、时钟树 三、系统结构图 四、启动配置 (有时候不小心短接VCC和GND,芯片会锁住,可以BOOT0拉高试试(用跳线帽接)) 五、最小系统原理图 可用于PCB设计 六、常见折腾人bug…...

[StartingPoint][Tier0]Preignition

Task 1 Directory Brute-forcing is a technique used to check a lot of paths on a web server to find hidden pages. Which is another name for this? (i) Local File Inclusion, (ii) dir busting, (iii) hash cracking. (目录暴力破解是一种用于检查 Web 服务器上的大…...

数据库系统概论(超详解!!!)第三节 关系数据库标准语言SQL(Ⅴ)

1.数据更新 1.插入数据 1.插入元组 语句格式 INSERT INTO <表名> [(<属性列1>[,<属性列2 >…)] VALUES (<常量1> [,<常量2>]… ); 功能&#xff1a;将新元组插入指定表中 INTO子句 &#xff1a; 指定要插入数据的表名及…...

SpringBoot | Spring Boot“整合Redis“

目录: 1. Redis 介绍2. Redis 下载安装3. Redis “服务开启”和“连接配置”4. Spring Boot整合Redis的“前期准备” :① 编写实体类② 编写Repository 接口③ 在“全局配置文件”中添加 “Redis数据库” 的 “相关配置信息” 5. Spring Boot整合“Redis” (案例展示) 作者简介…...

SV学习笔记(四)

OCP Open Closed Principle 开闭原则 文章目录 随机约束和分布为什么需要随机&#xff1f;为什么需要约束&#xff1f;我们需要随机什么&#xff1f;声明随机变量的类什么是约束权重分布集合成员和inside条件约束双向约束 约束块控制打开或关闭约束内嵌约束 随机函数pre_random…...

Midjourney艺术家分享|By Moebius

Moebius&#xff0c;本名让吉拉德&#xff08;Jean Giraud&#xff09;&#xff0c;是一位极具影响力的法国漫画家和插画师&#xff0c;以其独特的科幻和幻想风格而闻名于世。他的艺术作品不仅在漫画领域内受到高度评价&#xff0c;也为电影、时尚和广告等多个领域提供了灵感。…...

Vue - 1( 13000 字 Vue 入门级教程)

一&#xff1a;Vue 导语 1.1 什么是 Vue Vue.js&#xff08;通常称为Vue&#xff09;是一款流行的开源JavaScript框架&#xff0c;用于构建用户界面。Vue由尤雨溪在2014年开发&#xff0c;是一个轻量级、灵活的框架&#xff0c;被广泛应用于构建单页面应用&#xff08;SPA&am…...

Vue关键知识点

watch侦听器 Vue.js 中的侦听器&#xff08;Watcher&#xff09;是 Vue提供的一种响应式系统的核心机制之一。 监听数据的变化&#xff0c;并在数据发生变化时执行相应的回调函数。 目的:数据变化能够自动更新到视图中 原理&#xff1a; Vue 的侦听器通过观察对象的属性&#…...

Prometheus+grafana环境搭建redis(docker+二进制两种方式安装)(四)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前三篇 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 Prometheusgrafana环境搭建m…...

宝塔面板安装nginx流媒体服务器(http-flv)

前文介绍了使用nginx搭建流媒体服务器,实现了hls切片方式播放,不过延迟较长。本文采用nginx搭建支持http-flv方式的流媒体服务器,用以测试期性能。 目录 一、服务器操作系统安装 二、在控制台安装宝塔面板...

LNMP环境:揭秘负载均衡与高可用性设计

lb1: 192.168.8.5 lb2: 192.168.8.6 web1:192.168.8.7 web2:192.168.8.8 php-fpm: 192.168.8.9 mysql: 192.168.8.10 nfs:192.168.8.11 分别插入镜像 8.5-8.8 分别安装nginx,并设置启动 8.9 安装php 8.10 安装mysql 先配置一台web服务器然后同步 设置网站根目录 cp -…...

深入理解Java异常处理机制(day20)

异常处理 异常处理是程序运行过程产生的异常情况进行恰当的处理技术 在计算机编程里面&#xff0c;异常的情况比所我们所想的异常情况还要多。 Java里面有两种异常处理方式&#xff1b; 1.利用trycatchfinaly语句处理异常&#xff0c;优点是分开了处理异常代码和程序正常代码…...

Docker实战教程 第1章 Linux快速入门

2-1 Linux介绍 为什么要学Linux 三个不得不学习 课程需要&#xff1a;Docker开发最好在Linux环境下。 开发需要&#xff1a;作为一个后端程序员&#xff0c;是必须要掌握Linux的&#xff0c;这是找工作的基础门槛。 运维需要&#xff1a;在服务器端&#xff0c;主流的大型服…...

java数据结构与算法刷题-----LeetCode172. 阶乘后的零

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 数学&#xff1a;阶乘的10因子个数数学优化:思路转变为求5的倍数…...

掌握数据相关性新利器:基于R、Python的Copula变量相关性分析及AI大模型应用探索

在工程、水文和金融等各学科的研究中&#xff0c;总是会遇到很多变量&#xff0c;研究这些相互纠缠的变量间的相关关系是各学科的研究的重点。虽然皮尔逊相关、秩相关等相关系数提供了变量间相关关系的粗略结果&#xff0c;但这些系数都存在着无法克服的困难。例如&#xff0c;…...

Centos7环境下安装MySQL8详细教程

1、下载mysql安装包 下载哪个版本&#xff0c;首先需要确定一下系统的glibc版本&#xff0c;使用如下命令&#xff1a; rpm -qa | grep glibc ​​​​​​​ 2、检查是否安装过mysql ps:因为以前用yum安装过&#xff0c;所以先用yum卸载。如果不是此方式或者没安装过则跳过…...

趣学前端 | 综合一波CSS选择器的用法

背景 最近睡前习惯翻会书&#xff0c;重温了《HTML5与CSS 3权威指南》。这本书&#xff0c;分上下两册&#xff0c;之前读完了上册&#xff0c;下册基本没翻过。为了对得起花过的每一分钱&#xff0c;决定拾起来近期读一读。 CSS 选择器 在CSS3中&#xff0c;提倡使用选择器…...

数据库 06-04 恢复

01 一.事务故障 二.系统 三.磁盘 02. 重点是稳定存储器 组成...

基于MPPT的风力机发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1风能与风力发电机模型 4.2风力机功率特性与最大功率点 4.3 MPPT 5.完整工程文件 1.课题概述 基于MPPT的风力机发电系统simulink建模与仿真。MPPT使用S函数编写实现。基于最大功率点跟踪&#xff08…...

GD32F30x IO 复用问题

1.PE9 复用PWM 引脚 需要使能 gpio_pin_remap_config(GPIO_TIMER0_FULL_REMAP,ENABLE);...

BPMNJS 在原生HTML中的引入与使用

BPMNJS 在HTML中的引入与使用 在网上看到的大多是基于vue使用BPMN的示例或者教程&#xff0c;竟然没有在HTML使用的示例&#xff0c;有也是很简单的介绍核心库的引入和使用&#xff0c;并没有涉及到扩展库。于是简单看了下&#xff0c;真的是一波三折&#xff0c;坎坎坷坷。不…...

HarmonyOS 应用开发之通过数据管理服务实现数据共享静默访问

场景介绍 典型跨应用访问数据的用户场景下&#xff0c;数据提供方会存在多次被拉起的情况。 为了降低数据提供方拉起次数&#xff0c;提高访问速度&#xff0c;OpenHarmony提供了一种不拉起数据提供方直接访问数据库的方式&#xff0c;即静默数据访问。 静默数据访问通过数据…...

asp 精品网站制作/seo网站内容优化有哪些

一&#xff0c;NFS服务简介NFS是Network File System的缩写&#xff0c;它可通过网络&#xff0c;让远端的不同的操作系统可以共享彼此的文件。类似windows系统中的文件共享。​实际上就是将NFS服务器中的一个或多个目录共享出来&#xff0c;使得远端的NFS客户端系统可以挂载此…...

asp网站加速/百度seo优化是做什么的

弱电网络工程中应用最多的交换机 交换机的分类 01 网络构成方式 接入层交换机、汇聚层交换机、核心层交换机 02 OST模型 第二层交换机、第三层交换机、第四层交换机……第七层交换机 03 交换机的可管理性 可管理型交换机、不可管理型交换机。区别在于对SNMP/RMON等网管协议的…...

建设一个网站需要学习什么/最新国内新闻重大事件

Ubuntu 11.04更新源列表及正式版下载 Ubuntu 11.04已经发布了&#xff0c;Ubuntu 11.04 正式版搭载全新用户界面、具有里程碑意义的新版 Ubuntu 11.04 现已正式发布&#xff0c;此版本的开发代号为 Natty Narwhal 。新版的 Ubuntu 11.04 不再提供上网本版本&#xff0c;现在只区…...

如何给公司做网站推广宣传/seo网站优化培训

&#xff08;1&#xff09; 10gen&#xff0c;它既是一个云平台&#xff0c;又是一个可下载的开放源代码包&#xff0c;可用于创建您自己的私有云。10gen 是类似于 App Engine 的一个软件栈&#xff0c;它提供与 App Engine 类似的功能 — 但有一些不同之处。通过 10gen&#x…...

互联网做网站的话术/seo的搜索排名影响因素有

unity是5.5&#xff0c;android studio是2.3.3 一&#xff1a;在android Studio导出aar插件到unity 说明一下aar与jar插件的区别&#xff1a;jar是只包含配置文件和class文件&#xff0c;而aar插件是包括资源的&#xff0c;两者都能用压缩软件打开。 首先打开as建立新的工程&a…...

网站建设金网科技/头条搜索站长平台

我是新来的Python。我正在尝试使用sklearn.cluster。这是我的代码&#xff1a;from sklearn.cluster import MiniBatchKMeanskmeansMiniBatchKMeans(n_clusters2)kmeans.fit(df)但我得到了以下错误&#xff1a;50 and not np.isfinite(X).all()):51 raise ValueError("Inp…...