单道批处理作业调度代码
时间: 2023-12-20 14:29:12 浏览: 83
单道批处理作业调度是指在计算机系统中,只有一个作业在内存中运行,其他作业需要等待该作业运行结束后才能运行。下面是一个简单的单道批处理作业调度的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i, n, t;
char username[20], jobname[20];
srand(time(NULL)); // 用系统时间初始化随机数种子
printf("请输入作业个数:");
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
printf("请输入用户名和作业名:"); scanf("%s %s", username, jobname);
t = rand() % 10 + 1; // 生成1~10之间的随机数,模拟处理器调度
printf("作业 %s 已经执行结束,用时 %d 秒。\n", jobname, t);
}
return 0;
}
```
该代码通过输入作业个数和每个作业的用户名和作业名,模拟处理器调度过程,生成1~10之间的随机数模拟处理器运行时间,最后输出每个作业的执行结果。需要注意的是,该代码仅为示例代码,实际应用中需要根据具体情况进行修改和完善。
相关问题
单道批处理作业调度算法链式队列c
单道批处理作业调度算法可以使用链式队列来实现。具体实现步骤如下:
1. 定义作业控制块(JCB)结构体,包含作业号、到达时间、运行时间、开始时间、完成时间等信息。
2. 定义队列结构体,包含队头指针、队尾指针、队列长度等信息,以及入队和出队操作。
3. 读入所有作业的信息,按照到达时间从小到大排序。
4. 初始化一个空队列,将第一个作业入队。
5. 当队列不为空时,执行以下操作:
1)从队列中取出队头作业。
2)计算该作业的开始时间和完成时间。
3)输出该作业的信息。
4)将下一个到达时间小于该作业完成时间的作业入队。
6. 所有作业都处理完毕后,统计平均周转时间、平均带权周转时间等指标并输出。
下面是使用链式队列实现单道批处理作业调度算法的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义作业控制块结构体
typedef struct JCB {
int job_id; // 作业号
int arrive_time; // 到达时间
int run_time; // 运行时间
int start_time; // 开始时间
int finish_time; // 完成时间
struct JCB *next; // 指向下一个作业的指针
} JCB;
// 定义队列结构体
typedef struct Queue {
JCB *front; // 队头指针
JCB *rear; // 队尾指针
int length; // 队列长度
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = q->rear = NULL;
q->length = 0;
}
// 判断队列是否为空
int isEmpty(Queue *q) {
return q->length == 0;
}
// 入队
void enQueue(Queue *q, JCB *jcb) {
if (isEmpty(q)) {
q->front = q->rear = jcb;
} else {
q->rear->next = jcb;
q->rear = jcb;
}
q->length++;
}
// 出队
JCB* deQueue(Queue *q) {
if (isEmpty(q)) {
return NULL;
}
JCB *jcb = q->front;
q->front = jcb->next;
q->length--;
if (q->length == 0) {
q->front = q->rear = NULL;
}
return jcb;
}
int main() {
int n;
printf("请输入作业数:");
scanf("%d", &n);
JCB *jcb[n];
Queue q;
initQueue(&q);
// 读入作业信息并按到达时间排序
for (int i = 0; i < n; i++) {
jcb[i] = (JCB*)malloc(sizeof(JCB));
printf("请输入作业%d的到达时间和运行时间:", i+1);
scanf("%d%d", &jcb[i]->arrive_time, &jcb[i]->run_time);
jcb[i]->job_id = i + 1;
jcb[i]->next = NULL;
// 将作业插入队列中
enQueue(&q, jcb[i]);
}
// 执行作业调度算法
int current_time = q.front->arrive_time; // 当前时间
double total_turnaround_time = 0.0; // 总周转时间
double total_weighted_turnaround_time = 0.0;// 总带权周转时间
while (!isEmpty(&q)) {
JCB *j = deQueue(&q); // 取出队头作业
j->start_time = current_time; // 计算开始时间
j->finish_time = j->start_time + j->run_time; // 计算完成时间
total_turnaround_time += j->finish_time - j->arrive_time; // 统计周转时间
total_weighted_turnaround_time += (j->finish_time - j->arrive_time) * 1.0 / j->run_time; // 统计带权周转时间
printf("作业%d的开始时间:%d,完成时间:%d\n", j->job_id, j->start_time, j->finish_time);
current_time = j->finish_time; // 更新当前时间
// 将下一个到达时间小于该作业完成时间的作业入队
for (int i = 0; i < n; i++) {
if (jcb[i]->arrive_time > current_time) {
break;
}
if (jcb[i] != j && jcb[i]->start_time == 0) {
enQueue(&q, jcb[i]);
}
}
}
// 输出统计结果
printf("平均周转时间:%f,平均带权周转时间:%f\n", total_turnaround_time / n, total_weighted_turnaround_time / n);
return 0;
}
```
注意,这里只是一种实现方式,还有其他的实现方式,具体可以根据实际情况进行选择。
批处理作业调度问题的代码
以下是一个简单的批处理作业调度问题的代码示例:
```
@echo off
setlocal enabledelayedexpansion
set /a total_time=0
set /a job_count=0
:input
set /p time="Enter job time (0 to exit): "
if %time%==0 goto output
set /a job_count+=1
set /a total_time+=time
set job_time[!job_count!]=%time%
goto input
:output
echo Total time: %total_time%
set /a avg_time=total_time/job_count
echo Average time: %avg_time%
set /a remaining_time=total_time
echo Jobs:
for /l %%i in (1,1,%job_count%) do (
set /a remaining_time-=job_time[%%i]
echo Job %%i - Start Time: %remaining_time% - End Time: !remaining_time!+job_time[%%i]
)
pause
```
这个代码会让用户输入每个作业的时间,直到输入 0 为止。然后,它会计算总时间、平均时间和每个作业的开始和结束时间,并将它们输出到屏幕上。
阅读全文