操作系统课程设计-进程调度模拟 下载本文

成都理工大学

ShowPcb(); //展示所需执行进程信息 int choose = 0 ; while(1) {

cout<<\请选择需要模拟的CPU调度算法!***\

cout<<\ 1: 可强占的优先进程调度 ***\ cout<<\ 2: 先到先调度 ***\ cout<<\ 3: 退出系统 ***\ cout<<\ 请选择 : \ cin>>choose ; cout<

case 1:

break; case 2: break;

default:return; //结束程序 }

cout<

//按进程提交时间排序的比较函数 bool cmp(ProcessPcb a,ProcessPcb b) {

if(a.time_submit

//判断是否数字 int isnumber(char a[]) {

int len=strlen(a); int i,num=0;

if(a[0]>'0'&&a[0]<='9') num=a[0]-'0';

12

PriModel(); //可强占的优先进程方式

FcfsModel(); //先到先服务调度方式

成都理工大学

else return -1; for(i=1;i

if(a[i]>='0'&&a[i]<='9') num=num*10+a[i]-'0'; else return -1; }

return num; }

//进程输入函数 bool CpuModel::GetPcb() {

char num[10];

cout<<\ *** 进程调度模拟程序 ***\\n\ cout<<\ *** 计算机科学与技术三班 ***\\n\ cout<<\ *** 孙清茂 ***\\n\ cout<<\请输入你想建立的进程个数: \ cin>>num; //输入进程个数 pcbnum=isnumber(num);

if(pcbnum<=0) {cout<<\输入有错***\\n\ int i;

for(i=0;i

cout<<\请依次输入第\个进程的信息***\

cout<<\名字:\ cin>>PcbList[i].pro_name ; cout<<\提交时间:\ cin>>num;

PcbList[i].time_submit=isnumber(num);

if(PcbList[i].time_submit<=0){cout<<\输入有错***\\n\ cout<<\执行时间:\ cin>>num;

PcbList[i].time_exe=isnumber(num);

if(PcbList[i].time_exe<=0) {cout<<\输入有错***\\n\ PcbList[i].time_left=PcbList[i].time_exe; //设置剩余执行时间 PcbList[i].pro_state=UNREADY; //设置状态为未就绪 PcbList[i].pro_priority=100-PcbList[i].time_exe; //设置优先级,

优先级=100-执行时间

13

成都理工大学

cout<

sort(PcbList,PcbList+pcbnum,cmp); //按提交时间排序

for(i=0;i

PcbList[i].pro_id=i+1; //设置Id,根据提交时间 return 1; }

//展示所需执行进程信息 void CpuModel::ShowPcb() {

int i;

cout<<\所需执行的进程信息如下***\\n\ for(i=0;i

cout<<\ 进程编号: \ 进程名字: \

<

//可强占的优先进程调度模式 void CpuModel::PriModel() {

cout<<\可强占的优先进程调度过程如下********\\n\ freetime=0; //初始化系统空闲时间为0 int time=0; //时间 int nextid=0;

int pnum=0; //已就绪进程数目 ProcessPcb *head; //就绪队列 ProcessPcb *pcb,*pcb1,*pcb2;

head=(ProcessPcb*)malloc(sizeof(ProcessPcb));

head->next=NULL; //head 指针不用,head->next开始为就绪队列 //模拟cpu开始工作

while(head->next!=NULL||pnum

Sleep(1000);

time++; //时间片为1

cout<<\第\秒\ //打印

// 进程就绪(查看未就绪的进程中在该时间片是否可以进入就绪队列)

14

<<\ 优先级数:\

成都理工大学

while(pnum

//进入就绪队列

{

*pcb=PcbList[pnum++];

pcb->next=head->next; //插在head之后 head->next=pcb; }

{

cout<<\ 没有可运行的进程\

freetime++; } else {

pcb2=head; pcb=head->next; pcb1=head->next;

//查找当前优先级最高的就绪进程 while(pcb1->next!=NULL) {

if(pcb->pro_priority<=pcb1->next->pro_priority)

{

pcb2=pcb1;

pcb=pcb1->next;

}

pcb1=pcb1->next; }

//运行优先级最高的进程

if(pcb->time_left==pcb->time_exe) //该进程是否已开始

pcb->time_start=time; //设置开始时间 pcb->pro_state=EXECUTE; //设置状态为执行 pcb->pro_priority=pcb->pro_priority-3; //优先级数减3 {

//查找在time时间片应该运行的进程

if(head->next==NULL)

}

pcb->time_left--; //剩余执行时间减去时间片1

15