内存分配管理示例项目Python脚本运行逻辑咨询
内存分配管理模拟脚本实现逻辑说明
这是一个带图形界面的操作系统内存分配、优先级任务调度、垃圾回收演示项目,使用链表结构管理模拟内存块,区分超级用户/普通用户两类权限角色,任务素材从同目录文本文件读取,执行过程中会实时展示任务进度与程序实际内存占用。
全局常量与标记
__FILENAME__ = "stories.txt":任务素材读取路径,文件内每一行文本对应一个任务加载的内容__KO_SIZE_BYTE__ = 1024:单位换算常量,即1KB对应的字节数__TIME_TASK_S__ = 5:单个任务默认执行时长,单位为秒__NUMBER_BLOCKS_BY_TASK__ = 5:单个任务默认占用的内存块数量is_locked_for_super_user = False:全局优先级抢占锁,值为True时所有普通用户任务自动暂停,仅超级用户任务可执行
核心数据结构
Block 内存块类
每个实例代表内存链表上的一个独立内存块,单块固定大小为512KB:
- 内置状态枚举:
FREE(空闲,可回收)、BUSY(被任务占用) - 核心属性:
number_of_blocks:当前块组占用的连续内存块数量state:内存块当前状态data:块存储的二进制数据,初始化时会自动补零填满分配的全部块空间next_block:链表指针,指向同链表的下一个内存块
- 核心方法
add():递归遍历到链表尾部追加新块,返回新块的索引位置
MemoryBlock 内存链表管理类
以单向链表结构统一管理所有已分配的模拟内存块:
- 支持通过索引直接访问链表任意位置的内存块
- 核心方法:
add():链表为空时将新块设为头节点,否则递归追加到链表尾部,返回新块索引remove():按索引删除指定内存块,自动维护链表指针保证结构连续size():遍历链表返回当前已分配的总内存块数量
核心线程类
Task 单任务线程类
继承Python原生线程类,每个实例对应一个实际执行的用户任务:
- 内置枚举定义:
- 任务优先级:
HIGH(超级用户任务,高优先级)、LOW(普通用户任务,低优先级) - 运行状态:
ACTIVE(运行中)、SLEEPING(未启动/执行完成休眠)
- 任务优先级:
- 初始化逻辑:创建任务时自动向内存链表申请对应数量的内存块,标记为占用状态,保存分配到的块索引
- 运行逻辑:
- 启动后将自身状态设为
ACTIVE,按执行时长计算每秒需要展示的文本字符数 - 在对应权限的GUI任务列表中新增自身的进度条目
- 逐秒更新GUI上的执行进度,每次更新前检查全局锁:如果是普通用户任务且超级用户正在执行,就循环休眠直到锁释放
- 逐秒追加展示的文本长度,模拟任务逐步加载执行的效果
- 执行满设定时长后展示完整文本,将自身状态设为
SLEEPING,对应占用的内存块标记为FREE待回收
- 启动后将自身状态设为
TaskManager 任务调度线程类
负责批量启动、调度同权限下的所有任务:
- 启动前先检查全局锁:如果调度的是普通用户任务且超级用户正在执行,先休眠等待锁释放
- 打乱所有待执行的故事文本顺序,保证每次任务执行顺序随机
- 逐个创建Task实例启动,每启动一个任务就等任务进入
ACTIVE状态后再启动下一个 - 阻塞等待同批次所有任务全部执行完成后才退出
工具函数说明
get_memory_usage():调用psutil库获取当前Python进程的实际内存占用,返回值单位为MBlaunch_task_manager():用户点击按钮触发的任务启动入口:- 清空对应权限GUI面板的旧任务记录
- 如果启动的是超级用户任务,先将全局抢占锁设为
True,暂停所有正在运行的普通用户任务 - 创建TaskManager实例启动,等待所有任务执行完毕
- 倒序遍历内存链表,删除所有标记为
FREE的空闲块,模拟垃圾回收(倒序遍历避免删除节点导致索引错乱) - 如果是超级用户任务执行完毕,将全局抢占锁设为
False,恢复普通用户任务执行
read_stories():读取指定txt文件的所有行,去掉换行符后返回文本列表作为任务素材monitor_interface():常驻独立线程,每秒读取一次进程内存占用,更新GUI底部的内存进度条和数值说明,自动调整进度条最大值匹配历史最高内存占用
完整运行流程
- 程序启动进入主函数:
- 初始化空的内存块链表
- 读取同目录下
stories.txt的所有行作为任务素材 - 基于turtle+tkinter绘制800*600尺寸的GUI窗口:左侧为超级用户任务列表+启动按钮,右侧为普通用户任务列表+启动按钮,底部为内存占用进度条+数值说明标签
- 启动常驻内存监控线程,实时更新内存占用展示
- 进入GUI事件循环等待用户操作
- 用户点击对应权限的启动按钮后,独立线程触发
launch_task_manager流程,按调度规则执行任务、更新进度、回收内存 - 优先级抢占规则:普通用户任务执行过程中,如果用户点击超级用户启动按钮,全局锁立刻置为
True,所有运行中的普通用户任务会进入休眠暂停状态,等超级用户所有任务执行完毕、锁释放后,普通用户任务从暂停位置继续执行
运行前置要求
- 脚本同目录下必须存在
stories.txt文件,每行填写一段非空文本作为单个任务的加载内容 - 依赖第三方库
psutil,运行前需执行pip install psutil完成安装
内容的提问来源于stack exchange,提问作者proxy
相关产品推荐
相关产品推荐

