33大工19春《操作系统》大作业题目及要求答案.docx
《33大工19春《操作系统》大作业题目及要求答案.docx》由会员分享,可在线阅读,更多相关《33大工19春《操作系统》大作业题目及要求答案.docx(9页珍藏版)》请在冰点文库上搜索。
大连理工大学远程与继续教育学院《操作系统》课程设计
学习中心:
专业:
年级:
年春/秋季学号:
学生:
题 目:
1.谈谈你对本课程学习过程中的心得体会与建议?
转眼间,学习了一个学期的计算机操作系统课程即将结束。
在这个学期中,通过老师的悉心教导,让我深切地体会到了计算机操作系统的一些原理和具体操作过程。
在学习操作系统之前,我只是很肤浅地认为操作系统只是单纯地讲一些关于计算机方面的操作应用,并不了解其中的具体操作过程和实用性。
通过这一学期的学习,我才知道操作系统(OperatingSystem,简称OS)是管理计算机系统的全部硬件资源包括软件资源及数据资源;控制程序运行;改善人机界面;为其它应用软件提供支持等,使计算机系统所有资源最大限度地发挥作用,为用户提供方便的、有效的、友善的服务界面。
经过一个学期的学习,我也知道了计算机操作系统是铺设在计算机硬件上的多层系统软件,不仅增强了系统的功能,而且还隐藏了对硬件操作的细节,由它实现了对计算机硬件操作的多层次的抽象。
总而言之,操作系统的一些原理在生活中都可以找到相应的例子。
结合生活中的例子,可以化抽象为具体,我们会更加清楚地了解到其原理与操作过程。
我觉得通过我们的不断学习,结合生活中的实际问题,我们就会把操作系统学得更好。
2.《操作系统》课程设计,从以下5个题目中任选其一作答。
大工19春《操作系统》课程设计
注意:
从以下5个题目中任选其一作答。
总 则:
不限制编程语言,可以选用C/C++等(具体工具平台及语言可以自己根据自己的习惯选用,不必完全按照上述技术要求)
作业提交:
大作业上交时文件名写法为:
[姓名 奥鹏卡号 学习中心](如:
戴卫东
101410013979浙江台州奥鹏学习中心[1]VIP)
以附件word文档形式上交离线作业(附件的大小限制在10M以内),选择已完成的作业(注意命名),点提交即可。
如下图所示。
注意事项:
独立完成作业,不准抄袭其他人或者请人代做,如有雷同作业,成绩以零分计!
题目四:
进程同步与互斥生产者与消费者问题
要 求:
(1)撰写一份word文档,里面包括(设计思路、流程(原理)图、源代码)章节。
(2)设计思路:
简单描述生产者与消费者问题。
可设计生产者进程主要计算进程,消费者进程输出打印进程,二者彼此独立,运行速度不确定,可能会产生还未生产就需要消费这种情况,此时引用一个或若干个缓冲区,
存放生产者生产的信息,解决速度不确定带来的问题。
(3)流程(原理)图:
绘制流程图或原理图。
(4)源代码:
列出源代码,也可以仅列出伪代码。
答:
进程同步与互斥生产者与消费者问题
一、设计思路:
生产者进程(进程由多个线程组成)生产信息,例如它可以是计算进程。
消费者进程使用信息,它可以是输出打印进程。
由于生产者和消费者彼此独立,且运行速度不确定,所以很可能出现生产者已产生了信息而消费者却没有来得及接受信息这种情况。
为此,需要引入由一个或者若干个存储单元组成的临时存储区,以便存放生产者所产生的信息,平滑进程间由于速度不确定所带来的问题。
这个临时存储区叫做缓冲区,通常用一维数组来表示。
由一个或若干个存储单元组成的缓冲区叫作“有穷缓冲区”。
下面我们来分析一下有穷缓冲的生产者和消费者的例子。
二、流程(原理)图:
放入产品
获取缓冲区情况
缓
冲池
取出产品
获取缓冲区情况
消费者
生产者
原理图
假设有多个生产者和多个消费者,它们共享一个具有n个存储单
元的有穷缓冲区Buffer(0……n-1),这是一个环形队列。
其队尾指针Rear指向当前信息应存放的位置(Buffer[Rear]),队首指针Front指向当前取出信息的位置(Buffer[front])。
生产者进程总是把信息存放在Buffer[Rear]中,消费者进程则总是从Buffer[Rear]中取出信息。
如果想使生产者进程和消费者进程协调合作,则必须使它们遵循如下规则:
1)只要缓冲区有存储单元,生产者都可往其中存放信息;当缓冲区已满时,若任意生产者提出写要求,则都必须等待;
2)只要缓冲区中有消息可取,消费者都可从缓冲区中取出消息;当缓冲区为空时,若任意消费者想取出信息,则必须等待;
3)生产者们和消费者们不能同时读、写缓冲区。
开始
生产者线程开始
判断缓冲池是否
满了
否
否
判断缓冲池能
否放下新产品
是
是
放入产品到缓冲池
通过notify()唤醒消费者线程,而生产者线程阻塞
消费者线程开始
否
否
判断缓冲池是否 判断缓冲池中
空 产品够不够取
是
是
从缓冲池中取出产品
通过notify()唤醒生产者线程,而消费者线程阻塞
在实际运行中,生产者和消费者两个线程的最开始的运行是没有先后之分的,两个线程处于同时执行的状态。
流程图
三、源代码:
publicclassProducerConsumer{
publicstaticvoidmain(String[]args){SyncStackss=newSyncStack();Producerp=newProducer(ss);
Consumerc=newConsumer(ss);newThread(p).start();
newThread(p).start();newThread(p).start();newThread(c).start();
}
}
classWoTou{intid;WoTou(intid){this.id=id;
}
publicStringtoString(){return"WoTou:
"+id;
}
}
classSyncStack{intindex=0;
WoTou[]arrWT=newWoTou[6];
publicsynchronizedvoidpush(WoTouwt){while(index==arrWT.length){
try{this.wait();
}catch(InterruptedExceptione){e.printStackTrace();
}
}
this.notifyAll();arrWT[index]=wt;index++;
}
publicsynchronizedWoToupop(){while(index==0){
try{this.wait();
}catch(InterruptedExceptione){e.printStackTrace();
}
}
this.notifyAll();index--;
returnarrWT[index];
}
}
classProducerimplementsRunnable{SyncStackss=null;Producer(SyncStackss){
this.ss=ss;
}
publicvoidrun(){for(inti=0;i<20;i++){WoTouwt=newWoTou(i);ss.push(wt);
System.out.println("生产了:
"+wt);
try{
Thread.sleep((int)(Math.random()*200));
}catch(InterruptedExceptione){e.printStackTrace();
}
}
}
}
classConsumerimplementsRunnable{SyncStackss=null;Consumer(SyncStackss){
this.ss=ss;
}
publicvoidrun(){for(inti=0;i<20;i++){WoTouwt=ss.pop();
System.out.println("消费了:
"+wt);
try{
Thread.sleep((int)(Math.random()*1000));
}catch(InterruptedExceptione){e.printStackTrace();
}
}
}
}