我为一个项目制作了一个OS模拟器,下一部分我必须修改模拟器,包括4个CPU,而不是前一个部分只有1个CPU,这样所有过程都可以在更快的时间内完成。
所以我必须添加并发性,但我不确定这种事情的正确设计模式是什么。我需要知道以下内容是否会让我加快速度。
CPU extends Thread
//in main
get process1
get process 2
get process 3
get process 4
cpu1.run(process1)
cpu2.run(process2)
cpu3.run(process3)
cpu4.run(process4)
我是否正确地假设因为cpus正在扩展线程,它们将同时运行以完成4个进程,或者它就像在单个CPU上运行4个进程一样?
答案 0 :(得分:0)
主要取决于三件事:
您的操作系统中是否有任何模拟调度程序?
答案 1 :(得分:0)
时间切片表示您必须在您决定启动的N个线程中划分单个CPU。没有任何并行性。
答案 2 :(得分:0)
在您的示例中,每个CPU都能够同时运行一个进程,因此如果您只有4个进程,那么您就可以正常运行。
如果您希望程序也适用于流程多于CPU的情况,则需要更复杂的程序。在这种情况下,我建议你看一下Java并发框架。 对于最简单的解决方案,如果您要运行4个以上的进程,我将使用ExecutorService.newFixedThreadPool(4),并使用invokeAll()或submit()将每个进程(作为Callable)添加到结果线程池中。
但是这并没有给你所有正在运行的进程之间的并发性(它只会在前4个进程中的一个完成时获取第5个进程)。如果您希望程序充当真正的多线程操作系统(其中更多进程可以比可用的CPU更活跃),则必须添加某种可以在其中一个可用CPU上分配进程的一部分的调度程序,然后(在第一个完成之前)让另一个进程使用相同的CPU来完成其部分工作。所以它必须允许完成部分进程,然后执行一个或多个其他进程的一部分然后让第一个做更多的工作,等等,直到所有的过程完成。 然后你的模拟器还需要一些方法来决定一个进程何时可以“暂停”(即由调度程序暂时搁置)......
答案 3 :(得分:0)
根据问题的性质,这是一个类项目,并且您对cpu的表示相对简单。例如,只运行一系列指令,如线程类。但是,如果您正在尝试模拟真实世界的CPU和微处理器,我们需要了解更多有关cpu功能的信息:调度,事件处理和其他通常隐藏的低级方面。
但是,在简单的情况下,答案通常是肯定的。
注意,根据这些进程中的任务以及运行此代码的CPU,您可能会看到不同的行为,因为CPU和JVM实际上是如何实现线程的。但是,我认为在你的情况下它是不相关的。