操作系统课程设计同步机构.docx
- 文档编号:24641619
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:19
- 大小:314.39KB
操作系统课程设计同步机构.docx
《操作系统课程设计同步机构.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计同步机构.docx(19页珍藏版)》请在冰豆网上搜索。
操作系统课程设计同步机构
石家庄经济学院
课程设计报告
(学院)系:
华信学院
专业:
计算机科学与技术
姓名:
孙雅琼
班级:
4084170801
学号:
407417080131
指导教师:
张翠军
日期:
2010年6月24日
“操作系统”课程设计报告
姓名
孙雅琼
学号
40741708013
日期
6月24日
实验室
专业机房2
指导教师
张翠军
设备编号
52
课程设计题目
实验六同步机构
一、实验内容
模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误。
二、实验目的
进程是程序在一个数据集合上运行的过程,进程是并发执行的,也即系统中的多个进程轮流地占用处理器运行。
我们把若干个进程都能进行访问和修改的那些变量称为公共变量。
由于进程是并发地执行的,所以,如果对进程访问公共变量不加限制,那么就会产生“与时间有关”的错误,即进程执行后所得到的结果与访问公共变量的时间有关。
为了防止这类错误,系统必须要用同步机构来控制进程对公共变量的访问。
一般说,同步机构是由若干条原语——同步原语——所组成。
本实习要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。
三、实验过程
1.数据结构设计
建立PCB的结构体
structPCB
{
charname;//进程名
intduandian;//断点
intreason;//等待原因
charstate;//状态Ready(R)Run(G)Finish(F)Wait(W)
};
2. 算法设计
算法思想:
将同步机构分成置顶向下的几个部分进行块的设计。
本设计大体分为三块:
初始化程序,处理器调度程序,模拟处理器指令执行程序。
1)·初始化程序块
A:
模拟处理机调度的程序从初始化程序入口启动,初始化工作包括对信号量s1、s2赋初值,对生产者、消费者进程PCB初始化。
设置全局变量,并对其赋值:
ints1=5,s2=0;//信号变量
intin=0,out=0;
charnextp;//存储变量
charnextc;//获取变量
charB[5];//缓冲池
PCB*process,*consume;
intk=0;
intpc=0;
intPA[5]={0,1,2,3,4};//生产者指令序号
intCA[5]={0,1,2,3,4};//消费者指令序号
对生产者,消费者进程的初始化设置在主函数main()中:
process->state='R';
process->duandian=0;
consume->state='R';
consume->duandian=0;
B·主函数:
在主函数中设置了一个菜单:
手动选择进程的调度
main()
{
"=========生产者和消费者问题========="
intreply;
while
(1)
{
"请选择要调度的进程:
"
"1·生产者进程"
"2·消费者进程"
"3·退出程序"
switch(reply)
{
case1:
Procedure_run();
break;
case2:
Consumer_run();
break;
case3:
exit(3);
default:
cout<<"请输入1~3之间的数字"< } } return(3); } 具体流程如图—1: 图——1主函数流程图 2)·处理器调度程序块: 在计算机操作系统中作业的调度,是通过给作业设置PCB形成进程,被调度到处理器上,进行执行的,而且存在进程抢占处理器的情况因此使用了switch---case()语句,手动模拟进程的抢占,断点的产生,以及现场的保护。 (这部分包括生产者进程,消费者进程的调度) 生产者进程: voidProcedure_run()//生产者模拟机器指令 { switch(生产者进程入口地址) { 入口地址0: //模拟生产产品 { Procedure(); break; } 入口地址1: {//process(s)操作,申请缓冲池存放产品 Procedure_p(process); break; } 入口地址2: {//存放产品 Put(); break; } 入口地址3: {//V(s)操作,释放一个等待缓冲池满的进程 Procedure_v(process); break; } 入口地址4: { Goto();//断电从新置零 break; } } } 生产者进程流程如图—2: 图——2生产者模拟机器指令流程图 消费者进程: voidConsumer_run()//消费者模拟机器指令 { switch(消费者进程入口地址) { 入口地址0: {//P(s)操作,申请缓冲池取得产品 Consume_p(consume); break; } 入口地址1: {//取得产品 Get(); break; } 入口地址2: {//V(s)操作,释放一个等待缓冲池空的进程 Consume_v(consume); break; } 入口地址3: {//输出字符,模拟消费者 Consumer(); break; } 入口地址4: {//重复以上过程 Goto(); break; } } 消费者进程流程图: 图——3消费者模拟机器指令流程图 3)·模拟处理器指令执行块: 对于每个进程(消费者或生产者进程)都存在5条模拟指令 生产者进程执行的5条模拟指令: voidProcedure()生产进程生产一个模拟产品; voidProcedure_p(PCB*p)生产进程执行P操作; voidPut()生产进程将产品放入缓冲池 voidProcedure_v(PCB*p)生产进程执行V操作 voidGoto()重复以上操作指令 消费者进程执行的5条模拟指令: voidConsume_p(PCB*p)消费进程执行P操作 voidGet()消费进程取出产品 voidConsume_v(PCB*p)消费进程执行V操作 voidConsumer()消费进程取走产品 voidGoto()重复以上操作指令 4)·同步机构核心------P操作,V操作。 由于生产者和消费者进程申请的资源信号量不同,所以设置了两对P,V操作 (1)生产者的P操作流程如图——4 图——4消费者P操作流程图 (2)生产者V操作流程如图——5 图——5生产者V操作流程图 (3)消费者P操作流程图如图——6 图——6消费者P操作流程图 (4)消费者V操作流程图如图——7 图——7消费者V操作流程图 四·.程序实现及运行结果 (1)源程序链接 (2)运行结果 执行程序: 第一步: 程序的初始化,如图——8 第二步: 按正常顺序调度生产者进程,如图——8 第三步: 按正常顺序调度消费者进程,如图——9 第四步: 手动任意调度进程,如图——10 手动任意调度进程,如图——11 手动任意调度进程,如图——12 图——8正常顺序下调度生产者进程 图——9正常顺序下调度消费者进程 图——10手动任意调度进程 图——11手动任意调度进程 图——12手动任意调度进程 五、实验总结 通过一个多星期的课程设计,我对操作系统这门课有了新的理解,操作系统这门课程主要学习的是操作系统的四大管理——处理器管理,存储器管理,设备管理,文件管理,我们的实习题目也是围绕这四个部分展开的。 我选择了处理器管理的题目(同步机构),完成这个题目的前提是充分理解进程的并发执行的过程,即系统必须要用同步机构来控制进程的公共变量的访问。 做这个题目前,我又详细的将操作系统关于处理器管理的内容详细的阅读了一遍,因此对题目的理解很容易,而且指导书解释详尽,对我的编程帮助很大。 实际编写过程中还是遇到了很多新的问题: 1.就是语法的不了解,我是在V6的环境下用C语言编写的,因为对语言掌握不熟练,在编写的过程中我需要一遍学习语法一遍编程,因此对C语言又有了新的认识。 2.对操作系统的理解,这点很重要,平时我们所学的都是一些理论的东西,没有真正应用,虽然我们编写的程序也仅仅是模拟处理器的调度,但却给了我们理论与实践相结合的机会。 3.对程序不断修改。 对程序的不断修改实际的学习的最好过程,在这个过程中我学到了很多东西,包括语法,以及思想的不断改进,每一次新的尝试都是对思维的一种挑战,只有真正的掌握了解其原理思想才能在现有的程序中有新的改进。 当然这个设计方案在一定意义上还有很大的欠缺: 1·我的程序没有实现进行的随机调度,而是有手动代替之,这个还是有改进的空间的。 2·这个设计使用的算法不是很好,时间复杂度较高,程序本身不够精练 3·用时较长,对于这样简单的程序应该只需1到2天的时间,但我用了一周的时间,也就是说我的基本功还是很差,语言的熟练程度有待提高。 总之在老师的指导,以及同学间的相互讨论,我成功的完成了题目,收获很多,也在编程这重要领域有了一定进步,最后衷心的感谢各位老师的指导,教诲,谢谢你们。 六、教师评语及成绩 评语: 成绩: 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 同步 机构