计算机操作系统实验之进程调度(二)优先级调度法(C语言)
实验目的
1、理解进程调度的任务、机制和方式
2、了解优先级调度算法的基本原理
实验内容与基本要求
用C,C++等语言编写程序,模拟使用静态优先级调度算法实现进程调度
优先级调度算法的基本内容
在时间片轮转调度算法中,有一个隐含的假设:系统中所有进程的紧迫性是一致的。但是在实际中并不是如此,因此实际在进程调度算法中引入“优先级”这个概念,形成了优先级调度算法。
优先级调度算法,就是把处理机分配给就绪队列中优先级最高的进程。现在的问题是:处理机正在执行目前就绪队列中优先级最高的进程B,此时又出现了另一个优先级更高的进程A,系统该如何处理?针对这个问题的不同处理方式,形成了优先级调度算法的两个类型:一种是抢占式的优先级调度算法,一种是非抢占式的优先级调度算法。
- 抢占式优先级调度算法:在这种算法中,只要出现了一个优先级更高的进程A,就停止正在执行的进程B,让A立刻投入执行
- 非抢占式优先级调度算法:在这种算法中,处理机已经分配给了进程B,就让B一直执行结束,或等B自动放弃处理机时,才将处理机分配给A
优先级调度算法的核心问题是:如何确定进程的优先级?
优先级根据性质的不同,也分为两种类型:静态优先级和动态优先级。
- 静态优先级:在进程创建时就决定,并且在进程的整个运行期间保持不变
- 动态优先级:在进程创建时先赋予一个优先级,但是其值会随着进程的推进或等待时间的增加而改变。
静态优先级容易实现,但是可能会出现优先级低的进程始终无法被调度的情况。而动态优先级根据不同的规定来计算优先级,有利于促进进程调度的公平性。
实现思路
用轮转调度法类似,进程PCB的结构和进程队列的设置方式不变,只是调度的方法有区别而已。
附:上篇轮转调度法 计算机操作系统实验之进程调度(一)轮转调度法(C语言)
PCB的属性包括:1.进程名字2.进程优先级3.进程的状态4.时间片5.总共需要的运行时间6.cpu时间(已运行时间)7.还需要运行的时间8.计数器9.下一个要执行的进程指针。
仍然使用带头结点的单链表来存储进程队列,已完成的进程不移出队列,而是沉到队列底部。
本次实验实现的是非抢占式的静态优先级调度方式,优先级在进程创建时就决定好(可以由随机数生成,也可以让用户自己输入)。由于是非抢占式的,因此每个进程只会获得一次处理机,无论它的执行时间是多长,都要执行完后才会调度下一个进程。
至于具体怎么实现调度,有两种思路:第一种是在每次调度时去查找队列中未完成的优先级最大的进程,将它的状态变为完成。第二种是:先将队列按优先级顺序排序,然后再依次执行。本次实验采用的是第二种,因此额外写了方法,用于按优先级排序。排序的方法是:将链表从头结点处断开,依次取出首元结点后的每个结点,对链表进行按值(优先级的值)插入,优先级从大到小排列。
算法流程图
全部代码
工程图
ProcessScheduling.h
//
// ProcessScheduling.h
// ProcessSchedulingTest
//
// Created by Apple on 2019/10/21.
// Copyright © 2019 Yao YongXin. All rights reserved.
//
#ifndef ProcessScheduling_h
#define ProcessScheduling_h
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#define TIME_SLICE 2
//线程状态:就绪 等待 完成
enum process_type{
process_type_waitting = 'W',
process_type_ready = 'R',
process_type_finish = 'F'
};
//进程控制块结构体
typedef struct PCB_Type{
//进程的名字
char *name;
//进程的优先级
int priority;
//仍需运行时间
int need_time;
//进程的状态 就绪 等待
char state;
//时间片
int time_slice;
//cpu时间 ->已运行时间
int cpu_time;
//计数器
int time_count;
//总共需要的运行时间
int total_time;
//下一个要执行的进程
struct PCB_Type *next;
}PCB;
//创建新的进程
void create_process(PCB *running_list,char *name,int need_time);
void create_process1(PCB *running_list,char *name,int need_time,int priority);
//展示当前就绪队列状态
void show(PCB *running_list);
//优先级调度法
void priority_scheduling(PCB *running_list);
//按优先级大小对队列进行排序
void sort(PCB *running_list);
//找到当前未执行的优先