操作系统 内存管理——针对实习面试

目录

  • 操作系统 内存管理
    • 什么是虚拟内存?什么是物理内存?
    • 解释虚拟内存和物理内存的区别
    • 什么是分页式存储?什么是分段式存储?
    • 解释分页式存储和分段式存储的区别
    • 什么是内存碎片?
    • 描述几种常见的内存分配算法
    • 描述几种常见的页替换算法

操作系统 内存管理

在这里插入图片描述

什么是虚拟内存?什么是物理内存?

  1. 物理内存
    • 定义:物理内存是计算机中实实在在存在的存储部件,你可以把它想象成一个个小的存储格子。这些格子用来存放计算机正在运行的程序和数据。就像是一个真实的仓库,里面的每一个货架(存储单元)都有自己的地址,CPU可以通过这些地址快速地找到它想要的数据。例如,当你打开一个文字处理软件,软件的程序代码和你正在编辑的文档内容的一部分就存放在物理内存中。
    • 特点
      • 容量有限:物理内存的大小取决于你计算机安装的内存条容量。比如,你的电脑可能安装了8GB、16GB或者32GB的物理内存,这是硬件决定的,不能随意改变(除非你更换内存条)。
      • 速度快:它和CPU之间有高速的数据通道,数据的读取和写入速度非常快。这就好比仓库就在工厂(CPU)旁边,货物(数据)的运输速度很快。
  2. 虚拟内存
    • 定义:虚拟内存是一种技术手段,它让程序感觉自己拥有比实际物理内存更多的内存空间。操作系统会在硬盘上划出一块区域来当作虚拟内存。当物理内存不够用的时候,操作系统就会把物理内存中暂时不用的数据转移到虚拟内存中。从程序的角度看,就好像它一直有足够的内存可以使用。例如,你同时打开了很多程序,物理内存快满了,系统就会把一些暂时不活跃的程序数据(比如后台运行但当前没使用的程序)从物理内存搬到硬盘上的虚拟内存区域。
    • 特点
      • 容量可灵活扩展:虚拟内存的大小可以通过操作系统的设置和硬盘的剩余空间来调整。理论上,只要硬盘空间足够,虚拟内存可以设置得很大。不过,由于硬盘的读写速度比物理内存慢很多,所以不能无限制地依赖虚拟内存。
      • 速度相对较慢:因为虚拟内存的数据实际存储在硬盘上,而硬盘的读写速度比物理内存慢得多。当需要使用虚拟内存中的数据时,要先从硬盘把数据读取到物理内存中,这就像要从远处的大仓库(硬盘)把货物运到工厂旁边的小仓库(物理内存),然后CPU才能使用,这个过程会比较耗时。

