欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOCX文档下载  

    操作系统-基本分页存储管理(内有代码).docx

    • 资源ID:11658310       资源大小:38.44KB        全文页数:8页
    • 资源格式: DOCX        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    操作系统-基本分页存储管理(内有代码).docx

    基本分页存储管理实验目的连续内存分配方式会形成许多“碎片”,虽然可以通过“紧凑”方法将许多 碎片拼接成可用的大块空间,但须为之付出很大开销。如果允许将一个进程直接 分散地装入到许多不相邻接的分区中,则无需再进行“紧凑” 。基于这一思想而 产生了离散分配方式。如果离散分配的基本单位是页,则称为分页存储管理方式; 如果离散分配的基本单位是段,则称为分段存储管理方式。在分页存储管理方式中,如果不具备页面兑换功能,则称为基本的分页存储 管理方式,或称为纯分页存储管理方式,它不具备支持虚拟存储器的功能,它要 求把每个作业全部装入内存后方能运行。本实验通过程序模拟操作系统的基本分页存储管理方式,进一步理解这一内存分配方式的原理和特点,加深对理论知识的掌握。实验要求1、用C语言或Java语言编写程序模拟操作系统对内存的基本分页存储管理 方式2、程序要能正确对“内存”进行“分配”和“回收”,能接受用户的输入, 显示内存的分配情况,并有一定的容错能力。3、每个人独立按时完成实验内容。实验内容本实验假定内存空间已经按块划分,目标程序无需关心内存块大小等底层细 节,只需按算法对内存块进行分配即可。程序应该实现以下功能:1、内存初始化。假定内存块共有 N个,初始化后的内存空间应该有一部分 已经被使用,这可以用随机数或程序内部的其他算法完成。2、程序应该能接受用户输入的进程信息,并为之分配内存,返回分配结果(成功或失败),注意,此处应该考虑到不合法的输入并进行相应处理。3、程序能回收用户指定的进程所占用的内存空间,因此,程序可能需要为每个进程分配一个唯一的进程号并给出详细的提示信息。4、能直观合理地显示内存分配情况。5、程序界面友好,便于操作和查看运行结果。#include <stdio.h>#include <windows.h>#define N 100/共有100个内存块int processNN+1; 存放每个进程的页表int blockN;/内存块状态标志数组,0:空闲,1:使用int blockCount;/记录当前内存剩余空间int processCount;/记录当前进程数bool flag = true;void init();void output();bool createProcess();bool endProcess();void init()int i, j;/初始化内存状态标志数组for (i=0; i<N; i+)blocki = 0;for (i=0; i<20; i+)blockrand()%(N-1) = 1;blockCount = 0;for (i=0; i<N; i+)if (blocki = 0) blockCount+;/初始化存放进程的数组for (i=0; i<N; i+)processi0 = 0;for (j=1; j<N; j+)processij = -1;processCount = 0;printf("初始化结果如下:");output();flag = false;void output()printf("n内存总量:%d块,已用空间:%d块,剩余空间:%d块,进程总 数:%d 个n", N, N-blockCount, blockCount, processCount);if (flag && blockCount < N)printf("已使用的内存块(d): n", N-blockCount);for (int k=0,count=0; k<N; k+)if (blockk = 1)printf("%2d ", k, +count);if (count = 15) putchar(n);count = 0;putchar(n);/输出各进程占用内存详细情况if (processCount > 0)printf("内存详细使用情况如下:n");for (int i=0; i<N; i+)if (processi0 > 0)printf("进程号:%d n 占用内存块(2d): ", i, processi0); for (int j=1,count=0; j<=processi0; j+)printf("%2d ", processij, count+);if (count = 15) putchar(n);printf("");count = 0; putchar(n);elseprintf("当前内存无进程! n");/*/输出空闲内存块if (blockCount > 0)printf("空闲内存块(d): n", blockCount);for (int k=0,count=0; k<N; k+)if (blockk = 0)printf("%2d ", k, +count);if (count = 15)putchar(n);count = 0;putchar(n);*/ putchar(n);bool createProcess()int pid, pages, k = 0;loop:printf("请输入进程号(小于%d)和所需页面数:",N); scanf("%d%d", &pid, &pages);if (pid > 99)printf("错误!进程号过大!n");goto loop;if (pages > blockCount)return false;blockCount -= pages;processpid0 = pages;for (int i=1; i<=pages; i+)while (blockk=1 && k<100)k+;processpidi = k;blockk = 1;k+;processCount+;return true; bool endProcess() int pid, pages;if (processCount < 1) printf("当前内存没有进程!nn");return false;printf("当前内存中的进程有 %d个,进程号为:", processCount);for (int i=0; i<N; i+)if (processi0 > 0) printf("%2d ", i);putchar(n);printf("请输入您要结束的进程号(小于d): ", N);scanf("%d", &pid);pages = processpid0;if (pages = 0) printf("对不起!该进程不存在!n");return false;for (int j=1; j<pages; j+)blockprocesspidj = 0;processpidj = -1;processpid0 = 0;processCount-;blockCount += pages;return true;void menu()int choice;while (true) printf("操作菜单:n");printf(" 1 -> 创建进程n 2 ->结束进程n 3 ->查看内存n 0 ->退出 程序n");printf("请输入您要进行的操作:");scanf("%d", &choice);switch (choice) case 1:if (createProcess()printf("创建新进程成功!nn");elseprintf("抱歉!内存空间不足,创建新进程失败!nn");break;case 2:if (endProcess()printf("进程已结束! nn");elseprintf("进程结束失败! nn");break;case 3:output();break;case 0:return ;default:printf("对不起!您的选择有误!请重新选择!nn");void main()init();menu();8"E入碗企即泉作桑菊基本分贝Debuga.ain. exe同嘴优结果如下:作卷息量:100块.已用空间:19块.剩余空间;82祗进程总数:a个 己值用的内存块S611 16 25 29 34 41 S3 54 G1 62 67 7S 82 90 9396 97当前内存无进程I> > > u I- X/X/S -曹建 2 m E主月主丹刈3." I . | 1. -I-数 面 贝 需 所1和:>作的2 3 0王阴王国> > > L CH. 一人入期 -一存序建霍出创结查退-您进进数面贝需所i和:作眄 操F1 TJr I 一行功 旺号成 -S12 25操作菜单二1 >创建进矍2 一 > 蹙瞿3 -> Stfi#0 退田屋住请输入您要能行的操作 3内存总量1100块.已用空间工63块.剩余空间137块,进程总数 2个 gg肯细?用情况如下;占痈内存块孙;8 1 2 3 4 5 G 7 8 9 10 12 13 14 1517 18 19 2Q 21旭翟笔2占用内存块(25: 22 23 24 26 27 28 30 31 32 33 35 36 37 38 394B 42 43 44 4S 4G 47 48 49 50操作菜郸结T->->入内人已 -H量细:存 总详口薪 414 用%缉杳 LA 菜 7->->->入 作:二输作2程 的嗡K仃进束 进的结 一要中要事 您结,小2 个-(? 7号作菜单;创健进谷-结蠢嘘一查看内存-退出嚼输入您要在行的操作 3块况0情10用的篇 一行进束 进的结 要中要奥 您底a结号M 程呢 进T1可51 用; 己T-624232443424,小2 个-(; 7号 作工程43块.剩余空间;界块,进程总数;1个27 28 30 31 32 33 35 36 37394S 46 47 48 49 50号-九 程陇 进T1行总善100块,已用空间;1块.剩余空间;般块,进程总都e个 胃内荐无进程I实验总结基本分页的思想是比较简单的,而且实验前老师已经给出了一种可行的数据 结构来存储程序中需要用到的数据,因此这个实验在构思上是没有多少难度的。 由于程序中主要使用的是数组,操作起来比较方便,不像前两个实验需要用到大 量的链表操作。在这次试验中,我主要遇到了以下一些问题:1、程序刚写完时,记录“内存”中的进程数的变量和当前剩余总内存的变量的值不正确,经检查后发现是在结束进程时没有同时更新这些数据。2、内存使用情况应该以哪种形式输出以及输出哪些信息。最终我选择了尽 可能详细地输出有用信息,通过空格、空行、对齐等手段尽力使输出格式简洁美 观。比如,在输出每个进程的内存使用情况时,首先输出该进程占用的总内存, 然后以统一的对齐方式依次输出各个内存块编号。当然,对于不同的模块输出的信息也应该不一样,比如,内存初始化结束后 应该输出哪个内存块被占用了,否则无法判断后续的内存分配是否正确, 但在以 后查看内存使用情况时则不必把所有已占用的内存块输出,因为每个进程都会单独把自己占用的内存块显示出来。 为了达到这种效果,我使用了一个全局变量作 为判断依据,详细情况见附录中代码。3、程序的容错性。这是一个容易被忽略的问题。这个程序起初基本没考虑 这个问题,但在后来的调试过程中,逐渐加上了一些基本的容错功能,比如用户 在结束某进程时,其输入的进程号可能根本不存在,这时应该给出用户出错提示, 并要求用户重新输入,但这里用了一个编程中不太推荐的方式:goto语句。总体而言,这次实验还是比较顺利的,没有遇到什么特别难解决的问题。通 过自己编程模拟内存分配,我不仅加深了对这种内存管理方式的理解, 也增强了 C语言的编程能力。通过这几次的实验,我感觉手工写一个几百行的程序不像以 前那么困难了。

    注意事项

    本文(操作系统-基本分页存储管理(内有代码).docx)为本站会员(李医生)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开