实验二 死锁避免的模拟
10
丁蕾蕾
开始于 2018-04-26 16:50
93 29 274
已截止

任务尚未发布或者你没有权限查看任务内容。

任务讨论

@蕾蕾老师‍  补交作业,之前忘记提交了

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

# define m 50

int no1;//进程数
int no2;//资源数
int r;

int allocation[m][m];//分配矩阵
int need[m][m];//需求矩阵
int available[m];//可用资源数目
int max[m][m]; //最大需求矩阵
char name1[m], name2[m];

void main()
{
    void check();
    void print();
    int i, j, p = 0, q = 0;
    char c;
    int request[m], allocation[m][m],need1[m][m],available[m];

    printf("银行家算法实现\n");

    printf("请输入进程数:\n");

    scanf("%d",&no2);

    printf("请输入Max矩阵:\n");
	for (int i = 0; i<no1; i++)
	{
		for (int j = 0; j<no2; j++)
		{

            scanf("%d",&max[i][j]);//输入已知进程最大资源需求量
};
	};

    printf("请输入allocation 矩阵:\n");
	for (int i = 0; i =no1)
			{

                printf("输入错误,请重新输入:\n");
				continue;
			}
			else break;
			};

            printf("\n请输入该进程所请求的资源数request[j]:\n");
			for (int j = 0; j need[i][j]) p=1;
				//判断请求是否超过该进程所需要的资源数
				if (p)
				{

                    printf("请求资源超过该进程资源需求量,请求失败!\n");
				}
				else
				{
					for (int j = 0; j<no2; j++)
					{
						if(request[j]>available[j]) q=1;
						//判断请求是否超过可用资源数
						if (q)
						{

                            printf("没有做够的资源分配,请求失败!\n");
						}
						else
						{
							for (int j = 0; j<no2; j++)
							{
								available[j]=available[j];
								allocation[i][j]=allocation[i][j];
								need[i][j]=need[i][j];
							};

                            printf("返回分配前资源数\n");

                            print();
						};
					};
				}

                printf("\n你还要继续分配吗? Y or N ?\n");
//判断是否继续进行资源分配
c=getche();}
		}while (c=='y'||c=='Y');
	}
};

void check() //安全算法函数
{
    int k, f, v = 0, i, j;
    int work[m], a[m];
    bool finish[m];
    r = 1;
    for (i = 0; i < no1; i++)
    {
        finish[i] = false;//初始化京城均没得到足够资源数并完成
    };
    for (int i = 0; i < no2; i++)
    {
        work[i] = available[i];//work 表示课提供进程继续运行的各资源数
    };
    k = no1;
    do
    {
        for (i = 0; i < no1; i++)
        {
            if (finish[i] == false)
            {
                f = 1;
                for (j = 0; j < no2; j++)
                {
                    if (need[i][j] > work[j])
                    {
                        f = 0;
                    }
                    if (f == 1)
                    {
                        finish[i] = true;
                        a[v++] = i;
                        for (int j = 0; j < no2; j++)
                        {
                            work[j] += allocation[i][j];
                        }
                    }
                }
            }
        }
        k--;

    } while (k > 0);
    f = 1;
    for (int i = 0; i < no1; i++)
    {
        if (finish[i] == false)
        {
            f = 0;
            break;
        }
    }
    if (f == 0)
    {
        printf("系统处在不安全状态!");
        r = 0;
    }
    else
    {
        printf("\n系统当前为安全状态,安全序列为:\n");
        for (int i = 0; i < no1; i++)
        {
            printf("p%d", a[i]);
        }
    }
};