解释虚拟内存和物理内存的区别

  1. 本质和存在形式
    • 物理内存
      • 物理内存是实实在在的硬件,是计算机内部的一组芯片,就像一个个小的存储盒子。这些盒子有自己的物理地址,数据就存储在这些盒子里。它就像是一个实体的书架,每个格子(存储单元)都有固定的位置,可以直接在上面存放和查找书籍(数据)。
    • 虚拟内存
      • 虚拟内存不是一个物理设备,而是操作系统通过软件技术在硬盘上划分出来的一块空间。它更像是一个虚拟的仓库概念,利用硬盘的空间来模拟内存的功能。可以把它想象成在硬盘这个大仓库里,专门划出一个区域,用来在物理内存不够时,暂时存放一些本来应该在物理内存中的数据。
  2. 访问速度
    • 物理内存
      • 物理内存的访问速度极快。因为它和CPU通过高速的内存总线直接相连,数据的传输就像在一条高速公路上行驶的汽车,能够在很短的时间内(通常是纳秒级别)完成读取和写入操作。就好像书架就在你的身边,你可以很快地拿到或放回书籍。
    • 虚拟内存
      • 虚拟内存的访问速度相比之下就慢很多。由于它的数据存储在硬盘上,当需要访问虚拟内存中的数据时,硬盘的机械部件(如磁头)需要移动来定位数据,这个过程就像一个机器人在巨大的仓库里寻找货物,速度受到硬盘的转速、寻道时间等因素的限制,通常是毫秒级别,比物理内存慢好几个数量级。
  3. 容量限制
    • 物理内存
      • 物理内存的容量是由计算机的硬件配置决定的。你购买计算机时,内存条的容量就决定了物理内存的大小。例如,你的电脑安装了两根8GB的内存条,那么物理内存就是16GB。这个容量在硬件不更换的情况下是固定的,而且受到主板支持的最大内存容量、内存插槽数量等因素的限制。
    • 虚拟内存
      • 虚拟内存的容量主要受限于硬盘的可用空间和操作系统的设置。理论上,只要硬盘还有足够的空间,就可以设置出较大的虚拟内存。不过,过大的虚拟内存可能会导致硬盘频繁读写,影响系统性能。例如,你的硬盘有1TB的空间,在系统允许的范围内,你可以根据实际需要,为虚拟内存分配一定的空间,如2GB、4GB等。
  4. 数据存储的安全性和稳定性
    • 物理内存
      • 物理内存相对比较稳定,但数据是易失性的。只要计算机的电源保持稳定,数据就能正常存储和访问。不过,如果突然断电,物理内存中的数据就会丢失。就好像你在书架上整理书籍,只要房间(计算机系统)正常,书籍(数据)就会在书架(物理内存)上好好的;一旦停电,房间黑了,书架上的书籍位置(数据)就会混乱丢失。
    • 虚拟内存
      • 虚拟内存的数据存储在硬盘上,硬盘的数据存储相对来说更持久。即使计算机突然断电,硬盘上的数据(包括虚拟内存的数据)通常不会丢失。不过,硬盘可能会因为物理损坏(如磁盘划伤、磁头故障)或者文件系统的问题而导致数据损坏,就像仓库可能会因为火灾、水淹等意外情况损坏货物一样。
  5. 数据存储的单元和管理方式
    • 物理内存
      • 物理内存的存储单元是按照固定的物理地址来划分的,由硬件和操作系统的内存管理模块共同管理。它以字节为单位进行编址,操作系统通过内存管理单元(MMU)将虚拟地址转换为物理地址,从而准确地在物理内存中存储和读取数据,就像图书馆管理员通过书籍的编号(物理地址)来管理书架上的藏书一样。
    • 虚拟内存
      • 虚拟内存的管理更加灵活复杂。操作系统会把虚拟内存划分成一个个的页面(Page),与物理内存的页面进行映射。它以页面为单位进行管理,当需要访问虚拟内存中的数据时,操作系统会检查页面是否在物理内存中,如果不在,就会从硬盘把页面数据加载到物理内存中。这就好比仓库管理员把虚拟仓库(虚拟内存)划分成不同的区域(页面),根据需要把货物(数据)在虚拟仓库和实体仓库(物理内存)之间搬运。

什么是分页式存储?什么是分段式存储?

  1. 分页式存储
    • 基本原理
      • 分页式存储将物理内存和虚拟内存都划分成固定大小的单元,这些单元称为“页”(Page)。例如,在常见的系统中,页的大小可能是4KB。操作系统会维护一个页表(Page Table),用于记录虚拟页和物理页之间的映射关系。
    • 示例解释
      • 假设我们有一个简单的虚拟内存空间,被划分为4个虚拟页(编号为0 - 3),物理内存也被划分为4个物理页(编号为0 - 3)。当一个程序需要访问虚拟内存中的某个地址时,系统首先通过计算确定该地址位于哪个虚拟页。例如,一个虚拟地址对应的虚拟页号是2,系统就会查找页表,看虚拟页2对应的是哪个物理页。如果页表显示虚拟页2映射到物理页3,那么系统就会从物理页3中获取所需的数据。
    • 简单示意图
      • 假设虚拟内存中有4个页(VP0 - VP3),物理内存中有4个页(PP0 - PP3),页表如下:
