软件学院实验报告
实验题目:进程调度算法实验
1.实验目标:
加深对进程调度概念的理解,体验进程调度机制的功能,了解 Linux 系
统中进程调度策略的使用方法。 练习进程调度算法的编程和调试技术。
2.实验环境
硬件环境: PC
软件环境:linux
3、对进程调度的进一步理解
linux 内核的三种调度方法:
1,SCHED_OTHER 分时调度策略,
2,SCHED_FIFO 实时调度策略,先到先服务
3,SCHED_RR 实时调度策略,时间片轮转
实时进程将得到优先调用,实时进程根据实时优先级决定调度权
值,分时进程则通过 nice 和 counter 值决定权值,nice 越小,counter
越大,被调度的概率越大,也就是曾经使用了 cpu 最少的进程将会得
到优先调度。
SHCED_RR 和 SCHED_FIFO 的不同:
当采用 SHCED_RR 策略的进程的时间片用完,系统将重新分配时
间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的
RR 任务的调度公平。
SCHED_FIFO 一旦占用 cpu 则一直运行。一直运行直到有更高优
先级任务到达或自己放弃。
如果有相同优先级的实时进程(根据优先级计算的调度权值是一
样的)已经准备好,FIFO 时必须等待该进程主动放弃后才可以运行
这个优先级相同的任务。而 RR 可以让每个任务都执行一段时间。
4.源代码注释
1、书写实验代码,放在名为 psched.c 的文件中,代码如下:
#include
#include
#include
#include
#include
# include
typedef void (*sighandler_t)(int);
void jia(){
printf("\n%d 进程优先数增加 1\n",getpid());
setpriority(PRIO_PROCESS,getpid(),getpriority(PRIO_PROCESS,getpi
d())+1);
}
void jian(){
printf("\n%d 进程优先数减小 1\n",getpid());
setpriority(PRIO_PROCESS,getpid(),getpriority(PRIO_PROCESS,getpi
d())-1);
}
int main(int argc, char *argv[])
{
printf("您可以用 ctrl+c 发出 SIGINT 信号。\n");
printf("
用 ctrl+z 发出 SIGTSTP 信号。\n");
signal(SIGINT,(sighandler_t)jia);
signal(SIGTSTP,(sighandler_t)jian);
int i,j,status;
int pid;
struct sched_param p[2]; //设置调度策略时使用的数据结构
if((pid=fork()) >0)
{
signal(SIGTSTP,SIG_IGN);
sleep(1);
for(i=0; i<100; i++)
{
printf("Parent
PID
=
%d
priority
=%d
scheduler=%d\n",getpid(),getpriority(PRIO_PROCESS,getpid()),sche
d_getscheduler(getpid()));
sleep(3);
}
}
else{
sleep(3);
signal(SIGINT,SIG_IGN);
for(i=0; i<100; i++)
{
printf("Child
PID
=
%d
priority
=%d
scheduler=%d\n",getpid(),getpriority(PRIO_PROCESS,getpid()),sche
d_getscheduler(getpid()));
sleep(3);
}
}
return EXIT_SUCCESS;
}
5.调试及运行
1、 在终端里面输入 make 命令,执行编译和链接
2、 改变到 root 用户
$ su
口令:(输入root口令)
2、输入./psched 运行程序,运行的一次结果为:
root@ckp-laptop:/home/ckp/桌面/ckp/shiyan3/shiyan# ./psched
您可以用 ctrl+c 发出 SIGINT 信号。
用 ctrl+z 发出 SIGTSTP 信号。
Parent PID = 1615 priority =0 scheduler=0
Child PID = 1616 priority =0 scheduler=0
^C
1615 进程优先数增加 1
Parent PID = 1615 priority =1 scheduler=0
Child PID = 1616 priority =0 scheduler=0
Parent PID = 1615 priority =1 scheduler=0
^C
1615 进程优先数增加 1
Parent PID = 1615 priority =2 scheduler=0
^C
1615 进程优先数增加 1
Parent PID = 1615 priority =3 scheduler=0
Child PID = 1616 priority =0 scheduler=0
^Z
1616 进程优先数减小 1
Child PID = 1616 priority =-1 scheduler=0
^Z
1616 进程优先数减小 1
Child PID = 1616 priority =-2 scheduler=0
Parent PID = 1615 priority =3 scheduler=0
Child PID = 1616 priority =-2 scheduler=0
Parent PID = 1615 priority =3 scheduler=0
Child PID = 1616 priority =-2 scheduler=0
……
6.结论分析与体会
通过这次试验我发现在今后的实验中还需要自己多多的看这方面的知
识,扩宽自己的视野,这样才会对操作系统有一个更深的理解。在对操作
系统的理解和实现方面自己仍需努力!