操作系统上实验报告3.docx
- 文档编号:18414436
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:16
- 大小:145.36KB
操作系统上实验报告3.docx
《操作系统上实验报告3.docx》由会员分享,可在线阅读,更多相关《操作系统上实验报告3.docx(16页珍藏版)》请在冰点文库上搜索。
操作系统上实验报告3
操作系统实验三报告
实验题目:
进程管理及进程通信
实验环境:
虚拟机Linux操作系统
实验目的:
1.利用Linux提供的系统调用设计程序,加深对进程概念的理解。
2.体会系统进程调度的方法和效果。
3.了解进程之间的通信方式以及各种通信方式的使用。
实验内容:
例程1:
利用fork()创建子进程
#include<>
#include<>
#include<>
main()
{
inti;
if(fork())
i=wait(0);
/*父进程执行的程序段*/
/*等待子进程结束*/
printf("Itisparentprocess.\n");
printf("Thechildprocess,IDnumber%d,isfinished.\n",i);
}
else{
printf("Itischildprocess.\n");
sleep(10);
/*子进程执行的程序段*/
exit
(1);
/*向父进程发出结束信号*/
}
}
运行结果:
思考:
子进程是如何产生的又是如何结束的子进程被创建后它的运行环境是怎
样建立的
答:
子进程是通过函数fork()创建的,通过exit()函数自我结束的,子进程被创建后核心将为其分配一个进程表项和进程标识符,检查同时运行的进程数目,并且拷贝进程表项的数据,由子进程继承父进程的所有文件。
例程2:
循环调用fork()创建多个子进程
#include<>
#include<>
#include<>
main()
{inti,j;
printf(“Mypidis%d,myfather’spidis%d\n”,getpid()
getppid());
for(i=0;i<3;i++)
if(fork()==0)
printf(“%dpid=%dppid=%d\n”,i,getpid(),getppid());
else
{j=wait(0);
Printf(“%d:
Thechile%disfinished.\n”,getpid(),j);
}
}
运行结果:
思考:
画出进程的家族树。
子进程的运行环境是怎样建立的反复运行此程序
看会有什么情况解释一下。
答:
子进程的运行环境是由将其创建的父进程而建立的,反复运行程序会发现每个进程标识号在不断改变,这是因为同一时间有许多进程在被创建。
例程3:
创建子进程并用execlp()系统调用执行程序的实验
#include<>
#include<>
main()
{
intchild_pid1,child_pid2,child_pid3;
intpid,status;
setbuf(stdout,NULL);
child_pid1=fork();/*创建子进程1*/
if(child_pid1==0)
{execlp("echo","echo","childprocess1",(char*)0);/*子进程1启动其它程序*/
perror("exec1error.\n");
exit
(1);
}
child_pid2=fork();/*创建子进程2*/
if(child_pid2==0)
{execlp("date","date",(char*)0);/*子进程2启动其它程序*/
perror("exec2error.\n");
exit
(2);
}
child_pid3=fork();/*创建子进程3*/
if(child_pid3==0)
{execlp("ls","ls",(char*)0);/*子进程3启动其它程序*/
perror("exec3error.\n");
exit(3);
}
puts("Parentprocessiswaitingforchileprocessreturn!
");
while((pid=wait(&status))!
=-1)/*等待子进程结束*/
{if(child_pid1==pid)/*若子进程1结束*/
printf("childprocess1terminatedwithstatus%d\n",(status>>8));
else
{if(child_pid2==pid)/*若子进程2结束*/
printf("childprocess2terminatedwithstatus%d\n",(status>>8));
else
{if(child_pid3==pid)/*若子进程3结束*/
printf("childprocess3terminatedwithstatus%d\n",(status>>8));
}
}
}
puts("Allchildprocessesterminated.");
puts("Parentprocessterminated.");
exit(0);
}
运行结果:
思考:
子进程运行其他程序后,进程运行环境怎样变化的反复运行此程序看会有什么情况解释一下。
答:
子进程运行其他程序后,这个进程就完全被新程序代替。
由于并没有产生新进程所以进程标识号不改变,除此之外旧进程的其它信息,代码段,数据段,栈段等均被新程序的信息所代替。
新程序从自己的main()函数开始运行。
反复运行此程序发现结束的先后次序是不可预知的,每次运行结果都不一样。
原因是当每个子进程运行其他程序时,他们的结束随着其他程序的结束而结束,所以结束的先后次序在改变。
例程4:
观察父、子进程对变量处理的影响
#include<>
#include
#include<>
intgloba=4;
intmain()
{
pid_tpid;
intvari=5;
printf("beforefork.\n");
if((pid=fork())<0)
{
}
printf("forkerror.\n");
exit(0);
else
if(pid==0)
{
/*子进程执行*/
globa++;
vari--;
printf("Child%dchangedthevariandgloba.\n",getpid());
}
else
{
/*父进程执行*/
wait(0);
printf("Parent%ddidnotchangedthevariandgloba.\n",getpid());
}
printf("pid=%d,globa=%d,vari=%d\n",getpid(),globa,vari);
/*都执行*/
exit(0);
}
运行结果:
思考:
子进程被创建后,对父进程的运行环境有影响吗解释一下。
答:
子进程被创建后,对父进程的运行环境无影响,因为当子进程在运行时,它有自己的代码段和数据段,这些都可以作修改,但是父进程的代码段和数据段是不会随着子进程数据段和代码段的改变而改变的。
例程5:
管道通信的实验
#include<>
#include<>
main()
{
inti,r,j,k,l,p1,p2,fd[2];
charbuf[50],s[50];
pipe(fd);
while((p1=fork())==-1);
if(p1==0)
lockf(fd[1],1,0);
/*子进程1执行*/
/*管道写入端加锁*/
sprintf(buf,"ChildprocessP1issendingmessages!
\n");
printf("ChildprocessP1!
\n");
write(fd[1],buf,50);
lockf(fd[1],0,0);
/*信息写入管道*/
/*管道写入端解锁*/
sleep(5);
j=getpid();
k=getppid();
printf("P1%disweakup.MyparentprocessIDis%d.\n",j,k);
exit(0);
}
else
{while((p2=fork())==-1);
if(p2==0)
{
lockf(fd[1],1,0);
/*创建子进程2*/
/*子进程2执行*/
/*管道写入端加锁*/
sprintf(buf,"ChildprocessP2issendingmessages!
\n");
printf("ChildprocessP2!
\n");
write(fd[1],buf,50);
lockf(fd[1],0,0);
/*信息写入管道*/
/*管道写入端解锁*/
sleep(5);
j=getpid();
k=getppid();
printf("P2%disweakup.MyparentprocessIDis%d.\n",j,k);
exit(0);
}
else
{l=getpid();
wait(0);
if(r=read(fd[0],s,50)==-1)
printf("Can'treadpipe.\n");
else
printf("Parent%d:
%s\n",l,s);
wait(0);
if(r=read(fd[0],s,50)==-1)
printf("Can'treadpipe.\n");
else
printf("Parent%d:
%s\n",l,s);
exit(0);
}
}
}
}
运行结果:
思考:
(1)什么是管道进程如何利用它进行通信的解释一下实现方法。
(2)修改睡眠时机、睡眠长度,看看会有什么变化。
解释。
(3)加锁、解锁起什么作用不用它行吗
答:
(1)管道是指能够连接一个写进程和一个读进程、并允许他们以生产者—消费者方式进行通信的一个共享文件,又称pipe文件。
由写进程从管道的入端将数据写入管道,而读进程则从管道的出端读出数据来进行通信。
(2)修改睡眠时机和睡眠长度都会引起进程被唤醒的时间不一,因为睡眠时机决定进程在何时睡眠,睡眠长度决定进程何时被唤醒。
(3)加锁、解锁是为了解决临界资源的共享问题。
不用它将会引起无法有效的管理数据,即数据会被修改导致读错了数据。
例程7:
软中断信号实验
#include<>
#include<>
main()
{
inti,j,k;
intfunc();
signal(18,func());
if(i=fork())
{
j=kill(i,18);
/*创建子进程*/
/*父进程执行*/
/*向子进程发送信号*/
printf("Parent:
signal18hasbeensenttochild%d,returned%d.\n",i,j);
k=wait();
/*父进程被唤醒*/
printf("Afterwait%d,Parent%d:
finished.\n",k,getpid());
}
else
{
/*子进程执行*/
sleep(10);
printf("Child%d:
Asignalfrommyparentisrecived.\n",getpid());
}/*子进程结束,向父进程发子进程结束信号*/
}
func()
/*处理程序*/
{intm;
m=getpid();
printf("IamProcess%d:
Itissignal18processingfunction.\n",m);
}
运行结果:
思考:
讨论一下它与硬中断有什么区别
答:
硬中断是由外部硬件产生的,而软中断是CPU根据软件的某条指令或者软件对标志寄存器的某个标志位的设置而产生的。
研究:
什么是进程如何产生的
答:
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
一旦操作系统发现了要求创建新进程的事件后,便调用进程创建原语Creat()按下述步骤创建一个新进程:
(1)申请空白PCB。
为新进程申请获得惟一的数字标识符,并从PCB集合中索取一个空白PCB。
(2)为新进程分配资源。
为新进程的程序和数据以及用户栈分配必要的内存空间。
显然此时操作系统必须知道新进程所需内存的大小。
对于批处理作业,其大小可在用户提出创建进程要求时提供。
若是为应用进程创建子进程,也应是在该进程提出创建进程的请求中给出所需内存的大小。
对于交互型作业,用户可以不给出内存要求而由系统分配一定的空间。
如果新进程要共享某个已在内在的地址空间(即已装入内存的共享段),则必须建立相应的链接。
(3)初始化进程控件块。
PCB的初始化包括:
1.初始化标识信息,将系统分配的标识符和父进程标识符填入新PCB中;2.初始化处理机状态信息,使程序计数器指向程序的入口地址,使栈指针指向栈顶;3.初始化处理机控制信息,将进程的状态设置为就绪状态或静止就绪状态,对于优先级,通常是将它设置为最低优先级,除非用户以显式方式提出高优先级要求。
(4)将新进程插入就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。
进程控制如何实现的
答:
为了描述和控制进程的运行,系统为每个进程定义了一个数据结构——进程控制块PCB,它是进程实体的一部分,是操作系统中最重要的记录型数据结构。
PCB中记录了操作系统所需的、用于描述进程的当前情况以及控制进程运行的全部信息。
当系统创建一个新进程时,就为它建立了一个PCB;进程结束时又回收其PCB,进程于是也随之消亡。
进程通信方式各有什么特点
答:
高级通信机制可归结为三大类:
共享存储器系统、消息传递系统以及管道通信系统。
在共享存储器系统中,相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。
消息传递系统中,进程间的数据交换是以格式化的消息为单位的。
管道通信系统能有效地传送大量数据,因而又被引入到许多其它操作系统中。
管道通信如何实现该通信方式可以用在何处
答:
向管道提供输入的发送进程,以字符流形式将大量的数据送入管道;而接受管道输出的接收进程,则从管道中接收数据。
由于发送进程和接收进程是利用管道进行通信的,故又称为管道通信。
由于它能有效地传送大量数据,因而又被引入到许多其它操作系统中。
什么是软中断软中断信号通信如何实现
答:
软中断是CPU根据软件的某条指令或者软件对标志寄存器的某个标志位的设置而产生的。
体会:
这次的实验主要涉及到进程管理及进程通信,目的是让我们利用Linux提供的系统调用设计程序,加深对进程管理及进程通信的理解。
而通过此次实验,也让我更进一步的理解了进程管理及进程通信的相关概念机意义。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)