要求输入3个进程的信息,假设这些进程均是在0时刻同时到达,若进程调度采用非剥夺式静态优先级(优先数数值大的表示优先级比较高;如果遇到优先级一样,按照输入顺序执行。),计算并输出平均作业周转时间。
import java.util.ArrayList;
import java.util.Scanner;
/**
* @Author Tiam
* @Date 2022/10/13 20:59
* @Description: 静态非剥夺式优先级调度计算平均作业周转时间
*/
public class Main {
// 进程数
public static final int PROCESS_NUM = 3;
public static void main(String[] args) {
ArrayList<Process> processes = new ArrayList<>();
for (int i = 0; i < PROCESS_NUM; i++) {
processes.add(input(new Process()));
}
// 排序: 以优先数 降序排列, 相同则按输入顺序排列
processes.sort((o1, o2) -> {
if (o1.priority == o2.priority) {
return o1.name.compareTo(o2.name);
} else {
return o2.priority - o1.priority;
}
});
// 当前时间 , 总周转时间
int currentTime = 0, allTime = 0;
for (Process process : processes) {
currentTime += process.runTime;
process.turnaroundGTime = currentTime;
allTime += process.turnaroundGTime;
}
// 保留小数点后一位
System.out.printf("%.1f", (float) allTime / processes.size());
}
static Scanner scanner = new Scanner(System.in);
static Process input(Process p) {
p.name = scanner.next();
p.priority = scanner.nextInt();
p.runTime = scanner.nextInt();
return p;
}
}
class Process {
/**
* 进程名
*/
String name;
/**
* 优先数 数值大的表示优先级比较高;如果遇到优先级一样,按照输入顺序执行
*/
int priority;
/**
* 运行时间
*/
int runTime;
/**
* 周转时间
*/
int turnaroundGTime;
}
要求输入3个进程的信息,按照最高响应比优先的调度算法计算并输出每个进程的周转时间。(若两个进程的响应比相同,则优先选择先进入的进程。若两个进程的响应比相同,而且进入时刻也相同,则按照输入的顺序执行,如:P4和P6的响应比相同且进入时刻也相同,如P4先输入则选择P4先执行)
import java.util.*;
/**
* @Author Tiam
* @Date 2022/10/15 14:39
* @Description: 最高响应比 优先计算每个作业的周转时间
* 响应比 =1+(等待时间/处理时间) 随着等待时间增加, 响应比增大
* 响应比相同且进入时刻也相同, 选择 先输入的
*/
public class Main {
// 进程数
public static final int PROCESS_NUM = 3;
public static void main(String[] args) {
// 待执行的进程集合
List<Process> processes = new ArrayList<>();
for (int i = 0; i < PROCESS_NUM; i++) {
processes.add(input(new Process()));
}
// 复制一份用于输出
List<Process> processes1 = new ArrayList<>(processes);
// 模拟以 最高响应比优先算法 运行进程
int currentTime = minTime(processes);
while (!processes.isEmpty()) {
// 个数大于一 , 重新计算每个进程的响应比
if (processes.size() > 1) {
for (Process p : processes) {
p.responseRatio = 1 + (currentTime - p.inTime) / (float) p.runTime;
}
// 按响应比 降序排列
Collections.sort(processes, (o1, o2) -> {
// 如果响应比相同, 按进入顺序排序
if (o2.responseRatio == o1.responseRatio) {
// 如果进入时间相同, 按输入顺序运行
if (o1.inTime == o2.inTime) {
return o1.name.compareTo(o2.name);
} else {
return o1.inTime - o2.inTime;
}
} else {
return o2.responseRatio > o1.responseRatio ? 1 : -1;
}
});
}
// 当前需执行的 进程
Process currentP = processes.get(0);
// 当前时间 不小于 当前进程的运行时间
while (currentTime < currentP.inTime) currentTime++;
//当前时间 大于等于 进程的进入时间, 可开始执行程序
currentTime += currentP.runTime;
currentP.turnaroundGTime = currentTime - currentP.inTime;
// 从集合中移除
processes.remove(currentP);
}
processes1.forEach(p -> System.out.print(p.turnaroundGTime + " "));
}
/**
* 返回所有程序中 最小的进入时间
*
* @param processes
* @return
*/
static int minTime(List<Process> processes) {
int min = processes.get(0).inTime;
for (Process p : processes) if (p.inTime < min) min = p.inTime;
return min;
}
static Scanner scanner = new Scanner(System.in);
static Process input(Process p) {
p.name = scanner.next();
p.inTime = scanner.nextInt();
p.runTime = scanner.nextInt();
return p;
}
}
class Process {
/**
* 进程名
*/
String name;
/**
* 进程的进入时刻
*/
int inTime;
/**
* 所需运行时间
*/
int runTime;
/**
* 周转时间
*/
int turnaroundGTime;
/**
* 响应比 = 1+(等待时间/处理时间)
*/
float responseRatio = 1;
}
在请求分页式存储管理方式中,要求输入一个对5个页面的访问序列,输出当系统分配给进程物理页框数为m个时,按照FIFO页面替换算法的缺页中断次数(假设初始时页框均为空)。
# include
# include
# include
int main(){
int n,m,i,j,temp,pd,k;
int *a;//动态数组a用来存放页面访问序列
int *b;//动态数组b用来表示内存结构
int sum=0;//存储缺页中断次数
scanf("%d",&n);
a=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&m);
b=(int *)malloc(m*sizeof(int));
//初始化内存结构
for(i=0;i<m;i++){
b[i]=-1;
}
for(i=0;i<n;i++){
pd=0; //此变量用于判断新加入的数据是否和内存结构是否相同
for(j=0;j<m;j++){ //此层循环用于比较内存结构中的数据和新加入的页面访问序列是否相同
if(a[i]==b[j]){ //新加入的数据是a[i]
pd=1;
}
}
if(pd==0){ //无相同时:更新内存结构,缺页次数加一
for(k=m;k>0;k--){ //更新内存结构
b[k]=b[k-1];
}
b[0]=a[i]; //b[0]单独处理
sum++;
}
}
printf("%d",sum);
system("pause");
return 0;
}
当内存管理采用可变分区分配方案时,要求输入多个空闲分区和进程内存请求序列,输出显示采用最佳适应分配算法分配给各个进程的分区编号。
///*思路*///
//首先 将内存空间排序或者直接找到一个合适的(最小的内存空间与进程适配)最佳适应分配
//再从被找到的这个内存空间开始按照顺序往下寻找 合适的内存空间适配下一进程 下次适应分配法
# include
# include
# include
void sort(int a[],int n)
{
int i,j,temp,min;
for(i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
while(a[j]<a[min])
min=j;
if(min!=i)
{
temp=a[min];
a[min]=a[i];
a[i]=temp;
}
}
}
int main(){
int n,i,j,k,p=0,min=10000;
int *a;
int b[3];
int *c;//该数组用来存放a数组中原来的位置
int num=0,panduan=0;
scanf("%d",&n);
a=(int *)malloc(n*sizeof(int));
c=(int *)malloc(n*sizeof(int));
memset(a, 0, n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
c[i]=a[i];
}
for(i=0;i<3;i++){
scanf("%d",&b[i]);
}
///*数据处理*///
sort(a,n);//对a数组排序
//p是存储当前查找的下标 p是用来下次适应分配法的下标的位置 i不应该是下标 i是控制循环的次数为n次
while(num<3){
panduan=0;
for(i=0;i<n && b[num]!=0;i++){
if(p+i>=n){ //处理下标问题 首尾相连
p=p+i-n;
}
//printf("p--->%d\n",p);
//printf("b[0]--->%d a[p+i]--->%d\n",b[num],a[p+i]);
if(b[num]<=a[p+i] && b[num]!=0){
panduan=1;//找到合适的存储空间
p=p+i;//此处是该程序可能会出错的关键******
for(j=0;j<n && b[num]!=0;j++){ //匹配原数组内容
if(c[j]==a[p]){
printf("%d ",j+1);
c[j]=c[j]-b[num];
a[p]=a[p]-b[num];//空间占用
b[num]=0;//移入内存
}
}
}
}
if(panduan==0){
printf("false ");
}
num++;
}
free(a);
free(c);
system("pause");
return 0;
}
现有一个内存为100K的采用位示图进行页面管理的道数为2道的多道程序设计系统,若作业调度采用高优先级(优先数越大优先级越大)调度算法(如果遇到优先级一样且只能调入一道作业时,按照输入顺序选择调度对象。),进程调度采用非剥夺式的SJF调度算法(如果遇到运行时间相同的进程,按照输入顺序选择调度对象。)。要求输入3个进程信息,输出当三个作业同时提交进入调度时进程的运行顺序。
# include
# include
struct Pro{
char name[10];//进程名
int space;//所需内存空间
int time;//运行时间
int pri;//优先级
int grade_pri;//优先级排名 3 2 1 优先级越大排名越大
int ready;
}pros [3];
void sort_pri(struct Pro *pros){
if(pros[0].pri<pros[1].pri){ //判断优先级
pros[1].grade_pri++;
}else{
pros[0].grade_pri++;
}
if(pros[0].pri<pros[2].pri){
pros[2].grade_pri++;
}else{
pros[0].grade_pri++;
}
if(pros[1].pri<pros[2].pri){
pros[2].grade_pri++;
}else{
pros[1].grade_pri++;
}
}
int main(){
struct Pro *pros_p=pros;
int N=100;//可用内存
int i,j,k,min,min_xb=0;
int sum_space=0;//当前占用的内存
///*输入部分*///
for(i=0;i<3;i++){
scanf("%s %d %d %d",pros[i].name,&pros[i].space,&pros[i].time,&pros[i].pri);
pros[i].grade_pri=1;
pros[i].ready=0;//是否进入就绪态 未进入为0 进入为1 运行为3
}
///*数据处理*///
sort_pri(pros_p);
for(j=0;j<3;j++){ //当三个作业都已经进入过就绪态 终止循环 2-sum_ready>0
///*作业处理部分*///
for(i=3;i>0;i--){ //找出优先级最大的作业
for(k=0;k<3;k++){
if(pros[k].grade_pri==i && pros[k].ready==0 && (sum_space+pros[k].space) <= N){
sum_space=sum_space+pros[k].space;
pros[k].ready=1;
}
}
}
///*进程处理部分*///
min=101;
for(i=0;i<3;i++){ //该循环用于找出运行时间最短的进程
if(min>pros[i].time && pros[i].ready==1){
min=pros[i].time;
min_xb=i;
}
}
sum_space=sum_space-pros[min_xb].space;//将已用内存释放
pros[min_xb].ready=3;//表示该进程已经运行
printf("%s ",pros[min_xb].name);
}
system("pause");
return 0;
}
现有一个8*8的存储器,要对其空间进行分配。(下标从0开始,最后一个内存块下标为63)。现已有块号为2、7、13、23、37、47、59、61的几个内存块被占用。要求输入需分配的进程数M(0 题目描述 题目描述 题目描述 题目描述 题目描述 要求输入N个进程(N为正整型数,0#include
F 驱动调度—采用电梯调度算法排列出磁盘请求响应次序
要求输入一个柱面访问请求序列以及当前磁头所在柱面号和移动方向,输出采用电梯调度算法时移动臂响应的柱面访问序列。#include
K 存储管理3
现有一个8*8的存储器,要对其已分配的空间进行分配及回收。(下标从0开始,最后一个内存块下标为63)。现已有块号为2、7、13、23、37、41、47、59、61的几个内存块被占用。要求输入需分配的进程数M(0#include
I 存储管理1
现有一个8*8的存储器,要对其空间进行分配。(下标从0开始,最后一个内存块下标为63)。现已有块号为1、7、13、23、47、59的几个内存块被占用。现操作系统要求申请N块内存空间(0#include
C 死锁—利用银行家算法判断系统的安全性c
假设系统中有A、B、C三类资源,且有四个并发进程,要求输入资源总量Resource,以及每个进程运行所需的资源总量Claim和已经分配得到的资源量Allocation,利用银行家算法判断当前状态是否为安全状态,若为安全状态则给出一个安全序列。#include
H 进程调度4:时间片轮转
要求输入N个进程(0#include
G 进程调度3
#include