进程管理设计

《操作系统》课程设计指导 

-----进程管理设计

2006/6/20  沈奕鹏  管建军

一、设计目的

 (1)加深对进程概念的理解,明确进程和程序的区别。

 (2)进一步认识并发执行的实质。

 (3)分析进程争用资源的现象,学习解决进程互斥的方法。

 (4)了解Linux系统中进程通信的基本原理。

二、设计内容

 1)进程的软中断通信

   ①编制一段程序,使其实现进程的软中断通信。

   要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉

   键盘上来的中断信号(即按DEL);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:

   Child Proeess 1 is Killed by Parent!

   Child Process 2 is Killed by Parent!

   父进程等待两个子进程终止后,输出如下的信息后终止:

   Parent Process is Killed!    

   ②在上面的程序中增加语句signal(SIGINT,SIG_IGN)signal(SIGQUIT,SIG _IGN),观察执行结果,并分析原因。 

 2)进程的管道通信

   编制一段程序,实现进程的管道通信。

   使用系统调用pipe()建立一条管道线;两个子进程P1P2分别向管道各写一句话:

   Child l is sending a message!

   Child 2 is sending a message!

   而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。  

   要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。

三、指导步骤 

 1)进程的软中断通信

   <任务1>

   编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按Del),当捕捉到中断信号后,父进程用系统调用kill() 向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:

   child process l is killed by parent!

   child process 2 is killed by parent!  

    父进程等待两个子进程终止后,输出以下信息后终止:

   parent process is killed!

   (程序)

  

/*e-1-31*/

#include <stdio.h>

#include <signal.h>

#include <unistd.h>

#include <stdio.h>

#include <sys/types.h>

 

int wait_flag;

void stop();

 

main() {

    int pid1,pid2;

 

    signal(3,stop);  //or signal(14,stop);

    while((pid1=fork())==-1);

    if(pid1>0) {

       while((pid2=fork())==-1);

       if(pid2>0) {

           // wait_flag=1;

           sleep(5);

           kill(pid1,16);

           kill(pid2,17);

           wait(0);

           wait(0);

           printf("Parent process is killed !!/n");

           exit(0);

       }

       else {

           // wait_flag=1;

           signal(17,stop);

           printf("Child process 2 is killed by parent !!/n");

           exit(0);

       }

    }

    else {

       // wait_flag=1;

       signal(16,stop);

       printf("Child process 1 is killed by parent !!/n");

       exit(0);

    }

}

 

void stop() {

    wait_flag=0;

}

 

 

   (运行结果)

   child process 1 is killed by parent!

   child process 2 is killed by parent!

   Parent process is killed!

   分析

   (1)上述程序中,实用函数signal()都放在段程序的前面部位,而不是在其他接收信号处。这是因为signal()的执行只是为进程指定信号量1617的作用,以及分配相应的与 stop()过程链接的指针。从而signal()函数必须在程序前面部分执行。

   (2)该程序段前面部分用了两个wait(0),为什么?请读者思考。

   (3)该程序段中每个进程退出时都用了语句exit(0),为什么?请读者思考。

   <任务2>

   在上面任务1,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT, SIG_IGN),观察执行结果,并分析原因。这里signal(SIGINT,SIG_IGN)signal(SIGQUIT,SIG_IGN)分别为忽略'Del'键信号以及忽略中断信号。

   (程序)

  

/*e-1-32*/

#include<unistd.h>

#include<signal.h>

#include<stdio.h>

int pid1,pid2;  

