无论是批处理系统、分时系统还是实时系统,用户进程数一般都大于处理机数,这将导致用户进程互相争夺处理机。这就要求进程调度程序按一定的策略,动态地把处理及分配给处于就绪队列中的某一进程,以使之执行。进程调度是处理机管理的核心内容。
1、进程调度算法使用的原因
我采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法编写和调试了一个简单的进程调度程序。(单向循环链表模拟实现出最高优先数优先的进程调度算法)
2、引入进程调度算法
采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法(将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理)。每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名称、进程的状态、进程的优先数、到达时间、运行时间。进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。
3、算法执行的流程4、程序代码
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define getpch(type) (type*)malloc(sizeof(type))//分配地址空间
#define NULL 0//表示NULL是一个常量值,他的值为0
struct pcb{char name[10];//进程的名称;char state;//进程的状态---->W就绪状态或R运行状态或F结束状态int super;//进程的优先级----->优先级高的优先执行int ntime;//到达时间;int rtime;//运行时间;struct pcb* link;//定义了一个进程控制块的pcb指针link
}*ready=NULL,*p;
typedef struct pcb PCB;
char sort(){//建立对进程优先级排列函数; PCB *first,*second;int insert=0;if((ready==NULL)||(p->super)>(ready->super)){//优先级最大者,插入队首; p->link = ready;ready=p;}else{//进程比较优先级,插入适当的位置中; first=ready;second = first->link;while(second!=NULL){if((p->super)>(second->super)){//插入进程比当前进程优先级大; //插入到当前进程的前面;p->link=second;first->link=p;second=NULL;insert=1; }else{//插入进程优先数最低,则插入到队尾; first=first->link;second=second->link;}}if(insert==0){first->link = p;}}
}
char input(){//建立进程控制块函数; int i,num;printf("\n 请输入被调度的进程数目:");scanf("%d",&num);for(i=0;i<num;i++){printf("\n 进程号No.%d:\n",i);p=getpch(PCB);printf("\n 输入进程名:");scanf("%s",p->name);printf("\n 输入进程的优先数:");scanf("%d",&p->super);printf("\n 输入进程的运行时间:");scanf("%d",&p->ntime);printf("\n");p->rtime=0;p->state='W';p->link=NULL;sort();//调用sort()函数; }
}
int space(){int l=0;PCB *pr=ready;while(pr!=NULL){l++;pr=pr->link;         }return(1);
}
char disp(PCB *pr){//建立进程显示函数,用于显示当前进程; printf("\n qname \t state \t super \t ndtime \t runtime \n");printf("|%s\t",pr->name);printf("|%c\t",pr->state);printf("|%d\t",pr->super);printf("|%d\t",pr->ntime);printf("|%d\t",pr->rtime);printf("\n");
}
char check(){//建立进程查看函数; PCB *pr;printf("\n ****当前正在运行的进程是:%s",p->name);//显示当前运行进程; disp(p);pr = ready;printf("\n ****当前就绪队列状态为:\n");//显示就绪队列状态;while(pr!=NULL){disp(pr);pr=pr->link;}
}
char destroy(){//建立进程撤销函数(进程运行结束,撤销进程) printf("\n 进程[%s]已完成.\n",p->name);free(p);
}
char running(){//建立进程就绪函数(进程运行时间倒置就绪状态)(p->rtime)++;if(p->rtime==p->ntime){destroy();//调用destroy函数; }else{(p->super)--;p->state='W';sort();//调用sort函数; }
}
int main(){//主函数; int len,h=0;char ch;input();len=space();while((len!=0)&&(ready!=NULL)){ch = getchar();h++;printf("\n The execute number:%d \n",h);p=ready;ready=p->link;p->link = NULL;p->state='R';check();running();printf("\n 按任意键继续.......");ch=getchar();}printf("\n\n 进程已完成.\n");ch=getchar();
}
5、运行结果分析根据上述输入的三个进程的信息可以得到:优先级最高的是进程ding_03,所以最先调度进程ding_03,它的状态为运行态,需要执行的时间为3。而当前就绪队列状态为:进程ding_02的优先级比较高,处于就绪队列前面,而进程ding_01的优先级是三者中最低的,所以处于就绪队列的最后。而此时这两个进程的状态都为就绪态。当进程ding_03执行了一个时间片之后而它已占用CPU时间已达到所需要的运行时间,则将它的优先级减1之后,再将三个进程按优先级的大小排列,从中选择优先级大的进程进入运行状态,则该次进入运行态的是进程ding_02。当进程ding_02执行了一个时间片之后而它已占用CPU时间已达到所需要的运行时间,则将它的优先级减1之后,再将三个进程按优先级的大小排列,从中选择优先级大的进程进入运行状态,则该次进入运行态的是进ding_03。当进程ding_03执行了一个时间片之后而它已占用CPU时间已达到所需要的运行时间,则将它的优先级减1之后,再将三个进程按优先级的大小排列,从中选择优先级大的进程进入运行状态,则该次进入运行态的是进程ding_01,当进程ding_01的CPU占用时间等于它所需要的运行时间时,进程ding_01调度完成。当进程ding_01调度完成之后,根据优先级进程ding_02将会进入到执行状态,当执行完毕之后,进程ding_02的CPU占用时间等于它所需要的运行时间,进程ding_02调度完成。当进程ding_02调度完成之后,就绪队列中的ding_03将会进入到执行状态,当ding_03进程的CPU占用时间等于运行所需要的时间时,进程ding_03调度完成。

