实验五 操作系统之存储管理

一、实验目的

连续内存分配方式会形成许多“碎片”,虽然可以通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销。如果允许将一个进程直接分散地装入到许多不相邻接的分区中,则无需再进行“紧凑”。基于这一思想而产生了离散分配方式。

如果离散分配的基本单位是页,则称为分页存储管理方式;如果离散分配的基本单位是段,则称为分段存储管理方式。

在分页存储管理方式中,如果不具备页面兑换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具备支持虚拟存储器的功能,它要求把每个作业全部装入内存后方能运行。

本实验通过程序模拟操作系统的基本分页存储管理方式,进一步理解这一内存分配方式的原理和特点,加深对理论知识的掌握。

二、实验要求

1、用C语言或Java语言编写程序模拟操作系统对内存的基本分页存储管理方式

2、程序要能正确对“内存”进行“分配”和“回收”,能接受用户的输入,显示内存的分配情况,并有一定的容错能力。

3、每个人独立按时完成实验内容。

三、实验内容

本实验假定内存空间已经按块划分,目标程序无需关心内存块大小等底层细节,只需按算法对内存块进行分配即可。程序应该实现以下功能:

1、内存初始化。假定内存块共有N个,初始化后的内存空间应该有一部分已经被使用,这可以用随机数或程序内部的其他算法完成。

2、程序应该能接受用户输入的进程信息,并为之分配内存,返回分配结果(成功或失败),注意,此处应该考虑到不合法的输入并进行相应处理。

3、程序能回收用户指定的进程所占用的内存空间,因此,程序可能需要为每个进程分配一个唯一的进程号并给出详细的提示信息。

4、能直观合理地显示内存分配情况。

5、程序界面友好,便于操作和查看运行结果。

四.实验代码

  1 #include <iostream>
  2 using namespace std;
  3 #define INVALID -1 //定义结构类型
  4 struct pl_type
  5 { //页表结构
  6     int pn;        //页号
  7     int fn;        //页帧号
  8     int time;      //访问时间
  9  };
 10     struct fl_type
 11     { //页帧结构
 12         int pn; //页号
 13         int fn; //页帧号
 14         struct fl_type *next;//链接指针
 15     };
 16         //定义结构变量
 17         pl_type pl[512];
 18         fl_type fl[512],*free_head,*busy_head,*busy_tail;
 19         int page[512];   //访问串(存放每条指令的页号)
 20         int TOTAL_PAGES; //访问串长度
 21         int diseffect;    //页故障数
 22         //初始化函数:初始化页表和页帧链
 23         //形参total_pf为分配给用户进程的内存页帧数
 24         void initialize(int total_pf)
 25         {
 26             int i;
 27         diseffect=0; //页故障数初始化为0
 28         //建立空页表
 29         for(i=0;i<512;i++)
 30         {
 31             pl[i].pn=i;        //页号
 32             pl[i].fn=INVALID; //页帧号为-1,(开始时,页还未装入到页帧)
 33        pl[i].time=-1;
 34         }        //建立空闲页帧链
 35         for(i=0;i<total_pf;i++)
 36         {
 37             fl[i-1].next=&fl[i]; //建立fl[i-1]和fl[i]间的链接
 38             fl[i-1].fn=i-1;
 39         }
 40         fl[total_pf-1].next=NULL;  //链表末尾为空指针
 41         fl[total_pf-1].fn=total_pf-1; //末尾结点的页帧号
 42         free_head=&fl[0];  //空闲页帧链头指针指向fl[0]
 43         }
 44         void LRU(int total_pf)
 45         {
 46             int i,j,min,minj,present_time;
 47             present_time=0;
 48             initialize(total_pf);
 49             for(i=0;i<TOTAL_PAGES;i++)
 50             {
 51                 if(pl[page[i]].fn==INVALID)
 52                 {  //页故障
 53                     diseffect++;
 54                     if(free_head==NULL)
 55                     { //无空闲页帧
 56                         min=32767;
 57                         for(j=0;j<TOTAL_PAGES;j++)
 58                         { //找time的最小值
 59                             if(min>pl[j].time && pl[j].fn!=INVALID)
 60                             {
 61                                 min=pl[j].time;
 62                                 minj=j;
 63                             }
 64                         }
 65                         free_head=&fl[pl[minj].fn]; //腾出一页帧
 66                         pl[minj].fn=INVALID;
 67                         pl[minj].time=-1;
 68                         free_head->next=NULL;
 69                     }
 70                     pl[page[i]].fn=free_head->fn; //有空闲页帧,改为有效
 71                     pl[page[i]].time=present_time; //time置为当前时间
 72                     free_head=free_head->next;  //空闲页帧链头指针前移
 73                 }
 74                 else
 75                     pl[page[i]].time=present_time; //time置为当前时间
 76                 present_time++;
 77             }
 78         cout<<"LRU:"<<diseffect<<"("<<(float)diseffect/TOTAL_PAGES<<")";
 79         }
 80         void getRefstring(void)
 81         {
 82             int i;
 83             cout<<"输入的访问串以‘-1‘结束!"<<endl;
 84             cout<<"请输入访问串:";
 85             for(i=0;i<512;i++)
 86             {
 87                 cin>>page[i];
 88                 if(page[i]==-1)
 89                     break;
 90             }
 91             TOTAL_PAGES=i;  //访问串大小
 92             cout<<"访问串大小:"<<i<<endl<<"访问串为:";
 93             for(i=0;i<TOTAL_PAGES;i++)
 94                 cout<<page[i]<<" ";
 95                  cout<<endl<<endl;
 96         }
 97         int main()
 98         {
 99             int f;
100             getRefstring();
101             for(f=2;f<=TOTAL_PAGES;f++)
102             { //页帧数从3个页帧到TOTAL_PAGES个页帧
103                 cout<<"若分配给进程"<<f<<"页帧,页故障数(缺页率):";
104                 LRU(f);
105                 cout<<endl;
106             }
107         system("pause");
108         return 0;
109         }

