代码见文章结束处
轮转法实现进程调度思想:
- 将CPU的处理时间分成固定大小的时间片
- 按照就绪队列中进程的顺序,调度各进程轮流使用CPU
- 每个进程执行一个时间片后,就释放CPU,排到就绪队列的末尾,等待下一次调度
使用C语言实现思路:
- 系统中的每个进程用一个进程控制块PCB表示
- 将多个进程按输入顺序排成就绪队列链表(进程信息从键盘录入)
- 按进程在链表中的顺序依次调度,每个被调度的进程执行一个时间片,然后回到就绪队列,“已运行时间”加1
- 若进程“要求运行时间”==“已运行时间”,则将其状态置为“结束”,并退出队列
- 运行程序,显示每次调度时被调度运行的进程id,以及各进程控制块的动态变化过程
根据轮转法的思想,其重点是各进程轮流使用时间片以及进程的队列,所以进程控制块(PCB)需要包含如下信息:
- 进程id,即pid
- 需要运行的是时间,即req_time
- 已近运行的时间,即cpu_time
- 状态,R为进程未结束,E为进程结束
- 指针next,指向进程队列中的下一个指针
PCB形式如下:
扫描二维码关注公众号,回复:
14899225 查看本文章
进程队列如下:
综上所述,我们只需要使用结构体去包含PCB的所有内容去表示每一个进程,并使用数据结构为链式结构去连接每个进程,当一个进程拥有一个时间段时,使该进程的cpu_time加1,并使用next指针执行下一个进程,如果此时cpu_time和req_time相等,表示该进程运行完成,将该进程states改为“E”,并将该进程从进程队列中删除。说完就冻手
//轮转法
typedef struct pcb {
int pid;//进程id
char state;//状态
int total_time;//要求运行的时间
int cputime;//已经运行的时间
struct pcb* next;//next指针
}*proc;
int proc_num;
proc head, tail;//head是头,tail是尾
int init_pcb() {
int i;
proc p, tmp;
//设置进程数量
printf("please input the number of processes:\n");
scanf("%d", &proc_num);
printf("there are %d pricesses,please input pcb info:\n", proc_num);
//初始化
p = (proc)malloc(sizeof(struct pcb));
printf("process id:");
scanf("%d", &p->pid);
printf("cputime required:");
scanf("%d", &p->total_time);
p->state = 'R';
p->cputime = 0;
//为头指针head
head = p;
//初始化中间的进程
for (i = proc_num; i > 1; i--) {
tmp = p;
p = (proc)malloc(sizeof(struct pcb));
printf("process id:");
scanf("%d", &p->pid);
printf("cputime required:");
scanf("%d", &p->total_time);
p->state = 'R';
p->cputime = 0;
tmp->next = p;
}
//最后一个进程为尾进程,并将尾指向头
tail = p;
p->next = head;
return 0;
}
//输出每个进程的pid、已经运行的时间、总共需要的时间
void display() {
int i;
proc p = head;
printf("pid\tcpu\treq_time\n");
for (i = 0; i < proc_num; i++) {
printf("%d\t%d\t%d\n", p->pid, p->cputime, p->total_time);
p = p->next;
}
}
//tail和head是全局变量
void sched() {
int round = 1;
proc tmp = tail;
proc p = head;
//从头开始执行每一个进程
while (p->total_time > p->cputime) {
printf("\nRound %d, Process %d is running\n", round, p->pid);
p->cputime++;
display();
//一个进程完成
if (p->total_time == p->cputime) {
p->state = 'E';
proc_num--;
tmp->next = p->next;
if (p == head) {
head = p->next;
}
printf("process %d is finished\n", p->pid);
}
else
tmp = p;
p = p->next;
round++;
}
}
int main() {
init_pcb();
display();
sched();
return 0;
}
基于动态优先级的进程调度算法C语言实现下次见!!!!