二、FIFO缓存

FIFO缓存

  • 1.FIFO缓存介绍
  • 2.FIFO缓存实现
  • 3.FIFO缓存总结

1.FIFO缓存介绍

FIFO(First-In-First-Out)缓存 是一种简单的缓存淘汰策略,它基于先进先出的原则来管理数据。当缓存达到容量限制并需要淘汰元素时,最先进入缓存的元素会被移除,以便为新元素腾出空间。
FIFO缓存的基本原则是:
①数据存储顺序:数据按照进入缓存的顺序排列(通常用队列实现)。最早插入的数据位于队列的前端,最新插入的数据位于队列的尾端。
②淘汰策略:当缓存已满,插入新数据时,队列前端的元素(最早插入的元素)被移除。

2.FIFO缓存实现

接下来我将通过c语言中的glib库来实现一个FIFO缓存结构。
首先给出结构体定义:

// FIFO 缓存结构体
struct fifoCache {GList* elem_queue;          // 缓存数据链表int max_size;               // 缓存容量int size;                   // 当前缓存大小void (*free_elem)(void*);   // 数据释放函数int (*match_elem)(void* elem, void* user_data); // 数据匹配函数
};

需要实现如下功能:

// 创建一个新的 FIFO 缓存
struct fifoCache* new_fifo_cache(int size, void (*free_elem)(void*),int (*match_elem)(void*, void*));// 释放缓存及其中的所有元素
void free_fifo_cache(struct fifoCache* cache);// 插入新数据到缓存
void fifo_cache_insert(struct fifoCache* cache, void* data);// 查找元素(不改变数据顺序)
void* fifo_cache_lookup(struct fifoCache* cache, void* user_data);// 条件删除满足用户自定义条件的元素
void fifo_cache_kicks(struct fifoCache* cache, void* user_data,int (*func)(void* elem, void* user_data));// 检查缓存是否已满
int fifo_cache_is_full(struct fifoCache* cache);

具体实现代码:

