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

操作系统 3.6-内存换出

换出算法总览

页面置换算法

  1. FIFO(先进先出)

    • 最简单的页面置换算法,淘汰最早进入内存的页面。

    • 优点:实现简单。

    • 缺点:可能会导致Belady异常,即增加内存反而降低性能。如果刚换入的页面马上又要换出,FIFO的性能会很差。

  2. MIN(最小使用时间)

    • 理论上的最优算法,淘汰预计在未来最长时间不会被使用的页面。

    • 优点:理论上最优,可以保证最低的缺页率。

    • 缺点:实现复杂,因为需要预测页面未来的使用情况。

  3. LRU(最近最少使用)

    • 淘汰最长时间未被访问的页面。

    • 优点:性能接近最优,实现相对简单。

    • 缺点:需要跟踪每个页面的使用历史,增加了系统开销。

FIFO

在操作系统中,FIFO(先进先出)页面置换算法是一种常见的页面置换策略

FIFO工作流程

FIFO(先进先出)页面置换算法是一种简单的页面置换策略,它基于这样一个原则:最早进入内存的页面将是最早被替换出去的页面。这种算法易于实现,但可能不是最高效的页面置换策略。下面是FIFO页面置换算法的工作流程:

  1. 页面命中

    • 如果页面已经在内存中,那么这是一个页面命中(page hit),不需要进行页面置换。

  2. 页面缺失

    • 如果页面不在内存中,那么这是一个页面缺失(page fault),需要进行页面置换。

    • 检查是否还有空的页框可用。如果有,将新页面加载到空的页框中。

    • 如果没有空的页框,根据FIFO算法,选择队列中最早进入内存的页面进行替换。

  3. 页面置换

    • 将选中的页面从内存中移除,并将新页面加载到该页框中。

    • 更新队列,将新页面添加到队列的末尾,并移除被替换的页面。

  4. 更新引用序列

    • 继续处理程序的页面引用序列,重复步骤2-5,直到所有页面引用都被处理。

  5. 评估性能

    • 计算缺页次数(page faults),这是评估页面置换算法性能的主要指标之一。

案例分析

根据您提供的幻灯片内容,我们可以看到一个具体的例子,其中分配了3个页框,页面引用序列为 ABCABDADBCBCB

在这个例子中,FIFO算法导致了7次缺页。在这个例子中,如果我们按照FIFO算法来操作,我们会看到以下置换过程:

  1. 开始时,内存为空,引用序列为 A B C A B D A D B C B

  2. 当引用 A 时,将其放入第一个页框,没有发生缺页。

  3. 引用 B 时,将其放入第二个页框,没有发生缺页。

  4. 引用 C 时,将其放入第三个页框,没有发生缺页。

  5. 再次引用 A 时,因为 A 已经在内存中,没有发生缺页。

  6. 引用 B 时,因为 B 已经在内存中,没有发生缺页。

  7. 引用 D 时,需要替换掉最早进入的 A,发生缺页。

  8. 引用 A 时,需要替换掉最早进入的 B,发生缺页。

  9. 引用 D 时,因为 D 已经在内存中,没有发生缺页。

  10. 引用 B 时,需要替换掉最早进入的 C,发生缺页。

  11. 引用 C 时,需要替换掉最早进入的 A,发生缺页。

  12. 引用 B 时,因为 B 已经在内存中,没有发生缺页。

在这个过程中,总共发生了7次缺页。

MIN

MIN页面置换算法,也被称为OPT(Optimal,最优)算法,是一种理论上最优的页面置换算法。它选择将来最长时间内不会被使用的页面进行置换。由于MIN算法需要知道未来的页面引用信息,这在实际中是不可能的,因此它通常用于理论分析和比较其他算法的性能。

MIN算法工作流程

  1. 初始化

    • 假设系统有固定数量的页框(page frames),用于存储内存中的页面。

  2. 页面引用

    • 当程序引用一个页面时,系统检查该页面是否已经在内存中(即是否在页框中)。

  3. 页面命中

    • 如果页面已经在内存中,那么这是一个页面命中(page hit),不需要进行页面置换。

  4. 页面缺失

    • 如果页面不在内存中,那么这是一个页面缺失(page fault),需要进行页面置换。

    • 检查所有在内存中的页面,确定哪个页面在未来最长时间内不会被引用。

  5. 页面置换

    • 将选中的页面从内存中移除,并将新页面加载到该页框中。

  6. 更新引用序列

    • 继续处理程序的页面引用序列,重复步骤2-5,直到所有页面引用都被处理。

  7. 评估性能

    • 计算缺页次数(page faults),这是评估页面置换算法性能的主要指标之一。

图中案例分析

