请求协助实现VB.Net中FCFS与SJF调度算法的完成时间计算
VB.Net实现FCFS与SJF调度算法完成时间计算
1. 定义作业数据结构
先创建作业类存储核心信息及计算结果:
Public Class Job Public Property JobId As Integer Public Property ArrivalTime As Integer Public Property BurstTime As Integer Public Property CompletionTime As Integer End Class
2. FCFS调度算法实现
按作业到达时间顺序执行,完成时间基于累加服务时间与到达时间的最大值计算:
Private Function CalculateFCFS(jobs As List(Of Job)) As List(Of Job) ' 按到达时间排序,时间相同则按作业ID排序 Dim sortedJobs = jobs.OrderBy(Function(j) j.ArrivalTime).ThenBy(Function(j) j.JobId).ToList() Dim currentTime As Integer = 0 For Each job In sortedJobs currentTime = Math.Max(currentTime, job.ArrivalTime) job.CompletionTime = currentTime + job.BurstTime currentTime = job.CompletionTime Next Return sortedJobs End Function
3. SJF调度算法实现(非抢占式)
循环筛选当前已到达且服务时间最短的作业执行:
Private Function CalculateSJF(jobs As List(Of Job)) As List(Of Job) Dim remainingJobs = New List(Of Job)(jobs) Dim completedJobs = New List(Of Job)() Dim currentTime As Integer = 0 While remainingJobs.Count > 0 ' 筛选当前已到达的作业 Dim availableJobs = remainingJobs.Where(Function(j) j.ArrivalTime <= currentTime).ToList() If availableJobs.Count = 0 Then ' 无已到达作业,直接跳至下一个作业的到达时间 currentTime = remainingJobs.Min(Function(j) j.ArrivalTime) Continue While End If ' 优先选服务时间最短的作业,次选到达时间早的,最后选作业ID小的 Dim selectedJob = availableJobs.OrderBy(Function(j) j.BurstTime).ThenBy(Function(j) j.ArrivalTime).ThenBy(Function(j) j.JobId).First() currentTime += selectedJob.BurstTime selectedJob.CompletionTime = currentTime completedJobs.Add(selectedJob) remainingJobs.Remove(selectedJob) End While Return completedJobs End Function
4. GUI交互示例(匹配参考界面逻辑)
假设界面包含:
- 输入用
DataGridView(命名dgvJobs):录入作业ID、到达时间、服务时间 - 算法触发按钮:
btnFCFS(FCFS计算)、btnSJF(SJF计算) - 结果展示用
DataGridView(命名dgvResults):显示完成时间
对应按钮点击事件代码:
Private Sub btnFCFS_Click(sender As Object, e As EventArgs) Handles btnFCFS.Click Dim jobs = GetJobsFromInput() If jobs Is Nothing Then Return Dim resultJobs = CalculateFCFS(jobs) DisplayResults(resultJobs) End Sub Private Sub btnSJF_Click(sender As Object, e As EventArgs) Handles btnSJF.Click Dim jobs = GetJobsFromInput() If jobs Is Nothing Then Return Dim resultJobs = CalculateSJF(jobs) DisplayResults(resultJobs) End Sub ' 从输入表格提取作业数据并验证 Private Function GetJobsFromInput() As List(Of Job) Dim jobs As New List(Of Job)() For Each row As DataGridViewRow In dgvJobs.Rows If row.IsNewRow Then Continue For Dim jobId, arrivalTime, burstTime As Integer If Not Integer.TryParse(row.Cells("JobId").Value?.ToString(), jobId) Then MessageBox.Show("作业ID必须为整数") Return Nothing End If If Not Integer.TryParse(row.Cells("ArrivalTime").Value?.ToString(), arrivalTime) Then MessageBox.Show("到达时间必须为整数") Return Nothing End If If Not Integer.TryParse(row.Cells("BurstTime").Value?.ToString(), burstTime) OrElse burstTime <= 0 Then MessageBox.Show("服务时间必须为正整数") Return Nothing End If jobs.Add(New Job With { .JobId = jobId, .ArrivalTime = arrivalTime, .BurstTime = burstTime }) Next If jobs.Count = 0 Then MessageBox.Show("请输入至少一个作业") Return Nothing End If Return jobs End Function ' 将计算结果展示到表格 Private Sub DisplayResults(jobs As List(Of Job)) dgvResults.Rows.Clear() dgvResults.Columns.Clear() dgvResults.Columns.Add("JobId", "作业ID") dgvResults.Columns.Add("ArrivalTime", "到达时间") dgvResults.Columns.Add("BurstTime", "服务时间") dgvResults.Columns.Add("CompletionTime", "完成时间") For Each job In jobs dgvResults.Rows.Add(job.JobId, job.ArrivalTime, job.BurstTime, job.CompletionTime) Next End Sub
补充说明
- 上述SJF为非抢占式实现,若需抢占式(短剩余时间优先),可修改为按剩余服务时间动态筛选作业
- 可根据需求扩展输入验证逻辑,比如重复作业ID检查
- 界面控件命名需与代码保持一致,可根据实际布局调整
内容的提问来源于stack exchange,提问作者ryzK_ean
相关产品推荐
相关产品推荐

