循环算法,进程不完成执行
Round Robin Algorithm, processes dont finish executing
我正在编写一个简单的 cpu 调度程序模拟器,目前我正在使用 Round Robin 算法。在这段代码中,我的实现方式是这样的:
从用户输入中获取突发时间的总和以跟踪何时
这个块应该完成。只要总和大于等于0,就继续执行。
现在,问题是总和变为负数,并且在进程的突发时间变为全 0 之前块停止执行。有什么办法可以解决这个问题吗?
例如,假设在我们的例子中我们的输入是{9, 12, 1, 1, 4, 4},
使用量程 4 执行所有进程后,阶段 1 的输出为:
(其中第一列是原始数组,第二列是按量子值递减的)
sum: 31
phase nr: 1
9 7 not zero
12 10 not zero
1 0 check
1 0 check
4 2 not zero
4 2 not zero
phase nr: 2
7 5 not zero
10 8 not zero
0 0 check
0 0 check
2 0 check
2 0 check
在此阶段sum变为负数并停止打印其他进程
这是我到目前为止一直在使用的代码。我不知道这个解释是否足够清楚,我尽量做到清楚和具体。
注意:所有作业的到达时间都是 0
int[] a = {9, 12, 1, 1, 4, 4};
int sum = 0;
//total sum of the a[]
for (int i = 0; i < a.length; i++)
{
sum += a[i];
}
System.out.printf("\nsum: %d\n\n", sum);
int counter = 1;
while(sum >= 0)
{
System.out.printf("\nphase nr: %d\n", counter);
for (int i = 0; i < a.length; i++)
{
//prints the original array
System.out.printf("%d ",a[i]);
int value = a[i]; //takes a value from a[] at index i
value -= 2; //decrement the value by quantum 2
a[i] = value; //put the value at the same index
if (a[i] < 0) //it checks if any element is less than 0, if yes replace it with 0
{
a[i] = 0;
}
/**
*prints the array after subtracting 2 from each element
*in the original array and checks if there is any value
*equal to 0, if yes print "check" else "not zero"
*/
System.out.printf("%d \t%s",a[i], a[i]==0?"check":"not zero");
System.out.println();
}
/**
* decrements the sum based on the quantum
* multiplied by processes
* sum = sum -(quantum * numberOfProcesses)
*/
sum = sum - (4 * 6);
counter++;
}
问题在于计算总和。
sum = sum - (4 * 6);
您在每次迭代中减去 24,即使流程较早完成(例如在 1 个时间量内)或已经完成。
你应该在每次迭代中从sum中减去实际处理所花费的总时间。因此,如果过程完成 (a[i] == 0),则您不会继续,如果 a[i] < 4,则减去该值。只有当 a[i] >=4 你应该减去 4 个量子。
如果你想为每个进程花费 4 个时间量而不考虑它的实际需求,无论它是否完成,那么你计算的总和是错误的,这不是真正的循环。
同时(总和 >= 0)
{
System.out.printf("\n相位编号: %d\n", counter);
for (int i = 0; i < a.length; i++)
{
//prints the original array
System.out.printf("%d ",a[i]);
int value = a[i]; //takes a value from a[] at index i
if(a[i] == 0) { continue;} // skip process if it's done
else if(a[i]<=4) { sum -=a[i]; a[i]=0;} // if process is less than one quantum then it's done and sum is decreased by time needed
else { sum -=4; a[i] -=4} // otherwise process needs more than one quantum so it uses up all 4
/**
*prints the array after subtracting 2 from each element
*in the original array and checks if there is any value
*equal to 0, if yes print "check" else "not zero"
*/
System.out.printf("%d \t%s",a[i], a[i]==0?"check":"not zero");
System.out.println();
}
// this part was completely unnecessary so it was removed to for loop above
counter++;
}
我不确定是否完全理解您的算法,但是总和的计算不正确。您应该定义一些函数来对数组 a[] 中的实际值求和,而不是进行一些错误的常量计算(您使用 4 作为量子而不是 2),并忽略一些 a 在设置为 0 后不会递减的事实.
你可以这样定义:
public static int totalBurstTime(int[] bursts) {
int total = 0;
for (int b : bursts) {
total += b;
}
return total;
}
并在 while 循环之前调用它来初始化总和,然后在每个循环结束时调用它来初始化总和。
此外,你应该使用一些常量而不是幻数,例如
static final int QUANTUM = 2;
并在任何需要的地方使用它...
我正在编写一个简单的 cpu 调度程序模拟器,目前我正在使用 Round Robin 算法。在这段代码中,我的实现方式是这样的: 从用户输入中获取突发时间的总和以跟踪何时 这个块应该完成。只要总和大于等于0,就继续执行。
现在,问题是总和变为负数,并且在进程的突发时间变为全 0 之前块停止执行。有什么办法可以解决这个问题吗?
例如,假设在我们的例子中我们的输入是{9, 12, 1, 1, 4, 4}, 使用量程 4 执行所有进程后,阶段 1 的输出为: (其中第一列是原始数组,第二列是按量子值递减的)
sum: 31
phase nr: 1
9 7 not zero
12 10 not zero
1 0 check
1 0 check
4 2 not zero
4 2 not zero
phase nr: 2
7 5 not zero
10 8 not zero
0 0 check
0 0 check
2 0 check
2 0 check
在此阶段sum变为负数并停止打印其他进程
这是我到目前为止一直在使用的代码。我不知道这个解释是否足够清楚,我尽量做到清楚和具体。
注意:所有作业的到达时间都是 0
int[] a = {9, 12, 1, 1, 4, 4};
int sum = 0;
//total sum of the a[]
for (int i = 0; i < a.length; i++)
{
sum += a[i];
}
System.out.printf("\nsum: %d\n\n", sum);
int counter = 1;
while(sum >= 0)
{
System.out.printf("\nphase nr: %d\n", counter);
for (int i = 0; i < a.length; i++)
{
//prints the original array
System.out.printf("%d ",a[i]);
int value = a[i]; //takes a value from a[] at index i
value -= 2; //decrement the value by quantum 2
a[i] = value; //put the value at the same index
if (a[i] < 0) //it checks if any element is less than 0, if yes replace it with 0
{
a[i] = 0;
}
/**
*prints the array after subtracting 2 from each element
*in the original array and checks if there is any value
*equal to 0, if yes print "check" else "not zero"
*/
System.out.printf("%d \t%s",a[i], a[i]==0?"check":"not zero");
System.out.println();
}
/**
* decrements the sum based on the quantum
* multiplied by processes
* sum = sum -(quantum * numberOfProcesses)
*/
sum = sum - (4 * 6);
counter++;
}
问题在于计算总和。
sum = sum - (4 * 6);
您在每次迭代中减去 24,即使流程较早完成(例如在 1 个时间量内)或已经完成。
你应该在每次迭代中从sum中减去实际处理所花费的总时间。因此,如果过程完成 (a[i] == 0),则您不会继续,如果 a[i] < 4,则减去该值。只有当 a[i] >=4 你应该减去 4 个量子。
如果你想为每个进程花费 4 个时间量而不考虑它的实际需求,无论它是否完成,那么你计算的总和是错误的,这不是真正的循环。
同时(总和 >= 0) { System.out.printf("\n相位编号: %d\n", counter);
for (int i = 0; i < a.length; i++)
{
//prints the original array
System.out.printf("%d ",a[i]);
int value = a[i]; //takes a value from a[] at index i
if(a[i] == 0) { continue;} // skip process if it's done
else if(a[i]<=4) { sum -=a[i]; a[i]=0;} // if process is less than one quantum then it's done and sum is decreased by time needed
else { sum -=4; a[i] -=4} // otherwise process needs more than one quantum so it uses up all 4
/**
*prints the array after subtracting 2 from each element
*in the original array and checks if there is any value
*equal to 0, if yes print "check" else "not zero"
*/
System.out.printf("%d \t%s",a[i], a[i]==0?"check":"not zero");
System.out.println();
}
// this part was completely unnecessary so it was removed to for loop above
counter++;
}
我不确定是否完全理解您的算法,但是总和的计算不正确。您应该定义一些函数来对数组 a[] 中的实际值求和,而不是进行一些错误的常量计算(您使用 4 作为量子而不是 2),并忽略一些 a 在设置为 0 后不会递减的事实.
你可以这样定义:
public static int totalBurstTime(int[] bursts) {
int total = 0;
for (int b : bursts) {
total += b;
}
return total;
}
并在 while 循环之前调用它来初始化总和,然后在每个循环结束时调用它来初始化总和。
此外,你应该使用一些常量而不是幻数,例如
static final int QUANTUM = 2;
并在任何需要的地方使用它...