模拟设计存储管理的分配与回收实践说明

来源:互联网 发布:手机淘宝怎么联系客服 编辑:程序博客网 时间:2024/06/06 07:03

以下的内容均是亲自问了操作系统老师问明白了才写了这篇文章,如果有不对的地方欢迎指出错误。
采用页式管理方案实施内存分配和回收。能够处理以下的情形
⑴能够输入给定的内存页面数,页面大小,进程的个数及每个进程的页数。

⑵当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后内存空间的使用情况(被进程占用的页面,空闲的页面);

⑶当某进程撤消时,显示内存回收后内存空间的使用情况。

那怎么去真真意义上的去理解这个实验是怎么做的呢?

按照步骤
(1)输入页的页数。(假如为5)
(2)输入页的大小。(假设为1024 B)
下一步叫我们我们输入进程的个数和页数。(在这一步的时候大家应该会有疑问?怎么输入进程的个数以及页数,输入完之后—-当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后内存空间的使用情况(被进程占用的页面,空闲的页面))这又是怎么理解的?

其实这个实验具体应该是这样做的。
现在我们假设进程数为1(也就是只考虑了单个进程的情况。)
那么进程页数是怎么输入的?
输入进程的逻辑地址(假设为883,1315,2456,1435,5678,3456,4352【单位都是B】)
基于页表的大小为1024B
用逻辑地址除以页表的大小,商为页表号,余数为偏移地址。
例如以上的逻辑地址
883/1024=0—–余数为883
1315/1024=1—-余数291
2456/1024=2—-余数为408
1435/1024=1—-余数为411
5678/1024=5—-余数为558这里需要注意的是这里发生了越界中断,why?因为页面的数为5,意思就是商只能为0,1,2,3,4,所以这里发生了越界中断,所以在这里你需要提醒用户这里发生了越界中断,发生越界中断那么这里就跳入中断处理程序,处理完中断处理程序之后还要继续对逻辑地址计算
3456/1024=3—-余数为384
4352/1024=4—–余数为256

建立的表如下:
这里写图片描述

所以通过上面的表我们知道了这个进程的页数为6【数一下表格行数】
这样也就回到了进程的页数是怎么输入的啦!!!!
那么这个进程对内存的访问序列就是0,1,2,1,3,4
假设内存的物理块为3【】(why?如果仔细观察的人会发现课本上一般都是3或者是4,对于这个物理块的块数必须在程序的开始之前指定我们假设为3)
那么假设我们采用FIFO置换算法
那么就有了以下的替换情况的表格
这里写图片描述
所以就可以计算出淘汰页号和缺页率和缺页次数!!!【这三个也是老师叫我们输出的三个结果!!!


所以总结下来,步骤如下:
(1)输入页的页数。
(2)输入页的大小。
(3)输入进程个数。(老师说可以只写单线程,因为考虑到多线程的时候还有回收比较难)
(4)输入进程访问的一系列逻辑地址。(可用一个数组存储)
(5)基于页的大小计算出访问序列。
(6)基于物理块的数量和三种算法得出访问内存替换情况。
(7)基于(6)的步骤计算出淘汰页号和缺页率和缺页次数和依次淘汰的页号以及计算出物理地址并且输出。

以下附上我的实验源码:采用python2.7写的,然后按照分析的例题输入数据:

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Author  : SundayCoder-俊勇# @File    : shijishiyan.pyimport astprint " 模拟设计存储管理的分配与回收实践说明"str=raw_input("请输入页面的页数和大小(例如:5(页面页数)1024(页面大小,单位B)):")FreeArea=str.split(" ")# 内存物理块的个数位为3Mblock=3for i in range(0,len(FreeArea)):    if  i<2:        if i%2==0:           print "页数为:"+FreeArea[i]+"    页面大小为:"+FreeArea[i+1]+"B"           # 得到页的数量           pageNum=ast.literal_eval(FreeArea[i])           # 得到页的大小           pageSize=ast.literal_eval(FreeArea[i+1])    else:        print "输入有误,请检查输入"        breakflag=Truewhile(flag):    Istrue=raw_input("申请进程内存分配请输入1,结束程序请输入2:")    if Istrue=="1":        strpro=raw_input("请输入进程的访问逻辑地址,单位为B(例如883 1315 2456 1435 5678 3456 4352):")        pro=strpro.split(" ")        # 使用list来保存这个访问逻辑地址与页面大小之间的关系        list=[]        for i in range(0,len(pro)):           x=0           y=0           x=ast.literal_eval(pro[i])/pageSize           y=ast.literal_eval(pro[i])%pageSize           if x>=pageNum:               print "此处发生了越界中断!!!越界中断的进程逻辑位置为"+pro[i]               print "处理越界中断"               print "处理成功,返回中断位置处继续执行"               continue           else:               list.append(x)               list.append(y)        print list        print "进程拥有的页数为:"        print len(list)/2        print "进程的访问序列为:"        outlist=[]        for x in range(0,len(list)):            if x%2==0:                outlist.append(list[x])        print outlist        a = ["X"] * Mblock        # 采用一个list来记录依次的缺页号码!!!        NumofLostpage=0        listOfLostPageNum=[]        print "采用FIFO置换算法替换页面"        # FIFO的主要算法        # 记录页表信息        listpage=[]        dict2={}        #计算物理地址        out=[]        for i in range(0,len(list)):            if i%2==0:               if list[i] not in a:                  NumofLostpage = NumofLostpage + 1                  listpage.append(list[i])                  listpage.append((NumofLostpage-1)%Mblock)                  listOfLostPageNum.append(list[i])                  # 满了才有依次淘汰页面号。                  if 'X' not in a:                      out.append(a[(NumofLostpage-1)%Mblock])                  a[(NumofLostpage-1)%Mblock]=list[i]               elif list[i] in a:                   listpage.append(list[i])                   listpage.append(a.index(list[i]))        print "缺页次数是:"        print NumofLostpage        print "缺页率是:"        print NumofLostpage/(len(list)/2.0)        print "依次缺页号为:"        print listOfLostPageNum        print "依次淘汰的页面号是:"        print out        print "进程的逻辑地址转化为物理地址之后为:"        # 用list记录页表后物理地址        wulilist=[]        print "页表中的记录如下:"        print listpage        for c in range(0,len(listpage)):            if c%2!=0:                wulilist.append(listpage[c]*pageSize+list[c])        print wulilist    elif Istrue=="2":          print "程序结束"          flag=False    else:        print "输入有误,程序结束"        flag=False

测试结果:
这里写图片描述
这里写图片描述

2 0
原创粉丝点击