页面置换算法——LRU的简易实现(C++)

LRU(最近最久未使用)是一种页面置换算法,当发生缺页时,会选择最长时间未被访问的页面进行置换。文章通过图解和C++代码实现,解释了LRU的工作原理,使用双向链表和map来维护数据结构。

LRU

最近最久未使用的置换算法(LRU):最近最久未使用(LRU)的置换算法的基本思路是,发生缺页时,选择最长时间没有被访问的页面进行置换,也就是说,该算法假设已经很久没有使用的页面很有可能在未来较长的⼀段时间内仍然不会被使用。

图解:

在这里插入图片描述
最后一步因为1号页面是「过去时间段里最久没有被访问的」, 所以把1号页面换出到磁盘,然后把3号页面换入到内存。

代码简易实现

#include<iostream>
#include<list>
#include<map>
using namespace std;
struct MyLRUnode
{
   
   
	int key;//形成key+value结构
	int value;
	MyLRUnode(int a, int b) :key(a), value(b){
   
   }
};
class LRUCache
{
   
   
public:
	LRUCache(int size)
	{
   
   
		Lru_capacity = size;
	}
	int get(int key)
	{
   
   
		if (mymap.find(key) != mymap.end(
《操作系统原理》课程设计项目选题(二) 一、 进程管理与并发同步类(5 个) 1. Linux 多线程进程调度器模拟器 ❖ 核心目标:基于 Linux pthread 库,模拟 4 种经典调度算法,结合 Linux 进程特性实现优先级与时间片控制。 ❖ 小组分工 (1) 进程结构体设计 + 调度队列实现(含 PID、状态、优先级等属性); (2) FCFS、SJF 算法实现(3) 优先级调度、时间片轮转算法实现(4) 性能统计模块(周转时间、带权周转时间、吞吐量计算); (5) 可视化界面 + 测试用例设计(Linux 终端输出调度流程)。 ❖ 技术要求 (1) 使用 C++ 封装Process类、Scheduler类,调用pthread库创建线程模拟进程; (2) 支持动态添加进程(输入到达时间、服务时间); (3) 对比不同算法在 Linux 下的调度开销(CPU 占用率、上下文切换次数)。 ❖ 验收标准:功能正常运行,输出性能对比报表,答辩需讲解调度算法与 Linux 内核调度的差异。 2. Linux 下的生产者 - 消费者问题强化版 ❖ 核心目标:结合 Linux 信号量(sem.h)与互斥锁,实现支持动态缓冲区大小的并发模型,解决死锁与饥饿问题。 ❖ 小组分工 (1) 缓冲区类设计(支持动态扩容 / 缩容); (2) 生产者线程实现(生成不同类型数据); (3) 消费者线程实现(分类处理数据); (4) 同步机制设计(信号量 + 互斥锁,避免竞态条件); (5) 监控模块(实时输出缓冲区状态、线程执行日志)。 ❖ 技术要求 (1) 使用 C++ RAII 机制管理 Linux 信号量与互斥锁,防止资源泄漏; (2) 支持多生产者(≥3)、多消费者(≥3)并发执行; (3) 模拟 Linux 下的进程挂起 / 唤醒操作。 ❖ 验收标准:无数据丢失、重复读取现象,答辩需分析同步机制的安全性。 3. 基于 Linux IPC 的读者 - 写者问题综合实验 ❖ 核心目标:对比 Linux 管道、消息队列、共享内存三种 IPC 机制,实现两种优先级策略的读者 - 写者模型。 ❖ 小组分工 (1) 读者线程模块(支持批量读取); (2) 写者线程模块(支持数据写入与权限校验); (3) 管道 + 消息队列 IPC 实现(4) 共享内存 + 信号量 IPC 实现(5) 性能测试模块(统计不同 IPC 的延迟、吞吐量)。 ❖ 技术要求 (1) 调用 Linux 系统调用(pipe/msgget/shmget)实现 IPC; (2) 分别实现 “读者优先” 和 “写者优先” 策略,对比饥饿现象; (3) 使用 C++ 封装 IPC 操作类,降低耦合度。 ❖ 验收标准:两种策略功能区分明确,性能对比数据合理,答辩需讲解 Linux IPC 的底层原理。 4. Linux 环境下的银行家算法死锁检测系统 ❖ 核心目标:模拟 Linux 内核资源分配机制,实现支持多资源类型的死锁避免与检测工具。 ❖ 小组分工 (1) 资源矩阵设计(最大需求、分配、可用矩阵); (2) 安全性检查算法实现(3) 资源请求处理模块(支持动态申请 / 释放); (4) 死锁检测模块(资源图化简算法); (5) 命令行交互界面(Linux 终端输入输出)。 ❖ 技术要求 (1) 基于 C++ STL 容器(vector/map)存储矩阵数据; (2) 模拟 Linux 下的进程资源请求流程,支持资源抢占; (3) 输出安全序列与死锁进程列表。 ❖ 验收标准:正确拒绝不安全请求,检测死锁准确率 100%,答辩需结合 Linux 内核死锁处理机制讲解。 5. Linux 多线程时钟同步与事件排序系统 ❖ 核心目标:基于 Lamport 逻辑时钟与向量时钟,实现分布式进程的事件排序与同步。 ❖ 小组分工 (1) 逻辑时钟模块实现(2) 向量时钟模块实现(3) 进程间消息传递模块(Linux UDP 套接字); (4) 事件日志记录与分析模块; (5) 时钟同步精度测试模块。 ❖ 技术要求 (1) 使用 C++ 封装时钟类,支持时钟值的比较与更新; (2) 模拟 5 个以上分布式进程,输出事件的偏序 / 全序关系; (3) 对比逻辑时钟与向量时钟的同步精度。 ❖ 验收标准:事件排序结果符合理论预期,答辩需讲解分布式系统时钟同步的意义。 二、 内存管理类(4 个) 6. Linux 分页存储管理模拟系统 ❖ 核心目标:模拟 Linux 分页机制,实现地址转换、页表管理、缺页中断处理,结合 LRU 页面置换算法。 ❖ 小组分工 (1) 页表结构设计(多级页表模拟); (2) 逻辑地址→物理地址转换模块; (3) 缺页中断处理模块; (4) LRU 页面置换算法实现(5) 内存访问统计模块(缺页率、访问时间计算)。 ❖ 技术要求 (1) 基于 C++ 模拟 Linux 页表项(含存在位、脏位、权限位); (2) 支持自定义页大小、内存块数; (3) 模拟 Linux 下的缺页异常处理流程。 ❖ 验收标准:地址转换无误,缺页率计算准确,答辩需对比 Linux 真实分页机制。 7. 段页式存储管理与地址转换系统 ❖ 核心目标:整合分段与分页优势,实现段页式地址转换,模拟 Linux 内存权限校验机制。 ❖ 小组分工 (1) 段表结构设计(含段权限、页表基址); (2) 页表模块实现(与分段模块对接); (3) 三级地址转换模块(逻辑地址→物理地址); (4) 权限校验模块(读 / 写 / 执行权限检查); (5) 地址越界异常处理模块。 ❖ 技术要求 (1) 使用 C++ 封装段表类、页表类,支持动态段创建; (2) 模拟 Linux 下的内存访问异常(段错误SIGSEGV); (3) 输出地址转换的详细步骤。 ❖ 验收标准:正确处理地址越界,权限校验有效,答辩需讲解段页式的优势。 8. Linux 虚拟内存管理器模拟器 ❖ 核心目标:模拟 Linux 虚拟内存的请求调页与页面置换机制,实现内存与磁盘的交互。 ❖ 小组分工 (1) 虚拟内存空间设计(进程地址空间划分); (2) 请求调页模块(按需加载页面到内存); (3) 页面置换算法实现(FIFO、LRU、Clock); (4) 磁盘交换区模拟(Linux 文件模拟磁盘块); (5) 性能对比模块(三种算法的缺页率、磁盘 I/O 次数)。 ❖ 技术要求 (1) 使用 C++ 文件操作模拟磁盘交换区,实现页面的换入 / 换出; (2) 模拟 Linux 下的内存不足场景,触发页面置换(3) 支持自定义页面访问序列。 ❖ 验收标准:虚拟内存与物理内存数据一致,答辩需讲解 Linux 虚拟内存的底层原理。 9. 动态分区分配与内存碎片整理系统 ❖ 核心目标:实现三种动态分区算法,模拟 Linux 内存碎片的产生与整理过程。 ❖ 小组分工 (1) 内存分区结构体设计(含分区信息、空闲链表); (2) 首次适应、最佳适应算法实现(3) 最坏适应算法实现(4) 内存碎片整理模块(紧凑算法); (5) 可视化模块(输出内存分区布局变化)。 ❖ 技术要求 (1) 基于 C++ 链表实现空闲分区管理; (2) 支持进程的内存申请、释放、碎片整理触发; (3) 统计不同算法的碎片率。 ❖ 验收标准:碎片整理后内存利用率提升,答辩需分析碎片产生的原因及解决策略。 三、 文件系统类(5 个) 10. Linux 风格的迷你文件系统 ❖ 核心目标:基于 Linux 虚拟磁盘(文件模拟),实现支持多级目录的简易文件系统,包含 inode、数据块管理。 ❖ 小组分工 (1) 虚拟磁盘结构设计(引导块、超级块、inode 区、数据区); (2) inode 管理模块(创建、删除、查询); (3) 目录管理模块(mkdir、ls、cd 命令实现); (4) 文件操作模块(create、read、write、delete 命令实现); (5) 磁盘空间管理模块(位图法分配 / 回收数据块)。 ❖ 技术要求 (1) 使用 C++ 封装Disk类、Inode类、File类; (2) 模拟 Linux 文件系统的目录项结构; (3) 支持文件的随机读写与权限设置。 ❖ 验收标准:所有命令功能正常,数据存储与读取无误,答辩需对比 Linux ext4 文件系统。 11. Linux 磁盘调度算法模拟器 ❖ 核心目标:模拟 Linux 磁盘 I/O 调度机制,实现 4 种经典磁盘调度算法,对比寻道性能。 ❖ 小组分工 (1) 磁盘请求队列设计(支持动态添加请求); (2) FCFS、SSTF 算法实现(3) SCAN、C-SCAN 算法实现(4) 磁头移动轨迹可视化模块; (5) 性能统计模块(寻道时间、吞吐量计算)。 ❖ 技术要求 (1) 基于 C++ 模拟磁盘柱面结构,自定义磁头初始位置; (2) 对比不同算法在随机请求、连续请求下的性能; (3) 结合 Linux 真实磁盘调度策略(如 CFQ)分析。 ❖ 验收标准:寻道距离计算准确,性能对比符合理论,答辩需讲解 Linux 磁盘调度的优化策略。 12. 基于 Linux 管道的文件压缩与解压缩工具 ❖ 核心目标:结合 Linux 管道 IPC 与 Huffman 算法实现多线程文件压缩 / 解压缩工具,支持大文件分片处理。 ❖ 小组分工 (1) 文件分片模块(将大文件分为多个数据块); (2) Huffman 树构建与编码模块; (3) Huffman 解码模块; (4) 管道通信模块(分片传输与合并); (5) 进度监控与性能测试模块。 ❖ 技术要求 (1) 使用 C++ 多线程处理分片数据,调用 Linux 管道实现进程间通信; (2) 支持压缩率计算,对比不同文件类型的压缩效果; (3) 模拟 Linux 下的文件权限校验(仅允许读权限的文件压缩)。 ❖ 验收标准:压缩后文件可正确解压缩,压缩率高于 30%,答辩需讲解管道通信的优势。 13. Linux 日志型文件系统事务模拟 ❖ 核心目标:模拟 Linux 日志文件系统(如 ext3)的 Journal 机制,实现事务的提交与回滚,保证数据一致性。 ❖ 小组分工 (1) 日志结构设计(事务 ID、操作类型、数据内容); (2) 事务管理模块(Begin、Commit、Rollback 操作); (3) 文件操作模块(创建、写入、删除); (4) 系统崩溃恢复模块(基于日志恢复未完成事务); (5) 一致性校验模块(检查文件系统完整性)。 ❖ 技术要求 (1) 基于 C++ 实现 “先写日志后写数据” 的机制; (2) 模拟 Linux 系统崩溃场景(强制终止程序); (3) 支持事务的嵌套与并发执行。 ❖ 验收标准:崩溃后数据可完整恢复,无数据损坏,答辩需讲解日志文件系统的意义。 14. Linux 文件系统权限管理模拟器 ❖ 核心目标:模拟 Linux 文件权限机制(用户、组、其他),实现权限校验与修改功能。 ❖ 小组分工 (1) 用户与组管理模块(创建用户、分配组); (2) 文件权限位设计(读 / 写 / 执行权限); (3) 权限校验模块(判断用户是否有权限操作文件); (4) 权限修改模块(chmod、chown 命令实现); (5) 命令行交互界面(模拟 Linux 终端操作)。 ❖ 技术要求 (1) 基于 C++ 封装User类、Group类,模拟 Linux 用户管理; (2) 实现权限位的二进制与八进制转换; (3) 模拟 Linux 下的权限不足异常处理。 ❖ 验收标准:权限校验准确,命令功能正常,答辩需讲解 Linux 权限管理的底层原理。 四、 设备管理类(2 个) 15. Linux SPOOLing 技术模拟系统 ❖ 核心目标:模拟 Linux 假脱机技术,将独占设备(打印机)改造为共享虚拟设备,支持多进程并发打印。 ❖ 小组分工 (1) 输入井 / 输出井设计(内存缓冲区 + 磁盘缓存); (2) 预输入进程实现(读取用户打印任务); (3) 缓输出进程实现(控制虚拟打印机输出); (4) 设备驱动模拟模块(模拟打印机硬件接口); (5) 任务队列管理模块(优先级排序、任务状态监控)。 ❖ 技术要求 (1) 使用 C++ 多线程模拟预输入 / 缓输出进程; (2) 调用 Linux 文件系统存储打印任务; (3) 支持打印任务的暂停、取消、优先级调整。 ❖ 验收标准:多进程并发打印无冲突,任务执行顺序正确,答辩需讲解 SPOOLing 技术的优势。 16. Linux 字符设备驱动模拟器 ❖ 核心目标:模拟 Linux 字符设备驱动框架,实现键盘、串口等设备的驱动接口,支持用户进程调用。 ❖ 小组分工 (1) 设备控制块(DCB)设计(设备状态、缓冲区); (2) 键盘设备驱动实现(模拟按键输入); (3) 串口设备驱动实现(模拟数据收发); (4) 驱动接口封装(open、read、write、close); (5) 用户进程模拟模块(调用驱动接口进行 I/O 操作)。 ❖ 技术要求 (1) 基于 C++ 模拟 Linux 驱动的 file_operations 结构体; (2) 实现设备的中断处理模拟(如键盘按键中断); (3) 支持多用户进程并发访问设备。 ❖ 验收标准:驱动接口调用正常,设备 I/O 操作无误,答辩需讲解 Linux 设备驱动的架构。 五、 综合型项目(4 个) 17. 迷你 Linux 内核雏形 ❖ 核心目标:整合进程、内存、文件三大模块,实现一个带命令行接口的极简内核雏形,运行于 Linux 用户态。 ❖ 小组分工 (1) 进程管理子系统(多线程调度、IPC); (2) 内存管理子系统(分页存储、LRU 置换); (3) 文件系统子系统(多级目录、基本文件操作); (4) 命令行解释器(Shell)实现(支持 10 + 条自定义命令); (5) 系统集成与测试(模块对接、Bug 修复)。 ❖ 技术要求 (1) 全程使用 C++ 面向对象设计,模块间低耦合; (2) 模拟 Linux 内核的系统调用接口(如 fork、exec、open); (3) 支持后台进程运行(& 符号)。 ❖ 验收标准:Shell 命令正常执行,系统稳定无崩溃,答辩需讲解内核模块的设计思路。 18. Linux 多线程断点续传下载工具 ❖ 核心目标:结合多线程并发、文件 I/O、断点续传技术,实现一个 Linux 下的文件下载工具,支持 HTTP / 本地文件下载。 ❖ 小组分工 (1) 分块下载模块(将文件分为多个块,多线程下载); (2) 断点续传模块(记录已下载块位置,支持断点恢复); (3) 进度监控模块(实时输出下载进度、速度); (4) 文件合并模块(下载完成后合并分块文件); (5) 性能优化模块(调整线程数、缓冲区大小)。 ❖ 技术要求 (1) 使用 C++ pthread 库实现多线程下载,调用 Linux 文件操作函数; (2) 支持自定义分块大小、线程数量; (3) 模拟网络异常场景(断网后恢复下载)。 ❖ 验收标准:断点续传功能正常,多线程下载速度高于单线程,答辩需讲解并发优化策略。 19. Linux 进程监控与资源管理工具 ❖ 核心目标:模拟 Linux top命令,实现进程监控、资源限制、进程控制功能,支持 CPU / 内存使用率统计。 ❖ 小组分工 (1) 进程信息采集模块(读取 Linux /proc 文件系统); (2) CPU / 内存使用率计算模块; (3) 进程控制模块(支持 kill、pause、resume 操作); (4) 资源限制模块(设置进程 CPU 时间、内存上限); (5) 终端可视化模块(实时刷新进程列表)。 ❖ 技术要求 (1) 使用 C++ 读取 Linux /proc 目录下的进程信息文件; (2) 调用 Linux 系统调用(kill、setrlimit)实现进程控制; (3) 支持按 CPU / 内存使用率排序进程。 ❖ 验收标准:监控数据与 Linux top 命令一致,进程控制功能有效,答辩需讲解 /proc 文件系统的作用。 20. Linux 分布式进程通信与协同系统 ❖ 核心目标:基于 Linux UDP/TCP 套接字,实现分布式进程的通信、同步与协同任务执行。 ❖ 小组分工 (1) 网络通信模块(TCP/UDP 套接字封装); (2) 进程同步模块(分布式锁、向量时钟); (3) 任务分配模块(主节点分配任务,从节点执行); (4) 任务执行模块(从节点并行处理任务); (5) 结果汇总与可视化模块(主节点收集结果并输出)。 ❖ 技术要求 (1) 使用 C++ 网络编程实现进程间通信; (2) 模拟 5 个以上分布式节点,支持节点动态加入 / 退出; (3) 实现任务的负载均衡分配。 ❖ 验收标准:分布式进程协同执行任务无误,网络通信稳定,答辩需讲解分布式系统的设计难点 哪一个课程设计最简单
最新发布
12-16
时钟算法 页面置换算法 #pragma once #include <iostream> #include "Pclass.h" using namespace std; class Allocation { private: int pnum;//页面数 int bnum;//分配块数 //int ID; int num;//访问页面次数 Pclass * block;//块数组 int *page;//页访问顺序 //int p; public: Allocation(int pn,int bl,int n) { pnum=pn; bnum=bl; num=n; //ID=id; block=new Pclass [bnum]; page=new int [num]; cout<<"页面访问顺序:"; for(int i=0;i<num;i++) { page[i]=rand()%pnum+1; cout<<page[i]<<" "; } cout<<endl; //p=0; } void FIFO() { cout<<"先进先出算法:"<<endl; int p=0; int nm=0; for(int i=0;i<num;i++) { if(Haven(page[i])!=(-1)) { nm++; } else { block[p].num=page[i]; p=(++p)%bnum; } for(int j=0;j<bnum;j++) { if(block[j].num!=0) { cout<<block[j].num<<" "; } } cout<<endl; } cout<<"命中率为:"<<(double)nm/(double)num<<endl; } int Haven(int n) { for(int i=0;i<bnum;i++) { if(block[i].num==n) { return i; } } return -1; } void LRU() { int p=0; int nm=0; for(int i=0;i<bnum;i++) { block[i].num=0; block[i].visited=false; } for(int i=0;i<num;i++) { int temp=Haven(page[i]); if(temp!=(-1)) { block[temp].visited=true; nm++; } else { //int j=0; while(1) { if(block[p].visited==false) { block[p].num=page[i]; p=(++p)%bnum; break; } else { block[p].visited=false; p=(++p)%bnum; } } } for(int j=0;j<bnum;j++) { if(block[j].num!=0) { cout<<block[j].num<<" "; } } cout<<endl; } cout<<"命中率为:"<<(double)nm/(double)num<<endl; } void SLRU() { int p=0; int nm=0; for(int i=0;i<bnum;i++) { block[i].num=0; block[i].visited=false; } for(int i=0;i<num;i++) { int temp=Haven(page[i]); if(temp!=(-1)) { block[temp].visited=true; nm++; } else { for(int j=0;j<bnum;j++) { if(block[p].visited==false&&block[p].changed==false) { block[p].num=page[i]; if(rand()%2) { block[p].changed=true; } p=(++p)%bnum; goto over; } else { block[p].visited=false; p=(++p)%bnum; } } while(1) { if(block[p].changed==false) { block[p].num=page[i]; p=(++p)%bnum; break; } else { block[p].changed=false; p=(++p)%bnum; } } } over: for(int j=0;j<bnum;j++) { if(block[j].num!=0) { cout<<block[j].num<<" "; } } cout<<endl; } cout<<"命中率为:"<<(double)nm/(double)num<<endl; } ~Allocation(void) { } };
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值