北方工业大学《计算机操作系统》实验报告——进程管理

实 验 报 告 书

学 生 姓 名

学 号

班 级

2012 — 2013 学年 第 一 学期

《计算机操作系统》实验报告实验名称进程管理实验序号1实验日期2012年12月实验人一、实验目的和要求

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

进一步认识并发执行的实质

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

了解Linux系统中进程通信的基本原理二、相关背景知识

1.初步了解了进程的并发执行,互斥,同步等相关理论知识;

2.明白父进程如何通过fork()函数创建子进程,pipe()函数创建管道,以及跟实验有关的lock(),signal(),exit(),wait(),kill()等函数的调用过程;

3.知道如何使用UNIX/Linux系统自带的功能强大的可视化的编辑器Vi。三、实验内容

进程的创建

进程的控制

进程的软中断通信

进程的管道通信四、关键数据结构与函数的说明

fork( ):创建一个新进程

返回值的意义:0:创建子进程,从子进程返回;>0:从父进程返回,返回值为子进程的进程标识符;-1:创建失败。如果fork( )调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork( )被调用了一次,但返回了两次。此时OS在内存中建立一个新进程,所建的新进程是调用fork( )父进程(pare的副本,称为子进程。lockf(files,mode,size):用于锁定文件的某些段或者整个文件

files是文件描述符;mode是锁定和解锁:1表示锁定,0表示解锁.size是锁定或解锁的字节数,为0,表示从文件的当前位置到文件尾.。

signal(int signum,void(* handler)(int)):signal()会依参数signum 指定的信号编号来设置该信 号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。kill(pid_t pid,int sig),可以用来送参数sig指定的信号给参数pid指定的进程Child process 1 is killed by parent!

Child process 2 is killed by parent!

父进程等待两个子进程终止后输出:

Parent process is killed!

4.进程的管道通信

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

Child 1 is sending a message!

Child 2 is sending a message!

而父进程则从管道中读出来自于两个子进程的信息,先接收P1发来的消息,然后再接收P2发来的消息,显示在屏幕上。

六、实验结果与分析

1.进程的创建从进程执行并发来看,输出。fork()创建进程所需的时间多于输出一个字符的时间,父进程与子进程的输出内容会叠加在一输出次序带有随机性。:由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。因为lockf(1,1,0)lockf(1,0,0)解锁标准输出设备,在lockf(1,1,0)与lockf(1,0,0)中间的for循环输出不会被中断,加锁与不加锁效果相同。进程并发执行时的调度顺序和父子进程的抢占处理机问题#include

main( )

{

int p1,p2;

while((p1=fork( ))==-1); /*创建子进程p1*/

if (p1==0) putchar('b');

else

{

while((p2=fork( ))==-1); /*创建子进程p2*/

if(p2==0) putchar('c');

else putchar('a');

}

}#include

main( )

{

int p1,p2,i;

while((p1=fork( ))==-1); /*创建子进程p1*/

if (p1==0)

{

for(i=0;i<10000;i++)

printf("aaa");

}

else

{

while((p2=fork( ))==-1); /*创建子进程p2*/

if(p2==0)

{

for(i=0;i<10000;i+