五.运行结果

六.实验总结

通过这次的实验更好地加深了我对基本分页存储的理解。同时也提高了编码能力。

时间: 2024-10-13 00:52:22

实验五 操作系统之存储管理的相关文章

实验五存储管理实验

实验五存储管理实验 一.        实验目的 连续内存分配方式会形成许多“碎片”,虽然可以通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销.如果允许将一个进程直接分散地装入到许多不相邻接的分区中,则无需再进行“紧凑”.基于这一思想而产生了离散分配方式. 如果离散分配的基本单位是页,则称为分页存储管理方式:如果离散分配的基本单位是段,则称为分段存储管理方式. 在分页存储管理方式中,如果不具备页面兑换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具备支持虚

信息安全技术 实验五 网络攻防技术 20155202 张旭

信息安全技术 实验五 网络攻防技术 20155202 练习一 信息收集 一. 实验目的 该实验为验证性实验. ? 了解信息搜集的一般步骤 ? 学会熟练使用ping命令 ? 学会利用Nmap等工具进行信息搜集 二. 实验内容 Ping探测 Nmap扫描 探测总结 注:详细实验操作请参考实验室服务器上的参考资料. 三. 实验步骤 本练习主机A.B为一组,C.D为一组,E.F为一组.实验角色说明如下: 实验主机 实验角色 系统环境 A.C.E 扫描源/目标 Windows B.D.F 扫描源/目标 L

2017-2018-1 20155333 《信息安全系统设计基础》实验五通讯协议设计

2017-2018-1 20155333 <信息安全系统设计基础>实验五通讯协议设计 实验五 通讯协议设计-1 要求 在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作业 提交运行结果截图 OpenSSL简介 OpenSSL是一个SSL协议的开源实现,采用C语言作为开发语言,具备了跨平台的能力,支持Unix/Linux.Windows.Mac OS等多种平台. OpenSSL最早的版本在1995年发布,1998年后开始由Ope

2017-2018-2 20155225《网络对抗技术》实验五 MSF基础应用

2017-2018-2 20155225<网络对抗技术>实验五 MSF基础应用 ms08_067 用search命令,搜索与ms08_067相关的模块,如图: 找到了对应的攻击模块exploit/windows/smb/ms08_067_netapi ,可知这是一个针对windows下,SMB服务的攻击模块. 服务器信息块(SMB)是一个网络文件共享协议,它允许应用程序和终端用户从远端的文件服务器访问文件资源. 描述里说,这是一个微软服务器服务相对路径堆栈损坏漏洞. 具体什么原理也不清楚,反正

20155328 网络攻防 实验五:MSF基础应用

20155328 网络攻防 实验五:MSF基础应用 实践内容及过程记录 一.Windows服务渗透攻击----ms08_067 攻击机:kali 靶机:WindowsXP(英文版) 第一步,分别查看攻击机和靶机的IP. 在kali终端中,输入msfconsole进入msf控制台,依次输入以下指令: use exploit/windows/smb/ms08_067_netapiuse exploit/windows/smb/ms08_067_netapi show payloads set pay

MySQL数据库实验五:数据更新

实验五   数据更新 一.实验目的 掌握数据更新操作的用法. 二.实验环境 三.实验示例 1.?往基本表SC中插入元组. ①    INSERT INTO S(S#,SNAME,AGE,SEX) VALUES('S36','GU',20,'M'): ②   INSERT INTO SC(S#,C#) VALUES('S5','C8'): ③        INSERT INTO SC VALUES('S4','C4',85), ('S3','C6',90), ('S7','C2',70): ④

《信息安全系统设计基础》实验五

<信息安全系统设计基础>实验五 简单嵌入式WEB 服务器实验 班级:1452 姓名:20415208蔡野 20145235李涛 20145230熊佳伟 实验日期:2016.12.1 时间:10:10-12:30 实验序号:5 实验目的: 掌握在 ARM 开发板实现一个简单 WEB 服务器的过程 . 学习在 ARM 开发板上的 SOCKET 网络编程 . 学习 Linux 下的 signal()函数的使用 . 实验内容 阅读并理解源代码 进入/arm2410cl/exp/basic/07_htt

CCNP实验五:修改OSPF各类型路由的管理距离

一:基本配置 r1(config)#router ospf 1 r1(config-router)#net 1.1.0.0 0.0.255.255 area 1 r1(config-router)#net 12.1.1.1 0.0.0.0 area 0 r1(config-router)#redistribute connected subnets r2(config)#router ospf 1 r2(config-router)#net 12.1.1.2 0.0.0.0 area 0 r2(

20145331实验五 Java网络编程及安全

实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统 4.结队伙伴:20145333赵嘉鑫 博客地址:http://home.cnblogs.com/u/5301z/ 5.分工:自己负责服务端,伙伴负责客户端 实验要求 1.基于Java Socket实现安全传输 2.基于TCP实现客户端和服务器,结对编程一人负责客户端,一人负责服务器 3.使用Git进行版本控制 4.选择对称算法进行数据加解密. 5.选择非对称算法对对称加密密