进程调度实验
实验四 进程调度
一、实验目的
加深对进程调度概念的理解,体验进程调度机制的功能,了解 Linux 系统中进程
调度策略的使用方法。 练习进程调度算法的编程和调试技术。
二、实验内容
设有两个并发执行的父子进程,不断循环输出各自进程号、优先数和调度策
略。进程初始调度策略均为系统默认策略和默认优先级。当父进程收到 SIGINT 信
号时会自动将其优先数加 1,子进程收到 SIGTSTP 信号时会自动将其优先数减 1。
请编程实现以上功能。
三、实验要求
根据以上示例程序和独立实验程序中观察和记录的信息,说明它们反映出操作
系统教材中讲解的哪些进程调度调度策略和功能?在真实的操作系统中它是怎样实
现教材中讲解的进程调度效果的。你对于进程调度的概念哪些新的理解和认识?根
据实验程序、调试过程和结果分析写出实验报告。
四、实验步骤
1) 打开一终端命令行窗体,新建一个文件夹,在该文件夹中建立以下名为wenjian.c的C语言程序,该程序皆为头文件,该程序代码为:#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/types.h>
#include <wait.h>
#include <unistd.h>
#include <signal.h>
typedef void (*sighandler_t)(int);
void sigcat(){
//+1
setpriority(PRIO_PROCESS, getpid(), getpriority(PRIO_PROCESS, 0) + 1);
}
void sigzat(){
//-1
setpriority(PRIO_PROCESS, getpid(), getpriority(PRIO_PROCESS, 0) - 1);
}
void nothing() {}
int main(int argc, char *argv[])
{
int pid; //存放进程号
struct sched_param p[2]; //设置调度策略时使用的数据结构
int i;
for( i=0; i<2;i++){
//取进程优先数放在调度策略数据结构中
p[i].sched_priority = 10;
}
pid = fork();
if(pid < 0){
printf("failed!");
}
else if(pid > 0){
signal(SIGINT, (sighandler_t)sigcat); //-1
signal(SIGTSTP, (sighandler_t)nothing);
sched_setscheduler(getpid(), SCHED_OTHER, &p[0]);
setpriority(PRIO_PROCESS, getpid(), 10);
sleep(2);
//循环报告其优先数和调度策略
while(1){
printf("parent PID = %d, priority = %d, scheduler = %d\n", getpid(),getpriority(PRIO_PROCESS, 0), sched_getscheduler(getpid()));
sleep(4);
}
}
else{
signal(SIGTSTP, (sighandler_t)sigzat);
signal(SIGINT, (sighandler_t)nothing);
sched_setscheduler(getpid(), SCHED_OTHER, &p[1]);
setpriority(PRIO_PROCESS, getpid(), 10);
sleep(2);
///循环报告其优先数和调度策略
while(1){
printf("Child PID = %d priority= %d scheduler = %d\n",getpid(),getpriority(PRIO_PROCESS,0), sched_getscheduler(getpid()));
sleep(4);
}
exit( EXIT_SUCCESS);
}
return EXIT_SUCCESS;
}
2) 输入gcc -c wenjian.c -o wenjian.o命令生成wenjian.o文件
3) 输入gcc wenjian.o -o wenjian生成wenjian执行文件
五、实验结果
1)输入./wenjian
得到下图:
2)进行测试按下Ctrl+c与Ctrl+z
3)无法执行优先数减1,更改代码后再次按照上面步骤依次执行:
六、实验小结
1.了解了进程调度的过程即原理,同时在实验中也意识到一些不太重要的信号量可以去除避免对后面进程响应造成影响
2.在代码几乎没问题的情况下按下ctrl+z 存在无法实现优先数-1的,它仍然保持不变的问题。