C#窗体模拟银行家算法

源码下载

模拟内容

银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。

设计一个N(如N=5)个并发进程共享M(如M=3)种类不同资源的系统,给定各类资源的初始数目,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。

设计银行家算法,实现资源分配程序,应能打印输出各进程依次要求申请的资源数和依次分配资源情况、每次申请是否为安全状态、安全状态下安全序列的情况等。

运行时,模拟出各种情况,输出各个数据结构的具体数值。

模拟思路

1、设计数据结构
为实现银行家算法,系统必须设置若干数据结构:如Available、Max、Allocation、Need、Work、Finish。这些数据结构记录了相关的信息。

2、分析银行家算法步骤
设进程Pi(i=1,…,N)提出请求Requesti,则银行家算法按如下规则进行判断。
(1)如果Requesti<=NEEDi,则转(2);否则,提示出错。
(2)如果Requesti<=Available,则转(3);否则,提示出错。
(3)系统试探分配资源,修改相关数据:

 	Available = Available -Requesti
	Allocationi = Allocationi +Requesti
	Needi = Needi -Requesti

(4)系统执行安全性检查(调用安全性算法),如是安全状态,则分配成立;否则试探性分配作废,系统恢复原状,进程Pi的此次请求不予满足。

3、安全性算法
(1)初始时,Work:=Available;Finish[i]=false;
(2)从进程集合中找到一个能满足下述条件的进程;

	 ①Finish[i]=false;
	 ②Needi≤Work;若找到,执行步骤(2),否则,执行步骤(3)

(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

	Work:=Work+Allocationi;
	Finish[i]:=true;
	go to step (2)

(4)如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态,输出安全序列;否则,系统处于不安全状态。

实现方法

使用数组存放Available、Max、Allocation、Need、Work、Finish等信息。采用线程的sleep函数让线程在指定位置挂起一定的时间减缓数据变化的速度来一行一行的动态演示每个进程申请资源、释放资源的过程。

编程实现

初始化一些全局变量如Available、Max、Allocation、Need、Work、Finish等。

	static int[] available = new int[3] {
    3, 3, 2 };         //资源数  
    static int[,] max = new int[5, 3]{
   {
   7,5,3},{
   3,2,2},{
   9,0,2},{
   2,2,2},{
   4,3,3}};          //最大资源需求
    static int[,] allocation = new int[5, 3]{
   {
   0,1,0},{
   2,0,0},{
   3,0,2},{
   2,1,1},{
   0,
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Sutherland算法是一种将线段裁剪为可见部分的算法,常用于计算机图形学中。以下是一个简单的C#应用程序,演示如何使用Sutherland算法: 首先,在中添加一个PictureBox控件作为绘图区域,然后在的Load事件中添加以下代码: ```csharp private List<PointF> points = new List<PointF>(); private bool isDrawing = false; private void Form1_Load(object sender, EventArgs e) { pictureBox1.BackColor = Color.White; pictureBox1.MouseDown += PictureBox1_MouseDown; pictureBox1.MouseMove += PictureBox1_MouseMove; pictureBox1.Paint += PictureBox1_Paint; } ``` 这段代码创建了一个List<PointF>类型的变量points,用于存储用户绘制的线段的起始点和终止点。isDrawing变量用于标记用户是否正在绘制线段。在Load事件中,我们设置了PictureBox控件的背景色为白色,并为它的MouseDown、MouseMove和Paint事件分别绑定了事件处理方法。 接下来,我们实现MouseDown和MouseMove事件处理方法,用于让用户绘制线段: ```csharp private void PictureBox1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { isDrawing = true; points.Add(new PointF(e.X, e.Y)); } } private void PictureBox1_MouseMove(object sender, MouseEventArgs e) { if (isDrawing) { pictureBox1.Invalidate(); points.Add(new PointF(e.X, e.Y)); } } ``` 在MouseDown事件处理方法中,如果用户按下了左键,则将isDrawing变量设置为true,并将当前鼠标位置作为起始点添加到points列表中。在MouseMove事件处理方法中,如果isDrawing变量为true,则将当前鼠标位置作为终止点添加到points列表中,并调用PictureBox控件的Invalidate方法,强制重绘绘图区域。 最后,我们实现Paint事件处理方法,用于绘制用户绘制的线段: ```csharp private void PictureBox1_Paint(object sender, PaintEventArgs e) { if (points.Count >= 2) { e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; e.Graphics.DrawLines(Pens.Black, SutherlandHodgman(points.ToArray())); } } private PointF[] SutherlandHodgman(PointF[] polygon) { // TODO: 实现Sutherland算法 return polygon; } ``` 在Paint事件处理方法中,如果points列表中有两个或以上的点,则调用SutherlandHodgman方法对线段进行裁剪,然后使用Graphics.DrawLines方法将裁剪后的线段绘制到绘图区域上。 至于SutherlandHodgman方法的实现,它是一个比较复杂的算法,需要一定的数学知识和编程能力。如果您熟悉该算法,可以在该方法中实现Sutherland算法;如果不熟悉,可以在网上搜索相关资料学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LongTermism

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值