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

news2024/10/5 16:24:14

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

实验目的

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

实验内容:

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

实验步骤:

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://www.coloradmin.cn/o/495731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot +Flowable,任务认领和回退(一)

一.简介 有的时候&#xff0c;一个任务节点会存在多个候选人&#xff0c;例如&#xff1a;张三提交一个任务&#xff0c;这个任务即可以由李四处理&#xff0c;又可以由王五处理&#xff0c;那么针对这种多个任务候选人的情况&#xff0c;该如何处理&#xff1f; 二.绘制流程…

Java线程池及其实现原理

线程池概述 线程池&#xff08;Thread Pool&#xff09;是一种基于池化思想管理线程的工具&#xff0c;经常出现在多线程服务器中&#xff0c;如MySQL。 线程过多会带来额外的开销&#xff0c;其中包括创建销毁线程的开销、调度线程的开销等等&#xff0c;同时也降低了计算机…

Spark任务提交流程

1. yarn-client Driver在任务提交的本地机器上运行&#xff0c;Driver启动后会和ResourceManager通讯&#xff0c;申请启动ApplicationMaster; 随后ResourceManager分配Container&#xff0c;在合适的NodeManager上启动ApplicationMaster&#xff0c;此时的ApplicationMaster的…

华为网络设备+WinRadius 实现用户统一管理设备

一、直接贴配置 ###配置VTY用户界面所支持的协议、验证方式 user-interface vty 0 4 protocol inbound telnet authentication-mode aaa quit ###配置RADIUS认证 ###&#xff08;1&#xff09;配置RADIUS服务器模板&#xff0c;指定服务器的IP地址与端口号、共享密钥 radius-s…

Supervisor离线安装(python3.7.8)

Background supervisor是用Python语言开发的一套通用的进程管理程序&#xff0c;可以将一个普通的命令行进程变为后台daemon&#xff0c;并监控进程状态&#xff0c;异常退出时可以自动拉起&#xff1b;可在大多数unix系统上使用&#xff0c;不能在windows上运行&#xff1b;目…

学Python常逛的10个网站

这里写目录标题 一、Python官方文档二、牛客网三、Github四、w3school五、Chatgpt六、kaggle七、realpython八、medium九、stackoverflow十、geeksforgeeks 一、Python官方文档 最全面的Python学习网站非官方文档莫属&#xff0c;它不仅提供了下载安装教程、基础语法教程、标准…

编写UDP版本的客户-服务器程序(echo server 和 echo client)

目录 前言概要 关于数据报流的关键方法签名 UDP协议传输案例 服务端&#xff08;接收端&#xff09; 服务端完整代码 客户端(发送端) 客户端完整代码 创作不易多多支持&#x1f636;‍&#x1f32b;️&#x1f618; 前言概要 我们首先来了解一下, 什么是网络编程. 网络编程…

认识系统总线

目录 一、总线的基本概念 1.总线的定义 二、总线的分类 1.片内总线 2.系统总线 2.1数据总线 2.2地址总线 2.3控制总线 3.通信总线(通信总线) 三、总线特性及性能指标 1.总线特征 2.性能标准 2.1总线的传输周期(总线周期) 2.2总线时钟周期 2.3总线的工作频率 2.4…

vim编辑器命令模式——撤销与时间旅行

Vi介绍 Vi 编辑器是所有 Unix 及 Linux 系统下标准的编辑器&#xff0c;类似于 windows 系统下的 notepad &#xff08;记事本&#xff09;编辑器&#xff0c;由于在 Unix 及 Linux 系统的任何版本&#xff0c;Vi 编辑器是完全相同的&#xff0c;因此可以在其他任何介绍 vi 的地…

小红书数据,如何在垂类赛道中脱颖而出!

导语 近年来&#xff0c;泛娱乐内容在小红书平台盛行&#xff0c;面临流量见顶的情况。这时候&#xff0c;垂类账号的优势就显现出来&#xff0c;不仅可以规避激烈的竞争&#xff0c;还能去获取更精准的流量。 作为一个经久不衰的创作方向&#xff0c;美食赛道分化出教程、测…

