c语言非指针方法模拟进程优先权,动态优先权进程调度算法的模拟.doc

计算机学院设计性实验报告

专业:朱文焌 年级/班级: 20xx级网络工程系统与信息工程学院

通过动态优先权调度算法和时间片轮转调度算法的模拟加深进程概念和进程调度过程的理解。

实验仪器或设备

电脑或者是一台台式机

本实验的目的就是用Linux下用C语言编程模拟N个进程采用高优先权优先(要求采用动态优先权)进程调度算法。已知时间片轮转算法,可以根据时间片轮转的思路加以修改就行了。轮转与动态优先权的区别就是片轮转是在FIFO进程的基础上,中的进程按照进入的顺序,每个进程都执行一个时间片运行完就把该进程释放掉,如果一个时间片内未结束就插到队列尾而优先权进程调度算法就是按照优先权的大小运行进程,如果一个时间片内未运行完,则优先减3再插入到队列中队尾而是队列中的适当位置,该位置前面的的优先级数大于节点的优先级数,后面的节点的count值小于该节点的count值)要求:

Linux下用C语言编程模拟N个进程采用高优先权优先(要求采用动态优先权)进程调度算法。为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程情况显示出来;

进程控制块是进程存在的唯一标志,因此,在模拟算法中每一个进程用一个进程控制块PCB来代表,PCB用一结构体表示。包括以下字段:

进程标识数id,或者进程的名称name;

进程优先数priority,并规定优先数越大的进程,其优先权越高;

进程需要运行的CPU时间ntime;

进程的运行时间rtime;

进程状态state;

队列指针next,用来将PCB排成队列。

进程在运行过程中其状态将在就绪、执行、阻塞(可选)、完成几种状态之间转换,同时进程可能处于不同的队列中,如就绪队列、阻塞队列(可选)。在两种调度算法中,考虑分别可以选择什么样的队列及如何实现进程的入队、出队操作;

为了便于处理,优先权调度每次也仅让进程执行一个时间片,若在一个时间片内未运行结束,调整进程优先级将其插入就绪队列,进行新一轮调度;

优先数改变原则:

进程每运行若一个时间单位,优先数减3;

进程在就绪队列中呆一个时间片,优先数增加1。(仅供参考,合理即可)

优先权调度中,对于遇到优先权一致的情况,可采用FCFS策略解决;

由于是模拟进程调度,所以,对被选中的进程并不实际启动运行,而是修改进程控制块的相关信息来模拟进程的一次运行;

为了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来,参照格式如下:

id cputime needtime priority(count) state

0 0 2 48 ready

sort函数执行流程

#include "stdio.h"

#include

#define getpch(type) (type*)malloc(sizeof(type))

struct pcb { //定义进程控制块

char name[10]; //进程的名字

char state; //进程的状态

int count; //进程优先级

int ntime; //进程运行需要的CPU时间

int rtime; //进程已运行的时间

struct pcb* link; //连接pcb的指针

}*ready=NULL,*tail=NULL,*p; //就绪队列指针,队尾指针

typedef struct pcb PCB;

int slice = 1;

PCB *readyMaxProcess;

int readyQueNum=0; // 就绪队列的进程数量

sort() //将进程插入到就绪指针

{

PCB *q;

if(ready==NULL) //队列为空,将p插入到队列中

{

ready=p;

tail=p;

}

else//若就绪队列不为空,将p插入到队列

{

if(p->count>ready->count)//p指针所指节点的count值头的大于队列节点的count值,将p指针所指节点插入到对头

{ p->link=ready;

ready=p;

}

else

{ bool m=false;

q=ready;

//q2=q1->link;

while(m==false)

{

if(tail->count>=p->count)//若p的count值小于队尾指针所指节点的的count值的话,将p插到队尾

{

tail->link=p;

tail=p;

p->link=NULL;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(1)用C语言实现对N个进程采用动态优先权优先算法进程调度。 (2)每个用来标识进程进程控制块PCB用结构来描述,包括以下字段: •••• 进程标识数 ID。 •••• 进程优先数 PRIORITY,并规定优先数越大的进程,其优先权越高。 •••• 进程已占用的CPU时间CPUTIME。 •••• 进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。•••• 进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,将进入阻塞状态。 •••• 进程被阻塞的时间BLOCKTIME,表示已足赛的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 •••• 进程状态START。 •••• 队列指针NEXT,用来将PCB排成队列。 (3)优先数改变的原则: •••进程在就绪队列中呆一个时间片,优先数加1。 •••进程每运行一个时间片,优先数减3。 (4)假设在调度前,系统中有5个进程,它们的初始状态如下: ID 0 1 2 3 4 PRIORITY 9 38 30 29 0 CPUTIME 0 0 0 0 0 ALLTIME 3 3 6 3 4 STARTBLOCK 2 -1 -1 -1 -1 BLOCKTIME 3 0 0 0 0 STATE READY READY READY READY READY (5)为了清楚的观察各进程调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下: RUNNING PROG:i READY-QUEUE:->id1->id2 BLOCK-QUEUE:->id3->id4 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ID 0 1 2 3 4 PRIORITY P0 P1 P2 P3 P4 CUPTIME C0 C1 C2 C3 C4 ALLTIME A0 A1 A2 A3 A4 STARTBLOCK T0 T1 T2 T3 T4 BLOCKTIME B0 B1 B2 B3 B4 STATE S0 S1 S2 S3 S4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值