用c语言模拟批处理多道操作系统的作业调度,分别采用先来先服务(FCFS)2)、最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。
时间: 2023-12-22 12:05:29 浏览: 94
好的,这是一个有趣的问题。首先,我需要了解一些细节,比如作业的信息,调度算法的实现方式等等。然后,我可以为您提供一些基本的代码框架,以供参考。
作业的信息通常包括作业名称、作业到达时间、作业需要的CPU时间等。在这里,我们可以定义一个结构体来表示一个作业:
```c
typedef struct {
char name[10];
int arriveTime;
int cpuTime;
} Job;
```
接下来,我们需要实现三种调度算法:FCFS、SJF和HRN。
FCFS算法非常简单,即按作业到达的顺序进行调度。我们可以使用一个队列来存储作业,每次从队列中取出队首的作业进行运行:
```c
void fcfs(Job *jobs, int n) {
int currentTime = 0;
int i, j;
for (i = 0; i < n; i++) {
while (currentTime < jobs[i].arriveTime) {
currentTime++;
}
printf("Current time: %d, Running job: %s\n", currentTime, jobs[i].name);
for (j = 0; j < jobs[i].cpuTime; j++) {
currentTime++;
}
}
}
```
SJF算法是按作业需要的CPU时间进行排序,优先运行需要时间最短的作业。我们可以使用一个数组来表示作业,然后按照需要的CPU时间进行排序,然后依次运行每个作业:
```c
void sjf(Job *jobs, int n) {
int currentTime = 0;
int i, j;
Job tmp;
// sort jobs by cpuTime
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (jobs[i].cpuTime > jobs[j].cpuTime) {
tmp = jobs[i];
jobs[i] = jobs[j];
jobs[j] = tmp;
}
}
}
for (i = 0; i < n; i++) {
while (currentTime < jobs[i].arriveTime) {
currentTime++;
}
printf("Current time: %d, Running job: %s\n", currentTime, jobs[i].name);
for (j = 0; j < jobs[i].cpuTime; j++) {
currentTime++;
}
}
}
```
HRN算法是按照响应比进行排序,响应比越高的作业越优先运行。响应比定义为:(等待时间+需要CPU时间)/需要CPU时间。我们可以先计算出每个作业的响应比,然后按照响应比进行排序,最后依次运行每个作业:
```c
void hrn(Job *jobs, int n) {
int currentTime = 0;
int i, j;
float ratio;
Job tmp;
// calculate response ratio
for (i = 0; i < n; i++) {
ratio = (float)(currentTime - jobs[i].arriveTime + jobs[i].cpuTime) / jobs[i].cpuTime;
jobs[i].cpuTime = ratio;
}
// sort jobs by response ratio
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (jobs[i].cpuTime < jobs[j].cpuTime) {
tmp = jobs[i];
jobs[i] = jobs[j];
jobs[j] = tmp;
}
}
}
// run jobs
for (i = 0; i < n; i++) {
while (currentTime < jobs[i].arriveTime) {
currentTime++;
}
printf("Current time: %d, Running job: %s\n", currentTime, jobs[i].name);
for (j = 0; j < jobs[i].cpuTime; j++) {
currentTime++;
}
}
}
```
请注意,这些代码仅为示例,还有很多细节需要考虑。例如,当作业需要等待时,我们应该如何处理?我们应该如何处理作业到达时间相同的情况?等等。但是,我希望这些代码可以为您提供一个基本的框架,供您参考。
阅读全文