Python简单模拟分页存储管理系统

编程入门 行业动态 更新时间:2024-10-12 20:25:07

Python简单模拟分页存储<a href=https://www.elefans.com/category/jswz/34/1769858.html style=管理系统"/>

Python简单模拟分页存储管理系统

要求:

  1. 定义分页的地址结构和页表结构。
  2. 对进程的逻辑地址空间、页表起址、给定的逻辑地址进行初始化。
  3. 实现从逻辑地址到物理地址的变换。
  4. 实现“主存空间的共享和保护”功能。
  5. 实现“主存扩充”虚拟功能。
    import random
    import sys
    '''
    nei:主存容量
    wai:外存容量
    b:页面大小
    c:页面数
    d:页表
    k:逻辑地址
    f:物理地址
    occupy:已用物理块
    '''def aaa(nei, wai, b, c):# 已占内存occupy1 = []hh1 = []for i in range((nei // (b * 2) - 4)):hh = random.randint(0, nei // b)while hh in hh1:hh = random.randint(0, nei // b)hh1.append(hh)occupy1.append(hh)# 占用大量内存occupy3 = []hh3 = []for i in range((nei // b - 4)):hh = random.randint(0, nei // b)while hh in hh3:hh = random.randint(0, nei // b)hh3.append(hh)occupy3.append(hh)# 已占外存occupy2 = []hh2 = []for i in range(wai // (3 * b)):hh = random.randint(0, wai // b)while hh in hh2:hh = random.randint(0, wai // b)hh2.append(hh)occupy2.append(hh)hhh = eval(input("请选择需不需要内存扩充: 1 需要  2 不需要: "))# 设置页表并进行初始化d = {}  # 页表,包含页号,物理块号,状态位,访问字段A,修改位M,外存地址d1 = []  # 用来存放已有内存物理块号d2 = []  # 用来存放已有外存物理块号dd = []  # 用来存放页表中除页号的所有信息if hhh == 2:ff = (nei // b) - len(occupy1)if c <= ff:for i in range(c):j1 = random.randint(0, nei // b)j2 = random.randint(0, wai // b)while j1 in d1 or j1 in occupy1:j1 = random.randint(0, nei // b)while j2 in d2 or j2 in occupy2:j2 = random.randint(0, nei // b)d1.append(j1)d2.append(j2)occupy2.append(j2)dd.append(j1)  # 将内存物理块号放入dddd += [0, 0, 0]  # 设置状态位P为0,访问字段A为0,修改位M为0dd.append(j2)  # 将外存物理块号放入dddd.append(0)  # 共享状态,1共享d[i] = dddd = []for i in range(c // 2):  # 将一半页表放入内存d[i][1] = 1occupy1.append(d[i][0])occupy2.remove(d[i][4])for i in range(c // 2, (c // 2) + 2):d[i][3] = 1for i in range(c // 2):x = random.randint(0, c-1)d[x][5] = 1print("页表为: ")print("页号  物理块号  状态位  访问字段  修改位  外存地址  共享状态")for i in range(c):print(" {0:>0}    {1:>4}  {2:>5}  {3:>7}{4:>9}{5:>12}{6:>13}".format(i, d[i][0], d[i][1], d[i][2], d[i][3], d[i][4], d[i][5]))# 设置逻辑地址并将其转化成物理地址k = input("请输入逻辑地址(可十进制输入或十六进制输入):")if "0" <= k[-1] <= "9" or k[-1] == "H" or k[-1] == "h":n = []e = 0if k[-1] == "H" or k[-1] == "h":j = {"a": 10, "A": 10, "b": 11, "B": 11, "c": 12, "C": 12, "d": 13, "D": 13, "e": 14, "E": 14, "f": 15, "F": 15}for i in range(len(k)-1):if k[i] in j.keys():n.append(j[k[i]])else:n.append(eval(k[i][0]))for i in range(len(n)):e += n[i] * (16 ** (len(n)-1-i))else:e = eval(k)page = e // b        # 页号offest = e % b       # 页内偏移量if page >= c:print("产生越界中断: ")sys.exit()       # 终止程序if d[page][1] == 0:  # 判断该页在不在内存,1在,0不在print("缺的页: ", d[page])if d[page][0: 5] == [0, 0, 0, 0, 0] or d[page][0: 5] == [0, 0, 0, 1, 0]:  # 判断内存满否,此时内存满print("内存已满,选择一页置换出!")x = random.randint(0, len(occupy1)-1)  # 内存满时选择一页换出if d[page][3] == 1:  # 判断该页是否修改,0为否,1为是print("该页已被修改,将重新写入外存")j2 = random.randint(0, wai // b)while j2 in d2 or j2 in occupy2:j2 = random.randint(0, nei // b)d[page][4] = j2d[page][3] = 0print("将该页写入外存后为:{0}:{1}".format(page, d[page]))d[page][0] = occupy1[x]  # 设置缺页的物理块为从外存置换出的print("置换的物理地址为: ", occupy1[x])d[page][1] = 1    # 将该页从外存换入内存physical = d[page][0]   # 对应的物理块号f = hex(physical * b + offest)  # 物理地址f = list(f)del f[:2]f.append("h")f = "".join(f)print("逻辑地址页号为{},页内偏移为{}".format(page, offest))print("{}对应的物理地址为:{}".format(k, f))else:physical = d[page][0]   # 对应的物理块号f = hex(physical * b + offest)  # 物理地址f = list(f)del f[:2]f.append("h")f = "".join(f)print("逻辑地址页号为{},页内偏移为{}".format(page, offest))print("{}对应的物理地址为:{}".format(k, f))else:print("输入错误!")sys.exit()elif hhh == 1:ff = (nei // b) - len(occupy3)if c <= ff:for i in range(c):j1 = random.randint(0, nei // b)j2 = random.randint(0, wai // b)while j1 in d1 or j1 in occupy3:j1 = random.randint(0, nei // b)while j2 in d2 or j2 in occupy2:j2 = random.randint(0, nei // b)d1.append(j1)d2.append(j2)occupy2.append(j2)dd.append(j1)  # 将内存物理块号放入dddd += [0, 0, 0]  # 设置状态位P为0,访问字段A为0,修改位M为0dd.append(j2)  # 将外存物理块号放入dddd.append(0)  # 共享状态,1共享d[i] = dddd = []for i in range(c // 2):  # 将一半页表放入内存d[i][1] = 1occupy3.append(d[i][0])occupy2.remove(d[i][4])for i in range(c // 2, (c // 2) + 2):d[i][3] = 1else:for i in range(ff):j1 = random.randint(0, nei // b)j2 = random.randint(0, wai // b)while j1 in d1 or j1 in occupy3:j1 = random.randint(0, nei // b)while j2 in d2 or j2 in occupy2:j2 = random.randint(0, nei // b)d1.append(j1)d2.append(j2)occupy2.append(j2)dd.append(j1)  # 将内存物理块号放入dddd += [0, 0, 0]  # 设置状态位P为0,访问字段A为0,修改位M为0dd.append(j2)  # 将外存物理块号放入dddd.append(0)d[i] = dddd = []for i in range(ff, c):  # 内存满时剩余的页表表示d[i] = [0, 0, 0, 0, 0, 0]d[c-2] = [0, 0, 0, 1, 0, 0]  # 选一个页修改位置1for i in range(ff // 2):  # 将一半页表放入内存d[i][1] = 1occupy3.append(d[i][0])occupy2.remove(d[i][4])for i in range(ff // 2, (ff // 2) + 2):d[i][3] = 1d[1][5] = 1print("页表为: ")print("页号  物理块号  状态位  访问字段  修改位  外存地址  共享状态")for i in range(c):print(" {0:>0}    {1:>4}  {2:>5}  {3:>7}{4:>9}{5:>12}{6:>13}".format(i, d[i][0], d[i][1], d[i][2], d[i][3], d[i][4], d[i][5]))# 设置逻辑地址并将其转化成物理地址k = input("请输入逻辑地址(可十进制输入或十六进制输入):")if "0" <= k[-1] <= "9" or k[-1] == "H" or k[-1] == "h":n = []e = 0if k[-1] == "H" or k[-1] == "h":j = {"a": 10, "A": 10, "b": 11, "B": 11, "c": 12, "C": 12, "d": 13, "D": 13, "e": 14, "E": 14, "f": 15, "F": 15}for i in range(len(k)-1):if k[i] in j.keys():n.append(j[k[i]])else:n.append(eval(k[i][0]))for i in range(len(n)):e += n[i] * (16 ** (len(n)-1-i))else:e = eval(k)page = e // b        # 页号offest = e % b       # 页内偏移量if page >= c:print("产生越界中断: ")sys.exit()       # 终止程序if d[page][1] == 0:  # 判断该页在不在内存,1在,0不在print("缺的页: ", d[page])if d[page][0: 5] == [0, 0, 0, 0, 0] or d[page][0: 5] == [0, 0, 0, 1, 0]:  # 判断内存满否,此时内存满print("内存已满,选择一页置换出!")x = random.randint(0, len(occupy3)-1)  # 内存满时选择一页换出if d[page][3] == 1:  # 判断该页是否修改,0为否,1为是print("该页已被修改,将重新写入外存")j2 = random.randint(0, wai // b)while j2 in d2 or j2 in occupy2:j2 = random.randint(0, nei // b)d[page][4] = j2d[page][3] = 0print("将该页写入外存后为:{0}:{1}".format(page, d[page]))d[page][0] = occupy3[x]  # 设置缺页的物理块为从外存置换出的print("置换的物理地址为: ", occupy3[x])d[page][1] = 1    # 将该页从外存换入内存physical = d[page][0]   # 对应的物理块号f = hex(physical * b + offest)  # 物理地址f = list(f)del f[:2]f.append("h")f = "".join(f)print("逻辑地址页号为{},页内偏移为{}".format(page, offest))print("{}对应的物理地址为:{}".format(k, f))else:physical = d[page][0]   # 对应的物理块号f = hex(physical * b + offest)  # 物理地址f = list(f)del f[:2]f.append("h")f = "".join(f)print("逻辑地址页号为{},页内偏移为{}".format(page, offest))print("{}对应的物理地址为:{}".format(k, f))else:print("输入错误!")sys.exit()else:print("输入错误!")sys.exit()# 输出共享页表gongxiang = {}for i in range(c):if d[i][5] == 1:gongxiang[i] = d[i]gongxiang[i].append(random.randint(1, 5))print("共享的页表为:")print("页号  物理块号  状态位  访问字段  修改位  外存地址  共享状态  共享进程计数")for i in gongxiang.keys():print(" {0:>0}    {1:>4}  {2:>5}  {3:>7}{4:>9}{5:>11}{6:>12}{7:>13}".format(i, gongxiang[i][0], gongxiang[i][1], gongxiang[i][2], gongxiang[i][3], gongxiang[i][4], gongxiang[i][5], gongxiang[i][6]))if page in gongxiang.keys():gongxiang[page][6] += 1print("此时的共享的页表为:")print("页号  物理块号  状态位  访问字段  修改位  外存地址  共享状态  共享进程计数")for i in gongxiang.keys():print(" {0:>0}    {1:>4}  {2:>5}  {3:>7}{4:>9}{5:>11}{6:>12}{7:>13}".format(i, gongxiang[i][0], gongxiang[i][1], gongxiang[i][2], gongxiang[i][3], gongxiang[i][4], gongxiang[i][5], gongxiang[i][6]))print("随机结束几个进程")aaa = list(gongxiang.keys())for i in range(random.randint(1, 10)):aaa1 = aaa[random.randint(0, len(aaa)-1)]gongxiang[aaa1][6] -= 1for i in aaa:if gongxiang[i][6] <= 0:gongxiang.pop(i)print("此时的共享的页表为:")print("页号  物理块号  状态位  访问字段  修改位  外存地址  共享状态  共享进程计数")for i in gongxiang.keys():print(" {0:>0}    {1:>4}  {2:>5}  {3:>7}{4:>9}{5:>11}{6:>12}{7:>13}".format(i, gongxiang[i][0], gongxiang[i][1], gongxiang[i][2], gongxiang[i][3], gongxiang[i][4], gongxiang[i][5], gongxiang[i][6]))# 定义主存容量
    i = input("请输入主存容量(单位b,kb,mb): ")
    if i[-2:] == "MB" or i[-2:] == "mb" or i[-2:] == "mB" or i[-2:] == "Mb":nei = eval(i[:-2]) * (2 ** 20)
    elif i[-2:] == "KB" or i[-2:] == "kb" or i[-2:] == "kB" or i[-2:] == "Kb":nei = eval(i[:-2]) * (2 ** 10)
    elif i[-1] == "B" or i[-1] == "b":nei = eval(i[:-1])
    elif i.isnumeric():nei = eval(i)
    else:print("输入错误!")sys.exit()
    print("主存容量为:", nei, "b")# 定义外存容量
    i = input("请输入外存容量(单位b,kb,mb): ")
    if i[-2:] == "MB" or i[-2:] == "mb" or i[-2:] == "mB" or i[-2:] == "Mb":wai = eval(i[:-2]) * (2 ** 20)
    elif i[-2:] == "KB" or i[-2:] == "kb" or i[-2:] == "kB" or i[-2:] == "Kb":wai = eval(i[:-2]) * (2 ** 10)
    elif i[-1] == "B" or i[-1] == "b":wai = eval(i[:-1])
    elif i.isnumeric():wai = eval(i)
    else:print("输入错误!")sys.exit()
    print("外存容量为:", wai, "b")# 定义页面大小
    i = input("请输入页面大小(单位b,kb,mb): ")
    if i[-2:] == "MB" or i[-2:] == "mb" or i[-2:] == "mB" or i[-2:] == "Mb":b = eval(i[:-2]) * (2 ** 20)
    elif i[-2:] == "KB" or i[-2:] == "kb" or i[-2:] == "kB" or i[-2:] == "Kb":b = eval(i[:-2]) * (2 ** 10)
    elif i[-1] == "B" or i[-1] == "b":b = eval(i[:-1])
    elif i.isnumeric():b = eval(i)
    else:print("输入错误!")sys.exit()
    print("页面大小为:", b, "b")# 定义页数
    i = input("请输入页数(单位b,kb,mb): ")
    if i[-2:] == "MB" or i[-2:] == "mb" or i[-2:] == "mB" or i[-2:] == "Mb":c = eval(i[:-2]) * (2 ** 20)
    elif i[-2:] == "KB" or i[-2:] == "kb" or i[-2:] == "kB" or i[-2:] == "Kb":c = eval(i[:-2]) * (2 ** 10)
    elif i[-1] == "B" or i[-1] == "b":c = eval(i[:-1])
    elif i.isnumeric():c = eval(i)
    else:print("输入错误!")sys.exit()
    print("页面大小为:", c, "b")
    hf = "y"
    while hf == "y" or hf == "Y":aaa(nei, wai, b, c)hf = input("是否继续,是输入y,否n: ")
    sys.exit()
    

更多推荐

Python简单模拟分页存储管理系统

本文发布于:2024-02-14 15:47:09,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1763983.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:管理系统   分页   简单   Python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!