最短剩余时间优先:Java多线程
我试图用java模拟CPU调度算法,并使用多线程。我已经成功地实现了FCFSFirst Come First Service和SJFShortest Job First。但问题是,当我开始考虑SRTF时,首先考虑剩余时间最短,这是一种先发制人的SJF形式。 我使用以下模型: 一个CPU线程,它有一个时钟变量,每100ms保持一个简单的时钟增量。我有一个布尔值是可用的;用于在开始执行之前检查CPU是否可用的进程的标志。 用于长期调度的线程,它将进程从进程列表推送到就绪队列。 用于短期调度程序集的线程,它从ReadyQueue中获取一个进程并将其分配给CPU。 一旦STS将进程从ReadyQueue中删除以执行,该进程将检查CPU的isAvailable标志。如果为true,它将标志设置为false并开始执行,我只是让线程睡眠100*burstTime ms,因为这只是一个模拟。否则,进程就会一直忙着等待:whileCPU.isAvailable!=符合事实的 我手头有进程列表以及它们的到达时间和突发时间。 在我模拟非先发制人计划FCFS和SJF之前,一切都正常。但是当我尝试SRTF时,我无法找到一种方法来抢占当前正在运行的进程线程 对于SRTF,我知道如何从ReadyQueue中选择下一个进程。一旦我从队列中选择了一个进程,我可以尝试将isAvailable标志设置为false,但是我如何知道最初执行的是哪个线程呢?由于我没有使用太多的同步b/w线程,我将有多个进程使用CPU线程。有点乱了。请帮忙。谢谢 这是流程的代码:最短剩余时间优先:Java多线程,java,multithreading,cpu,scheduling,simulation,Java,Multithreading,Cpu,Scheduling,Simulation,我试图用java模拟CPU调度算法,并使用多线程。我已经成功地实现了FCFSFirst Come First Service和SJFShortest Job First。但问题是,当我开始考虑SRTF时,首先考虑剩余时间最短,这是一种先发制人的SJF形式。 我使用以下模型: 一个CPU线程,它有一个时钟变量,每100ms保持一个简单的时钟增量。我有一个布尔值是可用的;用于在开始执行之前检查CPU是否可用的进程的标志。 用于长期调度的线程,它将进程从进程列表推送到就绪队列。 用于短期调度程序集的线
enum State {ARRIVED, WAITING, READY, RUNNING, EXECUTED}
public class Process implements Runnable
{
int pid;
int arrTime;
int burstTime;
int priority;
long startTime;
long endTime;
State procState = null;
Process(int pid, int arrTime, int burstTime, int priority)
{
this.pid = pid;
this.arrTime = arrTime;
this.burstTime = burstTime;
this.priority = priority;
this.procState = State.ARRIVED;
this.startTime = 0;
this.endTime = 0; /* I also considered adding a timeElapsedUnderExecution
attribute to the process. So I can check after every cycle if the CPU is still available
and keep incrementing the time elapsed. Once the timeElapsed becomes same as burstTime, i
stop the process. Or if after a cycle, the CPU is not available, i know from where to
resume my Process. Is this the way to go ? */
}
boolean isReady()
{
if((this.arrTime <= CPU.CLOCK) && (this.procState == State.ARRIVED))
return true;
else return false;
}
@Override
public void run() {
// TODO Auto-generated method stub
if(this.procState == State.READY)
this.procState = State.WAITING;
while(!CPU.isAvailable());
try
{
this.procState = State.RUNNING;
System.out.println("Process " + pid + " executing...");
this.startTime = CPU.CLOCK;
System.out.println("Process " + this.pid + ": Begins at " + this.startTime);
Thread.sleep(this.burstTime * 100);
this.endTime = CPU.CLOCK;
System.out.println("Process " + this.pid + ": Ends at " + this.endTime);
this.procState = State.EXECUTED;
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
System.out.println("Interrupted: " + pid);
e.printStackTrace();
}
}
}
CPU的代码:
import java.util.LinkedList;
import java.util.Queue;
public class CPU implements Runnable
{
static Long CLOCK = new Long(0);
static LinkedList<Process> ReadyQ = new LinkedList<Process>();
private static boolean isAvailable = true;
static boolean done = false;
public static boolean isAvailable() {
return isAvailable;
}
public static void setAvailable(boolean isAvailable) {
CPU.isAvailable = isAvailable;
}
static void incrementCLOCK()
{
LTS.checkArrival();
CPU.CLOCK++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Clock Tick: " + CPU.CLOCK);
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("CPU starts.!!!");
while(CPU.done != true)
synchronized(CPU.CLOCK)
{
incrementCLOCK();
}
}
}
LTS的代码:
public class LTS implements Runnable
{
private static Process[] pList = null;
private final int NUM;
static Integer procStarted;
static Integer procFinished;
static boolean STSDone = false;
LTS(Process[] pList, int num)
{
this.NUM = num;
LTS.pList = pList;
}
static void checkArrival()
{
if(pList == null) return;
for(int i = 0; i < pList.length; i++)
if(pList[i].isReady())
{
pList[i].procState = State.READY;
System.out.println("Process " + pList[i].pid + " is now ready.");
CPU.ReadyQ.add(pList[i]);
}
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Long Term Scheduler starts.!!!");
while(LTS.STSDone != true)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(LTS.STSDone);
System.out.println("LTS ends.!!!");
CPU.done = true;
}
}
问题1是共享状态不是线程安全的。即使是布尔值这样简单的东西也需要正确的线程原语来确保线程之间的可见性。需要显示更多代码,特别是CPU。我已经添加了CPU和“LTS”的代码。同时!CPU.i可用;或者当CPU完成时=真实的和相关的条件循环与非易失性布尔+编译器优化=头痛-这是什么鬼东西,从2012年开始它是如何进入第一页的你能详细说明吗?谢谢恐怕这个题目太大了,不能在这里详细阐述。许多人建议读这本书: