实验一 进程管理与进程同步

news/2024/7/5 3:38:27

实验一 进程管理与进程同步

实验目的

了解进程管理的实现方法,理解和掌握处理进程同步问题的方法。

实验内容:

实现银行家算法、进程调度过程的模拟、读者-写者问题的写者优先算法。

实验步骤:

1.银行家算法流程图

(1)初始化函数init()

 

(2)银行家算法Banker()

 

(3)安全性算法safe()

 

2.银行家算法代码和运行效果图

(1)银行家算法完整代码

//自己设置package

import java.util.Scanner;

//银行家算法

public class Banker {

       Scanner sc=null;

       int resNum=0;

       int proNum=0;

       int res[]=null;

       int[][]max=null;

       int[][]allocation=null;

       int[][]need=null;

       int []available=null;


       void init() {

              sc=new Scanner(System.in);

              System.out.println("输入资源的种类数");

              resNum=sc.nextInt();

              System.out.println("输入进程的数量");

              proNum=sc.nextInt();

              res=new int[resNum];{

                     System.out.println("请分别输入系统"+resNum+"类资源数量:");

                     for(int i=0;i<resNum;i++) {

                            res[i]=sc.nextInt();

                     }

                     }

            

              max=new int[proNum][resNum];{

              System.out.println("请分别输入"+proNum+"个进程所需的"+resNum+"类资源的最大需求数量:");

              for(int j=0;j<proNum;j++) {

                     for(int k=0;k<resNum;k++) {

                            max[j][k]=sc.nextInt();

                            }

                     }

              }

              allocation=new int[proNum][resNum];{//已分配

              System.out.println("请分别输入"+proNum+"个进程,"+resNum+"类资源的已分配情况:");

              for(int l=0;l<5;l++) {

                     for(int m=0;m<resNum;m++) {

                            allocation[l][m]=sc.nextInt();

                            }

                     }

              }

              need=new int[proNum][resNum];{

                     for(int o=0;o<proNum;o++) {

                            for(int p=0;p<resNum;p++) {

                                   need[o][p]=max[o][p]-allocation[o][p];

                            }

                     }

              }

              available=new int[resNum];{

                     for(int i=0;i<resNum;i++) {

                            for(int j=0;j<proNum;j++) {

                                  

                                   res[i]=res[i]-allocation[j][i];

                            }

                            available[i]=res[i];

                                  

                     }

                     }

       }



    void showData() {

           String s="";

           for(int i=0;i<resNum;i++)

                         s=s+"\t";

        System.out.print("进程号"+"\t"+"Max"+s+"All"+s+" Need"+s+"Avai");

        System.out.println();

        System.out.print("\t");

        for(int j=0;j<4;j++) {

               for(int i=0;i<resNum;i++) {

                   System.out.print((char)('A'+i)+"\t");

            }

        }

        System.out.println();

        for(int i = 0;i<proNum;i++){

            System.out.print("P"+i+"\t");

            for(int m = 0;m<resNum;m++) System.out.print(max[i][m]+"\t");

            for(int m = 0;m<resNum;m++) System.out.print(allocation[i][m]+"\t");

            for(int m = 0;m<resNum;m++) System.out.print(need[i][m]+"\t");

            if(i==0)  for(int m = 0;m<resNum;m++) System.out.print(available[m]+"\t");

            System.out.println();

        }

    }


    boolean change(int inRequestNum,int inRequest[])

    {

        int requestNum = inRequestNum;

        int request[] = inRequest;      

        System.out.println();


        boolean f1=true;

        for(int i=0;i<resNum;i++) {

               f1=f1&request[i]<=need[requestNum][i];

               if(!f1) {

                      System.out.print("<===P"+inRequestNum+"进程不满足,Request(");

                        for(int j=0;j<resNum;j++) {

                               System.out.print(inRequest[j]);

                               if(j<resNum-1)

                                      System.out.print(",");

                        }

                        System.out.print(")<=Need(");

                        for(int j=0;j<resNum;j++) {

                               System.out.print(need[requestNum][j]);

                               if(j<resNum-1)

                                      System.out.print(",");

                        }

                        System.out.println("),分配错误!===>");

                        return false;

            }

        }



        boolean f2=true;

        for(int i=0;i<resNum;i++) {

               f2=f2&request[i]<=available[i];

               if(!f2) {

                      System.out.print("<===P"+inRequestNum+"进程不满足,Request(");

                      for(int j=0;j<resNum;j++) {

                             System.out.print(inRequest[i]);

                             if(j<resNum-1)

                                    System.out.print(",");

                             }

                      System.out.print(")<=Available(");

                      for(int j=0;j<resNum;j++) {

                             System.out.print(available[i]);

                             if(j<resNum-1)

                                    System.out.print(",");

                             }

                      System.out.println("),分配错误!===>");

                  

                return false;

               }

        }


        for(int i = 0;i<resNum;i++)

        {

            available[i] = available[i]-request[i];

            allocation[requestNum][i] = allocation[requestNum][i] + request[i];

            need[requestNum][i] = need[requestNum][i] - request[i];

        }


        System.out.println("<===安全性检查前的资源分配表===>");

        showData();

       

        boolean flag = checkSafe(available);

        if(flag==true)

        {

            System.out.println("<===通过安全性算法,能够安全分配!===>");

            System.out.println("<===通过安全性算法的资源分配表!===>");

            showData();

            return true;

        }

        else

        {


            for(int i = 0;i<3;i++)

            {

                available[i] = available[i]+request[i];

                allocation[requestNum][i] = allocation[requestNum][i] - request[i];

                need[requestNum][i] = need[requestNum][i] + request[i];

            }

            System.out.println("<===未通过安全性算法,不能够安全分配!===>");

            System.out.println("<===未通过安全性算法的资源分配表!===>");

            showData();

            return false;

        }

    }

