java实现模拟多道程序设计,求助大佬给个思路

究极极极小咸鱼 2020-09-12 03:44:33

大佬们能否给个多道运行算法的基本思路也可以直接贴上代码,需要输入程序数与计算和io时间,然后输出程序运行状态和花费的总时间
...全文
9137 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2020-09-18
  • 打赏
  • 举报
回复
https://blog.csdn.net/preferme/article/details/108666174
qq_39936465 2020-09-17
  • 打赏
  • 举报
回复
引用 楼主 究极极极小咸鱼 的回复:
大佬们能否给个多道运行算法的基本思路也可以直接贴上代码,需要输入程序数与计算和io时间,然后输出程序运行状态和花费的总时间
都是按顺序执行的,时间就是做累加,没搞懂你要输出程序运行状态是啥意思,而且本来是简单的画图题
  • 打赏
  • 举报
回复
引用 5 楼 冰思雨 的回复:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class OperationSystem {


    private static class Operation {
        public enum Type{
            Compute, IO
        }
        private Type type;
        private int time;
        public Operation(Type type, int time){
            this.type = type;
            this.time = time;
        }

        /** @return finished. */
        public boolean execute(){
            return --time <= 0;
        }
    }

    private static class Process {
        private final String name;
        private final List<Operation> operations = new ArrayList<>();
        public Process(String name,Operation ... operations){
            this.name = name;
            this.operations.addAll(Arrays.asList(operations));
        }

        public boolean run(OperationSystem os) {
            Operation operation = operations.get(0);
            if (operation.type == Operation.Type.IO) {
                if (os.tryLock(this)) {
                    if (operation.execute()){
                        operations.remove(0);
                        os.unLock(this);
                    }
                }
            } else if (operation.type == Operation.Type.Compute) {
                if (operation.execute()){
                    operations.remove(0);
                }
            }

            return operations.isEmpty();
        }
    }

    private List<Process> runnable = new ArrayList<>();
    private List<Process> suspended = new ArrayList<>();

    private Process ioLock = null;

    private boolean tryLock(Process process) {
        if (ioLock == null) {
            ioLock = process;
            return true;
        }
        return ioLock == process;
    }

    private void unLock(Process process) {
        ioLock = null;
    }

    public void init() {
        runnable.add(new Process("A", new Operation(Operation.Type.Compute, 20), new Operation(Operation.Type.IO, 30), new Operation(Operation.Type.Compute, 10)));
        runnable.add(new Process("B", new Operation(Operation.Type.Compute, 30), new Operation(Operation.Type.IO, 50), new Operation(Operation.Type.Compute, 20)));
        runnable.add(new Process("C", new Operation(Operation.Type.Compute, 10), new Operation(Operation.Type.IO, 20), new Operation(Operation.Type.Compute, 10)));
    }
    public void start() {
        for (int time = 1; !runnable.isEmpty() || !suspended.isEmpty(); time++) {
            if (!runnable.isEmpty()) {
                for (Iterator<Process> iter = runnable.iterator(); iter.hasNext(); ) {
                    Process process = iter.next();
                    if (process.run(this)) {
                        iter.remove();
                        System.out.println(process.name + " finish time :" + time);
                    }
                }
            }
            if (!suspended.isEmpty()) {
                for (Iterator<Process> iter = suspended.iterator(); iter.hasNext(); ) {
                    Process process = iter.next();
                    if (tryLock(process)) {
                        iter.remove();
                        runnable.add(process);
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        OperationSystem os = new OperationSystem();
        os.init();
        os.start();
    }
}
感谢大佬,我先研究看看
  • 打赏
  • 举报
回复
qq_39936465 2020-09-17
  • 打赏
  • 举报
回复
引用 3 楼 究极极极小咸鱼 的回复:
是要编程出一个程序可以选择单道运行或者多道运行,然后输入程序数据,显示程序占用cpu或者IO设备状态的信息和总的多道或者单道运行总时间
我觉得编程没什么意义,明白原理就可以了,单通道运行就是a运行完了,运行b,b完了,c。 直接做加法。 多通道就是多线程的意思,这里题目说是同一个I/O设备,你可以理解为同时只有一个程序可以使用。就是3个程序同时运行,先计算完的可以直接进入I/O,其他2个程序就要进入等待,但是这里问题来了,当先使用I/O设备的程序运行完,以后其他2个程序应该是竞争I/O设备的使用权,谁先获取使用权这将影响到该程序的执行时间,以上是我个人的一点理解。
  • 打赏
  • 举报
回复
这个题的意思就是让你画出运行时的图,并不是编程实现
冰思雨 2020-09-17
  • 打赏
  • 举报
回复
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class OperationSystem {


    private static class Operation {
        public enum Type{
            Compute, IO
        }
        private Type type;
        private int time;
        public Operation(Type type, int time){
            this.type = type;
            this.time = time;
        }

        /** @return finished. */
        public boolean execute(){
            return --time <= 0;
        }
    }

    private static class Process {
        private final String name;
        private final List<Operation> operations = new ArrayList<>();
        public Process(String name,Operation ... operations){
            this.name = name;
            this.operations.addAll(Arrays.asList(operations));
        }

        public boolean run(OperationSystem os) {
            Operation operation = operations.get(0);
            if (operation.type == Operation.Type.IO) {
                if (os.tryLock(this)) {
                    if (operation.execute()){
                        operations.remove(0);
                        os.unLock(this);
                    }
                }
            } else if (operation.type == Operation.Type.Compute) {
                if (operation.execute()){
                    operations.remove(0);
                }
            }

            return operations.isEmpty();
        }
    }

    private List<Process> runnable = new ArrayList<>();
    private List<Process> suspended = new ArrayList<>();

    private Process ioLock = null;

    private boolean tryLock(Process process) {
        if (ioLock == null) {
            ioLock = process;
            return true;
        }
        return ioLock == process;
    }

    private void unLock(Process process) {
        ioLock = null;
    }

    public void init() {
        runnable.add(new Process("A", new Operation(Operation.Type.Compute, 20), new Operation(Operation.Type.IO, 30), new Operation(Operation.Type.Compute, 10)));
        runnable.add(new Process("B", new Operation(Operation.Type.Compute, 30), new Operation(Operation.Type.IO, 50), new Operation(Operation.Type.Compute, 20)));
        runnable.add(new Process("C", new Operation(Operation.Type.Compute, 10), new Operation(Operation.Type.IO, 20), new Operation(Operation.Type.Compute, 10)));
    }
    public void start() {
        for (int time = 1; !runnable.isEmpty() || !suspended.isEmpty(); time++) {
            if (!runnable.isEmpty()) {
                for (Iterator<Process> iter = runnable.iterator(); iter.hasNext(); ) {
                    Process process = iter.next();
                    if (process.run(this)) {
                        iter.remove();
                        System.out.println(process.name + " finish time :" + time);
                    }
                }
            }
            if (!suspended.isEmpty()) {
                for (Iterator<Process> iter = suspended.iterator(); iter.hasNext(); ) {
                    Process process = iter.next();
                    if (tryLock(process)) {
                        iter.remove();
                        runnable.add(process);
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        OperationSystem os = new OperationSystem();
        os.init();
        os.start();
    }
}
KeepSayingNo 2020-09-17
  • 打赏
  • 举报
回复
没看懂这个题要干嘛,I/O设备是啥意思。
  • 打赏
  • 举报
回复
引用 2 楼 qq_39936465 的回复:
[quote=引用 楼主 究极极极小咸鱼 的回复:] 大佬们能否给个多道运行算法的基本思路也可以直接贴上代码,需要输入程序数与计算和io时间,然后输出程序运行状态和花费的总时间
都是按顺序执行的,时间就是做累加,没搞懂你要输出程序运行状态是啥意思,而且本来是简单的画图题[/quote]主要是
引用 2 楼 qq_39936465 的回复:
[quote=引用 楼主 究极极极小咸鱼 的回复:] 大佬们能否给个多道运行算法的基本思路也可以直接贴上代码,需要输入程序数与计算和io时间,然后输出程序运行状态和花费的总时间
都是按顺序执行的,时间就是做累加,没搞懂你要输出程序运行状态是啥意思,而且本来是简单的画图题[/quote]是要编程出一个程序可以选择单道运行或者多道运行,然后输入程序数据,显示程序占用cpu或者IO设备状态的信息和总的多道或者单道运行总时间
  • 打赏
  • 举报
回复
有大佬帮忙吗?

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