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

操作系统-笔记-第三章-内存管理

🌸章节汇总 

一、第一章——操作系统的概念

二、第二章——【进程】

二、第二章——【线程】​编辑

二、第二章——【进程调度】

二、第二章——【进程同步与互斥】

二、第二章——【锁】

三、第三章——内存管理

四、第四章——文件管理

五、第五章——输入输出管理

​​​​​​​🚀 学习心得

目录

三、第三章——内存管理

1、内存的基础知识

(1.1)程序装入(三种)——绝对装入

(1.2)程序装入(三种)——可重定位装入

(1.3)程序装入(三种)——动态重定位

(2)程序——exe的由来

(3)程序——链接方法

(4)总结

2、内存管理的概念

(1)内存空间的分配和回收

(2)内存空间的拓展(比如:虚拟内存等)

(3)地址转换(逻辑地址-物理地址)

(4)内存保护

3、内存——覆盖与交换

(1)覆盖技术(已经out了)

(2)交换技术

(3)交换技术——对应的问题

(4)总结(考选择题)

4、连续分配管理方式

(1)单一连续分配

(2)固定分区分配

(3)动态分区分配

(4)总结

5、动态分区分配——算法(详细讲解)

(1)首次适应算法(第一次)

(2)最佳适应算法(从小到大)

(3)最坏适应算法(从大到小)

(4)临近适应算法(从大到小)

(5)总结(优缺点)

6、基本分页存储——概念

(1)页框——物理块——内存块——物理页面

(2)逻辑地址-结构【页号+页内偏移量】

(3)总结——概念

(4)重点——地址变换过程(五步)

(5)重点——例题

(6)重点——页表(如何存储在内存中)

(7)总结——地址变换

7、快表(TLB)

(1)查询过程——1(先快表,再慢表,最后内存)

(2)查询过程——2(同时查找-快表-慢表)

(3)局部性原理

(4)总结 (TLB和高速缓存有区别!!!)

8、两级页表(开始套娃啦)

(1)从一级—二级—偏移量(转到物理地址)

(2)单级页表

(3)细节重点

(4)总结

9、段页式管理方式

(1)段表

(2)查询段表——顺序

(3)分段 & 分页 【对比】

(4)总结

10、虚拟内存

(1)传统存储管理方式——特征、缺点

(2)虚拟内存——定义、特征

(3)如何实现——虚拟内存

(4)总结

11、请求页面——管理方式

(1)缺页中断(内中断)

(2)地址变换

(3)总结

12、页面置换算法

(1)最佳置换算法(无法实现)

(2)先进先出算法(绝对公平——Belady异常)

(3)最近最久未使用置换算法(LRU)

(4)时钟页面置换算法(CLOCK & NRU)

(5)时钟页面置换算法——改进型

(6)总结(要会手推——页面替换)

12、页面分配策略、抖动、工作集

(1)工作集模型(清华教程)

 (2)驻留集——分配策略【王道】

(3)何时调入页面(亡羊补牢 or 未雨绸缪)

(4)在哪里调入?(经典加一层)

(5)抖动现象

(6)工作集(拓展-考试貌似不考~)

(7)总结

13、内存映射文件

(1)方便程序员——访问文件数据

(2)共享数据——同时访问一个文件

(3)总结(关于磁盘的IO,操作系统是专业滴!)


三、第三章——内存管理

1、内存的基础知识

相关知识点

逻辑地址——相对地址

物理地址——绝对地址

(1.1)程序装入(三种)——绝对装入

灵活性差,已经被淘汰了~

(1.2)程序装入(三种)——可重定位装入

在装入时——会转换好地址~(写死了物理地址,不能移动咯!)

(1.3)程序装入(三种)——动态重定位

现在使用方法——可以动态修改,灵活移动,动态申请空间…

(2)程序——exe的由来

1.    编写源代码:首先,您需要使用文本编辑器编写C语言源代码文件,通常以.c为扩展名。

2.    编译源代码:接下来,您需要使用C编译器将源代码编译为机器可以执行的目标代码。这个过程称为编译。编译器会对源代码进行词法分析、语法分析和语义分析,并生成相应的目标代码文件(通常以.obj为扩展名)。