    boolean checkSafe(int res[])

    {

        int work[] = new int[resNum] ;

        for(int i=0 ;i<resNum;i++) {

               work[i]=res[i];

        }

        int i=0;


        String [] str=new String[proNum];

        int x=0;


        boolean finish[] = new boolean[proNum] ;

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

               finish[j]=false;

        System.out.println("<======进行安全性算法======>");

        while(i<proNum)

        {

               boolean f3=true;

               f3=f3&(finish[i]==false);

               for(int j=0;j<resNum;j++) {

                      f3=f3&(need[i][j]<=work[j]);

               }

            if(f3)

            {

                System.out.println("---P"+i+"进程成功分配---");

                if(x<proNum-1) {

                       str[x]="P"+i+"->";

                }

                else {

                       str[x]="P"+i;

                }

                x++;

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

                    work[m] =work[m] + allocation[i][m];

                       finish[i] = true;

                       i=0;

            }

            else

                i++;

               }

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

        {

            if(finish[i]==false)

                return false;

        }

        System.out.println("安全序列为:");

        for(int j=0;j<str.length;j++) {

               System.out.print(str[j]);

        }

        System.out.println();

        return true;

    }

    public static void main(String[] args)

    {

        Banker bank = new Banker();

        bank.init();

        System.out.println("===资源分配表===");

        bank.showData();


        int request[] =new int[bank.resNum];

        int requestNum;


        String source[] = new String[bank.resNum];

        for(int i=0;i<bank.resNum;i++) {

               source[i]=((char)('A'+i))+"";

        }

        Scanner s = new Scanner(System.in);

        String choice = new String();


        while(true)

        {

            System.out.println("请输入要请求的进程号(P0--P"+(bank.proNum-1)+"):");

            requestNum = s.nextInt();

            System.out.println("请输入请求的资源数目");

            for(int i = 0;i<bank.resNum;i++)

            {

                System.out.print("请求"+source[i]+"资源的数目:");

                request[i] = s.nextInt();

            }

            bank.change(requestNum, request);

            System.out.println("提示:是否再请求分配(y/n)");

            choice = s.next();

            if(choice.equals("n")) {

                   System.out.println("提示:谢谢使用,再见!");

                break;

            }  

        }

        s.close();

        bank.sc.close();

    }

  }

(2)init()初始化信息效果图

 

图1 init初始化信息

(3)P1进程申请(1,0,1)资源,进行银行家算法和安全性检查。成功分配。

 

图2 P1进程申请资源

(4)P3进程申请(2,1,1)资源,进行银行家算法和安全性检查。未通过分配,不满足request小于need。

 

图3 P3进程申请资源

(4)P0进程申请(2,3,1)资源,进行银行家算法和安全性检查。未通过安全性算法 。

 

图4 P0进程申请资源

(5)输入n,退出系统。

图5 退出系统

 


http://lihuaxi.xjx100.cn/news/1103423.html

相关文章

pytorch矩阵乘法总结

1. element-wise&#xff08;*&#xff09; 按元素相乘&#xff0c;支持广播&#xff0c;等价于torch.mul() a torch.tensor([[1, 2], [3, 4]]) b torch.tensor([[2, 3], [4, 5]]) c a*b # 等价于torch.mul(a,b) # tensor([[ 2, 6], # [12, 20]]) a * torch.tenso…

不废话!CentOS 8 安装docker的详细过程

目录 1.更新系统 2. 安装依赖包 3.添加 Docker YUM 仓库 4.安装 Docker 5.启动 Docker 6.设置 Docker 开机自启 7.测试 Docker 1.更新系统 dnf update 这里直接输入y&#xff0c;耐心等待更新即可 直到看到complete表示更新完毕 2. 安装依赖包 Docker 需要一些依赖包才能正常…

Django框架之模型自定义管理器

类属性 objects 是manager类的一个对象&#xff0c;作用是与数据库进行交互。 当定义模型类没有指定管理器&#xff0c;django会为模型创建objects管理器。 表结构与数据 CREATE TABLE myapp_grades (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) NOT NULL,boy_num…

Kali Linux 配置动态/静态 IP

[笔者系统版本] [Kali]: Kali Linux 2023.1 [Kernel]: kernel 6.1.0 [Desktop]: Xfce 4.18.1 1. Kali Linux 配置动态 IP (1). 首先查看网卡接口名称。 (2). 编辑网络接口配置文件。 (3). 网络接口配置文件的默认内容是这样的。 (4). 新增配置内容如下&#xff1b; 指定网卡…

【Linux】Linux学习之常用命令一

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

helm和chart

Helm helm是Kubernetes 应用的包管理工具&#xff0c;主要用来管理 Charts&#xff0c;类似Linux系统的yum。Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata&#xff0c;以便于应用程序的分发。 he…

SwiftUI 新 Alert 弹出窗口圆你文本输入之梦

概览 小伙伴们都知道&#xff0c;弹出 Alert 不能包含文本输入框是 SwiftUI 的阿喀琉斯之踵(Achilles’ Heel) 。当然&#xff0c;这说的有些夸张了。&#x1f609; 不过&#xff0c;Alert 不能包含 TextField 在某些情况下着实不方便。于是乎&#xff0c;从 SwiftUI 3.0&…

硬件-6-基站和移动通信系统的演进

1G、2G、3G、4G、5G 移动通信技术发展简史 1 移动通信系统简介 移动通信系统从第一代移动通信系统(1G)开始逐渐发展&#xff0c;目前已经发展到第四代移动通信系统(4G)&#xff0c;第五代移动通信系统(5G)也已经开始标准化&#xff0c;预计2020年商用&#xff0c;6G预计2030年…