实验一(进程调度)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for (i=1;i<=n;i++)printf("%4c",PCB[i].status);
printf("\n=====================================================\n");
if (RUN!=-1)printf("RUNNING PROCESS: %ld\n",RUN);
//寻找等待链中的合适位置
while (k!=TAIL && PCB[link[k]].priority>PCB[RUN].priority)
k=link[k];
if (k==TAIL)
{
link[k]=RUN;//插入链尾之后
TAIL=RUN;
link[RUN]=-1;
RUN=HEAD;
HEAD=link[HEAD];
{
PCB[RUN].status='F';
RUN=HEAD;
if (HEAD!=-1)
HEAD=link[HEAD];
PCB[RUN].status='R';
}
else
{
if (HEAD!=-1 && PCB[RUN].priority<PCB[HEAD].priority)
{
k=HEAD;
PCB[RUN].status='W';
{
long i,j,k;
long sort[n+1];
init();
//设置就绪链
for (i=1;i<=n;i++)
{
sort[i]=i;
}
for (i=1;i<=n;i++)//根据优先数排序
{
for (j=n;j>i;j--)
{
if (PCB[sort[j]].priority>PCB[sort[j-1]].priority)
gets(s);
if (s[0]=='P' || s[0]=='p')
return 1;
return 0;
}
//初始化
void init()
{
long i;
for (i=1;i<=n;i++)
{
PCB[i].id=i;
PCB[i].priority=rand()%4+1;
PCB[i].runtime=0;
动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。例如:在进程获得一次CPU后就将其优先数减少1。或者,进程等待的时间超过某一时限时增加其优先数的值,等等。
编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。
轮转法可以是简单轮转法、可变时间片轮转法,或多队列轮转法。
{
main_round_robin();//简单轮转法
}
printf("SYSTEM FINISHED\n");
return 0;
}
}
else
{
if (HEAD!=-1 && PCB[RUN].runtime%PCB[RUN].priority==0)//轮转时间到
{
PCB[RUN].status='W';//插入链尾
link[TAIL]=RUN;
link[RUN]=-1;
TAIL=RUN;
RUN=HEAD;//链首进程开始运行
HEAD=link[HEAD];
PCB[RUN].status='R';
}
}
}
showit();
}
//主函数
int main()
{
long algo;
srand(time(NULL));
algo=ChooseAlgo();
if (algo==1)
{
main_priority();//优先数法
}
else
PCB[RUN].status='R';
HEAD=link[HEAD];//运行链首进程
while (RUN!=-1)
{
showit();
PCB[RUN].totaltime--;
PCB[RUN].priority-=3;//优先级减3
PCB[RUN].runtime++;
if (PCB[RUN].totaltime==0)//进程运行完成
{
long id,priority,runtime,totaltime;
char status;//R,W,F->运行,就绪,完成
}PCB[n+1];
long link[n+1];//链表结构
long RUN,HEAD,TAIL;
//按照优先数大小设置就绪链
for (i=1;i<=n;i++)
{
for (j=n;j>i;j--)
else printf("RUNNING PROCESS: NULL\n");
printf("WAITING QUEUE: ");
for (i=HEAD;i!=-1;i=link[i])printf("%ld ",i);
printf("\n\n");
}
//优先数调度算法
void main_priority()
逻辑设计使用链表表示就绪链队列每个元素包括进程名进程优先数进程需要运行的时间占用cpu的时间及进程的状态等信息
实验项目名称:进程管理
一、实验目的
进程是操作系统最重要的概念之一,进程调度又是操作系统核心的主要内容。本实验要求学生独立的用高级语言编写和调试一个简单的进程调度程序。算法要求使用简单轮转法和优先数法。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施办法。
简单轮转法的基本思想是:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。如果运行进程用完它的时间片后还为完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。
附录1:程序流程图
附录2:源代码
//操作系统实验--进程调度
(2)调度程序应包含2~3种不同的调度算法,运行时可任选一种。
(3)每个进程处于运行R、就绪W和完成F三种状态之一,假定初始状态都为就绪状态W。
(4)系统能显示或打印各进程状态和参数的变化情况。
三、设计思想
(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)
1.程序流程图(见附图)
//优先数法和简单轮转法
#include <cstdio>
#include <ctime>
#include <cstring>
#include <cstdlib>
const long n=5;
struct pcbtype//进程控制块结构
{
long id,priority,runtime,totaltime;
PCB[i].totaltime=rand()%8+1;
PCB[i].status='W';
}
}
//显示进程调度状况
void showit()
{
long i;
printf("=====================================================\n");
printf("%-25s","ID");
}
TAIL=sort[n];
link[TAIL]=-1;
RUN=-1;
四、测试
五、课后
编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。
“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。
静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。
for (i=1;i<=n;i++)printf("%4ld",PCB[i].id);
printf("\n%-25s","PRIORITY//TURNTIME");
for (i=1;i<=n;i++)printf("%4ld",PCB[i].priority);
printf("\n%-25s","CPUTIME");
二、实验要求
(1)设计一个有n个进程(可假定系统有五个进程)共行的进程调度程序。每一个进程用一个进程控制块PCB来代表。PCB中包含下列信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间及进程的状态等,且可按调度算法的不同而增减。各进程的优先数或轮转时间片数,以及进程运行需要地时间片数,均由伪随机数发生器产生。
{
k=sort[j];sort[j]=sort[j-1];sort[j-1]=k;
}
}
}
HEAD=sort[1];
for (i=1;i<n;i++)
{
link[sort[i]]=sort[i+1];
}
TAIL=sort[n];
link[TAIL]=-1;
RUN=-1;
//就绪链设置完毕
RUN=HEAD;
for (i=1;i<=n;i++)printf("%4ld",PCB[i].runtime);
printf("\n%-25s","ALLTIME");
for (i=1;i<=n;i++)printf("%4ld",PCB[i].totaltime);
printf("\n%-25s","STATUS");
2.逻辑设计
使用链表表示就绪链(队列),每个元素包括进程名、进程优先数、进程需要运行的时间、占用CPU的时间及进程的状态等信息。该结构需支持以下操作:取头节点,在任意位置插入节点,删除头节点,判断表空。为此,引入2个指针变量:头指针HEAD和尾指针TAIL。
3、物理设计
struct pcbtype//进程控制块结构
{
showit();
PCB[RUN].totaltime--;
PCB[RUN].runtime++;
if (PCB[RUN].totaltime==0)//进程运行完成
{
PCB[RUN].status='F';
RUN=HEAD;
if (HEAD!=-1)
HEAD=link[HEAD];
PCB[RUN].status='R';
char status;//R,W,F->运行,就绪,完成
}PCB[n+1];
long link[n+1];//链表结构
long RUN,HEAD,TAIL;
//选择算法
long ChooseAlgo()
{
char s[128];
printf("Please type the Algorithm(Priority\\Round Robin):");
{
long i;
init();
//设置就绪链
HEAD=1;
for (i=1;i<n;i++)
{
link[i]=i+1;
}
TAIL=n;
link[TAIL]=-1;
RUN=-1;
//就绪链设置完毕
RUN=HEAD;
PCB[RUN].status='R';
HEAD=link[HEAD];//运行首进程
while (RUN!=-1)
PCB[RUN].status='R';
}
else
{
link[RUN]=link[k];//插入链中
link[k]=RUN;
RUN=HEAD;//链首进程开始运行
HEAD=link[HEAD];
PCB[RUN].status='R';
}
}
}
}
showit();
}
//轮转调度算法
void main_round_robin()
{
if (PCB[sort[j]].priority>PCB[sort[j-1]].priority)
{
k=sort[j];sort[j]=sort[j-1];sort[j-1]=k;
}
}
}
HEAD=sort[1];
for (i=1;i<n;i++)
{
link[sort[i]]=sort[i+1];
相关文档
最新文档