3.  链接目标代码:在生成目标代码后,您需要使用链接器将目标代码与所需的库文件进行链接,以创建最终的可执行文件。链接器会解决函数和变量引用之间的依赖关系,并将目标代码转换为可执行文件的格式。最终生成的可执行文件通常以.exe(对于Windows系统)或无扩展名(对于Linux系统)为扩展名。

4.    运行可执行文件:一旦可执行文件生成成功,您可以直接执行它。

(3)程序——链接方法

(4)总结

2、内存管理的概念

(1)内存空间的分配和回收

如何分配?如何回收?还有哪些空闲?这么多位置,应该分配哪一块?

(2)内存空间的拓展(比如:虚拟内存等)

内存不够用,如何临时拓展?

(3)地址转换(逻辑地址-物理地址)

地址转换功能

(4)内存保护

如何让各进程之间,拥有自己的地皮,互不影响!

3、内存——覆盖与交换

(1)覆盖技术(已经out了)

程序员来完成——编程麻烦(out)

(2)交换技术

把暂时不需要的进程——拿到外存

(3)交换技术——对应的问题

(4)总结(考选择题)

4、连续分配管理方式

(1)单一连续分配

无外部碎片——但:有内部碎片【内存利用率低】

(2)固定分区分配

把用户空间——划分多个分区~

无外部碎片——但又内部碎片,内存利用率低

 

(3)动态分区分配

没有内部碎片,但有外部碎片!

(不过可以通过【拼凑】等方式,来解决【外部碎片】)

(4)总结

5、动态分区分配——算法(详细讲解)

(1)首次适应算法(第一次)

从头到尾,按顺序扫描!

找到第一个满足的空间,就放进去~

(2)最佳适应算法(从小到大)

这个是强迫症!——必须安排连续的空间(产生难以利用的小碎片)

额外创建一个——空闲分区链表——用来记录空闲空间的大小(从小到大排序!)

每次安排完后,都需要【维护该表】(数据更新,重新排序)

(3)最坏适应算法(从大到小)

和最佳相反——空间排序【从大到小】

缺点——如果来个了“大进程”——可能没有足够大的连续空间给他!

(4)临近适应算法(从大到小)

从小到大的【循环链表】

开销小【空间换时间】——但是——大分区容易被用完~

(5)总结(优缺点)

6、基本分页存储——概念

(1)页框——物理块——内存块——物理页面

Page Frame —— 页框(标准点)

物理块号——页帧号——内存块号

页表——存储【逻辑地址】与【物理地址】的映射关系

如何计算——页表的大小(根据内存大小推算)【具体步骤——看左下角】

页号不占空间!!!——数组索引【这个页表——类似于一维数组~】

为了计算机计算——页面大小用2的【整数幂】

在计算机网络那里类似,计算也是这样,要方便得多~

(2)逻辑地址-结构【页号+页内偏移量】

(3)总结——概念

(4)重点——地址变换过程(五步)

文字说明版本——五步骤

(5)重点——例题

如何将【逻辑地址】——转为【物理地址】

(6)重点——页表(如何存储在内存中)

计算机组成原理——也有讲哟~~~

页表——存放在内存当中——也称为(慢表)

计算页表项——占多少位(最好是2的次方!)实际应用中——方便计算!

(7)总结——地址变换

7、快表(TLB)

查询快表——不需要访存(快表是高速缓存)

(1)查询过程——1(先快表,再慢表,最后内存)

(2)查询过程——2(同时查找-快表-慢表)

(3)局部性原理

(4)总结 (TLB和高速缓存有区别!!!)

普通的Cache会存放各种数据

但是——TLB——只存放页表项的副本!!!

8、两级页表(开始套娃啦)

记住——加一层的解决方式——可以多次套娃!!!(可以不止两层哟~)

(1)从一级—二级—偏移量(转到物理地址)

(2)单级页表

(3)细节重点

条件:40位逻辑地址——知道物理块的大小(4KB)——页表的每一项的大小(4B)

①地址偏移量需要多少位?

总共40位,一个物理块有4KB,(2^12位)——采用2进制表示偏移量:需12位

②还是剩下多少位——用来表示各级页表?40-12 = 28

