1、参数(1)系统作业或进程的数目;(2)系统资源的种类和数目;(3)系统作业或进程的对每类资源的最大需求数目;(4)系统作业或进程已分配的资源数目。要求(1)检查系统安全状态:根据系统作业或进程的对每类资源的最大需求数目、已分配的资源数目等计算是否存在安全序列。(2)检查系统是否可以继续某个进程资源分配请求。工作量 要求设计说明书的字数在3000字以上。划2012.11.25-11.26 根据课程设计的要求,查找相关资料,完成需求分析;2012.11.26-11.27 进行系统的概要设计;2012.11.27-11.28 进行系统的详细设计和源代码的书写;2013.11.29-11.30 对系统
2、进行调试分析,写出课程设计报告。考资料1 Cay S.Horstmann,Gary Cornell编著.JAVA核心技术 卷 I.北京:机械工业出版社,2008.2 郑莉编著.Java语言程序设计(第二版).北京:清华大学出版社,2011.3 吕国英等编著.算法设计与分析.北京:清华大学出版社,2009.4 马小军等编.软件工程项目案例与实践指导. 北京:清华大学出版社,2013.5 汤子瀛等编著. 计算机操作系统.西安:西安电子科技大学出版社,2011.指导教师签字教研室主任签字2012年xx月xx日指导教师评语:成绩: 年 月 日xxxx大学课程设计(论文)成绩评定表1.问题描述1.1目的
3、掌握信号的使用方法和P、V操作的定义,掌握使用P、V操作实现进程之间同步与互斥的方法,加深对进程同步互斥概念的理解。1.2设计要求设计一程序,由一个进程创建三个子进程,三个子进程一个是生产者进程,两个是消费者进程,且要求: 父子进程都使用父进程创建的共享存储区进行通信,由生产者进程将一个数组中的十个数值发送到由5个缓冲区组成的共享内存中; 两个消费者进程轮流接收并输出这十个数值,同时将两个消费者进程读出的数值进行累加求各和。 考虑生产者进程生产的速度和消费者进程速度。2.需求分析生产者-消费者问题是一个著名的进程同步问题。既然有进程间的同步,也就必将涉及到进程之间的互斥与通信问题,对于这个问题
4、的解决有着很强的现实意义。它的现实意义在于可以类比到计算机中对于临界资源的互斥共享。生产者与消费者就好比是对计算机临界资源访问的程序或用户,而临界资源如打印机、磁带机等设备。3.概要设计3.1程序流程图说明:图3.1 程序流程图所示,首先生产者与消费者线程创建,便就去访问缓冲区。对于生产者若缓冲区没有被其他线程访问,且缓冲区未满则生产数据存放到缓冲区,若其中有一条件没有满足则生产者线程进入阻塞状态。而对于消费者同样也需要缓冲区没有被其他线程访问,但同时要求缓冲区未空才能从缓冲区取数据,若其中有一个条件为满足则同样进入阻塞状态。图3.1 程序流程图4.详细设计4.1程序框架4.1.1生产者与消费
5、者的父类public class SuperThread extends JPanel /定义缓冲区的读写锁 private Lock bufferLock; / 共享缓冲区 public static IntBuffer buffer = IntBuffer.allocate(5); /生产者数组 public int array = 1,5,6,9,8,11,13,10,7,3; /生产者执行的次数 public static int count = 0; /两个生产者取出数据的累加 public static int consumerSum = 0; /记录消费者取数次数 public
6、static int consumerCount = 0; /存放从缓冲区中取得的数据 private static int consumerData; /定义线程名 public String nameString;/线程互斥信号,值为 0 表示生产者进程,值为 1 表示消费者进程public static int mutex = 0; /* 构造函数 */ public SuperThread(String name)/主要完成一些变量的初始化 /* 获得线程名 */ public String getNameString() return nameString; /* 设置线程名 */
7、public void setNameString(String nameString) this.nameString = nameString; /* 获得互斥信号 */ public static int getMutex() return mutex; /* 设置互斥信号 */ public static void setMutex(int mutex) SuperThread.mutex = mutex; /* 判断是否有线程访问缓冲区,没有则对线程进行加锁 */ public boolean wait(int mutex) if (mutex = 1) return false;
8、else return true; /* 释放进程操作完成信号,其实本质就是修改mutex的信号值 */ public static void signal() mutex = 0; /* 判断缓冲区是否为空 */ public boolean isBufferEmpty() /根据缓冲区中是否有0存在来判断是否为空/若0的个数为5则为空,反之则不为空 /* 判断缓冲区是否为满 */ public boolean isBufferFull()/若0的个数为0则为满,反之则不满 /* 消费数,即在缓冲区中取数 */ public void consume() if (wait(mutex) &
9、!isBufferEmpty() /判断是否访问缓冲区 /加锁 bufferLock.lock(); try /设置互斥信号 /从缓冲区取数 /将取数后的缓冲区置0/释放互斥信号 finally/解锁 bufferLock.unlock(); /* 消费者取得缓冲区数据*/ public int getBufferData(int index) /完成取数操作 return data; /* 生产数,即向缓冲区中存数*/ public void produce()isBufferFull() /判断是否访问缓冲区/加锁 try/设置互斥信号 /向缓冲区存数/* 生产者向公共缓冲区放数据*/ p
10、ublic void putBufferData(int index) /完成想缓冲区存数操作4.1.2 生产者类public class Producer extends SuperThread implements Runnable/ 生产者休眠时间 private int producerDelay; /* 生产者构造函数 */ public Producer(String name) super(name); /* 获得生产者休眠时间 */ public int getProducerDelay() return producerDelay; /* 设置生产者休眠时间*/ public
11、 void setProducerDelay(int producerDelay) this.producerDelay = producerDelay; /* 线程中的run函数,线程启动时默认调用的函数*/ Override public void run() /线程启动后向缓冲区存数操作4.1.3 消费者类public class Consumer extends SuperThread implements Runnable /* 消费者休眠时间 */ private int consumerDelay; /* 消费者构造函数 */ public Consumer(String nam
12、e) /* 获得消费者休眠时间 */ public int getConsumerDelay() return consumerDelay; /* 设置消费者休眠时间 */ public void setConsumerDelay(int consumerDelay) this.consumerDelay = consumerDelay; /* 线程中的run函数,线程启动时默认调用的函数 */ public void run() while (true) /线程启动后向缓冲区取数操作4.1.4 主程序入口 主函数 main(String args) /生产者与消费者对象定义producer、
13、consumer1、consumer2 /设置休眠参数,如1000、2000、2500/创建线程producerThread、consumer1Thread、consumer2Thread /启动线程producerThread.start()、consumer1Thread.start()、/consumer2Thread.start();4.2基本算法分析4.2.1 wait(mutex)与signal()数值信号数值信号wait(mutex)主要是通过整型值mutex的设置来表示缓冲区是否已被访问,具体过程为:当有线程需要访问缓冲区时,先确定wait(mutex)信号值,若mutex的值
14、为1则wait(mutex)为真,便可进行下一步操作,若mutex的值为0则wait(mutex)为不为真,该线程阻塞。当线程完成对缓冲区的访问后需要调用signal()信号对信号值mutex进行释放,释放后mutex的值为1,以便其他线程能够访问缓冲区。wait(mutex)与signal()的主要代码如下:public boolean wait(int mutex)/wait(mutex)信号public static void signal()/signal()信号4.2.2 isBufferEmpty()与isBufferFull()信号对于以上所述的wait(mutex)信号还不足以
15、控制线程之间的同步与互斥,还必须使用到isBufferEmpty()与isBufferFull()两个信号。对于生产者要用到信号isBufferFull()来判断缓冲区是否为满,当wait(mutex)型号值为真且isBufferFull()信号值不为真时,生产者线程才能对缓冲区进行存数操作,否则就阻塞等待机会。而对于消费者同样也要用到辅助信号isBufferEmpty()来判断缓冲区是否为空,只有缓冲区不为空且wait(mutex)为真是,消费者才能对缓冲区进行取数操作。isBufferEmpty()与isBufferFull()的主要代码如下:public boolean isBuffer
16、Empty()/判断缓冲区是否为空 int count = 0; for (int i = 0; i buffer.capacity(); i+) if (buffer.get(i) = 0) /根据缓冲区中的0的个数来判断,若缓/区0的个数为5(缓冲区容量为5),则为空 /反之不为空 count +; if (count = 5) public boolean isBufferFull()/判断缓冲区是否为满 if (buffer.get(i) != 0) /根据缓冲区中不为0的个数来判断,若缓/区不为0的个数小于5(缓冲区容量为5), /则不为满,反之为满 if (count 0)/缓冲区为满的情况 index = 5; consumerData = getBufferData(index-1);/取数据 consumerCount +; if (consumerCount = 2 ) consumerSum = consumerSum + consumerData;/计算两次取数 /之和 if (consumerCount = 2) System.out.println(消费者取数之和为:+consumerSum); consumerSum = 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1