北方工业大学《计算机操作系统》实验报告——进程管理
实 验 报 告 书
学 生 姓 名
学 号
班 级
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+