基本分页存储管理的模拟实现学院专业学号学生姓名指导教师姓名2014年03月18日目录一、设计目的与内容二、各个功能模块三、主要功能模块流程图四、系统测试五、结论六、源程序及系统文件使用说明一、设计目的与内容设计的目的:操作系统课程设计是计算机专业重要的教学环节, 它为学生提供了一个既动手又动脑, 将课本上的理论知识和实际有机的结合起来, 独立分析和解决实际问题的机会。
1. 进一步巩固和复习操作系统的基础知识。
2. 培养学生结构化程序、模块化程序设计的方法和能力。
3. 提高学生调试程序的技巧和软件设计的能力。
4. 提高学生分析问题、解决问题以及综合利用C 语言进行程序设计的能力。
设计内容:根据设计要求实现对基本分页存储管理的模拟设计要求:1.2. 进程名, 进程所需页数, 也可从文件读出。
3.况。
所采用的数据结构:typedef struct LNode{int f; //进程号char name[8]; //进程名int size; //进程大小int n; //进程页数int ye[100]; //页表,下标表示页号, 内容表示进程各页所在物理块struct LNode *next;}LNode,*LinkList;二、各个功能模块主要功能模块流程图四、系统测试主界面:(显示程序的各个功能块)1、选择1, 运行界面如下:(选择1, 输入进程名, 显示内存物理块分配情况)2、选择2, 运行界面如下:(显示2回收进程, 若进程名输入错误, 则显示进程不存在, )3、选择3, 运行界面如下:(显示进程r的内存使用情况, 0表示未用)五、结论在这次课程设计中, 我清楚的认识理论到到实践的重要性, 经过实际的动手操作不仅提高了我的动手能力还提高了我把理论转化成实践的能力。
实验中对页表的定义如下(采用数组形式, 数组下标表示页号, 数组单元存放与数组下标(页号)相应的页面号):如ye [100]六、源程序及系统文件使用说明#include "stdio.h"#include "stdlib.h"#include "string.h"#include "conio.h"#include <ctime>//#include <string>//#define y 0;char A[100]; //内存物理块, 0:未使用,int max = 99; //记录内存的物理块数,值为A[100]最大下标int count = 100; //记录内存未使用物理块数typedef struct LNode{char name; //进程名int n; //进程页数int ye[100]; /*进程各页所在物理块,页表实验中对页表的定义如下(采用数组形式, 数组下标表示页号, 数组单元存放与数组下标(页号)相应的页面号):*/struct LNode *next;}LNode,*LinkList;//内存初始化void CreatA(){int i = 0;for(i = 0;i <= max; i++)A[i] = 0;}//建立新进程void NewNode(LinkList &L){char ch;int i;int m;LinkList p;LinkList new_node;printf("\n *****输入进程名称:***** ");ch = getche();p = L;while(p != NULL) //查找进程名是否重复{if(p->name != ch)p = p->next;else{printf("\n*****进程名%c 已存在, 请重新输入:*****",ch);ch = getche();p = L;//p重新指向头结点}}printf("\n*****输入进程%c 的页数:*****",ch);scanf("%d",&i);while(i < 1){printf("\n*****请重新输入进程%c 的页数:*****",ch);scanf("%d",&i);}if(i > count){printf("\n*****内存物理块不足, 新建进程%c 失败!!!*****\n\n",ch);getch();}else{new_node = (LinkList)malloc(sizeof(LNode));new_node->name = ch;new_node->n = i;new_node->next = NULL;count -= i;m = 0;for(i = 0; i <= max; i++)if(A[i] == 0 && m < new_node->n){A[i] = new_node->name ;new_node->ye[m] = i;m++;}if(L == NULL)L = new_node;else{p = L;//查找最后一个节点while(p->next != NULL){p = p->next;}p->next = new_node;}}}//回收进程, 释放内存void FreeNode(LinkList &L){LinkList p,q;char ch;printf("*****请输入要删除的进程名称:*****");ch = getche();p = L;//查找进程ch ;用p记录q = p;while(p != NULL){if(p->name == ch)break;else{q = p;p = p->next;}}if(p == NULL){printf("\n*****进程%c 不存在!!!*****\n",ch);getch();}else{for(int i = 0; i < p->n; i++)A[p->ye[i]] = 0;count += p->n;if(p->name == q->name)//要删除的是头结点{L = p->next;}else{q->next = p->next;}}}//输出内存物理块分配情况void Printf(LinkList L){int i = 0;printf("\n*****内存物理块分配情况:*****\n");LinkList p = L;printf("\n*****各进程信息:*****\n");printf("*****进程名称\t进程页数\t所用物理块*****\n");while(p != NULL){printf(" %c\t\t%d\t\t",p->name,p->n);for(i = 0;i < p->n; i++)printf("%d,",p->ye[i]);printf("\n");p = p->next;}}//显示内存块使用情况, 不分进程void showit(){int i = 0;printf("\n☆***☆***☆***☆***☆***☆***☆\n");printf("|☆◇☆内存物理块分配情况☆◇☆|\n");printf("\n☆***☆***☆***☆***☆***☆***☆\n");for(i = 0; i <= max; i++){ if(A[i]!=0)printf("%c\t",A[i]);else{printf("%d\t",A[i]);}if(i%10 == 9)printf("\n");}}void main(){CreatA();printf("\n***☆***☆* 基本分页存储管理的模拟实现*☆***☆***\n");LinkList L = NULL;int i = 0;do{printf("\n☆***☆***☆***☆**菜单**☆***☆***☆***☆\n");printf( " 1 添加进程\n");printf( " 2 回收进程\n");printf( " 3 内存使用情况\n");printf( " 4 退出程序\n");printf( "☆***☆***☆***☆***☆***☆***☆***☆***☆\n");printf("请输入你的选择(select):");scanf("%d",&i);switch(i){case 1:{NewNode(L);//建立新的进程Printf(L);//输出内存物理块分配情况和各进程概况break;}case 2:{FreeNode(L); //删除某进程Printf(L); //输出内存物理块分配情况和各进程概况break;}case 3:{showit();//显示当前内存的使用情况break;}case 4:exit(4);break;}}while(i != 0);}。