#include <stdlib.h>
#include <stdio.h>
#include "fifo_cache.h"// 创建一个新的 FIFO 缓存
struct fifoCache* new_fifo_cache(int size, void (*free_elem)(void*),int (*match_elem)(void*, void*)) {struct fifoCache* cache = malloc(sizeof(struct fifoCache));cache->elem_queue = NULL;cache->max_size = size;cache->size = 0;cache->free_elem = free_elem;cache->match_elem = match_elem;return cache;
}// 释放缓存及其中的所有元素
void free_fifo_cache(struct fifoCache* cache) {if (cache == NULL) return;if (cache->free_elem) {g_list_free_full(cache->elem_queue, cache->free_elem);} else {g_list_free(cache->elem_queue);}free(cache);
}// 插入新数据到缓存
void fifo_cache_insert(struct fifoCache* cache, void* data) {if (cache->size == cache->max_size) {// 淘汰队列头部数据GList* head = g_list_first(cache->elem_queue);if (cache->free_elem) {cache->free_elem(head->data);}cache->elem_queue = g_list_delete_link(cache->elem_queue, head);cache->size--;}// 插入新数据到队列尾部cache->elem_queue = g_list_append(cache->elem_queue, data);cache->size++;
}// 查找元素(不改变数据顺序)
void* fifo_cache_lookup(struct fifoCache* cache, void* user_data) {GList* elem = g_list_first(cache->elem_queue);while (elem) {if (cache->match_elem(elem->data, user_data)) {return elem->data;}elem = g_list_next(elem);}return NULL; // 未找到
}// 条件删除满足用户自定义条件的元素
void fifo_cache_kicks(struct fifoCache* cache, void* user_data,int (*func)(void* elem, void* user_data)) {GList* elem = g_list_first(cache->elem_queue);while (elem) {if (func(elem->data, user_data)) {if (cache->free_elem) {cache->free_elem(elem->data);}cache->elem_queue = g_list_delete_link(cache->elem_queue, elem);cache->size--;break;}elem = g_list_next(elem);}
}// 检查缓存是否已满
int fifo_cache_is_full(struct fifoCache* cache) {return cache->size >= cache->max_size;
}

测试代码:

#include "fifo_cache.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 自定义数据类型
typedef struct {char* name;
} Data;// 数据释放函数
void free_data(void* data) {Data* d = (Data*)data;printf("[Free] Name = %s\n", d->name);free(d->name);free(d);
}// 数据匹配函数
int match_data(void* elem, void* user_data) {Data* d = (Data*)elem;char* target = (char*)user_data;return strcmp(d->name, target) == 0;
}int main() {printf("---- FIFO Cache Test ----\n");struct fifoCache* cache = new_fifo_cache(3, free_data, match_data);// 插入数据printf("[Insert] Alice, Bob, Charlie\n");Data* a = malloc(sizeof(Data)); a->name = strdup("Alice");Data* b = malloc(sizeof(Data)); b->name = strdup("Bob");Data* c = malloc(sizeof(Data)); c->name = strdup("Charlie");fifo_cache_insert(cache, a);fifo_cache_insert(cache, b);fifo_cache_insert(cache, c);// 查找数据printf("Looking up: Bob\n");Data* result = (Data*)fifo_cache_lookup(cache, "Bob");if (result) printf("Found: %s\n", result->name);// 插入新数据,触发淘汰printf("[Insert] "Dave"\n");Data* d = malloc(sizeof(Data)); d->name = strdup("Dave");fifo_cache_insert(cache, d);// 查找被淘汰的数据printf("Looking up: Alice\n");result = (Data*)fifo_cache_lookup(cache, "Alice");if (!result) printf("Alice has been evicted.\n");free_fifo_cache(cache);printf("---- Test Complete ----\n");return 0;
}

测试结果:
在这里插入图片描述
同样的,上面的FIFO缓存支持任意的数据类型,具有高度的通用性和灵活性。

3.FIFO缓存总结

FIFO缓存应用:

应用场景说明
任务调度在操作系统中,FIFO 用于管理任务队列,确保任务按照到达的顺序执行。
页面置换在内存管理中,FIFO 用于页面置换,淘汰最早加载的页面,释放内存空间。
网络数据包缓存在网络交换机和路由器中,FIFO 用于管理数据包队列,按照顺序传输或丢弃数据包。
日志管理适合简单的日志记录,按照记录顺序缓存和清理日志数据。
数据缓冲区在流式数据处理中,FIFO 用于临时存储数据,确保数据按顺序读取和处理。
消息队列实现生产者-消费者模型中的消息传递,保证消息按插入顺序进行处理。

FIFO缓存优缺点:

优点说明
实现简单基于队列数据结构,逻辑清晰,易于实现。
插入和删除效率高在队列的尾部插入、头部删除,时间复杂度为 O(1)。
公平性数据按照到达顺序被处理,没有优先级差异。
适合访问模式简单、数据均匀的场景适合不需要热点数据的简单缓存需求。
缺点说明
无法处理热点数据即使频繁访问的数据也不会改变淘汰顺序,可能被淘汰。
缓存利用率低在访问模式复杂的场景下,缓存命中率较低。
不考虑数据的访问频率或时间与 LRU 或 LFU 相比,无法根据访问频率或时间进行智能淘汰。
适用于简单场景不适合需要高度优化性能的复杂系统。

总结:FIFO 缓存是一种简单高效的缓存淘汰策略,适用于数据访问均匀且热点数据不明显的场景。它的实现依赖于队列结构,逻辑清晰,插入和删除操作性能高。然而,在访问热点数据频繁的应用中,FIFO 的性能可能不如 LRU 和 LFU 等策略。在实际应用中,FIFO 适合简单场景,比如任务调度、数据缓冲区 和 日志管理,但在复杂缓存场景下,可能需要结合其他策略实现更高的缓存命中率。

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

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

相关文章

Spring Cloud与Spring Cloud Alibaba:全面解析与核心要点

Spring Cloud与Spring Cloud Alibaba&#xff1a;全面解析与核心要点 一、引言 在当今的分布式系统开发领域&#xff0c;Spring Cloud和Spring Cloud Alibaba都是极为重要的框架。它们为构建大规模、高可用、分布式的应用系统提供了丰富的工具和组件。本文将深入探讨Spring C…

账号下的用户列表表格分析

好的&#xff0c;这是您提供的 el-table 组件中所有列的字段信息&#xff0c;以表格形式展示&#xff1a; 列标题 (label)字段属性 (prop)对齐方式 (align)宽度 (width)是否可排序 (sortable)说明IDidcenter100否管理员的唯一标识符头像avatarcenter90否管理员的头像 URL 或路…

GPT-SoVITS语音合成模型部署及使用

1、概述 GPT-SoVITS是一款开源的语音合成模型&#xff0c;结合了深度学习和声学技术&#xff0c;能够实现高质量的语音生成。其独特之处在于支持使用参考音频进行零样本语音合成&#xff0c;即使没有直接的训练数据&#xff0c;模型仍能生成相似风格的语音。用户可以通过微调模…

TongWe7.0-东方通TongWeb控制台无法访问 排查

问题描述&#xff1a;无法访问TongWeb的控制台 逐项排查&#xff1a; 1、控制台访问地址是否正确&#xff1a;http://IP:9060/console #IP是服务器的实际IP地址 2、确认TongWeb进程是否存在&#xff0c;执行命令&#xff1a;ps -ef|grep tongweb 3、确认TongWeb服务启动…

研发文档管理系统:国内外9大选择比较

文章主要对比了9款国内外研发文档管理系统&#xff1a;1.PingCode&#xff1b; 2. Worktile&#xff1b; 3. 飞书&#xff1b; 4. 石墨文档&#xff1b; 5. 腾讯文档&#xff1b; 6. 蓝湖&#xff1b; 7. Confluence&#xff1b; 8. Notion&#xff1b; 9. Slab。 在企业研发过…

【ABAP SAP】开发-BUG修补记录_采购申请打印时品名规格品牌为空

项目场景&#xff1a; TCODE:自开发程序ZMMF004 采购申请打印 问题描述 ZMMF004打印的时候&#xff0c;有的采购申请的品名、规格、品牌为空 原因分析&#xff1a; 1、首先我通过写SQL语句查底表来看这几条采购申请本身有无品名、规格、品牌 SQL语句如下&#xff0c;只需修…

Ubuntu 20.04 24.04 双网卡 Bond 配置指南

前言&#xff1a;在现代服务器管理中&#xff0c;网络的稳定性和可靠性至关重要。为了提高网络的冗余性和负载能力&#xff0c;我们经常需要配置多个网络接口以实现链路聚合或故障转移。Ubuntu系统自17.10版本起&#xff0c;引入了Netplan作为新的网络配置抽象化工具&#xff0…

OCR实践—PaddleOCR

有个项目需求&#xff0c;对拍摄的问卷图片&#xff0c;进行自动得分统计【得分是在相应的分数下面打对号】&#xff0c;输出到excel文件 原始问卷文件见下图&#xff0c;真实的图片因使用手机拍摄的图片&#xff0c;存在一定的畸变&#xff0c; 技术调研 传统方法 传统方法…

ubuntu+ros新手笔记(五):初探anaconda+cuda+pytorch

深度学习三件套&#xff1a;初探anacondacudapytorch 系统ubuntu22.04 ros2 humble 1.初探anaconda 1.1 安装 安装过程参照【详细】Ubuntu 下安装 Anaconda 1.2 创建和删除环境 创建新环境 conda create -n your_env_name pythonx.x比如我创建了一个名为“py312“的环境…

【测试】Pytest

建议关注、收藏&#xff01; 目录 功能pytest 自动化测试工具。 功能 单元测试&#xff1a;用于验证代码的最小功能单元&#xff08;如函数、方法&#xff09;的正确性。 简单的语法&#xff1a;不需要继承特定类或使用复杂的结构。断言语句简化。 自动发现测试&#xff1a;P…

Unity性能优化---使用SpriteAtlas创建图集进行批次优化

在日常游戏开发中&#xff0c;UI是不可缺少的模块&#xff0c;而在UI中又使用着大量的图片&#xff0c;特别是2D游戏还有很多精灵图片存在&#xff0c;如果不加以处理&#xff0c;会导致很高的Batches&#xff0c;影响性能。 比如如下的例子&#xff1a; Batches是9&#xff0…

环境和工程搭建

1.案例介绍 1.1 需求 实现⼀个电商平台 该如何实现呢? 如果把这些功能全部写在⼀个服务⾥, 这个服务将是巨⼤的. 巨多的会员, 巨⼤的流量, 微服务架构是最好的选择. 微服务应⽤开发的第⼀步, 就是服务拆分. 拆分后才能进⾏"各⾃开发" 1.2 服务拆分 拆分原则 …

解决Jmeter HTTP Cookie管理器cookie不生效

解决Jmeter HTTP Cookie管理器cookie不生效问题 解决Jmeter HTTP Cookie管理器cookie不生效问题1、设置Jmeter HTTP Cookie管理器cookie后&#xff0c;发起的请求显示[no cookies]jmeter问题复现&#xff1a;这里同样使用postman进行重试&#xff0c;发现是可以正常获取数据的&…

操作系统课后习题2.2节

操作系统课后习题2.2节 第1题 CPU的效率指的是CPU的执行速度&#xff0c;这个是由CPU的设计和它的硬件来决定的&#xff0c;具体的调度算法是不能提高CPU的效率的&#xff1b; 第3题 互斥性&#xff1a; 指的是进程之间的同步互斥关系&#xff0c;进程是一个动态的过程&#…

二叉搜索树 平衡树(c嘎嘎版)

定义: 二叉搜索树是一种二叉树的树形数据结构,其定义如下: 空树是二叉搜索树。 若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。 若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。 二叉搜索树的左右子树均为…

Everything搜索实现

最近编写NTFS文件实时搜索工具, 类似 Everything 这样, 速度快还小巧, 于是花了约3周进行研究, 总结下学习过程中一些经验 实现分3部分完成 一. 解析NTFS 主文件表(MFT) 这一步是获取文件数据的唯一迅速且可靠的来源 NTFS_MFT_Parse.h #pragma once #include "NTFS_Bas…

23.DDD与微服务

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 DDD与微服务的关系1. DDD可以用微服务实现&#xff0c;也可以不用微服务实现2. DDD是微服务拆分的必须参考项之一3. 微服务架构…

vscode 打开 setting.json

按下Ctrl Shift P&#xff08;Windows/Linux&#xff09;或Cmd Shift P&#xff08;Mac&#xff09;来打开命令面板。输入open settings&#xff0c;然后选择 Open User Settings(JSON)。打开settings.json文件 ------修改设置-----&#xff1a; 1、 html代码的行长度&am…

汽车电子元件的可靠性保障:AEC-Q102认证

AEC-Q102标准的起源与价值 随着汽车电子系统的日益复杂&#xff0c;电子器件必须能够在极端的温度、湿度、振动和电磁干扰等恶劣条件下保持性能。AEC-Q102标准由汽车电子委员会&#xff08;AEC&#xff09;制定&#xff0c;专门针对LED、激光二极管和光电二极管等光电器件&…

RK3576 Android14,内存大于4G时UVC应用无法申请内存

最近有个项目需要将Linux虚拟成UVC摄像头&#xff0c;开发过程中遇到一个奇怪的事情&#xff0c;通过V4l2框架接口申请内存时&#xff0c;相同的板子&#xff0c;只是内存一个4G一个8G。4G的内存可以申请成功&#xff0c;8G就不行。提示“内存不足” 内存更大反而内存不足&…