| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 666 人关注过本帖
标题:大家来看一下~!小弟有问题呀~!!
只看楼主 加入收藏
lionmusicyj
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2008-9-20
结帖率:100%
收藏
 问题点数:0 回复次数:5 
大家来看一下~!小弟有问题呀~!!
小弟想用C++实现操作系统的银行家算法,其实思路已经差不多想好了(可能有许多地方不太合适),只是有个地方不知该怎样实现~!
比如有5个进程,分别拥有:已有的资源,和需要分配的资源,而总共的资源也已经设定
但是怎么让系统找到这五个进程的顺序呢?
银行家算法说是:在假定有一个进程在执行完后,释放该进程的全部资源的时候,就需要判断其他的四个其中之一是否能够利用系统资源进行下去,直到5个进程全部能得到需要的资源则成功。

小弟就是不知道这个判断的思路该怎样去实现,如果用循环的话在判断了第一个可以之后(假设),需要一直用4个循环才能完成排序,而后面的四个循环需要去掉上层循环的进程,觉得这个实现的思路又乱又不好写。。

所以希望各位能给小弟一点建议和启发,或者把思路写下来(进行参考)呵呵~!
搜索更多相关主题的帖子: 银行家 操作系统 资源 
2008-10-16 01:04
lionmusicyj
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2008-9-20
收藏
得分:0 
....
2008-10-16 09:45
lionmusicyj
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2008-9-20
收藏
得分:0 
咋没人回呢?是不是问题很模糊啊?
2008-10-16 09:46
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
收藏
得分:0 
很久前写过的一个北大版书上的一个例子...
用C语言写的...你参考吧...
程序代码:
#include<stdio.h>
#define SOURCE_M 3                                                             /*系统资源种类*/
#define PROCESS_N 5                                                            /*进程数*/

int Available[SOURCE_M]={3,3,2};                                               /*系统中现有各类资源数*/
int Max[PROCESS_N][SOURCE_M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};        /*各进程对各类资源的最大需求*/
int Allocation[PROCESS_N][SOURCE_M]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; /*已分配给各进程的各类资源数*/
int Need[PROCESS_N][SOURCE_M]={0};                                             /*各进程尚需各类资源数*/
int ProcessQueue[PROCESS_N]={0};                                               /*一个不死锁的进程调度*/
int cnt=0;                                                                     /*计数变量*/

int CmpLower(int *p1,int *p2)                                                  /*比较函数:向量p1>p2,返回0; 向量p1<=p2,返回1*/
{
    int k=0;
    while(k<SOURCE_M)
    {
        if(*(p1+k) > *(p2+k))
            return 0;
        else
            k++;
    }
    return 1;
}

int SafeCheck(int *Work)                                                       /*检查是否死锁的函数,若死锁返回0,否则返回1*/
{
    int Finish[PROCESS_N]={0,0,0,0,0};                                         /*进程结束标记*/
    int i,j;
    while(1)
    {
        for(i=0;i<PROCESS_N;i++)
            if(Finish[i]==0 && CmpLower(Need[i],Work)==1)
                break;
        if(i<PROCESS_N)
        {
            for(j=0;j<SOURCE_M;j++)
                Work[j]+=Allocation[i][j];                                     /*回收资源*/
            Finish[i]=1;                                                       /*进程结束*/
            ProcessQueue[cnt++]=i+1;                                           /*入队*/
        }
        else
        {
            for(i=0;i<PROCESS_N;i++)
                if(Finish[i]==0)
                    break;
            if(i>=PROCESS_N)                                                   /*所以进程全部安全执行*/
                return 1;
            else
                return 0;
        }
    }
}

int main()                                                                     /*主函数*/
{
    int Request[PROCESS_N][SOURCE_M]={0};                                      /*某进程的资源申请向量*/
    int process_n=0;
    int i,j;
    for(i=0;i<PROCESS_N;i++)
        for(j=0;j<SOURCE_M;j++)
            Need[i][j]=Max[i][j]-Allocation[i][j];
    printf("输入要申请资源的进程(1—5):\n");
    scanf("%d",&process_n);
    while(process_n<1||process_n>5)
    {
        printf("输入不合法,输入要申请资源的进程(1—5):\n");
        scanf("%d",&process_n);
    }
    process_n--;
    printf("输入该进程所要申请的各资源数(A B C):\n");
    for(i=0;i<SOURCE_M;i++)
        scanf("%d",&Request[process_n][i]);
    if(CmpLower(Request[process_n],Need[process_n])==0)                        /*判断申请是否超出申报最大量*/
    {
        printf("Error! Request > Max !\n");
        return 0;
    }
    else if(CmpLower(Request[process_n],Available)==0)                         /*判断当前资源是否能满足申请*/
    {
        printf("\ayou must wait because there is not enough source!\n");
        return 0;
    }
    else
    {
        for(i=0;i<SOURCE_M;i++)                                                /*试探性分配*/
        {
            Available[i]-=Request[process_n][i];
            Allocation[process_n][i]+=Request[process_n][i];
            Need[process_n][i]-=Request[process_n][i];
        }
    }
    if(SafeCheck(Available)==0)                                                /*判断是否死锁*/
    {
        for(i=0;i<SOURCE_M;i++)                                                /*若死锁则回收资源不进行分配*/
        {
            Available[i]+=Request[process_n][i];
            Allocation[process_n][i]-=Request[process_n][i];
            Need[process_n][i]+=Request[process_n][i];
        }
        printf("\a\a死锁!!\n");
    }
    else
    {
        printf("不发生死锁!\n存在一个进程安全序列:\n");
        for(i=0;i<PROCESS_N;i++)                                               /*输出安全的进程队列*/
            printf("P%d ", ProcessQueue[i]);
        printf("\n");
    }
    return 0;
}

2008-10-16 12:27
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
收藏
得分:0 
都尽量给你注释了,
就不再多说了...
但愿你能看懂吧...

2008-10-16 12:27
lionmusicyj
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2008-9-20
收藏
得分:0 
谢谢这位大哥了~!
COPY慢慢看哈~
2008-10-17 12:34
快速回复:大家来看一下~!小弟有问题呀~!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025670 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved