Linux操作系统 --避免死锁(银行家算法)实验

目录

一、实验目的

二、实验内容

三、主要操作代码整理与实验结果展示

(一)源程序(实验步骤/实验过程/算法)

(二)主要操作步骤截图展示


一、实验目的

  1. 加深了解有关资源申请,避免死锁等概念。
  2. 体会和了解死锁和避免死锁的具体实施方法。
  3. 了解死锁的相关知识。
  4. 掌握银行家算法、系统安全性检查算法。

二、实验内容

银行家算法(Banker’s Algorithm)是一个避免进程死锁的著名算法。通过银行家算法,我们可以有效地避免死锁发生的情况。请根据银行家算法完成下列题目。

  1. 设系统中有3种类型的资源(A,B,C)和5个进程P1、P2、P3、P4、P5,其中Available=(2,3,3)。在T0时刻系统状态见下表(T0时刻系统状态表)所示。

                T0时刻系统状态表

资源需求量

已分配资源数量

A    B    C

A     B     C

P1

3    4    7

2     1     2

P2

1    3    4

4     0     2

P3

0    0    3

3     0     5

P4

2    2    1

2     0     4

P5

1    1    0

3     1     4

请求序列如下:
a:进程P2请求资源(0,3,4)
b:进程P4请求资源(1,0,1)
c:进程P1请求资源(2,0,1)
d:进程P3请求资源(0,0,2)

试问:系统能否将进程请求的资源分配给它?

任务1:认真阅读程序,将程序执行的流程描述出来。

任务2:修改程序,要求如果资源分配成功,将安全序列输出。

三、主要操作代码整理与实验结果展示

(一)源程序(实验步骤/实验过程/算法)

#include<iostream>

#include<string>

using namespace std;

#define n 5

#define m 3

int available[m] = { 2,3,3 }, alloc[n][m], need[n][m], request[n][m];

void init()

{

             alloc[0][0] = 2;  alloc[0][1] = 1;  alloc[0][2] = 2;

             alloc[1][0] = 4;  alloc[1][1] = 0;  alloc[1][2] = 2;

             alloc[2][0] = 3;  alloc[2][1] = 0;  alloc[2][2] = 5;

             alloc[3][0] = 2;  alloc[3][1] = 0;  alloc[3][2] = 4;

             alloc[4][0] = 3;  alloc[4][1] = 1;  alloc[4][2] = 4;



             need[0][0] = 3;  need[0][1] = 4;  need[0][2] = 7;

             need[1][0] = 1;  need[1][1] = 3;  need[1][2] = 4;

             need[2][0] = 0;  need[2][1] = 0;  need[2][2] = 3;

             need[3][0] = 2;  need[3][1] = 2;  need[3][2] = 1;

             need[4][0] = 1;  need[4][1] = 1;  need[4][2] = 0;



             request[0][0] = 2;  request[0][1] = 0;  request[0][2] = 1;

             request[1][0] = 0;  request[1][1] = 3;  request[1][2] = 4;

             request[2][0] = 0;  request[2][1] = 0;  request[2][2] = 2;

             request[3][0] = 1;  request[3][1] = 0;  request[3][2] = 1;

            

}

void display()

{ int i,j,k;

             cout << "资源 可分配" << endl;

             for ( i = 0; i < m; i++)

             {

               cout << (char)('A' + i) << "      " << available[i] << endl;

             }

             cout << endl;

             cout << "进程 资源 已分配 需求"<<endl;

             for (j = 0; j < n; j++)

             {



               for (k = 0; k < m; k++)

               {

                      cout << j+1<< "     " <<(char)('A' + k)<< "     " << alloc[j][k] << "     " << need[j][k] << endl;

               }

             }

             cout << endl;

}

bool judge()