webpack plugin原理以及自定义plugin

通过插件我们可以拓展webpack&#xff0c;加入自定义的构建行为&#xff0c;使webpack可以执行更广泛的任务。 plugin工作原理&#xff1a; webpack工作就像是生产流水线&#xff0c;要通过一系列处理流程后才能将源文件转为输出结果&#xff0c;在不同阶段做不同的事&#x…

核磁机器学习 | 基于机器学习的fMRI分类

导读 本文通过提取最显著的特征&#xff0c;将大脑图像分类为正常和异常&#xff0c;并对大脑各种状态的磁共振成像(MRI)进行了研究。本文描述了一种基于小波变换的方法&#xff0c;首先对图像进行分解&#xff0c;然后使用各种特征选择算法从MRI图像中提取最显著的大脑特征。…

[Netty] 面试问题 1 (十八)

文章目录 1.Netty的特点2.Netty应用场景3. Netty核心组件4.Netty的线程模型5. EventloopGroup和EventLoop6.Netty 的零拷贝7.Netty 长连接和心跳机制8.Netty 服务端和客户端的启动过程9.Netty 的 Channel 和 EventLoop10.Netty 的 ChannelPipeline11.Netty 中的 ByteBuf12.Nett…

数据分析01——Anaconda安装/Anaconda中的pip换源/jupyter配置

0、前言&#xff1a; 数据分析三大模块知识&#xff1a;numpy&#xff08;数组计算&#xff09;、pandas&#xff08;基于numpy开发&#xff0c;用于数据清洗和数据分析&#xff09;、matplotlib&#xff08;实现数据可视化&#xff09; 1、Anaconda安装&#xff1a; 安装Ana…

Spring常见面试题总结(2023最新版)

文章目录 1、谈谈你对Spring的理解&#xff1f;1.1 发展历程1.2 Spirng的组成1.3 Spring的好处 2、Autowired和Resource的区别2.1 共同点&#xff1a;2.2 Autowired2.3 Resource2.3.1 Resource的装配顺序 3、Spring常用注解3.1、给容器中注入组件3.1.1 包扫描组件标注注解3.1.2…

Faster-RCNN跑自己的数据集(详细过程)FPN学习

1、下载b站 &#xff1a;霹雳吧啦Wz 的代码 github链接&#xff1a;https://github.com/WZMIAOMIAO/deep-learning-for-image-processing 对应视频链接&#xff1a;2-自定义DataSet_哔哩哔哩_bilibili 2、配置环境&#xff0c;安装相应的包。 或者如果有报错可以直接更新重新…

数据结构之栈的详解

文章目录 一.什么是栈二. 栈的使用2.1栈的基本操作2.2 栈的基本使用 三.栈的实现3.1 数组实现栈的方式3.2 链式栈的实现 四.栈的应用4.1 括号匹配4.2 逆波兰表达式求值什么是逆波兰表达式 4.3 出栈入栈次序匹配4.4 最小栈五.总结 一.什么是栈 栈是一种先入后出(FILO)的线性表数…

【刷题笔记】结构体内存对齐举例+统计回文

一、结构体内存对齐举例 题目&#xff1a; 下面存在两个结构体&#xff1a; struct One {double d;char c;int i; } struct Two {char c;double d;int i; } 在#pragma pack(4)和#pragma pack(8)的情况下&#xff0c;结构体的大小分别是&#xff1f; 分析&#xff1a; C/C中结构…

mysql8.0性能对比以及新特性

MySQL8.0 性能测试与新特性介绍 性能对比 测试内容 测试mysql5.7和mysql8.0 分别在读写、只读、只写模式&#xff08;&#xff08;oltp_read_write&#xff0c;oltp_read_only&#xff0c;oltp_write_only&#xff09;&#xff09;下不同并发时的性能&#xff08;tps&#x…

《微服务实战》 第一章 Java线程池技术应用

前言 介绍Java的线程、线程池等操作 1、Java创建线程方式回顾 1.1、继承Thread类(只运行一次) public class ThreadTest extends Thread{Overridepublic void run() {System.out.println(Thread.currentThread().getName());}public static void main(String[] args) {new …