虚拟页(VP)物理页(PP)
VP0PP0
VP1PP1
VP2PP3
VP3PP2
  • 当程序要访问VP2中的数据时,系统通过页表知道要从PP3中获取。
  • 特点
    • 固定大小:页的大小是固定的,这使得内存分配和管理相对简单。因为操作系统只需要处理固定大小的单元,例如,在分配内存时,只要找到足够数量的空闲页即可。
    • 非连续存储:物理页在物理内存中的位置不需要连续。只要页表能够正确地映射虚拟页和物理页的关系,程序就可以正常运行。这提高了内存的利用率,因为系统可以使用分散的空闲物理页来满足内存请求。
  1. 分段式存储
    • 基本原理
      • 分段式存储是按照程序的逻辑结构来划分内存空间的。程序的地址空间和内存空间被分为不同的段(Segment),如代码段、数据段、堆栈段等。每个段都有自己的名称和长度,并且可以独立地增长或缩小。
    • 示例解释
      • 以一个简单的程序为例,它有一个代码段(存放程序的指令)、一个数据段(存放程序的全局变量)和一个堆栈段(用于函数调用和局部变量)。代码段可能是只读的,数据段可以读写,堆栈段根据函数的调用和返回动态地增长和缩小。例如,一个程序的代码段从内存地址0x1000开始,长度为1000字节;数据段从0x2000开始,长度为2000字节;堆栈段从0x3000开始,初始长度为1000字节。当函数调用时,堆栈段可能会根据需要增加长度。
    • 简单示意图
      • 假设有一个程序分为三个段:
      • 代码段(CS):从地址0x1000开始,长度为1000字节。
      • 数据段(DS):从地址0x2000开始,长度为2000字节。
      • 堆栈段(SS):从地址0x3000开始,长度为1000字节。
      • 可以简单地表示为:
段名称起始地址长度
代码段(CS)0x10001000字节
数据段(DS)0x20002000字节
堆栈段(SS)0x30001000字节
  • 特点
    • 逻辑结构清晰:根据程序的逻辑结构划分段,使得程序的不同部分(如代码、数据、堆栈)在内存中有相对独立的空间,方便程序的编写、编译和理解。例如,程序员在编写程序时,可以清楚地知道不同类型的数据和指令存储在不同的段中。
    • 段的动态性:各段可以根据程序的运行情况动态地增长或缩小。比如,在函数调用频繁的程序中,堆栈段会随着函数调用和返回而不断变化大小,以满足局部变量的存储需求。
    • 连续存储:通常一个段在内存中是连续存放的。这是因为段是按照程序的逻辑单元划分的,连续存储有助于提高程序的运行效率。例如,代码段的指令通常是顺序执行的,连续存储可以减少指令获取的时间。

