操作系统课程设计张为晓.docx
- 文档编号:12278400
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:39
- 大小:240.80KB
操作系统课程设计张为晓.docx
《操作系统课程设计张为晓.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计张为晓.docx(39页珍藏版)》请在冰豆网上搜索。
操作系统课程设计张为晓
课程设计说明书
课程名称:
操作系统课程设计
专业:
计算机科学与技术班级:
2012-2
设计人:
晁子墨
山东科技大学
2015年1月14日
山东科技大学
课程设计任务书
一、课程设计题目:
操作系统
二、设计原始资料:
《操作系统》(第三版)、《现代操作系统》
三、设计应解决下列各主要问题:
1、 生产者-消费者问题
2、 内存管理
3、 快速文件系统
四、设计说明书应附有下列图纸:
五、小组分工说明:
晁子墨—生产者-消费者问题、内存管理、快速文件系统
六、命题发出日期:
2014-9-24 设计完成日期:
2015-1-15
指导教师评语
成绩:
指导教师(签章):
年 月 日
题目一生产者-消费者问题
1需求分析说明…………………………………………………………5
1.1问题描述…………………………………………………………5
1.2原理分析…………………………………………………………6
2概要设计说明…………………………………………………………6
2.1功能描述……………………………………………………………6
2.2数据结构分析………………………………………………………7
2.3数据结构图…………………………………………………………7
3详细设计说明…………………………………………………………8
3.1主函数模块………………………………………………………8
3.2程序流程图………………………………………………………8
3.2.1生产者…………………………………………………………9
3.2.2消费者…………………………………………………………10
4调试分析…………………………………………………………11
4.1遇到的问题……………………………………………………11
4.2测试结果………………………………………………………13
5用户使用说明………………………………………………………13
题目二内存管理系统
1需求分析说明…………………………………………………………17
1.1问题描述…………………………………………………………17
1.2原理分析…………………………………………………………18
2概要设计说明…………………………………………………………18
2.1函数定义说明…………………………………………………………19
3详细设计说明…………………………………………………………21
3.1代码实现………………………………………………………26
4调试分析…………………………………………………………26
4.1运行结果……………………………………………………27
4.2运行结果分析…………………………………………………………28
5用户使用说明………………………………………………………30
题目三快速文件系统
1需求分析说明…………………………………………………………37
1.1设计目的…………………………………………………………37
1.2问题描述……………………………………………………………38
1.3原理说明……………………………………………………………38
2概要设计说明…………………………………………………………39
2.1函数定义说明…………………………………………………………40
3详细设计说明…………………………………………………………41
3.1代码实现………………………………………………………43
4调试分析…………………………………………………………43
4.1运行结果……………………………………………………43
4.2运行结果分析…………………………………………………………44
5用户使用说明………………………………………………………45
5.1用户操作指南…………………………………………………………46
课程设计总结……………………………………………………48
题目一生产者-消费者问题
1需求分析说明
生产者-消费者问题的总体目标:
在Windows的开发环境下,利用所学C++语言和数据结构的相关知识,利用程序实现经典的生产者-消费者问题的输出,以帮助我们更好的理解和应用进程同步的原理。
1.问题描述
有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取走产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。
这就是生产者-消费者问题。
2.原理分析
在同一个进程地址空间内执行的两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
消费者线程从缓冲区中获得物品,然后释放缓冲区。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
2概要设计说明
1.功能描述
1.1生产者功能描述
在同一个进程地址空间内执行的两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。
1.2消费者功能描述
消费者线程从缓冲区中获得物品,然后释放缓冲区。
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
2.数据结构分析
2.1生产者与消费者实现:
这其中主要是通过多线程,来实现生产者和消费者之间的协调问题。
2.2生产者(producer)——消费者(consumer):
通过一些记录性变量,来记录模拟实现生产者的行为,程序采用OO设计模式,缓存区采用队列结构存储。
3.程序结构图
3详细设计说明
1.主函数模块
1.1创建互斥信号量、已占用的缓存区和未被占用的缓存区并进行初始化。
1.2创建生产者线程和消费者线程。
1.3当输入回车时,结束程序。
2.程序流程图
2.1生产者
2.2消费者
3、程序主要代码
publicclassHoldIntegerSynchronized
{
privateint[]buffer;//缓冲区
privateintoccupiedBufferCount=0;
privateintreadPosition=0,writePosition=0;
//下一个读到的位置和写到的位置
publicHoldIntegerSynchronized(intcapacity)
{
buffer=newint[capacity];
}
publicintBufferSize
{
get
{
returnbuffer.Length;
}
}
publicintBuffer
{
get
{
intbufferCopy;
//加锁
lock(this)
{
while(occupiedBufferCount==0)
{//多个消费者,所以此处改用while
Console.WriteLine(Thread.CurrentThread.Name+"triestoread.");
DisplayState("BufferEmpty."+Thread.CurrentThread.Name+"waits.");
Monitor.Wait(this);
//为临界区之外等待的生产者放行,让他来"生产"
//一直到生产者生产结束,调用了Monitor.PauseAll()
//才能继续执行下去,此时,消费者自动重新获得this的锁
}
--occupiedBufferCount;
bufferCopy=buffer[readPosition];
readPosition=(readPosition+1)%buffer.Length;
DisplayState(Thread.CurrentThread.Name+"reads"+bufferCopy);
//通知,让等待的生产者线程进入Started状态,如果生产者处于临界区之外,这句话执行完后他仍然在临界区之外
Monitor.PulseAll(this);
//释放锁
}//lock
returnbufferCopy;
}
set
{
//加锁
lock(this)
{
while(occupiedBufferCount==buffer.Length)
{
Console.WriteLine(Thread.CurrentThread.Name+"triestowrite.");
DisplayState("BufferFull."+Thread.CurrentThread.Name+"waits.");
Monitor.Wait(this);
//为临界区之外等待消费者放行,让他来"消费"
//一直到消费者调用了Monitor.Pause()
//才能继续执行下去,此时,生产者自动重新获得this的锁
}
buffer[writePosition]=value;
++occupiedBufferCount;
writePosition=(writePosition+1)%buffer.Length;
DisplayState(Thread.CurrentThread.Name+"writes"+value);
//通知,让Wait状态的消费者进入Started状态,如果消费者处于临界区之外,这句话执行完后他仍然在临界区之外
Monitor.PulseAll(this);
//释放锁
}
}
}
}
4调试分析
遇到的问题:
●一开始对创建线程和创建信号量的函数不熟悉,无法着手写程序。
通过上网查询并翻阅了参考书之后才慢慢学会使用_beginthread()和CreateSemaphore()函数。
●生产者与消费者测试结果混乱
经过检查,发现是没有设置互斥信号量,加入了互斥信号量op_mutex后,保证了任一时刻只有一个进程读写缓存区和相关的变量,从而避免了混乱。
●在程序显示结果后无法控制结束
加入了语句while(getchar()=='\n')break;按下回车使程序结束。
测试结果
5用户使用说明
程序设置了缓存区数量buf_size=10,生产者数量producers=3,消费者数量consumers=8,运行之后无需输入参数,以下为运行结果:
题目二内存管理系统
1需求分析说明
内存管理问题的总体目标:
在Windows的开发环境下,利用所学C++语言和数据结构的相关知识,利用程序实现内存管理问题的输出,以帮助我们更好的理解和应用进程同步的原理。
1.设计目的
本实验的目的是从不同侧面了解Windows2000/XP对用户进程的虚拟内存空间的管理、分配方法。
同时需要了解跟踪程序的编写方法(与被跟踪程序保持同步,使用Windows提供的信号量)。
对Windows分配虚拟内存、改变内存状态,以及对物理内存(physicalmemory)和页面文件(pagefile)状态查询的API函数的功能、参数限制、使用规则要进一步了解。
默认情况下,32位Windows2000/XP上每个用户进程可以占有2GB的私有地址空间,操作系统占有剩下的2GB。
Windows2000/XP在X86体系结构上利用二级页表结构来实现虚拟地址向物理地址的变换。
一个32位虚拟地址被解释为三个独立的分量——页目录索引、页表索引和字节索引——它们用于找出描述页面映射结构的索引。
页面大小及页表项的宽度决定了页目录和页表索引的宽度。
2.问题描述
编写一个程序,包括两个线程,一个线程用于模拟内存分配活动,另一个用于跟踪第一个线程的内存行为,要求两个线程之间通过信号量实现同步,模拟内存活动的线程可以从一个文件中读出要进行的内存操作。
每个内存操作包含如下内容:
时间:
每个操作等待时间;
块数:
分配内存的粒度;
操作:
包括保留一个区域、提交一个区域、释放一个区域、回收一个区域、加锁与解锁一个区域。
可将它们的编号放置于一个文件中。
保留是指保留进程的虚地址空间,而不分配物理地址空间;
提交是指在内存中分配物理地址空间;
回收是指释放物理地址空间,而保留进程的虚地址空间;
释放是指将进程的物理地址与虚拟地址空间全部释放;
大小:
块的大小;
访问权限:
共五种PAGE_READONLY,PAGE_READWRIYE,PAGE_EXEXUTE,PAGE_EXEXUTE_READ,PAGE_EXEXUTE_READWRIYE.
3.原理分析
Windows进程的虚拟地址空间中也有三种状态的页面:
空闲页面、保留页面和提交页面。
空闲(Free)页面:
空闲页面是指那些可以保留或提交的可用页面。
保留(Reserved)页面:
保留页面是逻辑页面已分配但没有分配物理存储的页面。
设置这种状态的效果是可以保留一部分虚拟地址,这样,如果不预先释放这些地址,就不能被其他应用程序(如Malloc,LocalAlloc等)的操作所使用。
试图读或写空闲页面或保留页面将导致页面出错异常。
保留页面可被释放或提交。
提交(Committed)页面:
提交页面是物理存储(在内存中或磁盘上)已被分配的页面。
可对它加以保护,不许访问或允许只读访问,或允许读写访问。
提交也可以被回收以释放存储空间,从而变成保留页面。
在本实验中,首先创建工程(IN)生成随机输入文件,其中包含对内存要求作的各种操作;然后创建工程MemoryAllocation,实现输入文件所要求的各项内存管理操作。
2概要设计说明
2.1函数定义说明
(1)HANDLEallo,trac;//信号量句柄
(2)queue
(3)queue
(4)queue
(5)DWORDTracker(LPDWORDlpdwparm)//跟踪allocator线程的内存行为,并输出必要信息
(6)voidAllocator()//模拟内存分配活动的线程
(7)WaitForSingleObject(allo,INFINITE);//等待tracker打印结束的信号量
(8)switch(op.protection)//根据文件内容确定权限
(9)ReleaseSemaphore(trac,1,NULL);//释放信号量通知tracker可以打印信息
(10)WaitForMultipleObjects(2,handle,TRUE,INFINITE);//等待线程执行的执
行结束后,再退出。
3详细设计说明
程序代码
/**内存管理问题
该程序从文件IN读入每次的操作,完成操作后,
由跟踪进程记录结果,输出到out.txt文件中
输入每行为4个整数
2221
10000
第一个数为操作执行所需的时间(毫秒)
第二个数为操作的类型
第三个数代表操作的块数
第四个数代表操作赋给盘块的权限
直到读入执行时间大于等于1000时代表程序输入结束
注意:
其实,
只有保留操作时指定的区域大小才会起作用,
每次提交的是保留队列中的区域,
每次加锁的是提交队列中的区域,
每次解锁的是加锁队列中的区域,
每次回收的是提交队列中的区域,
每次释放的是保留队列中的区域,
若队列中无可操作区域,会显示错误信息
boolTheEnd=false;//分配工作全部完成,结束标志
boolOperSuccess=true;//标识操作是否成功完成
queue
queue
queue
structoperation//每个操作的详细信息
{
inttime;//执行所需的时间
intblock;//内存块数
intoper;//操作类型
intprotection;//权限
};
structtrace//跟踪每一次分配活动的数据结构
{
LPVOIDstart;//起始地址
longsize;//分配的大小
};
operationop;
HANDLEallo,trac;//信号量句柄
DWORDTracker(LPDWORDlpdwparm)//跟踪allocator线程的内存行为,并输出必要信息
{
ofstreamoutfile;//输出文件
outfile.open("out.txt");
for(inti=0;i<=10000;i++)
{
//等待allocator一次操作结束
WaitForSingleObject(trac,INFINITE);
if(TheEnd==true)//检测是否结束
break;
outfile<<"第"<
//outfile<<"每个块包含的字节数"<<'\t'< switch(op.oper) { case0: { outfile<<"保留一个区域"< if(OperSuccess==false) { outfile<<"操作失败,错误号: "< break; } QueueReserved.back(); outfile<<"首地址: "<<((trace*)(QueueReserved.back()))->start <<'\t'<<'\t'<<"大小: "<<((trace*)(QueueReserved.back()))->size< <<"执行时间: "< "< break; } case1: //提交一个区域 { outfile<<"提交一个区域"< if(OperSuccess==false) { outfile<<"操作失败,错误号: "< break; } outfile<<"首地址: "<<((trace*)(QueueCommited.back()))->start <<'\t'<<'\t'<<"大小: "<<((trace*)(QueueCommited.back()))->size< <<"执行时间: "< "< break; } case2: //锁一个区域 { outfile<<"加锁一个区域"< if(OperSuccess==false) { outfile<<"操作失败,错误号: "< break; } outfile<<"首地址: "<<((trace*)(QueueLocked.back()))->start <<'\t'<<'\t'<<"大小: "<<((trace*)(QueueLocked.back()))->size< <<"执行时间: "< "< break; } case3: //解锁一个区域 { outfile<<"解锁一个区域"< if(OperSuccess==false) { outfile<<"操作失败,错误号: "< break; } outfile<<"首地址: "<<((trace*)(QueueLocked.front()))->start <<'\t'<<'\t'<<"大小: "<<((trace*)(QueueLocked.front()))->size< <<"执行时间: "< "< QueueLocked.pop(); break; } case4: //回收一个区域 { outfile<<"回收一个区域"< if(OperSuccess==false) { outfile<<"操作失败,错误号: "< break; } outfile<<"首地址: "<<((trace*)(QueueCommited.front()))->start <<'\t'<<'\t'<<"大小: "<<((trace*)(QueueCommited.front()))->si
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统课程设计 张为晓 操作系统 课程设计