银行家算法(单项资源)

银行家算法是操作系统课程里面为数不多的几个算法之一,理解银行家算法对理解进程的死锁有很大的帮助。而银行家算法本身并没有太复杂的计算,只是在理解上有一个问题稍微难一点。

    算法在执行过程中要求
        1:每次在“未执行完”进程中找到一个可以满足要求的进程来执行
        2:如果当前状态下所有进程都能够执行完,才表示该状态是安全的。

    上面的第二点比较容易被忽视。下面是算法源码,源码中注释比较多,在这里就不啰嗦了。

#include  " StdAfx.h "

#include 
" Afx.h "

#define  MAX_PROCESSES 10   //  最大进程数目

//  查找一个可执行完进程,并返回进程编号,返回 -1 表示没有进程可以执行
//  nPn ---- 进程数目
//  pA  ---- 进程已申请资源数
//  pM  ---- 进程请求的最大资源数
//  nL  ---- 当前剩余的资源数目
//  finished ---- 已经执行完成的进程
static   int  S_PreExcute( int  nPn,  const   int   * pA,  const   int   * pM,  int  nL,  const   int   * finished)
{
    
for (int i=0; i<nPn; i++
    
{
        
if (!finished[i] && // 第一个条件:进程没有执行完
            (pM[i]-pA[i]) <= nL) // 第二个条件:剩余资源可以满足该进程的执行
            return i;
    }

    
return -1;
}


//  判断当前的状态是否安全,同时给出安全序列
//  返回值:返回当前能够执行完的进程数目。
//  nPn ---- 进程数目
//  pA  ---- 进程已申请资源数
//  pM  ---- 进程请求的最大资源数
//  nT  ---- 系统中所有资源数
//  safety_seq ---- 进程执行的安全序列
int  S_SafeTest( int  nPn,  const   int   * pA,  const   int   * pM,  int  nT,  int   * safety_seq)
{
    
int nFN = 0// 已执行完的进程数量
    int *finished = new int[nPn]; // 进程能执行完标志

    
int nL = nT; // 系统剩余资源数

    
for (int i=0; i<nPn; i++)
    
{
        finished[i] 
= FALSE; // 初始化进程"能执行完"标志
        nL -= pA[i];     // 初始化系统剩余资源数
    }



    
while (nFN < nPn)
    
{
        
// 找到一个可执行完进程
        int nPid = S_PreExcute(nPn, pA, pM, nL, finished);
        
if (nPid < 0// 查找失败
            break;
        
else // 查找成果
        {
            nL 
+= pA[nPid];            // 修改剩余资源数
            safety_seq[nFN++= nPid;  // 添加到安全序列
            finished[nPid] = TRUE;     // 修改进程执行完标志
        }

    }


    delete []finished;
    
return nFN;
}



void  Test_BanksAlgorithm_single()
{
    
int T = 10;             // 系统拥有的资源数
#define PN   3              // 系统中进程数
    
int A[PN] = {233};  // 进程已申请资源数
    int M[PN] = {486};  // 进程最大需求资源数
    int SQ[PN];             // 安全序列

    
int fn = S_SafeTest(PN, A, M, T, SQ);
    
if (fn == PN)
    
{
        printf(
"Status Safety! Safety Sequence: ");
        
for (int i=0; i<fn; i++)
            printf(
"%d  ", SQ[i]);
        printf(
" ");
    }

    
else
        printf(
"Status Unsafety! ");
}


  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。单向链表的实现可以使用C++语言来完成。以下是一个简单的单向链表的代码示例: ```c++ #include <iostream> using namespace std; // 定义链表节点结构体 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; // 定义链表类 class LinkedList { public: LinkedList() { head = NULL; } // 在链表头部插入节点 void insertAtHead(int val) { ListNode* newNode = new ListNode(val); newNode->next = head; head = newNode; } // 在链表尾部插入节点 void insertAtTail(int val) { ListNode* newNode = new ListNode(val); if (head == NULL) { head = newNode; } else { ListNode* cur = head; while (cur->next != NULL) { cur = cur->next; } cur->next = newNode; } } // 删除链表中第一个值为val的节点 void deleteNode(int val) { if (head == NULL) { return; } if (head->val == val) { ListNode* temp = head; head = head->next; delete temp; return; } ListNode* cur = head; while (cur->next != NULL && cur->next->val != val) { cur = cur->next; } if (cur->next != NULL) { ListNode* temp = cur->next; cur->next = cur->next->next; delete temp; } } // 遍历链表并输出每个节点的值 void printList() { ListNode* cur = head; while (cur != NULL) { cout << cur->val << " "; cur = cur->next; } cout << endl; } private: ListNode* head; }; // 测试代码 int main() { LinkedList list; list.insertAtHead(1); list.insertAtHead(2); list.insertAtTail(3); list.insertAtTail(4); list.printList(); list.deleteNode(2); list.printList(); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值