操作系统实验——进程调度 实验报告
(一) 实验目的
进程是操作系统中最基本、最重要的概念,进程调度又是操作系统的核心模块。本实验要求学生独立地用C 或 C++语言编写一个简单的进程管理程序,其主要部分是进程调度。调度算法可由学生自行选择,如基于动态优先级的调度算法或多级反馈队列调度算法。
通过本实验可加深学生对进程各种状态的转化和各种调度算法的理解,提高系统程序设计能力。
(二) 实验题目
以链式结构组成空闲 PCB 栈,以双向链式结构组成进程的就绪队列和睡眠队列,模拟 UNIX 的进程管理程序,实现以下操作(可用键盘命令或由产生的随机数决定操作和参数)。
1.创建一个新进程:如 pid=newp(pri,size,time),申请空闲PCB 和所需内存,填写 PCB
的各项初始数据,将该 PCB 送入就绪队列。
2.调度和执行:自己设计优先调度算法,在就绪队列中选择一个优先级最高的进程,使其运行若干个单位时间。要求在运行期间进程的p_cpu、p_pri 和 p_time 要变化,并在适当的时机重新调度。
3.进程睡眠:进程运行时可调用自编的睡眠函数,主动进入睡眠状态,并转调度程序。也可由操作使进程强迫挂起,睡眠适当时间。进程睡眠时要在PCB 中记录睡眠原因和优先数。
4.进程的唤醒:根据睡眠原因,将相应的进程从睡眠队列中调出,转入就绪队列。如该进程优先级比现运行进程优先级高,转调度程序。
5.进程的终止:如一个进程运行完作业所需的时间,或者用操作杀死该进程,该进程就终止,释放所占用的内存和 PCB 资源,转调度程序。
(三) 主要数据结构
每一个进程用一个进程控制块 PCB 表示,参考的 proc 结构定义如下:
struct proc { |
||
char |
p_pid; |
进程标识数 |
char |
p_pstat; |
进程状态 |
caddr_t p_addr; |
进程图象在内存中首址 |
|
int |
p_size; |
进程图象的长度 |
char |
p_pri; |
进程优先数 |
char |
p_cpu; |
进程当前运行的时间 |
int |
p_time; |
作业运行的(剩余)总时间 |
char |
p_wchan; |
进程睡眠原因 |
structproc *p_next, *p_prior; 进程 proc 的双向链指针
}
系统中有一个全局变量 curproc 指向现运行进程,还要定义几个队列的首指针。
(四)实验过程
1. 实验进程调度算法:
(1)动态优先权:当前运行进程用完时间片后,其优先权减去一个常数。
(2)轮转调度:每个个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。
2. 实验程序框图:
(1)轮询调度:
(2)动态优先级调度
3. 实验代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <ctime>
using namespace std;
//优先权法pcb
class PCB//类定义PCB表,适用于优先数
{
public:
int ID;
int priority;
int CPUtime;//runnedtime
int ALLtime;//needtime
int State;//1ready 2runing 3finish
int flag;//flag=1 finished
void set_PCB(int a,int b,int c,int d, inte,int f)
{
ID=a;
priority = b;
CPUtime=c;
ALLtime=d;
State=e;
flag=f;
}
};
//轮转法pcb
class PCB2
{
public:
int ID;
int CPUtime;
int ALLtime;
int State;
int flag;
void set_PCB2(int a,int b,int c,int d, inte)
{
ID=a;
CPUtime=b;
ALLtime=c;
State=d;
flag=e;
}
};
boolpriority_sort_higher(const PCB &m, const PCB &n)//sort函数,定义按优先数排序,当优先数相同时按序号排序(即先进先出)/priority high idsmall
{
if(m.priority == n.priority) return m.ID< n.ID;
return m.priority > n.priority;
}
void priority_way(vector<PCB> &pcb, vector<PCB> &wait,int pcbnum)//优先数算法
{
vector<PCB>::iterator it1;
it1 = pcb.begin();
int flag = pcbnum;
while(flag)
{
wait.erase(wait.begin());
(*it1).State = 2;
(*it1).priority -= 3;
(*it1).CPUtime += 1;
(*it1).ALLtime -= 1;
if((*it1).ALLtime == 0)
{
flag -= 1;
(*it1).flag =1;
cout<<left<<setw(10)<<(*it1).ID<<setw(10)<<(*it1).State<<setw(10)<<(*it1).priority<<setw(10)<<(*it1).CPUtime<<setw(10)<<(*it1).ALLtime<<setw(10)<<(*it1).flag<<endl;
pcb.erase(pcb.begin());
sort(wait.begin(), wait.end(),priority_sort_higher);
sort(pcb.begin(), pcb.end(),priority_sort_higher);
}
else
{
cout<<left<<setw(10)<<(*it1).ID<<setw(10)<<(*it1).State<<setw(10)<<(*it1).priority<<setw(10)<<(*it1).CPUtime<<setw(10)<<(*it1).ALLtime<<setw(10)<<(*it1).flag<<endl;
(*it1).State = 1;
wait.push_back(*it1);
sort(wait.begin(),wait.end(),priority_sort_higher);
sort(pcb.begin(),pcb.end(),priority_sort_higher);
}
}
}
void round_robin_way(vector<PCB2> &pcb2,vector<PCB2> &wait2)//时间片,every 2
{
vector<PCB2>::iterator it2;
it2 = wait2.begin();
int flag=5;
while(flag)
{
it2 = pcb2.begin();
wait2.erase(wait2.begin());//出队(等待队列)
(*it2).State = 2;
if((*it2).ALLtime==1)
{
(*it2).CPUtime +=1;
(*it2).ALLtime -=1;
flag -= 1;
(*it2).flag = 1;
cout << left <<setw(10) << (*it2).ID << setw(10) <<(*it2).State<<setw(10)<<(*it2).CPUtime<<setw(10)<<(*it2).ALLtime<<setw(10)<<(*it2).flag<<endl;
pcb2.erase(pcb2.begin());
continue;
}
else if((*it2).ALLtime==2)
{
(*it2).CPUtime +=2;
(*it2).ALLtime -=2;
flag-=1;
(*it2).flag =1;
cout<<left<<setw(10)<<(*it2).ID<<setw(10)<<(*it2).State<<setw(10)<<(*it2).CPUtime<<setw(10)<<(*it2).ALLtime<<setw(10)<<(*it2).flag<<endl;
pcb2.erase(pcb2.begin());
continue;
}
else
{
(*it2).State = 2;
(*it2).CPUtime +=2;
(*it2).ALLtime -=2;
cout<<left<<setw(10)<<(*it2).ID<<setw(10)<<(*it2).State<<setw(10)<<(*it2).CPUtime<<setw(10)<<(*it2).ALLtime<<setw(10)<<(*it2).flag<<endl;
(*it2).State = 2;
wait2.push_back(*it2);
PCB2 q = *it2;
pcb2.erase(pcb2.begin());
pcb2.push_back(q);
}
}
}
int random(int start, int end)
{
return start+(end-start)*rand()/(RAND_MAX +1.0);
}
int main( )
{
cout<<"-------------------------------模拟进程调度----------------------------------"<<endl;
srand(unsigned(time(0)));
int flag_0;
cout<<"请输入想要模拟进程调度算法的编号"<<endl;
cout<<"1.优先数调度;2.时间片轮转调度。"<<endl;
cin>>flag_0;
int pcbnum=0;
cout<<"创建进程数量:";
cin>>pcbnum;
int pro,time;
if(flag_0 == 1)
{
vector<PCB> pcb;
cout<<"创建"<<pcbnum<<"个进程,即将设置随机优先数与运行时间(优先数越大优先级越高)"<<endl;
for( int i = 1; i <= pcbnum; i++)
{
pro=random(1,30);
time=random(1,20);
PCB q;
q.set_PCB(i,pro,0,time,1,0);
cout<<"id:"<<i<<""<<"priority:"<<pro<<""<<"Alltime:"<<time<<endl;
pcb.push_back(q);
}
sort(pcb.begin(),pcb.end(),priority_sort_higher);//按优先数排序,利用sort函数
vector<PCB> wait(pcbnum);
copy(pcb.begin(),pcb.end(),back_inserter(wait));
cout<<"该进程运行情况如下(flag=0代表未完成,flag=1代表已完成)"<<endl;
cout<<left<<setw(10)<<"ID"<<setw(10)<<"State"<<setw(10)<<"priority"<<setw(10)<<"CPUtime"<<setw(10)<<"ALLtime"<<setw(10)<<"flag1" << endl;
priority_way(pcb,wait,pcbnum);
}
else if(flag_0 ==2)
{
vector <PCB2> pcb2;
vector<PCB2>::iterator it2;
it2 = pcb2.begin();
cout<<"创建"<<pcbnum<<"个进程,即将设置随机优先数与运行时间(优先数越大优先级越高)"<<endl;
for(int i = 1; i <= 5; i++)
{
time=random(1,20);
PCB2 q2;
q2.set_PCB2(i,0,time,1,0);
cout<<"id:"<<i<<""<<"Alltime:"<<time<<endl;
pcb2.push_back(q2);
}
vector<PCB2> wait2(pcbnum);
copy(pcb2.begin(),pcb2.end(),back_inserter(wait2));
cout<<"该进程运行情况如下(flag=0代表未完成,flag=1代表已完成)"<<endl;
cout <<left<<setw(10)<<"ID"<<setw(10)<<"State"<<setw(10)<<"CPUtime"<<setw(10)<<"ALLtime"<<setw(10)<<"flag1" << endl;
round_robin_way(pcb2, wait2);
}
cout<<"----------------------------------END--------------------------------------"<<endl;
return 0;
}
4. 实验结果
(1)优先数调度:
(2)轮询调度:
(五)实验总结:
通过这次实验,我采用的是两种进程调度算法对四个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。在优先数算法中,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的队尾上。 对于遇到优先数一致的情况,采用FIFO策略解决。
通过这次实验,对进程调度有深入的了解,在实验过程中遇到了很多问题,但是通过和同学请教,以及在网上查找有关资料,最终完成了本次实验要求。
操作系统实验——进程调度 实验报告相关推荐
- 优先级调度算法实现_《操作系统原理》实验一:进程调度
操作系统原理实验-进程调度实验报告 一.目的与要求 (1)进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验选用XX语言编写了一个进程调度模拟程序,使用优先级或时间的轮转法实现进 ...
- 四川大学计算机综合实践报告,四川大学计算机操作系统第四实验报告
1.实验报告(学生打印后提交)实验名称: 作业调度系统 实验时间: 2015 年 6 月 4 日实验人员:_(姓名)_(学号)_(年级)实验目的: 理解操作系统中调度的概念和调度算法. 学习 Linu ...
- 观察Linux进程 线程的异步并发执行,操作系统linux版实验报告.doc
操作系统linux版实验报告.doc (29页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 操作系统实验报告(Linux版)网络142 ...
- 西工大计算机操作系统实验报告,西工大计算机操作系统课程设计实验报告bh05xh5...
<西工大计算机操作系统课程设计实验报告bh05xh5>由会员分享,可在线阅读,更多相关<西工大计算机操作系统课程设计实验报告bh05xh5(7页珍藏版)>请在人人文库网上搜索. ...
- 计算机操作系统存储管理实验报告,《操作系统》存储管理实验报告
<操作系统>存储管理实验报告 ____大学____学院实验报告课程名称: 计算机操作系统 实验名称: 存储管理实验 实验日期: 班级: 姓名: 学号: 仪器编号: XX 实验报告要求:1. ...
- 大学计算机实验教程实验报告2.2,大学计算机实验2-实验报告.pdf
大学计算机实验2-实验报告 深 圳 大 学 实 验 报 告 课程名称: 计算机导论 实验名称: 操作系统与工具软件 学院: 建筑与城市规划学院 专业: 建筑学 报告人: XXX 学号: 2015XXX ...
- 计算机网络实验设计应用题,计算机网络实验三实验报告.doc
计算机网络实验三实验报告 实验综合成绩 (百分制) 实验评阅教师签名其中实验态度优良中及格不及格实验报告优良中及格不及格 实 验 报 告 实验时间: 2015年 12 月 24日 实验运行环境 win ...
- 计算机网络实验ifconfig,《计算机网络》操作系统网络配置实验.doc
文档介绍: 实验序号: 2 <计算机网络> 实验报告 说明 一.排版要求 实验报告"文件名"按模板要求填写. 例:<计算机网络>实验报告_10网络1班_02 ...
- 北邮计算机网络实践第四次实验,北邮计算机网络技术实践实验四实验报告.doc...
北邮计算机网络技术实践实验四实验报告 计算机网络技术实践实验报告 实验名称:基本交换机使用及VLAN设置 姓 名:胡春月 实验日期: 2015.05.05 学 号:2012211508 实验报告日期: ...
最新文章
- python那么慢为什么还有人用-Python执行效率慢,为什么还这么火?【黑马程序员】...
- 小程序音视频能力技术负责人解读“小程序直播”
- 创新工场董事长兼首席执行官 李开复 发 言 稿
- 硬件——STM32 , 录音
- 如何构建AI驱动型智能服务?
- React native 第三方组件 React native swiper
- java处理超大csv文件_比较 csv 文件中数据差异
- 暑假第二周总结(2018.7.16——7.22)
- 库克终于承认:苹果滞销因iPhone价高,连累财报即将降价促销
- CloudEra Hadoop VMWare单节点环境设置
- 我用超白痴的方法解出了这道题,大家有没有更好的方法
- 【京东助手】滑稽东试用助手 V1.6.0
- TM1638数码管显示板(8数码管+16按键)单片机C语言驱动程序(显示功能)
- 自定义View学习之玩转字体变色
- 小米平板2装win10(附驱动)
- Java小白 学习笔记(三)——面向对象
- voc旋转标注数据转dota类型
- jquery+jplayer实现歌词同步的mp3音乐播放器效果
- 苹果官方指南:Cocoa框架(1)
- 利用USRP探索软件无线电(2)