void print()
{
    printf("\n");
    printf("此时刻资源分配情况");
    printf("进程名/号   |   Max     | Allocation  |     Need    |\n");
    for (int i = 0; i < no1; i++)
    {
        printf("p%d/%d", i, i);
        for (int j = 0; j < no2; j++)
        {
            printf("%d", max[i][j]);
        };
        for (int j = 0; j < no2; j++)
        {
            printf("%d", allocation[i][j]);
        };
        for (int j = 0; j < no2; j++)
        {
            printf("%d", need[i][j]);
        }
        printf("\n");
    }
    printf("各类资源可利用的资源数为:");
    for (int j = 0; j < no2; j++)
    {
        printf("%d", available[j]);
    }
    printf("\n");
}

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
//////////////////////////////////////////////////////////////////////////
//全局变量定义
int Available[100]; //可利用资源数组
int Max[50][100];   //最大需求矩阵
int Allocation[50][100];  //分配矩阵
int Need[50][100];        //需求矩阵
int Request[50][100];     //M个进程还需要N类资源的资源量
int Finish[50];
int p[50];
int m,n;   //M个进程,N类资源
/////////////////////////////////////////////////////////////////////////
//安全性算法
int Safe()                      
{
    int i,j,l=0;
    int Work[100]; //可利用资源数组
    for (i=0;i<n;i++)
        Work[i]=Available[i];
    for (i=0;i<m;i++)
        Finish[i]=0;
    for (i=0;i<m;i++)
    {
        if (Finish[i]==1)
        continue;
        else
        {
            for (j=0;j<n;j++)
            {
                if (Need[i][j]>Work[j])
                    break;
            }
            if (j==n)
            {
                Finish[i]=1;
                for(int k=0;k<n;k++)
                    Work[k]+=Allocation[i][k];
                p[l++]=i;
                i=-1;
            }
            else continue;
        }
        if (l==m)
        {
            cout<<"系统是安全的"<<'\n';
            cout<<"系统安全序列是:\n";
            for (i=0;i<l;i++)
            {
                cout<<p[i];
                if (i!=l-1)
                    cout<<"-->";
            }
            cout<<'\n';
            return 1;
        }
    }
}
/////////////////////////////////////////////////////////////////////////////////
//银行家算法
int main()
{
    int i,j,mi;
    cout<<"输入进程的数目:\n";
    cin>>m;
    cout<<"输入资源的种类:\n";
    cin>>n;
    cout<<"输入每个进程最多所需的各类资源数,按照"<<m<<"x"<<n<<"矩阵输入\n";
    for (i=0;i<m;i++)
        for(j=0;j<n;j++)
            cin>>Max[i][j];
    cout<<"输入每个进程已经分配的各类资源数,按照"<<m<<"x"<<n<<"矩阵输入\n";
    for (i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            cin>>Allocation[i][j];
            Need[i][j]=Max[i][j]-Allocation[i][j];
            if (Need[i][j]<0)
            {
                cout<<"你输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源错误,请重新输入:\n";
                j--;
                continue;
            }
        }
    }
    cout<<"请输入各个资源现有的数目:\n";
    for (i=0;i<n;i++)
    cin>>Available[i];
    Safe();
    while (1)
    {
        cout<<"输入要申请的资源的进程号:(第一个进程号为0,第二个进程号为1,依此类推)\n";
        cin>>mi;
        cout<<"输入进程所请求的各个资源的数量\n";
        for (i=0;i<n;i++)
        cin>>Request[mi][i];
        for (i=0;i<n;i++)
        {

            if (Request[mi][i]>Need[mi][i])
            {
                cout<<"所请求资源数超过进程的需求量!\n";
                return 0;
            }
            if (Request[mi][i]>Available[i])
            {
                cout<<"所请求资源数超过系统所有的资源数!\n";
                return 0;
            }
        }
        for (i=0;i<n;i++)
        {
            Available[i]-=Request[mi][i];
            Allocation[mi][i]+=Request[mi][i];
            Need[mi][i]-=Request[mi][i];
        }
        if (Safe())
            cout<<"同意分配请求\n";
        else
        {
            cout<<"SORRY╮(╯▽╰)╭……你的请求被拒绝…\n";
            for (i=0;i<n;i++)
            {
                Available[i]+=Request[mi][i];
                Allocation[mi][i]-=Request[mi][i];
                Need[mi][i]+=Request[mi][i];
            }
        }
        for (i=0;i<m;i++) 
            Finish[i]=0;
        char Flag;       //标志位
        cout<<"是否再次请求分配?是请按Y/y,否请按N/n";
        while (1)
        {
            cin>>Flag;
            if (Flag=='Y'||Flag=='y'||Flag=='N'||Flag=='n')
            break;
            else
            {
                cout<<"请按要求重新输入:\n";
                continue;
            }
        }
        if (Flag=='Y'||Flag=='y')
        continue;
        else break;
    }
	system("pause");
}

