加载中…
个人资料
快乐年华
快乐年华
  • 博客等级:
  • 博客积分:0
  • 博客访问:368
  • 关注人气:19
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

实验三:进程调度算法实验

(2012-07-27 14:21:41)
标签:

操作系统

进程调度

实验

it

分类: 操作系统

进程调度算法实验

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

请编程实现以上功能。 

 

实验目的

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

 

 

硬件环境:  

CPU:  P4/1.8MHz   内存:256MB  硬盘:  10GB 

 

软件环境:   

Linux 操作系统    

gcc version 4.1.2  

vi 3.1.2 

 

实验步骤:  

1、问题分析 

建立一个父进程和一个子进程。通过第一章学习的进程控制相互发送信号。当按下Ctrl+C时,父进程实现优先级加1.

当按下Ctrl+Z时,子进程实现优先级1.

2、算法设计说明如下: 

signal系统调用

将父进程注册一个本进程处理SIGINT的实现优先级加1的函数 。子进程注册一个本进程处理SIGTSTP的实现优先级减1的函数 当按下Ctrl+Z时,子进程做出响应,其优先级减1;当按下Ctrl+C时,父进程做出响应,父进程优先级加1.然后再输出各自进程号、优先数和调度策略。以上行为通过for()语句循环。

3、开发调试过程:

新建一个文件夹,在该文件夹中建立以下名为pctl.cC语言程序 

编译执行

 

4、结论分析与体会:

进程调度调度策略和功能如下所示

SCHED_OTHER  默认的分时调度策略(值等于0)   

SCHED_FIFO  先进先先出调度策略(值等于1)  

SCHED_RR    时间片轮转调度策略(值等于2) 

2如何实现教材中讲解的进程调度效果的。

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

Linux的调度策略有三种,SCHED_OTHER 分时调度,SCHED_FIFO 先进先出,SCHED_RR 时间片轮转。 

后两种专用于对响应时间有特殊要求的进程,并且会抢先于SCHED_OTHER调度策略的进程而执行。

通过这个系统调用设置进程调度策略, 

int sched_setscheduler(pid_t pid,int policy,const struct sched_param *sp); 其中pid是进程号,policy 是以上说明的3种调度策略之一,sp调度参数结构指针,调度参数结构主要存有调度优先数 

 进程优先数(prio)由静态优先级和动态优先级两部分组成。

静态优先级与调度策略有关。动态优先级  由以下系统调用设置,  int setpriority(int which,int who,int prio); 

    which  设置的对象。可以是

              进程  PRIO_PROCESS 

             进程组  PRIO_PGRP 

              用户  PRIO_USER 

    who    对应设置对象的进程号或组号或用户号 

prio   要设置的进程优先数   

 

源代码

Psched.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 i,j,status;

int pid; //存放进程号

struct sched_param p[2]; //设置调度策略时使用的数据结构

//signal(SIGINT, (sighandler_t)sigcat);

//signal(SIGTSTP, (sighandler_t)sigzat);

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);

    signal(SIGTSTP, (sighandler_t)nothing);

    sched_setscheduler(getpid(), SCHED_OTHER, &p[0]);

setpriority(PRIO_PROCESS, getpid(), 10);

sleep(1);

for(i 0; 10; i++){

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

// if(i == 2) {

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

pause();

// }

sleep(1);

}

}

//各子进程循环报告其优先数和调度策略

else{

    signal(SIGTSTP, (sighandler_t)sigzat);

    signal(SIGINT, (sighandler_t)nothing);

    sched_setscheduler(getpid(), SCHED_OTHER, &p[1]);

setpriority(PRIO_PROCESS, getpid(), 10);

sleep(1);

//每隔 妙报告一次进程号和优先级

for(i=0; i<10; i++){

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

//if(i == 1) {

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

pause();

//}

sleep(1);

}

exit( EXIT_SUCCESS);

}

return EXIT_SUCCESS;

}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有