操作系统-进程控制块PCB-实验报告相关推荐

  1. 操作系统-进程控制块PCB

    1.进程实体包括:程序段.数据段.进程控制块PCB: 2.进程控制块是操作系统中最重要的数据结构. PCB是用来记录进程信息的.比如说当CPU执行某程序的时候,当停止执行一段时间后,重新执行的时候如何 ...

  2. 操作系统:进程控制块PCB

    一.进程控制块的作用: 记录进程信息. 操作系统是根据进程控制块PCB来对并发执行的进程进行控制和管理的. PCB是进程存在的唯一标志. 二.进程控制中的信息: 进程标识符信息--进程标识符用于唯一地 ...

  3. 操作系统之进程控制块PCB

    操作系统之进程控制块PCB PCB的作用: PCB的作用是使一个在多道程序环境下不能独立运行的程序(含数据)成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程. (1) 作为独立运行基本单位 ...

  4. linux处理机调度实验报告,模拟Linux操作系统下处理机调度实验报告

    在采用多道系统的设计程序中,往往有若干进程同时处于就绪状态.当就绪状态进程数大于处理机数时,就必须按照某种策略来决定哪些进程优先占用处理机.本实验模拟在单处理机情况下处理机调度 处理机调度 一.实验目 ...

  5. 操作系统第6次实验报告:使用信号

    操作系统第6次实验报告:使用信号 一.实验目的 通过编程进一步了解信号. 二.实验内容 在服务器上用Vim编写程序,完成以下两个作业: 作业1:发送SIGTERM结束子进程 int kill(pid_ ...

  6. 带pcb板的c语言实验报告,pcb实验报告.doc

    pcb实验报告 <电子线路印刷版(PCB)设计CAD>实践报告 题目: 单片机最小系统PCB设计 姓 名: 学 号: 系 别: 信息工程系 专 业: 通信工程 年 级: 09 级 2013 ...

  7. 进程同步算法实现实验报告Linux,操作系统进程同步实验报告.doc

    操作系统进程同步实验报告 实验三:进程同步实验 一.实验任务: (1)掌握操作系统的进程同步原理: (2)熟悉linux的进程同步原语: (3)设计程序,实现经典进程同步问题. 二.实验原理: (1) ...

  8. 操作系统1_进程控制块PCB

    在操作系统中,进程实体是指PCB+程序段+相关的数据段 这里主要总结一下进程控制块 作用:     使一个在多带程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其他进程并 ...

  9. 操作系统 进程调度-银行家算法实验报告

    实验要求 一. 实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止.本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家 ...

最新文章

  1. [JLOI2011]飞行路线
  2. 升级vue-cli为 cli3 并创建项目
  3. 计算机视觉库OpenCV中shape和resize函数的区别
  4. 通信电子线路期末复习第二章下
  5. 典型PC系统各操作指令执行时间
  6. Leetcode动态规划 不同路径
  7. php 返回的缓存数据,基于PHP输出缓存(output_buffering)的深入理解
  8. long double(64bit)
  9. linux 7 kdump设置,Centos7/RHEL7 开启kdump
  10. 前端系列之HTML基础知识概述
  11. python高段编程_25个有用的 Python 代码段
  12. C# 导入word word导入
  13. Perl+批处理实现半自动批量生成动态通讯组
  14. 如何解读vmlinux.lds.S文件
  15. 连接数据库是显示无法连接到服务器,数据库无法连接到服务器怎么办(解决服务器连接故障的技巧)...
  16. 五笔86版字根图程序
  17. 关于加油站GPS坐标所想到的解决办法
  18. 长得好看,但没有男朋友是怎样的体验?
  19. 将quantopian的动量策略迁移到老虎证券量化api
  20. request库的基本用法

热门文章

  1. 线段树(区间更新)小结
  2. PCL点云处理之平均点间距计算(九十九)
  3. Java精粹--Date/Calendar/JodaTime/LocalDateTime解释
  4. 等值连接与自然连接的区别
  5. <<视觉问答>>2021:Mind Your Outliers,Investigating the Negative Impact of Outliers on Active Learning VQA
  6. 分子医学有哪些最新发表的毕业论文呢?
  7. Spring Cloud Sleuth介绍
  8. IDEA快捷键设置,选择Eclipse风格的快捷键,自动补全快捷键,关闭当前窗口快捷键Ctrl+W,自动导入设置,引入外部的jar的方式,设置项目字体,设置项目字符集,Maven的方式获取jar
  9. 恢复删除陌陌聊天记录方法
  10. html encode 在线,HttpUtility.HtmlEncode转义过多?