一、实验目的:
目的:熟悉并掌握基本分页存储管理的思想及其实现方法,熟悉并掌握基本分页存储管理的分配和回收方式。
任务:模拟实现基本分页存储管理方式下内存空间的分配和回收。
二、实验内容:
1、实验内容
内存空间的初始化——可以由用户输入初始内存空间各个物理块情况。(用二维矩阵的方式按物理块号,逐行给出每个物理块的状态,1——表示已分配,0——表示未分配,并能够将行标、列标转换 为对应的物理块号,以查看或修改每一个块的状态,要求:初始时部分物理块已分配)
基本分页的分配过程:由用户输入作业号和作业的大小(这里的大小是逻辑页面数),实现分配过程:空间充足,分配,修改状态矩阵的相应位置的值(值由0转变为1),并用专门的数据记录下该作业占用的物理块的块号,以备删除作业时回收空间。
作业空间的回收:用户输入作业号,实现分区回收(通过相应的数据结构找到该作业占有的物理块号,将块号转变成对应的行标、列标,将对应位置的值由1转变成0就完成了回收)。
分区的显示:任何时刻,可以查看当前内存的情况(显示记录内存情况的矩阵的值)。
2、实验要求
(1)内存空间不足的情况,要有相应的显示;
(2)作业不能同名,但是删除后可以再用这个名字;
(3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。
三、实验代码
import random
class Work:
blockStorage = []
def __init__(self, workName='', pageSize=0):
self.workName = workName
self.pageSize = pageSize
def initMemory(mylist):
count = 0
for i in range(10):
k = []
mylist.append(k)
for j in range(10):
k.append(0)
count = count + 1
print("随机向内存的10个物理块分配空间...")
k = 0
while k < 10:
i = random.randint(0, 9)
j = random.randint(0, 9)
mylist[i][j] = 1
k = k + 1
return mylist
def showMemory(memory):
for i in range(10):
print(memory[i])
print()
def Partition(Mylist, Work):
pageTemp = Work.pageSize
for i in range(10):
for j in range(10):
if Mylist[i][j] != 1:
Mylist[i][j] = 1
# 记录分配的每个物理块的行和列
Work.blockStorage.append([i, j])
pageTemp = pageTemp - 1
# 判断该作业是否已经分配至内存空间
if (pageTemp == 0):
return
def getMemorySize(Mylist):
count = 0
for i in range(10):
for j in range(10):
if Mylist[i][j] != 1:
count = count + 1
return count
def freeMemory(Mylist, Work):
pageTemp = Work.pageSize
while pageTemp >= 0:
i = Work.blockStorage[pageTemp - 1][0]
j = Work.blockStorage[pageTemp - 1][1]
Mylist[i][j] = 0
pageTemp = pageTemp - 1
if __name__ == '__main__':
print("内存空间初始化:")
mylist = []
mylist = initMemory(mylist=mylist)
showMemory(mylist)
works = [] # 作业列表
while True:
print('1:分配\t\n2:回收\t\n3:显示\t\n4:退出')
select = input('请输入想要执行的功能:')
if select == '4':
break
elif select == '1':
repeatFlag = 'y'
while (repeatFlag == 'y'):
try:
workName, pageSize = input("请输入作业名称和大小:").split()
for work in works:
if workName == work.workName:
print('作业已存在')
break
count=getMemorySize(mylist)
if int(pageSize)<=count:
work = Work(workName, int(pageSize))
Partition(mylist, work)
works.append(work)
else:
print("内存空间不足...")
except Exception as e:
print(e)#"输入有误,请重新输入"
else:
repeatFlag = input('是否继续(y/n):')
elif select == '2':
workName = input('请输入所要删除作业的名称:')
findResult = 0
workTemp = Work()
for work in works:
if workName == work.workName:
workTemp = work
findResult = 1
break
if findResult == 0:
print("作业不存在...\n")
freeMemory(mylist, workTemp)
elif select == '3':
showMemory(mylist)
else:
print("输入错误,请重新输入")
四、实验结果
首先进行内存的初始化:
进行三个作业的内存分配:
内存空间状态:
输入同名作业a,提示作业已经存在:
输入作业大小超过内存空间的作业f,提示内存空间不足:
回收作业a和作业b,内存空间状态:
回收作业c,内存空间状态:
回收一个不存在的作业g,提示作业不存在:
五、实验总结
通过本次基本分页存储管理实验,我进一步掌握了基本分页存储管理的思想和相应的实现方法,其次掌握了基本分页存储管理的分配和回收方式。
这次的实验相较于上次的动态分区存储管理实验相比相对来说要容易一些,而且本次实验中对于多种情况的处理包括内存空间不足、作业不能同名等都有着类似的实现思想,因此这次的实验总体而言进行地较为顺利,遇到的一些问题也都得到了很好的解决。
在具体的实现过程中,也有几个亮点。比如在对初始时部分已分配物理块的选择上,我没有直接将固定某些行列对应的物理块实现分配,而是调用了Python中的random函数,随机向内存的若干个物理块分配空间。这在一定程度上增加了该模拟实验的随机性和真实性。其次因为作业分配和回收之间需要靠物理块号来确定每个作业所有物理块在内存中的位置,这其中需要进行行号、列号与物理块号的转换,稍微有一些麻烦,我采用的是通过在作业数据结构定义一个存储每一个物理块行号和列号的列表,每分配一个页面到物理块就记录该物理块的行号与列号,两者作为一个元素,保存至该列表中,在进行作业回收时直接根据该列表中的记录在内存中回收物理块即可,相对来说实现容易一些。
总的来说,这次实验加深了我对基本分页存储管理思想的理解,其次也进一步锻炼了自身的coding能力,是一次收获不小的实验。