进程管理实验报告
1.实验目的:
(1)加深对进程概念的理解,明确进程和程序的区别;
(2)进一步认识并发执行的实质;
(3)分析进程争用资源的现象,学习解决进程互斥的方法;
(4)了解Linux系统中进程通信的基本原理。
2.实验预备内容
(1)阅读Linux的sched.h源码文件,加深对进程管理概念的理解;
(2)阅读Linux的fork()源码文件,分析进程的创建过程。
3、环境说明
  本次实验使用的是win7下的VMWare workstation虚拟机,安装了ubuntu系统
  在ubuntu系统下使用code::blocks IDE编写代码并执行程序的
4、实验内容:
1、进程的创建:
(1)实验题目和要求:
编写一段程序,使用系统调用fork() 创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。
(2)程序设计说明:
参照书上的例子进行设计,详见源代码
(3)程序运行结果截图:
(4)程序分析:
a,b,c随机出现,因为父进程与两个子进程之间并没有同步措施,所以a,b,c随机打印出来,也就是三个进程的活动次序是随机进行的,不同的系统可能有不同的进程调度方式。
(5)源程序:
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
    pid_t pid1,pid2;
    if((pid1=fork())<0){
      printf("Fork Failed.\n");
      exit(-1);
    }
    else if((pid1=fork())==0)
      printf("b\n");
    else{
        if((pid2=fork())<0){
          printf("Fork Failed.\n");
          exit(-1);
        }
        else if((pid2=fork())==0)
            printf("c\n");
        else{
          wait(NULL);
          printf("a\n");
          exit(0);
        }
    }
    return 0;
}
2、进程的控制:
要求一:
(1)实验题目和要求:
修改已经编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。
(2)程序设计说明:
将第一个程序的输出进行修改,把输出一个字符改为一句话,其他不变
(3)程序运行结果截图:
(4)程序分析:
和第一个程序的输出顺序,也就是三个进程活动的次序基本是一致的,同一个进程里输出的字符串不会被中断
(5)源程序:
  #include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
    pid_t pid1,pid2;
    if((pid1=fork())<0){
      printf("Fork Failed.\n");
      exit(-1);
    }
    else if((pid1=fork())==0)
      printf("Child process 1 is created!\n");
    else{
        if((pid2=fork())<0){
          printf("Fork Failed.\n");
          exit(-1);
        }
        else if((pid2=fork())==0)
            printf("Child process 2 is created!\n");
        else{
            wait(NULL);
            printf("The parent process is created!\n");
            exit(0);
        }
    }
    return 0;
}
要求二:
(1)实验题目和要求:
如果在程序中使用系统调用lockf () 来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。
(2)程序设计说明:
  在每个进程的每个条件语句中开头加入lockf(1,1,0),结尾处加入lockf(1,0,0),从而实现给每一个进程加锁并且实现进程之间的互斥
(3)程序运行结果截图:
 
(4)程序分析:根据输出情况可以看出,每个进程活动的次序都是随机的,但是加锁后进程执行完毕后才会让另一个进程执行而不会中途被打断,因此 lockf(1,1,0)的作用是锁定屏幕输出,不让其他进程可以输出到屏幕,lockf(1,0,0)则是解锁
(5)源程序:
  #include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
    pid_t pid1,pid2;
进程通信方式    int i;
    if((pid1=fork())<0){
      printf("Fork Failed.\n");
      exit(-1);
    }
    else if((pid1=fork())==0){
        lockf(1,1,0);
        for(i=0;i<=2;i++)
            printf("process A:%d\n",i);
        lockf(1,0,0);
    }
    else{
        if((pid2=fork())<0){
          printf("Fork Failed.\n");
          exit(-1);
        }
        else if((pid2=fork())==0){
            lockf(1,1,0);
            for(i=0;i<=2;i++)
                printf("process B:%d\n",i);
            lockf(1,0,0);
        }
        else{
            lockf(1,1,0);
            for(i=0;i<=2;i++)
                printf("process C:%d\n",i);
            lockf(1,0,0);
            exit(0);
        }
    }
    return 0;
}
3、进程的软中断通信:
(1)实验题目和要求:
    编写一段程序,使其实现进程的软中断通信。
(a)要求:使用系统调用fork() 创建两个子进程,再用系统调用signal() 让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill() 向两个子进
程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
Child Process 1 is killed by Parent!
Child Process 2 is killed by Parent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Parent Process is killed!
源程序:
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。