CPU多级缓存机制

news2025/2/26 0:06:12

目录

一、前置知识 ---- CPU的核心

1.1. 单核与多核CPU

二、CPU多级缓存机制 

三. 缓存的基本结构/缓存的存储结构

四、CPU缓存的运作流程/工作原理

五、CPU多级缓存机制的工作原理【简化版】

5.1. 缓存访问的过程

(5.1.1) L1缓存(一级缓存)访问

(5.1.2) L2缓存(二级缓存)访问

(5.1.3) L3缓存(三级缓存)访问:

(5.1.4) 主存(内存)访问

5.2. 缓存一致性和替换策略

(5.2.1) 缓存一致性(Cache Coherence)

(5.2.2) 缓存替换策略

5.3 回写策略

六、缓存的硬件实现

1. 一级缓存(L1 Cache):

2. 二级缓存(L2 Cache):

3. 三级缓存(L3 Cache):

4. 缓存的性能影响:

5. 设计折衷:

总结:

七、多级缓存的引入动机和设计考虑

7.1 引入动机

7.2 设计考虑


一、前置知识 ---- CPU的核心

CPU的核心(Core)是计算机中处理数据和执行指令的基本单元。每个核心可以独立执行程序中的指令集,从而提高计算效率和并行处理能力。以下是CPU核心的详细介绍:

1.1. 单核与多核CPU

  • 单核CPU:只有一个核心的处理器,所有计算任务都由这个核心完成。单核CPU在处理多个任务时需要依赖操作系统的调度。
  • 多核CPU:包含多个核心,每个核心可以独立执行任务。多核CPU可以同时处理多个任务(并行计算),提高计算性能,尤其在多任务和多线程的应用场景中效果显著。多核CPU通常为每个核配有独享的一级和二级缓存,以及各核之间共享的三级缓存。
CPU的多级缓存架构

二、CPU多级缓存机制 

名词解释【CPU多级缓存机制】:CPU多级缓存机制(CPU Multi-level Cache Mechanism)是指为了提高CPU数据访问效率,减少CPU访问主存(RAM)的延迟,采用分级缓存结构来存储数据的机制。该机制通过在CPU和主存之间设置多个缓存层次(通常包括L1缓存、L2缓存、L3缓存等),不同层级的缓存具有不同的容量、速度和作用,从而优化数据访问性能。

CPU的多级缓存机制(也叫多级缓存体系)是为了提高数据访问速度、减轻主存访问压力而设计的。它通常包括以下几个级别的缓存:

  1. L1缓存(一级缓存)

    • 最靠近CPU核心,速度最快,容量最小(通常为32KB-128KB)。
    • 分为指令缓存(L1I)和数据缓存(L1D),用于存储CPU频繁使用的指令和数据。
    • 延迟非常低,能够快速响应CPU对数据的需求。
  2. L2缓存(二级缓存)

    • 相对于L1缓存,L2缓存的容量较大(通常为256KB-8MB),但访问速度较慢。
    • 存储从主存读取的数据以及L1缓存无法提供的额外数据。
    • L2缓存可以是每个核心独享,也可以是多个核心共享,具体取决于CPU架构。
  3. L3缓存(三级缓存)

    • 位于L2缓存之后,容量更大(通常为4MB-几十MB),速度相对较慢。
    • L3缓存通常是多个核心共享的,用来进一步减少访问主存的延迟。
    • 对于多核处理器,L3缓存是核心之间交换数据的缓冲区。

速度:L1>L2>L3 ;容量:L1<L2<L3。

三. 缓存的基本结构/缓存的存储结构

结构上,一个直接映射(Direct Mapped)缓存由若干缓存块(Cache Block,或Cache Line)构成。每个缓存块存储具有连续内存地址的若干个存储单元。在32位计算机上这通常是一个双字(dword),即四个字节。因此,每个双字具有唯一的块内偏移量。

每个缓存块有一个索引(Index),它一般是内存地址的低端部分,但不含块内偏移和字节偏移所占的最低若干位。一个数据总量为4KB、缓存块大小为16B的直接映射缓存一共有256个缓存块,其索引范围为0到255。使用一个简单的移位函数,就可以求得任意内存地址对应的缓存块的索引。由于这是一种多对一映射,必须在存储一段数据的同时标示出这些数据在内存中的确切位置。所以每个缓存块都配有一个标签(Tag)。拼接标签值和此缓存块的索引,即可求得缓存块的内存地址。如果再加上块内偏移,就能得出任意一块数据的对应内存地址。

