操作系统实验三

/*
Name: procNQue.c 进程调度模拟实验源码 存储结构链表

Description:
实现一个有 N级队列的多级反馈队列调度算法。

*/
#include "stdio.h"
#include <stdlib.h>
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
#define N 3
struct pcb { /* 定义进程控制块PCB */
char name[10];
char status;
int prio;
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->prio)>(ready->prio))) /*优先级最大者,插入队首*/
{
p->link=ready;
ready=p;
}
else /* 进程比较优先级,插入适当的位置中*/
{
first=ready;
second=first->link;
while(second!=NULL)
{
if((p->prio)>(second->prio)) /*若插入进程比当前进程优先数大,*/
{ /*插入到当前进程前面*/
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;
/*clrscr(); */ /*清屏*/
printf("\n 请输入进程数?");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("\n 进程号No.%d:\n",i);
p=getpch(PCB); /*宏(type*)malloc(sizeof(type)) */
printf("\n 输入进程名:");
scanf("%s",p->name);
/*printf("\n 输入进程优先数:");
scanf("%d",&p->prio); */
p->prio=N;
printf("\n 输入进程运行时间:");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;p->status=‘r‘;
p->link=NULL;
sort(); /* 调用sort函数*/
}

}

int space()
{
int l=0; PCB* pr=ready;
while(pr!=NULL)
{
l++;
pr=pr->link;
}
return(l);
}

disp(PCB * pr) /*单个进程显示函数*/
{

printf("|%s\t",pr->name);
printf("|%c\t",pr->status);
printf("|%d\t",pr->prio);
printf("|%d\t",pr->ntime);
printf("|%d\t",pr->rtime);
printf("\n");
}

void printbyprio(int prio)
{
PCB* pr;
pr=ready;
printf("\n ****当前第%d级队列(优先数为%d)的就绪进程有:\n",(N+1)-prio,prio); /*显示就绪队列状态*/
printf("\n qname \tstatus\t prio \tndtime\t runtime \n");
while(pr!=NULL)
{
if (pr->prio==prio) disp(pr);
pr=pr->link;
}
}

check() /* 显示所有进程状态函数 */
{
PCB* pr;
int i;
printf("\n /\\/\\/\\/\\当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/
printf("\n qname \tstatus\t prio \tndtime\t runtime \n");
disp(p);

printf("\n 当前就绪队列状态为:\n"); /*显示就绪队列状态*/
for(i=N;i>=1;i--)
printbyprio(i);
/*
while(pr!=NULL)
{
disp(pr);
pr=pr->link;
}
*/
}

destroy() /*进程撤消函数(进程运行结束,撤消进程)*/
{
printf("\n 进程 [%s] 已完成.\n",p->name);
free(p);
}

running() /* 运行函数。判断是否完成,完成则撤销,否则置就绪状态并插入就绪队列*/
{
int slice,i;
slice=1;
for(i=1;i<((N+1)-p->prio);i++)
slice=slice*2;

for(i=1;i<=slice;i++)
{
(p->rtime)++;
if (p->rtime==p->ntime)
break;

}
if(p->rtime==p->ntime)
destroy(); /* 调用destroy函数*/
else
{
if(p->prio>1) (p->prio)--;
p->status=‘r‘;
sort(); /*调用sort函数*/
}
}
void cteatpdisp()
/*显示(运行过程中)增加新进程后,所有就绪队列中的进程*/
{

int i;

printf("\n 当增加新进程后,所有就绪队列中的进程(此时无运行进程):\n"); /*显示就绪队列状态*/
for(i=N;i>=1;i--)
printbyprio(i);
}
void creatp()
{
char temp;
printf("\nCreat one more process?type Y (yes)");
scanf("%c",&temp);
if (temp==‘y‘||temp==‘Y‘)
{
input();
cteatpdisp();
}

}

main() /*主函数*/
{
int len,h=0;
char ch;
input();
len=space();
while((len!=0)&&(ready!=NULL))
{
ch=getchar();
/*getchar();*/
h++;
printf("\n The execute number:%d \n",h);
p=ready;
ready=p->link;
p->link=NULL;
p->status=‘R‘;
check();
running();
creatp();
printf("\n 按任一键继续......");
ch=getchar();
}
printf("\n\n 进程已经完成.\n");
ch=getchar();
ch=getchar();
}

实验结果如下:

时间: 2024-08-03 06:28:41

操作系统实验三的相关文章

[操作系统]实验三 进程调度模拟程序

实验三进程调度模拟程序 专业:商软一班   姓名:黄冠锋 学号:201406114134 1.实验目的和要求 1.1. 实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2.实验要求 1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法. (1).  每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时

0512操作系统 实验三 进度调度模拟程序

实验三 进程调度模拟程序                      1.    目的和要求 1.1.           实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2.           实验要求 1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法. (1).  每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息

操作系统 实验三、进程调度模拟程序

实验三进程调度模拟程序 专业:商软二班   姓名:江志彬 学号:201406114225 1.实验目的和要求 1.1. 实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2.实验要求 1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法. (1).  每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时

操作系统——实验三

实验三 进程调度模拟程序 1.    目的和要求 1.1.           实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2.           实验要求 1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法. (1).  每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.

操作系统实验三进程调度

目的和要求 1.1.           实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2.           实验要求 1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法. (1).  每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等等. (2)

操作系统实验报告三

操作系统实验报告三 姓名:许恺 学号:2014011329 日期:2016.11.22 题目1:设计一段内存结构,能够缓存一定数量的网页,在客户端访问时,首先从内存中查找是否存在客户端访问的网页内容,如果存在,则直接从内存中将相应的内容返回给客户端:如果不存在,则从磁盘中将网页内容读入到内存,并返回给客户端   1.思想以及准备怎么做 在刚刚读完题目之后我的想法已经有了一点感觉要怎样做了,因为报告拖了比较久,所以老师也说过很多,好了直奔主题,首先要设计一段内存结构,用来缓存网页,其实就是做几个能

实验三 进程调度模拟程序--操作系统

实验三 进程调度模拟程序--操作系统 一. 目的和要求 1.1. 实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2. 实验要求 1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法. (1). 每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等等. (2

【操作系统】实验三、进程调度模拟程序实验

实验三 进程调度模拟程序 商软1班   陈彦生 201406114124 1.目的和要求 1.1. 实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2. 实验要求 1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法. (1).  每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.

【操作系统】实验三 进程调度模拟程序 截止提交时间:2016.5.12

实验三 进程调度模拟程序 1.    目的和要求 1.1.           实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2.           实验要求 1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法. (1).  每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.