在图中的案例中,我们有3个页框,页面引用序列为 ABCABDADBCBCB。根据MIN算法,我们可以看到以下置换过程:

  1. 开始时,内存为空,引用序列为 A B C A B D A D B C B

  2. 引用 A 时,将其放入第一个页框,没有发生缺页。

  3. 引用 B 时,将其放入第二个页框,没有发生缺页。

  4. 引用 C 时,将其放入第三个页框,没有发生缺页。

  5. 再次引用 A 时,因为 A 已经在内存中,没有发生缺页。

  6. 引用 B 时,因为 B 已经在内存中,没有发生缺页。

  7. 引用 D 时,需要替换掉将来最长时间内不会被使用的页面。在这个例子中,C 在未来的引用序列中出现的最晚,因此被替换,发生缺页。

  8. 引用 A 时,因为 A 已经在内存中,没有发生缺页。

  9. 引用 D 时,因为 D 已经在内存中,没有发生缺页。

  10. 引用 B 时,因为 B 已经在内存中,没有发生缺页。

  11. 引用 C 时,需要替换掉将来最长时间内不会被使用的页面。在这个例子中,A 在未来的引用序列中出现的最晚,因此被替换,发生缺页。

  12. 引用 B 时,因为 B 已经在内存中,没有发生缺页。

在这个过程中,总共发生了5次缺页。

LRU

LRU(最近最少使用)页面置换算法是一种非常流行且有效的页面置换策略。它基于这样一个假设:如果一个页面最近被访问过,那么它在未来很可能也会被访问;相反,如果一个页面很长时间没有被访问,那么它在未来被访问的可能性就较小。因此,LRU算法会选择最长时间未被访问的页面进行置换。就是用历史推测未来

LRU算法工作流程

  1. 初始化

    • 假设系统有固定数量的页框(page frames),用于存储内存中的页面。

    • 初始化一个数据结构(如链表或栈),用于跟踪每个页面最后一次被访问的时间。

  2. 页面引用

    • 当程序引用一个页面时,系统检查该页面是否已经在内存中(即是否在页框中)。

  3. 页面命中

    • 如果页面已经在内存中,那么这是一个页面命中(page hit)。更新该页面的最后访问时间。

  4. 页面缺失

    • 如果页面不在内存中,那么这是一个页面缺失(page fault),需要进行页面置换。

    • 检查所有在内存中的页面,确定哪个页面最长时间未被访问。

  5. 页面置换

    • 将选中的页面从内存中移除,并将新页面加载到该页框中。

    • 更新新页面的最后访问时间。

  6. 更新引用序列

    • 继续处理程序的页面引用序列,重复步骤2-5,直到所有页面引用都被处理。

  7. 评估性能

    • 计算缺页次数(page faults),这是评估页面置换算法性能的主要指标之一。

图中案例分析

在图中的案例中,我们有3个页框,页面引用序列为 ABCABDADBCBCB。根据LRU算法,我们可以看到以下置换过程:

  1. 开始时,内存为空,引用序列为 A B C A B D A D B C B

  2. 引用 A 时,将其放入第一个页框,没有发生缺页。

  3. 引用 B 时,将其放入第二个页框,没有发生缺页。

  4. 引用 C 时,将其放入第三个页框,没有发生缺页。

  5. 再次引用 A 时,因为 A 已经在内存中,更新其最后访问时间,没有发生缺页。

  6. 引用 B 时,因为 B 已经在内存中,更新其最后访问时间,没有发生缺页。

  7. 引用 D 时,需要替换掉最长时间未被访问的页面。在这个例子中,C 是最长时间未被访问的页面,因此被替换,发生缺页。

  8. 引用 A 时,因为 A 已经在内存中,更新其最后访问时间,没有发生缺页。

  9. 引用 D 时,因为 D 已经在内存中,更新其最后访问时间,没有发生缺页。

  10. 引用 B 时,因为 B 已经在内存中,更新其最后访问时间,没有发生缺页。

  11. 引用 C 时,需要替换掉最长时间未被访问的页面。在这个例子中,A 是最长时间未被访问的页面,因此被替换,发生缺页。

  12. 引用 B 时,因为 B 已经在内存中,更新其最后访问时间,没有发生缺页。

在这个过程中,总共发生了5次缺页。

时间戳实现

图中展示了如何使用时间戳来准确实现LRU(最近最少使用)页面置换算法。这种方法通过为每个页面维护一个时间戳来记录页面最后一次被访问的时间。当需要进行页面置换时,选择具有最小时间戳的页面进行淘汰,即该页面是最近最少使用的。