{

             int i, j, tag = n;

             bool non;

             int work[m], finish[n];

             for (i = 0; i<m; i++) work[i] = available[i];

             for (i = 0; i<n; i++) finish[i] = 0;            

             while (tag--)

             {

               for (i = 0; i<n; i++)   

               {

                      if (finish[i] == 0)

                      {

                             non = true;

                             for (j = 0; j < m; j++)

                             {

                                    if (need[i][j] > work[j]) non = false;

                             }

                             if(non)

                             {

                                    for (j = 0; j < m; j++) 

                                    {

                                           work[j] = work[j] + alloc[i][j];

                                           finish[i] = 1;

                                    }

                             }

                      }

               }

             }

             non = true;

             for (i = 0; i < n; i++)

             {

               if (finish[i] != 1) non = false;

             }

             if (non) return 1;

             else return 0;

}

void deal(int k)

{

             for (int j = 0; j < m; j++)

             {

               if (request[k][j] > need[k][j])

               {

            

                      cout << " 非法!!!" << endl;

                      return;

               }

             }

             for (int w = 0; w< m; w++)

             {

               if (request[k][w] > available[w])

               {

            

                      cout << " 阻塞!!!" << endl;

                      return;

               }

             }

             for (int p = 0; p < m; p++)  //试探性分配

             {

               available[p] -= request[k][p];

               alloc[k][p] += request[k][p];

               need[k][p] -= request[k][p];

             }

             if (judge())

             {

    

               cout << " 资源分配成功!!!" << endl << endl;

               display();

             }

             else

             {

            

               cout << " 资源分配后系统处于不安全状态!!!" << endl;

               for (int j = 0; j < m; j++)  //试探性分配还原

               {

                      available[j] += request[k][j];

                      alloc[k][j] -= request[k][j];

                      need[k][j] += request[k][j];

               }

             }

             cout << endl;

}

int main()

{

             init();

             display();

             cout << "a: 进程p2请求资源(0,3,4)  " ;

             deal(1);

             cout << "b: 进程p4请求资源(1,0,1)  " ;

             deal(3); 

             cout << "c: 进程p1请求资源(2,0,1)  " ;

             deal(0);

             cout << "d: 进程p3请求资源(0,0,2)  " ;

             deal(2);

             return 0;

}

(二)主要操作步骤截图展示

        

无,可以下载,项目五、linux系统进程间通信方式分析 设计要求: ① 分析linux系统下几种主要的进程通信手段。 ② 共享存储器的方式 ③ 共享文件的通信方式 ④ 消息传递的通信方式 ⑤ ②针对每个通信手段关键技术环节给出详细实例。 ③分析某些通信手段的内部实现机制 项目六、linux网络服务器的配置与管理 设计要求: ①架设samba服务器或ftp服务器。 ②掌握NFS服务器和客户端的安装与配置。 项目七、linux shell程序设计 设计要求: 1.熟练掌握shell的使用,会编写简单的shell程序。 2.Linux环境下利用 shell设计和实现机房的辅助管理系统 3.利用Linux shell进行程序脚本设计,实现两大功能:编辑生成上机课表并自动生成上机用户,进行用户课前和课后管理。 4.主要技术关键的分析 (1) 定义起始登陆界面 ①能显示三种信息:能根据登录用户显示欢迎对象、根据系统时间显示欢迎内容个性化的欢迎信息;有系统初始化、系统管理和退出三个菜单项操作提示菜单; ②能显示当前上课的具体时间(教学第几周、星期几第几节)和系统状态提示信息。 (2)系统初始化 ①生成本机房的上机安排表:上机安排表至少包含十条记录,每条记录应有课程 、班级、起至周、上课节等内容,能对安排表进行显示、添加、删除、修改,复制。 ②生成本机房的上机用户:根据上机安排表自动生成对应的上机用户,一个用户对应于安排表的一条记录,且账号= 班级+课程;密码=班级+课程号 (3)课前准备 ①为用户创建一个工作环境:工作空间和用户资料。 ②校正系统时间;在用户目录下创建工作目录,挂载U盘;查找所需文件;拷贝所需文件;若有压缩包则需打开压缩包;设置文件和目录属性,开放使用权限。 (4)课后整理: ①释放用户空间,进行资料收集。 ②更改文件和目录属性,关闭使用权限,对发生改变和新生成文档要进行打包压缩;移动包到U盘,卸载U盘,删除在用户目录下创建工作目录。 项目六、linux模块加载或内核编译 设计要求:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值