操作系统处理机调度算法代码
根据给定的信息,本文将详细解释与操作系统处理机调度算法相关的知识,并重点解析代码实现。 ### 操作系统处理机调度算法概述 在操作系统领域中,处理机调度算法是核心概念之一,它负责合理分配处理机资源给进程。调度算法的目标包括提高系统效率、公平性以及响应时间等。常见的处理机调度算法有先来先服务(First-Come First-Served, FCFS)、短作业优先(Shortest Job First, SJF)、最高响应比优先(Highest Response Ratio Next, HRRN)等。 ### 代码解析 #### 1. 全局变量定义 ```c++ #include<stdio.h> #include<string.h> #include<iostream.h> int sjptime=10;//时间片长度10秒 int maxPCB=100;//最大的PCB数 ``` 这里定义了两个全局变量:`sjptime` 和 `maxPCB`。`sjptime` 表示时间片的长度,默认设置为10秒;`maxPCB` 定义了进程控制块(Process Control Block, PCB)的最大数量,即同时可处理的最大进程数。 #### 2. 进程控制块(PCB)结构体定义 ```c++ typedef struct node { char name[20]; int zt;//状态 int time; int yxj;//优先级 int atime; int waittime; } pcb; ``` 这里定义了一个 `pcb` 结构体,用于表示进程控制块,包含了进程名、状态、所需时间、优先级、到达时间和等待时间。 #### 3. 进程初始化函数 ```c++ void sjd1() { int i; for(i=0;i<maxPCB;i++) { strcpy(pcbs[i].name,""); pcbs[i].zt=0; pcbs[i].time=0; pcbs[i].tq=0; pcbs[i].atime=0; pcbs[i].waittime=0; } n=0; } ``` 此函数用于初始化所有进程的PCB,即将进程名称置为空字符串,状态、所需时间、到达时间、等待时间等均置为0,并将当前进程计数器 `n` 初始化为0。 #### 4. 文件读取及显示函数 ```c++ int zc() { FILE* fp; char fname[20]; int i; cout<<"文件名:"<<endl; cin>>fname; if((fp=fopen(fname,"r"))==NULL) { cout<<"错误!"<<endl; } else { while(!feof(fp)) { fscanf(fp,"%s%d%d%d",pcbs[n].name,&pcbs[n].zt,&pcbs[n].time,&pcbs[n].yxj); n++; }//读取文件 cout<<"已读取的内容:"<<endl; cout<<"状态 时间 优先级:"<<endl; for(i=0;i<n;i++) { cout<<""<<pcbs[i].name<<""<<pcbs[i].zt<<""<<pcbs[i].time<<""<<pcbs[i].yxj<<endl; } return(1); } return(0); } ``` 此函数实现了从文件读取进程信息的功能。首先提示用户输入文件名,然后尝试打开该文件。如果文件打开失败,则输出错误信息并返回0;若成功,则循环读取文件中的数据直到文件结束,每读取一行数据,就将其存储到相应的PCB中,并递增进程计数器 `n`,最后输出读取的数据并返回1。 #### 5. 重置到达时间函数 ```c++ void htf() { int i; for(i=0;i<maxPCB;i++) { pcbs[i].atime=0; pcbs[i].waittime=0; } } ``` 该函数用于重置每个进程的到达时间和等待时间,为后续的调度做准备。 #### 6. 先来先服务(FCFS)调度算法 ```c++ void lf() { int i, j; int t; cout<<endl<<"--------------------------------------------"<<endl; cout<<"FIFO方法"<<endl; cout<<"等待时间"<<endl; for(i=0;i<n;i++) { cout<<""<<pcbs[i].name<<""<<pcbs[i].waittime<<endl; for(j=i+1;j<n;j++) { pcbs[j].waittime+=pcbs[i].time; } } t=0; for(i=0;i<n;i++) { t+=pcbs[i].waittime; } cout<<"总的等待时间:"<<t<<"平均等待时间:"<<t/n<<endl; } ``` 该函数实现了先来先服务(First-Come First-Served, FCFS)调度算法,按照进程到达的顺序执行。首先初始化每个进程的等待时间为0,然后依次计算每个进程的等待时间。最后统计总的等待时间和平均等待时间。 #### 7. 优先级调度算法 ```c++ void sjd2() { int i, j, p; int runtime = 0; int t; int q[maxPCB]; int yxj1 = 1000; for(i=0;i<n;i++) { yxj1=1000; for(j=0;j<n;j++) { if((pcbs[j].atime==0) && (pcbs[j].yxj < yxj1)) { p=j; yxj1=pcbs[j].yxj; } } q[i]=p; pcbs[p].atime=1; pcbs[p].waittime += runtime; runtime += pcbs[p].time; } //调度结果 cout<<endl<<"######################################################"<<endl; cout<<"执行情况:"<<endl; cout<<"等待时间"<<endl; for(i=0;i<n;i++) { cout<<""<<pcbs[q[i]].name<<""<<pcbs[q[i]].waittime<<endl; } t=0; for(i=0;i<n;i++) { t += pcbs[i].waittime; } cout<<"总等待时间:"<<t<<"平均等待时间:"<<t/n<<endl; } ``` 该函数实现了优先级调度算法。首先遍历所有未被调度的进程,找到优先级最高的进程进行调度。然后更新其等待时间和运行时间。最后输出调度结果以及总的等待时间和平均等待时间。 #### 8. 时间片轮转调度算法 代码片段中并未完全展示时间片轮转调度算法的实现,但可以推测其主要思想为: 1. 将所有进程放入就绪队列。 2. 每个进程轮流占用CPU的时间片,如果时间片用完但进程尚未完成,则将该进程放到队列尾部。 3. 直到所有进程执行完毕。 ### 总结 本文通过解析给定的代码,详细介绍了操作系统的处理机调度算法,包括先来先服务、优先级调度和时间片轮转调度算法的实现过程。这些算法在实际的操作系统设计中具有重要的作用,能够有效地管理和调度处理机资源,提高系统的整体性能。
#include<string.h>
#include<iostream.h>
int sjptime=10;//时间片长度10秒
int maxPCB=100;//最大的PCB数
typedef struct node
{
char name[20];
int zt;//进程处在什么状态
int time;
int yxj;//优先级
int atime;
int waittime;}pcb;
pcb pcbs[maxPCB];
int n;//数量
//初始化
void sjd1()
{
int i;
for(i=0;i<maxPCB;i++)
{
strcpy(pcbs[i].name,"");
pcbs[i].zt=0;
pcbs[i].time=0;
pcbs[i].tq=0;
pcbs[i].atime=0;
pcbs[i].waittime=0;
}
n=0;
}
int zc()
{
FILE *fp;
char fname[20];
int i;
cout<<"输入进程数文件名:"<<endl;
cin>>fname;
if((fp=fopen(fname,"r"))==NULL)
{
cout<<"error!"<<endl;
}
else
{
while(!feof(fp))
{
fscanf(fp,"%s%d%d%d",pcbs[n].name,&pcbs[n].zt,&pcbs[n].time,&pcbs[n].yxj);
n++;
}//输入读取的数据
cout<<"输入要读取的数据:"<<endl;
cout<<"进程名 进程状态 所需时间 优先级:"<<endl;
for(i=0;i<n;i++)
{
cout<<" "<<pcbs[i].name<<" "<<pcbs[i].zt<<" "<<pcbs[i].time<<" "<<pcbs[i].yxj<<endl;
}
return(1);
}
return(0);
}
剩余6页未读,继续阅读
- liuyc19892012-08-04都是可以运行的代码
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于ssm的健身房管理系统源码(java毕业设计完整源码).zip
- 用于平抑可再生能源功率波动的储能电站建模及评价 关键词:储能电站 功率波动 并网 平抑可再生能源 参考文档:《用于平抑可再生能源功率波动的储能电站建模及评价》仅参考 《光伏发电容量可信度评估》参考风电
- 不同颜色球体检测1-YOLO(v7至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 基于Python控制台电商用户行为分析.py
- 基于ssm的教师业务数据统计与分析系统源码(java毕业设计完整源码).zip
- S7-1200 S7-1500 SCL 小实例-位变量计数编程.mp4
- 基于ssm的酒店客房预定管理系统源码(java毕业设计完整源码+LW).zip
- 北京建筑大学2024给水管道系统设计平面图
- 灾情信息一体化编码及管理系统-MultiSource-HazardData v2.0 实现灾情数据高效利用
- 西门子1200PLC 自动贴标机 三轴伺服控制 包括PLC程序和触摸屏程序 1触摸屏是西门子TP900 23轴伺服PTO,脉冲加方向控制 3梯形图和SCL编写 红圆多种执行器:机械手
- 基于ssm的客户关系管理系统源码(java毕业设计完整源码).zip
- 基于ssm的课堂教学效果实时评价系统源码(java毕业设计完整源码+LW).zip
- rrt格式文件资源测试
- 主机厂基于Simulink MBD新能源电动汽车主驱电驱控制器算法模型及开发资料,量产模型,量产软件,量产代码,软件架构设计,输入输出定子,单元测试,MIL测试资料 (全套资料) Sumlink M
- 网页版的贪吃蛇下游戏(html+js)
- 基于ssm的篮球系列网上商城设计与实现源码(java毕业设计完整源码+LW).zip