当前位置:文档之家› 操作系统实验

操作系统实验

哈尔滨学院实验报告课程名称:操作系统专软件工程业:级:班11—6号:学**********:***教务处制实验一进程管理【实验目的与要求】1. 加深对进程概念的理解,明确进程与程序的区别。

2. 掌握Linux进程创建及撤销的方法,进一步认识并发执行的实质。

3. 掌握Linux系统下守护进程的创建方法。

【实验原理】1. Linux进程管理命令(1)进程查看(2)进程终止(3)进程优先级设置2. Linux进程控制函数(1)创建和修改进程(2)设置进程属性(3)获取进程属性(4)进程的退出3. Linux守护进程(1)独立启动守护进程(2)超级守护进程(3)守护进程的编写流程守护进程的编写遵循特定的流程,主要包括五个步骤:Step 1. 创建子进程,退出父进程Step 2. 在子进程中创建新会话Step 3. 改变当前目录为根目录Step 4. 重设文件权限掩码Step 5. 关闭文件描述符【实验主要仪器与材料】1. 带Linux操作系统的PC机2. GCC编译器【实验内容】1. 获取进程信息通过管理命令,获取系统当前执行进程的信息,包括进程名称与ID、PID和PGID等。

2. 创建进程编程程序,实现父进程创建一个子进程,返回后父子进程都分别循环输出字符串“I am parent.”或“I am child.”5次,每输出一次延时1秒(sleep(1)),然后进入下一次循环。

观察并分析运行结果。

然后将程序改为父子进程同步执行:子进程循环输出字符串“I am child.”5次,然后父进程再循环输出字符串“I am parent.”5次。

再次观察并分析运行结果。

【实验步骤及实验结果分析】实验内容1:获取进程信息F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD0 S 0 6597 6594 0 75 0 - 1121 wait pts/0 00:00:00 bash4 R 0 7826 6597 0 77 0 - 1042 - pts/0 00:00:00 ps实验内容2:创建进程#include <stdio.h>#include <signal.h>#include <unistd.h>#include <stdlib.h>#include <sys/wait.h>int main( ){int i = 0, j = 0;int p = fork();if(p){while(i++<5){sleep(1);printf("I am a child\tPid:%d\n",(int)getpid());}}else{while(j++<5){sleep(1);printf("I am a farther\tPid:%d\n",(int)getpid());}}return 0;}【思考题】1.程序和进程的区别1.进程是程序的执行,进程属于动态概念,而程序是一组指令的有序集合,是静态概念。

2.进程既然是程序的执行,或者说是“一次运行活动”,因而它是有生命过程的。

进程的存在是暂时的,而程序的存在是永久的。

3.进程是程序的执行。

因此进程的组成应包括程序和数据。

除此以外,进程还由记录进程状态信息的进程控制块PCB组成。

4.一个程序可能对应多个进程。

5.一个进程可以包含多个程序。

6.进程是一个程序及其数据在处理机上顺序执行时所发生的活动。

2.Linux操作系统下有哪些进程类型交互进程批处理进程守护进程3.进程创建函数fork和vfork的区别1、fork()用于创建一个新进程。

由fork()创建的子进程是父进程的副本。

即子进程获取父进程数据空间,堆和栈的副本。

父子进程之间不共享这些存储空间的部分。

而vfork()创建的进程并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec (或exit)于是也就不会存放该地址空间。

相反,在子进程调用exec或exit 之前,它在父进程的空间进行。

2、vfork()与fork()另一个区别就是:vfork保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。

3/vfork和fork之间的还有一个区别是:vfork保证子进程先运行,在她调用exec 或exit之后父进程才可能被调度运行。

如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

4.进程的退出函数有哪些?有何区别?C程序是如何被启动终止的?exit函数、return函数、abort函数和_exit()函数exit和return的区别:exit是一个函数,有参数;而return是函数执行完后的返回。

