操作系统课程设计报告Word下载.docx
- 文档编号:15244129
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:29
- 大小:265.39KB
操作系统课程设计报告Word下载.docx
《操作系统课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
进程与线程管理功能完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。
进程与线程管理功能
基本要求:
完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。
提高要求:
(增加1项就予以加分)
(1)实现多种线程调度算法;
(2)通过“公共信箱”进行通信的机制,规定每一封信的大小为128字节,实现两个用户进程之间通过这个“公共信箱”进行通信。
(3)实现多用户进程并发的虚拟内存管理功能。
(4)实现用户进程间通信功能,并用生产者/消费者问题测试进程间通信功能的正确性。
(5)实现改进型Clock页面置换算法。
(6)实现Cache功能,采用FIFO替换算法。
2.扩展内容
实现多种线程调度算法:
时间片轮转调度算法
4、人员分工
优先级调度算法:
钟德新,莫友芝
时间片轮转调度算法:
张德华,袁马龙
设计报告由小组队员共同完成。
小组成员设计的代码分工如下:
钟德新编写的代码:
voidPrinft(){
PCB*p;
system("
cls"
);
//清屏
p=run;
//运行队列
if(p!
=NULL)
{
p->
next=NULL;
}
cout<
<
"
当前正在运行的进程:
endl;
进程名称"
\t"
优先数"
还需要时间"
已运行时间"
状态:
while(p!
p->
procname<
\t\t"
pri<
needOftime<
runtime<
state<
p=p->
next;
endl<
当前的就绪队列:
p=ready;
//就绪队列
当前已经完成的进程:
//终止队列
p=finish;
}
这个函数是优先级调度算法程序的界面函数,主要为程序运行时能够直观的显示结果
voidinsert(PCB*p)
{
PCB*S1,*S2;
if(ready==NULL)//判断队列是否为空
next=NULL;
ready=p;
//插入就绪队列
}else{
S1=ready;
S2=S1;
while(S1!
{
if(S1->
pri>
=p->
pri)//判断优先级大小
{
S2=S1;
//置换位置
S1=S1->
}else{
break;
//跳出循环
}
}
if(S2->
pri)
S2->
next=p;
p->
next=S1;
}else{
next=ready;
ready=p;
}
这是程序优先级排序的函数,也是优先级调度算法的核心思想函数,对程序的优先级通过指针进行排序,再将队首的程序调入运行队列,通过置换的方法,将运行队列队首即占用CPU的程序调入就绪队列,如此循环直至所有程序终止为止。
莫友芝编写的代码:
voidpriority()
run=ready;
ready=ready->
run->
state="
运行"
;
while(run!
=NULL)/*当运行队列不空时,有进程正在运行*/
Dtime(3);
//调用延时函数,延时3秒
run->
runtime=run->
runtime+1;
//运行时间+1
needOftime=run->
needOftime-1;
//完成需要时间-1
pri=run->
pri-1;
/*//优先级-1每运行一次优先数降低1个单位*/
if(run->
needOftime==0)/*如所需时间为0将其插入完成队列*/
run->
完成"
next=finish;
finish=run;
run=NULL;
/*运行队列头指针为空*/
if(ready!
=NULL)/*如就绪队列不空*/
run=ready;
run->
ready=ready->
}elseif((ready!
=NULL)&
&
(run->
pri<
ready->
pri)){//就绪队列不为空,就绪队列队首优先级大于运行队列队首
state="
就绪"
insert(run);
//运行中的进程重新比较优先级大小
run=ready;
//对队列队首的进程调入CPU
ready=ready->
Prinft();
/*输出进程PCB信息*/
}
这是程序运行时的实时程序,通过循环的方法在程序等候3秒后,调用德新设计的优先级排序算法,进行排序。
voidCTProcessOfPri()//创建进程
{
PCB*Node;
stringc[5]={"
P1"
"
P2"
P3"
P4"
P5"
};
//模拟设计5条进程
srand((int)time(0));
//设置随机种子
for(intj=0;
j<
5;
j++)
{
Node=newPCB;
if(Node==NULL)
{
return;
}else{
Node->
procname=c[j];
//为进程名赋值
needOftime=1+(int)(15.0*rand()/(RAND_MAX+1.0));
//为进程随机分配占用CPU时间.
runtime=0;
//为运行时间赋值
state="
//设置初始状态为“就绪”状态
pri=1+(int)(20.0*rand()/(RAND_MAX+1.0));
//为进程随机分配优先数.
}
insert(Node);
//出入就行队列
随机创建5个模拟程序,为其赋上初值后,调用优先级排序函数,进行第一次排序
张德华编写的程序代码:
voidinsert(PCB*p){//时间片插入函数
if(start->
next==NULL){
PCB*q=start;
if(p->
Arrive_time<
q->
Arrive_time){
start=p;
next=q;
q->
end=q;
next=p;
end=p;
}else{
PCB*s=start->
while(s!
=NULL){
if(q->
Arrive_time>
p->
Arrive_time){
start=p;
if(s->
q->
p->
next=s;
return;
}else{
q=q->
s=s->
}
s->
end=p;
这个是时间片插入函数,也是轮转调度模拟程序的核心函数,首先对到达时间进行排序,将队首调入CPU后,运行时间片的时间后,调入就绪队列队尾,等候下一次的资源.
voidfirstin(){//将就绪队列的第一个进程放入运行队列
run=start;
State='
W'
//改变其状态
start=start->
模拟占用CPU的函数
voidshow(PCB*p)//输出函数
进程名"
到达时间"
剩余时间"
状态\n"
//
if(run!
=NULL)//如果运行指针不为空,就输出当前正在运行的进程的PCB
{cout<
name<
Need_time<
State<
\n\n"
这是一个程序初始值的输出函数,验证输入的各程序的初始值是否是预期输入
袁马龙编写的代码:
voidcreate()//时间片算法创建进程函数
co
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 报告