山东理工大学计算机学院
课 程 设 计
(操作系统)
二○○八 年 六 月二十七日
课程设计任务书及成绩评定
Ⅰ、题目的目的和要求:
巩固和加深对操作系统(OS)原理的理解,初步掌握操作系统组成模块和应用接口的使用方法,提高进行工程设计和系统分析的能力;通过对基本分页存储管理系统设计题目的完成,理解操作系统的设计思想和实现方法,同时训练选择和使用数据结构,系统整体分析和设计以及编写合格文档的能力,提高综合实力。
[1] 汤子赢等.计算机操作系统(第二版).西安电子科技大学出版社,2006.8
[2] 冯耀霖等.操作系统,西安电子科技大学出版社.1992
[3] 张尧学等.计算机操作系统教程(第2版).清华大学出版社,2001.4
[4] 谭耀铭.操作系统.中国人民大学出版社,2003.4
[5] Abraham Silberschatz,Peter Galvin & Greg Gagne,Applied Operating System Concepts,Higher Education Press,2002
Ⅳ、成绩评定:
设计成绩: (教师填写)
指导老师: (签字)
二○○八 年 六 月二十七日
目 录
第一章 概述……………………………………………………………1
第二章 系统分析………………………………………………………1
第三章 系统设计………………………………………………………2
第四章 程序设计流程图或N-S图……………………………………3
第五章 源程序清单……………………………………………………3
第六章 调试过程中的问题及系统测试情况…………………………9
第七章 结束语…………………………………………………………11
第一章 概述
课程设计是检测学生学习课程效果的重要手段,是训练学生通过所学知识解决实际问题的重要方式,同时也是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让同学对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。《操作系统》是一门重要的专业课,是计算机理论和应用的核心基础课程。
操作系统课程设计,是一次对多学知识的综合演练,要求学生在操作系统的设计理念、整体机构、模块划分、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
在这次的课程设计中我选择的题目是基本分页存储管理系统的设计,实现对基本分页存储管理系统的模拟。存储器是计算机系统的重要组成部分,是一种宝贵而又紧俏的系统资源。如何对它加以有效的管理,不仅直接影响到存储器的利用率,而且对系统性能有重大影响。因此通过研究存储器的管理原理和实现方法,对于理解计算机系统工作过程和设计高效的计算机系统都有很重要的作用。
第二章 系统分析
在早期的单用户单任务的操作系统中使用连续分配方式管理存储器,这是一种简单的存储管理方式,是指为一个用户程序分配一个连续的内存空间。连续分配方式虽然简单,但却会形成许多碎片,虽然可以通过紧凑的方法把许多碎片拼接成大块的空间,但需为之付出很大的开销。为了避免这一缺点的影响,就产生了离散分配的思想。如果离散分配的基本单位是页,则称为分页存储管理方式。
分页管理是将一个进程的逻辑地址空间分成若干个大小相等的片,成为页面或页并为各页加以编号,从0开始,如第0页,第1页,第2页等。相应地,也把内存空间分成与页面大小相等的若干存储块,称为(物理)块或页框,也同样为他们加以编号。在为进程分配内存时,以块为单位将进程中的若干页面分别装入到多个可以不相邻接的物理块中。
在进程装入内存时通过使用页表实现进程逻辑地址到物理地址的转换,转换方式如下面图一所示:
图一
在本次设计用面向对象思想编程实现,设计内存类和进程类,具体的操作设计为类的方法,这样使程序清晰简洁明了,易于开发,也易于他人的阅读和使用。
第三章 系统设计
本设计中利用了两个类,一个内存类(memory),一个进程(porcess)类,具体设计以及其所包含的成员函数如下:
1. memory类:
class Memory //内存类
{
public:
int mem[32]; //定义内存的块数
int availableMem; //可用的内存块数
memory() //构造函数
void display() //显示内存状态
void save() //把内存状态存入磁盘的函数
void load() //从磁盘读入内存状态的
}
2. process类
class Process //进程类
{
public:
string name; //进程名
int pageTable[32]; //进程页表
int pageNum; //进程页数
bool InMem; //是否调入内存的标志
Process() //构造函数
IntoMem() //把进程调入内存的函数
OutofMem() //把进程调出内存的函数
}
类设计好后,在main()函数中根据用户键入的操作数来对对各成员方法进行分支调用,完成用户所需要的操作。
第四章 程序设计流程图或N-S图
程序整体的流程图如图二所示:
图二
第五章 源程序清单
本程序完整代码如下:
#include <iostream>
#include <string>
#include <deque>
#include <fstream>
using namespace std;
class Memory
{
public:
int mem[32];
int availableMem;
Memory()
{
for (int i=0; i<32; i++)
{
mem[i] = 0;
}
availableMem = 32;
}
void display()
{
cout << "内存状态" << endl;
for (int i=0; i<4; i++)
{
for (int j=0; j<8; j++)
{
cout << mem[i*8+j] << " ";
}
cout << endl;
}
}
void save()
{
ofstream outfile("d:\\MemState.dat");
if (!outfile)
{
cerr << "打开错误!" << endl;
}
else
{
for (int i=0; i<32; i++)
{
outfile << mem[i] << " ";
}
outfile.close();
}
}
void load()
{
ifstream infile("d:\\MemState.dat");
if (!infile)
{
cerr << "打开错误!" << endl;
}
else
{
for (int i=0; i<32; i++)
{
infile >> mem[i];
}
infile.close();
}
}
}memModle;
class Process //进程类
{
public:
string name;
int pageTable[32]; //进程页表
int pageNum; //进程页数
bool InMem;
Process(string na,int pN)
{
name = na;
pageNum = pN;
InMem = false;
for (int i=0; i<32; i++)
pageTable[i] = -1;
cout << endl;
cout << "进程" << name << "已被创建" << endl;
}
void InToMem() //把进程调入内存
{
cout << endl;
if (pageNum > memModle.availableMem)
cout << "内存不足,请先释放其它进程!" << endl;
else
{
for (int i=0; i<pageNum; i++)
{
for (int j=0; j<32; j++)
{
if (memModle.mem[j] == 0)
{
memModle.mem[j] = 1;
pageTable[i] = j;
break;
}
}
}
memModle.availableMem -= pageNum;
InMem = true;
cout << "进程" << name << "调入内存" << endl;
}
}
void OutOfMem() //把进程从内存中调出
{
cout << endl;
for (int i=0; i<pageNum; i++)
{
memModle.mem[pageTable[i]] = 0;
pageTable[i] = -1;
}
memModle.availableMem += pageNum;
InMem = false;
cout << "进程" << name << "已从内存释放" << endl;
}
~Process()
{
OutOfMem();
cout << "进程" << name << "已删除" << endl;
}
};
int main()
{
int operate;
char sign;
string processname;
int processpage;
int processIndex;
deque<Process*> proDeq;
while (true)
{
system("cls");
cout << " 基本分页存储管理系统模型 " << endl;
cout << "*****************************************************" << endl;
cout << "*****************************************************" << endl;
cout << " * 1:内存状态 2:可用内存块数 3:创建进程 * " << endl;
cout << " * 4:删除进程 5:进程调入内存 6:释放内存 * " << endl;
cout << " * 7:查看进程 8:查看页表 9:存入磁盘 * " << endl;
cout << " *10:从磁盘读入 0:退出 * " << endl;
cout << "*****************************************************" << endl;
cout << endl;
cout << "请选择要进行的操作: ";
cin >> operate;
cout << endl;
if (operate == 0)
break;
if (operate == 1)
memModle.display();
if (operate == 2)
{
cout << "可用内存块数:" << memModle.availableMem << endl;
}
if (operate == 3)
{
cout << "请输入进程名和进程页数(1~32)" << endl;
cin >> processname >> processpage;
proDeq.push_back(new Process(processname, processpage));
}
if (operate == 4)
{
cout << "删除第几个进程?" << endl;
cin >> processIndex;
if (processIndex < (int)proDeq.size())
{
delete proDeq[processIndex];
proDeq.erase(proDeq.begin()+processIndex, proDeq.begin()+processIndex+1);
}
else
cout << "不存在此进程!" << endl;
}
if (operate == 5)
{
cout << "将第几个进程调入内存?" << endl;
cin >> processIndex;
if (processIndex < (int)proDeq.size())
{
if (proDeq[processIndex]->InMem)
cout << "此进程已在内存中!" << endl;
else
proDeq[processIndex]->InToMem();
}
else
cout << "不存在此进程,请先创建进程!" << endl;
}
if (operate == 6)
{
cout << "释放第几个进程?" << endl;
cin >> processIndex;
if (processIndex < (int)proDeq.size())
{
if (proDeq[processIndex]->InMem)
proDeq[processIndex]->OutOfMem();
else
cout << "此进程不在内存中!" << endl;
}
else
cout << "不存在此进程" << endl;
}
if (operate == 7)
{
if(proDeq.size() == 0)
{
cout << "无进程!" <<endl;
}
else
{
for (unsigned i=0; i<proDeq.size(); i++)
{
cout << "第" << i << "个进程: 进程名 " << proDeq[i]->name << " 进程页数 " << proDeq[i]->pageNum << " 调入内存否 "<< proDeq[i]->InMem <<endl;
}
}
}
if (operate == 8)
{
cout << "查看第几个进程的页表?" << endl;
cin >> processIndex;
cout << endl;
if (processIndex < (int)proDeq.size())
{
for (int i=0; i<proDeq[processIndex]->pageNum; i++)
{
cout << "页号" << i << ": 块号" << proDeq[processIndex]->pageTable[i] << endl;
}
}
else
cout << "不存在此进程!" << endl;
}
if (operate == 9)
{
memModle.save();
cout << "内存状态表已存盘!"<< endl;
}
if (operate == 10)
{
memModle.load();
cout << "已从磁盘读取内存状态表!" << endl;
}
cout << endl;
cout << "是否继续? Y/N" << endl;
cin >> sign;
if (sign == 'Y' || sign == 'y')
continue;
if (sign == 'N' || sign == 'n')
break;
}
return 0;
}
第六章 调试过程中的问题及系统测试情况
运行后程序界面如图三所示:
图三
然后根据需要,按照界面提示输入要选择的操作,如选择“创建进程”,则输入3,显示如图四:
图四
分别输入进程名和进程页数,如输入进程名为“aa”,页数为5,运行情况如图五所示:
图五
然后选择操作符5把进程调入内存,然后输入操作符8查看页表,结果如图六所示:
图六
如果要继续执行其他操作,选择Y,要推出选择N。
第七章 结束语
通过这次课程设计,我对操作系统的设计理念,编程结构和高级语言程序设计、数据结构的利用、系统的分析、算法的设计,程序调试以及错误处理等过程有了更加深入的理解。同时熟练了编程工具的使用,练习了自己的分析问题和解决问题的能力,练习了自己编程的能力,促进了我对操作系统课程的认识,增进了我继续深入学习操作系统的兴趣。同时也认识到操作系统在整个计算机系统中的重要作用。
通过自己对问题的分析和最终实现,完成了题目的要求,增强了自己学习的兴趣,同时也了解到自己在学习过程中的不足。在系统设计时基本能够想到应该用怎样的类和方法来模拟实现页面分配和进程管理以及相关函数所用的算法思想,但在实际编写代码的时候却遇到不少困难,不能把自己的设计通过代码实现出来,费了很多周折,暴露了自己在学习中眼高手低,实践能力差的问题。一些常用的操作,比如类的定义和使用都出现了不该有的错误,反映了自己对于基本概念和基础知识的理解不是很透彻,操作也很生疏,因此在编码实现过程中浪费了许多时间。这让我认识到课本上的基本知识在实际应用中的重要作用,以后在学习过程中一定要克服自己的浮躁心理,把最最基本的知识彻底掌握,这样才能不断的提高和进步,最基本的总是最有用的。
操作系统是计算机专业的核心课程,也涉及到计算机应用的方方面面。这次课程设计增强了我对学习操作系统的兴趣。在以后的学习过程中注意积累与操作系统相关的知识,同时多自己动手,练习设计一些小的功能模块,以使自己不断提高。
在完成设计的过程中,遇到了不少问题,得到了身边同学和指导老师的热心帮助和指导,在次表示衷心的感谢。
参考文献:
[1] 汤子赢等.计算机操作系统(第二版).西安电子科技大学出版社,2006.8
[2] 冯耀霖等.操作系统,西安电子科技大学出版社.1992
[3] 张尧学等.计算机操作系统教程(第2版).清华大学出版社,2001.4
[4] 谭耀铭.操作系统.中国人民大学出版社,2003.4
《操作系统原理》实验报告院(部):管理工程学院专业:信息管理与信息系统实验项目:实验一二三五班级:信管102姓名:学号:目录引言.…
西安郵電大學操作系统设计报告题目进程线程互斥锁院系名称计算机学院班级1104学生姓名赵大伟学号8位04113124指导教师舒新峰设…
操作系统课程论文院系班级姓名学号指导教师完成时间东莞理工学院摘要本文分析面向对象教学操作系统EOS的系统结构和代码构成通过源代码分…
操作系统课程设计实验报告姓名学号班级地点20xx年月日任务说明共完成四个任务任务一IO系统调用开销比较任务二实现一个简单的shel…
四川大学操作系统课程设计报告学院专业年级组编号组成员软件学院第X组乔心轲姓名0743111340学号张雯姓名XXXXXXXX学号康…
《操作系统原理》实验报告院(部):管理工程学院专业:信息管理与信息系统实验项目:实验一二三五班级:信管102姓名:学号:目录引言.…
操作系统课程设计报告专业学号姓名提交日期操作系统课程设计报告设计目的1本实验的目的是通过一个简单多用户文件系统的设计加深理解文件系…
上海电力学院计算机操作系统原理课程设计报告题目名称编写程序模拟虚拟存储器管理姓名杜志豪学号20xx1798班级20xx053班同组…
课程设计说明书设计题目操作系统课程设计班级信管学号姓名山东科技大学20xx年12月15日课程设计任务书学院信息学院专业信息管理与信…
课程设计报告课程名称数字信号处理课程设计题目音乐声处理指导教师设计起止日期系别光电信息与通信工程专业电子信息工程学生姓名班级学号电…