int EndFlag=0;

   //pf1=0;

   //pf2=0;

  void IntDelete()

   {

   kill(pid1,10);

   kill(pid2,12);

   EndFlag=1;

   }

   void Int1()

   {

   printf("child process 1 is killed ! by parent/n");

   exit(0);

   }

   void Int2()

   {

   printf("child process 2 is killed ! by parent/n");

   exit(0);

   }

   waiting()

   { while(EndFlag==0);}

 

   main()

   {

   //int exitpid;

   signal(SIGINT,SIG_IGN);

   signal(SIGQUIT,SIG_IGN);

   while((pid1=fork())==-1);

   if(pid1==0)

   {

   //signal(SIGINT,SIG_IGN);

   signal(10,Int1);

   signal(SIGINT,SIG_IGN);

   pause();

   exit(0);

   }

   else

   {

   while((pid2=fork())==-1);

   if(pid2==0)

   {

   //signal(SIGINT,SIG_IGN);

   signal(12,Int2);

   signal(SIGINT,SIG_IGN);

   pause();

   exit(0);

   }  

   else

   {

   signal(SIGINT,IntDelete);

   //waitpid(-1,&exitcode,0);

   waiting();

   printf("parent process is killed/n");

   exit(0);

   }

   }

   }

   <运行结果>

   请读者将上述程序输入计算机后,执行并观察。

   <分析>  由于忽略了中断与退出信号,程序会直保持阻塞状态而无法退出。

   2)进程的管道通信

   (任务)

   编制一段程序,实现进程的管道通信。使用系统调用pipe()建立一条管道线。两个子进程p1p2分别向管道各写一句话:

   child 1 is sending message!

   child 2 is sending message!

   而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。

   (程序)

  /*e-1-4*/ 

  #include<unistd.h>

   #include<signal.h>

   #include<stdio.h>

   int pid1,pid2;

   main()

   {

   int  fd[2];

   char  OutPipe[100],InPipe[100];

   pipe(fd);

   while((pid1=fork())==-1);

   if(pid1==0)

   {

   lockf(fd[1],1,0);

   sprintf(OutPipe,"child 1 process is sending message!");

   write(fd[1],OutPipe,50);

   sleep(5);

   lockf(fd[1],0,0);

   exit(0);

   }

   else

   {

   while((pid2=fork())==-1); 

   if(pid2==0)

   {

   lockf(fd[1],1,0);

   sprintf(OutPipe,"child 2 proeess is sending message!");

   write(fd[1],OutPipe,50);

   sleep(5);

   lockf(fd[1],0,0);

   exit(0);

   }

   else

   {

   wait(0);

   read(fd[0],InPipe,50);

   printf("%s/n",InPipe);

   wait(0);

   read(fd[0],InPipe,50);

   printf("%s/n",InPipe);

   exit(0);

   }

   }

   }

   (运行结果)

   child 1 is sending message!

   child 2 is sending message!   

   (分析)

   请读者自行完成。

  

二、说明:

1.教材“计算机操作系统教程第二版习题解答与实验指导-张尧学”书,P76实验1中(3)和(4),有多个错误,这正是要求同学进行分析、排错和调试,这也是考核学生的实际动手能力。一定要仔细哦。

2.一定要把自己的所有程序保存在一张软盘上,以供教师检查。

3.课程设计结束,要上交课程设计报告一份和含有程序的软盘一张

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现了如下四种调度算法的模拟: (1)时间片轮转调度 (2)优先数调度 (3)最短进程优先 (4)最短剩余时间优先 模拟过程使用了JProgressBar作为进程状态条,更为直观地观察到每个进程的执行状态。 程序用户说明: 1、在上图标号1处输入要创建随机进程的个数,仅可输入正数,非正数会有相关提示。然后点击标号2处的“创建进程”按钮,随进创建的进程显示在程序界面的中央窗口,如标号3所示。 2、创建好随机进程后,在标号4的单选框选择将要模拟执行的调度算法,然后点击标号5处的“开始模拟”,程序开始执行。标号3的列表会显示相应的调度变化。 3、模拟过程中,可以继续添加新的进程,操作同上。 4、 一个算法模拟执行完毕之后,可以点击标号6的“复位”按钮,可以重置列表的内容为程序模拟运行前的内容。复位成功后,可以继续选择其他调度算法进行模拟。 5、标号7显示为程序模拟过程中的时间,从1秒开始累计。 6、点击标号8的“清空”按钮,可以清空类别的进程,以便程序的下次执行。 题目要求: 题目四 单处理器系统的进程调度 一 、 课 程 设 计 目 的 1. 加深对进程概念的理解, 明确进程和程序的区别。 2. 深入了解系统如何组织进程、 创建进程。 3. 进一步 认识如何实现处理器调度。 二 、 课 程 设 计 内 容 编写程序完成单处理器系统中的进程调度, 要求实现时间片轮转、 优先数、 最短进程优 先和最短剩余时间优先四种调度算法。 实验具体包括: 首先确定进程控制块的内容, 进程控 制块的组成方式; 然后完成进程创建原语和进程调度原语; 最后编写主函数对所作工作进行 测试。 模拟程序只对你所设置的“ 虚拟 PCB” 进行相应的调度模拟操作, 即每发生“ 调度” 时, 显示出当前运行进程的“ 进程标识符”、“ 优先数”、“ 剩余运行时间” 等, 而不需要对系 统中真正的 PCB 等数据进行修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值