请给出代码linux用c完成时间片轮转算法程序的基本步骤: a) 每个PCB模块的基本信息:进程名称,需要运行的时间,已用CPU时间,进程状态,时间片。 b) 程序的基本模块: 1> 进程的创建 由create2()函数完成。采用链表的方法创建五个进程,进程名和进程所需运行的时间,并初始化其状态为w(等待),每个时间片的运行时间为2,且把就绪队列的第一个进程放入CPU运行,使就绪队列的头指针指向第二个进程。 2> 轮转法插入函数,当一个时间片的时间已到,而进程又未完成就需把进程插入到就绪队列的尾部,该模块由insert 函数完成。 3> 时间片轮转法的实现 由roundrun函数完成。程序记下进程的运行时间,并计算剩下需运行的时间。如果剩下需运行的时间变为0时就把它插到完成队列,设其运行状态为F(完成)。如果时间片的时间到了而进程还未完成,就把它插到就绪队列的队尾,同时把就绪队列的第一个进程投入运行。 4> 输出模块。包括标题的输出,进程的输出,运行过程的输出
时间: 2024-02-12 08:09:02 浏览: 133
使用动态优先权和时间片轮转的进程调度算法的模拟
以下是基于Linux系统的C语言代码实现时间片轮转算法的基本步骤:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义进程控制块 PCB 结构体
struct PCB {
char name[10]; // 进程名称
int need_time; // 需要运行的时间
int used_time; // 已用CPU时间
char status; // 进程状态
int slice; // 时间片
struct PCB *next; // 指向下一个PCB的指针
};
// 创建五个进程,采用链表的方式创建
struct PCB *create_processes() {
struct PCB *head = NULL, *tail = NULL;
int i;
char name[5] = {'A', 'B', 'C', 'D', 'E'};
int need_time[5] = {10, 5, 8, 3, 4};
// 初始化进程控制块
for (i = 0; i < 5; i++) {
struct PCB *p = (struct PCB*)malloc(sizeof(struct PCB));
strcpy(p->name, name[i]);
p->need_time = need_time[i];
p->used_time = 0;
p->status = 'W'; // 初始状态为等待
p->slice = 2; // 时间片为2
p->next = NULL;
if (head == NULL) {
head = tail = p;
} else {
tail->next = p;
tail = p;
}
}
return head;
}
// 插入函数,将进程插入到就绪队列的尾部
void insert(struct PCB **head, struct PCB **tail, struct PCB *p) {
if (*head == NULL) {
*head = *tail = p;
} else {
(*tail)->next = p;
*tail = p;
}
}
// 时间片轮转法的实现
void roundrun(struct PCB **head, struct PCB **tail, struct PCB **running) {
struct PCB *p = *running;
p->used_time += p->slice; // 记录已用CPU时间
p->need_time -= p->slice; // 计算剩余需要运行的时间
if (p->need_time <= 0) {
p->status = 'F'; // 进程完成
*running = NULL;
} else {
p->status = 'W'; // 进程等待
*running = (*head); // 把就绪队列的头部进程放到CPU运行
(*head) = (*head)->next; // 就绪队列的头指针指向下一个进程
insert(head, tail, p); // 把当前进程插入到就绪队列的尾部
}
}
// 输出模块,包括进程的状态、当前运行的进程、就绪队列的情况等信息
void print_processes(struct PCB *head, struct PCB *running) {
printf("Name\tNeed Time\tUsed Time\tStatus\n");
struct PCB *p = head;
while (p != NULL) {
printf("%c\t%d\t\t%d\t\t%c\n", p->name, p->need_time, p->used_time, p->status);
p = p->next;
}
printf("\n");
printf("Current Running Process: %c\n", (running == NULL) ? '-' : running->name);
printf("Ready Queue: ");
p = head;
while (p != NULL) {
if (p != head) printf("->");
printf("%c", p->name);
p = p->next;
}
printf("\n\n");
}
int main() {
struct PCB *head = create_processes(); // 创建五个进程
struct PCB *tail = head;
while (tail->next != NULL) tail = tail->next;
struct PCB *running = head; // 把就绪队列的头部进程放到CPU运行
head = head->next; // 把就绪队列的头指针指向下一个进程
int time_count = 0; // 记录总共运行的时间
printf("Time\t");
print_processes(head, running); // 输出初始状态
while (running != NULL) {
roundrun(&head, &tail, &running); // 进行时间片轮转
time_count += 2; // 每个时间片的运行时间为2
printf("%d\t", time_count);
print_processes(head, running); // 输出当前状态
}
return 0;
}
```
以上代码实现了时间片轮转算法的基本步骤,包括进程创建、插入函数、时间片轮转法的实现和输出模块。运行代码可以得到每个时间片内运行的进程和就绪队列的情况,以及最后的统计结果。
阅读全文