实验任务单1 单处理机系统的进程调度

任务目标:

1.设计一个模拟单处理机调度算法;

2.巩固和加深对进程概念和进程调度算法的理解。

任务环境:

Windows 或Linux操作系统,C语言

  • 实验内容

编写程序完成单处理机系统中的进程调度,要求采用最高优先级优先调度算法,具体内容包括:

  1. 确定进程控制块的内容和组织方式;
  2. 完成进程创建原语和进程调度原语;
  3. 编写主函数并对所做的工作进行测试。
  • 实验指导
  1. 相关知识及其分析

进程调度算法:采用最高优先级优先调度算法(即把处理机分配给优先级最高的进程)和先来先服务调度算法。每个进程用一个进程控制块(PCB)表示。进程控制块可以包含以下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等。进程优先数及需要的运行时间可以事先人为指定(也可由随机数产生)。进程的到达时间为进程的输入时间。进程的运行时间以时间片为单位进行计算。

图1 进程调度算法流程图

每个进程的状态可以是就绪W(Wait)、运行R(Run)或完成F(Finish)三种状态之一。就绪进程获得CPU后都只能运行一个时间片,用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果运行一个时间片后进程的已占用CPU时间还未达到所需要的运行时间,也就是进程还需要进行运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

每进行一次,调度程序都打印一次运行进程、就绪队列以及各个进程的PCB,以便进行检查。重复以上过程,直到所有进程都完成为止。

进程调度算法流程图如图1所示。

  1. 参考程序

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

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

struct pcb{

char name[10];

char state;

int super;

int ntime;

int rtime;

struct pcb* link;

}*ready=NULL,*p;

typedef struct pcb PCB;

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;

}

}

input()

{

int i,num;

system("cls");

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();

}

}

int space()

{

int i=0;PCB* pr=ready;

while(pr!=NULL)

{

i++;

pr=pr->link;

}

return(1);

}

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");

}

check()

{

 PCB* pr;

 printf("\n**** 当前正在运行的进程是:%s",p->name);

 disp(p);

 pr=ready;

 printf("\n**** 当前就绪队列状态为:\n");

 while(pr!=NULL)

 {

  disp(pr);

  pr=pr->link;

 }

}

destroy()

{

 printf("\n 进程 [%s] 已完成.\n",p->name);

 free(p);

}

running()

{

 (p->rtime)++;

 if(p->rtime==p->ntime)

  destroy();

    else

 {

  (p->super)--;

  p->state='w';

  sort();

 }

}

int main()

{

int len,h=0;

char ch;

 input();

len=space();

while((len!=0)&&(ready!=NULL))

{

 ch=getchar();

 h++;

 printf("\n The exrcute number:%d\n",h);

 p=ready;

 ready=p->link;

 p->state='R';

 check();

 running();

printf("\n 按任一键继续......");

ch=getchar();

}

printf("\n\n 进程已经完成.\n");

 ch=getchar();

 return 0;

}

  • 实验结果截图 (将运行结果的截图粘贴于此处)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实验处理器系统进程调度 1.实验目的 加深对进程概念的理解,明确进程和程序的区别; 深入了解系统如何组织进程、创建进程; 进一步认识如何实现处理器调度。 2.实验预备知识 进程的概念; 进程的组织方式; 进程的创建; 进程调度。 3.实验内容 编写程序完成处理机系统中的进程调度,要求采用时间片轮转调度算法。实验具体包括:首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所作工作进程测试。 4.提示与讲解 这个实验主要要考虑三个问题:如何组织进程、如何创建进程和如何实现处理器调度。 考虑如何组织进程,首先就要设定进程控制块的内容。进程控制块PCB记录各个进程执行时的情况。不同的操作系统进程控制块记录的信息内容不一样。操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。这里的实验只使用了必不可少的信息。一般操作系统中,无论进程控制块中信息量多少,信息都可以大致分为以下四类: ① 标识信息 每个进程都要有一个惟一的标识符,用来标识进程的存在和区别于其他进程。这个标识符是必不可少的,可以用符号或编号实现,它必须是操作系统分配的。在后面给出的参考程序中,采用编号方式,也就是为每个进程依次分配一个不相同的正整数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值