解释分页式存储和分段式存储的区别

  1. 划分方式
    • 分页式存储
      • 分页式存储是将内存空间(包括虚拟内存和物理内存)划分为固定大小的页。例如,常见的页大小为4KB或8KB等。这种划分与程序的逻辑结构无关,完全是基于内存管理的便利性。就像把一个大仓库划分成一个个大小相同的小储物格,不管里面存放的货物(数据)是什么类型,每个储物格大小一样。
    • 分段式存储
      • 分段式存储是按照程序的逻辑结构来划分内存空间。比如,将程序分为代码段、数据段、堆栈段等。不同的段有不同的功能,大小也不固定,是根据程序实际的需求来确定的。这就好比把仓库按照货物的种类划分区域,有存放工具(代码段)的区域、存放原材料(数据段)的区域和存放半成品(堆栈段)的区域,每个区域的大小取决于相应货物的多少。
  2. 地址空间连续性
    • 分页式存储
      • 分页式存储中,物理页在物理内存中的位置不需要连续。只要通过页表正确地维护虚拟页和物理页之间的映射关系,程序就能正常访问内存。例如,虚拟页1可能映射到物理内存中的第5页,虚拟页2可能映射到物理内存中的第10页。这种非连续的存储方式可以更灵活地利用物理内存中的空闲空间。
    • 分段式存储
      • 在分段式存储中,一个段在内存中通常是连续存放的。因为段是按照程序的逻辑单元划分的,比如代码段的指令通常是顺序执行的,为了保证程序执行的效率,会将其连续存储。例如,一个程序的代码段从内存地址0x1000开始,长度为1000字节,那么这段代码在内存中就是从0x1000到0x13FF连续存放的。
  3. 内存管理方式
    • 分页式存储
      • 分页式存储主要通过页表来管理。页表记录了虚拟页和物理页之间的映射关系。当程序访问虚拟内存中的某个地址时,系统会根据页表找到对应的物理页。内存的分配和回收以页为单位进行。例如,当一个程序需要内存时,系统会分配一定数量的页给它;当程序结束时,回收这些页。这种管理方式相对简单,因为页的大小固定,便于操作系统进行管理。
    • 分段式存储
      • 分段式存储需要考虑段的逻辑结构和功能。不同的段有不同的属性,如代码段通常是只读的,数据段可以读写,堆栈段具有动态增长和收缩的特性。操作系统需要根据这些特点来管理段的分配、增长、保护和共享等。例如,对于只读的代码段,操作系统要防止程序意外地修改它;对于堆栈段,要动态地调整其大小以适应函数调用和返回的需求。
  4. 对程序的影响
    • 分页式存储
      • 分页式存储对程序是透明的,程序不需要知道内存是如何分页的。程序只使用虚拟内存地址,由操作系统和硬件(内存管理单元)来处理虚拟地址到物理地址的转换。这种方式使得程序的编写和编译相对简单,因为程序不需要考虑内存的物理结构。
    • 分段式存储
      • 分段式存储与程序的逻辑结构紧密相关。程序员在编写程序时,需要考虑程序的不同部分(如代码、数据、堆栈)应该如何划分到不同的段中。在编译程序时,编译器也需要按照段的要求来生成目标代码。这种方式可以使程序的结构更加清晰,但也要求程序员和编译器对内存的分段有一定的了解。
  5. 内存碎片问题
    • 分页式存储
      • 分页式存储可能会产生内部碎片。因为页的大小是固定的,当一个程序请求的内存大小不是页大小的整数倍时,最后一页可能会有部分空间没有被利用。例如,一个程序需要13KB的内存,页大小为4KB,那么分配4页(16KB),最后一页就会有3KB的内部碎片。
    • 分段式存储
      • 分段式存储可能会产生外部碎片。由于段的大小不固定,在内存的分配和回收过程中,可能会出现一些不连续的小空闲分区。当有一个新的段请求内存时,这些小空闲分区可能无法满足需求。例如,内存中有三个空闲分区,大小分别为2KB、3KB和4KB,当有一个需要10KB的程序段请求内存时,这些空闲分区无法满足请求。

什么是内存碎片?

内存碎片是指在计算机的内存管理过程中,由于内存的分配和释放不均匀或不合理,导致内存中出现大量小的、不连续的、无法被有效利用的内存块。这些碎片会降低内存的使用效率,影响程序的运行性能。内存碎片主要分为两种类型:

  1. 内部碎片(Internal Fragmentation)

    • 发生在内存分配过程中,当分配给进程的内存块比请求的稍大时,多出来的那部分内存(即分配的内存块与请求大小之间的差值)就形成了内部碎片。这种碎片存在于已分配的内存块内部,因此得名内部碎片。
    • 内部碎片是不可避免的,因为操作系统通常按照某个固定大小(如4KB、8KB等)来分配内存页,而进程请求的内存大小可能不是内存页大小的整数倍。
  2. 外部碎片(External Fragmentation)

    • 发生在内存中存在许多小的、不连续的空闲内存块,这些空闲内存块太小,无法满足新的内存分配请求,即使总的空闲内存量可能足够大。这种碎片存在于已分配内存块之间,因此得名外部碎片。
    • 外部碎片会导致内存的有效利用率降低,因为即使有足够的空闲内存,但由于这些内存不连续,无法被有效利用。

内存碎片的产生原因主要包括:

  • 不均匀的内存分配和释放,导致空闲内存分散在内存的不同区域。
  • 内存分配算法的不足,如首次适应、最佳适应等算法可能导致内存碎片的累积。
  • 进程运行过程中动态内存需求的变化,可能导致频繁的内存分配和释放。

