介绍
- 现有一信息量为5页的作业要装入,运行分配程序,为作业分配主存且建立页面,之后运行回收程序。过程中打印分配与回收前后位示图和空闲块数
- 有一作业执行结束,它占用的块号为第4,5,6,31块,运行回收程序,回收作业,归还主存块。打印回收前后位示图和空闲块数。
- 当装入一个作业时,当前空闲块数不能满足作业需求则分配失败
相关阅读
Python|页面置换模拟程序设计
Python|银行家算法
Python|独占设备的分配和回收模拟
Python|模拟文件系统
Python|进程调度算法
Python|分页管理方式下存储分配情况模拟
Python|Windows下实现经典进程同步问题——理发师问题
Python|模拟实现动态分区存储管理
完整代码
import numpy
from collections import Counter
main_memory = numpy.asarray([
[1, 1, 0, 0, 1, 1, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 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],
])
page_table = []
def current_free_blocks():
# 查找当前空闲块数
counts = Counter(main_memory.flatten())
return counts[0]
def is_need(need):
# 当前空闲块数是否能满足作业要求
if need > current_free_blocks():
return False
else:
return True
def bolck_number(i, j):
# 块号
return i * 8 + j
def byte_number(block_number):
# 字节号
j = block_number // 8
return j
def digits(block_number):
# 位数
i = block_number % 8
return i
def show_page_table(page_table):
# 输出页表
print('----------------------页表------------------------')
print('页号\t|块号')
for i in range(len(page_table)):
print('{}\t|{}'.format(i, page_table[i]))
print('-------------------------------------------------')
def show_bitmap():
for i in main_memory:
print(i)
def allocate_space(pages):
# 分配空间
print('开始分配……')
for i in range(8):
for j in range(8):
if main_memory[i][j] == 0:
main_memory[i][j] = 1
page_table.append(bolck_number(i, j))
pages -= 1
if pages == 0:
break
if pages == 0:
break
print('分配成功!')
def free_space(page_table):
# 回收空间
print('开始回收……')
for i in page_table:
main_memory[byte_number(i)][digits(i)] = 0
print('回收成功!')
def load():
# 装入作业
print('当前空闲块数:', current_free_blocks())
pages = int(input('请输入要装入作业的页数:'))
print('-------------------------------------------------')
if not is_need(pages):
print('当前空闲块数不能满足作业要求,分配失败!\n')
return
else:
print('-------------------分配前的位示图-------------------')
show_bitmap()
print('-------------------------------------------------')
allocate_space(pages)
show_page_table(page_table)
print('分配后空闲块数:', current_free_blocks())
print('-------------------分配后的位示图-------------------')
show_bitmap()
print('-------------------------------------------------')
print('-------------------回收前的位示图-------------------')
show_bitmap()
print('-------------------------------------------------')
free_space(page_table)
print('回收后空闲块数:', current_free_blocks())
print('-------------------回收后的位示图-------------------')
show_bitmap()
print('-------------------------------------------------')
def sample():
# 执行文档中的示例,回收一个占用的块号为第4,5,6,31块的作业
print('当前空闲块数:', current_free_blocks())
sample_page_table = [4, 5, 6, 31]
show_page_table(sample_page_table)
print('-------------------回收前的位示图-------------------')
show_bitmap()
print('-------------------------------------------------')
free_space(sample_page_table)
print('回收后空闲块数:', current_free_blocks())
print('-------------------回收后的位示图-------------------')
show_bitmap()
print('-------------------------------------------------')
# sample()
load()