因此,在缓存大小不变的情况下,缓存块大小和缓存块总数成反比关系。下图中所示的缓存块来自一个数据总量为4KB、每个缓存块大小为16B的直接映射缓存,其标签长度为20bits( 32−log2⁡(4096÷16)−log2⁡(16)=20)。

此外,每个缓存块还可对应若干标志位,包括有效位(valid bit)、脏位(dirty bit)、使用位(use bit)等。这些位在保证正确性、排除冲突、优化性能等方面起着重要作用。

  • 缓存行(Cache Line):缓存中的基本存储单元。每个缓存行通常包含32到128字节的数据。CPU访问缓存时,会以缓存行为单位进行存取。
  • 标签(Tag):每个缓存行都有一个标签,用于标识缓存行中存储的数据块在内存中的位置。CPU通过标签来判断缓存中的数据是否是它需要的数据。

四、CPU缓存的运作流程/工作原理

下面简要描述一个假想的直接映射缓存的工作流程。这个缓存共有四个缓存块,每个块16字节,即4个字,因此共有64字节存储空间。使用写回(Write back)策略以保证数据一致性。

系统启动时,缓存内没有任何数据。之后,数据逐渐被载入或换出缓存。假设在此后某一时间点,缓存和内存布局如下图所示。此时,若处理器执行数据读取指令,控制逻辑依如下流程:

  1. (将地址由高至低划分为四个部分:标签、索引、块内偏移、字节偏移。其中块内偏移和字节偏移各占两位,后者在以下操作中不使用。)
  2. 用索引定位到相应的缓存块。
  3. 用标签尝试匹配该缓存块的对应标签值。如果存在这样的匹配,称为命中(Hit);否则称为未命中(Miss)。
  4. 如命中,用块内偏移将已定位缓存块内的特定数据段取出,送回处理器。
  5. 如未命中,先用此块地址(标签+索引)从内存读取数据并载入到当前缓存块,再用块内偏移将位于此块内的特定数据单元取出,送回处理器。这里要注意的是,(1)读入的数据会冲掉之前的内容。为保证数据一致性,必须先将数据块内的现有内容写回内存。(2)尽管处理器请求的只是一个字,缓存仍必须在读取的时候把整个数据块都填充满。(3)缓存的读取是按缓存块大小为边界对齐的。对于大小为16字节的缓存块,任何因为0x0000、或0x0001、或0x0002、或0x0003造成的未命中,都会导致位于内存0x0000—0x0003的全部四个字被读入块中。

在下图中,如此时处理器请求的地址在0x0020到0x0023之间,或在0x0004到0x0007之间,或在0x0528到0x052B之间,或在0x05EC到0x05EF之间,均会命中。其余地址则全部未命中。

而处理器执行数据写入指令时,控制逻辑依如下流程:

  1. 用索引定位到相应的缓存块。
  2. 用标签尝试匹配该缓存块的对应标签值。其结果为命中或未命中。
  3. 如命中,用块内偏移定位此块内的目标字。然后直接改写这个字。
  4. 如未命中,依系统设计不同可有两种处理策略,分别称为按写分配(Write allocate)和不按写分配(No-write allocate)。如果是按写分配,则先如处理读未命中一样,将未命中数据读入缓存,然后再将数据写到被读入的字单元。如果是不按写分配,则直接将数据写回内存。
CPU缓存的运作流程(注意内存左侧给出的地址是字地址而不是字节地址)

五、CPU多级缓存机制的工作原理【简化版】

