Java语言从诞生之时就宣称一次编写,到处运行的跨平台特性,其实现原理是源码文件并没有直接编译成机器指令,而是编译成Java虚拟机可以识别和运行的字节码文件(Class类文件,*.class),字节码文件是一种平台无关的中间编译结果,字节码文件由java虚拟机读取,解析和执行,java虚拟机屏蔽了不同操作系统和硬件平台的差异性。 如今的java虚拟机已经称为一种通用平台,不但能够运行java语言,Groovy,JRuby,Jython等一大批动态语言也可以直接在Java虚拟机上运行,其原理也是这些动态语言的编译器将…

2021年5月1日 0条评论 37点热度 阅读全文

面向对象的代码找不到了,只有之前备份的结构化代码,面向对象的话改成两个类就好了,并不复杂。 #include <iostream> #include <fstream> #define PROGRESS 5 //进程数量 #define REC_NUM 3 //资源种类数量 using namespace std; int Available[PROGRESS]; //定义可用资源向量Available int sign[PROGRESS],work[PROGRESS][REC_NUM],w…

2021年4月16日 0条评论 29点热度 阅读全文

题目描述: 已知进程{P0,P1,P2,P3,P4},有三类系统资源A、B、C的数量分别为10、5、7,在T0时刻的资源分配情况如下图所示: (1)若进程P1请求资源,发出请求向量Request1(1,0,2),编写程序用银行家算法判断系统能否将资源分配给它; (2)若进程P2提出请求Request(0,1,0),用银行家算法程序验证系统能否将资源分配给它。 一、算法 1、银行家算法 ① 进程p向系统请求进一步分配资源,首先检查请求的所有类别的资源是否小于等于进程p所对应的需要的资源数。如果满足,进入第②步。否则认…

2021年4月15日 0条评论 24点热度 阅读全文

避免死锁的经典算法–银行家算法 此算法的根本实质就是在分配资源以后可以找到一组进程的安全序列来保证系统是处于安全状态的,不会形成死锁。 1、银行家算法的思路 —判断进程申请的资源进程的请求是否合法(请求的资源数≤还需要的资源数=需要的最大资源数-已经分配给该进程的此类资源) —有足够空闲,没有则拒绝分配 —如果有足够空闲: 假设将资源分配给进程,判断假设分配后的系统状态,安全则分配,不安全则拒绝分配。 2、银行家算法中的数据结构 可利用资源向量Available 这是一个含有m个元素的数组,其中的每一个元素代表一类…

2021年4月14日 0条评论 18点热度 阅读全文

一、预防死锁—确保系统不会进入死锁的状态 死锁的预防就是:通过破坏产生死锁的四个必要条件之一,使系统不具备产生死锁的可能。 1、破坏请求条件(静分配) 事先分配资源,在进程执行之前分配所需的全部资源,进程在执行过程中不会出现新的分配请求,便不会产生死锁,简单,易于实现。但会使系统的资源利用率变低。 2、破坏不剥夺条件 进程一旦因为申请资源被阻塞,必须释放已经拥有的全部资源。 但是此进程如果已经得到了当时阻塞时想要的资源,再次接着执行时,可能原来拥有的资源已被占用,又需要申请资源,然后可能又被阻塞,可此时又需要释放已…

2021年4月14日 0条评论 17点热度 阅读全文

文章主要结构图如下 操作系统 现代计算机系统由一个或多个处理器、主存、打印机、键盘、鼠标、显示器、网络接口以及各种输入/输出设备构成。 然而,程序员不会直接和这些硬件打交道,而且每位程序员不可能会掌握所有计算机系统的细节,这样我们就不用再编写代码了,所以在硬件的基础之上,计算机安装了一层软件,这层软件能够通过响应用户输入的指令达到控制硬件的效果,从而满足用户需求,这种软件称之为 操作系统,它的任务就是为用户程序提供一个更好、更简单、更清晰的计算机模型。 我们一般常见的操作系统主要有 Windows、Linux、Fr…

2021年1月15日 0条评论 120点热度 阅读全文

在日常工作中,由于经常要在Linux下收取组播数据,特将一些异常情况记下: 1.没有添加组播路由             Linux下没有添加对应组播路由的情况时,是无法用程序收到组播数据的,这是出现问题时要检查的第一条。 2.组播路由添加错误            添加组播路由的指令为:route add -net 239.10.0.0 netmask 255.255.0.0…

2019年1月14日 0条评论 18点热度 阅读全文

首先我们来了解一下哲学家进餐问题的背景: 话说有5个哲学家围在一张桌子上吃饭,桌上只有5g根筷子,一个要吃饭必须的得有两根筷子,哲学家要吃饭时总是先拿起左边的筷子,在拿起右边的筷子,这样最佳的情况是可同时有两人可以进餐,最坏的情况是大家都拿起了左边的筷子,大家都没得吃。哲学家吃完时会停下来思考一段时间,等饿了在吃。 下面我们来看一下java如何模拟哲学家进餐问题 import java.util.concurrent.ExecutorService; import java.util.concurrent.Exec…

2017年7月15日 0条评论 17点热度 阅读全文

概述 考虑这样一种常用的情形:你需要将静态内容(类似图片、文件)展示给用户。那么这个情形就意味着你需要先将静态内容从磁盘中拷贝出来放到一个内存buf中,然后将这个buf通过socket传输给用户,进而用户或者静态内容的展示。这看起来再正常不过了,但是实际上这是很低效的流程,我们把上面的这种情形抽象成下面的过程: read(file, tmp_buf, len); write(socket, tmp_buf, len); 首先调用read将静态内容,这里假设为文件A,读取到tmp_buf, 然后调用write将tmp…

2016年9月19日 0条评论 17点热度 阅读全文

进程通信: 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。 1 匿名管道通信 匿名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 // 需要的头文件 #include <unistd.h> // 通过pipe()函数…

2016年4月20日 0条评论 15点热度 阅读全文