操作系统课程设计宁剑.docx
- 文档编号:30007876
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:91
- 大小:103.65KB
操作系统课程设计宁剑.docx
《操作系统课程设计宁剑.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计宁剑.docx(91页珍藏版)》请在冰豆网上搜索。
操作系统课程设计宁剑
学年论文(课程设计)
题目:
模拟操作系统设计
学院数学与计算机学院
学科门类xxxxxxxxxxxxxx
专业xxxxxxxxxxxxxxxxxxxx
学号xxxxxxxxxxx
姓名宁剑
指导教师xxxxx
20xx年x月xx日
河北大学学年论文(课程设计)任务书
(指导教师用表)
学生姓名
宁剑
指导教师
xx
论文(设计)题目
模拟操作系统设计
主要研究
(设计)内容
模拟采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理、文件管理和用户接口5部分。
进程调度采用时间片轮转调度算法,存储管理采用可变分区存储管理方式,文件系统采用FAT方法。
研究方法
在课本上的知识和经验指导下,以实验的方法独立完成模拟操作系统的设计。
主要任务
及目标
主要实现可变分区存储管理、文件管理和设备管理,在时间和精力允许的情况下,力争实现进程管理和作出用户图形接口。
主要参
考文献
李珍、王煜、张明《操作系统(第三版)》中国铁道出版社
进度安排
论文(设计)各阶段名称
日期
布置任务
6月17日-6月23日
整体设计
6月29日-7月2日
编写程序
7月3日-7月11日
撰写论文
7月12日
指导教师签字:
系主任签字:
主管教学院长签字:
河北大学学年论文(课程设计)成绩评定表
学院:
数学与计算机学院
学生姓名
宁剑
专业年级
xx
论文(设计)题目
模拟操作系统设计
论文(设计)内容提要
论文简单阐述了模拟操作系统的基本构成,即进程管理、存储管理、设备管理、文件管理和用户接口5部分构成。
主要从可变分区存储管理,设备管理和文件管理3部分来详细说明模拟操作系统的部分功能和结构。
可变分区存储管理实现了内存的动态分配和回收,设备管理实现了独立分配和回收,以及设备的扩充,文件系统实现了对文件的相关操作,如建立文件目录,改变文件属性等。
另外,文章只是较为浅显的论述了模拟操作系统的相关部分的实现,并做出相关的模拟和演示,对于操作系统的核心内容,文章并未涉及。
指导教师评语
成绩:
指导教师(签名):
年月日
模拟操作系统设计
摘要
本文主要论述了如何实现存储管理的可变分区管理方式和实现对独立设备的分配和回收,以及对文件系统的详细实现,还实现了对进程控制块的创建。
另外,由于分时系统的特殊性与复杂性,本文并未涉及如何实现有关进程调度的相关算法。
有兴趣的读者可以参考相关书籍。
1、可变分区存储管理方式的内存分配回收
2、独占设备分配和回收
3、磁盘文件操作
4、进程的组织方式
1、内存的可变分区存储管理方式实现
2、独占设备分配和回收实现
3、文件系统的实现
4、进程控制块的实现
一、系统分析与设计
1、可变分区存储管理方式的内存分配回收
可变分区管理方式预先不将内存划分成几个区域,而将内存除操作系统占用区域外的空间看做一个大的空闲区。
当作业要求装入内存时,根据作业需要内存空间的大小查询内存中的各个空闲区,当从内存空间找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装入该作业。
作业执行完后,其所占用的内存分区被收回,成为一个空闲区。
如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。
实现可变分区的分配和回收,主要考虑的问题有三个:
第一,设计记录内存使用情况的数据结构,用来记录空闲区和作业占用的区域:
第二,在设计的数据结构基础上实现内存分配算法:
第三,在设计的数据结构基础上实现内存回收算法。
2、独占设备分配和回收
为了提高操作系统的可适应性和可扩展性,现代操作系统都毫无例外地实现了设备独立性,又叫做设备无关性。
设备独立性的含义是:
应用程序独立于具体使用的物理设备。
为了实现独占设备的分配,系统设置数据表格的方式也不相同,在实验中只要设计合理即可。
这里仅仅是一种方案,采用设备类表和设备表。
3、磁盘文件操作
设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区,要求实现:
1、支持多级目录结构,支持文件的绝对读路径。
2、文件的逻辑结构采用流式结构,物理结构采用链式结构中的显示链接方式。
3、采用文件分配表。
4、实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件(追加方式)、关闭文件、改变文件属性。
5、进行测试。
4、进程的组织方式
考虑如何组织进程,首先就要设置进程控制块的内容。
进程控制块PCB记录各个进程执行时的情况。
不同的操作系统,进程控制块记录的信息内容不一样。
操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。
这里的实验只使用了必不可少的信息。
一般操作系统中,无论进程控制块中信息量多少,信息都可以大致分为以下4类:
1、标识信息(进程标示符PID)
2、说明信息(进程的状态)
3、现场信息(PC、PSW)
4、管理信息(进程队列指针)
二、系统实现
1、内存的可变分区存储管理方式实现
首先,考虑第一个问题:
由于可变分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随内存分配和回收变动。
由于分区长度不同,因此所设计的数据结构中应该包含起始地址,长度和终止地址,分别用*start_address,length,*end_address表示。
structMEMORY_NODE{
intpid;
intlength;
char*start_address,*end_address;
MEMORY_NODE*pre,*next;
};
为了操作方便和实现单个函数多返回值,将P指针和F指针封装到一个数据结构中。
structMEMORY_POINTER{
MEMORY_NODE*p;
MEMORY_NODE*f;
};
在这里,为了方便,假设内存大小只有512个字节,由于字符型数据类型只占有1个字节,故这里开辟一个大小为512的字符型数组。
#definesysMemry512
charmemory[sysMemry];
2、独占设备分配和回收实现
(1)操作系统设置“设备分配表”,用来记录计算机系统所配置的独占设备类型、台数以及分配情况。
设备分配表可有“设备类表”和“设备表”两部分组成。
在设备类表中,每类设备对应一行,通常内容包括设备类、总台数、空闲台数和设备表的起始地址。
设备表中,每行对应一台设备,包括设备物理名、设备逻辑名、占有设备的进程号、是否分配等等。
在设备表中、同类设备登记在连续的行中。
采用双向链表和二级链表的形式,数据结构如下:
设备表:
structdevice{
intdid;
boolallocated;
intpid;
device*pre;
device*next;
};
设备类表:
structdevice_type{
chartype[o];
intcount;
intremain;
device*address;
device_type*pre;
device_type*next;
};
(2)设备分配
1、当进程申请某类设备时,系统先查“设备类表”。
2、如果该类设备的现存台数可以满足申请要求,则从该类设备的“设备表”始址开始依次查找该类设备在设备表中的登记项,找出“未分配”的设备分配给进程。
3、分配后要修改设备类中的现存台数,把分配给进程的设备标识改为“已分配”且填上占用设备的进程名。
4、然后,把设备的绝对号与相对号的对应关系通知用户,以便用户在分配到的设备上装上存储介质。
(3)设备回收
当进程执行结束撤离时应归还所占的设备,系统根据进程名查找设备表,找出进程占用设备的登记栏,把标识修改成“未分配”,清除进程名。
同时把回收的设备台数加到设备类表中的现存台数中。
3、文件系统的实现
文件的目录结构如下:
包含文件或目录名、文件类型名、文件属性、文件或目录的起始盘块、文件长度。
typedefstruct
{
charname[3];//文件或目录名
chartype[2];//文件类型名
charattribute;//属性
charaddress;//文件或目录的起始盘块
charlength;//文件长度
}content;//目录结构
已打开文件表中读写指针的结构如下:
包含磁盘盘块号、磁盘盘块内第几个字节。
typedefstruct
{
intdnum;//磁盘盘块号
intbnum;//磁盘盘块内第几个字节
}pointer;//已打开文件表中读写指针的结构
已打开文件表项类型定义。
typedefstruct
{
charname[20];//文件绝对路径名
charattribute;//文件的属性
intnumber;//文件起始盘块号
intlength;//文件长度
intflag;//操作类型用"0"表示以读操作方式打开文件
//用"1"表示以写操作方式打开文件
pointerread;//读文件的位置,文件刚打开时dnum为文件起始盘
pointerwrite;//写文件的文职,文件刚建立时dnum为文件起始盘
//块号,bnum为“0”,文件打开为文件的末尾
}OFILE;//已打开文件表项类型定义
已打开文件表定义:
已打开文件表、已打开文件表中登记的文件数量。
struct
{
OFILEfile[n];//已打开文件表
intlength;//已打开文件表中登记的文件数量
}openfile;//已打开文件表定义
模拟缓冲
charbuffer1[64];
contentbuffer2[8];
模拟磁盘的文件指针
FILE*fc;//模拟磁盘的文件指针
4、进程控制块的实现
进程控制块的结构:
进程标示符、进程状态、进程现场的信息(通用寄存器内容、程序计数器内容、程序状态字寄存器内容)、进程控制块的前、后指针。
structpcb{
intpid;
intstatus;
intax,bx,cx,dx,pc,psw;
pcb*pre;
pcb*next;
};
进程创建是一个原语,因此,在实验中应该用一个函数实现,进程创建的过程包括:
1、申请进程控制块。
(注意,进程控制块的数量有限)
2、申请资源。
(实验中只简单模拟申请内存空间和设备)
3、填写进程控制块。
(实验中只有进程标示符和进程状态可以填写)
4、挂入就绪队列。
(刚刚申请的进程控制块应该挂入就绪队列,并修改进程控制块内的相关指针)
三、感言
这次暑期的课程设计实验,通过了一个多星期的艰苦奋斗,终于成功做到了模拟操作系统的部分实现,在这里,要感谢朱亮老师一个学期的辛勤付出和独具慧眼。
另外,谈一些自己的感想。
在这次的模拟操作系统课程设计中,我虽然对编程十分熟悉,但对于操作系统的部分结构仍存在生疏,而且对于各个部分的系统实现可谓是绞尽脑汁,把书本上的文字描述变成算法更可谓是难上加难。
例如,为了尽量减小内存浪费和查找方便,我在实验中使用了大量的双向指针和动态内存分配,而放弃采用数组结构,这无疑加大了难度,各个函数对指针的大量操作以至于只要有一个地址错误或疏漏,就会产生意想不到的错误。
而且,对于动态分配的空间,回收时也比较麻烦。
但是,这些困难我通通克服掉,最终取得了胜利。
此外,我对程序设也有了更多的理解。
如,在可变分区的内存管理设计中,由于要对“已分分区表”和“空闲区表”实施同时操作,遇到了单个函数需要多返回值的问题,冥思苦想后终于决定设计一种全新的数据结构,将上述两个链表包含进来,只需返回这种数据结构即可,于是解决了这个问题。
总之,我在这次的暑期模拟操作系统课程设计中收获很大,也看到了自己的不足,希望以后能通过对软件工程系统地学习,来加强自己的构架能力。
四、附录:
设备管理部分代码:
(device.h)
#include
#include
#defineo10
usingnamespacestd;
structdevice{
intdid;
boolallocated;
intpid;
device*pre;
device*next;
};
structdevice_type{
chartype[o];
intcount;
intremain;
device*address;
device_type*pre;
device_type*next;
};
device*create_device(intm,device*existing,intcount,intNum);
device_type*create_device_type(intm,device_type*existing){//输入要创建的device_type的数目m
device_type*temp=NULL;
device_type*tail=NULL;
device_type*head=NULL;
chartype[o];
intcount;
if(m<=0)
returnexisting;
cout< "; cin>>type; cin>>count; intw=0; //检查是否存在已有设备类,若存在,则合并设备 { device_type*curNode=existing; if(curNode! =NULL) { while(curNode) { if(! stricmp(curNode->type,type)){ cout< "< curNode->address=create_device(count,curNode->address,curNode->count,2);w=1; curNode->count=curNode->count+count; curNode->remain=curNode->remain+count; break; } curNode=curNode->next; } } // if(curNode->type! =type&&w==0){ head=newdevice_type; if(head==NULL) { cout<<"Nomemoryavailable! "; returnNULL; } else { strcpy(head->type,type); head->count=count; head->remain=count; head->address=NULL; head->next=NULL; head->pre=NULL; tail=head; head->address=create_device(count,head->address,head->count,1); //printf("%p",head); } } } device_type*curDevice_type=existing; if(w==0){ if(curDevice_type! =NULL) { while(curDevice_type->next) { curDevice_type=curDevice_type->next; } curDevice_type->next=head; head->pre=curDevice_type; } else { existing=head; } } for(inti=0;i { cout<<"请输入第"< "; cin>>type; cin>>count; //检查是否存在已有设备类,若存在,则合并设备 device_type*curNode2=existing; intj=0; if(curNode2! =NULL) { while(curNode2) { if(! stricmp(curNode2->type,type)){ cout< "< curNode2->address=create_device(count,curNode2->address,curNode2->count,2);j=1; curNode2->count=curNode2->count+count; curNode2->remain=curNode2->remain+count; break; } curNode2=curNode2->next; } if(j){ continue; } } /*else { curNode2=head; while(curNode2) { if(! stricmp(curNode2->type,type)){ cout< "< break; } curNode2=curNode2->next; } curNode2->address=create_device(count,curNode2->address,curNode2->count); curNode2->count=curNode2->count+count; curNode2->remain=curNode2->remain+count; continue; }*/ // temp=newdevice_type; if(temp==NULL) { cout<<"Nomemoryavailable! "; returnNULL; } else { strcpy(temp->type,type); if(! j){ temp->count=0; temp->remain=0; } temp->address=NULL; temp->next=NULL; temp->address=create_device(count,temp->address,temp->count,1); temp->count=temp->count+count; temp->remain=temp->remain+count; if(tail==NULL){ tail=existing; while(tail->next){ tail=tail->next; } } temp->pre=tail; tail->next=temp; tail=temp; } } returnexisting; } voiddel_device_type(device_type*existing)//删除PCD { device_type*curE=existing; while(curE) { device*curP=curE->address; while(curP) { device*del=curP; curP=curP->next; delete[]del; } device_type*delE=curE; curE=curE->next; delete[]delE; } } device*create_device(intm,device*existing,intcount,intNum){//输入要创建的device的数目m device*temp=NULL; device*tail=NULL; device*head=NULL; intdid; if(m<=0) returnexisting; if(Num==2){ cout<<"请输入第"< "; } else { cout<<"请输入第个设备物理名: "; } cin>>did; //检查是否存在已有设备类,若存在,则警告 intu=1; do{ device*curNode=existing; if(curNode==NULL) { break; } else { while(curNode) { if(curNode->did==did) { cout< "< u=1; break; } else { u=0; } curNode=curNode->next; } } if(u) { cout<<"请重新输入第"< "; cin>>did; } }while(u); // head=newdevice; if(head==NULL) { cout<<"Nomemoryavailable! "; returnNULL; } else { head->did=did; head->allocated=false; head->pid=0; head->next=NULL; head->pre=NULL; tail=head; } device*curDevice=existing; if(curDevice! =NULL) { while(curDevice->next) { curDevice=curDevice->next; } curDevice->next=head; head->pre=curDevice; } else { existing=head;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计