为了减少内存碎片,操作系统和内存分配算法采取了多种策略,如:

  • 使用伙伴系统(Buddy System)来管理内存,减少外部碎片。
  • 实现内存压缩和内存整理功能,以减少碎片的产生。
  • 使用slab分配器来管理内核对象,减少内部碎片。

描述几种常见的内存分配算法

内存分配算法是操作系统中用于管理内存空间的关键机制。以下是一些常见的内存分配算法:

  1. 首次适应(First Fit)

    • 描述:首次适应算法从内存的开始位置开始搜索,直到找到足够大的空闲区域来满足内存分配请求。如果找到的空闲区域比请求的内存大,则将该区域分割成两部分,一部分正好满足请求,另一部分作为新的空闲区域。
    • 优点:实现简单。
    • 缺点:可能导致内存的前半部分被分割成许多小的空闲区域,而后半部分存在较大的空闲区域,造成内存利用率低。
  2. 最佳适应(Best Fit)

    • 描述:最佳适应算法搜索整个内存,找到能够满足请求的最小空闲区域。这样可以减少剩余空闲区域的大小,从而减少内存浪费。
    • 优点:减少内存浪费,提高内存利用率。
    • 缺点:可能会导致许多小的空闲区域,增加内存碎片。
  3. 最坏适应(Worst Fit)

    • 描述:最坏适应算法总是选择最大的空闲区域来满足内存请求。这有助于减少大的空闲区域的数量,从而减少外部碎片。
    • 优点:减少外部碎片。
    • 缺点:可能会留下许多小的空闲区域,导致内存利用率低。
  4. 下次适应(Next Fit)

    • 描述:下次适应算法从上次搜索结束的地方开始搜索,直到找到足够大的空闲区域。这种方式简化了算法的实现,因为它不需要每次都从头开始搜索。
    • 优点:实现简单,性能较好。
    • 缺点:可能会导致内存使用不均匀,类似于首次适应算法。
  5. 伙伴系统(Buddy System)

    • 描述:伙伴系统将内存分割成2的幂次方大小的块,并根据请求的大小分配相应大小的块。如果需要的内存大小不是2的幂次方,它会分配下一个更大的2的幂次方大小的块,并将剩余的部分作为未使用的块保留。
    • 优点:减少外部碎片,分配和回收速度快。
    • 缺点:可能会产生内部碎片。
  6. slab分配器

    • 描述:slab分配器是一种专门用于管理内核对象(如进程描述符、缓冲区等)的内存分配机制。它通过缓存和对象重用来减少内存分配和回收的开销。
    • 优点:提高内核对象分配和回收的效率,减少内存碎片。
    • 缺点:主要用于内核对象,不适用于一般应用程序。

这些算法各有优缺点,操作系统会根据具体需求选择合适的内存分配算法。在实际应用中,这些算法可能会结合使用,以提高内存管理的效率和效果。

描述几种常见的页替换算法

