写出c语言代码实现完成单处理器系统中的进程调度,要求分别实现时间片轮转、优先数、最短进程优先和最短剩余时间优先四种调度算法,输入选择使用哪个算法对进程进行调度。实验具体包括:首先确定进程控制块的内容,进程控 制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所作工作进行 测试。 模拟程序只对你所设置的“虚拟 PCB”进行相应的调度模拟操作,即每发生“调度” 时,结果输出当前运行进程的“进程标识符”、“优先数”、“剩余运行时间”等,而不需要对系 统中真正的 PCB 等数据进行修改。首先建立一个就绪队列,随机生成信息建立若 干个进程;然后进行进程调度;将正在运行进程指针指向的进程控制块的内容以及调度一次后进程队列的现状输出,查看结果。
时间: 2023-12-23 21:04:29 浏览: 130
用c语言实现模拟进程调度
这是一个比较复杂的问题,需要比较详细的代码实现。以下是伪代码示例,供参考:
首先定义进程控制块的结构体,包括进程标识符、优先级、状态等信息:
```
typedef struct {
int pid; // 进程标识符
int priority; // 优先级
int status; // 进程状态(就绪、运行、阻塞等)
int runtime; // 剩余运行时间
} PCB;
```
然后定义就绪队列和当前正在运行的进程指针:
```
PCB ready_queue[MAX_PROCESS]; // 就绪队列
int queue_size = 0; // 就绪队列大小
int current_pid = -1; // 当前正在运行的进程标识符
```
接下来实现进程创建原语和进程调度原语:
```
void create_process() {
// 随机生成进程信息,添加到就绪队列中
PCB process;
process.pid = rand(); // 随机生成进程标识符
process.priority = rand() % 10; // 随机生成进程优先级
process.status = READY; // 进程状态为就绪
process.runtime = rand() % 10; // 随机生成进程剩余运行时间
ready_queue[queue_size++] = process; // 添加到就绪队列中
}
void schedule(int algorithm) {
switch (algorithm) {
case RR: // 时间片轮转
// 将当前正在运行的进程的剩余时间减去时间片
ready_queue[current_pid].runtime -= TIME_SLICE;
// 如果当前进程还有剩余时间,则继续运行
if (ready_queue[current_pid].runtime > 0) {
printf("Process %d is running...\n", current_pid);
return;
}
// 如果当前进程已经完成,则将其状态设置为完成
ready_queue[current_pid].status = FINISHED;
break;
case PRIO: // 优先数
// 从就绪队列中找到优先级最高的进程
int highest_priority = -1;
int highest_priority_pid = -1;
for (int i = 0; i < queue_size; i++) {
if (ready_queue[i].status == READY && ready_queue[i].priority > highest_priority) {
highest_priority = ready_queue[i].priority;
highest_priority_pid = i;
}
}
// 如果找到了优先级最高的进程,则将其设置为当前进程
if (highest_priority_pid != -1) {
current_pid = highest_priority_pid;
printf("Process %d is running...\n", current_pid);
return;
}
break;
case SJF: // 最短进程优先
// 从就绪队列中找到剩余运行时间最短的进程
int shortest_runtime = INT_MAX;
int shortest_runtime_pid = -1;
for (int i = 0; i < queue_size; i++) {
if (ready_queue[i].status == READY && ready_queue[i].runtime < shortest_runtime) {
shortest_runtime = ready_queue[i].runtime;
shortest_runtime_pid = i;
}
}
// 如果找到了剩余运行时间最短的进程,则将其设置为当前进程
if (shortest_runtime_pid != -1) {
current_pid = shortest_runtime_pid;
printf("Process %d is running...\n", current_pid);
return;
}
break;
case SRT: // 最短剩余时间优先
// 从就绪队列中找到剩余运行时间最短的进程
int shortest_remaining_time = INT_MAX;
int shortest_remaining_time_pid = -1;
for (int i = 0; i < queue_size; i++) {
if (ready_queue[i].status == READY && ready_queue[i].runtime < shortest_remaining_time) {
shortest_remaining_time = ready_queue[i].runtime;
shortest_remaining_time_pid = i;
}
}
// 如果找到了剩余运行时间最短的进程,则将其设置为当前进程
if (shortest_remaining_time_pid != -1) {
current_pid = shortest_remaining_time_pid;
printf("Process %d is running...\n", current_pid);
return;
}
break;
}
// 如果没有找到可以运行的进程,则输出空闲状态
current_pid = -1;
printf("Idle...\n");
}
```
最后编写主函数进行测试:
```
int main() {
srand(time(NULL)); // 设置随机种子
for (int i = 0; i < MAX_PROCESS; i++) {
create_process(); // 随机生成若干个进程
}
// 循环调度进程
while (1) {
schedule(RR); // 时间片轮转
//schedule(PRIO); // 优先数
//schedule(SJF); // 最短进程优先
//schedule(SRT); // 最短剩余时间优先
// 输出当前正在运行的进程的信息
if (current_pid != -1) {
printf("PID: %d, Priority: %d, Runtime: %d\n",
ready_queue[current_pid].pid,
ready_queue[current_pid].priority,
ready_queue[current_pid].runtime);
}
// 如果所有进程都已经运行完成,则退出循环
int all_finished = 1;
for (int i = 0; i < queue_size; i++) {
if (ready_queue[i].status != FINISHED) {
all_finished = 0;
break;
}
}
if (all_finished) {
break;
}
}
return 0;
}
```
阅读全文