根据本人编程的经验以及对操作系统的了解,决定选取题目一以完成本作业。
(附:题目一的内容)
实现UP、DOWN原语
产生3个进程:
两个进程模拟需要进入临界区的用户进程。
当需要进入临界区时,显示:“进程x请求进入临界区…”,同时向管理进程提出申请;
申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:“进程x正在临界区…”;
当时间结束,显示:“进程x退出临界区…”,同时向管理进程提出退出申请;
当申请返回,显示:“进程x已退出临界区。”
一个进程作为原语的管理进程,接受其他进程的临界区进入请求:
如果允许进入,则根据DOWN 原语的操作步骤设置相应变量,然后返回;
如果不允许进入,则进入循环等待,直到允许为止;
退出时模拟UP 操作。
进程间通信可以采用信号、消息传递、管道或网络通信方式。
题目要求建立三个进程,模拟进入临界区,然后用一个进程进行管理。在我们的操作系统,通过信号量进行访问是很常见的保证进程同步的方法。在我们的实验中,我决定用DELPIHI来模拟实现这一过程,具体思路如下:
DELPHI程序运行后,主进程(在DELPHI中只有一个进程,但我们可以把线程看作进程)就是我们看到的应用程序,这个程序应该理解是一个原语的管理进程,它可能管理我们的临界区,注意是管理,例如我决定用一个数来模拟临界区,如果该数大于0,那么临界区可用;如果该数小于0,那么临界区不可用;这个数的改变只能由主线程来做到,而其它的线程如果要申请临界区或退出临界区只能通过对主线程进行申请。
因此这样设计是符合题目要求的。
主要考虑建立以下函数,或功能及数据设计:(由于时间关系,就不画流程图了,但应该很容易理解)
1、 主进程部分
功能部分:
(1) 根据线程的请求分配临界区:如果符合条件(临界区可被申请,而且还有临界区还有资源),那么将该资源分配给申请线程,同时显示一下分配情况;如果不符合条件,那么要求线程等待资源;调功能(3)显示状态信息
(2) 根据线程的请求释放临界区:如果正在临界区的线程请求退出,则实现DOWN操作,把信号量置位,把资源置位;调功能(3)显示状态信息
(3) 显示GUI状态:如当前的状态,临界区资源的个数等等
数据部分:
(1) 要创建线程的名称列表,因此就可以创各种线程(绝对不止两个都可以)
(2) 模拟临界区资源的一个内存变量,模拟是否使用临界区的另一个内存变量(这是因为事实上的控件都不支持线程内读写)
2、 子线程部分
功能部分:
(1) 申请资源:向主线程申请资源,如果成功,进入资源并利用,如果不成功,循环等待并SLEEP,如果10秒后仍没有资源可利用,线程自动停止(以免死锁)并报错误信息
(2) 模拟使用:申请得资源后,随机使用一段时间
(3) 申请释放;释放资源要向主进程提供申请,如果成功,那么停止,如果不成功,循环等待并SLEEP,如果10秒后仍没有得到主线程的答复,报错误信息并终止;
数据部分:
(1) 线程的名称,由线程创建时由主线程指定;
(2) 是否申请到资源标志
(3) 是否终止标志(因此主线程就可以控制是否将线程终止)
(4) 休眠时间:如果申请不到资源或不能申请退出等待的时间
(5) 显示的信息列表:显示的信息有“不能申请资源”、“不能退出资源”两种情况(暂这样考虑)
根据我们的这个设计,应该是能很好的模拟出题目要求的。
数据和代码实现在这里不详述了,其实就是对上面那部分的实现。主要参考书《DELPHI 6 开发人员指南》;
简单的介绍如下所示(请注意区分功能,因为这里不全的,详细信息请参看源代码部分)
最终结果,是一模拟程序。程序运行状态如下50