既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
顾名思义,当有一个优先级更高的进程进入就绪队列时,立即暂停正在执行的进程,将处理机的使用权分配给优先级更高的进程,等其执行完毕方可继续执行本进程
优先级分类
根据进程创建后其优先级是否可以改变,可以将进程优先级分为一下两类:
1)静态优先级
优先级是在创建进程时就已经被确定的,且在进程运行的整个期间保持不变。主要根据进程类型、进程对资源的要求、用户的要求来确定静态优先级
2)动态优先级
在进程的运行过程中,根据进程情况的变化动态调整优先级。主要根据进程占有CPU时间的长短、就绪进程等待CPU时间的长短来确定动态优先级
实验内容与要求
进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C语言编写一个进程调度模拟程序,使用优先级或时间片轮转法实现进程调度。本实验可加深对进程调度算法的理解。实验内容如下:
- 设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。
- 模拟调度程序可选择优先级调度算法或者时间片轮转调度算法
- 程序执行中应能在屏幕上显示出各进程的状态变化
- 使用C/C++语言进行模拟
实验步骤
调度算法总流程图
优先级调度算法流程图
实验代码
进程控制块PCB结构体如下:
typedef struct pcb{
int id;//进程的ID
int prior;//进程的优先级,允许为负,规定:-20表示进程已完成
int used;//已经使用的时间片
int need;//还需要的时间片
char status;//进程的状态 R,J,F分别表示进程正在运行、进程就绪、进程完成
}PCB;
完整代码:
/*
操作系统,进程调度算法的模拟
按照优先级算法进行进程调度
*/
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"
#include<ctime>
//定义进程控制块PCB的结构体
typedef struct pcb{
int id;//进程的ID
int prior;//进程的优先级
int used;//已经使用的时间片
int need;//还需要的时间片
char status;//进程的状态 R,J,F分别表示进程正在运行、进程就绪、进程完成
}PCB;
PCB *head,p[5];
//打印显示输出进程
void print(){
printf("-----------------------------------------------------\n");
printf("进程ID\t优先级\t已使用的时间片\t还需时间片\t状态\n");
for(int j=0;j<5;j++){
printf("%d\t %d\t %d\t\t %d\t\t %c\n",p[j].id,p[j].prior,p[j].used,p[j].need,p[j].status);
}
}
//使用冒泡算法按照优先级降序排列
void sort(){
for(int i=0;i<5;i++){
for(int j=0;j<4;j++){
if(p[j].prior<p[j+1].prior){
PCB temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
}
//初始化进程队列
void inputprocess(){
srand(time(0));//为随机数产生种子
//依次先为每一个进程p[i]初始化
for(int i=0;i<5;i++){
p[i].id=i+1;
p[i].prior=1+rand()%5;//生成1~5的随机数作为各个进程的优先级
p[i].used=0;
p[i].need=1+rand()%5;//总时间片
p[i].status='J';//初始化为就绪态
}
sort();//按照优先级进行排序
head=p;
printf("开始进程的状态:\n");
print();//打印进程的状态
}
按照最高优先级优先调用来调用进程队列
void runprocess(){
PCB *p1=NULL;
do{
p1=head;
head=p+1;
//根据优先级调度原则,判断队列的队首进程是否能够运行
while(p1->need>0&&p1->prior>=head->prior){
p1->need--;
p1->prior--;
p1->status='R';
p1->used++;
print();
}
//如果进程总的时间片已经用完,一律将其进程的优先级设置为-20,状态为已完成
if(p1->need==0){
p1->prior=-20;
p1->status='F';
} else{
p1->status='J';
}
sort();//再次排序为下一次运行做准备
head=p;
}while(head->prior!=-20);
print();
printf("-----------------------------------------------------\n");
printf("所有的进程已执行完毕!");
}
![img](https://img-blog.csdnimg.cn/img_convert/4c7803fb4089ef921cd22cd781a204e4.png)
![img](https://img-blog.csdnimg.cn/img_convert/0a171acc0a3f7beb477905807420569d.png)
![img](https://img-blog.csdnimg.cn/img_convert/6677cfa2ba18f1b428e3e8f40b4b0848.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**