页替换算法是操作系统内存管理中用于决定哪些页面应该被替换出物理内存的算法。以下是一些常见的页替换算法:

  1. 最近最少使用(Least Recently Used, LRU)

    • 描述:LRU算法会替换最长时间未被访问的页面。它基于这样一个假设:最近被访问的页面在未来被访问的可能性更高。
    • 优点:理论上是最优的页替换算法,因为它可以预测未来页面的访问模式。
    • 缺点:实现起来比较复杂,需要跟踪每个页面的访问历史。
  2. 先进先出(First-In, First-Out, FIFO)

    • 描述:FIFO算法会替换最先进入内存的页面。它假设最早分配的页面将最先被替换。
    • 优点:实现简单。
    • 缺点:可能导致Belady’s Anomaly(贝拉迪异常),即增加页面数反而增加了缺页次数。
  3. 最近最久未使用(Longest Future Unused, LFU)

    • 描述:LFU算法会替换在未来最长时间内不会被使用的页面。与LRU不同,它关注的是未来的访问模式。
    • 优点:可以预测页面在未来的使用情况。
    • 缺点:实现复杂,需要预测未来的页面访问。
  4. 时钟(Clock)算法

    • 描述:时钟算法是FIFO算法的一种改进,使用一个循环列表来记录页面的使用情况。每个页面都有一个使用位,当页面被访问时,该位被设置。当需要替换页面时,算法会扫描列表,跳过使用位为1的页面,直到找到一个使用位为0的页面。
    • 优点:实现简单,避免了Belady’s Anomaly。
    • 缺点:可能不如LRU算法那样精确地反映页面的使用情况。
  5. 随机替换(Random)

    • 描述:随机替换算法简单地从页面框中随机选择一个页面进行替换。
    • 优点:实现简单。
    • 缺点:没有考虑页面的使用频率和访问模式,可能导致性能不佳。
  6. 最优替换(Optimal)

    • 描述:最优替换算法理论上可以完全避免页面错误,它会选择将来不会被使用,或者在最长时间内不会被访问的页面进行替换。
    • 优点:可以完全避免页面错误。
    • 缺点:实现复杂,需要知道未来的页面访问序列,这在实际操作中是不可能的。
  7. 不最近使用(Not Recently Used, NRU)

    • 描述:NRU算法使用两个位来记录页面的使用情况:一个是修改位(Modified),表示页面是否被修改;另一个是访问位(Referenced),表示页面是否被访问。页面的选择基于这两个位的组合。
    • 优点:比随机替换算法更合理。
    • 缺点:实现复杂度介于LRU和FIFO之间。

每种页替换算法都有其适用场景和优缺点,操作系统会根据具体需求选择合适的算法。在实际应用中,这些算法可能会结合使用,以提高内存管理的效率和效果。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源免费的 分布式配置中心 介绍 与 选型 建议

分布式配置中心的应用场景介绍 在微服务架构中,配置管理变得尤为复杂。首先,我们可以想象下,如果没有配置中心,我们的项目可能是这样的:不同环境的配置文件都放在项目里面,部署时可以通过启动参数来指定使…

Linux入门攻坚——39、Nginx入门

