成都理工大学
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