操作系统B实验三Word文件下载.docx
《操作系统B实验三Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统B实验三Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
页面引用序列中总页面个数为:
m=12
页面引用序列为:
4、3、2、1、4、3、5、4、3、2、1、5
4.1.2用例2设计:
N=4
m=15
3、7、4、8、3、1、6、7、8、3、1、2、9、3、5
4.2运行结果及运行情况分析
4.2.1测试用例1运行结果如下:
4.2.1.1FIFO算法的运行结果:
结果验证如下:
FIFO
4
3
2
1
5
缺页
淘汰页号
共缺页中断9次
缺页率=缺页次数/总访问次数=9/12=75%
依次淘汰的页面号为:
4、3、2、1、4、3
4.2.1.2OPT算法的运行结果为:
OPT算法验证如下:
OPT
缺页率=缺页次数/总访问次数=7/12=58.33%
2、1、4、2
4.2.2测试用例2运行结果如下:
4.2.2.1FIFO算法运行结果如下:
FIFO运行结果验证如下:
7
8
6
9
缺页标记
共缺页中断11次
缺页率=缺页次数/总访问次数=12/15=80%
3、7、4、8、1、6、7、3
4.2.2.2OPT算法运行结果
OPT运行结果验证如下:
共缺页中断10次
缺页率=缺页次数/总访问次数=10/15=66.67%
以此淘汰的页面号为:
4、1、7、4、2、3
附录:
实验报告参考
石家庄铁道大学
实验报告
课程名称
操作系统(B)
专业
数字媒体技术
学生姓名
班级
信1406
学号
任课教师
沙金
完成日期
2015年11月10日
信息科学与技术学院
实验一进程同步
进程的同步是操作系统处理机管理的重要内容,本实验要求学生理解生产者与消费者问题模型,掌握解决该问题的算法思想,学会使用同步机制。
一组生产者向一组消费者提供产品,它们共享一个有界缓冲池,生产者向其中放入产品,消费者从中取得产品。
假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将产品送入缓冲池;
只要缓冲池未空,消费者可从缓冲池取走一个产品。
根据进程同步机制,编写一个解决上述问题的可视化程序,可显示缓冲池状态、放产品、取产品等过程。
三、实验要求
(1)在windows下用C语言实现,界面友好,自定义数据结构;
(2)实验报告书写请参考实验一;
(3)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者县城的标识符。
(4)生产者和消费者各有两个以上。
(5)多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数。
四、设计原理
通过一个有界缓冲区把生产者和消费者联系起来。
假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。
类似地,只要缓冲区未空,消费者就可以从缓冲区中取走产品。
应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一机制有生产者线程和消费者线程之间的互斥关系来实现。
与计算打印两进程同步关系相同,生产者和消费者两进程P和C之间应满足下列两个同步条件:
1只有在缓冲池中至少有一个缓冲区已存入消息后,消费者才能从中提取信息,否则消费者必须等待。
2只有缓冲池中至少有一个缓冲区是空时,生产者才能把消息放入缓冲区,否则生产者必须等待。
为了满足第一个同步条件,设置一个同步信号量full,它代表的资源是缓冲区满,它的初始值为0,它的值为n时整个缓冲池满。
这个资源是消费者类进程C所有,C进程可以申请该资源,对它施加P操作,而C进程的合作进程生产者进程P对它施加V操作。
同样为了满足第二个同步条件,设置另一个同步信号量empty,它代表的资源是缓冲空区,它的初始值为n,表示缓冲池中所有缓冲区空。
信号量full表示可用缓冲区数量,信号量empty表示缓冲区数量,设置整型变量:
存入指针in和取出指针out。
为解决生产者/消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用g_hFullSemaphore表示,其初始值为有界缓冲区的大小SIZE_OF_BUFFER;
另一个表示缓冲区中产品的数目,用g_hEmptySemaphore表示,其初始值为0.另外,由于有界缓冲区是一个临界资源,必须互斥使用,所以还需要在设置一个互斥信号量g_hMutex,初始值为1.
P原语的主要动作是:
1sem减1;
2若sem减一后仍大于或等于零,则进程继续执行;
3若sem减一后小于零,则该进程被阻塞后入与该信号相对应的队列中,然后转进程调度。
V原语的操作主要动作是:
1sem加1;
2若相加结果大于零,进程继续执行;
③若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程然后再返回原进程继续执行或转进程调度。
采用的同步方法:
1)利用函数CreateMutex(NULL,FALSE,NULL)创建互斥信号量g_hMutex,表示缓冲区当前的状态,若为true时,则表示缓冲区正被别的进程使用。
三个参数表示的意义分别为:
指向安全属性的指针,初始化互斥对象的所有者,指向互斥对象名的指针。
2)利用函数CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,
NULL)创建缓冲区满的信号量g_hFullSemaphore,值为true时表示缓冲区已满。
四个参数分别为:
表示是否允许继承、设置信号机的初始计数、设置信号机的最大计数、指定信号机对象的名称(-1是因为计数从开始)。
3)利用函数CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL)创建缓冲区空的信号量g_hEmptySemaphore,该值为true时表示缓冲区为空。
五、流程图
生产者流程图
消费者流程图
六、程序清单
1.存储结构定义
利用信号量解决生产者消费者问题
constunsignedshortSIZE_OF_BUFFER=10;
//缓冲区长度
unsignedshortProductID=0;
//产品号
unsignedshortConsumeID=0;
//将被消耗的产品号
unsignedshortin=0;
//产品进缓冲区时的缓冲区下标
unsignedshortout=0;
//产品出缓冲区时的缓冲区下标
intg_buffer[SIZE_OF_BUFFER];
//缓冲区是个循环队列
boolg_continue=true;
//控制程序结束
HANDLEg_hMutex;
//用于线程间的互斥
HANDLEg_hFullSemaphore;
//当缓冲区满时迫使生产者等待
HANDLEg_hEmptySemaphore;
//当缓冲区空时迫使消费者等待
DWORDWINAPIProducer(LPVOID);
//生产者线程
DWORDWINAPIConsumer(LPVOID);
//消费者线程
2.算法相关的函数
(1)创建各个互斥信号以及生产者线程和消费者线程的函数在如下主函数里面所示:
intmain()
{
//创建各个互斥信号
g_hMutex=CreateMutex(NULL,FALSE,NULL);
g_hFullSemaphoreCreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);
g_hEmptySemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);
//调整下面的数值,可以发现,当生产者个数多于消费者个数时,
//生产速度快,生产者经常等待消费者;
反之,消费者经常等待。
constunsignedshortPRODUCERS_COUNT=3;
//生产者的个数
constunsignedshortCONSUMERS_COUNT=1;
//消费者的个数
//总的线程数
constunsignedshortTHREADS_COUNT
PRODUCERS_COUNT+CONSUMERS_COUNT;
HANDLEhThreads[PRODUCERS_COUNT];
//各线程的handle
DWORDproducerID[CONSUMERS_COUNT];
//生产者线程的标识符
DWORDconsumerID[THREADS_COUNT];
//消费者线程的标识符
//创建生产者线程
for(inti=0;
i{
hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&
producerID[i]);
if(hThreads[i]==NULL)
return-1;
}
//创建消费者线程
for(i=0;
hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0
&
consumerID[i]);
while(g_continue)
{
if(getchar())
{//按回车后终止程序运行
g_continue=false;
}}
return0;
}
(2)生产者生产一个产品的函数:
//生产一个产品。
简单模拟了一下,仅输出新产品的ID号
voidProduce()
std:
:
cerr<
<
"
Producing"
<
++ProductID<
***"
;
std:
Succeed"
endl;
}
(3)把新生产的产品放入缓冲区的函数:
//把新生产的产品放入缓冲区
voidAppend()
Appendingaproduct***"
g_buffer[in]=ProductID;
in=(in+1)%SIZE_OF_BUFFER;
(4)输出缓冲区当前的状态的函数:
//输出缓冲区当前的状态
cout<
i<
"
g_buffer[i];
if(i==in)
--生产"
if(i==out)
--消费"
从缓冲区中取出一个产品的函数:
//从缓冲区中取出一个产品
voidTake()
Takingaproduct***"
ConsumeID=g_buffer[out];
out=(out+1)%SIZE_OF_BUFFER;
(5)输出缓冲区当前的状态的函数:
(6)消耗一个产品的函数:
//消耗一个产品
voidConsume()
Consuming"
ConsumeID<
3.生产者和消费者算法
(1)生产者算法:
//生产者
DWORDWINAPIProducer(LPVOIDlpPara)
WaitForSingleObject(g_hFullSemaphore,INFINITE);
WaitForSingleObject(g_hMutex,INFINITE);
Produce();
Append();
Sleep(1500);
ReleaseMutex(g_hMutex);
ReleaseSemaphore(g_hEmptySemaphore,1,NULL);
(2)消费者算法:
//消费者
DWORDWINAPIConsumer(LPVOIDlpPara)
WaitForSingleObject(g_hEmptySemaphore,INFINITE);
Take();
Consume();
ReleaseSemaphore(g_hFullSemaphore,1,NULL);
七、运行结果分析(截图)
该程序设置的缓冲区数据长度为20,生产者个数为3,消费者个数为1,程序启动后,生产者先进行生产,当3个生产者全部生产完之后,消费者开始从缓冲区中取出产品,当消费者取出一个后,生产者开始继续生产,当生产完3个之后,消费者开始从缓冲池中取产品,依次循环。
8、心得体会与总结(不少于120字)
实验成绩评定表
班级:
姓名:
学号:
序号
评分项目
满分
实得分
学习态度认真、遵守纪律
10
设计分析合理性
设计方案正确性、可行性、创造性
20
设计结果正确性
40
设计报告的规范性
设计验收
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79)、及格(60-69分)、60分以下为不及格。
指导教师签名:
2015年 月 日