实验三:进程调度算法实验
(2012-07-27 14:21:41)
标签:
操作系统进程调度实验it |
分类: 操作系统 |
进程调度算法实验
设有两个并发执行的父子进程,不断循环输出各自进程号、优先数和调度策略。进程初始调度策略均为系统默认策略和默认优先级。当父进程收到SIGINT信号时会自动将其优先数加1,子进程收到SIGTSTP信号时会自动将其优先数减1。
请编程实现以上功能。
实验目的:
加深对进程调度概念的理解,体验进程调度机制的功能,了解Linux系统中进程调度策略的使用方法。练习进程调度算法的编程和调试技术。
硬件环境:
CPU:
软件环境:
Linux
gcc
vi
实验步骤:
1、问题分析
建立一个父进程和一个子进程。通过第一章学习的进程控制相互发送信号。当按下Ctrl+C时,父进程实现优先级加1.
当按下Ctrl+Z时,子进程实现优先级减1.
2、算法设计说明如下:
用signal系统调用
将父进程注册一个本进程处理SIGINT的实现优先级加1的函数
3、开发调试过程:
新建一个文件夹,在该文件夹中建立以下名为pctl.c的C语言程序。
编译执行
4、结论分析与体会:
1
SCHED_OTHER
SCHED_FIFO
SCHED_RR
2如何实现教材中讲解的进程调度效果的。
进程调度本质就是让谁先执行,让谁后执行。在真实的操作系统中,由调度策略和优先级决定谁先执行。
Linux的调度策略有三种,SCHED_OTHER
后两种专用于对响应时间有特殊要求的进程,并且会抢先于SCHED_OTHER调度策略的进程而执行。
通过这个系统调用设置进程调度策略,
int
静态优先级与调度策略有关。动态优先级
prio
源代码
Psched.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef
void
//+1
setpriority(PRIO_PROCESS,
}
void
//-1
setpriority(PRIO_PROCESS,
}
void
int
{
int
int
struct
//signal(SIGINT,
//signal(SIGTSTP,
for(i=0;
//取进程优先数放在调度策略数据结构中
p[i].sched_priority
}
pid
if(pid
}
else
setpriority(PRIO_PROCESS,
sleep(1);
for(i
printf("parent
//
if(i
printf("父进程挂起,按
pause();
// }
sleep(1);
}
}
//各子进程循环报告其优先数和调度策略
else{
setpriority(PRIO_PROCESS,
sleep(1);
//每隔
for(i=0;
printf("Child
//if(i
printf("子进程挂起,按
pause();
//}
sleep(1);
}
exit(
}
return
}