CPU的多级缓存机制在提高数据访问效率方面发挥了至关重要的作用。它的工作原理可以分为以下几个步骤和层次:

    5.1. 缓存访问的过程

    当CPU需要从内存中读取数据时,它会首先通过多级缓存依次查找数据,具体过程如下:

    (5.1.1) L1缓存(一级缓存)访问
    • CPU发出数据请求后,首先会查找L1缓存。L1缓存非常小(一般为32KB到128KB)且访问速度非常快,因此它能提供非常低的延迟。
    • 缓存命中(Cache Hit):如果L1缓存中有需要的数据(命中),CPU直接从L1缓存中获取数据,不需要访问更慢的L2或主存。
    • 缓存未命中(Cache Miss):如果L1缓存中没有数据(未命中),CPU就会查找L2缓存。
    (5.1.2) L2缓存(二级缓存)访问
    • 如果L1缓存没有找到所需数据,CPU接下来会查找L2缓存。L2缓存容量较大(通常为256KB到8MB),但访问速度比L1稍慢一些。
    • 缓存命中(Cache Hit):如果L2缓存中找到需要的数据,CPU就会从L2缓存中获取数据,填充L1缓存,并返回数据给CPU。
    • 缓存未命中(Cache Miss):如果L2缓存也没有找到所需数据,CPU会接着查找L3缓存。
    (5.1.3) L3缓存(三级缓存)访问
    • L3缓存一般是多个CPU核心共享的缓存(通常为4MB到几十MB),它容量更大,访问速度也比L2更慢。
    • 如果L3缓存中命中数据,CPU会从L3缓存获取数据,并将数据返回给L2缓存和L1缓存以供之后使用。
    (5.1.4) 主存(内存)访问
    • 缓存未命中(Cache Miss):如果L3缓存中也找不到所需的数据,CPU最后才会访问主存。主存访问速度远低于缓存,因此主存访问的延迟非常高。
    • 一旦数据从主存获取,CPU会将数据存入L3、L2和L1缓存,以便后续更快速的访问。

    5.2. 缓存一致性和替换策略

    在多级缓存中,为了保持数据的一致性和有效性,CPU采用了以下策略:

    (5.2.1) 缓存一致性(Cache Coherence)
    • 在多核处理器中,多个核心可能同时访问共享的数据,这时可能会出现缓存数据不一致的情况。为了解决这个问题,缓存一致性协议(如MESI协议)被用于保持缓存中的数据与主存之间的一致性。
      • M(Modified):数据已被修改,且未写回主存。
      • E(Exclusive):数据在缓存中,且未被修改,且与主存一致。
      • S(Shared):数据可以被多个缓存共享,且与主存一致。
      • I(Invalid):数据无效。
    (5.2.2) 缓存替换策略
    • LRU(Least Recently Used):当缓存满时,LRU策略会淘汰最久未被使用的数据。
    • FIFO(First In, First Out):根据数据进入缓存的顺序,最先进入的缓存行会最先被替换。
    • LFU(Least Frequently Used):替换访问频率最低的数据。

    先进先出算法(FIFO)替换掉进入组内时间最长的缓存块。最久未使用算法(LRU)则跟踪各个缓存块的使用状况,并根据统计比较出哪个块已经最长时间未被访问。对于2路以上相联,这个算法的时间代价会非常高。

    对最久未使用算法的一个近似是非最近使用(NMRU)。这个算法仅记录哪一个缓存块是最近被使用的。在替换时,会随机替换掉任何一个其他的块。故称非最近使用。相比于LRU,这种算法仅需硬件为每一个缓存块增加一个使用位(use bit)即可。

    此外,也可使用纯粹的随机替换法。测试表明完全随机替换的性能近似于LRU。

    5.3 回写策略

    • 写回(Write-back)与直写/写通(Write-through)
      • Write-back:当CPU修改了缓存中的数据时,不立即写回到主存,而是等到缓存行被替换时再写回。这种方式减少了写入主存的频率。
      • Write-through:每当缓存中的数据被修改时,立即将数据写回主存。这保证了缓存和主存中的数据一致性,但会导致更多的内存访问。

    为了和下级存储(如内存)保持数据一致性,就必须把数据更新适时传播下去。这种传播通过回写来完成。一般有两种回写策略:写回(Write back)和写通(Write through)。

    写回是指,仅当一个缓存块需要被替换回内存时,才将其内容写入内存。如果快取命中,则总是不用更新内存。为了减少内存写操作,缓存块通常还设有一个脏位(dirty bit),用以标识该块在被载入之后是否发生过更新。如果一个缓存块在被置换回内存之前从未被写入过,则可以免去回写操作。 

    写回的优点是节省了大量的写操作。这主要是因为,对一个数据块内不同单元的更新仅需一次写操作即可完成。这种内存带宽上的节省进一步降低了能耗,因此颇适用于嵌入式系统。

    写通是指,每当缓存接收到写数据指令,都直接将数据写回到内存。如果此数据地址也在缓存中,则必须同时更新缓存。由于这种设计会引发造成大量写内存操作,有必要设置一个缓冲来减少硬件冲突。这个缓冲称作写缓冲器(Write buffer),通常不超过4个快取Block大小。不过,出于同样的目的,写缓冲器也可以用于写回型缓存。

    写通较写回易于实现,并且能更简单地维持数据一致性。

    六、缓存的硬件实现

    缓存芯片通常采用速度较快的SRAM。一级缓存一般与处理器同片封装,二级缓存则不一定。一种实现是把标签存储集成到片内,而把数据存储放到片外。 

    缓存芯片通常采用SRAM(静态随机存取存储器)作为存储介质,因为SRAM的访问速度比DRAM(动态随机存取存储器)要快得多。SRAM可以在没有刷新操作的情况下维持数据,这使得它非常适合用于高速缓存。然而,SRAM的成本较高、密度较低,因此通常用于缓存,而不是整个内存系统。

    1. 一级缓存(L1 Cache)

    • 与处理器同片封装:L1缓存通常直接集成在CPU核心内部,以最大化访问速度。由于L1缓存离处理器核心非常近,数据访问速度非常快。
    • 存储结构:L1缓存由SRAM构成,每个核心通常拥有独立的L1缓存,分为指令缓存(L1I)和数据缓存(L1D),分别存储指令和数据,确保高速访问。
    • 容量:L1缓存的容量通常较小(一般为32KB-128KB),因为缓存越小,访问速度越快。

    2. 二级缓存(L2 Cache)

    • 与处理器同片封装或片外:L2缓存的设计不一定与处理器核心在同一片芯片上。早期的处理器将L2缓存集成到芯片内部,但随着技术发展,许多现代处理器将L2缓存放置在与CPU核心分开的芯片上(通常称为外部L2缓存)。这种设计可以通过提高缓存容量来提升性能,同时也能优化成本和散热问题。
    • 标签存储与数据存储分离:在一些设计中,L2缓存的标签(用于标识缓存中存储数据的内存位置)和数据存储是分开的。标签可能被存储在CPU芯片内部,而数据则被存储在外部缓存芯片中。这种设计方式可以降低访问延迟并提高缓存的整体效率。
    • 容量和速度:L2缓存比L1缓存大(通常为256KB-8MB),但其速度比L1慢。它可以缓存更多的数据,进一步减少访问主存的频率。

    3. 三级缓存(L3 Cache)

    • 共享设计:L3缓存通常是多个核心共享的,并且通常集成在芯片上(或在多核处理器的不同核心之间共享)。它的容量通常比L2缓存更大(通常为4MB-几十MB),但访问速度更慢。
    • SRAM与设计的妥协:尽管L3缓存的访问速度慢于L1和L2,但它仍然比主内存快得多。L3缓存的设计一般会在容量和速度之间找到一个平衡点,利用SRAM的优势减少对主存的访问。

    4. 缓存的性能影响

    • 访问延迟:L1缓存的访问延迟最短,L2稍长,而L3更长,因此设计时要根据需要在缓存层次中合理分配数据。处理器会优先访问L1缓存,然后是L2和L3缓存,最后才是主存。
    • 缓存一致性:在多核处理器中,L2和L3缓存可能是多个核心共享的,因此需要保证缓存一致性。为此,现代处理器采用了一致性协议(如MESI协议)来确保多个缓存中存储的数据保持一致。

    5. 设计折衷

    • 标签存储与数据存储分离:将标签和数据存储分开是一种优化策略,可以提高缓存访问效率,特别是在L2缓存中。标签存储与数据存储的分离减少了标签访问带来的开销,避免了缓存命中时对数据的额外延迟。
    • 片内与片外的折衷:L2和L3缓存采用片内或片外设计的折衷,主要是在速度、容量、成本和功耗之间进行权衡。片外设计(如将L2缓存放在芯片外)有助于降低制造成本和提升散热性能,但可能会牺牲一部分访问速度。

    总结:

    缓存的设计依赖于SRAM作为高速存储介质,一级缓存(L1)通常直接与CPU核心集成,而二级缓存(L2)可以集成在芯片内或外部。三级缓存(L3)则通常是多个核心共享的,容量更大但速度较慢。标签和数据存储分离的设计,帮助提高缓存的效率,减少数据访问延迟。每一层缓存的设计都是为了在速度、容量、成本、功耗之间找到最佳平衡,以提高整个系统的性能。

    七、多级缓存的引入动机和设计考虑

    7.1 引入动机

    介于处理器和内存二者之间的缓存有两个天然冲突的性能指标:速度和容积。如果只向处理器看齐而追求速度,则必然要靠减少容积来换取访问时间;如果只向内存看齐而追求容积,则必然以增加处理器的访问时间为牺牲。这种矛盾促使人们考虑使用多级缓存。

    在一个两级缓存体系中,一级缓存靠近处理器一侧,二级缓存靠近内存一侧。当一级缓存发生失效时,它向二级缓存发出请求。如果请求在二级缓存上命中,则数据交还给一级缓存;如失效,二级缓存进一步向内存发出请求。对于三级缓存可依此类推。

    通常,更接近内存的缓存有着更大容积,但是速度也更慢。值得注意的是,无论如何,低级缓存的局部命中率总是低于高级缓存。这是因为数据的时空局部性在一级缓存上基本上已经利用殆尽。

    这段话可以从缓存的局部性不同缓存层次的作用来理解。首先,让我们明确几个概念:

    • 局部性(Locality):指程序在访问数据时,倾向于访问存储在相近地址的内存位置。局部性分为时间局部性空间局部性
      • 时间局部性:如果某个数据最近被访问过,那么它很可能会再次被访问。
      • 空间局部性:如果某个数据被访问了,那么与其相邻的数据很可能也会被访问。
    • 理解低级缓存局部命中率低的原因
    1. 一级缓存(L1)和数据的时空局部性

      • L1缓存是离CPU核心最近的缓存,访问速度最快,容量最小。由于其存储容量有限(通常为32KB到128KB),它只能存储程序近期需要的最常访问的数据和指令。
      • 在程序运行过程中,数据访问通常具有较强的时空局部性,即程序访问的数据在时间上会有重复访问的倾向,或在空间上会访问相邻的数据。因此,L1缓存会尽量存储这些数据,以便快速访问。
      • 时间局部性空间局部性在L1缓存中得到了很好的利用,尤其是对频繁访问的局部数据
    2. L2和L3缓存的作用

      • 由于L2和L3缓存的容量比L1缓存要大得多,它们能够存储更多的数据,容纳更多的访问请求。相较于L1缓存,L2和L3缓存有更多的空间来存储不同部分的数据(如程序中不那么频繁但仍然需要的数据)。
      • 低级缓存(如L2、L3)主要负责处理那些不经常访问、空间更大但仍然属于程序可用数据范围的数据。这意味着它们需要缓存的数据可能不具备和L1缓存中的数据一样高的局部性。
    3. 为什么低级缓存的局部命中率较低

      • L1缓存已经“填满”了程序的热点数据:L1缓存通常会存储程序运行时最频繁访问的数据,这些数据有较强的时空局部性。因此,大部分程序在访问时都能从L1缓存中命中,L1缓存的命中率往往很高
      • L2和L3缓存缓存的是更广泛的数据:当程序访问的数据不再属于L1缓存的热数据范围时,它会转向L2和L3缓存。L2和L3缓存存储的数据可能覆盖更广泛的内存区域,包括一些程序不太频繁访问的部分。因此,L2和L3缓存的命中率会相对较低,因为它们在缓存更多不太常访问的数据时,局部性没有L1缓存中的数据那么强。
    • 总结

    这段话的意思是,L1缓存能够很好地利用数据的时空局部性,即频繁访问的数据在L1缓存中命中的机会很高。因为L1缓存的容量有限,它存储的是程序最热的数据,局部性已经被最大化利用。而L2和L3缓存由于存储更多的数据,涉及的数据不如L1缓存那样有强烈的局部性,因此它们的命中率相对较低。这就导致了低级缓存(L2、L3)的局部命中率低于高级缓存(L1)

    7.2 设计考虑

    虽然功能类似,但不同级别的缓存在设计和实现上也有不同之处。

    尽管一般而言,在存储体系结构中低级存储总是包含高级存储的全部数据,但对于多级缓存则未必。相反地,存在一种多级排他性(Multilevel exclusion)的设计。此种设计意指高级缓存中的内容和低级缓存的内容完全不相交。这样,如果一个高级缓存请求失效,并在次级缓存中命中的话,次级缓存会将命中数据和高级缓存中的一项进行交换,以保证排他性。

    多级排他性的好处是在存储预算有限的前提下可以让低级缓存更多地存储数据。否则低级缓存的大量空间将不得不用于覆盖高级缓存中的数据,这无益于提高低级缓存的命中率。

    当然,也可以如内存对缓存般,使用多级包容性(Multilevel inclusion)设计。这种设计的优点是比较容易方便查看缓存和内存间的数据一致性,因为仅检查最低一级缓存即可。对于多级排他性缓存这种检查必须在各级上分别进行。这种设计的一个主要缺点是,一旦低级缓存由于失效而被更新,就必须相应更新在高级缓存上所有对应的数据。因此,通常令各级缓存的缓存块大小一致,从而减少低级对高级的不必要更新。

    此外,各级缓存的写策略也不相同。对于一个两级缓存系统,一级缓存可能会使用写通来简化实现,而二级缓存使用写回确保数据一致性。

    维基百科对CPU缓存的解读: https://zh.wikipedia.org/zh-cn/CPU%E7%BC%93%E5%AD%98

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

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

    相关文章

    神经网络八股(3)

    1.什么是梯度消失和梯度爆炸 梯度消失是指梯度在反向传播的过程中逐渐变小&#xff0c;最终趋近于零&#xff0c;这会导致靠前层的神经网络层权重参数更新缓慢&#xff0c;甚至不更新&#xff0c;学习不到有用的特征。 梯度爆炸是指梯度在方向传播过程中逐渐变大&#xff0c;…

    SmartMediakit之音视频直播技术的极致体验与广泛应用

    引言 在数字化时代&#xff0c;音视频直播技术已经深入到各个行业和领域&#xff0c;成为信息传递和交流的重要手段。视沃科技自2015年成立以来&#xff0c;一直致力于为传统行业提供极致体验的音视频直播技术解决方案&#xff0c;其旗下的大牛直播SDK凭借强大的功能和卓越的性…

    【R包】tidyplots----取代ggplot2的科研绘图利器

    文章目录 介绍安装Usage文档参考 介绍 tidyplots----取代ggplot2的科研绘图利器。tidyplots的目标是简化为科学论文准备出版的情节的创建。它允许使用一致和直观的语法逐渐添加&#xff0c;删除和调整情节组件。 安装 You can install the released version of tidyplots fro…

    DeepSeek 15天指导手册——从入门到精通 PDF(附下载)

    DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载&#xff1a; https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…

    微信小程序实现拉卡拉支付

    功能需求&#xff1a;拉卡拉支付&#xff08;通过跳转拉卡拉平台进行支付&#xff09;&#xff0c;他人支付&#xff08;通过链接进行平台跳转支付&#xff09; 1.支付操作 //支付 const onCanStartPay async (obj) > {uni.showLoading({mask: true})// 支付接口获取需要传…

    Unity 第三人称人物切动画时人物莫名旋转

    前提: 使用Starter Asset包中的第三人称插件包. 在给3D角色的动画器增加新动画时, 发现进入新动画会让角色莫名转动. 观察后发现是动画强行将朝向掰"正", 人物动画在进行时朝向会一直变化, 这使得动作非常的怪异. 对系动画进行以下处理后, 将可以解决这种不自然: 选…

    启动Redis报错记录

    突然启动Redis就报了个错&#xff1a;‘Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。‘ 查了下解决方案&#xff0c;应该是6379端口已绑定&#xff0c;服务没有关闭。 需要输入命令redis-cli 再输入shutdown 但又出现了新的问题&…

    自然语言处理NLP 04案例——苏宁易购优质评论与差评分析

    上一篇文章&#xff0c;我们爬取了苏宁易购平台某产品的优质评价和差评&#xff0c;今天我们对优质评价与差评进行分析 selenium爬取苏宁易购平台某产品的评论-CSDN博客 目录 1. 数据加载 2. 中文分词 3. 停用词处理 4. 数据标注与合并 5. 数据集划分 6. 文本特征提取 …

    图片爬取案例

    修改前的代码 但是总显示“失败” 原因是 修改之后的代码 import requests import os from urllib.parse import unquote# 原始URL url https://cn.bing.com/images/search?viewdetailV2&ccidTnImuvQ0&id5AE65CE4BE05EE7A79A73EEFA37578E87AE19421&thidOIP.TnI…

    官方文档学习TArray容器

    一.TArray中的元素相等 1.重载一下 元素中的 运算符&#xff0c;有时需要重载排序。接下来&#xff0c;我们将id 作为判断结构体的标识。 定义结构体 USTRUCT() struct FXGEqualStructInfo {GENERATED_USTRUCT_BODY() public:FXGEqualStructInfo(){};FXGEqualStructInfo(in…

    Web刷题之PolarDN(中等)

    1.到底给不给flag呢 代码审计 一道典型的php变量覆盖漏洞 相关知识 什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有&#xff1a;$$使用不当&#xff0c;extract()函数使用不当&#xff0c;parse_str()函数使用不当&…

    学习笔记-250222

    论文&#xff1a; Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models 主要研究llm在图像分类中的能力&#xff0c;当提示输入目标类别时&#xff0c;llm能够生成相关的描述以及相应的结构化关系。 1.首先利用llm从普通的描述中获…

    Unity游戏制作中的C#基础(1)界面操作基础

    1.脚本有关注意事项 &#xff08;1&#xff09;.进入项目之后&#xff0c;一般创建一个文件夹Scripts用来存放c#脚本&#xff1b; &#xff08;2&#xff09;.在Scripts中创建脚本&#xff0c;双击脚本&#xff0c;进入VS编辑器&#xff0c;有如下结构&#xff1a; start&#…

    为什么要将PDF转换为CSV?CSV是Excel吗?

    在企业和数据管理的日常工作中&#xff0c;PDF文件和CSV文件承担着各自的任务。PDF通常用于传输和展示静态的文档&#xff0c;而CSV因其简洁、易操作的特性&#xff0c;广泛应用于数据存储和交换。如果需要从PDF中提取、分析或处理数据&#xff0c;转换为CSV格式可能是一个高效…

    Android KMP初探

    Android KMP初探 前言&#xff1a; 最近线上听了Kotlin官网举行的KMP会议&#xff0c;感觉听神奇的&#xff0c;于是就把官方demo下载下来尝试了一下&#xff0c;下载插件和所需要的依赖都用了很久&#xff0c;但是发现里面的代码很少&#xff0c;于是尝试自己手写了一下&…

    网络安全之Web后端PHP

    目录 一、PHP基础语法 1.PHP基础 &#xff08;1&#xff09;php的优点 &#xff08;2&#xff09;PhpStorm的优点 2.PHP基本语法 3.PHP变量 4.PHP运算符 二、PHP流控与数组 1.php流程控制语句以及循环 &#xff08;1&#xff09;if 语句 &#xff08;2&#xff09;if…

    Redis——用户签到BitMap,UV统计

    目录 BitMap 使用场景 1. 用户签到系统 2. 用户行为标记 3. 布隆过滤器&#xff08;Bloom Filter&#xff09; BitMap介绍 Redis中的使用 Redis功能示例 添加&#xff1a; 获取&#xff1a; 批量获取&#xff1a; java中实现 统计本月连续签到次数 UV统计 UV 统计…

    pycharm技巧--鼠标滚轮放大或缩小 Pycharm 字体大小

    1、鼠标滚轮调整字体 设置 Ctrl 鼠标滚轮调整字体大小 备注&#xff1a; 第一个是活动窗口&#xff0c;即缩放当前窗口 第二个是所有编辑器窗口&#xff0c;即缩放所有窗口的字体 2、插件 汉化包&#xff1a; Chinese Simplified 包

    数字信任的底层逻辑:密码学核心技术与现实应用

    安全和密码学 --The Missing Semester of Your CS Education 目录 熵与密码强度密码散列函数密钥体系 3.1 对称加密 3.2 非对称加密信任模型对比典型应用案例安全实践建议扩展练习杂项 密码学是构建数字信任的基石。 本文浅析密码学在现实工具中的应用&#xff0c;涵盖 1&…

    全面理解-深拷贝与浅拷贝

    在 C 中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09; 和 浅拷贝&#xff08;Shallow Copy&#xff09; 是两种完全不同的对象拷贝策略&#xff0c;主要区别在于对指针和动态分配资源的处理方式。正确理解二者的区别是避免内存泄漏、悬空指针和程序崩溃的关键。 一、核…