10操作系统实验报告Word格式.docx
- 文档编号:22179755
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:38
- 大小:99.16KB
10操作系统实验报告Word格式.docx
《10操作系统实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《10操作系统实验报告Word格式.docx(38页珍藏版)》请在冰豆网上搜索。
假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池;
只要缓冲池未空,消费者可从缓冲池取走一个消息。
功能要求:
根据进程同步机制,编写一个解决上述问题的演示程序,可显示缓冲池状态、放数据、取数据等过程。
三、编程工具:
C、Java、VC或其它可视化语言
平台任选
四、具体设计要求及有关说明
1.有3个生产者进程,分别为P1、P2和P3;
2.有4个消费者进程,分别是C1、C2、C3和C4;
3.缓冲区单元个数N=15;
4.不同的生产进程可生产不同的产品(比如字母、数字、符号);
不同的消费进程可有不同的消费方式(比如“显示”、“打印”、“拼接成字符串”、“改变大小写”等)。
自己可任意定义。
算法实现:
#include<
stdio.h>
string.h>
voidmain()
{
int
full=0;
//用于判断缓冲池是否为满
emputy=15;
//用于判断缓冲池时候为空
charbuffer[15][10];
//用于存放产品
charch[10];
//用于接收生产的产品和消费的产品
i=0,j=0;
num;
number;
numb;
printf("
----------------------------------产品使用说明-------------------------------\n"
);
1生产者生产产品\n"
2消费者消费产品\n"
3生产字母产品\n"
4生产数字产品\n"
5生产符号产品\n"
6消费方式(显示)\n"
7消费方式(打印)\n"
8消费方式(全部变成小写)\n"
9消费方式(全部变成大写)\n"
-----------------------------------------------------------------------------\n"
while(true)
请输入1或者2进行生产或消费:
"
scanf("
%d"
&
num);
if(num==1)
//当num为1的时候,生产者生产产品
请输入3或者4或者5生产不同的产品:
//当number为3时生产字符,为4时生产数字,为5时生产字符
number);
//以下生产字符
if(number==3)
if(full==15)
产品已满!
\n"
}
if(full<
15)
请输入生产的产品:
%s"
ch);
for(j=0;
j<
sizeof(ch);
j++)
buffer[i][j]=ch[j];
j++;
buffer[i][j]='
\0'
;
i++;
full++;
emputy--;
产品生产成功!
产品为:
%s\n"
buffer[i-1]);
}//if(number==3)结束
//以下生产数字
if(number==4)
}//if(number==4)结束
if(number==5)
}//if(number==5)结束
}//if(num==1)结束
if(num==2)
//当num为2时,消费者消费产品
请输入6或者7或者8或者9选择不同消费方式:
//当numb为6时显示,为7时打印,为8时转换成小写,为9时转换成大写
numb);
//以下为显示消费模式
if(numb==6)
if(emputy<
i--;
emputy++;
full--;
消费成功!
显示:
buffer[i]);
else
产品为空!
}//if(numb==6)结束
//以下为打印消费模式
if(numb==7)
打印:
}//if(numb==7)结束
//以下为转换成小写消费模式
if(numb==8)
转换成小写:
strlwr(buffer[i]));
}//if(numb==8)结束
//以下为转换成大写消费模式
if(numb==9)
转换成大写:
strupr(buffer[i]));
}//if(numb==9)结束
}//if(num==2)结束
}//while结束
}//main()结束
实验结果:
《操作系统》课程实验
(二)
—进程管理和调度的算法实现
一、实验目的
进程调度是处理机管理的核心内容。
本设计要求用高级语言编写和调试一个简单的进程调度程序。
通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先权调度算法和时间片轮转调度算法的具体实施办法。
二、实验内容
1.设计进程控制块PCB表结构,分别适用于优先权调度算法和时间片轮转调度算法。
2.PCB结构包括以下信息:
进程名、进程优先数(或轮转时间片),进程所占用的CPU时间,进程的状态,当前队列指针等。
根据调度算法的不同,PCB结构的内容可以作适当的增删。
3.建立进程就绪队列。
对两种不同算法编制入链子程序。
4.编制两种进程调度算法:
a)优先数调度;
b)时间片轮转调度。
允许用户在程序运行时选择使用某一种调度算法。
选用优先数算法和简单时间片轮转法对五个进程进行调度,每个进程可有三种状态:
运行状态(RUN)、就绪状态(READY)和完成状态。
并假定初始状态为就绪状态。
1.设计进程控制块PCB结构如下:
NAME//进程标识符;
PRIO/ROUND//PRIO表示进程优先数,ROUND表示进程轮转时间片大小;
CPUTIME//进程占用CPU时间;
COUNT//计数器;
NEEDTIME/进程到完成还要的CPU时间;
STATE//进程的状态;
NEXT//链指针
2.进程控制块链结构如图所示。
其中:
RUN——当前运行进程指针;
READY——就绪队列头指针;
TAIL——就绪队列尾指针;
FINISH——完成队列头指针。
为了便于处理,程序中进程的运行时间以时间片为单位计算。
各进程的优先数或轮转时间片数以及进程需运行的时间片数的初值均由用户给定。
3.程序说明:
a)在优先数算法中,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。
在轮转法中,采用固定时间片,时间片数为2,进程每执行一次,CPU时间片数加2,进程还需要的时间片数减2,并排到就绪队列的尾上。
b)程序结构说明如下:
整个程序由CREATE,FIRSTIN,INSERT1,INSERT2,PRINT,PRISCH和ROUNDSCH过程组成。
CREATE的功能是创建新的进程,即创立进程的PCB,并将此PCB链入到就绪队列中去。
FIRSTIN的功能是将就绪队列中的第一个进程投入运行。
INSERT1的功能是把还未完成且优先数小于别的进程PCB按进程优先数的顺序插入到就绪队列中。
INSERT2是轮转法使用的过程,将执行了一个单位时间片数(为2)且还未完成的进程的PCB插入到就绪队列的队尾。
PRINT打印每执行一次后的所有进程的状态,这里,就绪(等待)用“W”代表。
PRISCH按优先数算法调度进程。
ROUNDSCH按时间片轮转法调度进程。
c)主程序中定义了PCB的结构和其它变量NUMBER——进程数,ALGO为10个字符长的字符串,存放要求输入的算法的名,输入“PRIORITY”表示调用优先数算法,输入“ROUNDROBIN”表示调用循环轮转法,要求用户在程序运行时输入其中的一个。
算法实现:
#include"
iostream"
string"
cstring"
iomanip"
usingnamespacestd;
#defineN50
//函数声明
voidCREATE();
voidINSERT1(structPCB*,int);
voidINSERT2(structPCB*);
voidINSERT3(structPCB*);
voidFIRSTIN();
voidPRISCH();
voidROUNDSCH();
voidPRINT();
//定义进程PCB
structPCB{
charNAME[N];
intPRIO;
intROUND;
intCPUTIME;
intCOUNT;
intNEEDTIME;
charSTATE;
structPCB*NEXT;
};
structPCB*READY,*TAIL,*RUN,*FINISH;
intnumber;
stringALGO;
//主函数
intmain(){
stringname;
intj=0;
READY=NULL;
TAIL=NULL;
RUN=NULL;
FINISH=NULL;
//初始化各队列
loop:
cout<
<
******************************"
endl;
*进程管理与调度*"
*·
PRIORITY(优先数法)*"
ROUNDROBIN(轮转法)*"
EXIT(退出)*"
请输入其中一个选择的名称:
cin>
>
ALGO;
if(ALGO=="
priority"
||ALGO=="
PRIORITY"
roundrobin"
ROUNDROBIN"
){
CREATE();
//创建进程PCB
cin.get();
//吸收回车符
)
PRISCH();
//按优先数法调度进程
elseROUNDSCH();
//按时间片轮转法调度进程
}
elseif(ALGO=="
exit"
EXIT"
退出程序!
exit(0);
//退出程序
else{
endl<
输入错误!
请重新输入..."
gotoloop;
//重新去到选择界面
return0;
}
//按优先数大小将进程插入到队列
voidINSERT1(structPCB*q,intprio){
structPCB*pt;
if(READY->
PRIO<
prio){
q->
NEXT=READY;
READY=q;
pt=READY;
while(pt->
NEXT!
=NULL&
&
pt->
NEXT->
PRIO>
=prio){
pt=pt->
NEXT;
if(pt->
NEXT==NULL){
pt->
NEXT=q;
TAIL=q;
NEXT=NULL;
NEXT=pt->
//按顺序将进程插入到队列队尾
voidINSERT2(structPCB*q){
=NULL){
//TAIL=q->
//按顺序将进程插入到完成队列队尾
voidINSERT3(structPCB*q){
if(FINISH!
pt=FINISH;
NEXT=FINISH;
FINISH=q;
FINISH->
//创建进程PCB
voidCREATE(){
structPCB*p;
inti;
charname[N];
intprio;
intround;
intneedtime;
intcputime;
请输入进程的数量:
//按优先数创建进程
intk=0;
for(i=0;
i<
i++){
p=(structPCB*)malloc(sizeof(structPCB));
请输入进程"
i+1<
名称(以'
#'
结束):
for(k=0;
k<
N;
k++){
name[k];
if(name[k]=='
)break;
name[k]='
strcpy(p->
NAME,name);
请输入进程优先数:
prio;
p->
PRIO=prio;
请输入进程需要CPU时间:
needtime;
NEEDTIME=needtime;
进程运行一次占用CPU时间:
cputime;
CPUTIME=cputime;
COUNT=0;
STATE='
W'
if(READY!
=NULL)INSERT1(p,p->
PRIO);
READY=p;
READY->
TAIL=p;
//按时间片创建进程
请输入进程轮转时间片数:
round;
ROUND=round;
CPUTIME=round;
=NULL)INSERT2(p);
//将就绪队列第一个进程投入运行
voidFIRSTIN(){
RUN=READY;
RUN->
R'
READY=READY->
//打印进程信息
voidPRINT(){
setw(12)<
name"
setw(10)<
count"
cputime"
needtime"
setw(9)<
prio"
state"
if(RUN!
RUN->
NAME<
COUNT<
setw(8)<
CPUTIME<
setw(11)<
NEEDTIME;
STATE<
while(pt!
round"
RUN-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 操作系统 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)