实现步骤

  1. 初始化

    • 为每个页面分配一个时间戳变量,初始值设为0。

    • 设置一个全局时钟,用于生成时间戳。

  2. 页面引用

    • 当程序引用一个页面时,系统检查该页面是否已经在内存中。

  3. 页面命中

    • 如果页面已经在内存中,更新该页面的时间戳为当前的全局时钟值。

  4. 页面缺失

    • 如果页面不在内存中,需要进行页面置换。

    • 遍历所有在内存中的页面,找到具有最小时间戳的页面,即最长时间未被访问的页面。

  5. 页面置换

    • 将选中的页面从内存中移除,并将新页面加载到该页框中。

    • 更新新页面的时间戳为当前的全局时钟值。

  6. 更新全局时钟

    • 每次页面访问后,无论是否发生页面置换,都递增全局时钟值。

  7. 评估性能

    • 计算缺页次数,评估页面置换算法的性能。

图中案例分析

在图中的案例中,我们有3个页框,页面引用序列为 ABCABDADBCBCB。以下是使用时间戳实现LRU算法的具体步骤:

  1. 开始时,内存为空,时间戳表也为空。

  2. 引用 A 时,将 A 放入第一个页框,时间戳设为1。

  3. 引用 B 时,将 B 放入第二个页框,时间戳设为2。

  4. 引用 C 时,将 C 放入第三个页框,时间戳设为3。

  5. 再次引用 A 时,更新 A 的时间戳为4(页面命中)。

  6. 引用 B 时,更新 B 的时间戳为5(页面命中)。

  7. 引用 D 时,需要进行页面置换。此时,C 的时间戳最小(3),因此选择 C 进行淘汰,将 D 放入第三个页框,时间戳设为6。

  8. 引用 A 时,更新 A 的时间戳为7(页面命中)。

  9. 引用 D 时,更新 D 的时间戳为8(页面命中)。

  10. 引用 B 时,更新 B 的时间戳为9(页面命中)。

  11. 引用 C 时,需要进行页面置换。此时,A 的时间戳最小(4),因此选择 A 进行淘汰,将 C 放入第一个页框,时间戳设为10。

  12. 引用 B 时,更新 B 的时间戳为11(页面命中)。

在这个过程中,总共发生了5次缺页。

难实现!!!

页码栈实现

图中展示了如何使用页码栈来实现LRU(最近最少使用)页面置换算法。这种方法通过维护一个栈(或队列)来跟踪页面的使用顺序。当需要进行页面置换时,选择栈底的页面进行淘汰,即该页面是最近最少使用的。

实现步骤

  1. 初始化

    • 创建一个栈,用于存储当前在内存中的页面。

    • 初始化一个映射(如哈希表),用于快速查找页面在栈中的位置。

  2. 页面引用

    • 当程序引用一个页面时,系统检查该页面是否已经在内存中。

  3. 页面命中

    • 如果页面已经在内存中,将该页面移到栈顶(表示最近被访问过)。

  4. 页面缺失

    • 如果页面不在内存中,需要进行页面置换。

    • 选择栈底的页面进行淘汰(最长时间未被访问的页面)。

  5. 页面置换

    • 将选中的页面从栈中移除,并将新页面加载到栈顶。

  6. 更新映射

    • 更新映射,以反映新页面在栈中的位置。

  7. 评估性能

    • 计算缺页次数,评估页面置换算法的性能。

图中案例分析

在图中的案例中,我们有3个页框,页面引用序列为 ABCABDADBCBCB。以下是使用页码栈实现LRU算法的具体步骤:

  1. 开始时,栈为空。

  2. 引用 A 时,将 A 压入栈顶。

  3. 引用 B 时,将 B 压入栈顶。

  4. 引用 C 时,将 C 压入栈顶。

  5. 再次引用 A 时,将 A 从栈中移出并重新压入栈顶(页面命中)。

  6. 引用 B 时,将 B 从栈中移出并重新压入栈顶(页面命中)。

  7. 引用 D 时,需要进行页面置换。此时,栈底是 C,因此选择 C 进行淘汰,将 D 压入栈顶。

  8. 引用 A 时,将 A 从栈中移出并重新压入栈顶(页面命中)。

  9. 引用 D 时,将 D 从栈中移出并重新压入栈顶(页面命中)。

  10. 引用 B 时,将 B 从栈中移出并重新压入栈顶(页面命中)。

  11. 引用 C 时,需要进行页面置换。此时,栈底是 A,因此选择 A 进行淘汰,将 C 压入栈顶。

  12. 引用 B 时,将 B 从栈中移出并重新压入栈顶(页面命中)。

在这个过程中,总共发生了5次缺页。

难实现!!!

SCR

图中展示的是Clock算法,也称为Second Chance算法,这是一种近似实现LRU(最近最少使用)页面置换策略的方法。它通过给每个页面添加一个引用位(reference bit)来模拟时间戳,从而实现页面的置换决策。这种方法比维护全局时间戳或页码栈的实现方式要简单,且实现代价较小。

