linux实验进程管理时间片轮转和管道分析.docx
《linux实验进程管理时间片轮转和管道分析.docx》由会员分享,可在线阅读,更多相关《linux实验进程管理时间片轮转和管道分析.docx(10页珍藏版)》请在冰豆网上搜索。
linux实验进程管理时间片轮转和管道分析
实验二:
进程管理
实验学时:
2学时
实验类型:
设计
实验要求:
必修
一、实验目的
本实习模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作原理。
了解终端访问进程的linux命令,掌握Linux下进程创建、撤销;了解linux下进程之间的族亲关系;掌握Linux系统基于无名管道(终端、系统调用)通信方法。
二、实验内容
(一)编程实现调度算法,实现处理器调度。
1.设计一个按优先数调度算法实现处理器调度的程序。
(单号)
2.设计一个按时间片轮转法实现处理器调度的程序。
(双号)
注:
以上算法选择一个实现。
(二)Linux管道通信:
内容1、解释ps -aux | grep ivr_tr 的执行结果
----------------------------------------------------
内容2、终端命令:
无名管道“|”
题目1:
如何一个屏幕一个屏幕地查看/etc目录的内容,并解释其含义:
题目2:
利用一个管道:
列出带有licq字符的RPM包,并解释其含义:
题目3:
利用多个管道:
计算passwd文件中含有“/bin/bash”的行数。
并解释其含义:
三、实验原理、方法和手段
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
采用某种算法合理有效地把处理机分配给进程,其调度算法应尽可能地提高资源利用率,减少处理机的空闲时间。
常用的调度算法有:
先来先服务、时间片轮转、优先级等算法。
本实验要求学生模拟后两种算法。
时间片轮转法是系统把所有就绪进程按先后次序排队,处理机总是优先分配给就绪队列中的第一个就绪进程,并分配它一个固定的时间片。
当该运行进程用完规定的时间片时,被迫释放处理机给下一个处于就绪队列中的第一个进程,并分配给这个进程相同的时间片。
每个运行完时间片的进程,当未遇到阻塞时,就回到就绪队列的尾部,并等待下次轮到它时再投入运行。
因此,只要是处于就绪队列中的进程,按次种算法总可以分得处理机投入运行。
优先级法分为优先占有法和优先剥夺法。
优先占有法的原理是:
一旦某个最高优先级的就绪进程分得处理机之后,只要不是自身的原因被阻塞而不能继续运行时,就一直运行下去,直至运行结束。
优先剥夺法的原理是:
当一个正在运行的进程其时间片未用完时,无论什么时候,只要就绪队列中有一个比它优先级高的进程,优先级高的进程就可以取代目前正在运行的进程,投入运行。
而被剥夺的进程重新回到就绪队列中,等待时机成熟再次投入运行。
这就意味着,无论任何时刻,运行进程的优先级高于或等于就绪队列中的任何一个进程。
本实验中的优先级法采用运行中的进程每运行一个时间片,其优先级减1。
然后按照各进程再次按照新的优先级次序进行调度。
四、实验组织运行要求
该实验采用集中授课形式。
1.学生在进行实验前必须进行充分的预习,熟悉实验内容,写出实验步骤,特别是算法流程;
2.学生严格遵守实验室的各项规章制度,注意人身和设备安全,配合和服从实验室人员管理;
1.教师在学生实验过程中予以必要的辅导,独立完成实验;
2.教师审查、分析学生实验方案和实验结果;
3.综合评定学生的实验成绩。
五、实验条件
实验机器要求安装VisualC++6.0编程平台;实验要求一人一机。
六、实验步骤
(一)时间片轮转法:
设计要求及流程图:
(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。
进程控制块的格式为:
进程名
指针
要求运行时间
已运行时间
状态
其中,进程名——作为进程的标识,假设五个进程的进程名分别为Q1,Q2,Q3,Q4,Q5。
指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。
要求运行时间——假设进程需要运行的单位时间数。
已运行时间——假设进程已经运行的单位时间数,初始值为“0”。
状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。
当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2)每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。
(3)把五个进程按顺序排成循环队列,用指针指出队列连接情况。
另用一标志单元记录轮到运行的进程。
例如,当前轮到P2执行,则有:
标志单元
,
K2
K1
Q1
K2
Q2
K3
Q3
K4
Q4
K5
Q5
K2
K3
K4
K5
K1
2
3
1
2
4
1
0
0
0
0
R
R
R
R
R
PCB1
PCB2
PCB3
PCB4
PCB5
(4)处理器调度总是选择标志单元指示的进程运行。
由于本实习是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:
已运行时间+1
来模拟进程的一次运行,表示进程已经运行过一个单位的时间。
请同学注意:
在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。
在这时省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。
(5)进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。
同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间¹已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。
若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”(E)且退出队列。
此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。
(6)若“就绪”状态的进程队列不为空,则重复上面的(4)和(5)的步骤,直到所有的进程都成为“结束”状态。
(7)在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及运行一次后进程队列的变化。
(8)为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中的进程名以及进程控制块的动态变化过程。
typedefstructPNode{//PCB
structPNode*next;//定义指向下一个节点的指针
charname[10];//定义进程名,并分配空间
intAll_Time;//定义总运行时间
intRuned_Time;//定义已运行时间
charstate;//定义进程状态Ready/End
}*Proc;//指向该PCB的指针
intProcNum;//总进程个数
(2)源代码:
#include
#include
usingnamespacestd;
typedefstructPNode{//PCB
structPNode*next;//定义指向下一个节点的指针
charname[10];//定义进程名,并分配空间
intAll_Time;//定义总运行时间
intRuned_Time;//定义已运行时间
charstate;//定义进程状态Ready/End
}*Proc;//指向该PCB的指针
intProcNum;//总进程个数
//初始化就绪队列
voidInitPCB(Proc&H){
cout<<"请输入总进程个数:
";
cin>>ProcNum;//进程总个数
intNum=ProcNum;
H=(Proc)malloc(sizeof(PNode));//建立头节点
H->next=NULL;
Procp=H;//定义一个指针
cout<<"总进程个数为"<while(Num--){
p=p->next=(Proc)malloc(sizeof(PNode));
cout<<"进程名总运行时间已运行时间:
";
cin>>p->name>>p->All_Time>>p->Runed_Time;
p->state='R';
p->next=NULL;
}
p->next=H->next;
}
//输出运行中的进程信息
voidDispInfo(ProcH){
Procp=H->next;
do{
if(p->state!
='E')//如果该进程的状态不是End的话
{
cout<<"进程名:
"<name<<"\t总运行时间:
"<All_Time
<<"\t已运行时间:
"<Runed_Time
<<"\t状态:
"<state<p=p->next;
}
elsep=p->next;
}while(p!
=H->next);//整个进程链条始终完整,只是状态位有差异
}
//时间片轮转法
voidSJP_Simulator(Proc&H){
cout<intflag=ProcNum;//记录剩余进程数
intround=0;//记录轮转数
Procp=H->next;
while(p->All_Time>p->Runed_Time){//即未结束的进程
round++;
cout<name<<"进程"<p->Runed_Time++;//更改正在运行的进程的已运行时间
DispInfo(H);//输出此时为就绪状态的进程的信息
if(p->All_Time==p->Runed_Time){//并判断该进程是否结束
p->state='E';
flag--;
cout<name<<"进程已运行结束,进程被删除!
\n";
}
p=p->next;
while(flag&&p->All_Time==p->Runed_Time)
p=p->next;//跳过先前已结束的进程
}
cout<}
voidmain(){
ProcH;
InitPCB(H);//数据初始化
DispInfo(H);//输出此刻的进程状态
SJP_Simulator(H);//时间片轮转法
system("pause");
}
(3)程序执行结果:
(二)Linux管道通信:
1、解释ps -aux | grep ivr_tr 的执行结果
解释:
是列出所有进程名中带有ivr_tr字符串的进程
ps-aux列出当前正在运行的所有进程。
然后将输出的结果通过管道传递给后面的grep命令,grep命令过滤出含有"ivr_tr"的行。
2、终端命令:
无名管道“|”
题目1:
如何一个屏幕一个屏幕地查看/etc目录的内容,并解释其含义
解释:
"ls-l/etc|less"试试,就可以按照自己的需求上下翻页来查看了,按“q”可退出。
“|”符号是“Shift+\”产生的。
题目2:
利用一个管道:
列出带有licq(由于没有,使用bin)字符的RPM包,并解释其含义:
解释:
#rpm-qa|grepbin* 这条命令使用一个管道符“|”建立了一个管道。
管道将rpm-qa命令的输出(包括系统中所有安装的RPM包)作为grep命令的输入,从而列出带有licq字符的RPM包来。
题目3:
利用多个管道:
计算passwd文件中含有“/bin/bash”的行数。
并解释其含义:
解释:
#cat/etc/passwd|grep/bin/bash|wc-l
这条命令使用了两个管道,利用第一个管道将cat命令(显示passwd文件的内容)的输出送给grep命令,grep命令找出含有“/bin/bash”的所有行;第二个管道将grep的输入送给wc命令,wc命令统计出输入中的行数。
这个命令的功能在于找出系统中有多少个用户使用bash。
七、思考题
1.比较实验中两个算法的特点及优缺点。
2.操作系统中还有哪些进程调度算法?
请分别进行描述。
.