山大操作系统实验3

2020-03-03 08:38:17 来源:范文大全收藏下载本文

进程调度算法实验

张咪 软件四班

一、实验要求

设有两个并发执行的父子进程,不断循环输出各自进程号、优先数和调度策略。进程初始调度策略均为系统默认策略和默认优先级。当某个进程收到SIGINT信号时会自动将其优先数加1,收到SIGTSTP信号时会自动将其优先数减1。请编程实现以上功能。

二、实验目的

加深对进程调度概念的理解,体验进程调度机制的功能,了解Linux系统中进程调度策略的使用方法。练习进程调度算法的编程和调试技术。

三、实验环境

实验环境均为Linux操作系统,开发工具为gcc和g++。

四、实验思路

建立一个父进程和一个子进程,用signal系统调用,父进程收到ctrl+c的SIGINT信号时,执行优先级加一的函数 ,子进程收到ctrl+z的SIGSTP信号时,执行优先级减1的函数,我认为这样能更好的加深对进程调度概念的理解

。当按下Ctrl+Z时,子进程做出响应,其优先级减1;当按下Ctrl+C时,父进程做出响应,父进程优先级加1.然后再输出各自进程号、优先数和调度策略。通过for()语句循环,执行十次后退出进程。

五、实验过程

新建一个文件夹,在该文件夹中建立以下名为psched.c的C语言程序。 编写代码 ,保存。

输入gcc psched.c命令, 生成默认的可执行文件a.out。 执行a.out:。

执行并调试psched程序。

六、调试及实验结果

1、一开始对于父(子)进程获得ctrl+c(ctrl+z)信号后的处理只有一句signal(SIGINT,(sighandler_t)ctrlc)或signal(SIGTSTP,(sighandler_t)ctrlz),认为不用声明对于ctrl+z(ctrl+c)的反应父(子)进程就不会对SIGTSTP(SIGINT)信号做处理,然而进程执行结果一次ctrl+c后就退出了。

要想实现:父进程获得Ctrl+C信号后进程优先号加一,对Ctrl+Z信号不作处理;子进程获得Ctrl+Z信号后进程优先号减一,对Ctrl+C信号不作处理。要在父进程执行的代码中设置对SIGINT执行ctrlc()函数,对SIGTSTP执行nothing()函数(即不作为);在子进程执行的代码中对SIGINT执行nothing()函数(即不作为),对SIGTSPT执行ctrlz()函数。

2、编译成功后,却只能实现按ctrl+c优先数加一的功能,一直无法实现按ctrl+z优先数减一的功能。

未成功运行的结果:

经过多次修改调试代码始终无法实现将优先数减少的功能,查阅资料发现不是代码的问题,而是需要在root模式下才能实现减少优先级的操作。 在终端上输入$su root命令行和密码,进入root模式。

成功运行的结果:

七、心得体会

1、进程调度本质就是让谁先执行,让谁后执行。在真实的操作系统中,由调度策略和优先级决定谁先执行。

2、通过这个系统调用设置进程调度策略, int sched_setscheduler(pid_t pid,int policy,const struct sched_param *sp); 其中pid是进程号policy 是3种调度策略之一,sp调度参数结构指针,调度参数结构主要存有调度优先数 。

3、进程优先数(prio)由静态优先级和动态优先级两部分组成。静态优先级与调度策略有关。动态优先级

由以下系统调用设置,

int setpriority(int which,int who,int prio); 优先调度算法总是把处理机分配给就绪队列中具有最高优先权的进程。

4、想要实现对进程优先号的减操作,要获取root权限。

八、源代码

#include #include #include #include #include #include #include #include #include

typedef void(*sighandler_t)(int);

void ctrlc(){//按ctrl+c,优先级加1

setpriority(PRIO_PROCESS,getpid(),getpriority(PRIO_PROCESS,0)+1); }

void ctrlz(){//按ctrl+z,优先级减1

setpriority(PRIO_PROCESS,getpid(),getpriority(PRIO_PROCESS,0)-1); }

void nothing(){};

int main(int argc,char *argv[]){

struct sched_param p[2]; int i,j,status;

int pid;

for(i=0;i

}

pid=fork();

if(pid

else if(pid>0){ signal(SIGINT,(sighandler_t)ctrlc); signal(SIGTSTP,(sighandler_t)nothing); sched_setscheduler(getpid(),SCHED_OTHER,&p[0]); setpriority(PRIO_PROCESS,getpid(),10); sleep(1); for(i=0;i

printf(\"parent PID=%d,priority=%d,scheduler=%d\\n\",getpid

(),getpriority(PRIO_PROCESS,0),sched_getscheduler(getpid()));

printf(\"父进程挂起,按 Ctrl + C 为其优先数加一\\n\");

pause();

sleep(1); //每隔 1 秒报告一次进程号和优先级

}//for循环

} //父进程

else{ signal(SIGTSTP,(sighandler_t)ctrlz);

signal(SIGINT,(sighandler_t)nothing); sched_setscheduler(getpid(),SCHED_OTHER,&p[1]); setpriority(PRIO_PROCESS,getpid(),5); sleep(1); for(i=0;i

printf(\"child PID=%d,priority=%d,scheduler=%d\\n\",getpid(),getpriority(PRIO_PROCESS,0),sched_getscheduler(getpid()));

printf(\"子进程挂起,按 Ctrl + Z 为其优先数减一\\n\");

pause();

sleep(1); //每隔 1 妙报告一次进程号和优先级

}//for循环

exit(EXIT_SUCCESS);

}//子进程

return EXIT_SUCCESS; }

操作系统实验

操作系统实验十

操作系统实验体会

《操作系统》实验指导书

操作系统实验六

操作系统实验总结

操作系统课程设计3

山大物化实验燃烧热

网络操作系统实验教案

西工大操作系统实验2

《山大操作系统实验3.doc》
山大操作系统实验3
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档
下载全文