Clock算法实现步骤

  1. 初始化

    • 为每个页框分配一个引用位(通常为一个二进制位),初始值设为0。

    • 创建一个指针(或称为“时钟指针”),用于扫描页框。

  2. 页面引用

    • 当程序引用一个页面时,系统检查该页面是否已经在内存中。

    • 如果页面命中,硬件自动将该页面的引用位设置为1。

  3. 页面缺失

    • 如果页面不在内存中(页面缺失),时钟指针开始扫描页框。

    • 扫描过程中,如果遇到引用位为1的页面,将其引用位清0,并继续扫描下一个页面。

    • 如果遇到引用位为0的页面,选择该页面进行淘汰,并加载新页面到该页框中。

  4. 更新引用位

    • 当新页面加载到页框后,将其引用位设置为1。

  5. 循环扫描

    • 如果在一轮扫描中没有找到引用位为0的页面(即所有页面的引用位都被设置为1),则选择第一个引用位为1的页面进行淘汰,并重新设置其引用位为0。

    • 如果遇到引用位为0的页面,淘汰。

  6. 评估性能

    • 计算缺页次数,评估页面置换算法的性能。

图中案例分析

图中展示了Clock算法的工作流程,其中每个页框都有一个引用位(R=0或R=1)。以下是具体步骤:

  1. 开始时,所有引用位都设置为0。

  2. 当访问页面时,硬件自动将对应的引用位设置为1。

  3. 当需要置换页面时,时钟指针开始扫描页框。

  4. 在扫描过程中,如果遇到引用位为1的页面,将其引用位清0,并继续扫描

  5. 如果遇到引用位为0的页面,选择该页面进行淘汰,并加载新页面到该页框中,同时将新页面的引用位设置为1。

  6. 如果在一轮扫描中没有找到引用位为0的页面(即所有页面的引用位都被设置为1),则选择第一个引用位为1的页面进行淘汰,并重新设置其引用位为0

Clock算法改造优化

问题描述

  1. 缺页很少时的情况

    • 如果系统中的缺页很少,可能会导致所有页面的引用位(R位)都被设置为1。这种情况下,Clock算法可能会退化为FIFO算法,因为它会不断地扫描直到找到一个可以替换的页面。

  2. 记录太长的历史信息

    • 如果系统中的页面长时间没有被替换,它们的引用位可能会一直保持为1,这会导致算法效率降低,因为它需要扫描更多的页面来找到一个R位为0的页面。

改造建议:

  1. 定时清除R位

    • 为了解决R位长时间为1的问题,可以定时清除所有页面的R位。这样可以确保算法不会记住太长的历史信息,从而避免退化为FIFO算法。

  2. 使用两个扫描指针

    • 引入一个快速移动的扫描指针用于清除R位,一个慢速移动的扫描指针用于选择淘汰页面。这样可以提高清除R位的效率,同时保持选择淘汰页面的准确性。

实现步骤:

  1. 初始化

    • 为每个页框分配一个引用位(R位),初始值设为0。

    • 创建两个扫描指针,一个用于清除R位(快速移动),一个用于选择淘汰页面(慢速移动)。

  2. 页面引用

    • 当程序引用一个页面时,将该页面的R位设置为1。

  3. 页面缺失

    • 如果页面不在内存中,慢速扫描指针开始扫描页框以选择淘汰页面。

    • 如果遇到R位为1的页面,将其R位清0,并继续扫描。

    • 如果遇到R位为0的页面,选择该页面进行淘汰,并加载新页面到该页框中,同时将新页面的R位设置为1。

  4. 清除R位

    • 快速扫描指针周期性地扫描所有页框,将所有页面的R位清0。

  5. 更新扫描指针

    • 每次页面置换后,慢速扫描指针前移一位。

    • 快速扫描指针在清除完所有R位后也前移一位。

  6. 评估性能

    • 计算缺页次数,评估页面置换算法的性能。

给进程分配多少页框

分配页框的挑战:

  1. 分配过多

    • 如果给每个进程分配过多的页框,虽然可以减少缺页率,提高内存的高效利用,但这样做会减少系统中可用的页框总数,导致无法同时运行更多的进程。

  2. 分配过少

    • 如果分配的页框太少,每个进程的缺页率会增大,导致更多的页面置换操作,从而增加进程等待调页完成的时间,降低CPU利用率。

颠簸(Thrashing)现象:

  • 定义:颠簸是指系统因为进程的缺页率过高,导致大部分时间都在进行页面置换操作,而实际的CPU利用率却很低的现象。

  • 原因:当系统中进程数量过多时,每个进程分配到的页框数量减少,导致缺页率增加。随着缺页率的增加,进程需要花费更多的时间等待页面置换完成,从而减少了CPU的有效工作时间。

  • 影响:颠簸会导致系统性能急剧下降,因为CPU大部分时间都在处理页面置换,而不是执行用户进程。

图中现象分析:

