最短作业优先(非抢占式)——同时对突发时间和到达时间进行排序
Shortest Job First (Non preemptive) - Sort bursting time and arrival time simultaneously
我对如何同时对到达时间和突发时间进行排序有疑问。我的代码首先检查较低的突发时间,然后检查到达时间。
最短作业优先(非抢占式)CPU调度检查进程突发时间和
如果 Process
具有最短的突发时间和到达时间,那么它将被执行。
这是我对数组进行排序的代码片段:
inputs.sort((a1, a2) => (a1.burst < a2.burst) ? 1 : (a1.burst < a2.burst) ? 1 : -1);
这是上面代码片段的结果:
如果排序公式正确,这应该是输出:
参考:
这似乎需要迭代来确定进程的顺序,因为“执行”的当前进程的完成时间用于确定下一个要考虑执行的可用进程。也就是说,在您的示例中,P1 到达 0 并在时间间隔 5 时完成。因此,在时间间隔 5 之前到达的所有未完成的进程现在都是要执行的候选进程。接下来执行具有最小突发时间的候选者,到达时间是决胜局。 (请注意,此决胜局只是假设数组按到达时间排序。)
let process = [
{ Process: 'P1', ArrivalTime: 0, BurstTime: 5 },
{ Process: 'P2', ArrivalTime: 1, BurstTime: 3 },
{ Process: 'P3', ArrivalTime: 2, BurstTime: 8 },
{ Process: 'P4', ArrivalTime: 2, BurstTime: 6 },
{ Process: 'P5', ArrivalTime: 3, BurstTime: 3 },
{ Process: 'P6', ArrivalTime: 15, BurstTime: 2 },
];
// Get the first ArrivalTime.
let time = Math.min( ...process.map( p => p.ArrivalTime ) );
while ( process.find( p => p.Finished == null ) ) {
// Now, "execute" the process in which the BurstTime is the least
// amoung the processes which haven't finished and have an ArrivalTime
// less than or equal to the current time...
let execute = process.reduce( ( ni, p, i ) => {
if ( p.Finished == null && p.ArrivalTime <= time && (ni === -1 || p.BurstTime < process[ ni ].BurstTime ) ) {
ni = i;
}
return ni;
}, -1 );
// Capture the start time...
process[ execute ].Started = time;
// ...and then calculate the finish time.
time += process[ execute ].BurstTime;
process[ execute ].Finished = time;
}
// For ease of viewing, sort by Started.
process.sort( ( a, b ) => a.Started - b.Started );
console.log( process );
我添加了一些额外的数据点,注意到 P6 是如何迟到的,但由于它的爆发时间只有 2,所以它在 P3 之前滑入...
我对如何同时对到达时间和突发时间进行排序有疑问。我的代码首先检查较低的突发时间,然后检查到达时间。
最短作业优先(非抢占式)CPU调度检查进程突发时间和
如果 Process
具有最短的突发时间和到达时间,那么它将被执行。
这是我对数组进行排序的代码片段:
inputs.sort((a1, a2) => (a1.burst < a2.burst) ? 1 : (a1.burst < a2.burst) ? 1 : -1);
这是上面代码片段的结果:
如果排序公式正确,这应该是输出:
参考:
这似乎需要迭代来确定进程的顺序,因为“执行”的当前进程的完成时间用于确定下一个要考虑执行的可用进程。也就是说,在您的示例中,P1 到达 0 并在时间间隔 5 时完成。因此,在时间间隔 5 之前到达的所有未完成的进程现在都是要执行的候选进程。接下来执行具有最小突发时间的候选者,到达时间是决胜局。 (请注意,此决胜局只是假设数组按到达时间排序。)
let process = [
{ Process: 'P1', ArrivalTime: 0, BurstTime: 5 },
{ Process: 'P2', ArrivalTime: 1, BurstTime: 3 },
{ Process: 'P3', ArrivalTime: 2, BurstTime: 8 },
{ Process: 'P4', ArrivalTime: 2, BurstTime: 6 },
{ Process: 'P5', ArrivalTime: 3, BurstTime: 3 },
{ Process: 'P6', ArrivalTime: 15, BurstTime: 2 },
];
// Get the first ArrivalTime.
let time = Math.min( ...process.map( p => p.ArrivalTime ) );
while ( process.find( p => p.Finished == null ) ) {
// Now, "execute" the process in which the BurstTime is the least
// amoung the processes which haven't finished and have an ArrivalTime
// less than or equal to the current time...
let execute = process.reduce( ( ni, p, i ) => {
if ( p.Finished == null && p.ArrivalTime <= time && (ni === -1 || p.BurstTime < process[ ni ].BurstTime ) ) {
ni = i;
}
return ni;
}, -1 );
// Capture the start time...
process[ execute ].Started = time;
// ...and then calculate the finish time.
time += process[ execute ].BurstTime;
process[ execute ].Finished = time;
}
// For ease of viewing, sort by Started.
process.sort( ( a, b ) => a.Started - b.Started );
console.log( process );
我添加了一些额外的数据点,注意到 P6 是如何迟到的,但由于它的爆发时间只有 2,所以它在 P3 之前滑入...