③怎么分各级页表?随便分?(题目限制:各级页表的大小不能超过一个内存块!

④那么请问一个物理块可以容纳多少页表项?——2^12 / 4 = 2^10

每一级页表的大小不能超过物理块的大小!——那么只能按照内存块最大位数来分咯~

28 分为 10 – 10 – 8 (3级,一级:2^10,二级:2^10,三级:2^8)

当然,可以再分多级也可以啦~(只不过会有更多碎片!)

比如: 28分为 ——7,7,7,7(4级,每级2^7这么大)

详细结题——如下图:

(4)总结

9、段页式管理方式

(1)段表

段号——也可以隐含【类似数组的索引,是隐含的~】

(2)查询段表——顺序

分段中——每个长度不一样!!!

一定要越界检查!!!(段号是否越界?段内地址是否合法?)

(3)分段 & 分页 【对比】

分页——用户不可见——提高利用率——地址空间【一维——映射的物理地址】

分段——用户可见——满足用户需求——地址空间【二维——段名+段内地址】

分页——长度固定——更容易共享&保护

分段——长度不固定——

(4)总结

段表和页表——都存储在内存中——可以成为慢表

他们都可以再往上封装一层——即为:【快表】——加快CPU的查询效率!!!

(注意:这些术语只是方便我们理解,是前人们的智慧结晶~不要被这些术语锁死!)

快表为什么叫快表?因为他快!他在Cache里面,造价高…等等原因!

10、虚拟内存

(1)传统存储管理方式——特征、缺点

一次性——全部放入内存(太大了,可不行!)

驻留性——暂时用不上的(留着内存中,消耗了资源)

(2)虚拟内存——定义、特征

多次性、对换性、虚拟性

(3)如何实现——虚拟内存

【内存的页面】的【换入换出】(怎么实现)?

(4)总结

虚拟内存——是高速缓存技术的拓展!

既然你内存查询,都分了多个级别(Cache里面有三级)(内存里面就再分个级别吧~)

注意:计算机组成原理——在Cache章节,说明Cache的换入和换出!

为什么计算机组成原理那里只介绍了Cache的替换算法呢?

因为,【Cache替换的实现是由【硬件】完成的!

在这里,【内存】由操作系统来管理,自然需要操作系统(系统软件)来实现啊!

虚拟内存是计算机系统中的一种技术,用于将磁盘空间作为辅助内存来扩展主存(RAM)的容量。

它允许操作系统将部分数据移动到磁盘上,并在需要时将其还原回主存。

虚拟内存的设计目的是提供比物理内存更大的地址空间,以及更灵活的内存管理。

虚拟内存与高速缓存是不同的概念。

高速缓存是一种位于处理器和主存之间的存储器层次结构,用于加快对常用数据的访问速度。

而虚拟内存是一种通过存储器映射技术实现的内存扩展机制,用于增加可用的地址空间。

关于计算机组成原理中只介绍了Cache的替换算法而没有涉及虚拟内存的解释,可能是因为计算机组成原理的重点是硬件层面的设计和实现。

因此,在讲解Cache时主要侧重于硬件层面的实现细节,如替换算法、缓存一致性、写策略等。

而虚拟内存的管理是由操作系统来完成的,属于系统软件的范畴,因此在计算机组成原理这门课程中可能没有过多介绍。

需要注意的是,虚拟内存和Cache是不同层次的存储器技术,各自有不同的设计原理和实现方法。虚拟内存的管理涉及到操作系统的内存管理模块,而Cache的管理则由硬件电路来完成。

11、请求页面——管理方式

(1)缺页中断(内中断)

没有需要的页——产生中断

如果有空闲块——直接占用(没有的话,使用页面置换算法~)

(2)地址变换

(3)总结

12、页面置换算法

(1)最佳置换算法(无法实现)

这个是——理想算法(实际应用中,无法实现)

因为——他需要提前知道后面需要访问的页面是什么!(很显然,不能做到)

(2)先进先出算法(绝对公平——Belady异常)

性能差——注意——Belady异常!(随着访问次数增多,缺页次数反而减少!)

(3)最近最久未使用置换算法(LRU)

适用于局部性好的(性能好)——需要硬件支持,开销大

(4)时钟页面置换算法(CLOCK & NRU)

扫描的过程——像一个时钟——不断计数(访问位为:0 / 1)

最近未用算法

最坏情况——扫两轮(一圈多一点)

(5)时钟页面置换算法——改进型

会筛选4轮!(最坏情况下,要转3圈多一点)

1、未访问、未修改

2、未访问、已修改

3、已访问、未修改

4、已访问、已修改

(注意:访问的权利大!排在最后!)

(6)总结(要会手推——页面替换)

PS:并不止这些算法,还有其他替换算法哟~

比如——随机替换算法(和猴子排序类似的有趣,哈哈哈~)

最不常用算法(LFU)——考虑的是访问次数 or 频率

12、页面分配策略、抖动、工作集

(1)工作集模型(清华教程)

工作集——内存的区间(大小)——我觉得成为【工作间还挺好~】

【你活动的空间太大了,不太好】

【你活动的空间太小了,也不太好~】

当你经常卡壳(说明你活动空间小,需要增多活动空间)

当你不卡壳(说明你活得很滋润,浪费了一些空间,需要给你减少空间!)

资本家看了都流泪(┭┮﹏┭┮)~

 

 

 

 

 (2)驻留集——分配策略【王道】

1、开始给你分配固定的大小工作空间

2、动态给你调整(调整又分为内部调整、外部调整)

内部调整(局部)——把你进程内部的物理块变为工作区间

外部调整(全局)——把外部空间(空闲)物理块给你

(3)何时调入页面(亡羊补牢 or 未雨绸缪)

先调入?还是缺了再调入?(具体场景,具体分析~)

(4)在哪里调入?(经典加一层)

在外存中,再套一层(对换区)

方便页面置换(换出来的页面就放到“对换区”)

(5)抖动现象

物理块不够时,频繁访问页面——导致(频繁出现“缺页中断”)

(6)工作集(拓展-考试貌似不考~)

工作集 ≠ 驻留集

驻留集——给定的工作空间

工作集——在工作空间里(加了一个窗口,也就是时间间隔)

因此——驻留集 > 工作集

(7)总结

13、内存映射文件

(1)方便程序员——访问文件数据

传统方式——程序员手动写read、write方法,很麻烦

优化方式——操作系统为我们完成对外存的读和写(相当于操作系统封装了一层~)

我们就可以像——操作C语言那样,完成指定的读入和写入啦~

(2)共享数据——同时访问一个文件

参考Windows上的.txt文件(并不是互斥的哟~)

  1. 我可以用【记事本】打开~
  2. 我还可以用【VsCode】打开~

(3)总结(关于磁盘的IO,操作系统是专业滴!)

什么时候读,什么时候写(可以让操作系统来完成~)这方面的性能可以让操作系统来优化

程序员就可以放开手脚做其他的事情啦~

(当然,对应强迫症的工程师,可以自己来控制和考虑啦~)

相关文章:

操作系统-笔记-第三章-内存管理

🌸章节汇总 一、第一章——操作系统的概念 二、第二章——【进程】 二、第二章——【线程】​编辑 二、第二章——【进程调度】 二、第二章——【进程同步与互斥】 二、第二章——【锁】 三、第三章——内存管理 四、第四章——文件管理 五、第五章——输入输出管理…...

详解单体架构和微服务(概念,优缺点和区别)

单体架构和微服务 单体架构和微服务架构区别?为什么要用微服务架构? 单体架构的整个系统是一个War包,即war包走天下。微服务架构的项目是很多个war包(一个子系统一个)。 单体架构的优点: 架构简单开发测试部署简单…...

储能运行约束的Matlab建模方法

最近一段时间有很多人问我最优潮流计算中储能系统的建模方法。部分朋友的问题我回复了,有些没有回消息的,我就不再一一回复了,在这里我写一篇博客统一介绍一下。 1.储能系统介绍 首先,让【GPT】简单介绍一下储能系统:…...

微信小程序 车牌号输入组件

概述 一个小组件,用于方便用户输入车牌号码 详细 概述 有时候我们开发过程中会遇到需要用户输入车牌号的情况,让客户通过自带键盘输入,体验不好且容易出错,例如车牌号是不能输入O和I的,因此需要有一个自定义的键盘…...

Bootstrap Blazor 实战动态表单组件

1.新建工程 源码 新建工程b18ValidateForm,使用 nuget.org 进行 BootstrapBlazor 组件安装, Chart 库,字体. 将项目添加到解决方案中 dotnet new blazorserver -o b18ValidateForm dotnet add b06chart package BootstrapBlazor dotnet add b06chart package BootstrapBlazo…...

Elasticsearch 集成---Spark Streaming 框架集成

一.Spark Streaming 框架介绍 Spark Streaming 是 Spark core API 的扩展,支持实时数据流的处理,并且具有可扩展, 高吞吐量,容错的特点。 数据可以从许多来源获取,如 Kafka , Flume , Kin…...

Kotlin 中的 协程 基础篇

一、什么叫协程 协程可以称为轻量级线程,线程代码块; 二、GlobalScope 协程 CoroutineScope (协程作用域) 的上下文中通过 launch、async 等构造器来启动。GlobalScope ,即全局作用域内启动了一个新的协程,这意味这该协程的生命周期只受整…...

SQL事务

事务的概念: 事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行。事务就是一些SQL语句组(每条单独的SQL语句也算一个事务),其中事务中的SQL…...

关于flutter中 initState() 与 setState() 用法

initState()函数是在组件渲染之前执行的。在Flutter中,initState()是StatefulWidget的生命周期方法之一,在调用build()方法之前被调用。当创建一个StatefulWidget并将其添加到组件树中时,Flutter会实例化该组件的状态对象,并在调用…...

智能电话机器人是如何自主学习的

电话机器人主要通过语音识别和针对语意的理解识别客户所说的内容,针对性的回答问题,为企业高效筛选意向客户。除了电话机器人语音识别之外,电话机器人能够自主学习,不断完善产品知识及话术等,是它智能的另一种体现。那…...

【Rust】Rust学习 第十八章模式用来匹配值的结构

模式是 Rust 中特殊的语法,它用来匹配类型中的结构,无论类型是简单还是复杂。结合使用模式和 match 表达式以及其他结构可以提供更多对程序控制流的支配权。模式由如下一些内容组合而成: 字面值解构的数组、枚举、结构体或者元组变量通配符占…...

我的学习笔记:数据处理

数据清洗 对数据进行处理和加工,以使其适合分析和建模。数据清洗包括去除重复数据、填补缺失值、处理异常值和转换数据格式等操作,以提高数据的可靠性和准确性,避免数据分析时出现偏差,提高决策的准确性。 数据去重:通…...

GB28181国标平台测试软件NTV-GBC(包含服务器和模拟客户端)

GB28181国标平台测试软件NTV-GBC用于对GB28181国标平台进行测试(测试用例需要服务器软件,服务器软件可以是任何标准的国标平台,我们测试使用的是NTV-GBS),软件实现了设备注册、注销、目录查询,消息订阅、INVITE&#x…...

云原生:重塑企业的技术疆界

云原生技术正在重新塑造我们对软件开发、部署和运维的理解。这些技术带来了灵活性、可扩展性以及在复杂环境中保证稳定性的可能性,这些都是企业在云原生场景中比较关注的问题。本文将主要聚焦于云原生场景,探讨其影响和作用。 云原生的定义 云原生计算基…...

华为星闪,一项将 “ 更稳 WiFi ” 和 “ 更好蓝牙 ” 融合起来的通信标准

兼顾多用途和专业化的 AI 大模型、移除安卓代码的 HarmonyOS NEXT 、给折叠屏应用提供适配方向的《 折叠屏/平板应用体验评估标准 》。。。 不过除了这些比较贴近我们普通用户,容易讲清楚的东西,华为还官宣了一个大家可能没注意的黑科技: 星…...

IDEA创建Mybatis格式XML文件

设置位置:File | Settings | Editor | File and Code Templates 选择Files,点击号 Name中输入xml模板名(名称自行决定),后缀名extension输入xml(固定) 内容处输入Mybatis的xml文件模板内容&…...

二叉树中的最大路径和-递归

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root…...

Python if-else 速记

文章目录 在 Python 中使用三元运算符作为 if-else 速记总结 编程中经常使用速记符号来简化我们的工作。 速记符号是一种可以更简洁、更省时省力地完成工作的方法。 本文将讨论 Python 中使用的速记符号作为 if-else 语句的快捷方式。 在 Python 中使用三元运算符作为 if-else…...

Python使用内置的json模块来处理JSON数据

目录 1、解释说明: 2、使用示例: 3、注意事项: 1、解释说明: 在Python中,我们可以使用内置的json模块来处理JSON数据。这个模块提供了四个主要的函数:dumps、loads、dump、load。 - dumps:将…...

亿赛通电子文档安全管理系统 RCE漏洞

亿赛通电子文档安全管理系统 RCE漏洞 一、 产品简介二、 漏洞概述三、 复现环境四、 漏洞复现小龙POC检测: 五、 修复建议 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...