gpt4 book ai didi

java - 剩余时间最短优先 : Java Multithreading

转载 作者:搜寻专家 更新时间:2023-10-31 08:03:59 25 4
gpt4 key购买 nike

我正在尝试在 Java 中模拟 CPU 调度算法并使用多线程。我已经成功实现了 FCFS(先到先得)和 SJF(最短作业优先)。但问题是当我开始想到 SRTF(最短剩余时间优先)时,它是 SJF 的一种先发制人形式。我正在使用以下模型:

  • 一个 CPU 线程,它有一个 CLOCK 变量,它每 100ms 保持滴答(一个简单的时钟增量)。我有一个 boolean isAvailable; 标志供进程在开始执行之前检查 CPU 是否可用。
  • Long Term Scheduler (LTS) 的线程,它将进程从进程列表推送到就绪队列。
  • 短期调度程序 (STS) 的线程,它从 ReadyQueue 中获取一个进程并将其分配给 CPU。
  • 一旦一个进程被STS从ReadyQueue中移除并执行,该进程就会检查CPU的isAvailable标志。如果 true,它将标志设置为 false 并开始执行(为此我只是让线程 hibernate (100 * burstTime) ms 因为这只是一个模拟)。否则,进程将一直忙于等待:while(CPU.isAvailable != true);

我手边有进程列表以及它们的到达时间和突发时间。没关系,直到我模拟非抢占式调度(FCFS 和 SJF)。但是当我尝试 SRTF 时,我无法找到一种方法来抢占当前正在运行的进程线程。

对于 SRTF,我知道从 ReadyQueue 中选择下一个进程的方法。从队列中选择一个进程后,我可以尝试将 isAvailable 标志设置为 false,但是我如何知道最初执行的是哪个线程?由于我没有使用太多同步黑白线程,我将有多个进程使用 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 是您的共享状态不是线程安全的。即使像 boolean 值这样的简单事物也需要正确的线程原语以确保跨线程的可见性(也称为“易变性”)。

关于java - 剩余时间最短优先 : Java Multithreading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12679943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com