图中展示了CPU利用率与多道程序程度(即系统中同时运行的进程数量)之间的关系。随着进程数量的增加,CPU利用率先增加后减少,形成一个峰值。这个峰值之后,CPU利用率急剧下降,这就是颠簸现象。

解决策略:

  1. 合理分配页框

    • 需要找到一个平衡点,即合理分配页框数量,使得系统中的进程既能有效利用内存,又不至于因为缺页率过高而导致颠簸。

通过这些策略,可以有效地避免颠簸现象,提高系统的稳定性和性能。

相关文章:

操作系统 3.6-内存换出

换出算法总览 页面置换算法 FIFO(先进先出): 最简单的页面置换算法,淘汰最早进入内存的页面。 优点:实现简单。 缺点:可能会导致Belady异常,即增加内存反而降低性能。如果刚换入的页面马上又要…...

Python中的数值运算函数及math库详解

文章目录 Python中的数值运算函数及math库详解一、内置数值运算函数1. 基本数值运算函数2. 类型转换函数3. 进制转换函数 二、math库中的数学常数三、math库常用数学函数1. 数论与表示函数2. 幂函数与对数函数3. 三角函数4. 角度转换5. 双曲函数6. 特殊函数 四、实际应用示例1.…...

安卓开发提示Android Gradle plugin错误

The project is using an incompatible version (AGP 8.9.1) of the Android Gradle plugin. Latest supported version is AGP 8.8.0-alpha05 See Android Studio & AGP compatibility options. 改模块级 build.gradle(如果有独立配置):…...

《Uniapp-Vue 3-TS 实战开发》一键授权登录

在使用 UniApp 结合 Vue 3 和 TypeScript 开发时,实现一键授权登录功能通常涉及到调用微信小程序的授权接口(如 wx.getUserProfile 或 wx.login)来获取用户信息和登录凭证,然后将这些信息发送到后端进行验证和处理。以下是一个完整的实现示例,展示如何在 UniApp 中实现一键…...

Windows 图形显示驱动开发-WDDM 1.2功能_WDDM 1.2 和 Windows 8

简介 WDDM 是随 Windows Vista 一起引入的,以取代 Windows XP 或 Windows 2000 显示驱动程序模型 (XDDM) 。 随着 Windows Vista 中的引入,WDDM 体系结构提供了启用新功能的功能,例如桌面组合、增强的容错、视频内存管理器、GPU 计划程序、D…...

155.最小栈

1.题目解析 题目是让我们设计一个栈,它于STL库中栈的区别是支持检索到了最小元素的栈但是需要时间复杂度为常数,我们很容易想到的是记录最小值。但是如果中途删除的话最小值可能失效,所以我们选择用2个栈来实现。 2.算法原理 我们创建2个栈…...

[C语言笔记]10、字符串

前言: C语言的相关知识点的笔记均在下面的专栏链接中,欢迎订阅! c语言笔记_1zero10的博客-CSDN博客 10-1字符数组与字符串 1、字符数组就是一个数组,数组的每一个元素都是一个字符 首先利用字符数组,回顾以前学过…...

Windows系统备份和还原点

一、简介 系统的还原点存储了当前系统的主要状态,包括一些关键的配置信息和参数(包括注册表、系统服务设置、设备驱动程序设置等)。将此时的状态进行备份,在系统发生故障时,可以还原到此还原点的状态中,这…...

内联汇编知识点earlyclobber=

arm64内联汇编格式: asm volatile ("汇编指令1\n\t""汇编指令2\n\t""汇编指令3": 输出操作数列表: 输入操作数列表: 可能被修改的寄存器列表 );示例1:简单的寄存器操作 uint64_t add_numbers(uint64_t a, uint64_t b) {…...

修改ESP32CAM的示例CameraWebServer里的camera_index.h的方法

在这里,默认你已经会使用Arduino IDE或者PlatformIO通过烧录底座对ESP32CAM(如下图)进行烧录,并能通过浏览器对其进行访问。 我们访问到下图的界面时,不禁有个疑问,这个界面是如何生成的,如果我…...

Python学习笔记(二)(字符串)

文章目录 编写简单的程序一、标识符 (Identifiers)及关键字命名规则:命名惯例:关键字 二、变量与赋值 (Variables & Assignment)变量定义:多重赋值:变量交换:(很方便哟) 三、输入与输出 (In…...

ViewModel vs AndroidViewModel:核心区别与使用场景详解

在 Android 的 MVVM 架构中,ViewModel 和 AndroidViewModel 都是用于管理 UI 相关数据的组件,但二者有一些关键区别: 1. ViewModel 基本用途:用于存储和管理与 UI 相关的数据,生命周期与 Activity/Fragment 解耦&…...

Windows环境下 全屏显示某个字符串

case WM_PAINT: {PAINTSTRUCT ps;HDC hdc BeginPaint(hWnd, &ps);// 获取完整客户区尺寸RECT rc;GetClientRect(hWnd, &rc);// 全屏时:整个窗口作为显示区域RECT displayRect rc;// 纯黑背景FillRect(hdc, &displayRect, (HBRUSH) GetStockObject(BLA…...

禅道MCP Server开发实践与功能全解析

一、简介 1、MCP Server核心定义 MCP Server(Meta Command Protocol Server)是一种基于客户端-服务器架构的轻量级服务程序,采用统一的mcp协议格式,通过连接多样化数据源和工具为AI应用提供扩展能力。它作为中间层,实…...

Vue.js组件安全开发实战:从架构设计到攻防对抗

目录 开篇总述:安全视角下的Vue组件开发新范式 一、Vue.js组件开发现状全景扫描 二、安全驱动的Vue组件创新架构 三、工程化组件体系构建指南 四、深度攻防对抗实战解析 五、安全性能平衡策略 结语:安全基因注入前端开发的未来展望 下期预告&…...

代发考试战报:4月份最新锐捷RCNA RCNP 考试通过战报

锐捷 RCNA云计算 R4111 考试通过,RCNA 安全 R3111 考试通过,RCNP无线 R5211考试通过,RCNP路由考试通过,等等 成绩单战报...

卫星互联网技术加速发展,遨游卫星电话为生命添一份“保险”

卫星互联网通过高中低轨卫星组网,实现了对海洋、沙漠、极地等“信息盲区”的全域覆盖。据国际电信联盟(ITU)统计,截至2024年底,全球在轨卫星数量已突破1万颗,其中我国“千帆星座”“GW星座”等低轨计划加速…...

文件IO7(中文字库的原理与应用/目录检索原理与应用/并发编程的原理与应用)

中文字库的原理与应用 ⦁ 基本概念 一般在项目中都会显示汉字,都采用中文简体字符集,计算机早期只有ANSI组织设计的ANSII码,其实也属于字符集,这套字符集并未收录中文,只收录256个字符。 所以后期中国国家标准总局设…...

达梦数据库-学习-16-常用SQL记录(持续更新)

目录 一、环境信息 二、介绍 三、查询SQL 1、数据库的总使用空间大小 2、各个表空间的总大小 3、使用空间最大的50个对象 4、使用率最高的50个sequence 5、使用空间率最高的50个自增列 6、定位锁 7、支持HINT 8、表数据页使用率 9、备份文件相关信息 10、初始化库参…...

使用setTimeout模拟setInterval

const SECOND 1000 const MINUTE 60 * SECOND const HOUR 60 * MINUTE const DAY 24 * HOUR/*** description: 根据传入的毫秒值格式化为时间* param {*} time:毫秒值* returns:{days, hours, minutes, seconds, milliseconds}*/ function parseTime…...

Cesium实现鹰眼图和主地图联动

本文是vuets实现的,想要转为react,只需要修改以下几部分内容 1. 将 reactive 定义的数据直接改写为 let定义 2. 将 watch 监听的内容改成对应的监听写法 3. 将 ref 定义的字段改写为对应的写法 该模块实现的功能: 通过点击鹰眼图的某一位置&#xf…...

文件IO6(开机动画的显示原理/触摸屏的原理与应用)

开机动画的显示原理 ⦁ 基本原理 一般电子产品在开机之后都会加深用户印象,一般开机之后都会播放一段开机动画(视频、GIF…),不管哪种采用形式,内部原理都是相同,都是利用人类的眼睛的视觉暂留效应实现的…...

Linux内核分页——线性地址结构

每个进程通过一个指针&#xff08;即进程的mm_struct→pgd&#xff09;指向其专属的页全局目录&#xff08;PGD&#xff09;&#xff0c;该目录本身存储在一个物理页框中。这个页框包含一个类型为pgd_t的数组&#xff0c;该类型是与架构相关的数据结构&#xff0c;定义在<as…...

每日算法-250411

这是我今天的 LeetCode 刷题记录和心得&#xff0c;主要涉及了二分查找的应用。 3143. 正方形中的最多点数 题目简述: 思路 本题的核心思路是 二分查找。 解题过程 为什么可以二分&#xff1f; 我们可以对正方形的半边长 len 进行二分。当正方形的半边长 len 越大时&…...

虚幻基础:碰撞帧运算

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 碰撞碰撞盒线段检测 帧运算&#xff1a;每个程序流就是一帧的计算结果速度过快时(10000)&#xff0c;导致每帧移动过大(83)&#xff0c;从而导致碰撞盒错过而没有碰撞速度快的碰撞要用线段检测 碰撞 碰撞盒 线段检…...

AI反检测如何在TikTok养号中发挥关键作用?

在 TikTok 这个全球性的短视频平台上&#xff0c;账号的养成和管理成为了创作者和品牌不可忽视的一环。随着平台对内容和账号行为的监管越来越严格&#xff0c;传统的养号方法已经难以适应新的挑战。在这一背景下&#xff0c;AI 反检测技术应运而生&#xff0c;它通过模拟人类行…...

鸿蒙案例---生肖抽卡

案例源码&#xff1a; Zodiac_cards: 鸿蒙生肖抽奖卡片 效果演示 初始布局 1. Badge 角标组件 此处为语雀内容卡片&#xff0c;点击链接查看&#xff1a;https://www.yuque.com/kevin-nzthp/lvl039/rccg0o4pkp3v6nua 2. Grid 布局 // 定义接口 interface ImageCount {url:…...

【AI编程技术爆发:从辅助工具到生产力革命】

目录 前言&#xff1a;技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现运行结果验证 三、性能对比测试方法论量化数据对比&#xff08;2023年数据&#xff09;结果分析 四、最…...

【前后端】npm包mysql2的使用__nodejs mysql包升级版

不定期更新&#xff0c;建议关注收藏点赞。 目录 简介使用说明 还在用mysql包吗&#xff1f;已经过时啦&#xff01; 简介 mysql2 是一个用于 Node.js 的 MySQL 数据库驱动&#xff0c;它是 mysql 包的升级版&#xff0c;性能更好&#xff0c;支持 Promise 和 async/await&…...

基于LangChain的Native RAG简单样例

本文代码: Github 文章目录 1. 概述2. Native RAG 概述3. 实战&#xff1a;基于LangChain实现简单的Native RAG概述环境配置文档分割定义Embedding模型构建向量数据库与LLM交互 参考文献 1. 概述 众所周知&#xff0c; 大模型可以回答它知道的内容。但如果用户问的是它不知道…...

数据结构基础(2)

1.什么是算法&#xff1f; 算法&#xff1a;算法是解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 算法定义中&#xff0c;提到了指令&#xff0c;指令能被人或机器等计算装置执行。它可以是计算机指令&a…...

慢查询解决思路

1. 复现问题 慢查询的出现是常态还是偶尔?是否在业务允许范围内? "不要过早优化,先 Make it work / right,再 Make it fast。" 建议先将查询语句及其触发条件记录下来,便于后续测试、分析和对比。 2. 定位问题 2.1 单机数据库: explain查询执行计划 数据库默…...

前端下载文件时浏览器右上角没有保存弹窗及显示进度,下载完之后才会显示保存弹窗的问题定位及解决方案

需求背景 在开发过程中会发现&#xff0c;有的时候下载后端返回的文件&#xff0c;浏览器右上角不会进行保存弹窗的弹出及下载进度&#xff0c;而是接口响应后文件下载完才会弹出保存并且没有进度条效果&#xff0c;这就导致在点击下载后用户是不知道文件下载到什么进度了&…...

Streamlit在测试领域中的应用:构建自动化测试报告生成器

引言 Streamlit 在开发大模型AI测试工具方面具有显著的重要性&#xff0c;尤其是在简化开发流程、增强交互性以及促进快速迭代等方面。以下是几个关键点&#xff0c;说明了 Streamlit 对于构建大模型AI测试工具的重要性&#xff1a; 1. 快速原型设计和迭代 对于大模型AI测试…...

IP组播技术与internet

1.MAC地址分为三类&#xff1a;广播地址&#xff1b;组播地址&#xff1b;单播地址 2.由一个源向一组主机发送信息的传输方式称为组播。 3.组播MAC地址&#xff0c;第一个字节的最后一位为1&#xff1b; 单播MAC地址&#xff0c;第一个字节的最后一位为0&#xff1b; 4.不能…...

[Java基础]StringBuilder解析

StringBuilder简单总结与源码预览。 之前写StringBuilder对象默认简写为sb&#xff0c;被说是骂人不让用了&#xff0c;现在写成strBuilder了。大家一般写什么呢 StringBuilder预留空间设计 已知Redis的String结构是通过预留空间的形式来避免频繁地分配空间。 那么Java中有没有…...

国内智能外呼系统市场概况及技术发展趋势

根据最新行业报告和用户评价&#xff0c;国内智能外呼系统市场呈现快速增长态势&#xff0c;预计2025年市场规模将达到180亿元人民币&#xff0c;年复合增长率约20%。主要驱动因素包括AI技术成熟、企业降本增效需求以及政策扶持&#xff08;如工信部《智能语音产业发展行动计划…...

小推桌面-一款全新的第三方电视桌面-全网通桌面

你是否渴望更高效、便捷地使用机顶盒桌面&#xff1f;小推桌面、乐看家桌面是绝佳之选&#xff01;它们的界面简洁&#xff0c;操作轻松上手&#xff0c;能快速找到所需应用&#xff0c;大大节省时间。 小推桌面支持个性化定制&#xff0c;可按个人喜好调整布局、添加组件&…...

SQL实战篇,数据库在Kooboo中的实际应用(一)

本文将结合实际操作与代码示例&#xff0c;展示SQL 在 Kooboo 中的实际应用 仅需两步&#xff1a;动态创建表 基础查询&#xff0c;无需复杂配置&#xff0c;快速上手&#xff01; 一、动态创建表&#xff1a;插入数据 Kooboo 支持多种数据库&#xff0c;以 SQLite 为例&…...

Matlab 调制信号和fft变换

1、内容简介 Matlab 194-调制信号和fft变换 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

2025年的Android NDK 快速开发入门

十年前写过一篇介绍NDK开发的文章《Android实战技巧之二十三&#xff1a;Android Studio的NDK开发》&#xff0c;今天看来已经发生了很多变化&#xff0c;NDK开发变得更加容易了。下面就写一篇当下NDK开发快速入门。 **原生开发套件 (NDK) **是一套工具&#xff0c;使开发者能…...

opensuse Tumbleweed虚拟机上安装

值得一提的是cpu需要给多一点核&#xff0c;不然压力都集中在一个点上温度会比较高&#xff0c;然后就是可能无法正常运行这个安装界面。 前面好像是半自动的&#xff0c;一直到这里选择桌面界面需要手动选择 这边必然选大蜥蜴的kde&#xff0c;那个蜥蜴菜单还是很好看的。 …...

AI避坑:AI生成的文件格式不一定对

今天就碰到了原来正确的文件&#xff0c;AI生成后文件变味UTF-8 BOM文件 导致MAUI解析出错An error occured while parsing Xaml: 根级别上的数据无效。 第 1 行&#xff0c;位置 1 解决方案&#xff1a; 将文件用文本编辑器打开&#xff0c;另存为UTF-8格式文件...

蓝桥杯真题-危险系数DF

抗日战争时期&#xff0c;冀中平原的地道战曾发挥重要作用。 地道的多个站点间有通道连接&#xff0c;形成了庞大的网络。但也有隐患&#xff0c;当敌人发现了某个站点后&#xff0c;其它站点间可能因此会失去联系。 我们来定义一个危险系数DF(x,y)&#xff1a; 对于两个站点x和…...

四、TorchRec的推理优化

四、TorchRec的推理优化 文章目录 四、TorchRec的推理优化前言一、TorchRec 推理优化的两个主要区别是二、TorchRec 提供了以下内容&#xff0c;以将 TorchRec 模型转换为可用于推理的模型总结 前言 推理环境与训练环境不同&#xff0c;它们对性能和模型大小非常敏感。 一、To…...

Linux 系统中从源码编译安装软件

以下是 Linux 系统中 从源码编译安装软件 的详细步骤和注意事项&#xff0c;帮助你掌握这一高级操作技能&#xff1a; 一、编译安装的核心流程 1. 下载源码包&#xff08;通常为 .tar.gz/.tar.bz2/.tar.xz&#xff09; 2. 解压源码包 3. 进入源码目录 4. 配置编译参数&#xf…...

【AI论文】OLMoTrace:将语言模型输出追溯到万亿个训练标记

摘要&#xff1a;我们提出了OLMoTrace&#xff0c;这是第一个将语言模型的输出实时追溯到其完整的、数万亿标记的训练数据的系统。 OLMoTrace在语言模型输出段和训练文本语料库中的文档之间找到并显示逐字匹配。 我们的系统由扩展版本的infini-gram&#xff08;Liu等人&#xf…...

BeautifulSoup 踩坑笔记:SVG 显示异常的真正原因

“这图是不是糊了&#xff1f;”以为是样式缺了&#xff1f;试试手动复制差异在哪&#xff1f;想用对比工具一探究竟……简单到不能再简单的代码&#xff0c;有问题吗&#xff1f;最后的真相&#xff1a;viewBox vs viewbox&#xff0c;preserveAspectRatio vs preserveaspectr…...

ai-warp 开源的Platformatic Stackable 与 AI 服务交互

一、软件介绍 文末提供程序和源码下载学习 ai-warp 开源的Platformatic Stackable 与 AI 服务交互 二、用法 npx create-platformaticlatestSelect Application, then platformatic/ai-warp 选择 Application&#xff08;应用程序 &#xff09;&#xff0c;然后选择 platfor…...

AI比人脑更强,因为被植入思维模型【53】反熵增思维模型

giszz的理解&#xff1a;熵用来形容系统的混乱程度。熵增就是从有序到无序&#xff0c;反熵增就是从无序到有序。其实阴阳二级&#xff0c;世界总是在变化之中。保持清醒的头脑&#xff0c;认识到当前是有序还是无序的&#xff0c;如何改变&#xff0c;让事物向着自己希望的方式…...