截图添在附件上

#include 
#include 
#include 

# define m 50

int no1;//进程数
int no2;//资源数
int r;

int allocation[m][m];//分配矩阵
int need[m][m];//需求矩阵
int available[m];//可用资源数目
int max[m][m]; //最大需求矩阵
char name1[m],name2[m];
 
void main()
{
	void check();
	void print();
	int i,j,p=0,q=0;
	char c;
	int request[m],allocation[m][m],need1[m][m],available[m];
	printf("银行家算法实现\n");
	printf("请输入进程数:\n");
	scanf("%d",&no2);
	printf("请输入Max矩阵:\n");
	for (int i = 0; i < no1; i++)
	{
		for (int j = 0; j < no2; j++)
		{
			scanf("%d",&max[i][j]);//输入已知进程最大资源需求量
		};
	};
	printf("请输入allocation 矩阵:\n");
	for (int i = 0; i =no1)
			{
				printf("输入错误,请重新输入:\n");
				continue;
			}
			else break;
			};
			printf("\n请输入该进程所请求的资源数request[j]:\n");
			for (int j = 0; j need[i][j]) p=1;
				//判断请求是否超过该进程所需要的资源数
				if (p)
				{
					printf("请求资源超过该进程资源需求量,请求失败!\n");
				}
				else
				{
					for (int j = 0; j < no2; j++)
					{
						if(request[j]>available[j]) q=1;
						//判断请求是否超过可用资源数
						if (q)
						{
							printf("没有做够的资源分配,请求失败!\n");
						}
						else
						{
							for (int j = 0; j < no2; j++)
							{
								available[j]=available[j];
								allocation[i][j]=allocation[i][j];
								need[i][j]=need[i][j];
							};
							printf("返回分配前资源数\n");
							print();
						};
					};
				}
				printf("\n你还要继续分配吗? Y or N ?\n");
				//判断是否继续进行资源分配
				c=getche();}
		}while (c=='y'||c=='Y');
	}
};

void check() //安全算法函数
{
	int k,f,v=0,i,j;
	int work[m],a[m];
	bool finish[m];
	r=1;
	for ( i = 0; i < no1; i++)
	{
		finish[i]=false;//初始化京城均没得到足够资源数并完成
	};
	for (int i = 0; i < no2; i++)
	{
		work[i]=available[i];//work 表示课提供进程继续运行的各资源数
	};
	k=no1;
	do
	{
		for ( i = 0; i < no1; i++)
		{
			if (finish[i]==false)
			{
				f=1;
				for (j = 0; j < no2; j++)
				{
					if (need[i][j]>work[j])
					{
						f=0;
					}
					if (f==1)
					{
						finish[i]=true;
						a[v++]=i;
						for (int j = 0; j < no2; j++)
						{
							work[j]+=allocation[i][j];
						}
					}
				}
			}
		}
		k--;

	} while (k>0);
	f=1;
	for (int i = 0; i < no1; i++)
	{
		if (finish[i]==false)
		{
			f=0;
			break;
		}
	}
	if (f==0)
	{
		printf("系统处在不安全状态!");
		r=0;
	}
	else
	{
		printf("\n系统当前为安全状态,安全序列为:\n");
		for (int i = 0; i < no1; i++)
		{
			printf("p%d",a[i]);
		}
	}
};

void print()
{
	printf("\n");
	printf("此时刻资源分配情况");
	printf("进程名/号   |   Max     | Allocation  |     Need    |\n");
	for (int i = 0; i < no1; i++)
	{
		printf("p%d/%d",i,i);
		for (int j = 0; j < no2; j++)
		{
			printf("%d",max[i][j]);
		};
		for (int j = 0; j < no2; j++)
		{
			printf("%d",allocation[i][j]);
		};
		for (int j = 0; j < no2; j++)
		{
			printf("%d",need[i][j]);
		}
		printf("\n");
	}
	printf("各类资源可利用的资源数为:");
	for (int j = 0; j < no2; j++)
	{
		printf("%d",available[j]);
	}
	printf("\n");
}
 
丁蕾蕾

任务已更新