1 回答

TA貢獻1801條經驗 獲得超8個贊
這似乎需要迭代來確定流程的順序,因為正在“執行”的當前流程的完成時間用于確定下一個要考慮執行的可用流程。也就是說,在您的示例中,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 之前滑入......
添加回答
舉報