江苏无锡网站推广及优化,潍坊高新建设局网站,如何在网上销售产品,邢台百度推广一、实验目的 目的#xff1a;熟悉并掌握基本分页存储管理的思想及其实现方法#xff0c;熟悉并掌握基本分页存储管理的分配和回收方式。 任务#xff1a;模拟实现基本分页存储管理方式下内存空间的分配和回收。 二、实验内容
1、实验内容 内存空间的初始化——可以由用户输…一、实验目的 目的熟悉并掌握基本分页存储管理的思想及其实现方法熟悉并掌握基本分页存储管理的分配和回收方式。 任务模拟实现基本分页存储管理方式下内存空间的分配和回收。 二、实验内容
1、实验内容 内存空间的初始化——可以由用户输入初始内存空间各个物理块情况。用二维矩阵的方式按物理块号逐行给出每个物理块的状态1——表示已分配0——表示未分配并能够将行标、列标转换为对应的物理块号以查看或修改每一个块的状态要求初始时部分物理块已分配 基本分页的分配过程由用户输入作业号和作业的大小这里的大小是逻辑页面数实现分配过程空间充足分配修改状态矩阵的相应位置的值值由0转变为1并用专门的数据结构记录下该作业占用的物理块的块号以备删除作业时回收空间。 作业空间的回收用户输入作业号实现分区回收通过相应的数据结构找到该作业占有的物理块号将块号转变成对应的行标、列标将对应位置的值由1转变成0就完成了回收。 分区的显示任何时刻可以查看当前内存的情况显示记录内存情况的矩阵的值。 2、实验要求 1内存空间不足的情况要有相应的显示 2作业不能同名但是删除后可以再用这个名字 3作业空间回收是输入作业名回收相应的空间如果这个作业名不存在也要有相应的提示。 三、实验代码
class Memory:def __init__(self, rows, cols, initial_stateNone):self.rows rowsself.cols colsif initial_state: # 如果有初始状态使用它self.memory initial_stateelse: # 否则初始化为全未分配self.memory [[0] * cols for _ in range(rows)]self.job_records {} # 用于存储作业号与占用块的映射def allocate(self, job_id, job_size):if job_id in self.job_records:print(f作业号 {job_id} 已存在无法重复分配。)returnavailable_blocks []for i in range(self.rows):for j in range(self.cols):if self.memory[i][j] 0: # 查找未分配的块available_blocks.append((i, j))if len(available_blocks) job_size:breakif len(available_blocks) job_size:breakif len(available_blocks) job_size:print(空间不足无法分配所需的作业大小。)return# 进行分配for (i, j) in available_blocks:self.memory[i][j] 1 # 修改状态矩阵block_number i * self.cols jif job_id not in self.job_records:self.job_records[job_id] []self.job_records[job_id].append(block_number)print(f作业 {job_id} 成功分配已占用的物理块: {self.job_records[job_id]})def free(self, job_id):if job_id not in self.job_records:print(f作业号 {job_id} 不存在无法回收。)returnfor block_number in self.job_records[job_id]:i block_number // self.colsj block_number % self.colsself.memory[i][j] 0 # 释放块print(f作业 {job_id} 成功回收。)del self.job_records[job_id] # 删除作业记录def displaying(self):print(内存状态0-未分配, 1-已分配)for i in range(self.rows):for j in range(self.cols):print(f{self.memory[i][j]}, end )print() # 换行if __name__ __main__:N 10 # 定义每行的列数# 初始化部分物理块已分配的状态手动设置initial_memory_state [[0, 1, 0, 0, 0, 1, 0, 0, 0, 0],[0, 0, 0, 0, 1, 1, 1, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[1, 1, 0, 0, 0, 0, 0, 1, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 1, 0, 0, 1, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]memory Memory(rowsN, colsN, initial_stateinitial_memory_state) # 初始化内存包括初始状态while True:print(\n1. 分配作业\n2. 回收作业\n3. 显示内存情况\n4. 退出)choice input(请选择操作: )if choice 1:job_id input(请输入作业号: )job_size int(input(请输入作业大小逻辑页面数: ))memory.allocate(job_id, job_size)elif choice 2:job_id input(请输入要回收的作业号: )memory.free(job_id)elif choice 3:memory.displaying()elif choice 4:print(退出程序)breakelse:print(无效选择请重新选择。) 四、实验结果 初始时部分物理块已分配总大小为100个物理块当分配作业A的大小为100时程序将会显示出空间不足无法分配所需的作业大小当分配作业A的大小为5时程序将会提示作业A分配成功已占用的物理块为[0,2,3,4,6]其中计算当前块的物理块号 block_number使用公式 bi*Nj。 显示出分配作业A后的内存状态如果再次分配作业号为A的作业程序将会提示作业A已存在无法重复分配。 显示出回收作业A后的内存状态与最开始的状态相比没有区别。再次分配作业A大小为6将会发现作业A被成功分配已占用的物理块为[0,2,3,4,6,7]显示出当前内存状态可以查看新分配的作业A所占空间位置。 作业空间回收是输入作业名回收相应的空间如果这个作业名不存在也要有相应的提示。例如回收不存在的作业B程序将会给出提示作业B不存在无法回收。