Nginx:engine X Tengine:淘宝改进维护的版本 Registry: 使用了libevent库:高性能的网络库 epoll()函数 Nginx特性: 模块化设计、较好的扩展性;(但不支持动态加载模块功能&#…

Asp.net core Autofac 案例 注入、AOP 启用接口代理拦截 启用 类代理拦截=== 只会拦截虚方法

资料 core 实现autofac 》》》 安装 如下工具包 安装之后 如出现 这种 》》》编写 AOP类 using Castle.DynamicProxy; using System.Diagnostics;namespace Web01.AOP {/// <summary>/// 日志记录/// </summary>public class LoggingInterceptor : IInterc…

网络安全事件管理

一、背景 信息化技术的迅速发展已经极大地改变了人们的生活&#xff0c;网络安全威胁也日益多元化和复杂化。传统的网络安全防护手段难以应对当前繁杂的网络安全问题&#xff0c;构建主动防御的安全整体解决方案将更有利于防范未知的网络安全威胁。 国内外的安全事件在不断增…

详谈面试题:Vue、React为什么使用虚拟DOM

虚拟DOM是一种在前端框架中广泛使用的技术&#xff0c;它可以提升开发效率。那么国外流行的框架svelte没有使用虚拟DOM&#xff0c;而是直接操作真实DOM&#xff0c;效率依然很高。为什么Vue和React不采用这种方式呢&#xff1f; 目录 一、框架设计 二、解耦运行环境 三、总…

前端JavaScript(一)---基本介绍

Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言&#xff0c;主要目的是为了解决服务器端语言&#xff0c;比如Perl&#xff0c;遗留的速度问题&#xff0c;为客户提供更流畅的浏览效果。当时服务端需要对…

(免费送源码)计算机毕业设计原创定制:Java+B/S+SSM+Web前端开发技术+IDEA+MySQL+Navicat 有风小院

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对有风小院等问题&#xff0c;对有风小院信息…

Soul App创始人张璐团队亮相GITEX GLOBAL 2024,展示多模态AI的交互创新

随着全球AI领域的竞争加剧,越来越多的科技巨头和创新企业纷纷致力于多模态AI的开发。2024年10月14日至18日,GITEX GLOBAL海湾信息技术博览会在迪拜举行,吸引了超过6700家全球科技巨头和创新公司参与,展示了智能互联、人工智能等领域的新成果。 此次展会中,Soul App创始人张璐团…

新版布谷直播软件源码开发搭建功能更新明细

即将步入2025年也就是山东布谷科技专注直播系统开发,直播软件源码出售开发搭建等业务第9年,山东布谷科技不断更新直播软件功能&#xff0c;以适应当前新市场环境下的新要求。山东布谷科技始终秉承初心&#xff0c;做一款符合广大客户需求的直播系统软件。支持广大客户提交更多个…

Dockerfile打包部署

Dockerfile打包 先找到打包完的目录下创建一个Dockerfile文件 touch Dockerfile 进去文件内编写 vim Dockerfile # 基础镜像 FROM openjdk:8 # author MAINTAINER yxh # 挂载目录 VOLUME /home/project # 创建目录 RUN mkdir -p /home/project # 指定路径 WORKDIR /home/pr…

c++趣味编程玩转物联网:基于树莓派Pico控制有源蜂鸣器

有源蜂鸣器是一种简单高效的声音输出设备&#xff0c;广泛应用于电子报警器、玩具、计时器等领域。在本项目中&#xff0c;我们结合树莓派Pico开发板&#xff0c;通过C代码控制有源蜂鸣器发出“滴滴”声&#xff0c;并解析其中涉及的关键技术点和硬件知识。 一、项目概述 1. 项…

【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化?

【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化&#xff1f; 重要性&#xff1a;★★ NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用&am…

路由引入中次优路由和路由环路问题

A公司用的是IS-IS&#xff0c;B公司用的是OSPF&#xff0c;现在这两个公司要合并&#xff0c;网络要相通 项目目标 前期准备 配置IP地址&#xff1a;完成IP地址规划&#xff0c;A公司和B公司内部网络通过路由器R2和R4环回接口模拟。配置路由器接口的IP地址并测试所有直连链路的…

shell脚本基础学习_总结篇(完结)

细致观看可以&#xff0c;访问shell脚本学习专栏&#xff0c;对应章节会有配图https://blog.csdn.net/2201_75446043/category_12833287.html?spm1001.2014.3001.5482 导语 一、shell脚本简介 1. 定义&#xff1a; 2. 主要特点&#xff1a; 3. shell脚本的基本结构 4. S…

光伏功率预测!Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型时序预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量时序光伏功率预测 (Matlab2023b 多输入单输出) 1.程序已经调试好&#xff0c;替换数据集后&#xff0c;仅运行一个main即可运行&#xff0c;数据格式…

Postman定义公共函数

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman定义公共函数 在postman中&#xff0c;如下面的代码&#xff1a; 1、返回元素是否与预期值一致 var assertEqual(name,actual,expected)>{tests[…

SpringAI:Java 开发的智能新利器

一、SpringAI 简介 随着人工智能技术的飞速发展&#xff0c;越来越多的开发者开始探索如何将 AI 能力集成到现有的应用中来提升产品的智能化水平。Spring AI 正是为 Java 开发者提供的一款强大的 AI 框架&#xff0c;使得这一集成过程变得前所未有的简单和高效。 本文将深入探…

javaweb-day02-JS(javascript)

1.JavaScript引入 &#xff08;1&#xff09;引入方式 2.JS语法 2.1 书写语法 2.2 变量 &#xff08;1&#xff09;var关键字定义的是全局变量&#xff1b; &#xff08;2&#xff09;可以重复声明&#xff1b; 2.3 数据类型&运算符 &#xff08;1&#xff09;数据类型…

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【三】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

七牛云AIGC内容安全方案助力企业合规创新

随着人工智能生成内容(AIGC)技术的飞速发展,内容审核的难度也随之急剧上升。在传统审核场景中,涉及色情、政治、恐怖主义等内容的标准相对清晰明确,但在AIGC的应用场景中,这些界限变得模糊且难以界定。用户可能通过交互性引导AI生成违规内容,为审核工作带来了前所未有的不可预测…