exit把控制权交给系统,而return将控制权交给调用函数。

exit和abort的区别:exit 是正常终止进程,而abort 是异常终止。

exit和_exit()的区别:exit()在头文件stdlib.h中声明,而_exit()声明在头文件unistd.h 中。

两个函数均能正常终止进程,但_exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核。

实验二进程通信【实验目的与要求】1、了解基于信号的进程通信机制2、熟悉LINUX系统中进程之间软中断通信的基本原理【实验原理】一、信号1、信号的基本概念2、信号的发送3、对信号的处理二、所涉及的中断调用1、kill( )2、signal( )3、wait()4、waitpid()5、lockf()【实验主要仪器与材料】1、带Linux操作系统的PC机2、GCC编译器【实验内容】1、编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:Child process1 is killed by parent!Child process2 is killed by parent!父进程等待两个子进程终止后,输出如下的信息后终止:Parent process is killed!2、分析利用软中断通信实现进程同步的机理【实验步骤及实验结果分析】#include <stdio.h>#include <signal.h>#include <unistd.h>#include <stdlib.h>#include <sys/wait.h>void waiting( ),stop( );int wait_mark;int main( ){int p1,p2,stdout=1;while((p1=fork( ))==-1); /*创建子进程p1*/if(p1>0){while((p2=fork( ))==-1); /*创建子进程p2*/if(p2>0){wait_mark=1;signal(SIGINT,stop); /*接收到^c信号,转stop*/waiting( );kill(p1,16); /*向p1发软中断信号16*/kill(p2,17); /*向p2发软中断信号17*/wait(0); /*同步*/wait(0);printf("Parent process is killed!\n");exit(0);}else{wait_mark=1;signal(SIGINT,SIG_IGN);signal(17,stop); /*接收到软中断信号17,转stop*/waiting( );lockf(stdout,1,0);printf("Child process 2 is killed by parent!\n");lockf(stdout,0,0);exit(0);}}else{wait_mark=1;signal(SIGINT,SIG_IGN);signal(16,stop); /*接收到软中断信号16,转stop*/waiting( );lockf(stdout,1,0);printf("Child process 1 is killed by parent!\n");lockf(stdout,0,0);exit(0);}return 0;}void waiting( ){while(wait_mark!=0);}void stop( ){wait_mark=0;}运行结果:Child process 2 is killed by parent!Child process 1 is killed by parent!Parent process is killed!【思考题】实验内容的参考程序如下,请仔细阅读、调试、分析,回答下述问题:#include <stdio.h>#include <signal.h>#include <unistd.h>#include <stdlib.h>#include <sys/wait.h>void waiting( ),stop( );int wait_mark;int main( ){int p1,p2,stdout=1;while((p1=fork( ))==-1); /*创建子进程p1*/if (p1>0){while((p2=fork( ))==-1); /*创建子进程p2*/if(p2>0){wait_mark=1;signal(SIGINT,stop); /*接收到^c信号,转stop*/waiting( );kill(p1,16); /*向p1发软中断信号16*/kill(p2,17); /*向p2发软中断信号17*/wait(0); /*同步*/wait(0);printf("Parent process is killed!\n");exit(0);}else{wait_mark=1;signal(17,stop); /*接收到软中断信号17,转stop*/waiting( );lockf(stdout,1,0);printf("Child process 2 is killed by parent!\n");lockf(stdout,0,0);exit(0);}}else{wait_mark=1;signal(16,stop); /*接收到软中断信号16,转stop*/waiting( );lockf(stdout,1,0);printf("Child process 1 is killed by parent!\n");lockf(stdout,0,0);exit(0);}return 0;}void waiting( ){while(wait_mark!=0);}void stop( ){wait_mark=0;}1. 参考程序段前面部分用了两个wait(0),它们起什么作用?用了两个wait(0)的作用是使p1和p2两个子程序同时发出软中断信号不用等待。

相关主题